Esto es solo una pregunta que tuve al leer sobre idiomas interpretados y compilados.
Ruby es sin duda un lenguaje interpretado ya que el código fuente es procesado por un intérprete en el punto de ejecución.
Por el contrario, C es un lenguaje compilado, ya que primero hay que compilar el código fuente de acuerdo con la máquina y luego ejecutarlo. Este resultado es una ejecución mucho más rápida.
Ahora llegando a Python :
- Un código python ( somefile.py ) cuando se importa crea un archivo ( somefile.pyc ) en el mismo directorio. Digamos que la importación se realiza en un shell de Python o en un módulo de Django. Después de la importación, cambio el código un poco y ejecuto las funciones importadas nuevamente para encontrar que todavía se está ejecutando el código anterior. Esto sugiere que los archivos * .pyc son archivos compilados de Python similares al ejecutable creado después de la compilación de un archivo C, aunque no puedo ejecutar el archivo * .pyc directamente.
- Cuando el archivo python (somefile.py) se ejecuta directamente (./somefile.py o python somefile.py) no se crea ningún archivo .pyc y el código se ejecuta como indica un comportamiento interpretado.
Esto sugiere que se compila un código de Python cada vez que se importa en un nuevo proceso para crear un .pyc mientras se interpreta cuando se ejecuta directamente.
Entonces, ¿qué tipo de lenguaje debería considerarlo? ¿Interpretado o compilado? ¿Y cómo se compara su eficiencia con los idiomas interpretados y compilados?
De acuerdo con la página de Idiomas Interpretados de wiki , aparece como un idioma compilado en Virtual Machine Code, ¿qué significa eso?
RUN
. Era como si tuviera un compilador que realizó el paso lexing y luego generó una secuencia de tokens que tuvieron que analizarse cada vez que se ejecutó el programa. No se parece en nada a la compilación moderna de bytecode como se hace, por ejemplojavac
, que abarca el lexing, el análisis y la optimización.Respuestas:
Vale la pena señalar que los idiomas no se interpretan ni compilan, sino que las implementaciones de idiomas interpretan o compilan el código. Notó que Ruby es un "lenguaje interpretado", pero puede compilar Ruby à la MacRuby , por lo que no siempre es un lenguaje interpretado.
Casi todas las implementaciones de Python consisten en un intérprete (en lugar de un compilador). Los
.pyc
archivos que ve son código de bytes para la máquina virtual Python (similar a los.class
archivos de Java ). No son lo mismo que el código de máquina generado por un compilador de C para una arquitectura de máquina nativa. Algunas implementaciones de Python, sin embargo, consisten en un compilador justo a tiempo que compilará el código de bytes de Python en código de máquina nativo.(Digo "casi todos" porque no conozco ningún compilador de máquinas nativas para Python, pero no quiero afirmar que ninguno existe en ningún lado).
fuente
Python caerá bajo el código de byte interpretado.
.py
El código fuente se compila primero en código de bytes como.pyc
. Este código de byte se puede interpretar (CPython oficial) o compilar JIT (PyPy). El código fuente de Python (.py
) se puede compilar en diferentes códigos de bytes también como IronPython (.Net) o Jython (JVM). Existen múltiples implementaciones del lenguaje Python. El oficial es un código de bytes interpretado. También hay implementaciones compiladas de código de bytes JIT.Para ver comparaciones de velocidad de diversas implementaciones de idiomas, puede probar aquí .
fuente
Compilado vs interpretado puede ser útil en algunos contextos, pero cuando se aplica en un sentido técnico, es una falsa dicotomía.
Un compilador (en el sentido más amplio) es un traductor . Traduce el programa A al programa B y para su futura ejecución, utiliza una máquina M.
Un intérprete (en el sentido más amplio) es un ejecutor . Es una máquina M que ejecuta el programa A. Aunque generalmente excluimos de esta definición las máquinas físicas (o máquinas no físicas que actúan igual que las físicas). Pero desde la perspectiva teórica, esa distinción es algo arbitraria.
Por ejemplo, toma
re.compile
. "Compila" una expresión regular en una forma intermedia, y esa forma intermedia se interpreta / evalúa / ejecuta.Al final, depende de qué nivel de abstracción estés hablando y de qué te preocupes. La gente dice "compilado" o "interpretado" como descripciones amplias de las partes más interesantes del proceso, pero en realidad la mayoría de los programas se compilan (traducen) e interpretan (ejecutan) de una forma u otra.
CPython (la implementación más popular del lenguaje Python) es principalmente interesante para ejecutar código. Por lo tanto, CPython normalmente se describiría como interpretado. Aunque esta es una etiqueta suelta.
fuente
Virtual Machine Code es una versión más compacta del código fuente original (código de byte). Todavía necesita ser interpretado por una máquina virtual, ya que no es un código de máquina. Sin embargo, es más fácil y rápido analizar que el código original escrito por un ser humano.
Algunas máquinas virtuales generan código de máquina mientras interpretan el código de máquina virtual por primera vez (compilación justo a tiempo - JIT). Las siguientes invocaciones utilizarán este código de máquina directamente, lo que conduce a una ejecución más rápida.
Hasta donde sé, Ruby> = 1.9 también usa una máquina virtual como Python.
fuente
El tiempo de ejecución de Python ejecuta código de objeto personalizado (código de byte) en una máquina virtual.
El proceso de compilación convierte el código fuente en código objeto.
Para acelerar las cosas, el código objeto (o código de bytes, si lo prefiere) se almacena en el disco, por lo que puede reutilizarse la próxima vez que se ejecute el programa.
fuente