Por: Roberto C. González
Para: Ethical Hack
Características y diferencias
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. |
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.
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.
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.
Si tienes alguna duda que no se responde en este documento, por favor plantea tu pregunta para poder responderte. O escribe directamente a soporte@ehack.mx
Referencias
- Por Roberto C. González
Fuente Imágenes
- «Esquema simplificado de una máquina virtual»: Imagen cortesía by Nala Systems
- «Lenguajes Compilados vs. Lenguajes Interpretados»: Imagen cortesía by Nala Systems a través de Chat GPT
- «JVM: by Baptiste Mathus en Wikipedia
- «ByteCode vs. Código Nativo»: Imagen cortesía by left404
Lenguajes Compilados vs. Lenguajes Interpretados, por Roberto C. González. Se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.
©2019 - 2025, Ethical Hack, Todos los derechos reservados sobre el contenido propio.