Introducción
Aunque pocas personas tendrán la oportunidad de crear, mantener, diseñar o formar parte de un equipo que se dedique a los compiladores, las técnicas utilizadas en el diseño de estos pueden emplearse con éxito en otras áreas del desarrollo de programas.
Por ejemplo, las formas de encontrar cadenas de caracteres dentro de otras para el analizador léxico, pueden utilizarse extensivamente en la construcción de procesadores de palabras, sistemas de recuperación de información y reconocimiento de caracteres.
La gramática libre de contexto y definiciones directas de sintaxis son utilizadas para crear algunos lenguajes sencillos o de propósito específico.
Las técnicas de mejorar el código se usan en verificadores de programas y programas que convierten a otros no estructurados en estructurados.
Estos conceptos son tan fundamentales en el área de la computación que las ideas expresadas aquí serán probablemente utilizadas varias veces a lo largo de una carrera técnica o científica. La escritura de compiladores cubre áreas tan diversas como lo son arquitectura de computadoras, algoritmos, teoría del lenguaje, programación e ingeniería de sistemas.
Gracias a Mª Cristina Vera Aristi por sus sugerencias y revisión del texto. México, D.F. a 3 de junio de 2002.
Emiliano Llano Díaz.
1. Compiladores
1.1 Objetivos
Reconocer la diferencia entre un compilador y un interprete
Introducir los conceptos de gramática en las especificaciones de un lenguaje
Dar un vistazo a las partes de un compilador
Revisar un ejemplo completo simplificado de un compilador
El diseño de computadoras es una de las pocas áreas de la ciencia de computo en donde la teoría abstracta cambio radicalmente la forma de construir compiladores. Los primeros compiladores fueron creados con las técnicas convencionales de programación lo que explica un poco la cantidad de años invertidos hasta lograr un primer compilador funcional. Con el advenimiento de las gramáticas libres de contexto ya no es usual compiladores construidos de esa forma.
De la misma forma que un lenguaje natural (inglés, español, francés, etc.), los lenguajes de computación definen una forma de ordenar palabras para construir oraciones que comunican información. Mientras un lenguaje natural comunica sentimientos, hechos, preguntas, etc. un lenguaje artificial se restringe a comandos que son seguidos por una máquina sin cuestionar.
El lenguaje natural restringe la forma de las posibles construcciones lógicas. Por ejemplo, tiene sentido decir "Pedro golpeó la bola" pero no "bola Pedro golpeó". Una es gramaticalmente correcto mientras que la otra no. De la misma manera "Pièrre a frapé la balle" es correcto en francés y una persona entrenada reconoce que la frase dice lo mismo en español que en francés.
Cuando una persona que desconoce el francés quiere comunicarse con una que desconoce el español, se requieren los servicios de un traductor. Si se le proporciona una frase gramaticalmente incorrecta, el traductor quedará confundido o explicará que no hay traducción para una frase sin sentido. Un compilador sustituye al traductor humano en los lenguajes artificiales y aplica ciertas reglas a las frases a traducir de forma que si tiene sentido entrega como resultado la frase equivalente en otro idioma.
Un compilador es pues, en esencia, un programa que lee a otro programa, muy probablemente una entrada de texto (lenguaje o programa fuente), y lo convierte a otro programa equivalente en otro lenguaje (el lenguaje o programa destino). Como una parte auxiliar y necesaria, el compilador reporta al usuario las fallas y errores que detecte en el programa fuente.
El más sencillo de los traductores lee palabras de un lenguaje sencillo y los traduce directamente a los números que la máquina usa como código de sus instrucciones. Este traductor se llama ensamblador y recibe sus datos de un lenguaje llamado lenguaje ensamblador, su nombre surge de las rutinas separadas que deben ensamblarse en una sola y del hecho de que los códigos internos de la máquina constan de una sola parte o número para cada instrucción mientras que el lenguaje ensamblador usa un mnemónico seguido de 0, 1 ó 2 parámetros para cada parte, misma que debe ensamblarse en un sólo código.
El termino compilador generalmente se reserva para lenguajes más complejos donde no existe una traducción directa al lenguaje de máquina o lenguaje al que se requiere realizar la traducción.
Existe una gran variedad de compiladores para distintos lenguajes fuentes y también una gran variedad de lenguajes destinos para los que funcionan dichos compiladores. Por ejemplo un compilador de PASCAL que entrega el programa equivalente en ensamblador para el circuito Motorola X o el mismo compilador para PASCAL pero queremos como salida el equivalente ensamblador para circuitos Intel X. Así mismo, se puede obtener un compilador de PASCAL que entrega como salida BASIC o FORTRAN o cualquier otro lenguaje que se requiera y para el cual exista una necesidad real, concreta y económica a cubrir.
Página siguiente |