Está en la página 1de 9

Lenguaje de programación

COMPILADORES Un lenguaje de programación se


Unidad I: Introducción al puede definir de diferentes maneras:
proceso de compilación  Notación formal para describir algoritmos y
funciones que serán ejecutados por una
computadora.
Flor Prof. Flor Narciso  Lenguaje para comunicar instrucciones a una
GIDyC-Departamento de Computación computadora.
LABSIULA-Escuela de Ingeniería de Sistemas  Convención para escribir descripciones que
Facultad de Ingeniería puedan ser evaluadas.
Universidad de Los Andes
fnarciso@ula.ve

Clasificación de los lenguajes de Clasificación de los lenguajes de


programación (según el grado de independencia programación (según el grado de independencia
de la máquina) de la máquina)

• Lenguaje de máquina • Lenguaje ensamblador


 La forma más baja de un lenguaje de programación.
 La notación que entiende directamente una computadora.  Versión simbólica de un lenguaje de
 Binario o hexadecimal. máquina:
 Cada instrucción se representa:
 Un código numérico y
 Cada código de operación se indica por un
 Unas direcciones de memoria. código simbólico: ADD, MUL...
 Arquitectura de la máquina de Von Neumann. Conjunto de  Asignaciones de memoria se dan con nombres
instrucciones basado en:
simbólicos
 Datos
 Operaciones aritméticas y lógicas
 Asignaciones de posiciones de memoria
 Control de flujo

1
Clasificación de los lenguajes de Clasificación de los lenguajes de
programación (según el grado de independencia programación (según el grado de independencia
de la máquina) de la máquina)

• Lenguaje de nivel intermedio • Lenguaje de alto nivel


 Características superiores a los lenguajes ensambladores
 Características de los lenguajes máquina:
 No acceso directo al sistema
 Acceso directo a posiciones memoria  Estructura de datos complejas
 Almacenar variables en registros del  Utilización de bloques, procedimientos o subrutinas
procesador
 Características de lenguajes de alto nivel: Ejemplos: Ada, ALGOL, Basic, C, C++, C#, Clipper, Cobol,
 Manejo de estructuras de control Fortran, Java, Lexico, Logo, Object Pascal, Pascal, Perl,
PHP, PL/SQL, Phyton, Modula 2.
 Manejo de datos
Lenguajes funcionales: Haskell, Lisp TAREA!!!!

Ejemplo: Lenguaje C

Clasificación de los lenguajes de


programación (según el grado de independencia
Procesar
de la máquina)

• Lenguaje orientado a problemas concretos • Someter a un proceso de


 Resolución de problemas en un campo transformación mediante operaciones
específico.
programadas. Es decir, transformar un
origen (fuente) en un destino
mediante una herramienta de
transformación que permita
Ejemplos: SQL, XBASE, Postscript operaciones programadas: la
computadora.

2
Procesador de lenguaje Procesador de lenguaje

• Nombre genérico que reciben las aplicaciones Se tomará como paradigma de los procesadores de
informáticas en las que uno de los datos lenguaje los compiladores.
fundamentales de entrada es un lenguaje:
- Traductores - Compiladores Los lenguajes de alto nivel hicieron necesarios los
- Ensambladores - Enlazadores
compiladores a partir de los años 50. Desde entonces,
gracias al descubrimiento de técnicas sistemáticas para el
- Cargadores - Intérpretes
manejo de muchas tareas que surgen en la compilación, al
- Desensambladores - Decompiladores
desarrollo de buenos lenguajes de implantación, entornos
- Depuradores - Analizadores de rendimiento de programación y herramientas de software, el diseño y
- Optimizadores de código - Compresores desarrollo de un compilador se ha simplificado
- Preprocesadores - Formateadores enormemente.
- Editores
TAREA!!!!

Traductor Compilador

• Lee un texto fuente y lo traduce a un texto objeto. Traductor que acepta programas
• Está escrito en un lenguaje de Implantación (LI). escritos en un lenguaje de
Puede ser cualquier lenguaje desde uno de alto
nivel a uno máquina. programación de alto nivel y los
• El texto fuente está escrito en lenguaje fuente (LF). traduce a otro lenguaje, generando
Normalmente uno de alto nivel pero también puede un programa equivalente
ser de bajo nivel.
independiente, que puede ejecutarse
• El texto objeto está escrito en lenguaje objeto (LO).
Puede ser otro lenguaje de alto nivel, un lenguaje tantas veces como se desee.
máquina o un ensamblador.

3
Compilación Compilación

• Proceso por el cual se traducen programas en código fuente • El tiempo que se tarda en traducir un programa en
(programa fuente) a programas en código objeto (programa código fuente se llama tiempo de compilación.
objeto).

• El tiempo que tarda en ejecutarse un programa en


• El programa que realiza esta traducción se llama compilador. código objeto se llama tiempo de ejecución.

• El archivo de código objeto que se obtiene con la compilación • El programa fuente y los datos se procesan en
está representado normalmente en código de máquina, momentos diferentes.
aunque también puede ser un código intermedio binario
multiplataforma (bytecode).

Código fuente Código objeto

• Conjunto de líneas de código que conforman un Código resultante de la compilación


bloque de texto que normalmente genera otro del código fuente, por lo general está
código mediante un compilador o intérprete para
ser ejecutado por una computadora.
codificado en código de máquina y
distribuido en varios archivos
• Normalmente se refiere a la programación de
software. Un único programador o un equipo de
resultantes de la compilación de cada
programadores escriben el código fuente en el archivo de código fuente.
lenguaje de programación elegido. Posteriormente
en un proceso de compilación el código fuente se
traduce en código objeto.

4
Compiladores Estructura y fases de un
compilador
Los compiladores son las herramientas más • La construcción de un compilador para un
utilizadas por los informáticos para el desarrollo determinado lenguaje es una tarea
de aplicaciones.
compleja, que se puede reducir siguiendo
una metodología: dividir en módulos las
En el caso particular del desarrollo de compiladores diferentes fases.
se hace necesario definir tres aspectos básicos:
 El léxico, la sintaxis y la semántica del lenguaje fuente a
ser compilado. • La complejidad dependerá de las
 La estructura interna del compilador.
 La arquitectura de la computadora y su conjunto de
características del lenguaje fuente y del
instrucciones del lenguaje objeto. lenguaje objeto y de su diferencia de
niveles.

Estructura y fases de un
Estructura y fases de un compilador
Programa fuente
compilador
FRONT-END ANÁLISIS

Fases de un compilador:
Análisis : Comprobar la corrección del programa fuente
Léxico
Sintáctico
SÍNTESIS Semántico

Síntesis
Generación de código intermedio
Optimización de código intermedio
Generación de código
Optimización de código

BACK-END

Programa objeto

5
Estructura y fases de un Estructura y fases de un
compilador compilador
Fases de un compilador: Fases de un compilador:
Análisis léxico: Se realiza en el nivel de los caracteres, debe reconocer Análisis sintáctico: Llamado también parser, realiza su análisis en
tokens y entregarlos junto con sus atributos al analizador sintáctico, aunque el nivel de la sentencia.
estos últimos no son necesarios para el análisis sintáctico, sino para las fases Es mucho más complejo que el análisis léxico.
siguientes.

El programa fuente es tratado con el analizador léxico (scanner), lee


Su función es tomar los tokens que ha encontrado el analizador
secuencialmente caracteres, los compara con patrones que representan léxico y determinar la estructura sintáctica de las sentencias,
unidades sintácticas e identifica éstas, también llamadas componentes léxicos agrupando los tokens en clases sintácticas ( los no terminales de la
o tokens, tales como: constantes, identificadores (de variables, de funciones, gramática), tales como expresiones, funciones, etc.
de procedimientos, de tipos, etc.), palabras reservadas y operadores. Una vez
identificado el token es entregado al analizador sintáctico. A cada token se le
asocia una serie de informaciones, según las necesidades del traductor.

Estructura y fases de un Estructura y fases de un


compilador compilador
Fases de un compilador: Fases de un compilador:
Análisis semántico: Detecta la validez semántica (reglas de Generación de código intermedio: El código intermedio no es
significado) de las sentencias aceptadas por el sintáctico. Típico de un lenguaje de programación de ninguna máquina real, sino que
esta fase es la comprobación de tipos de datos. corresponde a una máquina abstracta, que se debe definir lo más
general posible, de manera que sea posible traducir este código
intermedio a cualquier máquina real.

El objetivo del código intermedio es reducir el número de


programas necesarios para construir traductores y permitir más
fácilmente la transportabilidad de los traductores desde unas
máquinas a otras.

6
Estructura y fases de un Estructura y fases de un
compilador compilador
Fases de un compilador: Fases de un compilador:
Optimización de código intermedio: Es independiente de la Optimización de código: En este caso ya depende de la
máquina. Algunas optimizaciones pueden consistir en evaluación de máquina, de su arquitectura, de la asignación óptima de registros, el
expresiones constantes, el uso de las propiedades asociativa, uso de operaciones de registros en vez de usar memoria.
conmutativa de algunos operadores, reducción de expresiones
comunes, etc. Manejo de errores: Los errores encontrados en la diferentes fase
de análisis se envían a un módulo de manejo de errores. En el caso
Generación de código: Una vez que se ha obtenido el código más sencillo, sacará un mensaje indicando el error, el número de
intermedio se pasará a ensamblador o a código máquina de una línea donde se ha producido y abortará el proceso de análisis o
máquina real en el caso de un compilador o a otro lenguaje en el caso traducción.
de un traductor.
Puede sofisticarse este módulo si se intenta recuperar el error
(una especie de reparación provisional) para continuar el proceso el
mayor tiempo posible y encontrar el máximo de errores.

Estructura y fases de un Estructura y fases de un


compilador compilador
Fases de un compilador: • Estructura de un compilador:
Tabla de símbolos: Es una estructura de datos que contiene toda
la información relativa a cada identificador que aparece en el
 FRONT-END: Analiza el código fuente,
programa fuente. Cada elemento de la tabla se compone de al menos comprueba su validez, genera el árbol de
del identificador y sus atributos. derivación y rellena los valores de la tabla de
símbolos. Suele ser independiente de la
Los atributos son informaciones relativas a cada identificador, plataforma o sistema para el cual se vaya a
necesarias para o bien realizar el análisis semántico o bien la
traducción. Cualquiera de los tres analizadores puede rellenar algún
compilar.
atributo, pero el nombre del identificador (lexema) es misión del
analizador léxico.
 BACK-END: Genera el código de máquina,
específico de una plataforma, a partir de los
resultados de la fase de análisis, realizada por el
FRONT-END.

7
Estructura y fases de un Tipos de compiladores
compilador
• Estructura de un compilador: • Esta taxonomía de los tipos de compiladores no es
 Esta división permite que el mismo BACK-END se utilice excluyente, por lo que puede haber compiladores
para generar el código de máquina de varios lenguajes de que se adscriban a varias categorías:
programación distintos y que el mismo FRONT-END que
 Compiladores cruzados: Se ejecutan en una máquina pero
sirve para analizar el código fuente de un lenguaje de
el código objeto que producen es para otra máquina.
programación concreto sirva para la generación de código
de máquina en varias plataformas distintas.
 Compiladores optimizadores: Realizan cambios en el
código para mejorar su eficiencia, pero manteniendo la
 El código que genera el BACK END normalmente no se
funcionalidad del programa original.
puede ejecutar directamente, sino que necesita ser
enlazado por un programa enlazador (linker).
 Compiladores de una sola pasada: Generan el código
máquina a partir de una única lectura del código fuente.

Tipos de compiladores Herramientas para la construcción de


procesadores de lenguaje

 Compiladores de varias pasadas: Necesitan leer • Generadores de analizadores léxicos: Basada en el


el código fuente varias veces antes de poder uso de expresiones regulares, generan automáticamente el
producir el código de máquina. código fuente para el análisis léxico a partir de una
especificación de los tokens. La más usada es lex,
incorporada en el sistema operativo UNIX. Existen versiones
 Compiladores JIT (Just In Time): Forman parte de para PC.
un intérprete y compilan partes del código según
se necesitan.
• Generadores de analizadores sintácticos:
Construyen el código fuente del analizador sintáctico a partir
Tarea: Investigar acerca de los compiladores de de la especificación de la gramática del lenguaje fuente. La
varias pasadas mas usada yacc incluida en UNIX. Tambien existen versiones
para PC.

8
Herramientas para la construcción de Herramientas para la construcción de
procesadores de lenguaje procesadores de lenguaje

• Analizadores de gramáticas: Dada una • Generadores automáticos de código:


gramática especificada formalmente, verifican si es Trabajan con un conjunto de reglas que permiten la
de un determinado tipo o no. Normalmente se traducción del código en lenguaje intermedio al
utilizan para verificar las gramáticas LL(k) y LR(k). lenguaje objeto. Las reglas suelen remplazar
instrucciones de código intermedio por patrones
que contienen las instrucciones equivalentes de la
• Máquinas de traducción dirigida por máquina objeto.
sintaxis: Producen un conjunto de rutinas que
recorren el árbol sintáctico y generan código • Analizadores de flujo: Suministran la
intermedio. Asocian una o más traducciones a cada información necesaria para realizar las
nodo sintáctico. optimizaciones de código.

Aplicaciones de los Aplicaciones de los


procesadores de lenguaje procesadores de lenguaje
• Las técnicas empleadas en la construcción  Formateadores de texto
de traductores, compiladores e intérpretes  Intérpretes de comandos de un sistema
pueden aplicarse en la construcción de operativo
otras herramientas:
 Construcción de entornos operativos
 Editores sensibles al contexto
 Conversores de formato  Intérpretes para consultar base de datos

 Preprocesadores  Compiladores de silicio


 Formateadores de código fuente  Procesamiento de lenguajes naturales
 Generadores de código  Reconocimiento del habla
 Verificación estática de programas

También podría gustarte