Pregunta

si hago un JVM en Java, por ejemplo, ¿es posible hacer que la implementación que hice realmente más rápido que la implementación original solía para construir esta implementación, a pesar de que mi implementación está construida sobre la implementación original e incluso puede depender de esa implementación?

( Confuso...)

Mira a PyPy.Es un compilador JIT para Python creado en Python.Está bien, pero ¿cómo puede pretender serlo? más rápido que la implementación original de Python que utiliza y de la que depende?

¿Fue útil?

Solución

Estás confundido entre un idioma y el aparato de ejecución para ese idioma.

Una de las razones por las que PyPy puede ser más rápido que CPython es porque PyPy está compilado en un ejecutable nativo completamente separado y no depende ni se ejecuta en CPython.

Sin embargo, sería posible que una implementación ineficiente de un idioma fuera superada por un intérprete escrito en ese mismo idioma y alojado en el intérprete ineficiente, si el intérprete de nivel superior hiciera uso de estrategias de ejecución más eficientes.

Otros consejos

Absolutamente, es posible. Su implementación de JVM podría compilar byteCodes Java en el código de máquina optimizado. Si su optimizador era más sofisticado que en la implementación JVM en la que ejecuta su compilador Java, entonces el resultado final podría ser más rápido.

En ese caso, puedes ejecutar tu compilador Java en su propio código fuente, y beneficiarse de velocidades de compilación más rápidas a partir de entonces.

Dijiste que Pypy es un compilador JIT para Python (no estoy familiarizado con él). Si ese es el caso, entonces convierte un programa de Python en el código de la máquina y luego ejecuta el código de la máquina. Otro póster dijo que el compilador Pypy se ejecuta como un ejecutable independiente, separado de CPython. Pero incluso si se ejecutara en CPYTHON, una vez que su programa se jita al código de la máquina, y el código de la máquina compilado se está ejecutando, el rendimiento del compilador ya no importa. La velocidad del compilador solo tiene un efecto en el tiempo de inicio.

Pypy no es el intérprete de Python implementado en Python, es el intérprete de Python y el compilador implementado en Rpython, que es un subconjunto de Python de tipificación estáticamente restringida:

Rpython es un subconjunto restringido de Python que es susceptible de análisis estático. Aunque hay adiciones al lenguaje y algunas cosas podrían funcionar sorprendentemente, esta es una lista aproximada de restricciones que deben considerarse. Tenga en cuenta que hay toneladas de restricciones especiales que encontrará a medida que avanza.

La diferencia de velocidad real proviene del hecho de que, a diferencia de CPython, que está interpretando todo el programa como Bytecode, Pypy usa Compilación Just-in-Time (JIT) (en el código de la máquina) para piezas rpython.

No creo que sea posible implementar un intérprete para un idioma en ese idioma (llame a esto a), luego ejecutarlo además de otro intérprete existente (llame a esto b) para ese idioma y ejecute un programa (llame a este p), y haga que P funcione (A corriendo en B) sea más rápido que P Running en B.

Cada operación de A tendrá que implementarse con al menos una operación de B. Por lo tanto, incluso si B es atrozmente malo y A, es óptimo, el hecho de que A se ejecute en B significa que la maldad de B ralentizará A .

Podría ser posible implementar un compilador de intérprete + JIT para un lenguaje en el lenguaje en sí, donde el compilador JIT produce algún otro código más rápido en tiempo de ejecución, y se ejecuta que se ejecute (A en B) sea más rápido que P en B en B. La parte del tiempo de ejecución de P que no está compilado es más lenta (mucho más lento, normalmente) pero si el compilador JIT identifica con éxito las partes "calientes" de P y las ejecuta más rápidamente de lo que B podría ser todo más rápido en general.

Pero eso no es realmente interesante. También es posible implementar un compilador para un idioma en ese idioma (c), compilarlo con un compilador existente (D) y tener el nuevo código de producir el lenguaje del compilador que es más rápido de lo que el compilador original habría producido. Espero que eso no te asuste; Debe estar claro que la velocidad del código emitido por D solo tendrá un efecto en el tiempo de ejecución de C, no en el tiempo de ejecución de otros programas compilados con C.

La escritura de compiladores en los idiomas que compilan se han realizado durante décadas (el GCC está escrito en C, por ejemplo), y no es realmente relevante para la verdadera pregunta que creo que está haciendo; Tampoco JIT compilan un lenguaje que se usa a sí mismo. En ambos casos, la ejecución subyacente es algo más que el lenguaje que está considerando; generalmente código de máquina.

Sin embargo, la fuente de su pregunta es una idea errónea. El intérprete de Python de Pypy no se implementa en Python. El proyecto Pypy tiene un intérprete para Python escrito en Rpython. Rpython es un subconjunto de pitón, elegido para que pueda compilarse de manera eficiente al código de la máquina; Como lenguaje, Rpython se parece mucho más a Java con inferencia de tipo y bloques con sangría en lugar de aparatos ortopédicos. El proyecto Pypy también tiene un compilador para Rpython que está escrito en Python, y es capaz de agregar automáticamente (en su mayoría) un compilador JIT a ningún intérprete compila.

Cuando realmente está utilizando el intérprete Pypy en producción, está utilizando un intérprete de código de máquina compilado de las fuentes RPYTHON, al igual que cuando está utilizando el intérprete CPyThon, utiliza un intérprete de código de máquina compilado a partir del código fuente C. Si ejecuta el intérprete Pypy sobre otro intérprete de Python (que puede hacer porque el código RPython válido también es un código Python válido; pero pero no Al revés), entonces corre mucho más lento que el intérprete de Cpython.

El proceso de traducción de PYPY se ejecuta en CPyThon, pero la salida es una lista de archivos .c (19 archivos la última vez que revisé) que luego se compilan en un binario: Pypy-C. En tiempo de ejecución, Pypy-C no tiene ninguna relación con Cpython, por eso puede ser más rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top