Czytałem o interpreterach okrągłych w Internecie (w tym SICP) i sprawdziłem kod niektórych implementacji (takich jak PyPy i Narcyz).
Czytałem całkiem sporo o dwóch językach, które świetnie wykorzystywały ewaluację wewnątrzkolistną, Lisp i Smalltalk. O ile rozumiałem, Lisp był pierwszym kompilatorem samo hostującym, a Smalltalk miał pierwszą „prawdziwą” implementację JIT.
Nie do końca rozumiem, w jaki sposób tłumacze / kompilatory mogą osiągnąć tak dobrą wydajność lub, innymi słowy, dlaczego PyPy jest szybszy od CPython? Czy to z powodu refleksji?
Ponadto moje badania Smalltalk doprowadziły mnie do przekonania, że istnieje związek między JIT, maszynami wirtualnymi i refleksją. Maszyny wirtualne, takie jak JVM i CLR, pozwalają na wiele introspekcji typu i uważam, że świetnie wykorzystują je w kompilacji Just-in-Time (i chyba AOT?). Ale o ile mi wiadomo, maszyny wirtualne przypominają procesory, ponieważ mają podstawowy zestaw instrukcji. Czy maszyny wirtualne są wydajne, ponieważ zawierają informacje o typie i referencjach, które umożliwiłyby refleksję niezależną od języka?
Pytam o to, ponieważ wiele języków interpretowanych i skompilowanych używa teraz kodu bajtowego jako celu (LLVM, Parrot, YARV, CPython), a tradycyjne maszyny wirtualne, takie jak JVM i CLR, uzyskały niesamowity wzrost wydajności. Powiedziano mi, że chodzi o JIT, ale o ile wiem, JIT nie jest niczym nowym, odkąd Smalltalk i własna Jaźń Sun robili to przed Javą. Nie pamiętam, aby maszyny wirtualne osiągały szczególnie dobre wyniki w przeszłości, nie było wielu nieakademickich poza JVM i .NET, a ich wydajność zdecydowanie nie była tak dobra, jak teraz (chciałbym móc pozyskać to twierdzenie, ale ja mówić z własnego doświadczenia).
Nagle pod koniec 2000 roku coś się zmieniło i wiele maszyn wirtualnych zaczęło pojawiać się nawet w ustalonych językach i przy bardzo dobrej wydajności. Czy odkryto coś w implementacji JIT, która pozwoliła niemal każdej nowoczesnej maszynie wirtualnej na wzrost wydajności? Może papier czy książka?