Esquema simplificado de una máquina virtual

Lenguajes Compilados vs Lenguajes Interpretados

Lenguajes Compilados vs. Lenguajes Interpretados

Aunque en principio es más comercial que útil este título, si resulta conveniente puntualizar las diferencias entre los lenguajes Compilados y los Interpretados. No como una comparación para saber “cuál es mejor” sin para conocer las características, particularidad y limitaciones para conocer qué esperar del lenguaje elegido.

De las características generales descritas de cada grupo de lenguajes podemos elaborar una tabla de características.

Permiten un tipado dinámico de datos

Lenguajes Compilados
Lenguajes Interpretados
Requieres terminar el programa para poderlo ejecutar La ejecución se puede realizar instrucción por instrucción
La compilación se realiza solo una vez, siendo necesario compilar en cada cambio del código fuente. La interpretación se realiza cada que se utiliza el script
Se utilizan cuando la eficiencia es la principal preocupación Se utilizan cuando la portabilidad es prioridad
Se utilizan principalmente para desarrollos de escritorio Orientados en gran medida al desarrollo Web
Requieren normalmente más recursos del sistema y en muchos casos tienen acceso a archivos de sistema Muchas veces se ejecutan del lado del servidor, existen muchas restricciones al acceder a los recursos del sistema.
El tipado de datos es más restrictivo, en muchos casos rígido.
Se requiere un compilador por cada plataforma Independencia de la plataforma
El código ejecutable obtenido es más eficiente y rápido Tienden a ser más lentos que su contraparte compilada.
Los archivos ejectutables tienden a ser más pesados Ejecutables más livianos.
Lenguajes Compilados vs. Lenguajes Interpretados
Lenguajes Compilados vs. Lenguajes Interpretados

Cabe señalar que actualmente cualquier programa Interpretado puede ser compilado o generar ByteCode que se ejecuta en una máquina virtual como ocurre con Java y con C#, por mencionar solo 2 casos.

Portabilidad

En teoría el código fuente generado en un lenguaje de programación específico debería poderse trasladar de una plataforma a otra sin ningún cambio. Por ejemplo un programa se debería poder ejecutar en Windows, Unix, Mac o cualquier otro plataforma de forma directa, sin cambios.

Esto da lugar al concepto de portabilidad, el código fuente de un programa se considera portable cuando se puede ejecutar en cualquier plataforma o sistema sin ningún cambio. Si se requieren hacer cambios o adecuaciones en el código fuente para que se pueda ejecutar, entonces hablamos de programas menos portables.

Por regla general los lenguajes interpretados son portables, mientras los lenguajes compilados son dependientes en gran medida de la arquitectura del sistema sobre el que se ejecutan, normalmente se requerirá un compilador para Windows, otro para Unix, otro para macOS y así sucesivamente. Más aún, cada fabricante puede introducir sutiles pero significativas diferencias en cada compilador, lo que cual puede derivar en ciertas incompatibilidades y/o diferencias entre distintas plataformas para un mismo código fuente, siendo necesario hacer algunas adecuaciones o compilaciones condicionales.

Compilación de lenguajes interpretados.

En tiempos más recientes la tendencia ha sido generar código compilado a partir de programas interpretados. obteniéndose el beneficio de los 2 mundos, por un lado obtenemos la interactividad en el desarrollo, así como la independencia de la plataforma de los lenguajes interpretados, junto con la posibilidad de compilar este código una vez finalizado el desarrollo, logrando una eficiencia cercana a la obtenida con los lenguajes compilados.

De este modo podemos desarrollar nuestras aplicaciones sin preocuparnos demasiado del hardware sobre el que se ejecutará.

Una vez que se cuenta con la aplicación, a partir de nuestro código fuente se generará un ByteCode (el equivalente al Código Objeto de los lenguajes compilados) el cual es independiente de la plataforma, el cual contiene las instrucciones que se deberán ejecutar. Sin embargo el ByteCode no puede ser ejecutado directamente, requiere una base sobre la cual “montarse” para poderse desplegar. Esta base es una Máquina Virtual.

Maquinas Virtuales

Una Máquina Virtual es una abstracción que crea una interface entre un hardware específico y un software de aplicación de código intermedio o ByteCode.

Es decir es un software especial que sirve para ejecutar aplicaciones de ByteCode en un determinado equipo físico. La principal ventaja que obtenemos con esto es que se pueden desplegar aplicaciones y sistemas completos independientes del hardware sobre el cuál se ejecutarán, solo basta con contar con la máquina virtual para el sistema que querramos utilizar. Si después queremos ejecutar esa aplicación en un equipo completamente distinto solo deberemos obtener la máquina virtual para ese sistema particular.

ByteCode vs. Código Nativo
ByteCode vs. Código Nativo

La Máquina Virtual de Java

Tal vez el ejemplo más ilustrativo de una máquina virtual es la Máquina Virtual de Java (JVM) por su difusión, popularidad y base de programadores existente.

De este modo los programadores de Java solo tienen que escribir su aplicación una vez y (en teoría) ese programa podrá ejecutarse en computadoras de escritorio, celulares (sin importar si usan Android, iOS o cualquier otro), autos… cafeteras… mientras tengan una Máquina Virtual de Java y los recursos del sistema sean suficientes, esto sería posible.

En el caso de la JVM, Oracle es el encargado de desarrollar y actualizar las máquinas virtuales para cada plataforma.

.Net Framework

Una alternativa a la JVM es la plataforma .Net de Microsoft, en la cual el programador desarrolla sus aplicaciones, y estas generarán un código intermedio que en .Net se denomina MSIL (Microsoft Intermediate Languaje) que se ejecutará en cualquier plataforma utilizando la Common Language Runtime (CLR) que es el equivalente a la Java Virtual Machine.

Las diferencias entre la JVM y .Net van más allá de ser 2 opciones con máquinas virtuales de diferente desarrollador, tal vez la más visible sea que en .Net la variedad de lenguajes que se puede utilizar es muy amplia (Visual Basic .Net, C++, C#, Managed C++, Oberon, Component Pascal, Eiffel, Smalltalk, Cobol, Fortran, Scheme, Mercury, Mondrian/Haskell, Perl, Python, SML.NET, y en teoria cualquier lenguaje que desarrolle la interface para .Net), sin embargo las diferencias son más que esto.

En este momento se cuenta con CLR’s para Windows y Linux, aunque como es de arquitectura abierta, se pueden crear para cualquier plataforma.

.NET vs. J2EE [Java 2 Enterprise Edition]
.NET vs. J2EE [Java 2 Enterprise Edition]

Máquinas Virtuales: Desventajas

  • Agregan gran complejidad al sistema en tiempo de ejecución, lo que implica trabajo extra.
  • Son más lentos que los lenguajes completamente compilados, debido a la sobrecarga que genera tener una capa de software intermedia entre la aplicación y el hardware de la computadora.

 

Desarrollo Por Roberto C. González
Para Ethical Hack


¿Deseas participar en nuestro grupo de estudio para aplicar la certificación CEH? 

Aplicación de medidas para la implantación de la L.O.P.D. en las empresas

Obtendrás información ampliada a la que has leído en este artículo, y material adicional, visita https://ehack.mx/portfolio-view/material-de-estudio-ceh-online/ para más información o ecríbenos a ceh@ehack.mx

Ethical hack
Ethical hack

Fuente Imágenes:
“JVM: by Baptiste Mathus en Wikipedia
“Esquema simplificado de una máquina virtual”: Imagen cortesía by Nala Systems
“ByteCode vs. Código Nativo”: Imagen cortesía by left404

Referencias

 

Licencia de Creative CommonsLenguajes Compilados vs Lenguajes Interpretados by Roberto C. González para Ethical Hack is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
Comentarios de Facebook

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *