Lenguajes

Lenguaje de programación compilado

Un lenguaje compilado es un lenguaje de programación cuyas implementaciones son normalmente compiladores (traductores que generan código de máquina a partir del código fuente) y no intérpretes (ejecutores paso a paso del código fuente, donde no se lleva a cabo una traducción en la preejecución).

El término es un tanto vago. En principio, cualquier lenguaje puede ser implementado con un compilador o un intérprete. Sin embargo, es cada vez más frecuente una combinación de ambas soluciones: un compilador puede traducir el código fuente en alguna forma intermedia (muchas veces llamado Bytecode), que luego se pasa a un intérprete que lo ejecuta.

 

Ventajas y desventajas

Los programas compilados a código nativo en tiempo de compilación tienden a ser más rápidos que los traducidos en tiempo de ejecución, debido a la sobrecarga del proceso de traducción. Sin embargo, las nuevas tecnologías como la compilación en tiempo de ejecución, y mejoras generales en el proceso de traducción están empezando a reducir esta brecha. En algún punto intermedio, tiende a ser más eficiente la solución mixta usando bytecode.

Los lenguajes de programación de bajo nivel son típicamente compilados, en especial cuando la eficiencia es la principal preocupación, en lugar de soporte de plataformas cruzadas. Para los lenguajes de bajo nivel, hay más correspondencias uno a uno entre el código programado y las operaciones de hardware realizadas por el código máquina, lo que hace que sea más fácil para los programadores controlar más finamente la CPU y uso de memoria.

Con un poco de esfuerzo siempre es posible escribir compiladores incluso para las lenguajes tradicionalmente interpretados. Por ejemplo, Common Lisp puede ser compilado a Java bytecode, que es interpretado por la máquina virtual de Java; a código C, que se compila a código máquina nativo; o es compilado directamente a código nativo. Los lenguajes de programación que soportan múltiples objetivos de compilación ofrecen un mayor control para que el desarrollador elija la velocidad de ejecución o la compatibilidad entre plataformas.

 

Lenguaje de programación interpretado

Un lenguaje interpretado es un lenguaje de programación para el que la mayoría de sus implementaciones ejecuta las instrucciones directamente, sin un previa compilación del programa a instrucciones en lenguaje máquina. El intérprete ejecuta el programa directamente, traduciendo cada sentencia en una secuencia de una o más subrutinas ya compiladas en código máquina.

Los términos lenguaje interpretado y lenguaje compilado1 no son correctos porque, en teoría, cualquier lenguaje de programación puede ser interpretado o compilado. Cada vez es más popular, en las implementaciones más modernas de un lenguaje de programación, ofrecer ambas opciones.

Los lenguajes interpretados también pueden diferenciarse de los lenguajes de máquina. Funcionalmente, tanto la ejecución y la interpretación significan lo mismo -obtener la siguiente instrucción/sentencia del programa y su ejecución-. Aunque el bytecode (código byte) interpretado es además idéntico a su forma en código máquina y tiene una representación enensamblador, el término "interpretado" se reserva en la práctica para lenguajes "procesados por software" (como las máquinas virtuales o emuladores) por encima del procesado nativo (por ejemplo, por hardware).

En principio, los programas de muchos lenguajes se pueden compilar o interpretar, emular o ejecutar nativamente, así que esta designación se aplica solamente a la implementación práctica más usual, en vez de representar una propiedad esencial del lenguaje. De forma parecida al microcódigo del procesador, muchos intérpretes, internamente recaen en unacompilación en tiempo de ejecución.

Evitando la compilación, los programas interpretados son más fáciles de evolucionar durante el desarrollo y la ejecución (transformándose en ocasiones de uno en la otra). De otra parte, ya que la compilación implica una traducción a un formato más amigable con la máquina, los programas interpretados corren más lentamente y menos eficientemente (es decir, gastan considerablemente más energía). Esto es especialmente verdad para los lenguajes de guion, cuyas sentencias son más complejas de analizar comparadas con las instrucciones máquina.

Muchos lenguajes se han implementado usando tanto compiladores como intérpretes, incluyendo BASICCLispPascal y PythonJava y C# se compilan a código byte, el lenguaje interpretado específico para la máquina virtual. Muchas implementaciones de Lisp pueden mezclar libremente código interpretado y compilado.

 

Ventajas de interpretar un lenguaje

Interpretar un lenguaje da a las implementaciones una flexibilidad adicional sobre las implementaciones compiladas. Algunas características son más fáciles de implementar en intérpretes que en compiladores son (pero no se limitan a estas):

  • Independencia de la plataforma (por ejemplo el bytecode de Java)
  • Reflexión y uso reflexivo del evaluador (por ejemplo, una función eval de primer orden)
  • Tipos dinámicos
  • Un tamaño del programa más pequeño (puesto que las implementaciones tienen la flexibilidad de elegir el conjunto de instrucciones)
  • Ámbito dinámico
  • Facilidad en la depuración (es más fácil obtener información del código fuente en lenguajes interpretados)

Desventajas de los lenguajes interpretados

La principal desventaja de la interpretación es una velocidad de ejecución del programa mucho más lenta, comparada con la ejecución directa del código máquina en la CPU del ordenador. Una técnica utilizada para mejorar las prestaciones es la compilación en tiempo de ejecución, que convierte las secuencias ejecutadas más frecuentes en código máquina del ordenador.

 

 

Lenguajes interpretados vs Lenguajes Compilados: Desidia, capricho o tendencia.

 

La eterna batalla a punto de culminar

Varios de los lectores de este blog me han cuestionado mi posición sobre lenguajes comoJavaPerlPHPRuby, ASP, y la última suite de Microsoft: Visual Studio.Net. Pues bien, ha llegado el momento de explicar mi posición, la cual puede ofender a muchos, dejar perplejo a otros y confundir al resto, bueno, algunos pocas personas estarán de acuerdo conmigo.
En fin, la pregunta clave es: ¿qué es mejor, el lenguaje interpretado o el lenguaje compilado? Voy a resumirlo en una sola frase. Todos los lenguajes son interpretados.
Ya sé que alguno (si no la mayoría) dirá que eso no es posible, y por lo tanto, haré la sustentación a tal afirmación.
Para empezar, debemos definir cada una de las frases desde el punto de vista programación de PC's.

Lenguaje Compilado
Un lenguaje compilado es término un tanto impreciso para referirse a un lenguaje de programación que típicamente se implementa mediante un compilador. Esto implica que una vez escrito el programa, éste se traduce a partir de su código fuente por medio de un compilador en un archivo ejecutable para una determinada plataforma (por ejemplo Solaris para Sparc, Windows NT para Intel, etc.). (Lenguaje Compilado - Wikipedia)

Lenguaje Interpretado
... Un lenguaje interpretado es aquel en el que las instrucciones se traducen o interpretan una a una en tiempo de ejecución a un lenguaje intermedio o lenguaje máquina o a través de una máquina virtual, siendo típicamente unas 10 veces más lentos que los programas compilados.(Adaptación de la definición en Wikipedia)

Luego de las deficiones, digámoslo en términos cristianos, o mejor en términos informáticos, porque no todos los cristianos entienden esta terminología. Un lenguaje compilado es aquel que, en teoría, es traducido a código máquina y las instrucciones generadas, son interpretadas directamente por la máquina. Y un lenguaje interpretado, es aquel que es traducido a un lenguaje intermedio(entiéndase no-máquina), en la cual cada instrucción es interpretada y traducida a lenguaje máquina en tiempo de ejecución. En la práctica, solo los sistemas operativos y contados programas que se ejecutan especialmente por consola, se encuentran en código máquina. Y antes que alguien interprete mal, explico lo anterior.
Si hablamos de la plataforma más usada en el hogar, entiéndase Micro$oft Windows, o pues hasta el momento de la redacción de esta nota, TODOS, sin excepción, son lenguajes interpretados o semi-interpretados. Aquellos conocedores del lenguaje ensamblador me hallarán la razón sin mayor problema. En los sistemas operativos modernos, cuando se "compila" un programa, éste se traduce a un pseudoensamblador o a un estilo de pseudo-máquina, que a su vez es interpretada por la "máquina virtual" propia o nativa del sistema operativo, para poder procesar, dibujar y ejecutar todas las instrucciones adecuadamente. Los programadores avanzados, sabrán que cuando se compilan los programas, lo que se puede encontrar es una serie de llamados a librerías externas las cuales realizan las tareas solicitadas. En el caso de sistemas operativos tipo UNIX y demás, la cosa no cambia mucho, así que no entro en detalles.
Pero ahora sí entremos en materia. Ya está claro que todos los programas son interpretados en mayor o menor grado, la cuestión es ahora, qué compiladores generan código "más compilado" (valga la aparente redundancia) que los otros. Aquí voy a mezclar un poco concepto personal con concepto técnicos. Para empezar voy a ser directo y mencionaré algunos lenguajes que son los generan, en teoría, programas "más compilados", sin mencionar las plataformas a las cuales pertenecen (hago omisión de algunos lenguajes compilados, no usados en la actualidad: Fortran, Ada, Algol, COBOL y demás de su tiempo, exceptuando BASIC y derivados):
C El lenguaje compilado maestro por excelencia, excepto en Visual Studio.Net. Solo menciono que es el lenguaje en el cual se diseñaron la gran mayoría, por no decir todos, los sistemas operativos modernos.
C++ Alguno se peguntará, el porqué separo C de C++. Pues bien, sucede que C++ no es TAN compilado como C, especialmente porque casi siempre está usado en sistemas operativos gráficos, solo en sus versiones de consola es compilado en código máquina real, pero básicamente y en esencia se compila a código máquina.
Pascal Básicamente, en todos sus sabores y colores, es compilado a código nativo máquina
Delphi, Kylix, Lazarus Son altamente compilados, aunque no totalmente, pues están orientados a sistemas operativos gráficos, así que en menor grado son interpretados, pero son considerados lenguajes compilados, pues el código generado es nativo de la plataforma objetivo.

He mencionado los más conocidos y más usados, ahora sí vienen los lenguajes interpretados, los cuales causan tanta polémica.
BASIC El lenguaje interpretado por excelencia y hasta donde tengo conocimiento, el más antiguo, aunque no fue interpretado en sus principios, luego se convirtió en el hito de los lenguajes interpretados. Todos sus derivados son en mayor o menor grado interpretados, aunque alguna vez, Borland lanzó un BASIC que se compilaba, en teoría (nunca lo comprobé), a código máquina.
JavaScript, VBScript Aunque más interprestados que este par, creo que no existen, los menciono como para información general.
Perl, PHP Estos lenguajes diseñados para web, son lenguajes interpretados por excelencia, aunque se compilan a código intermedio en tiempo de ejecución, cosa que acelera su ejecución. Existen también herramientas que generan un código cercano a la máquina para estos dos lenguajes y cachean contenido, pero a la larga, siguen siendo interpretados.
Batch, Shell Lenguajes interpretados para los OS's, los cuales se ejecutan bastante lento, pero ya que por lo general son tan cortos o realizan tareas tan básicas no es perceptible el rendimiento.
Java Este lenguaje ha sido bastante diversificado en la actualidad, incluso, varias de las grandes aplicaciones comerciales modernas están diseñadas en este lenguaje, por ejemplo, Zend Studio y Oracle JDeveloper, solo por mencionar dos grandes.
Visual Studio .NET El Boom de los lenguajes por imposición Micro$oft. NINGÚN programa generado con los lenguajes de esta suite o como se le quiera denominar a este paquete, genera código máquina y de hecho está bastante lejos de ser código máquina, o incluso, referencias a librerías como lo harían otros lenguajes como Delphi, C++, o similares. No estoy en contra de esta nueva metodología para la interpretación de software, pero sí hay una gran desventaja, es la MUY lenta ejecución de los programas generados y en cortas palabras explico el porqué (podría hacer todo un compendio): El lenguaje generado es un código intermedio el cual a su vez se compila en tiempo de ejecución, el cual es interpretado por el Framework de .Net, el cual ejecuta las instrucciones haciendo los llamados respectivos a las librerías del sistema operativo. En mi concepto personal, es demasiada vuelta para ejecutar una simple instrucción con llamado a una API del Sistema Operativo. Aunque la teoría dice que el programa luego de compilarse en tiempo de ejecución, permanece así, por lo tanto es un aumento en la velocidad de ejecución, mejora que he tenido la oportunidad de experimentar, porque código interpretado que ejecute código einterpretado, me temo no es muy veloz que digamos.

Pero, ¿por qué tanta renuencia a estas nuevas tecnologías?, y ¿qué pros y contras presentan?. Es bastante sencillo. No estoy en contra de estas tercnologías, de hecho, son excelentes y tarde o temprano, aunque más temprano que tarde, serán los estándares de compilación y serán considerados como lenguajes compilados.

Ventajas de los lenguajes interpretados

  • Portabilidad: Esta es la principal ventaja que presenta este tipo de lenguajes, porque puede ser compilado en y para cualquier plataforma o sistema operativo.
  • Compatibilidad: al ser interpretado por el sistema operativo, es la máquina virtual o framework el que se encarga de que las intrucciones sean ejecutadas por el software y el hardware.
  •  

Desventajas de los lenguajes interpretados

  • Velocidad: Es el aspecto más notable y el cual se debe evaluar a fondo al crear software con este tipo lenguajes, pues se debe equilibrar la portabilidad con la velocidad que se está sacrificando. A menos que las prestaciones de los equipos informáticos sean bastante altas, en el caso cual, se podría despreciar este aspecto.
  • Portabilidad: es una desventaja también. El problema radica en que en la actualidad, asi todos los lenguajes compilados, existen para todas las plataformas, no así las máquinas virtuales o frameworks, aunque en el caso de Java, se ha hecho un excelente trabajo en cuanto a eso y no me puedo quejar, existe para casi todas las plataformas, por no decir todas, actuales. El .NET framework, lamento decir que en la actualidad, se encuentra ciento por ciento probado solo en Windows, aunque existen proyectos que prometen tal portabilidad, aunque todavía no son un hecho.

En conclusión, ¿cómo actuar?. No es muy difícil. Se evalúan los requerimientos, se definen necesidades, si éstas no superan el hardware a usar, perfectamente se puede proseguir, de lo contrario, es mejor pensar en un lenguaje compilado, pues os lenguajes interpretados exigen gran cantidad de recursos especialmente RAM y procesador. Deberían aprovecharse los lenguajes interpretados hasta donde sea posiblem pues en pocos años o incluso meses, entrarán en vigor y serán (¿o son?) el nuevo estándar de desarrollo.