Lenguajes interpretados vs Lenguajes Compilados: Desidia, capricho o tendencia

Programacion Linux

Programacion Linux

Hace ya unos dias en la lista de soporte se venia debatiendo acerca de los diferentes lenguajes de programación y a sugerencia de willianvi ponemos a su disposición hoy íntegramente este post tomado del blog Apuntes Web y Notas de Programación – Dev Blog – Ricardo Obregón, espero lo disfruten.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):

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.

¿Te resultó interesante? Compártelo ...



elMor3no

Publicado por elMor3no

http://gutl.jovenclub.cu » Forma parte de GUTL desde el 6 diciembre, 2011. Usuario de GNU/Linux desde hace varios años. Coordinador Nacional de GUTL.

Este artículo tiene 7 comentarios

  1. Creo que el objetivo de la programación es la solución de problemas; por lo tanto tiene que hacerse cada vez más entendible a los humanos y evitarse las complicaciones que la hagan ilegible. Para uno programar un no tiene por qué adaptarse a la forma de «pensar» del hardware porque eso es antinatural, el lenguaje debe permitirnos programar en la forma de pensar humana. De esta forma permitiría a las personas enfocarse en el problema que quieren resolver y no en detalles técnicos del hardware. Generalmente los lenguajes compialdos, sobre todos los compilador de verdad (como dice usted) no logran el nivel de abstracción requerido para llegar a los humanos, incluso los lenguajes más abstractos (que generalmente son los interpretados) creo que aun están muy lejos de lograr el nivel de abstracción que yo quisiera que tuvieran.

    El asunto de compilado vs interpretado y la lucha por la velocidad sólo es importante en aplicaciones donde esto sea un requerimiento fuerte. Lo cual no es el caso de la gran mayoría de las aplicaciones. Se debería programar en el nivel más abstracto posible siempre que sea posible y sólo al nivel más bajo cuando sea necesario.

    Como dijo un profe mío una vez: «la computadora ideal es una de velocidad y memoria infinitas». Lo cual aun no es posible, así que por el momento tenemos o que encontrar o crear un lenguaje con el nivel más abstracto posible y que se ajuste a las necesidades de velocidad del problema que intentamos resolver. No podemos ser unos obsesivos con lo de la velocidad por gusto.

    Si el problema es de velocidad crítica recomiendo revisar Go, el lenguaje de google… Es «C para el siglo 21», con gestión de memoria, diseñado para hacer programación concurrente sin muchos enredos y con buenas prestaciones, incluso más rápido que C y C++ en algunos casos, en la universidad (UCI) implementamos un algoritmo de grafos en C/C++/Vala y Go y el ganador fue Go por muuuuuucho.

  2. Hermano, lo de todos son lenguajes interpretados, de forma indirecta a causa del sistema operativo es cierto. Pero si a un lenguaje semi-interpretado le sumamos otra capa de interpretación entonces es más lenta la cosa. Además un lenguaje interpretado original tiene instrucciones más largas que un comaq, a ver qé es más facil, interpretar :

    print «2+3»

    que

    add ax,bx

  3. Además hay utilidades que requieren más rendimiento que otros, por ejemplo,
    no podrías hacer un buen driver si no fuera en C o ensamblador, ni siquiera C++ por causa de la sobrecarga de operadores y de funciones además que las clases necesitan más potencia de calculo que un struct.
    Ejemplo claro es el menú principal de debian el cuál usa demasiado python demorando el menú por varios segundos. Sin embargo esa misma cantidad de entradas, las procesa el menú de xfceen menos de 3 seg, prque el binario de este ya está compilado.

    Es mejor usar un lenguaje para lo que se concibió, C/ensamblador todo tipo de programas + drivers.

    C++ GUIS y todo tipo de programas no recomendado drivers.
    Python GUIS y no aplicaciones que requieran muchos cálculos como suites de ofimática y programas de CAD y 3d.

    Java Lo mismo que para python.

    Fortran Calculo fuerte de ciencia, etc

    • El menú principal de Debian?? Me perdí ahí… Puedes explicar?
      Y de acuerdo con usar los lenguajes para lo que se concibieron.

      • Me refiero al ejecutable que muestra la lista del menu donde dice lugares, sistema, etc, usa mucho python para leer y mostrar las entradas. Muchas dependencias de python.

  4. me he quedado de piedra al leer este item, desde que estudiamos en la universidad sabemos que no existen «lenguajes compilados ni interpretados» lo que si son es de bajo o alto nivel de abstracción, poniendo como ejemplo que el lenguaje ensamblador que «funciona» con los recursos del procesador (registros, banderas, etc) es de bajo nivel y los C,Pascal,Java, Basic que permiten en su sintaxis el uso de estructuras mas flexibles son de alto nivel, pero quien determina si el codigo resultante es interpretado o compilado es la herramienta que se utilice no el lenguaje, por ejemplo usted pudo escribir su programa usando Basic pero si usas iBASIC, o el ya extinto GWBasic el resultado sera interpretado pero si usas por ejemplo QuickBasic de hecho el resultado sera codigo compilado y ejecutable, en cuanto a que el codigo siempre es «interpretado» por el sistema operativo…uhmmm…es un modo raro de ver las cosas …pues el SO esta para administrar el hard mediante servicios….sin el es imposible acceder al hard por lo que siempre estará…cuando un ejecutable corre de una manera simple se puede decir que solicita una cantidad determinada de recursos al SO para realizar sus funciones, y a partir de ahi solo depende de su implementacion interna que incluso puede llegar hasta acceder a los recursos del hard (nuevamente mediante los servicios ofrecidos por el SO) de ahi viene lo de la velocidad y eficiencia de recursos…en le caso de usar un interprete al esquema hard-SO-app se le sumaria una nueva capa intermedia y seria hard-SO-interprete-app, lo que significa que la app depende de la implementacion del interprete para acceder a los servicios del SO, que corre en una freccion del espacio asignado al interprete lo que significa mayor consumo de recursos, lentitud y un largo etc, en la actualidad el hard se ha hecho cada ves mas barato por lo que la necesidad de software eficientes en el uso de los recursos ha quedado enmascarada y solo se hace presente en determinados ambitos donde sea critica la velocidad de respuesta por ejemplo, …en cuanto a portabilidad se refiere siempre fue un objetivo de la industria pero debemos recordar que en los primeros tiempos habia mucho hard propietario y mucha lucha entre monopolios, por otra parte las casas de soft estaban interesadas (aun hoy) en monopolizar el interes de los desarrolladores por lo que se saltaban los standares y añadian muchas caracteristicas propietaria a sus implementaciones de los lenguajes de programacion lo que en general, partiendo de que escribir un compilador no es una tarea trivial, el tema de la portabilidad se hacia muy compleja, no es hasta hace pocos años que gracias al establecimiento de estandares adecuado que han surgido herramienta que ofrecen la posibilidad de la compilacion «cruzada» (QtCreator, FreePascal, etc) ademas de la popularidad de implementaciones de interpretes de un mismo lenguaje de programacion para diferentes SO (Java)….

Los comentarios están cerrados.