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?
Respuestas:
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?
fuente