El documento presenta una introducción a los compiladores. Explica que un compilador traduce un programa fuente escrito en un lenguaje de alto nivel a un programa objeto en código máquina. También describe brevemente la historia de los compiladores, los tipos de lenguajes fuente y objetivo, y los diferentes tipos de traductores relacionados con los compiladores como los ensambladores e intérpretes.
2. TRADUCTOR- DEFINICIÓN
Es un programa que lee un programa escrito en
un lenguaje (lenguaje fuente) y lo traduce a un
programa equivalente en otro lenguaje (lenguaje
objeto).
3. COMPILADOR - DEFINICIÓN
Proceso de traducción que convierte un
programa fuente escrito en un lenguaje de alto
nivel a un programa objeto en código máquina y
listo por tanto para ejecutarse en el ordenador,
con poca o ninguna preparación adicional.
4. ¿PORQUÉ NECESITAMOS
COMPILADORES?
Es difícil escribir, depurar, dar mantenimiento y
entender programas escritos en lenguaje
ensamblador.
Con el lenguaje máquina debemos
comunicarnos directamente con la computadora
en términos de bits, registros y operaciones muy
primitivas.
El lenguaje máquina no es más que una
secuencia de 1’s y 0’s.
5. ¿PORQUÉ NECESITAMOS
COMPILADORES?
Es difícil escribir, depurar, dar mantenimiento y
entender programas escritos en lenguaje
ensamblador.
Con el lenguaje máquina debemos
comunicarnos directamente con la computadora
en términos de bits, registros y operaciones muy
primitivas.
El lenguaje máquina no es más que una
secuencia de 1’s y 0’s.
6. HISTORIA
No puede darse una fecha exacta del primer desarrollo.
A finales de la década de 1940, comenzaron a construirse las
primeras computadoras digitales y fue necesario implementar un
lenguaje capas de realizar los cálculos, es aquí donde aparece el
lenguaje de maquina que representaba secuencias de códigos
numéricos:
C7 06 0000 0002 (instrucción que mueve el número dos a la
ubicación 0000)
Desafortunadamente este lenguaje era tedioso de seguir y
complicado de mantener, por lo que esta forma de codificación
fue reemplazada por el lenguaje ensamblador, en el cual las
instrucciones y las localidades de memoria son formas simbólicas.
Un ensamblador traduce de los códigos simbólicos a lenguaje de
maquina. Aún con esta mejora, el lenguaje ensamblador sigue
siendo demasiado difícil de mantener:
MOV X, 2 (instrucción en ensamblador equivalente a la anterior)
7. HISTORIA…
En este punto se presenta la necesidad de lenguajes que permitan
escribir los programas de forma concisa, similar a una notación
matemática, y que se pudieran traducir a código ejecutable para una
máquina dada:
X = 2
En 1950, G. M. Hooper acuña el termino compilador y aparecen los
primeros trabajos sobre compiladores relacionados con la traducción
de formulas aritméticas a código de máquina.
John Backus lideró un grupo de trabajo en IBM para realizar de un
traductor de código máquina a fórmulas matemáticas. Resultando
con gran éxito: la especificación de un lenguaje de alto nivel
(FORTRAN, FORmule TRANslation) Trabajaron 18 personas durante
mas de un año en el proyecto.
Fue un compilador hecho ad-hoc (a puro corazón), pues no existía
una teoría formal, sino que se iban resolviendo las construcciones
una a una, para cada situación particular.
8. HISTORIA…
Noam Chomsky comienza sus estudios sobre la estructura del lenguaje
natural. Sus estudios lo condujeron a la clasificación de los lenguajes de
acuerdo a una jerarquía de sus gramáticas, además sus estudios sobre
los algoritmos de reconocimiento derivaron en una automatización del
proceso de traducción mas eficiente.
1960, se diseña el lenguaje LISP. En un principio, el código LISP se
traducía manualmente a código máquina. Se escribió en LISP un
programa capaz de interpretar programas LISP, que se tradujo
manualmente a código de máquina, construyendo de este modo un
intérprete ejecutable de LISP.
Knuth desarrolla la mayoría de las técnicas de análisis sintáctico.
1970, se presentan los mayores avances en el área de lenguajes de
programación.
Aparecen los primeros programas que automatizan los procesos de
análisis léxico y sintáctico. Surgiendo la llamada Torre de Babel debido a
9. HISTORIA…
Niklaus Wirth, diseña Pascal, pensado para la enseñanza.
Wirth propone el concepto de representación intermedia de código,
separando el proceso de traducción en dos fases: el front-end
encargada de analizar el programa fuente (operaciones dependientes
sólo del lenguaje fuente) y el back-end encargada de generar el
código para la máquina objeto.
1980, comienzan a proliferar las técnicas de mejoramiento de código
(optimización), se consolida y prolifera el concepto de asignación y
liberación de memoria dinámica. La programación orientada a
objetos es extensamente utilizada y madura.
1990, los lenguajes de programación y compiladores son muy
similares a lo que tenemos actualmente, surgen los ambientes de
desarrollo, los lenguajes interpretados comienza a ganar terreno en
aplicaciones de Internet y el código intermedio se vuelve a poner de
moda.
10. LENGUAJES FUENTE Y OBJETO
Los lenguajes fuente pueden ser desde
lenguajes de programación tradicionales (C#,
Java, Phyton, etc) hasta lenguajes
especializados.
Los lenguajes objeto son igualmente variados;
un lenguaje objeto puede ser otro lenguaje de
programación o el lenguaje máquina de
cualquier microprocesador.
11. CÓDIGO FUENTE
Diseñado para su mejor comprensión humana.
Concuerda con nuestras nociones de gramática.
Utiliza construcciones con nombres, como son
variables y procedimientos.
Ejemplo:
Console.Write(“Hola Mundo”);
12. CÓDIGO MÁQUINA
Optimizado para hardware.
Consiste en instrucciones máquina.
Utiliza registros y direcciones de memoria sin
nombre.
Mucho más difícil para la comprensión humana.
Ejemplo:
ida $30, -32 ($30)
14. LENGUAJE DE PROGRAMACIÓN
Un lenguaje de programación es un lenguaje formal
diseñado para realizar procesos que pueden ser
llevados a cabo por máquinas como las
computadoras.
Pueden usarse para crear programas que controlen el
comportamiento físico y lógico de una máquina, para
expresar algoritmos con precisión, o como modo de
comunicación humana.
Está formado por un conjunto de símbolos y reglas
sintácticas y semánticas que definen su estructura y el
significado de sus elementos y expresiones. Al proceso
por el cual se escribe, se prueba, se depura, se compila
(de ser necesario) y se mantiene el código fuente de un
programa informático se le llama programación.
15. ¿PORQUÉ SE NECESITA UN
LENGUAJE DE PROGRAMACIÓN DE
ALTO NIVEL?
Los lenguajes de "Alto Nivel" son los más
utilizados como lenguaje de programación.
Estos lenguajes permiten que los algoritmos se
expresen en un nivel y estilo de escritura
fácilmente legible y comprensible por otros
programadores.
Permite especificar de manera precisa sobre qué
datos debe operar una computadora, cómo
deben ser almacenados o transmitidos y qué
acciones debe tomar bajo una variada gama de
circunstancias. Todo esto, a través de un
lenguaje que intenta estar relativamente
16. COMPILADORES
En los años 50 los compiladores eran
considerados programas muy difíciles.
FORTRAN se desarrolló en grupo durante 18
años.
Se han desarrollado técnicas sistemáticas,
entornos de programación y herramientas
software que facilitan la tarea de desarrollo.
17. COMPILADORES
Gran variedad de lenguajes de alto nivel
Gran variedad de lenguajes objeto, tanto otro
lenguaje de alto nivel como código máquina.
No puede darse una fecha exacta del primer
desarrollo.
Varios grupos independientemente desarrollaron
técnicas de análisis.
Los primeros traducían fórmulas aritméticas a
código máquina
18. TIPOS DE TRADUCTORES
RELACIONADOS CON LOS
COMPILADORES
Ensamblador: Programa que convierte de lenguaje
mnemonico a lenguaje máquina, generando un
archivo con el código objeto equivalente al código
fuente completo, junto con información necesaria
para el montaje.
Interpretes: Ejecutan las instrucciones del programa
según se vallan presentando. Necesitan menos
memoria, pero son más lentos que los compiladores
(LISP, Prolog). Históricamente, se pusieron de moda
en los primeros años porque los recursos de
memoria eran escasos. Permiten añadir código
dinámicamente durante la ejecución.
19. LENGUAJES DE PROGRAMACIÓN
INTERPRETADOS
Están diseñados para ser ejecutados por medio de
interprete a partir de un código pre-compilado.
Por ejemplo Java es compilado para posteriormente ser
ejecutado por un traductor del lenguaje objeto
denominado Java Virtual Machine.
Mientas que los lenguajes de la plataforma .NET
compilan en una forma intermedia (CIL), que
posteriormente puede ser recompilado a código de
maquina nativo o interpretado por una maquina virtual.
Lenguajes como Python y Java emplean representaciones
intermedias de código para ser ejecutadas, mientras que
lenguajes como Ruby emplean un árbol de sintaxis
abstracta como representación intermedia.
20. COMPILADORES VS INTERPRETES
Ventajas del compilador:
Se compila una vez, se ejecuta n-veces.
En bucles, la compilación genera código equivalente al bucle
pero un interprete se traduce tantas veces una línea como
veces se repite el bucle.
El compilador tiene una visión global del programa, por lo
que la información de mensajes de errores es más detallada.
Ventajas del intérprete:
Un interprete necesita menos memoria que un compilador.
Permite una mayor interactividad con el código en tiempo de
desarrollo.
21. COMPILADOR - INTÉRPRETE
Proporcionan algo de flexibilidad extra.
Son independientes de la plataforma en la que se ejecuten.
Permiten un mecanismo de reflexión.
Tipos de datos altamente dinámicos.
Gestión de memoria dinámico.
Fácilmente depurables y reducidos en tamaño.
23. GRAMÁTICA
Estudio de las reglas y principios que regulan el
uso de las lenguas y la organización de las
palabras dentro de una oración.
También se denomina así al conjunto de reglas y
principios que gobiernan el uso de un lenguaje
determinado.
Así, cada lenguaje tiene su propia Gramática.