2010-05-11 12 views
13

¿Por qué Lisp con todas sus características dinámicas puede compilarse estáticamente pero Python no puede (sin perder todas sus características dinámicas)?Lisp vs Python - Compilación estática

+0

.oO (contestar en 10 palabras o menos) – hop

+1

puede compilar estáticamente el código python con Cython (http://www.cython.org/) o shedskin (http://code.google.com/p/shedskin) /), que generan el código C/C++ del python, pero creo que a menudo pierden algunas de las características dinámicas a favor de los tipos estáticos más rápidos – cryo

Respuesta

13

No hay nada que impida la compilación estática de Python. Es un poco menos eficiente porque Python revela un ámbito local más mutable; además, para conservar algunas de las propiedades dinámicas (por ejemplo, eval), debe incluir el compilador con el programa compilado, pero nada impide eso también.

Dicho esto, la investigación muestra que la mayoría de los programas de Python, aunque dinámicos en análisis estático, son bastante estáticos y monomórficos en tiempo de ejecución. Esto significa que los enfoques de compilación de JIT en tiempo de ejecución funcionan mucho mejor en los programas de Python. Consulte descarga-descarga, PyPy, Psyco para conocer los enfoques que compilan Python en el código máquina. Pero también IronPython y Jython que usan una máquina virtual originalmente pensada para un lenguaje estático para compilar Python en machinecode.

4

Por lo que su valor, scripts de Python están compilados en archivos .pyc cuando el se ejecutan, ver "Compiled" Python files.

También puede usar una herramienta como py2exe para compilar un programa de Python en un archivo ejecutable.

+1

No estoy seguro de que sea comparable. No puede ejecutar archivos pyc sin un intérprete de Python. Por el contrario, (algunos) Lisp compila al código máquina nativo. Exes producidos por py2exe tienen bytecode, el intérprete de python y dlls incrustados, pero no es un código de máquina. – joaquin

+0

@joaquin: no hay una línea dura entre la compilación y la interpretación. Nada impide que uno construya un procesador que ejecute el bytecode de Python directamente. O desde el extremo opuesto, puede tomar el código máquina compilado x86 e interpretarlo en un emulador x86. Después de todo, el código es datos y los datos son código. –

+1

@Antes: Gracias. Creo que entiendo su punto, pero aún así, el código de máquina nativo sería la forma más optimizada de código, la más rápida posible para una condición y un procesador dados. Las otras posibilidades que mencionas estarían al menos un paso de eso, y consecuentemente no serían tan rápidas. ¿Esta mal?. Tal vez conceptualmente no haya diferencia, pero ¿es lo mismo en términos prácticos? No soy científico informático, así que discúlpeme si digo algo estúpido – joaquin

4

En realidad, no hay nada que le impida compilar estáticamente un programa de Python, es solo que nadie escribió tal compilador hasta ahora (Personalmente encuentro que el tiempo de ejecución de Python es muy fácil en comparación con CL's).

Se podría decir que la diferencia radica en detalles como "cuánto tiempo se pasó escribiendo realmente compiladores y si el lenguaje tiene una especificación formal de cómo escribir uno".

Vamos a abordar esos puntos:

  1. compiladores de Lisp han ido evolucionando durante más de 40 años, con el trabajo de comenzar de nuevo en los años 70 si no antes (no estoy seguro de mis fechas, demasiado perezoso demasiado google exacta unos) Eso crea una gran cantidad de conocimientos sobre cómo escribir un compilador. OTOH, Python fue nominalmente diseñado como "lenguaje de enseñanza", y como tal, los compiladores no eran tan importantes.
  2. Falta de especificación: Python no tiene una única fuente que especifique la semántica exacta del idioma. Claro, puede apuntar a PEP documentos, pero aún no cambia el hecho de que la única especificación real es la fuente de la implementación principal, CPython. Cuál, nota bene, es un compilador simple de clases (en bytecode).

En cuanto a si es posible, Python utiliza una estructura bastante simple para tratar con símbolos, etc., es decir, sus diccionarios. Puede tratarlos como tabla de símbolos de un programa. Puede etiquetar los tipos de datos para reconocer los primitivos y obtener el resto según los nombres almacenados y la estructura interna. el resto del lenguaje también es bastante simple. Lo único que falta es el trabajo real para implementarlo y hacerlo funcionar correctamente.

4

Python se puede "compilar", donde la compilación se ve como una traducción de un lenguaje de Turing Complete (código fuente) a otro (código de objeto). Sin embargo, en Lisp, el objeto es ensamblado, algo que es teóricamente posible con Python (probado) pero no factible.

La verdadera razón, sin embargo, es menos aplanamiento. Lisp es en muchos sentidos un lenguaje revolucionario que fue pionero en sus dialectos mucho de las características en los lenguajes de programación a los que estamos acostumbrados hoy.En Lisps, sin embargo, simplemente 'siguen' lógicamente desde lo básico del lenguaje. El lenguaje que se inspira en los poderes expresivos en bruto de los ceceos, como JavaScript, Ruby, Perl y Python, se interpreta necesariamente porque obtener esas características en un lenguaje con una 'sintaxis similar a Algol' es simplemente difícil.

Lisp obtiene estas características de ser 'homo-icónico', no existe una diferencia esencial entre un programa de lisp y una estructura de datos lisp. Los programas Lisp son estructuras de datos, son descripciones estructurales de un programa en tal expresión S si lo desea, por lo tanto, un programa compilado de lisp efectivamente se "interpreta a sí mismo" sin la necesidad de un lector y todo eso, un programa lisp podría ser visto como una entrada manual del árbol de análisis. Lo que requiere una sintaxis que muchas personas encuentran contraintuitiva para trabajar, por lo tanto, hubo muchos intentos de transportar el expresivo poder expresivo del paradigma a una sintaxis más legible, lo que significa que no es factible, pero no imposible, compilarlo hacia el montaje.

También, compilar Python al montaje posiblemente sería más lento y más grande que 'media-interpretar' en una máquina virtual, una gran cantidad de características en pitón depende de un análisis sintáctico.

Aunque lo anterior está escrito por un gran fanfarrón de ceceo, tenga presente ese conflicto de intereses.