¿Por qué no hay otros lenguajes de programación que se compilan en el código de bytes de Python?

51

En Java, hay varios lenguajes que se compilan en el bytecode de Java y se pueden ejecutar en la JVM: Clojure, Groovy y Scala son los principales que puedo recordar de la parte superior de mi cabeza.

Sin embargo, Python también se convierte en código de bytes (archivos .pyc) antes de que lo ejecute el intérprete de Python. Puede que sea ignorante, pero ¿por qué no hay otros lenguajes de programación que se compilen con el código de bytes de Python?

¿Es solo porque nadie se molestó en hacerlo, o hay algún tipo de restricción o barrera inherente que hace que sea tan difícil hacerlo?

    
pregunta Michael0x2a 17.05.2012 - 01:59

6 respuestas

74

Simple: la última vez que lo verifiqué, Python no tenía una especificación formal, incluido su código de bytes. CPython es la especificación, y no se requiere la portabilidad del código de bytes IIRC. Por lo tanto, es un objetivo móvil e indocumentado diseñado para un idioma específico.

    
respondido por el p_l 17.05.2012 - 04:27
54

Hay varios lenguajes JVM porque había personas con talento que querían escribir código que funcionara con el código Java existente, pero no querían escribir Java .

Aparentemente, no hay programadores que quieran trabajar con el código Python existente, pero odian a Python lo suficiente como para portar otro idioma al intérprete de código de bytes de Python.

Puedes ver esto de dos maneras: hay lenguajes alternativos para la JVM porque Java está muy extendido, o no hay lenguajes alternativos para el intérprete de bytecode de Python porque Python no apesta.

    
respondido por el kevin cline 17.05.2012 - 18:30
25

Existen deficiencias técnicas como la GIL en CPython, pero pocas deficiencias percibidas en lenguaje , por lo que el tiempo de ejecución no es el punto de venta de la comunidad de Python. Exactamente lo contrario, hay más opciones de tiempo de ejecución de back-end debido a la insatisfacción con la implementación de GIL / CPython.

El lenguaje Java es mucho más difamado que el JVM (incluso en la comunidad Java).

La JVM está bastante bien considerada en la mayoría de los círculos; por lo tanto, el deseo de un frente de lenguaje diferente / mejor con los beneficios de la JVM back-end altamente optimizada.

    
respondido por el Jarrod Roberson 17.05.2012 - 18:39
10

Yo digo que Mason Wheeler tiene razón. Es principalmente un problema con el bloqueo global de intérpretes, lo que hace que la concurrencia sea un problema muy espinoso. Dado que hay otras máquinas virtuales que hacen la concurrencia realmente muy bien comparativamente, tiene sentido desarrollar lenguajes para ellas. Además, Python ha tenido un cambio de idioma importante recientemente y muchas de las bibliotecas no han logrado que la compatibilidad sea una pesadilla leve a veces. Por ejemplo, debido a que uso PIL para trabajo de visión, tengo que codificar en Python 2.7 o inferior. Este no es el caso con las configuraciones de JVM o CLI que, en particular, en el caso de este último se diseñaron teniendo en cuenta la interoperabilidad del idioma.

Investigé un poco más y, aparentemente, hay dos GIL no solo uno. Los otros controles Importaciones .

    
respondido por el World Engineer 17.05.2012 - 02:47
8

Las otras respuestas tienen mucho sentido, pero en realidad ahora hay lenguajes que compilan a Python. Donde hay un testamento ...

No sé nada acerca de estos idiomas, pero parece que funcionan al transpilar su código fuente a los AST de Python y al permitir que Python compile los árboles a bytecode, evitando los problemas mencionados en otras respuestas.

Sobre la base de los comentarios, actualmente conocemos tres idiomas alternativos que utilizan la máquina virtual de Python (siéntase libre de agregar otros aquí):

  • Mochi Se describe como un lenguaje de programación de tipo dinámico para la programación funcional y la programación estilo actor .
  • Hy : se describe a sí mismo como un dialecto de Lisp integrado en Python .
  • dg : se describe a sí mismo como un lenguaje (técnicamente) simple que se compila a bytecode CPython .
respondido por el Carl Smith 19.12.2014 - 00:17
6

Otra razón es que la JVM es un ecosistema altamente optimizado, bien evolucionado y extremadamente completo. Por sí solo, compite extremadamente bien con cualquiera de los otros lenguajes compilados. (No diré que es el mejor VM de propósito general que existe, pero ciertamente he apostado mi carrera en eso). Por lo tanto, es deseable tener acceso a la JVM, además de escribir el código de bytes, en En sí.

Sin embargo, la máquina virtual de Python es buena, pero (nada en contra de Python) tiene algunas deficiencias serias. El entorno de ejecución de Python se adapta bien a la naturaleza dinámica del lenguaje, pero realmente puede sorprenderte cuando te familiarizas con el uso de la memoria, el bloqueo global o el modelo de subprocesamiento.

En las comparaciones directas, la JVM suele ser el doble de rápida que la máquina virtual de Python. La JVM (sorprendentemente) incluso compite bien con el código compilado de forma nativa, basándose en las optimizaciones "en caliente" que realiza. Y eso sin contar el manejo de subprocesos más sofisticado, etc.

Me encanta Python, realmente lo hago, y odio decirlo, pero a veces el rendimiento simplemente me patea los dientes. De lo contrario, ¿por qué las bibliotecas de Python críticas como numpy o scipy tienen que recurrir al código C?

En otras palabras, las personas que gravitan a Python lo hacen porque les gusta el idioma . Pero si desea escribir un nuevo idioma que se adapte a sus preferencias, es mucho mejor compilar JVM, ya que su nuevo idioma idiosincrásico comenzará en uno de los mejores entornos operativos (subjetivamente, quizás el mejor) disponibles.

    
respondido por el Rob 19.12.2014 - 03:21

Lea otras preguntas en las etiquetas