To tylko zastanawiam się, kiedy czytałem o językach interpretowanych i kompilowanych.
Ruby jest bez wątpienia językiem interpretowanym, ponieważ kod źródłowy jest przetwarzany przez interpretera w punkcie wykonania.
Przeciwnie, C jest językiem kompilowanym, ponieważ najpierw należy skompilować kod źródłowy zgodnie z maszyną, a następnie wykonać. Wynikiem tego jest znacznie szybsze wykonanie.
Teraz nadchodzi do Pythona :
- Kod Pythona ( somefile.py ) po zaimportowaniu tworzy plik ( somefile.pyc ) w tym samym katalogu. Powiedzmy, że import odbywa się w powłoce Pythona lub module django. Po zaimportowaniu zmieniam nieco kod i ponownie uruchamiam zaimportowane funkcje, aby stwierdzić, że nadal działa stary kod. Sugeruje to, że pliki * .pyc są skompilowanymi plikami Pythona podobnymi do plików wykonywalnych utworzonych po kompilacji pliku C, chociaż nie mogę bezpośrednio wykonać pliku * .pyc.
- Gdy plik python (somefile.py) jest wykonywany bezpośrednio (./somefile.py lub python somefile.py), plik .pyc nie jest tworzony, a kod jest wykonywany, co wskazuje na interpretowane zachowanie.
Sugerują to, że kod Pythona jest kompilowany za każdym razem, gdy jest importowany w nowym procesie w celu utworzenia pliku .pyc, który jest interpretowany podczas bezpośredniego wykonywania.
Więc jaki rodzaj języka powinienem uznać za? Zinterpretowany czy skompilowany? Jaka jest jego skuteczność w porównaniu do języków interpretowanych i kompilowanych?
Zgodnie ze stroną języków interpretowanych wiki jest wymieniony jako język skompilowany do wirtualnego kodu maszyny, co to oznacza?
RUN
. To było tak, jakbyś miał kompilator, który wykonał krok leksykalny, a następnie wypisał strumień tokenów, które trzeba było ponownie przeanalizować przy każdym uruchomieniu programu.javac
Zupełnie nie tak jak nowoczesna kompilacja kodu bajtowego wykonywana przez powiedzmy , która obejmuje leksykację, parsowanie i optymalizację.Odpowiedzi:
Warto zauważyć, że języki nie są interpretowane ani kompilowane, ale implementacje językowe interpretują lub kompilują kod. Zauważyłeś, że Ruby jest „językiem interpretowanym”, ale możesz skompilować Ruby à la MacRuby , więc nie zawsze jest to język interpretowany.
Prawie każda implementacja Pythona składa się z interpretera (a nie kompilatora). Te
.pyc
pliki można zobaczyć to kod bajtowy dla maszyny wirtualnej Pythona (podobny do Javy.class
plików). Nie są takie same jak kod maszynowy generowany przez kompilator C dla natywnej architektury maszynowej. Jednak niektóre implementacje Pythona składają się z kompilatora just-in-time , który skompiluje bajtowy kod Pythona w natywny kod maszynowy.(Mówię „prawie każdy”, ponieważ nie znam żadnych natywnych kompilatorów maszyn dla Pythona, ale nie chcę twierdzić, że nigdzie nie istnieją).
źródło
Python zostanie objęty interpretowanym kodem bajtowym.
.py
kod źródłowy jest najpierw kompilowany do kodu bajtowego jako.pyc
. Ten bajtowy kod można interpretować (oficjalny CPython) lub skompilować JIT (PyPy). Kod źródłowy Pythona (.py
) można skompilować do innego kodu bajtowego, takiego jak IronPython (.Net) lub Jython (JVM). Istnieje wiele implementacji języka Python. Oficjalny to interpretowany kod bajtowy. Istnieją również implementacje skompilowane z kodem bajtowym JIT.W celu porównania prędkości różnych implementacji języków możesz wypróbować tutaj .
źródło
Kompilacja vs. interpretacja może być pomocna w niektórych kontekstach, ale zastosowana w sensie technicznym jest fałszywą dychotomią.
Kompilator (w najszerszym tego słowa znaczeniu) jest tłumaczem . Tłumaczy program A na program B i do wykonania w przyszłości za pomocą maszyny M.
Tłumacz (w najszerszym tego słowa znaczeniu) jest wykonawcą . Jest to maszyna M, która wykonuje program A. Chociaż zwykle wykluczamy z tej definicji maszyny fizyczne (lub maszyny niefizyczne, które działają tak samo jak maszyny fizyczne). Ale z teoretycznego punktu widzenia to rozróżnienie jest nieco arbitralne.
Na przykład weź
re.compile
. „Kompiluje” wyrażenie regularne do formy pośredniej, a ta forma pośrednia jest interpretowana / oceniana / wykonywana.Ostatecznie zależy to od poziomu abstrakcji, o którym mówisz i na czym ci zależy. Ludzie mówią „skompilowane” lub „zinterpretowane” jako ogólne opisy najciekawszych części procesu, ale tak naprawdę większość programów jest kompilowana (tłumaczona) i interpretowana (wykonywana) w taki czy inny sposób.
CPython (najpopularniejsza implementacja języka Python) jest najbardziej interesująca do wykonywania kodu. Tak więc CPython byłby zwykle opisywany jako interpretowany. Chociaż jest to luźna etykieta.
źródło
Virtual Machine Code to bardziej kompaktowa wersja oryginalnego kodu źródłowego (kod bajtowy). Nadal musi być interpretowany przez maszynę wirtualną, ponieważ nie jest to kod maszynowy. Jednak parsowanie jest łatwiejsze i szybsze niż oryginalny kod napisany przez człowieka.
Niektóre maszyny wirtualne generują kod maszynowy podczas pierwszej interpretacji kodu maszyny wirtualnej (kompilacja just in time - JIT). Poniższe wywołania wykorzystają bezpośrednio ten kod maszynowy, co prowadzi do szybszego wykonania.
O ile wiem Ruby> = 1.9 używa również maszyny wirtualnej takiej jak Python.
źródło
Środowisko wykonawcze Python uruchamia niestandardowy kod obiektowy (kod bajtowy) na maszynie wirtualnej.
Proces kompilacji konwertuje kod źródłowy na kod obiektowy.
Aby przyspieszyć, kod obiektowy (lub kod bajtowy, jeśli wolisz) jest przechowywany na dysku, dzięki czemu można go ponownie użyć przy następnym uruchomieniu programu.
źródło