¿Cuál es la relación entre los intérpretes meta-circulares, las máquinas virtuales y el mayor rendimiento?

12

Leí sobre intérpretes meta-circulares en la web (incluido SICP) y examiné el código de algunas implementaciones (como PyPy y Narcissus).

He leído bastante sobre dos idiomas que hicieron un gran uso de la evaluación metacircular, Lisp y Smalltalk. Según tengo entendido, Lisp fue el primer compilador de alojamiento propio y Smalltalk tuvo la primera implementación JIT "verdadera".

Una cosa que no he entendido completamente es cómo pueden esos intérpretes / compiladores lograr un rendimiento tan bueno o, en otras palabras, ¿por qué PyPy es más rápido que CPython? ¿Es por la reflexión?

Y también, mi investigación de Smalltalk me llevó a creer que existe una relación entre JIT, las máquinas virtuales y la reflexión. Las máquinas virtuales, como JVM y CLR, permiten una gran cantidad de introspección de tipos y creo que hacen un gran uso en la compilación Just-in-Time (y AOT, supongo). Pero hasta donde yo sé, las máquinas virtuales son como CPU, ya que tienen un conjunto de instrucciones básicas. ¿Las máquinas virtuales son eficientes porque incluyen información de tipo y referencia, lo que permitiría una reflexión independiente del lenguaje?

Pregunto esto porque muchos lenguajes interpretados y compilados ahora están usando bytecode como objetivo (LLVM, Parrot, YARV, CPython) y las máquinas virtuales tradicionales como JVM y CLR han obtenido incrementos increíbles en el rendimiento. Me han dicho que se trata de JIT, pero que yo sepa, JIT no es nada nuevo, ya que Smalltalk y el propio Self de Sun lo han estado haciendo antes de Java. No recuerdo que las máquinas virtuales hayan funcionado particularmente bien en el pasado, no había muchas no académicas fuera de JVM y .NET y su rendimiento definitivamente no fue tan bueno como lo es ahora (desearía poder obtener este reclamo, pero yo hablar por experiencia personal).

Luego, de repente, a fines de la década de 2000, algo cambió y muchas máquinas virtuales comenzaron a aparecer incluso para los idiomas establecidos, y con un rendimiento muy bueno. ¿Se descubrió algo sobre la implementación de JIT que permitió que casi todas las máquinas virtuales modernas se dispararan en rendimiento? ¿Un papel o un libro tal vez?

Gomi
fuente
3
Dinero. El dinero que solía vertirse en C ++ y Fortran ahora se vierte en HotSpot, CLR, Mono, V8, Nitro, SpiderMonkey, etc.
Jörg W Mittag
Solo puedo adivinar, pero creo que es solo una mejora con el tiempo, como se describe aquí joelonsoftware.com/articles/fog0000000017.html
Doc Brown
1
@Gomi No se trata de cuán similar es el lenguaje de implementación al lenguaje implementado. Hay intérpretes de JavaScript, Lisp, Prolog, SmallTalk y Ruby escritos en RPython y obtienen exactamente los mismos beneficios que ofrece PyPy. La única razón por la que RPython se basa en Python es porque fue creado por un grupo de entusiastas de Python. Las características de RPython que hacen que PyPy sea rápido no tienen nada que ver con Python: la generación automática del compilador JIT, los recolectores de basura, etc., y sí, la mayor parte de eso podría hacerse en principio utilizando otros lenguajes. Sin embargo, tendrías que crear un compilador completamente nuevo.
44
-1 porque parece tener al menos 3 preguntas diferentes aquí: (a) ¿Por qué las implementaciones meta-circulares son tan buenas? (b) ¿Las máquinas virtuales son eficientes debido a la información de tipo y la introspección es beneficiosa para el rendimiento? (c) ¿Cómo es que la popularidad de VM aumentó a fines de la década de 2000, y cómo de repente tienen un buen rendimiento? Creo que es mejor hacer esas preguntas por separado.
Roble

Respuestas:

1

2 de 3: No existe una relación entre tiempos de ejecución del lenguaje "meta-circulares" y "de alto rendimiento". Los tiempos de ejecución meta-circulares que logran un alto rendimiento lo hacen compilando JIT en código nativo y ejecutando el código nativo. No hay ninguna razón por la que su tiempo de ejecución Python de alto rendimiento deba escribirse en Python, o Lisp en Lisp, etc. Pero si cree que su lenguaje es más poderoso, expresivo, etc. que los demás, ¿por qué no usarlo para escribir? su propio tiempo de ejecución? O si no crees que tu idioma es de alguna manera "mejor" que otros, ¿por qué te tomas la molestia de implementarlo?

Alex D
fuente