Wat is CPython?

Beste antwoord

CPython is de referentie-implementatie van Python geschreven in de programmeertaal C. Er zijn een aantal andere implementaties, waaronder zelfs enkele andere in C. Maar CPython wordt het meest gebruikt en degene met alle andere wordt vergeleken.

Python is een taalspecificatie. Als men verwijst naar implementatiedetails met het specificeren van een bepaalde implementatie, dan is de redelijke aanname dat het verwijst naar de CPython-versie.

U kunt naar implementaties zoeken, maar de resultaten zijn waarschijnlijk enigszins verwarrend. Niet alle implementaties zijn voltooid, noch draaien ze allemaal op “normale” systemen of in conventionele programma-uitvoeringsomgevingen (zoals een terminalvenster of tekstconsole).

Bijvoorbeeld MicroPython is een bijgesneden afgeleide van CPython die bedoeld is voor microcontrollers. Jython is geschreven in Java en draait in de JVM (Java Virtual Machine), en bevat functies voor het importeren van native Java en het ermee samenwerken (inclusief introspectie). IronPython is geschreven in de C # van Microsoft en bedoeld om te worden uitgevoerd binnen de CLR (Common Language Runtime) van het .NET-framework. PyPy is een versie van Python die voornamelijk in Python is geschreven, maar rond een kern is gewikkeld die een beperkte subset van de taal implementeert en JIT (Just-In- Time dymanic / runtime-compilatie). (Die subset wordt RPython genoemd en is bedoeld om meer te ondersteunen dan alleen Python).

Zie je wat ik bedoel met verwarring?

Er zijn ten minste twee verschillende implementaties van Python die zijn geschreven in JavaScript en zijn ontworpen om te worden uitgevoerd vanuit een normale browser (in de DOM … of Documenr Objectmodel… omgeving). Dat zijn Brython en Skulpt . Daarnaast zijn er verschillende “transpilers” of Python-naar-Javascript-compilers, waaronder Transcrypt, en pyjs – (formeel pyjamas) en misschien zelfs RapydScript (hoewel dat meer een hybride is van Python met JS).

Zoals je kunt zien , als je dieper genoeg in het onderwerp duikt, wordt het steeds moeilijker om verschillende projecten en tools als “implementaties” te categoriseren.

Er is bijvoorbeeld Cython wat een hulpmiddel is om speciaal geannoteerde Python-achtige code te nemen en deze te compileren in laadbare (binaire / native) modules die in Python kunnen worden geïmporteerd en gebruikt zoals elke andere native gecompileerde extensie van de interpreter. Het wordt niet echt beschouwd als een “implementatie” van Python, maar als een tool voor het optimaliseren van geselecteerde fragmenten van Python-code in binaire extensies van de CPython-interpeter. (Als u in Jython werkte, zou u delen van uw code in Java kunnen herschrijven en de interoperabiliteits- en introspectie-eigenschappen van Jython kunnen gebruiken om die code te gebruiken. Gewoon naar analogie).

Er is ook Numba , een tool voor het transparant compileren van een subset van Python en NumPy -code in LLVM en het integreren van de LLVM-runtime-ondersteuning in de draaiende engine van de Python-interpretator. Dit wordt beschreven als meer als een JIT dan als het onderscheidende module / uitbreidingsparadigma van Cython. Toch is het meer een hulpmiddel dan een “implementatie” van de hele taal.

Maar als je kijkt naar Nuitka , zie je een ambitieus project om hele Python-programmas te compileren. Dus dat is misschien meer een implementatie.

Nog een ander project (dat er een lijkt te zijn waar Guido van Rossum, de maker van Python, aan heeft gewerkt) is mypy – Python met optioneel statisch typen en een aantal lokale type-inferentie. Dit zou geen nieuwe implementatie zijn. Het lijkt een soort frontend te zijn die Python verwerkt (met optionele type annotaties) en de (niet-geannoteerde) Python terug in de CPython runtime engine (interpreter) paasst.

Als je in nog meer implementaties wilt duiken. en links kijken naar: PythonImplementations – Python Wiki .

Opmerking Ik heb hier veel van behandeld en geprobeerd uit te leggen hoe ze verband houden in die mate. Die wikipagina is meer een grabbelton, met minder expositie en een paar links naar dode of niet-onderhouden projecten.

Antwoord

Zelfs ik had hetzelfde probleem om te begrijpen hoe CPython, JPython , IronPython en PyPy verschillen van elkaar.

Dus ik ben bereid drie dingen op te helderen voordat ik begin met uitleggen:

  1. Python : het is een taal, het geeft alleen aan / beschrijft hoe je jezelf kunt overbrengen / uiten aan de tolk (het programma dat je Python-code accepteert).
  2. Implementatie : het gaat er allemaal om hoe de tolk is geschreven, in het bijzonder in welke taal en wat het uiteindelijk doet .
  3. Bytecode : het is de code die wordt verwerkt door een programma, meestal een virtuele machine genoemd, in plaats van door de “echte” computer, de hardwareprocessor.

CPython is de implementatie, die is geschreven in C-taal. Het produceert uiteindelijk bytecode (instructieset op basis van stapelmachines) die Python-specifiek is en voert deze vervolgens uit. De reden om Python-code naar een bytecode te converteren, is omdat het gemakkelijker is om een ​​interpreter te implementeren als deze op machine-instructies lijkt. Maar het is niet nodig om een ​​bytecode te produceren voordat het wordt uitgevoerd (maar CPython produceert wel).

Als je de bytecode van CPython wilt bekijken, dan kan dat. Hier is hoe je kunt:

>>> 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

Laten we nu eens kijken naar de bovenstaande code. Regels 1 t / m 6 zijn een functiedefinitie. In regel 8 importeren we de “dis” -module die kan worden gebruikt om de tussenliggende Python-bytecode te bekijken (of je kunt zeggen, disassembler voor Python-bytecode) die wordt gegenereerd door CPython (interpreter).

OPMERKING : ik heb de link naar deze code van #python IRC-kanaal: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

En dan is er Jython, dat is geschreven in Java en uiteindelijk Java-bytecode produceert. De Java-bytecode wordt uitgevoerd op Java Runtime Environment, een implementatie van Java Virtual Machine (JVM). Als dit verwarrend is, vermoed ik dat u geen idee heeft hoe Java werkt. In lekentermen wordt Java (de taal, niet de compiler) -code gebruikt door de Java-compiler en voert een bestand uit (dat is Java-bytecode) dat alleen kan worden uitgevoerd met een JRE. Dit wordt gedaan zodat, zodra de Java-code is gecompileerd, deze kan worden overgedragen naar andere machines in Java-bytecode-indeling, die alleen kan worden uitgevoerd door JRE. Als dit nog steeds verwarrend is, wil je misschien eens kijken naar deze webpagina .

Hier kun je vragen of de CPython ” s bytecode is draagbaar zoals Jython, vermoed ik van niet. De bytecode die in de CPython-implementatie werd geproduceerd, was specifiek voor die interpreter om het gemakkelijk te maken voor verdere uitvoering van code (ik vermoedt dat, zon tussenliggende bytecodeproductie, alleen voor het gemak dat de verwerking wordt gedaan in veel andere tolken.) Als je je nu afvraagt ​​hoe het gemakkelijk is om de bytecode uit te voeren zoals hierboven in de code wordt weergegeven (na regel 9 tot het einde ), denk hier eens over na. We hebben een stapel (datastructuur) en elke regel in de bytecode voert een stapelbewerking uit waarbij de stapel dienovereenkomstig wordt aangepast. Deze aangepaste stapel wordt gebruikt door CPython (de interpreter) om de uiteindelijke uitvoer van de code te produceren .

Dus in Jython, als je je Python-code compileert, krijg je Java-bytecode, die kan worden uitgevoerd op een JVM.

Evenzo IronPyt hon (geschreven in C # -taal) compileert je Python-code naar Common Language Runtime (CLR), een technologie die vergelijkbaar is met JVM, ontwikkeld door Microsoft.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *