8

¿Por qué los programas que tienen un lenguaje de tipado dinámico suelen interpretarse en lugar de compilarse?Intérpretes e idiomas de tipo dinámico

+0

¿Qué idiomas tienes en mente? – TomaszK

+0

@TomasxK: Qué tal: Erlang, Lisp, Lua, Prolog, Ruby y otros que tienen intérpretes. –

+0

No son necesariamente; muchos sistemas Common Lisp compilan a código nativo. Además, ¿cuál es su definición de "interpretado" frente a "compilado"? ¿Dónde caen Python y Java? –

Respuesta

5

En resumen: van juntos como los guisantes y las zanahorias.

La compilación frente a la interpretación y la tipificación del lenguaje son preocupaciones fundamentalmente independientes, ya que puede tener todas las permutaciones posibles. Por otro lado, la "razón" para escoger la compilación y no escoger el tipado dinámico para un diseño de lenguaje suele ser la misma: rendimiento. La "razón" para elegir la tipificación e interpretación dinámica también está relacionada de alguna manera.

No es una regla difícil y rápida. Siempre puedes mezclarlos. Puede compilar Perl y Lisp, por ejemplo, e interpretar C.

+1

A la multitud de Haskell y ML le encanta el tipado estático no solo principalmente por el rendimiento (aunque a veces es tan rápido como C es bastante genial), sino por la seguridad que puede proporcionar. Dicho esto, los sistemas de tipos de FP estáticos son diez veces más poderosos y expresivos que el sistema de tipo de lenguaje OOP promedio. – delnan

+0

Estoy totalmente de acuerdo. Es realmente una razón para * no * elegir tipeo dinámico. – caveman

+0

La mayoría de los lenguajes "interpretados" modernos en realidad pasan por una "fase de compilación" de tipos - CPython va a un archivo intermedio de código de bytes (en caché en 'pyc') y clojure compilará en realidad a código Byte de Java. Los problemas "compilar" (ir desde el código fuente a un intermedio, el tiempo es "código máquina" - que es interpretado por una CPU - o algún código de bytes como JBC, que es interpretado por una JVM) y " tipado dinámico "son algo ortogonales. –

0

por la definición de lenguajes de tipado dinámico ...

Se dice que un lenguaje de programación para ser mecanografiadas de forma dinámica cuando la mayoría de su comprobación de tipos se realiza en tiempo de ejecución en lugar de en tiempo de compilación. En el tipado dinámico, los valores tienen tipos pero las variables no; es decir, una variable puede referirse a un valor de cualquier tipo.

Dicho esto, se hace difícil saber lo que para compilar el programa hasta ya que podría cambiar en tiempo de ejecución. Otro extracto de Wikipedia aquí ...

tipado dinámico permite construcciones que algunas comprobaciones de tipo estático rechazaría como ilegales. Por ejemplo, las funciones eval , que ejecutan datos arbitrarios como código, se hacen posibles. Además, tipado dinámico mejor acomoda código de transición y prototipos, tales como permitir una estructura de datos marcador de posición (mock objeto) para ser utilizado de forma transparente en lugar de una estructura de datos de pleno derecho (por lo general a los efectos de experimentación y prueba).

Siento que esta respuesta aún está incompleta, pero espero que lo guíe en la dirección correcta. Quizás otros aquí pueden ampliar esto.

+2

Algunos lenguajes de tipo dinámico se compilan en código nativo, aunque parece que piensas que es imposible. –

+0

No voy a decir que estás equivocado, pero no puedo pensar en un ejemplo de un lenguaje de tipeo totalmente dinámico que se compila. –

+1

Muchas implementaciones de Common Lisp están completamente compiladas. Es posible especificar los tipos de forma estática si lo desea, pero eso es una optimización. –

-8

Verificando los tipos una vez es en realidad lo que hace un "compilador" (~ un verificador de tipos).

No se puede "compilar" (comprueba tipos una vez) cuando los tipos son "dinámicos".

+3

Esta es, um, una definición realmente no estándar de "compilador". La mayoría de nosotros usamos la palabra para referirnos a un programa que traduce un lenguaje de computadora a uno más básico. –

+1

Un verificador de tipos no es un compilador, sino una parte de uno (o un paso de una compilación). –

+4

No, incluso peor: * puede * ser parte de un compilador, pero es totalmente opcional. Incluso si (erróneamente) solo cuenta los compiladores que compilan a los lenguajes de destino "reales" como el código máquina x86 como compiladores, p. Lisp tiene un tipado dinámico y hay muchos compiladores nativos para Scheme y CL. – delnan

2

Como han señalado otros, los idiomas no se compilan ni interpretan. Son solo reglas que necesitan traducción y la mayoría han interpretado y compilado implementaciones. Incluso entonces, es difícil hablar de interpretación versus compilación cuando muchos "intérpretes" son jitting en todas partes y algunos "compiladores" compilan con agrado si un archivo fuente cambia.

Tal vez sea mejor para categorizar las implementaciones como completamente pre-compilados o compilado bajo demanda. Si utilizamos estas categorías, lo único que rompe la precompilación completa es un eval function. Esto probablemente tiene más un efecto en la implementación que los tipos dinámicos. Si tiene una función eval, se le exige que admita la compilación a pedido.

1

El código Common Lisp se compila principalmente. El lenguaje de programación Common Lisp ha sido descrito en un estándar ANSI con soporte para compilación. El estándar ANSI describe funciones que compilan código, describe varios aspectos de optimizaciones, describe aspectos del proceso de compilación y más.

Existen intérpretes para Common Lisp, pero se utilizan con menos frecuencia.

Las implementaciones de Common Lisp a menudo pueden mezclar diferentes modos de ejecución libremente. Casi todos tienen un compilador. Algunos solo tienen un compilador.

La compilación en casi todas las implementaciones tiene un modo incremental, por lo que se puede usar de forma interactiva. Todos pueden compilar archivos. Algunos tienen modos de "compilación de bloques" para compilar grupos de archivos.

3

que se está observando una correlación no causal:

  • tipado dinámico e interpretación correlacionan porque ambos son fáciles de implementar.
  • La tipificación estática y la compilación se correlacionan porque ambas son propicias para un rendimiento predecible y bueno.

Los compiladores generalmente se adaptan a los idiomas de tipo dinámico en un intento de mejorar el rendimiento (porque el rendimiento es a menudo muy pobre). Por ejemplo, aquí está el tiempo durante el cual se interpretaron algunos de los principales lenguajes de tipado dinámico antes de que se escribiera su primer compilador: Lisp (1958-1962), Mathematica (1988-2004), Lua (1993-2004), Python (1991-2002) y Javascript (1995-2009). Por el contrario, idiomas como OCaml (1996) y F # (2001) se publicaron primero como compiladores.

Cuestiones relacionadas