2011-01-06 17 views

Odpowiedz

5

Na początek, python jest skompilowany język, to po prostu robi kompilację w czasie wykonywania. Mówiąc w ten sposób, wszystko, co musisz zrobić, aby zaimplementować eval w jakimkolwiek innym języku skompilowanym, to móc uruchomić kompilator (i dynamicznie ładować kod obiektowy) - możesz to zrobić w Pythonie (i litanii innych języków) z łatwością, ponieważ kompilator jest integralną częścią środowiska wykonawczego. Z technicznego punktu widzenia nic nie powstrzyma programu napisanego w C od wywołania kompilatora i załadowania wyniku w czasie wykonywania (przy użyciu dlopen), to nie jest zwykłe zdarzenie, ponieważ środowisko wykonawcze C nie wymaga kompilatora, więc większość użytkowników nie ma takiego .

+3

Nie tylko to, ale C jest również językiem, który jest z natury trudny do skompilowania, więc wywołanie kompilatora do "eval" może potencjalnie zmusić użytkownika do czekania 5 minut lub gorzej. Python oszukuje trochę, ponieważ nie kompiluje się do kodu maszynowego, ale do wirtualnej maszyny, dzięki czemu można sprawić, że maszyna wirtualna obsługuje złożone elementy, aby ułatwić kompilację języka. Lisp jest łatwy do skompilowania, ponieważ kod źródłowy jest w zasadzie już drzewem składni abstrakcyjnej. Innym łatwym do kompilacji językiem jest Forth - oryginalny edytor skompilował każdą linię kodu, gdy jest wpisany. – slebetman

+3

@slebetman: w rzeczywistości są systemy, które wywołują kompilator C, i są bardzo szybkie (niektóre tryby pypy są jednym z przykładów) - nowoczesne kompilatory języka C są bardzo szybkie (nie C++), a w rzeczywistości najbardziej czasochłonny komponent cyklu budowania w C jest często łącznikiem (w zależności od platformy), a jeśli możesz go skrócić/zlikwidować, rozmiar fragmentów kodu, z którymi zazwyczaj się nie mierzysz, zwykle nie powoduje znacznych opóźnień (jako punkt odniesienia, 'icl' kompiluje linie C do kodu maszynowego szybciej niż kompilator python konwertuje linie pythonu na opcodes VM). –

5

Z pewnością różne środowiska Lisp mają tę zdolność od dziesięcioleci. Kompilator Lisp zazwyczaj działa na zasadzie funkcji, a kompilator i system wykonawczy pracują ręka w rękę.

Po zapytaniu o coś, środowisko wykonawcze Lisp przejdzie listę (struktura danych) do kompilatora do kompilacji. Kompilator może generować kod maszynowy (lub może kod bajtowy, w zależności od systemu), a następnie funkcja będzie wywoływana na poziomie maszyny, tak jak każda inna funkcja w programie.

Powiązane problemy