martes, 5 de noviembre de 2013

¿Lenguajes de Programación Interpretados o Compilados?


¿Lenguajes de Programación Interpretados o Compilados?
En esencia un lenguaje de programación interpretado requiere de "otro programa" llamado interprete, que se encarga de leer el código del programa y decirle a la máquina que instrucciones debe ejecutar, todo esto proceso en tiempo de ejecución.

Anteriormente este proceso se realizaba línea por línea, como el caso de las primeras versiones de Basic,  dada la ineficiencia de este procedimiento, se crearon las máquinas virtuales, las cuales "compilan" el código fuente completo y generan un código intermedio, optimizando en gran medida varios problemas que el modelo anterior presentaba.
Por otro lado un lenguaje compilado, pasa por un programa compilador, que evalúa todo el código fuente y genera un ejecutable binario, el cual está en el idioma nativo de la máquina, es decir está codificado directamente para que el procesador o en su defecto las librerías del sistema operativos directamente ejecuten las instrucciones.
El proceso de compilación se realiza en tiempo de diseño,  después de compilado un programa genera un código objeto, el cual no requiere de ningún otro programa para su ejecución.
Según Wikipedia y otras fuentes de internet estas son algunas de las ventajas y desventajas de los lenguajes interpretados. 

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.

·         Independencia de plataforma.

·         reflexión y uso reflexivo del evaluador (ej. una función eval de primer orden)

·         Generación funcional de primer orden, y órden 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)

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.

·         Portabilidad: es una desventaja también. Exceptuando el caso de Java, se ha hecho un excelente trabajo en cuanto a la portabilidad ya que  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.

·         Máquina virtual:  Requiere el uso de máquina virtual.

·         Problemas de versiones en librerías y conflictos en las instalaciones

·         No usa el 100% de los recursos: Por ser independiente a la máquina, no aprovecha el 100% de las posibilidades que ofrece la arquitectura de hardware como la GPU y la CPU.


 Hoy en día estos conceptos han cambiado, ya que Delphi y C++ de embarcadero han implementado en su lenguaje características presentes en los lenguajes interpretados, sin perder ninguna de las ventajas del ser compilado. 
Para desmentir estos que ya se han convertido en mito,  revisemos algunas de las desventajas que Wikipedia y algunas páginas web alegan como 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. 

R./ Delphi es un lenguaje que se puede compilar en forma nativa (binaria en código de máquina) para las plataformas que soporta actualmente como Windows 32 y 64 bits, MAC OSX, IOS (IPhone,  IPad) y Android, en poco tiempo estará disponible para Windows Phone, BlackBerry y Linux versión server.  

Con una ventaja adicional, todo se realiza desde el mismo IDE de desarrollo de Delphi, así se puede mantener un código único y compilarlo en cualquiera de las plataformas requeridas. 

·         Compatibilidad: al ser interpretado es la máquina virtual o framework el que se encarga de que las intrucciones sean ejecutadas por el software y el hardware. 

R./ Porque dejar el trabajo a otro programa? el pretender mantener la compatibilidad no permite el uso del 100% de los recursos del sistema, en especial de la CPU, GPU y la memoria. 

Delphi por su parte genera código nativo especifico para cada plataforma, sin la necesidad de máquina virtual, lo que hace el código más compacto, eficiente y mucho más rápido en tiempo de ejecución. 

Una ventaja adicional es la seguridad que representa no exponer el código fuente, que eventualmente puede ser modificado por algún usuario experto. (hacker). 

·         Independencia de plataforma. en teoría los lenguajes interpretados son independientes de la plataforma, sin embargo dependen de la disponibilidad de la máquina virtual en cada una de las plataformas. 

R./ La independencia de la plataforma está sujeta a la instalación de la máquina virtual en cada una de las plataformas para las cuales esté disponible, y dichas máquina virtuales pueden llegar a ser de tamaños de varios gigabytes, presentando incompatibilidad de librerías y de versiones.  lo cual redunda en costos de soporte y tiempos de instalación y actualización. 

Delphi genera ejecutables compactos, que no requieren ningún tipo de maquina virtual, el código es autónomo en cada una de las plataformas para las cuales esté disponible. 

·         reflexión y uso reflexivo del evaluador (ej. una función eval de primer orden) 

R./ En Delphi se ha implementado el uso del RTTI (Run-Time Type Information), funcionalidad que permite obtener la información necesaria del código en tiempo de ejecución, y por supuesto implementar la funcionalidad de Reflection disponible en los lenguajes Interpretados. 

·         Generación funcional de primer orden, y órden sin necesidad de especificar metadata.

R./ Aplica la misma respuesta del punto anterior 

·         Posibilidad de generación de código in-situ, sin necesidad de recurrir a una compilación (ie. Spring). 

R./ Efectivamente es muy difícil generar código in-situ en un lenguaje que no ha sido diseñado para eso, sin embargo es extremadamente sencillo embeber lenguajes de script dentro de la aplicación, para aquellas posibles oportunidades donde se pueda requerir. 

De hecho existen librerías como la DWS que implementa pascal interpretado dentro de un ejecutable, igualmente está FastScript de FastReport y por supuesto es fácil embeber PHP, Java y otros lenguajes interpretados, ya que están diseñados para ser embebidos. 

Es posible también desde Delphi ejecutar funciones escritas en los lenguajes interpretados, como desde algunos lenguajes ejecutar funciones escritas en Delphi. 

·         Tipos Dinámicos:  Los lenguajes interpretados tienen la posibilidad de crear tipos dinámicamente en tiempo de ejecución. 

R./ En Delphi están implementados los Generics, el RTTI y los DinArrays, además el manejo de estructuras de datos es bastante fuerte y por si fuera poco, la programación orientada a objetos está muy bien diseñada, cosa que no ocurre en otros lenguajes interpretados.  así que los tipos dinámicos es un tema que está más que solucionado. 

·         Facilidad en la depuración (es más fácil obtener información del código fuente en lenguajes interpretados). 

R./ Delphi tiene uno de los mejores depuradores que hay en el mercado, incluso es posible depurar y hacer deploy en otros entornos, así desde el IDE de Delphi se puede compilar y depurar aplicaciones corriendo remotamente en un MAC, un IPhone o un Android. 

Incluso si no se tiene MAC para compilar y depurar sus aplicaciones en OSX o IOS, es posible contratar servicios en la nube para tales fines, los cuales tiene tarifas por horas. 

·         Pequeño tamaño del programa (puesto que los lenguajes interpretados tienen flexibilidad para elegir el código de instrucción) 

R./ En la práctica esto no es tan cierto, es posible que para instalar una pequeña aplicación sea necesario instalar todo el framework o librerías que pueden llegar a pesar varios Gigabytes. 

Con Delphi puede seleccionar si hacer el Deploy todo en un solo ejecutable o dividirlo en librerías, dos métodos disponibles, aunque en la práctica casi el 90% siempre eligen un solo ejecutable que no depende de ninguna librería para su ejecución.
Como podemos apreciar, no existen objeciones con respecto al lenguaje Delphi,  cumple tanto las ventajas de un lenguaje compilado como las ventajas de un lenguaje interpretado.  Hasta el día de esta publicación, es el único lenguaje dentro de lo que he conocido que tiene estas características.
Creo sin miedo a equivocarme, que los dos lenguajes comerciales más robustos hoy en días son Java como lenguaje interpretado y Delphi como lenguaje compilado. 

Espero sus comentarios.

Mg. Gustavo Enríquez

No hay comentarios:

Publicar un comentario