TECNOLOGÍA - MICROTUTORIALES: LENGUAJES, COMPILADORES E INTÉRPRETES |
ABSTRACT | |
En este microtutorial se intenta, en primer lugar, clarificar por qué se necesitan lenguajes de programación. Una vez establecida esta base, se dan unas nociones básicas de los elementos que componen un lenguaje de programación. Finalmente se explica la necesidad de traducción del código fuente a lenguaje máquina y se dan unas pinceladas sobre el papel de compiladores e intérpretes en este sentido. |
TUTORIAL |
Lenguajes, compiladores e intérpretes
El porqué de los lenguajes de programación Los ordenadores son equipos electrónicos digitales que procesan información codificada en formato binario (habitualmente explicado mediante la metáfora de los unos y los ceros). Los propios programas, las instrucciones de procesamiento que debe ejecutar el ordenador, se codifican en ese formato binario. Para programar un ordenador debemos, pues, generar la secuencia binaria (la colección de unos y ceros) que corresponde a todas las instrucciones y datos del programa que queremos generar. Eso vendría a ser el denominado lenguaje máquina. Sin embargo, hacer esto directamente, aunque posible para pequeños programas, resulta absolutamente inviable si se quieren generar programas complejos, con millones de instrucciones. Las razones para ello son:
Tipos y estructuras de datos Un lenguaje de programación no deja de ser un conjunto acotado de ‘palabras’ y signos y unas reglas de combinación de esas palabras y signos. Si se miran los lenguajes de alto nivel más habituales, se observa que estos lenguajes son un ‘peudoinglés’ reducido y con abundante aparato formal. Así, palabras que aparecen en lenguajes de programación son, por ejemplo ‘if…then…else’ para establecimiento de condiciones, ‘integer’, ‘real’, etc para denominar a variables de tipo numérico, ‘print’ para imprimir o volcar a pantalla, etc, También se utilizan signos como los paréntesis o las operaciones matemáticas como ‘+’, ‘-‘, ‘*’, ‘/’ u operadores booleanos como ‘and’ y ‘or’. De una forma muy genérica, podemos decir que un lenguaje de programación ofrece los siguientes elementos fundamentales:
Las estructuras de datos permiten definir variables o elementos de datos donde se almacenan valores de tipo numérico, textual, etc. Prácticamente todos los lenguajes ofrecen soporte para variables de tipo numérico de todos los tipos (enteros, números reales, etc), variables de tipo textual (cadenas de caracteres), así como soporte a estructuras complejas que combinan algunas de las anteriores: vectores, matrices, estructuras, etc Instrucciones Los lenguajes ofrecen instrucciones ya predefinidas que van desde operadores básicos (algebráicos, boléanos, etc) con los tipos de datos propios del lenguaje, hasta instrucciones de procesamiento como puede ser, por ejemplo, la instrucción para volcar a pantalla un texto Control de flujo Los lenguajes ofrecen, asimismo, instrucciones de control de flujo, que permiten alterar el camino de ejecución del programa en función de, pro ejemplo, el valor de ciertas variables. Instrucciones de control de flujo típicos son las estructuras condicionales como el típico ‘if…then…else’ (si sucede algo ejecutar el siguiente conjunto de instrucciones y si sucede lo contrario ejecutar otro conjunto de instrucciones), bucles (instrucciones del tipo ‘for’ o ‘while’), o estructuras selectivas que son una generalización de la condicional pero para muchos cursos de acción posibles. Funciones y objetos Muy ligado a los conceptos de programación estructurada, surgieron con fuerza los procedimientos o funciones que son mecanismos para que el programador defina sus propias instrucciones de nivel superior a partir de instrucciones y variables de nivel más bajo. Los lenguajes ofrecen soporte para esta definición de nuevas funciones y para su invocación. Posteriormente, con el concepto de programación orientada a objetos, surgieron los denominados objetos que son unas entidades que combinan tanto el papel de estructura de datos (atributos del objeto) como instrucciones que se aplican sobre el propio objeto (métodos del objeto). Los lenguajes orientados a objeto, ofrecen soporte para la definición de nuevos objetos e invocaciones entre ellos. Compiladores e intérpretes Con todo lo visto anteriormente, nos encontramos dos extremos:
![]() El programador, con ayuda de una herramienta de edición de textos (un editor) genera, en el lenguaje de alto nivel elegido, el programa (que incluye todas las definiciones de variables y estructuras de datos, así como el procesamiento a realizar). Esto constituye el denominado código fuente. A continuación otro programa, realiza la traducción de este código fuente al lenguaje máquina propio del microprocesador. Los programas que realizan esta labor son los compiladores e intérpretes. Luego, el programa, ya en lenguaje máquina, debe ponerse al alcance del microprocesador. Esto, en el caso de programas compilados, se realiza mediante los denominados programas cargadores que forman parte ya del sistema operativo. ¿ En qué se diferencia un compilador de un intérprete ? La diferencia fundamental es la siguiente:
En los últimos años se está utilizando una solución intermedia entre compiladores e intérpretes. La solución consiste en que se define una máquina teórica o ‘máquina virtual’ con su lenguaje máquina ficticio. El código fuente se compila a ese lenguaje máquina virtual. Pero como el lenguaje máquina virtual no tiene por qué coincidir con el lenguaje máquina del microprocesador real, la traducción del código de máquina virtual al código de máquina real se realiza en modo interpretado. Esta es la solución adoptada por Java en que el código fuente es traducido a los ‘bytecodes’ de la máquina virtual Java. Luego, es necesario interpretar esos bytecodes al lenguaje máquina real. La misma estrategia ha seguido más recientemente Microsoft con su arquitectura .Net en que los programas fuente se compilan al MSIL (Microsoft Intermediate Language) para luego, ese código MSIL, ser interpretado al lenguaje máquina real. Entornos integrados de desarrollo En los entornos de desarrollo tradicionales (por ejemplo, desarrollo en lenguaje C sobre UNIX) el código fuente se generaba mediante un editor de textos de propósito general (como vi o emacs). Luego, y en línea de comandos, se invocaba al compilador con todos sus parámetros y al denominado enlazador, todo ello, quizá, con la ayuda de herramientas como ‘make’. Hoy día, todas estas labores suelen ser facilitadas mediante entornos gráficos integrados de desarrollo (IDE, Integrated Development Environment) donde se unifican, en un único entorno amigable, todas las funciones asociadas al desarrollo de programas, incluyendo, incluso, utilidades de control de configuración (control de versiones). Conclusiones Para hacer viable el desarrollo en gran escala de software, ha sido necesaria la definición de unos lenguajes de programación que definen las estructuras de datos y su procesamiento en una forma mucho más cercana a los seres humanos. Sin embargo, es necesario traducir el código fuente así generado al lenguaje máquina. Esta es la labor de los compiladores e intérpretes. |
LICENCIA |
![]() Esta obra está bajo una licencia de Creative Commons. |