it-swarm-eu.dev

Je Python interpretován nebo kompilován?

To je jen zázrak, který jsem měl při čtení o interpretovaných a kompilovaných jazycích.

Ruby je bezpochyby interpretovaný jazyk, protože zdrojový kód je zpracováván interpretem v okamžiku provedení.
Naopak [~ # ~] c [~ # ~] je kompilovaný jazyk, protože je třeba kompilovat zdrojový kód nejprve podle stroje a poté provést. Tento výsledek je mnohem rychlejší provedení.

Nyní přichází do Pythonu :

  • A python kód ( somefile.py ) při importu vytvoří soubor () somefile.pyc ) ve stejném adresáři. Řekněme, že se import provádí v modulu python Shell nebo Django modul) . Po importu trochu změním kód a znovu spustím importované funkce, abych zjistil, že stále běží starý kód. To naznačuje, že * .pyc soubory jsou kompilovány python soubory podobné spustitelným souborům) vytvořené po kompilaci souboru C, i když nemůžu spustit soubor * .pyc přímo.
  • Když je soubor python (somefile.py) spuštěn přímo (./somefile.py nebo python somefile.py), není vytvořen žádný soubor .pyc a soubor kód se provádí stejně jako indikuje interpretované chování.

Tyto návrhy naznačují, že kód python) je kompilován pokaždé, když je importován do nového procesu, aby se vytvořil soubor .pyc, zatímco je interpretován při přímém spuštění.

Takže za jaký typ jazyka bych to měl považovat? Interpretováno nebo kompilováno? A jak se jeho účinnost porovnává s interpretovanými a kompilovanými jazyky?

Podle stránky Interpreted Languages wiki je tato stránka uvedena jako jazyk kompilovaný do kódu Virtual Machine Code, co se tím myslí?

82
crodjer

Stojí za zmínku, že jazyky nejsou interpretovány ani kompilovány, ale spíše jazykové implementace buď interpretovat, nebo kompilovat kód. Všimli jste si, že Ruby je "interpretovaný jazyk", ale můžete kompilovat Ruby à la MacRuby , takže to není vždy interpretovaný jazyk.

Téměř každá implementace Python implementace sestává z tlumočníka (spíše než kompilátoru). .pyc Soubory, které vidíte, jsou bajtovým kódem pro Python virtuální stroj (podobný souborům Java .class). Nejsou stejné jako strojový kód generovaný kompilátorem C pro architekturu nativního stroje. Některé implementace Python implementace, sestávají z kompilátoru just-in-time , který zkompiluje Python bajtový kód do nativního strojového kódu).

(Říkám "skoro každý", protože nevím o žádných kompilátorech nativních strojů pro Python, ale nechci tvrdit, že nikdo nikde neexistuje.)

83
mipadi

Python spadá pod interpretovaný bajtový kód. .py zdrojový kód je nejprve kompilován do bajtového kódu jako .pyc. Tento bajtový kód lze interpretovat (oficiální CPython) nebo zkompilovat JIT (PyPy). Python zdrojový kód (.py) lze zkompilovat do jiného bajtového kódu také jako IronPython (.Net) nebo Jython (JVM). Existuje více implementací Python jazyk. Oficiální je bajtový kód interpretovaný jedním. Existují také bajtový kód JIT kompilované implementace.

Pro rychlé porovnání různých implementací jazyků můžete zkusit zde .

36
aufather

Kompilovaný vs. interpretovaný může být v některých kontextech užitečný, ale pokud je aplikován v technickém smyslu, jedná se o falešnou dichotomii.

Kompilátor (v nejširším slova smyslu) je překladatel . Převádí program A na program B a pro budoucí provedení pomocí stroje M.

Tlumočník (v nejširším slova smyslu) je vykonavatel . Je to stroj M, který provádí program A. Ačkoli z této definice obvykle vylučujeme fyzické stroje (nebo nefyzické stroje, které fungují stejně jako fyzické). Z teoretického hlediska je však toto rozlišení poněkud svévolné.


Například, vezměte re.compile . "Zkompiluje" regex do střední formy a tato střední forma je interpretována/vyhodnocena/provedena.


Nakonec záleží na tom, o jaké úrovni abstrakce mluvíte a na čem vám záleží. Lidé říkají „kompilovaný“ nebo „interpretovaný“ jako široký popis nejzajímavějších částí procesu, ale ve skutečnosti je každý program kompilován (přeložen) a interpretován (proveden) tak či onak.

CPython (nejoblíbenější implementace jazyka Python jazyk) je pro provádění kódu většinou zajímavý. CPython by tedy byl obvykle popisován jako interpretovaný.

11
Paul Draper

Virtual Machine Code je kompaktnější verze původního zdrojového kódu (bajtový kód). Stále jej musí interpretovat virtuální stroj, protože se nejedná o strojový kód. Je však snazší a rychlejší analyzovat než původní kód napsaný lidskou bytostí.

Některé virtuální stroje generují strojový kód při první interpretaci kódu virtuálního stroje (kompilace právě včas - JIT). Následující vyvolání použije tento strojový kód přímo, což vede k rychlejšímu provedení.

Pokud vím Ruby> = 1,9 používá virtuální stroj jako Python).

7
LennyProgrammers

Runtime Python runtime) spouští kód vlastního objektu (bajtový kód) na virtuálním stroji.

Proces kompilace převede zdrojový kód na kód objektu.

Aby se věci urychlily, je kód objektu (nebo bajtový kód, pokud dáváte přednost) uložen na disku, takže jej lze znovu použít při příštím spuštění programu.

5
ykombinator