LOS COMPILADORES
OBJETIVO GENERAL: Dar a los participantes los conceptos y herramientas
para que se puedan desenvolver apropiadamente en el manejo de
compiladores.
OBJETIVOS ESPECFICOS:
Conocer los conceptos bsicos de la Teora General de Sistemas
aplicada a los compiladores.
Estudiar los conceptos bsicos de introduccin a los compiladores
Aplicar las tcnicas de compilacin ms utilizadas en las ltimas
generaciones de desarrollo de software.
Antes de entrar en materia debemos aclarar los siguientes trminos:
LENGUAJE: todos sabemos que es un lenguaje de programacin, pero el
concepto de lenguaje de programacin abarca mucho ms all de lo que ahora
imaginamos. Un lenguaje de programacin, adems de Mdulo, C++ o Java,
puede ser por ejemplo el binario (ya sabe... eso que es ms o menos as
010001110110..) es muy fcil hacer un traductor de programas escritos en
binario a cdigo maquina (cogemos ocho caracteres del programa fuente que
queremos traducir, si los ocho son caracteres 0 o 1 escribimos el byte
equivalente a esa combinacin binaria en el fichero destino, repitiendo este
proceso hasta que se terminara el programa fuente, y si viniera un carcter
diferente emitimos un error de compilacin **Carcter no vlido**), muy fcil si,
pero a ver quin es el valiente que se programa un simulador de vuelo en ese
lenguaje. Como otro ejemplo, podramos inventarnos un lenguaje para
programar una caldera de calefaccin, este podra ser una lista de
instrucciones de dos tipos, una GO x indicara que queremos que la caldera
suba o baje hasta la temperatura indicada en x y otra WAlT x indicara que
se mantuviera en el estado actual durante x horas, el programa para un da
podra ser:
Reglas lxicas: son un conjunto de normas que definen la forma que tienen
estos elementos bsicos del lenguaje, por ejemplo, se puede especificar que
un smbolo de tipo identificador es una secuencia de caracteres que comienza
con un carcter alfabtico (entre A y Z maysculas o minsculas), y contina
mientras sigan en secuencia caracteres alfanumricos (letras o nmeros). Si
los definimos as un traductor analizara Mivar2 como un smbolo identificador,
pero Mi_var2 seran dos smbolos identificadores con otro smbolo extrao
entre ellos.
Tambin podemos especificar que un smbolo de asignacin es la secuencia de
caracteres := (dos puntos y un igual). Con estas dos sencillas reglas ya
hemos definido dos smbolos del lenguaje, los identificadores y los de
asignacin.
En un lenguaje de programacin inventado que tuviera solo esos dos smbolos
no sera correcto lxicamente cualquier smbolo que no estuviera englobado en
una de esas dos definiciones (como +, 8a, == o _), y cuando un programa
traductor los recibiera como entrada emitira un error lexicogrfico, para
advertirnos que hemos violado las reglas lxicas del lenguaje que implementa.
Reglas sintcticas. Una vez definidos cuales son los smbolos de un lenguaje,
con !as reglas sintcticas (o de sintaxis) se definen que secuencias de
smbolos son vlidas dentro del lenguaje. Por ejemplo, en el lenguaje binario al
que antes nos referimos, solo hay dos smbolos posibles, el cero y el uno, y sus
reglas sintcticas son bien sencillas: Un programa es cualquier secuencia de
smbolos. Pero el lenguaje binario es un caso especial (dada su extrema
simplicidad), pues lo ms normal en todos los lenguajes de programacin es
que solo sean vlidas algunas de las posibles secuencias de smbolos; en
Pascal por ejemplo, es vlida la siguiente secuencia:
Ancho := Alto + 1;
No siendo vlida (no perteneciendo al lenguaje) esta otra secuencia:
Ancho =; + Alto 1
El traductor detectara que la secuencia no es vlida porque en alguna de sus
reglas sintcticas se especifica que: Despus de un smbolo de asignacin (:=)
no puede venir un smbolo separador de sentencias (;). Es posible que una
regla como la anterior no est especificada explcitamente, pero sea deducible
del resto de reglas especificadas en el lenguaje.
Reglas semnticas. Estas son las ltimas normas que se imponen para que
un programa se pueda dar por correcto. Son las ms genricas y variables de
un lenguaje a otro. Una vez tenemos un programa que cumple las reglas
lexicogrficas (que tiene los smbolos bien formados) y las sintcticas (bien
concatenados), hemos de verificar que esta bien construido. Veamos el
siguiente programa en O:
main ()
{
n=33;
printf(El valor de n es %u,n);
}
Este programa es correcto lxicamente (no hay smbolos mal construidos) y
sintcticamente (tampoco hay problemas con la secuencia de smbolos), pero
no es correcto por que no hemos declarado la variable n, y debera haber
aparecido antes una declaracin del tipo: mt n;. Esta situacin se denomina
error semntico.
Las reglas semnticas definen cosas como todo lo referente a la coherencia de
las expresiones, dicen si es posible operar con variables de tipos diferentes,
que el nmero de parmetros en una llamada a una funcin debe coincidir con
el nmero de parmetros que extra recibe (y coincidir los tipos), que se deben
declarar todos los recursos (como constantes, procedimientos, variables,
tablas, ...) que se utilicen en el programa, que una variable no se puede
declarar varias veces, etc... Son el tipo de normas que definen si un programa
es correcto.
El corazn de un compilador es un traductor, que es un programa que recibe
como entrada un algoritmo expresado en un lenguaje y emite como salida el
mismo algoritmo expresado en un lenguaje diferente. Un compilador es un
paquete que incluye muchas ms cosas aparte del traductor, todas ellas
necesarias para programar, como son: libreras de funciones, un entorno de
desarrollo, (o trazador) de cdigo, ayuda en forma de documentacin, un
optimizador de cdigo, informacin sobre los errores,
Esta serie de artculos, que se debera llamar TRADUCTORES, se centra en
el interior de tos compiladores, con un primer objetivo que es, mejorar el uso
que hacemos de nuestra herramienta de trabajo, aumentando de forma
considerable nuestra cultura informtica, y un segundo objetivo que es
ensear lo justo y necesario para aquellos de nosotros que sintamos la
necesidad de inventar un nuevo lenguaje de programacin que revolucione el
mundo.
Desmitificar los compiladores ser la primera meta, nadie va a hundir a
Microsoft o Borland inventando el D++ o el C orientado a seres vivos, pero
inventar un lenguaje y programar un traductor para l es algo que cualquiera de
POR QUE ESTUDIAR DISEO Y CONSTRUCCION DE COMPILADORES?
Ayuda a los profesionales de rea de sistemas a profundizar el conocimiento
acerca del diseo de programas y su implementacin.
Toda traduccin es siempre problemtica, pues es difcil en muchas ocasiones
expresar la misma solucin a un problema en lenguajes de naturalezas tan
diferentes como C o ensamblador. Esa es la misin de nuestra primera, por
excelencia, herramienta de trabajo. Es tan vital conocer bien el compilador que
utilizamos, como conocer bien el lenguaje que implementa. El problema es:
Que sabe usted de l?.
Lenguajes de Programacin
Algoritmos
Estructuras de la Informacin
Ingeniera de Software
Teora de Lenguajes
Arquitectura del Procesador
the large)
CFGs, expresiones regulares, autmatas
Lenguaje Assembler, uso del conjunto de
instrucciones, arquitecturas, etc.
TECNICAS DE COMPILACIN
SON UTILES EN EL DESEMPEO PROFESIONAL O CIENTIFICO DE UN
PROFESIONAL DE SISTEMAS.
Las
tcnicas
matching
de
usadas
para
escribir scanners
editores de texto,
sistemas de recuperacin de
informacin
comandos UNIX
sintaxis
Tcnicas de Optimizacin de
Cdigo
Verificadores de programas.
PROGRAMAS
ESCRITOS
EN
LENGUAJES
DE
Para solucionar esto interrogantes se debe iniciar por definir los traductores,
intrpretes y compiladores.
LOS TRADUCTORES
Un traductor es un programa que traduce un programa escrito en un lenguaje a
un nuevo programa escrito en otro lenguaje
Como se mencion antes se trata de un programa que recibe y devuelve el
mismo algoritmo, pero expresado en dos lenguajes diferentes. Al lenguaje que
recibe se le denomina lenguaje fuente, y al que devuelve lenguaje destino. Los
traductores ms genricos que podamos estar usando nosotros son aquellos
que traducen programas escritos en un lenguaje de alto nivel (C, C++,
Pascal, ...) a cdigo mquina para los procesadores Intel, pero tambin
podemos hacer un traductor de C++ a Java, que tome un programa en el
primer lenguaje y produzca una salida vlida para ser compilada con un
compilador comercial de Java. Un traductor tambin puede traducir de
ensamblador a, o recibir un programa en ensamblador y producir como salida
un programa equivalente en Visual basic (aunque con sus limitaciones,
obviamente).
ESQUEMATICAMENTE:
PROGRAMA EN
LENGUAJE
FUENTE
ENSAMBLADORES
TRADUCTORES
COMPILADORES
PROGRAMA EN
LENGUAJE
OBJETO
INTERPRESTES
PROGRAMA EN
LENGUAJE
SUPERIOR
PROGRAMA EN
LENGUAJE
ASS, O MAQ
ERROR Y
DIAGNOSTICO
LOS INTRPRETES
Leen un programa escrito en un lenguaje de programacin y produce el
resultado de ejecutar tal programa.
Los intrpretes son programas que, por decirlo de alguna manera, juegan a ser
microprocesadores, leen un programa y van haciendo secuencialmente lo que
el programa dice, simulan su ejecucin, pero en realidad lo que siempre se est
ejecutando es el cdigo del intrprete, su desventaja es que este proceso es
SALIDA
INTERPRETE
DATOS
LENGUAJE DE
PROGRAMACION
SUPERIOR
VENTAJAS
COMPILADORES vs INTERPRETES
MAS EFICIENTES
PUEDEN PRODUCIR CODIGO
OPTIMIZADO
LOS PROGRAMAS TRADUCIDOS
NO REQUIEREN MS
TRADUCCIN
FACILES DE CONSTRUIR
FACILES DE DEBUG