Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
LENGUAJES DE PROGRAMACIÓN UNAH 04022023 .pptx
1. IS-513 LENGUAJES DE PROGRAMACIÓN
CONTACTO
MSc IBIS JAVIER ZAVALA RODRÍGUEZ
ibis.zavala@unah.hn
+504 3182-1148
IS-513 Lenguajes de Programación
Sábados 8:00 am – 12 m
enero de 2023
UNIVERSIDAD NACIONAL AUTÓNOMA DE
HONDURAS
CENTRO UNIVERSITARIO REGIONAL DEL
LITORAL PACÍFICO
IS-513 LENGUAJES DE PROGRAMACIÓN
2. IS-513 LENGUAJES DE PROGRAMACIÓN
• Traductor
• Compilador
• Análisis Léxico
• Análisis Sintáctico
• Análisis Semántico
• Generación de Código intermedio
• Optimización de Código
• Intérprete
Actividad #1
Actividad #2
EL PROCESO DE
COMPILACIÓN
04/02/2023
6. IS-513 LENGUAJES DE PROGRAMACIÓN
COMPILADOR
Cualquier compilador debe realizar dos tareas
principales: análisis del programa a compilar y
síntesis de un programa en lenguaje máquina.
Para el estudio de un compilador, es necesario
dividir su trabajo en fases, cada fase
representa una transformación al código fuente
para obtener el código objeto. En cada una de
las fases se utiliza un administrador de la tabla
de símbolos y un manejador de errores.
7. IS-513 LENGUAJES DE PROGRAMACIÓN
ANÁLISIS LÉXICO
1 fase de compilación
• Divide el programa fuente en unidades sintácticas llamadas
tokens.
• Elimina espacios vacíos y caracteres especiales.
• Interactúa con la tabla de símbolos.
9. IS-513 LENGUAJES DE PROGRAMACIÓN
ANÁLISIS SINTÁCTICO
Es la segunda fase del proceso de compilación y tiene como finalidad la
generación de un Árbol sintáctico, el cual no es más que una estructura de
datos compleja que permite representar de una forma más simple al
programa fuente.
Los compiladores modernos utilizan estructuras de objetos para representa a
un programa, de esta forma existe una clase específica para representa cada
posible token de nuestra tabla de símbolos.
10. IS-513 LENGUAJES DE PROGRAMACIÓN
ANÁLISIS SEMÁNTICO
Es el último paso antes de empezar a compilar realmente el código,
prepara el programa para ser compilado.
Parte del árbol sintáctico abstracto y tiene la finalidad de validar los puntos
más finos del programa, analiza que todo el programa tenga un significado
exacto y que este no pueda fallar en tiempo de ejecución.
Ejemplo, validar compatibilidad en tipos de datos, que la variable utilizada en
una instrucción este previamente declara o que estén dentro del contexto, si
implementamos una interface que todos los métodos estén definidos, etc.
11. IS-513 LENGUAJES DE PROGRAMACIÓN
CÓDIGO INTERMEDIO
Se puede considerar esta operación intermedia como un subprograma para
una máquina abstracta, a esta representación debe tener dos propiedades
importantes: debe ser fácil de producir y fácil de traducir al programa objeto.
Existe una forma intermedia llamada código de tres direcciones, que consiste
en una secuencia de instrucciones similares a ensamblador, con tres
operandos por instrucción. Cada operando puede actuar como un registro.
Hay varios puntos que vale la pena mencionar sobre las instrucciones
de tres direcciones. En primer lugar, cada instrucción de asignación
de tres direcciones tiene, por lo menos, un operador del lado
derecho. Por ende, estas instrucciones corrigen el orden en el que se
van a realizar las operaciones; la multiplicación va antes que la suma
en el programa fuente. En segundo lugar, el compilador debe generar
un nombre temporal para guardar el valor calculado por una
instrucción de tres direcciones. En tercer lugar, algunas
"instrucciones de tres direcciones" como la primera y la última en la
secuencia anterior, tienen menos de tres operandos.
12. IS-513 LENGUAJES DE PROGRAMACIÓN
OPTIMIZACIÓN DE CÓDIGO
La fase de optimización de código independiente de la máquina trata de
mejorar el código intermedio, de manera que se produzca un mejor
código destino. Por lo general, mejor significa más rápido, pero pueden
lograrse otros objetivos, como un código más corto, o un código de
destino que consuma menos poder.
El optimizador puede deducir que la conversión del
60, de entero a punto flotante, puede realizarse de
una vez por todas en tiempo de compilación, por lo
que se puede eliminar la operación inttofloat
sustituyendo el entero 60 por el número de punto
flotante 60.0. Lo que, es más, t3 se utiliza sólo una vez
para transmitir su valor a id1, para que el optimizador
pueda transformar (1.3) en la siguiente secuencia más
corta.
13. IS-513 LENGUAJES DE PROGRAMACIÓN
GENERACIÓN DE CÓDIGO
Recibe como entrada una representación intermedia del programa fuente y
la asigna al lenguaje destino. Si el lenguaje destino es código máquina, se
seleccionan registros o ubicaciones (localidades) de memoria para cada una
de las variables que utiliza el programa. Después, las instrucciones
intermedias se traducen en secuencias de instrucciones de máquina que
realizan la misma tarea. Un aspecto crucial de la generación de código es la
asignación juiciosa de los registros para guardar las variables.
El primer operando de cada instrucción especifica un
destino. La F en cada instrucción nos indica que trata con
número de punto flotante. El código carga el contenido de
la dirección id3 en el registro R2, y después lo multiplica
con la constante de punto flotante 60.0. El # indica que el
número 60.0 se va a tratar como una constante inmediata.
La tercera instrucción mueve id2 al registro R1 y la cuarta lo
suma al valor que se había calculado antes en el
registro R2. Por último, el valor en el registro R1 se
almacena en la dirección de id1, por lo que el código
implementa en forma correcta la instrucción de asignación.
14. IS-513 LENGUAJES DE PROGRAMACIÓN
MANEJADOR DE ERRORES
Es posible encontrar errores. De esta forma podrán controlarse
más eficientemente los errores encontrados en cada una de las
fases de la compilación de un programa.
16. IS-513 LENGUAJES DE PROGRAMACIÓN
INTÉRPRETE
Los intérpretes realizan normalmente dos operaciones:
Traducen el código fuente a un formato interno.
Ejecutan o interpretan el programa traducido al formato interno.
Particularidades de la interpretación:
Ahorra memoria.
Produce un resultado que no se puede
almacenar, lo cual hace la ejecución lenta.
No demasiado eficiente, cada vez que se
entre en un bucle se analizaran sus
sentencias.
Facilita el proceso de depuración.
No produce resultados transportables.
La interpretación es útil en:
Sistemas interactivos.
Programas de pequeña envergadura.
Programas de prototipo y de enseñanza.
17. IS-513 LENGUAJES DE PROGRAMACIÓN
ACTIVIDAD #1
Viernes 10/02/2023
• 1. Tokens
• 2. Expresiones Regulares
• 3. Gramática libre de contexto
• 4. Árboles de Parseo
• 5. Derivaciones