Ce este CPython?

Cel mai bun răspuns

CPython este implementarea de referință a Python scrisă în limbajul de programare C. Există o serie de alte implementări, chiar și unele altele în C. Dar CPython este cel mai utilizat și cel împotriva tuturor celorlalte sunt comparate.

Python este o specificație de limbaj. Dacă se face referire la detalii despre implementare, specificându-se o anumită implementare, atunci presupunerea rezonabilă este că se referă la versiunea CPython.

Puteți căuta implementări, dar este posibil ca rezultatele să fie oarecum confuze. Nu toate implementările sunt complete și nici nu rulează pe sisteme „normale” sau în medii convenționale de execuție a programului (cum ar fi o fereastră de terminal sau o consolă de text).

De exemplu MicroPython este un derivat redus din CPython, care este destinat microcontrolerelor. Jython este scris în Java și rulează în JVM (Java Virtual Machine) și include caracteristici pentru importul Java nativ și interoperarea cu acesta (inclusiv introspecția). IronPython este scris în C # Microsoft și vizează să ruleze în CLR (Common Language Runtime) din cadrul .NET. PyPy este o versiune a Python care este în mare parte scrisă în Python, dar înfășurată în jurul unui nucleu care implementează un subset restrâns al limbii și oferă JIT (Just-In- Compilarea timpului dymanic / runtime). (Acel subset se numește RPython și este destinat să accepte mai mult decât Python).

Vedeți ce vreau să spun despre confuzie?

Există cel puțin două implementări diferite ale Python care sunt scrise în JavaScript și concepute pentru a rula dintr-un browser normal (în DOM … sau Documenr Model de obiect … mediu). Acestea sunt Brython și Skulpt . În plus, există mai multe „transpilatoare” diferite sau compilatoare Python către Javascript, inclusiv Transcrypt, și pyjs – (în mod normal Pijamale) și poate chiar RapydScript (deși este mai mult ca un hibrid de Python cu JS).

După cum puteți vedea , dacă vă aprofundați suficient subiectul, devine din ce în ce mai greu să clasificați diferite proiecte și instrumente ca „implementări”.

De exemplu, există Cython care este un instrument pentru a prelua codul Python adnotat special și a-l compila în module care pot fi încărcate (binare / native) care pot fi importate în Python și utilizate ca orice altă extensie compilată nativ către interpret. Nu este considerat cu adevărat o „implementare” a Python, ci un instrument pentru optimizarea fragmentelor selectate de cod Python în extensii binare ale interpeterului CPython. (Dacă ați lucra în Jython, ați putea rescrie părți ale codului dvs. în Java și ați folosi funcțiile de interoperare și introspecție ale lui Jython pentru a utiliza acel cod. Doar prin analogie).

Există și Numba , care este un instrument pentru compilarea transparentă a unui subset de Python și a codului NumPy în LLVM și integrarea suportului de rulare LLVM în motorul de pornire al interpretatorului Python. Aceasta este descrisă mai degrabă ca un JIT decât paradigma distinctivă a modulului / extensiei Cython. Totuși, este mai mult un instrument decât o „implementare” a întregului limbaj.

Dar atunci, dacă te uiți la Nuitka , vezi un proiect ambițios de a compila programe întregi Python. Deci ar putea fi mai mult o implementare.

Un alt proiect (care pare a fi unul la care Guido van Rossum, creatorul Python, a lucrat) este mypy – Python cu tastare statică opțională și o inferență de tip local. Aceasta nu ar fi o nouă implementare. Se pare că este un fel de frontend care procesează Python (cu adnotări opționale de tip) și păstrează Python (neanotat) înapoi în motorul de execuție CPython (interpretor).

Dacă doriți să vă scufundați în mai multe implementări și linkurile se uită la: PythonImplementations – Python Wiki .

Rețineți că am acoperit multe dintre acestea aici și am încercat să explic cum se relaționează ele într-o asemenea măsură. Această pagină wiki este mai degrabă o pungă, cu mai puțină expunere și câteva link-uri către proiecte moarte sau neîntreținute.

Răspuns

Chiar și eu am avut aceeași problemă înțelegând cum sunt CPython, JPython , IronPython, PyPy sunt diferite între ele.

Deci, sunt dispus să clarific trei lucruri înainte de a începe să explic:

  1. Python : Este un limbaj, acesta specifică / descrie doar cum să te transmiți / să te exprimi interpretului (programul care acceptă codul tău Python).
  2. Implementare : Este vorba despre modul în care a fost scris interpretul, în special, ce limbă și ce ajunge să facă .
  3. Bytecode : este codul care este procesat de un program, denumit de obicei o mașină virtuală, mai degrabă decât de mașina de computer „reală”, procesorul hardware.

CPython este implementarea, care a fost scrisă în limbajul C. Se ajunge să producă bytecode (set de instrucțiuni bazat pe stivă), care este specific Python și apoi îl execută. Motivul pentru a converti codul Python într-un bytecode este că este mai ușor să implementați un interpret dacă arată ca niște instrucțiuni ale mașinii. Dar nu este necesar să produceți un anumit bytecode înainte de execuție (dar CPython produce).

Dacă doriți să examinați codul secundar al CPython, puteți. Iată cum puteți:

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

Acum, să aruncăm o privire asupra codului de mai sus. Liniile 1-6 sunt o definiție a funcției. În linia 8, importăm modulul „dis” care poate fi utilizat pentru a vizualiza bytecode-ul intermediar Python (sau puteți spune, dezasamblator pentru bytecode Python) care este generat de CPython (interpret).

NOTĂ : Am primit linkul către acest cod de la canalul IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Și apoi, există Jython, care este scris în Java și ajunge să producă cod de octeți Java. Codul de octeți Java rulează pe Java Runtime Environment, care este o implementare a mașinii virtuale Java (JVM). Dacă acest lucru este confuz, atunci bănuiesc că nu aveți nici o idee despre cum funcționează Java. În termeni simpli, codul Java (limbajul, nu compilatorul) este preluat de compilatorul Java și scoate un fișier (care este cod de octeți Java) care poate fi rulat numai folosind un JRE. Acest lucru se face astfel încât, odată compilat codul Java, acesta să poată fi portat pe alte mașini în format de cod de octeți Java, care poate fi rulat doar de JRE. Dacă acest lucru este încă confuz, atunci poate doriți să aruncați o privire la această pagină web .

Aici, puteți întreba dacă CPython ” bytecode-ul este portabil ca Jython, bănuiesc că nu. bytecode-ul produs în implementarea CPython a fost specific acelui interpret pentru facilitarea executării ulterioare a codului (de asemenea, eu bănuiți că o astfel de producție intermediară de bytecode, doar pentru ușurința procesării se face în mulți alți interpreți). Dacă vă întrebați acum cum este ușor să rulați bytecode așa cum se arată mai sus în cod (după linia 9 până la sfârșit ), atunci gândiți-vă la asta. Avem o stivă (structură de date) și fiecare linie din bytecode face o operație de stivă modificând stiva în consecință. Această stivă modificată este utilizată de CPython (interpretorul) pentru a produce ieșirea finală a codului .

Deci, în Jython, când vă compilați codul Python, ajungeți la codul de octeți Java, care poate fi rulat pe o JVM.

În mod similar, IronPyt hon (scris în limbajul C #) compilează codul Python în Common Language Runtime (CLR), care este o tehnologie similară comparativ cu JVM, dezvoltată de Microsoft.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *