Академический Документы
Профессиональный Документы
Культура Документы
En este capitulo se habla acerca de los lenguajes de programación que son notaciones que
describen los cálculos a las personas y las máquinas. Este libro trata acerca de cómo diseñar e
implementar compiladores. Aquí descubriremos que podemos utilizar unas cuantas ideas básicas
para construir traductores para una amplia variedad de lenguajes y máquinas.
1.1 Procesadores de lenguaje
Un compilador es un compilador es un programa que puede leer un programa en un lenguaje
(el lenguaje fuente) y traducirlo en un programa equivalente en otro lenguaje (el lenguaje
destino. Una función importante del compilador es reportar cualquier error en el programa
fuente que detecte durante el proceso de traducción.
El programa destino en lenguaje máquina que produce un compilador es, por lo general, más
rápido que un intérprete al momento de asignar las entradas a las salidas. No obstante, por lo
regular, el intérprete puede ofrecer mejores diagnósticos de error que un compilador, ya que
ejecuta el programa fuente instrucción por instrucción.
Ejercicio 1.1.2: ¿Cuáles son las ventajas de (a) un compilador sobre un intérprete, y (b)
las de un intérprete sobre un compilador?
Ejercicio 1.1.4: A un compilador que traduce un lenguaje de alto nivel a otro lenguaje
de alto nivel se le llama traductor de source-to-source. ¿Qué ventajas hay en cuanto al
uso de C como lenguaje destino para un compilador?
Proporciona facilidades para realizar programas modulares y utilizar códigos o bibliotecas
existentes. Utiliza las características de bajo nivel para realizar implementaciones más
eficientes.
Ejercicio 1.1.5: Describa algunas de las tareas que necesita realizar un ensamblador.
Es un lenguaje de programación de bajo nivel que traduce el lenguaje ensamblador a lenguaje
máquina ya que utiliza código binario ocupado para los microprocesadores y utiliza
operaciones aritméticas y lógicas
La parte del análisis divide el programa fuente en componentes e impone una estructura
gramatical sobre ellas. Después utiliza esta estructura para crear una representación intermedia
del programa fuente. Si la parte del análisis detecta que el programa fuente está mal formado en
cuanto a la sintaxis, o que no tiene una semántica consistente, entonces debe proporcionar
mensajes informativos para que el usuario pueda corregirlo.
(nombre-token, valor-atributo)
que pasa a la fase siguiente, el análisis de la sintaxis. En el token, el primer componente nombre-
token es un símbolo abstracto que se utiliza durante el análisis sintáctico, y el segundo
componente valor-atributo apunta a una entrada en la tabla de símbolos para este token. La
información de la entrada en la tabla de símbolos se necesita para el análisis semántico y la
generación de código.
La segunda fase del compilador es el análisis sintáctico o parsing. El parser (analizador sintáctico)
utiliza los primeros componentes de los tokens producidos por el analizador de léxico para crear
una representación intermedia en forma de árbol que describa la estructura gramatical del flujo
de tokens. Una representación típica es el árbol sintáctico, en el cual cada nodo interior representa
una operación y los hijos del nodo representan los argumentos de la operación.
Las fases siguientes del compilador utilizan la estructura gramatical para ayudar a analizar el
programa fuente y generar el programa destino.
Después del análisis sintáctico y semántico del programa fuente, muchos compiladores generan
un nivel bajo explícito, o una representación intermedia similar al código máquina, que se puede
considerar como un programa para una máquina abstracta.
La tabla de símbolos es una estructura de datos que contiene un registro para cada nombre de
variable, con campos para los atributos del nombre. La estructura de datos debe diseñarse de tal
forma que permita al compilador buscar el registro para cada nombre, y almacenar u obtener datos
de ese registro con rapidez.
El tema sobre las fases tiene que ver con la organización lógica de un compilador. En una
implementación, las actividades de varias fases pueden agruparse en una pasada, la cual lee un
archivo de entrada y escribe en un archivo de salida.