Czy ekwiwalent eval i exec może istnieć w skompilowanym języku? Jeśli tak, to w jaki sposób zostałyby one skompilowane (w przybliżeniu)?Czy zostały skompilowane komendy i eval Pythona?
Odpowiedz
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 .
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.
- 1. Kaskadowe przykłady nie zostały skompilowane?
- 2. Czy mogę użyć komendy cofania komendy execCommand, aby cofnąć akcje, które nie zostały wykonane przy użyciu komendy execCommand?
- 3. Dlaczego wartości Enums zostały skompilowane jako stałe zamiast wartości statycznych?
- 4. Czy skompilowane pakiety R są kompatybilne wstecz?
- 5. Czy istnieją skompilowane skrypty PHP?
- 6. ASP: LinkButton i Eval
- 7. AWS Odpowiedzi od [i-2a7fe91f] zostały odebrane, ale komendy nie powiodły się
- 8. Cytaty parametrów Bash i eval
- 9. Bash zagnieżdżone cytaty i eval
- 10. eval i wycena w data.table
- 11. jak uruchomić skrypty Pythona za pomocą komendy tcl exec
- 12. kiedy używać DataFrame.eval() kontra pandas.eval eval() lub() Pythona
- 13. Odpowiednik Unix eval w Windows
- 14. Czy istnieje funkcja eval() w Javie?
- 15. Użycie exec i eval w Pythonie
- 16. DbContext zostały usunięte i autofac
- 17. Przechwytywanie przypisań zmiennych w Perl eval
- 18. Jaka jest różnica między locals i globals przy użyciu eval() Pythona?
- 19. wieloprocesorowe Pythona i pamięć
- 20. PHP Eval, który ocenia HTML i PHP
- 21. Uruchom okna poleceń i uruchom komendy wewnątrz
- 22. Python - książka Zelle używa eval(), czy to źle?
- 23. o eval konstruktów oświadczenie i usuwanie
- 24. Python argparse argumenty pozycyjne i pod-komendy
- 25. Wykonanie komendy cygwin z NodeJS
- 26. Czy powinieneś sprawdzić swoje skompilowane aktywa w Git?
- 27. Python: make eval safe
- 28. eval() = Nieoczekiwany token: Błąd
- 29. F # odpowiednik Eval
- 30. Czy typelists zostały całkowicie zastąpione szablonami variadic?
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
@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). –