Lenguaje de programación interpretado
Un lenguaje
interpretado es un lenguaje de programación que está diseñado para ser ejecutado
por medio de un intérprete, en
contraste con los lenguajes
compilados. Teóricamente, cualquier lenguaje puede
ser compilado o ser interpretado, así que esta
designación es aplicada puramente debido a la práctica de implementación común
y no a alguna característica subyacente de un lenguaje en particular. Sin
embargo, hay lenguajes que son diseñados para ser intrínsecamente
interpretativos, por lo tanto un compilador causará una carencia de la eficacia.
Muchos autores rechazan la clasificación de lenguajes de programación entre
interpretados y compilados, considerando que el modo de ejecución (por medio de
intérprete o de compilador) del programa escrito en el lenguaje es
independiente del propio lenguaje. A ciertos lenguajes interpretados también se
les conoce como lenguajes de script.
Muchos lenguajes han sido implementados
usando tanto compiladores como intérpretes, incluyendo Lisp, Pascal, C, BASIC, y Python. Mientras que Java es
traducido a una forma que se destina a ser interpretada, la compilación
justo a tiempo es
frecuentemente usada para generar el código
de máquina. Los lenguajes de Microsoft .NET compilan a una forma intermedia (CIL)
la cual es entonces a menudo compilada en código de máquina nativo; sin embargo
hay una máquina virtual capaz de interpretar el CIL. Muchas
implementaciones Lisp pueden mezclar libremente código interpretado y
compilado. Estas implementaciones también usan un compilador que puede traducir
arbitrariamente código fuente en tiempo
de ejecución (runtime)
a código de máquina.
Antecedentes históricos
del interpretado y compilado
En los comienzos de la computación, el
diseño del lenguaje fue fuertemente influenciado por la decisión de usar como
modo de ejecución, la compilación o la interpretación. Por ejemplo, algunos
lenguajes compilados requieren que los programas deban indicar explícitamente
el tipo de dato de una variable en el momento en que sea declarada o
al ser usada por primera vez. Por otro lado, algunos lenguajes interpretados
toman ventaja de los aspectos dinámicos de la interpretación para hacer tales
declaraciones innecesarias. Por ejemplo, Smalltalk,
el cual fue diseñado para ser interpretado en tiempo de ejecución, permite a
objetos genéricos interactuar dinámicamente entre sí.
Inicialmente, los lenguajes interpretados
eran compilados línea por línea; es decir, cada línea era compilada a medida
que estaba a punto de ser ejecutada, y si un loop o una subrutina hiciera que ciertas líneas se
ejecutaran múltiples veces, ellas debían ser recompiladas repetidamente. Esto
ha llegado a ser mucho menos común. La mayoría de los lenguajes interpretados
usan una representación intermedia, que combina tanto la compilación como la
interpretación. En este caso, un compilador puede producir una cierta forma de
representación intermedia del programa, como el bytecode o el código enhebrado, que entonces es ejecutado por un intérprete de bytecode. Los ejemplos incluyen Python, y Java. Similarmente, Ruby utiliza un árbol de sintaxis abstracta como representación intermedia. La representación
intermedia puede ser compilada de una vez por todas (como en Java), cada vez
que se vaya a ejecutar (como en Perl o Ruby), o cada vez que un cambio en el código
fuente es
detectado antes de la ejecución (como en Python).
Ventajas de los
lenguajes interpretados
Los lenguajes interpretados dan a los programas
cierta flexibilidad adicional sobre los lenguajes compilados. Algunas características que son más fáciles de
implementar en intérpretes que en compiladores incluyen, pero no se limitan, a:
§ Independencia de plataforma (por ejemplo el byte code de Java)
§ reflexión y uso reflexivo del evaluador (ej. una función eval de primer orden)
§ Generación funcional de primer órden, y órden n
sin necesidad de especificar metadata.
§ Posibilidad de generación de código in-situ, sin
necesidad de recurrir a una compilación (ie. Spring)
§ tipos Dinámicos
§ Facilidad en la depuración (es más fácil obtener información del código
fuente en lenguajes interpretados)
§ Pequeño tamaño del programa (puesto que los
lenguajes interpretados tienen flexibilidad para elegir el código de instrucción)
§ ámbito dinámico
§ gestión
de memoria automática
Desventajas de los
lenguajes interpretados
La ejecución del programa por medio de un
intérprete es usualmente mucho menos eficiente que la ejecución de un programa
compilado. No es eficiente en
tiempo porque, o cada instrucción
debe pasar por una interpretación en tiempo de ejecución, o como en más
recientes implementaciones, el código tiene que ser compilado a una
representación intermedia antes de cada ejecución. La máquina virtual es una
solución parcial al problema de la eficiencia del tiempo pues la definición del
lenguaje intermedio es mucha más cercana al lenguaje
de máquina y por lo tanto más
fácil de ser traducida en tiempo de ejecución. Otra desventaja es la necesidad
de un intérprete en la máquina local para poder hacer la ejecución posible.
Lenguajes interpretados de uso común
Los lenguajes que suelen ser interpretados más famosos en la actualidad son (en orden alfabético):
- ActionScript
- ASP (hasta la versión 3)
- Bash
- Basic4GL (Basic para OpenGL. Permite generar ejecutables Windows completos)
- BeanShell (Java en lenguaje de Scripts)
- COBOL (Compilador COBOL85)
- Gambas (visual basic mejorado para gnu/linux)
- Inform
- IO (es un lenguaje reciente -2002-)
- JavaScript (todas las plataformas)
- Logo (Linux, Windows y Mac)
- Lenguaje de programación R
- Lisp
- Lua
- Lush (Lisp para gráficos Linux)
- NWNScript (empleado en el videojuego Neverwinter Nights y Neverwinter Nights 2)
- Perl (todas las plataformas)
- PHP
- Pike (es el más rápido de todos, al estar escrito en gran parte en código nativo)
- Prolog
- Python (todas las plataformas)
- REXX y variantes como Object REXX (todas las plataformas, en especial: OS/2 / AmigaOS)
- Ruby
- Tcl
- VBScript (Microsoft Windows)
No hay comentarios:
Publicar un comentario