Pregunta

Python se compila en un código de bytes intermedio (pyc) y luego ejecutado. Por lo tanto, existe una compilación seguido de la interpretación. Sin embargo, desde hace mucho tiempo los usuarios de Python dicen que Python es un lenguaje de "enlace tardío" y que should`nt ser referido como un lenguaje interpretado.

  1. ¿Cómo Python ser diferente de otro lenguaje interpretado?

  2. Podría decirme qué "enlace tardío" significa, en el contexto de Python?

Java es otra lengua que primero tiene el código fuente compilado en código de bytes y luego se interpretan en bytecode.

  1. es Java un lenguaje interpretado / compilado?

  2. ¿Cómo se diferencia de Python en términos de compilación / ejecución?

  3. Java se dice que no tiene "enlace tardío". ¿Tiene esto algo que ver con los programas Java siendo ligeramente más rápido que Python?

Sería genial si también podría dar me une a los lugares donde la gente ya haya hablado de esto; Me encantaría leer más sobre esto. Gracias.

¿Fue útil?

Solución

tardío de unión es un concepto muy diferente a la interpretación.

En sentido estricto, un lenguaje interpretado que se ejecuta directamente desde la fuente. Que no pasa por una etapa de compilación de código byte. La confusión surge porque el programa Python es un intérprete, sino que interpreta el código de bytes, por lo que es el lenguaje de código byte de Python que usted describiría como "interpretado". El lenguaje Python en sí es un lenguaje compilado.

código de bytes de Java, por el contrario, es a la vez interpretado y compilado, en estos días. Se compila en código nativo por un compilador JIT y luego ejecuta directamente en el hardware.

enlace tardío es una propiedad del sistema de tipos y está presente en la mayoría de los idiomas en cierto grado, independientemente de si son interpretados o compilados.

Otros consejos

¿Cómo Python ser diferente de otro lenguaje interpretado?

Esto implica sutilezas. Los lenguajes interpretados y lenguajes "código administrado" como C # y lenguajes de máquina virtual (como Java) forman un continuo raro. Hay gente que va a decir que todos idiomas se "interpretan" - lenguaje de máquina, incluso. Después de todo, los circuitos electrónicos de la CPU "interpretan" lenguaje de máquina.

Lo mejor que puede hacer es decir que "interpreta" significa que hay una capa visible de software de interpretación de sus aplicaciones byte-codes. "No interpretadas-" significa que el software es (más o menos) directamente ejecutado por el hardware subyacente. "Código administrado" las personas son libres de seguir dividiendo este pelo.

Podría decirme qué "enlace tardío" significa, en el contexto de Python?

no se declaran variables a tener un tipo. La variable se une a un tipo lo más tarde posible -. Con la asignación de un objeto real

es Java un lenguaje interpretado / compilado?

Sí. Es compilado a códigos de bytes. Los códigos de bytes se interpretan. Yo prefiero llamarlo interpretado.

Sin embargo, la gente (por razones realmente oscuros) en desacuerdo. La presencia de cualquier tipo de "compilación" paso - aunque sea mínimo - siempre confunde a la gente. La traducción a código de bytes casi no tiene incidencia sobre el comportamiento real del programa en tiempo de ejecución. Algunas personas les gusta decir que Sólo idiomas que están completamente libre de cualquier mancha de pre-procesamiento "compilación" se puede interpretar. No hay una gran cantidad de ejemplos de esto más, ya que muchas lenguas se traducen del texto-humano amigable con intérprete códigos de bytes amistosos. Incluso Applesoft básico (allá por los años 80) tenía este tipo de pase traducido como las ha escrito en código.

Do JIT de algunos JVM. Algunos no lo hacen. Algunos son una mezcla. Decir que la JVM sólo lo hace la traducción JIT byte-código es incorrecto. Algunos de JVM hacen. Algunos no lo hacen.

¿Cómo se diferencia de Python en términos de compilación / ejecución?

No, en absoluto. La máquina virtual de Java puede ejecutar Python. [Para el confundido fácilmente, la palabra "pitón" en este contexto no puede querer decir "fuente de Python". Debe significar código de bytes pitón.]

Java se dice que no tiene "enlace tardío". ¿Tiene esto algo que ver con los programas Java siendo ligeramente más rápido que Python?

Tal vez. Los programas Java son a menudo más rápido debido a compiladores JIT que traducen el código de bytes de Java a código de máquina en tiempo de ejecución.

estático ( "temprana") la unión no tiene el mismo tipo de beneficio para Java que tiene con un lenguaje verdaderamente compilado como C o C ++, donde casi no hay controles en tiempo de ejecución de cualquier tipo. Java sigue haciendo las cosas como la comprobación de límites de la matriz, que omite C en el interés de velocidad pura.

En realidad, hay poco de pena por "tiempo de ejecución". atribuye Python y métodos se resuelven mediante simples búsquedas de diccionario. El diccionario es un hash; el rendimiento es bastante bueno. Los valores hash para los nombres se pueden poner en un "internado" piscina literal de cadena amortizar el coste de calcular el hash.

Para la diversión verdadera, mira PyPy y RPython. Este es un intérprete de Python que puede hacer la compilación JIT. Como resultado, terminamos con un intérprete de 2 niveles. Su código es interpretado por PyPy. PyPy es interpretada por RPython. http://alexgaynor.net/2010/may/15/pypy-future -python /

Hay una conexión entre lo que llamamos el Hora de unión y el concepto de interpretación / compilación .

El tiempo de unión es el tiempo cuando una expresión simbólica está obligado a su valor concreto. Eso es más que ver con la definición de lenguaje de programación, por ejemplo, dinámica de alcance vs estática de variables. O método estático frente a los métodos virtuales o tipado dinámico vs. tipos estáticos.

Luego viene la implementación del lenguaje. Cuanta más información se conocen por adelantado de forma estática, más fácil es escribir un compilador. A la inversa, cuanto más tarde obligado el lenguaje es, más difícil es. De ahí la necesidad de contar con técnicas interpretativas veces.

La distinción entre ambos no es estricta, sin embargo. No sólo podemos considerar que todo lo que en última instancia se interpreta (véase la respuesta S. Lott), sino que forma parte del código se puede compilar, descompilar o recompilación dinámica (por ejemplo JIT) que realiza la distinción muy difusa.

Por ejemplo, carga dinámica de clases en Java va en la categoría "tarde unión": el conjunto de la clase no es fijo una vez por todas, y las clases se puede cargar de forma dinámica. Algunas optimizaciones se pueden hacer cuando sabemos que el conjunto de clases, pero tendrán que ser invalidado una vez que se cambia de clases. Lo mismo sucede con la capacidad de actualizar un método con la infraestructura de depuración:. La JVM necesidad de reducir optimizar todos los sitios de llamadas fueron el método habían sido inline

No sé mucho de Python, pero los médicos prefieren Python tal vez el término "enlazado en tiempo" para evitar tal confusión.

Creo que la idea errónea de que Python es interpretado mientras que Java se compila surge porque Java tiene un paso de compilación explícita - se han de ejecutar javac para convertir el archivo de origen .java en un archivo de código de bytes .class que se puede ejecutar.

Como muy bien señala Python de manera similar compila archivos de código fuente en bytecode pero lo hace de forma transparente -. Compilar y ejecutar generalmente se hace en un solo paso lo que es menos evidente para el usuario

La diferencia importante es entre la unión y dinámico y tipos estáticos temprana y tardía. La distinción compilado / interpretado carece de sentido e irrelevante.

tiempo de unión es cuando los nombres se resuelven las cosas. Más lenguajes dinámicos tienden hacia fines de la unión. Esto puede ser separada de la interpretación / compilación - por ejemplo, métodos Objective-C se resuelven tarde y dinámicamente en comparación con C ++. Java no está gran parte de la unión en el tiempo de carga de clase: a más tardar C, pero antes de Python.

mi cita favorita de Stan Kelly-Bootle ordenador contradictionary :

unión tiempo n. El momento en que la tabla hash se corrompe.

==> Los avances en la computación pueden ser mapeadas en contra de la "tardanza de la unión", que me tiene pensando en mi propia llamada CS llamada carrera: pasado dorado, gris presente y futuro de color de rosa. Esta es mi versión de optimismo de Synge: la hierba es más verde, excepto en t = 0. En EDSAC I, se perforaron mis funciones (subrutinas 5 canales de cinta de papel), unidas y atadas alrededor de dos semanas antes de la entrada. Esto se conoce aspremature vinculante y pide destreza con bandas elásticas. FORTRAN vino a continuación con un nuevo tipo de unión: las cubiertas que estaban pasadas de tarjetas que se negaron a ser barajado. Luego, con Algol y C, disfruté estático (tiempo de compilación) de unión, hasta C ++ trajo las alegrías anestésicas de dinámica (en tiempo de ejecución) de unión. Mis objetivos actuales de investigación en el retraso de la unión hasta bien después de la ejecución. Me llamo vinculante este tiempo del fin, como fue profetizado en el Evangelio de San Mateo: "... y todo lo que atares en la tierra será atado en los cielos ..." (Mateo 16:19 RV)

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