Paras vastaus
CPython on C-ohjelmointikielellä kirjoitettu Pythonin viitetoteutus. On olemassa useita muita toteutuksia, jopa joitain muita C: ssä. Mutta CPython on yleisimmin käytetty ja verrataan kaikkia muita.
Python on kielimääritys. Jos viitataan toteutuksen yksityiskohtiin määrittelemällä jokin tietty toteutus, on kohtuullinen oletus, että se viittaa CPython-versioon.
Voit etsiä toteutuksia, mutta tulokset ovat todennäköisesti hieman hämmentäviä. Kaikki toteutukset eivät ole täydellisiä, eivätkä ne kaikki toimi ”tavallisissa” järjestelmissä tai tavanomaisissa ohjelman suoritusympäristöissä (kuten pääteikkuna tai tekstikonsoli).
Esimerkiksi MicroPython on pienennetty johdannainen CPythonista, joka on tarkoitettu mikro-ohjaimille. Jython on kirjoitettu Java-muodossa, ja se toimii JVM: ssä (Java Virtual Machine), ja se sisältää ominaisuuksia alkuperäisen Java: n tuonnille ja yhteistyölle sen kanssa (sisäinen tarkastus mukaan lukien). IronPython on kirjoitettu Microsoftin C # -merkkiin ja kohdistettu suoritettavaksi .NET-kehyksen CLR: ssä (Common Language Runtime). PyPy on Python-versio, joka on kirjoitettu enimmäkseen Pythonissa, mutta kääritty ytimen ympärille, joka toteuttaa rajoitetun kielijoukon ja tarjoaa JIT: n (Just-In- Dymaninen aika / ajonaikainen kokoelma). (Tätä osajoukkoa kutsutaan nimellä RPython ja se on tarkoitettu tukemaan muutakin kuin vain Pythonia).
Katso mitä tarkoitan sekoittamisesta?
Pythonissa on vähintään kaksi erilaista toteutusta, jotka on kirjoitettu JavaScriptiin ja jotka on suunniteltu toimimaan tavallisessa selaimessa (DOM: ssa tai Documenrissa) Object Model… ympäristö). Nämä ovat Brython ja Skulpt . Lisäksi on olemassa useita erilaisia ”kääntäjiä” tai Python-Javascript-kääntäjiä, mukaan lukien Transcrypt, ja pyjs – (muodollisesti pyjamat) ja ehkä jopa RapydScript (tosin se on enemmän kuin Pythonin ja JS: n yhdistelmä).
Kuten näette , jos syvennät tarpeeksi syvällisesti aiheeseen, on entistä vaikeampaa luokitella erilaisia projekteja ja työkaluja ”toteutuksiksi”.
Esimerkiksi Cython , joka on työkalu, jolla otetaan erityisesti merkitty Python-tyyppinen koodi ja kootaan se ladattaviksi (binäärisiksi / alkuperäisiksi) moduuleiksi, jotka voidaan tuoda Pythoniin ja käyttää kuten mitä tahansa muuta natiivisti käännettyä tulkintaa. Sitä ei pidetä oikeastaan Pythonin ”toteutuksena” niin paljon kuin työkaluna valittujen Python-koodinpätkien optimoimiseksi binaarilaajennuksiksi CPython-interpeterille. (Jos työskentelit Jythonissa, voit kirjoittaa koodin osat uudelleen Java-käyttöjärjestelmään ja käyttää koodin käyttämiseen Jythonin vuorovaikutus- ja introspektio-ominaisuuksia. Vain analogisesti).
Siellä on myös Numba , joka on työkalu Python- ja NumPy -koodin osajoukon läpinäkyvään kääntämiseen avoimesti LLVM ja integroimalla LLVM: n ajonaikainen tuki Python-tulkin käynnissä olevaan moottoriin. Tätä kuvataan enemmän kuin JIT kuin Cythonin erottuva moduuli / laajennus-paradigma. Silti se on enemmän työkalu kuin koko kielen ”toteutus”.
Mutta sitten, jos tarkastelet Nuitkaa , näet kunnianhimoinen projekti kokonaisten Python-ohjelmien kokoamiseksi. Joten se saattaa olla enemmän toteutusta.
Vielä yksi projekti (joka näyttää olevan projekti, jolla Pythonin luoja Guido van Rossum on työskennellyt) on mypy – Python, jossa on valinnainen staattinen kirjoittaminen ja joitain paikallisia päätelmiä. Tämä ei olisi uusi toteutus. Näyttää siltä, että se on eräänlainen käyttöliittymä, joka käsittelee Pythonia (valinnaisilla tyyppihuomautuksilla) ja yhdistää (merkitsemättömän) Pythonin takaisin CPython-ajonaikaiselle moottorille (tulkki).
Jos haluat sukeltaa vielä useampaan toteutukseen ja linkit katsovat: PythonImplementations – Python Wiki .
Huomaa, että olen käsitellyt monia niistä täällä ja yrittänyt selittää, miten ne liittyvät siinä määrin. Tuo wiki-sivu on enemmän tartuntalaukku, jossa on vähemmän esityksiä ja muutama linkki kuolleisiin tai ylläpitämättömiin projekteihin.
Vastaus
Jopa minulla oli sama ongelma ymmärtää miten CPython, JPython ovat , IronPython, PyPy eroavat toisistaan.
Joten olen valmis selvittämään kolme asiaa, ennen kuin aloitan selittämisen:
- Python : Se on kieli, se vain kertoo / kuvaa kuinka välittää / ilmaista itseäsi tulkille (ohjelma, joka hyväksyy python-koodisi).
- Toteutus : Kyse on siitä, miten tulkki kirjoitettiin, erityisesti mikä kieli ja mitä se päätyy tekemään .
- Bytecode : Se on koodi, jota prosessoi ohjelma, jota yleensä kutsutaan virtuaalikoneeksi, eikä ”oikea” tietokonekone, laitteistoprosessori.
CPython on toteutus, joka kirjoitettiin C-kielellä. Loppujen lopuksi se tuottaa tavukoodin (pino-kone-pohjainen käskyjoukko), joka on Python-spesifinen, ja suorittaa sen sitten. Syy muuntaa Python-koodi tavukoodiksi johtuu siitä, että tulkin käyttöönotto on helpompaa, jos se näyttää koneohjeilta. Mutta ei tarvitse tuottaa jonkin verran tavukoodia ennen suoritusta (mutta CPython tuottaa).
Jos haluat tarkastella CPythonin tavukoodia, voit. Näin voit:
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD\_GLOBAL 0 (print)
2 LOAD\_CONST 1 ("Hello")
4 CALL\_FUNCTION 1
6 POP\_TOP
3 8 LOAD\_FAST 0 (x)
10 POP\_JUMP\_IF\_FALSE 20
4 12 LOAD\_FAST 1 (y)
14 LOAD\_FAST 0 (x)
16 INPLACE\_ADD
18 STORE\_FAST 1 (y)
22 LOAD\_FAST 0 (x)
24 LOAD\_FAST 1 (y)
26 CALL\_FUNCTION 2
28 POP\_TOP
6 30 LOAD\_FAST 0 (x)
32 LOAD\_FAST 1 (y)
34 BINARY\_ADD
36 RETURN\_VALUE
Tarkastellaan nyt yllä olevaa koodia. Rivit 1-6 ovat funktion määritelmä. Rivillä 8 tuomme ”dis” -moduulin, jota voidaan käyttää katsomaan välitöntä Python-tavukoodia (tai voit sanoa, purkija Python-tavukoodille), jonka CPython (tulkki) tuottaa.
HUOMAUTUS : Sain linkin tähän koodiin #python IRC -kanavalta: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Ja sitten on Jython, joka on kirjoitettu Java-muodossa ja joka tuottaa Java-tavukoodia. Java-tavukoodi toimii Java Runtime Environment -ympäristössä, joka on Java Virtual Machine (JVM) -toteutus. Jos tämä on hämmentävää, epäilen, että sinulla ei ole aavistustakaan kuinka Java toimii. Maalliselta kannalta Java-kääntäjä ottaa Java-koodin (kieli, ei kääntäjä) ja tuottaa tiedoston (joka on Java-tavukoodi), joka voidaan suorittaa vain JRE: llä. Tämä tehdään niin, että kun Java-koodi on käännetty, se voidaan siirtää muille koneille Java-tavukoodimuodossa, jota vain JRE voi ajaa. Jos tämä on edelleen hämmentävää, kannattaa ehkä katsoa tämä verkkosivu .
Täällä voit kysyä, onko CPython ” s tavukoodi on kannettava kuten Jython, epäilen ei. CPython-toteutuksessa tuotettu -tavakoodi oli nimenomaan kyseinen tulkki helpottamaan koodin edelleen suorittamista (myös minä epäilet, että tällainen välitavutuotantotuote, käsittelyn helpottamiseksi tapahtuu monissa muissa tulkeissa) .Jos mietit nyt, kuinka tavukoodia on helppo käyttää yllä olevan koodin mukaisesti (rivin 9 jälkeen loppuun asti) ), ajattele sitten tätä. Meillä on pino (tietorakenne), ja jokainen tavukoodin rivi tekee jonkin verran pino-operaatiota, joka muokkaa pinoa vastaavasti. CPython (tulkki) käyttää tätä muokattua pinoa koodin lopullisen ulostulon tuottamiseen. .
Joten Jythonissa, kun käännät Python-koodisi, päädyt Java-tavukoodiin, joka voidaan suorittaa JVM: llä.
Vastaavasti IronPyt hon (kirjoitettu C # kielellä) kokoaa Python-koodisi Common Language Runtime (CLR) -tekniikaksi, joka on samanlainen tekniikka kuin Microsoftin kehittämä JVM.