Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Deniciones básicas
1.1. Máquinas
Una Máquina para M es, en un sentido muy general, una herramienta que permite entender
y ejecutar código escrito en un lenguaje particular M. En este caso, diremos que tal código es
ejecutable en M.
1.2. Intérpretes
1
Figura 2: Representación gráca de una intérprete para A, escrito en M.
Tomando esto en cuenta, es posible ver un intérprete para A escrito en M como una función
que recibe una máquina para M y devuelve entonces una máquina para A. Esto puede apreciarse
grácamente en la Figura 3.
Al ejecutar un traductor sobre una máquina que lo soporte, el mismo esperará una entrada
escrita en el lenguaje fuente y arrojará esa misma entrada en el lenguaje destino. Tal entrada puede
ser cualquier programa, los cuales se representarán grácamente como cuadrados identicados
con el lenguaje en el que están escritos. Un ejemplo de traducción es mostrado en la Figura 5.
2
2. Traductor de Traductores
2.1. Bootstrapping
El término bootstrapping proviene de una creencia pirata, la cual consistía en que era posible
levantarse del piso y otar al jalarse uno mismo las trenzas de las botas. Su equivalente en términos
de compiladores, sería intentar construir un compilador para un lenguaje en el mismo lenguaje
y esperar que funcione. Sin embargo, al agregar un intérprete para el lenguaje, tal hazaña es
posible. La gura 7 muestra la construcción de una compilador ejecutable en M para un lenguaje
A usando solamente los siguientes elementos:
Una máquina M.
Un intérprete para A en M.
3
2.2. El Caso de Pascal
Escribir un compilador para un lenguaje de alto nivel, en un lenguaje ensamblable es una tarea
sumamente difícil. Además, tal implementación es inútil al cambiar la arquitectura del sistema.
Era necesario plantear una solución que permitiese facilidad de codicación y portabilidad. En
1970, Niklaus Wirth diseñó el lenguaje de programación Pascal. Con el objetivo de distribuir
Pascal a la mayor cantidad de potenciales usuarios, Pascal fue entregado como un conjunto de
aplicaciones conocidas como sistema PascalP.
Al recibir este conjunto de programas, la única responsabilidad del recipiente era traducir el
intérprete brindado (manualmente) al lenguaje de su propia arquitectura. Esto sigue siendo una
tarea complicada, pero es mucho más sencilla que escribir un compilador directamente y más aún
dado que ya existe un modelo escrito en Pascal del cual guiarse. La gura 8 muestra este proceso,
suponiendo que ya se tradujo el intérprete al lenguaje M de la arquitectura disponible.
Una vez traducido el programa en cuestión, se puede utilizar el intérprete de Pcode para
ejecutarlo.
Esta solución es suciente si se quiere poder ejecutar los programas escritos en Pascal. Sin
embargo, al hacerse siempre a través de un intérprete, el rendimiento de los programas puede verse
fuertemente afectado. Si la velocidad de ejecución es un requerimiento importante, el recipiente
del sistema PascalP puede entonces implementar un traductor de Pascal a el lenguaje M de
la arquitectura, basándose en el traductor a Pcode. Implementar tal traductor puede parecer
complicado, sin embargo el mismo puede implementarse en Pascal (en vez del lenguaje de la
máquina) y ya se tiene un modelo de traducción a Pcode con el cual guiarse.
4
Figura 9: Compilador de Pascal a través del sistema PascalP.
3. Ejercicios sugeridos
En ambos ejercicios se busca construir una herramienta particular. Explique, de forma clara
y concisa, como deben utilizarse los recursos disponibles para conseguir la herramienta deseada.
(En ambos casos cuenta con una máquina M inicialmente).
2. Se desea implementar un intérprete del lenguaje A, que debe ejecutarse en una máquina
para M. Actualmente se cuenta con los siguientes recursos: