W przypadku kodu takiego A = A + B
można skompilować do jednej lub dwóch instrukcji maszynowych, z których każda zajmuje określoną liczbę cykli. Żaden tłumacz nie może zrobić tego samego w tej liczbie cykli z prostego powodu.
Tłumacz interpretuje również własny zestaw instrukcji (nazywaj je kodami bajtowymi, kodami p, językiem pośrednim itp.). Za każdym razem, gdy widzi kod bajtowy, taki jak ADD, musi go jakoś wyszukać i rozgałęzić się do kodu, który dokonuje dodania.
Następnym razem to widzi, że musi powtarzać tego odnośnika, chyba, że ma sposób na zapamiętanie uprzedniej odnośnika. Jeśli ma sposób na zapamiętanie wcześniejszego wyszukiwania, nie jest to już tak zwany „tłumacz”, ale raczej kompilator „just-in-time” lub JITter.
Z drugiej strony...
W przypadku kodu callSomeFunction( ... some args ...)
, ile cykli spędzonych między wprowadzeniem tego kodu a jego pozostawieniem? Wszystko zależy od tego, co dzieje się w środku callSomeFunction
. Może to być kilka, a może tryliony, nawet jeśli callSomeFunction
sam zostanie skompilowany. Jeśli to dużo, nie ma sensu dyskutować o koszcie interpretacji tego wiersza kodu - pieniądze są gdzie indziej.
Pamiętaj, że interpretowane języki mają swoją wartość, np. Nie trzeba ich kompilować. („Kompilacja” składni powierzchni do kodów bajtowych zajmuje trywialny czas. Weźmy na przykład R lub MATLAB.)
Potrzebna jest także elastyczność inteligentnych poziomów programowania. W Minsky's Society of Mind , rozdział 6.4 B -Brains, są programy A, które zajmują się światem, i są programy B, które zajmują się programami A, i mogą być dalsze poziomy. Programy, które piszą i zarządzają innymi programami, mogą być łatwiej wykonywane w systemach interpretacyjnych.
W Lisp możesz pisać, (+ A B)
aby dodać A i B, ale po napisaniu masz tylko opcję, aby go uruchomić lub nie. Możesz także napisać, (eval (list '+ 'A 'B))
który konstruuje program, a następnie wykonuje go. Może skonstruować coś innego.
Przedmiotem programu jest inny program . Łatwiej jest pisać w tłumaczonym języku (jednak, jak zauważa Jörg, nowsze wersje Lisp, podczas gdy mają możliwość eval
kompilacji w locie, więc nie mają kary za tłumaczenie).