lunes, febrero 27, 2006

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 como Java, Perl, PHP, Ruby, 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):
CEl 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.
PascalBásicamente, en todos sus sabores y colores, es compilado a código nativo máquina
Delphi, Kylix, LazarusSon 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.
BASICEl 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, VBScriptAunque más interprestados que este par, creo que no existen, los menciono como para información general.
Perl, PHPEstos 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, ShellLenguajes 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.
JavaEste 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 .NETEl 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.

13 comentarios:

Anónimo dijo...

Soy un estudiante de telecomunicaciones y me ha parecido un articulo bastante interesante y util para gente que no acaba de entender esa diferencia entre compilado e interpretado. Muy buen resumen del tema.

Anónimo dijo...

en realidad no me gusto del todo, en google libros puedes encontrar buenos libros de los cuales te puedes basar no es que todos sean interpretes mejor dicho todos contienen un traductor ya sea compilador o interprete aplicando esto a tu manera de decirlo todos son traductores.
a por cierto java utiliza interpretes y compiladores.

Anónimo dijo...

Parece que controlas de tema; pero creo que deberías investigarlo un poco más a fondo. El proceso de compilación pasa por tres fases, analisis lexico, que recupera los tokens del lenguaje de programción usado, analisis sintactico donde se forma un arbol AST, y se valida la estructura del codigo fuente escrito de acuerdo a la gramatica definida para dicho lenguaje de progrmación. Luego al final viene el analisis sematico. Donde se comprueban cosas como por ejemplo la coherencia entre los tipos de datos. Ahora bien; Una vez hecho esto, En caso de los compiladores se pasa a hacer la generación de codigo maquina. En caso de interpretes se pasa a generar un codigo legible y entendible por un emulador "El interprete" para que sea interpretado por esta tercera parte, que es la que se encarga de generar el codigo máquina. NO SE TRATA DE CUAL ES MEJOR, SI LE INTERESA LA PORTABILIDAD UN LENGUAJE INTERPRETADO GANA, SI A CAMBIO LE NECESITAS QUE LO TIEMPOS DE EJCUCIÓN DEL CODIGO SEAN MINIMOS PUES UNO COMPILADO dDEBE SER SU ELECCIÓN. Salud,
Marouane

Anónimo dijo...

Tio has parloteado un monton, confundiendo mas si cabe, para terminar diciendo lo que todos ya sabemos.
Pero lo que cuenta es la intencion... felicidades por el articulo.

Anónimo dijo...

la verdad que esta muy interesante...

Anónimo dijo...

Flaco, varios años pasaron desde que escribiste esta nota, ojala te hayas dado cuenta de la cantidad de pavadas que escribiste, sino, ponete a estudiar, capaz q estas a tiempo de aprender. No te enojes, tengo razon, tu fundamento es wikipedia?.

Anónimo dijo...

Bastante interezante, gracias por sus buena explicacion.

Anónimo dijo...

bien como el orto el post. Mejoralo gracias

Todo Poderoso dijo...

Interesante articulo, pero pienso que la principal diferencia entre un lenguaje compilado y uno interpretado es que el compilador genera el código intermedio y después lo ejecuta y en cambio el interprete lo va ejecutando conforme lo va leyendo.

Anónimo dijo...

Por fin, La Portabilidad es Ventaja o Desventaja?, no concuerdo contigo, saludos.

Anónimo dijo...

que me dices de matlab, maple y scilab ?

Anónimo dijo...

INTERESANTE.....

José Gallardo dijo...

Genialoso :B