SlideShare una empresa de Scribd logo
1 de 31
Los compiladores son programas o herramientas encargadas de
compilar. Un compilador toma un texto (código fuente) escrito en
un lenguaje de alto nivel y lo traduce a un lenguaje comprensible
por las computadoras (código objeto).
Un programa informático que traduce un programa escrito en un
lenguaje de programación a otro lenguaje de programación,
generando un programa equivalente que la máquina será capaz
de interpretar. El segundo lenguaje es lenguaje de máquina, pero
también puede ser simplemente texto. Este proceso de
traducción se conoce como compilación. Un compilador es un
programa que permite traducir el código fuente de un programa
en lenguaje de alto nivel
Compiladores cruzados : generan código para un sistema
distinto del que están funcionando.
Compiladores optimizadores : realizan cambios en el código
para mejorar su eficiencia, pero manteniendo la funcionalidad
del programa original.
Compiladores de una sola pasada : generan el código
máquina a partir de una única lectura del código fuente.
Compiladores de varias pasadas : necesitan leer el código
fuente varias veces antes de poder producir el código máquina.
Compiladores JIT (Just In Time): forman parte de un intérprete
y compilan partes del código según se necesitan.
Generalmente un compilador se divide en dos partes:
* Front End: parte que analiza el código fuente, comprueba su validez,
genera el árbol de derivación y rellena los valores de la tabla de símbolos.
Parte que suele ser independiente de la plataforma o sistema operativo para
el que funcionará.
* Back End: parte en donde se genera el código máquina exclusivo para
una plataforma a partir de lo analizado en el front end.
Por lo general el resultado del back end no puede ser ejecutado
directamente, se necesita pasar por un proceso de enlazado (linker).
El lenguaje de programación Java , fue diseñado por la
compañía Sun Microsystems Inc, con el propósito de crear
un lenguaje que pudiera funcionar en redes
computacionales heterogéneas ( redes de computadoras
formadas por más de un tipo de computadora, ya sean PC,
MAC's, estaciones de trabajo , etc.),y que fuera
independiente de la plataforma en la que se vaya a ejecutar.
Esto significa que un programa de Java puede ejecutarse
en cualquier máquina o plataforma.
Evitar errores de memoria
Imposibilitar acceso al SO
Evitar que caiga la máquina sobre la que
corre
Ausencia de punteros: Protege frente a
imitación de objetos, violación de
encapsulación, acceso a áreas protegidas
de memoria, ya que el programador no
podrá referenciar posiciones de memoria
específicas no reservadas, a diferencia de lo
que se puede hacer en C y C++.
Es un lenguaje de programación orientado a
objetos desarrollado y estandarizado por
Microsoft como parte de su plataforma .NET .
Esta es una interfaz de programación de
aplicaciones ( API ), mientras que C es un
lenguaje de programación independiente
diseñado para generar programas sobre dicha
plataforma
Microsoft.NET framework SDK (siglas en inglés de
software development kit) es generalmente un conjunto de
herramientas de desarrollo de software que le permite al
programador crear aplicaciones para un sistema concreto,
por ejemplo ciertos paquetes de software, frameworks,
plataformas de hardware, computadoras, videoconsolas,
sistemas operativos, etc. incluye un compilador de C
Microsoft Visual Studio versión 2002, 2003, 2005, 2008 y
2010
Mono
.NET desarrollado por Novell . Como parte de esta
implementación se incluye un compilador de C .
Delphi 2006, de Borland Software Corporation. dotGNU
Portable.NET , de la Free Software Foundation .
Un núcleo del lenguaje simple, con funcionalidades añadidas
importantes, como funciones matemáticas y de manejo de archivos,
proporcionadas por bibliotecas .
Es un lenguaje muy flexible que permite programar con múltiples estilos.
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje de pre procesado , el preprocesador de C , para tareas
como definir macros e incluir múltiples archivos de código fuente .
Acceso a memoria de bajo nivel mediante el uso de punteros .
Interrupciones al procesador con uniones .
Un conjunto reducido de palabras clave
Cualquier lenguaje puede ser ejecutado tanto vía intérprete o vía
compilador, pero algunos lenguajes suelen asociarse más a una vía que a
la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes
compilados" respectivamente.
También existen intérpretes que incluyen cierta "compilación" en el medio.
Son aquellos que compilan a un código intermedio llamado bytecode, que
es más eficiente de ejecutar que hacerlo directamente desde el código
fuente.
En general, la principal desventaja de los intérpretes, es que cuando un
programa es interpretado, suele ejecutarse más lento que si el mismo
programa estuviese compilado. Esto se debe a que el intérprete debe
analizar cada sentencia en el programa en cada ejecución (un análisis en
tiempo real). También el acceso a variables es más lento en un intérprete,
porque mapear los identificadores para almacenar las localizaciones debe
hacerse repetidas veces en tiempo real.
Un analizador léxico o analizador lexicográfico (en
inglés scanner) es la primera fase de un compilador
consistente en un programa que recibe como entrada el
código fuente de otro programa (secuencia de
caracteres) y produce una salida compuesta de tokens
(componentes léxicos) o símbolos. Estos tokens sirven
para una posterior etapa del proceso de traducción,
siendo la entrada para el analizador sintáctico (en inglés
parser).
Sin embargo, un analizador léxico también es la parte
del traductor que maneja la entrada del código fuente, y
puesto que esta entrada a menudo involucra un
importante gasto de tiempo, el analizador léxico debe
funcionar de manera tan eficiente como sea posible.
GRAMÁTICA LÉXICA
La especificación de un lenguaje de programación a menudo incluye un
conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente
en expresiones regulares que indican el conjunto de posibles secuencias de
caracteres que definen un Token o lexema.
En algunos lenguajes de programación es necesario establecer patrones
para caracteres especiales (como el espacio en blanco) que la gramática
pueda reconocer sin que constituya un Token en sí.
ANÁLISIS
Esta etapa está basada usualmente en una máquina de estados finitos. Esta
máquina contiene la información de las posibles secuencias de caracteres
que puede conformar cualquier Token que sea parte del lenguaje (las
instancias individuales de estas secuencias de caracteres son denominados
lexemas). Por ejemplo, un Token de naturaleza entero puede contener
cualquier secuencia de caracteres numéricos.
El análisis sintáctico convierte el texto de entrada en otras
estructuras (comúnmente árboles), que son más útiles para el
posterior análisis y capturan la jerarquía implícita de la entrada. Un
analizador léxico crea tokens de una secuencia de caracteres de
entrada y son estos tokens los que son procesados por el
analizador sintáctico para construir la estructura de datos, por
ejemplo un árbol de análisis o árboles de sintaxis abstracta.
El análisis sintáctico también es un estado inicial del análisis de
frases de lenguaje natural. Los lenguajes habitualmente
reconocidos por los analizadores sintácticos son los lenguajes
libres de contexto.
Tipos generales de analizadores sintácticos para
gramáticas:
a) Análisis sintáctico descendente. Construye árboles de análisis
sintáctico desde arriba (raíz) hacia abajo (hojas). El análisis se
realiza de lo general a lo particular.
b) Análisis sintáctico ascendente. Construyen árboles de análisis
sintáctico comenzando en las hojas y suben hacia la raíz. El
análisis se realiza de lo particular a lo general.
En ambos casos, se examina la entrada al analizador léxico de
izquierda a derecha, un símbolo a la vez.
ANALISIS SINTACTICO DESCENDENTE
Se considera un intento de encontrar una derivación por la izquierda para
una cadena de entrada. También se puede considerar como un intento de
construir un árbol de análisis sintáctico para la entrada comenzando desde
la raíz y creando nodos del árbol en orden previo.
ANALISIS SINTACTICO ASCENDENTE
El análisis sintáctico ascendente intenta construir un árbol para la cadena
de entrada que comienza por las hojas (el fondo) y avanza hacia la raíz (la
cima).
ANÁLISIS SINTÁCTICO POR PRECEDENCIA DE OPERADORES
Para una pequeña clase de gramáticas se puede construir con facilidad a
mano eficientes analizadores sintácticos ascendentes. Estás gramáticas,
por precedencia de operadores, tienen la propiedad de que ningún lado
derecho de la producción es є ni tiene 2 terminales adyacentes.
Una gramática con esta última propiedad de denomina gramática de
operadores.
ANALIZADORES SINTÁCTICOS IZQUIERDA-DERECHA
Es una técnica eficiente de análisis sintáctico ascendente que se puede
utilizar para analizar una amplia clase de gramáticas independientes de
contexto, denominada Análisis sintáctico LR(k)
L es por el examen de la entrada de izquierda a derecha (left to right)
R por construir una derivación por la derecha (right most derivation) en
orden inverso.
K por el número de símbolos de entrada de examen por anticipado
utilizados para tomar decisiones del análisis sintáctico. Cuando se omite,
se asume que k es 1.
Este análisis es atractivo por varias razones:
• Reconocen prácticamente todas las construcciones de los lenguajes de
programación para los que se pueden escribir gramáticas independientes
del contexto.
• Puede detectar un error sintáctico tan pronto como sea posible hacerlo en
un examen de izquierda a derecha de la entrada.
Que es la semántica?
Se refiere a los aspectos del significado, sentido o interpretación
del significado de un determinado elemento, símbolo, palabra,
expresión o representación formal.
Análisis semántico
Se trata de determinar el tipo de los resultados intermedios,
comprobar que los argumentos que tiene un operador
pertenecen al conjunto de los operadores posibles, y si son
compatibles entre sí, etc. En definitiva, comprobará que el
significado de lo que se va leyendo es válido.
Que es un árbol semántico?
Es una estructura jerárquica en la cual se registran las
operaciones que implica u operan dentro del programa fuente
En cada una de las ramas del árbol semántico se registra el
valor o significado que este debe tener, y el análisis semántico
se encarga de terminar cual de
los valores registrados en las ramas es aplicable.
Ejemplo:
Suponiendo que tenemos esta línea de código en C:
res=valor1+valor2;
El análisis semántico se va a encargar que tanto el valor1 como el
valor2 tengan datos que son compatibles en común y que además
se les pueda aplicar dicho operador.
En C el símbolo (+) implica una suma de valores o una unión de las
cadenas
Tabla de símbolos
Un compilador necesita guardar y usar la información de
los objetos que se va encontrando en el texto fuente, como
variables, etiquetas, declaraciones de tipos, etc.
Esta información se almacena en una estructura de datos
interna conocida como tabla de símbolos.
El compilador debe desarrollar una serie de funciones
relativas a la manipulación de esta tabla como insertar un
nuevo elemento en ella, consultar la información
relacionada con un símbolo, borrar un elemento, etc.
Como se tiene que acceder mucho a la tabla de símbolos
los accesos deben ser lo más rápidos posible para que la
compilación sea eficiente.
Generación de código
– Se realiza mientras se analiza el programa
– “Libre del contexto”
Optimización
– Se realiza después de la generación de código de
todo el programa o de un elemento ejecutable del
programa (función, procedimiento, etc).
– “Dependiente del contexto”
Se ejecuta todo
junto. Mientras
se analiza se
genera código
Generación de Código y Optimización
Optimización
• Objetivo
– Obtener código que se ejecuta más eficientemente según los
criterios
• Tiempo de ejecución (optimización temporal)
• Espacio de memoria utilizado (optimización espacial)
• Funcionamiento
– Revisa el código generado a varios niveles de abstracción y
realiza las optimizaciones aplicables al nivel de abstracción
• Representaciones de código intermedio de más a menos
Abstractas
– Árbol sintáctico abstracto: optimizar subexpresiones
redundantes, reducción de frecuencia, etc.
– Ensamblador/Código máquina: convertir saltos a saltos
cortos,reordenar instrucciones
Optimización
• Funcionamiento (continuación)
– Representaciones de código para extraer información.
• Condiciones que se han de cumplir
– El código optimizado se ha de comportar igual que el código
de partida excepto por ser más rápido o ocupar menos
espacio.
– Hay que buscar transformaciones que no modifiquen el
comportamiento del código según el comportamiento
definido para el lenguaje de programación. Ejemplo
• Si no se ha definido el orden de evaluación de los operandos
la siguiente optimización es válida
B=2*A+(A=c*d);
Pasar a
A=c*d;
B=A*2;
BLOQUE BÁSICO
• Un bloque básico es un fragmento de código que tiene una
única entrada y salida, y cuyas instrucciones se ejecutan
secuencialmente. Implicaciones:
– Si se ejecuta una instrucción del bloque se ejecutan todas
en un orden conocido en tiempo de compilación.
• La idea del bloque básico es encontrar partes del programa
cuyo análisis necesario para la optimización sea lo más
simple posible.
El compilador tiene que:
–Reportar clara y exactamente la presencia de
errores
–Recuperarse de cada error lo suficientemente
rápido para poder detectar errores subsiguientes
–Tratar de evitar mensajes falsos de error
Tipos de Errores
•Léxicos
•Sintácticos
•Semánticos
•Lógicos
Errores Léxicos
•Un error que produce un token erróneo
•Errores léxicos posibles
–Un identificador, palabra reservada u operador mal escrito
(typo)
Errores Sintácticos
Un error de sintaxis se detecta cuando el analizador sintáctico
espera un símbolo que no corresponde al que se acaba de
leer. Los analizadores sintácticos tienen la ventaja de que
pueden detectar errores sintácticos lo más pronto posible, es
decir, se genera un mensaje de error en cuanto el símbolo
analizado no sigue la secuencia de los símbolos analizados
hasta ese momento.
–Expresión aritmética con paréntesis no balanceados
–Un punto y coma faltante
Errores Semánticos
•Un error que necesita información sensitiva al contexto para ser
identificado
•Ejemplos
–Un operador aplicado a un tipo incompatible de operando
–Accesar una variable no declarada
Errores Lógicos
•Errores en el modelo de ejecución
•Ejemplos
–Recursión infinita
–Accesar un arreglo fuera de los límites
–Diferenciar un null
Una tabla de símbolos es una estructura de datos que usa el proceso de
traducción de un lenguaje de programación, por un compilador o un
intérprete, donde cada símbolo en el código fuente de un programa está
asociado con información tal como la ubicación, el tipo de datos y el
ámbito de cada variable, constante o procedimiento.
Puede tratarse como una estructura transitoria o volátil, que sea utilizada
únicamente en el proceso de traducción de un lenguaje de programación,
para luego ser descartada, o integrada en la salida del proceso de
compilación para una explotación posterior, como puede ser por ejemplo,
durante una sesión de depuración, o como recurso para obtener un
informe de diagnóstico durante o después la ejecución de un programa.
Los símbolos en la tabla de símbolos pueden referirse a constantes, a
funciones o a tipos de datos en el código fuente de un programa.
La siguiente representa una serie de atributos que no es necesaria
para todos los compiladores, sin embargo cada uno de ellos se
puede utilizar en la implementación de un compilador particular.
Nombre del identificador.
Dirección en tiempo de ejecución a partir del cual se almacenara
el identificador si es una variable.
Tipo del identificador. Si es una función el tipo que devuelve la
función.
Número de dimensiones del array (arreglo), o número de
miembros de una estructura o clase, o números de parámetros si
se trata de una función.
Tamaño máximo o rango de cada una de las dimensiones de los
array, si tiene dimensión estática.
Etc.

Más contenido relacionado

La actualidad más candente

Trabajo de compiladores completo alexandra
Trabajo de compiladores completo alexandraTrabajo de compiladores completo alexandra
Trabajo de compiladores completo alexandraAlexandraMolinaSanchez
 
Tipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacionTipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacionjorge severino
 
Máquinas de Turing - Tipos y Aplicaciones
Máquinas de Turing - Tipos y AplicacionesMáquinas de Turing - Tipos y Aplicaciones
Máquinas de Turing - Tipos y AplicacionesRosviannis Barreiro
 
Futuro del Software: Impacto en las organizaciones y en los profesionales
Futuro del Software:  Impacto en las organizaciones  y en los profesionalesFuturo del Software:  Impacto en las organizaciones  y en los profesionales
Futuro del Software: Impacto en las organizaciones y en los profesionalesAISTI
 
Lenguaje Ensamblador
Lenguaje EnsambladorLenguaje Ensamblador
Lenguaje Ensambladoriagardea
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Osiris Mirerus
 
Presentacion Java
Presentacion JavaPresentacion Java
Presentacion Javamaeusogo
 
Compiladores - Flex y Bison
Compiladores - Flex y BisonCompiladores - Flex y Bison
Compiladores - Flex y BisonSteven Tabango
 
C. comparativo servidores & servicios
C. comparativo servidores & serviciosC. comparativo servidores & servicios
C. comparativo servidores & serviciosKozmo Hernan
 
Clase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensambladorClase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensambladorInfomania pro
 
Que es un frame en html
Que es un frame en htmlQue es un frame en html
Que es un frame en htmlYomairi Nope
 
Lenguajes de programacion tema 2_compiladores e interpretes
Lenguajes de programacion tema 2_compiladores e interpretesLenguajes de programacion tema 2_compiladores e interpretes
Lenguajes de programacion tema 2_compiladores e interpretesIsrael Castillo Cruz
 
Compiladores
CompiladoresCompiladores
CompiladoresIsabel
 
Pseint pseudocodigo
Pseint   pseudocodigoPseint   pseudocodigo
Pseint pseudocodigoFEDIMON
 
Proyecto calculadora
Proyecto calculadoraProyecto calculadora
Proyecto calculadoraivan ramirez
 

La actualidad más candente (20)

Fundamentos de programación
Fundamentos de programaciónFundamentos de programación
Fundamentos de programación
 
Trabajo de compiladores completo alexandra
Trabajo de compiladores completo alexandraTrabajo de compiladores completo alexandra
Trabajo de compiladores completo alexandra
 
Lenguaje de programación
Lenguaje de programaciónLenguaje de programación
Lenguaje de programación
 
Tipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacionTipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacion
 
Máquinas de Turing - Tipos y Aplicaciones
Máquinas de Turing - Tipos y AplicacionesMáquinas de Turing - Tipos y Aplicaciones
Máquinas de Turing - Tipos y Aplicaciones
 
Futuro del Software: Impacto en las organizaciones y en los profesionales
Futuro del Software:  Impacto en las organizaciones  y en los profesionalesFuturo del Software:  Impacto en las organizaciones  y en los profesionales
Futuro del Software: Impacto en las organizaciones y en los profesionales
 
Lenguaje Ensamblador
Lenguaje EnsambladorLenguaje Ensamblador
Lenguaje Ensamblador
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1
 
Presentacion Java
Presentacion JavaPresentacion Java
Presentacion Java
 
Diapositivas fundamentos-de-programacion
Diapositivas fundamentos-de-programacionDiapositivas fundamentos-de-programacion
Diapositivas fundamentos-de-programacion
 
Compiladores - Flex y Bison
Compiladores - Flex y BisonCompiladores - Flex y Bison
Compiladores - Flex y Bison
 
C. comparativo servidores & servicios
C. comparativo servidores & serviciosC. comparativo servidores & servicios
C. comparativo servidores & servicios
 
Clase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensambladorClase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensamblador
 
Cuadro comparativo sgbd
Cuadro comparativo sgbdCuadro comparativo sgbd
Cuadro comparativo sgbd
 
Que es un frame en html
Que es un frame en htmlQue es un frame en html
Que es un frame en html
 
Lenguajes de programacion tema 2_compiladores e interpretes
Lenguajes de programacion tema 2_compiladores e interpretesLenguajes de programacion tema 2_compiladores e interpretes
Lenguajes de programacion tema 2_compiladores e interpretes
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Alfabetos
AlfabetosAlfabetos
Alfabetos
 
Pseint pseudocodigo
Pseint   pseudocodigoPseint   pseudocodigo
Pseint pseudocodigo
 
Proyecto calculadora
Proyecto calculadoraProyecto calculadora
Proyecto calculadora
 

Destacado

Incorporacion De Una Tabla De Simbolos Compiladores
Incorporacion De Una Tabla De Simbolos CompiladoresIncorporacion De Una Tabla De Simbolos Compiladores
Incorporacion De Una Tabla De Simbolos Compiladoresguest5fa3fc
 
Compiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo masCompiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo mascesarkt
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoGermania Rodriguez
 
Analisis semantico
Analisis semanticoAnalisis semantico
Analisis semanticoAreli Gómez
 
Análisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoAnálisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoangiepao1717
 
Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico maryr_
 

Destacado (10)

TABLA DE SIMBOLOS
TABLA DE SIMBOLOSTABLA DE SIMBOLOS
TABLA DE SIMBOLOS
 
Incorporacion De Una Tabla De Simbolos Compiladores
Incorporacion De Una Tabla De Simbolos CompiladoresIncorporacion De Una Tabla De Simbolos Compiladores
Incorporacion De Una Tabla De Simbolos Compiladores
 
traduccion-dirigida-por-la-sintaxis
traduccion-dirigida-por-la-sintaxistraduccion-dirigida-por-la-sintaxis
traduccion-dirigida-por-la-sintaxis
 
Compiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo masCompiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo mas
 
Administrador de Tabla de Símbolos
Administrador de Tabla de SímbolosAdministrador de Tabla de Símbolos
Administrador de Tabla de Símbolos
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintactico
 
Analisis semantico
Analisis semanticoAnalisis semantico
Analisis semantico
 
Análisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoAnálisis léxico y análisis sintáctico
Análisis léxico y análisis sintáctico
 
Compiladores, Analisis Lexico, Ejemplo Minilenguaje
Compiladores, Analisis Lexico, Ejemplo MinilenguajeCompiladores, Analisis Lexico, Ejemplo Minilenguaje
Compiladores, Analisis Lexico, Ejemplo Minilenguaje
 
Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico
 

Similar a Compiladores unidad1

Grupo 1 proceso de lenguajes i
Grupo 1 proceso de lenguajes iGrupo 1 proceso de lenguajes i
Grupo 1 proceso de lenguajes iRossana Sosa
 
Materia unidad compiladores
Materia unidad compiladoresMateria unidad compiladores
Materia unidad compiladoresbachispasaca
 
C:\documents and settings\clientea\mis documentos\compiladores
C:\documents and settings\clientea\mis documentos\compiladoresC:\documents and settings\clientea\mis documentos\compiladores
C:\documents and settings\clientea\mis documentos\compiladoresNancyandRegina317
 
Actividad 3
Actividad 3Actividad 3
Actividad 3maryr_
 
Evolucion de los compiladores1
Evolucion de los compiladores1Evolucion de los compiladores1
Evolucion de los compiladores1udalrico
 
Glosario De Trabajo De Examen
Glosario De Trabajo De ExamenGlosario De Trabajo De Examen
Glosario De Trabajo De ExamenJoel Soto
 
Glosario de trabajo de examen
Glosario de trabajo de examenGlosario de trabajo de examen
Glosario de trabajo de examenJoel Soto
 
Compilador Funcionamiento
Compilador FuncionamientoCompilador Funcionamiento
Compilador FuncionamientoKriz Kozlov
 
Repuesto de expo de programacion
Repuesto de expo de programacionRepuesto de expo de programacion
Repuesto de expo de programacionelizabethrmlm
 
1.5 GENERADORES DE CODIGO PARA COMPILADORES (COMPILADOR DE COMPILADORES)
1.5  GENERADORES  DE CODIGO  PARA COMPILADORES (COMPILADOR DE COMPILADORES)1.5  GENERADORES  DE CODIGO  PARA COMPILADORES (COMPILADOR DE COMPILADORES)
1.5 GENERADORES DE CODIGO PARA COMPILADORES (COMPILADOR DE COMPILADORES)elizabethrmlm
 
Especialidad
EspecialidadEspecialidad
EspecialidadDilan19
 
Especialidad
EspecialidadEspecialidad
Especialidadbecew
 
Traductores de lenguajes de programación
Traductores de lenguajes de programaciónTraductores de lenguajes de programación
Traductores de lenguajes de programaciónDaniela Brignolo
 

Similar a Compiladores unidad1 (20)

Grupo 1 proceso de lenguajes i
Grupo 1 proceso de lenguajes iGrupo 1 proceso de lenguajes i
Grupo 1 proceso de lenguajes i
 
Resumencap1 carmen vargas_jeremycamacho
Resumencap1 carmen vargas_jeremycamachoResumencap1 carmen vargas_jeremycamacho
Resumencap1 carmen vargas_jeremycamacho
 
Materia unidad compiladores
Materia unidad compiladoresMateria unidad compiladores
Materia unidad compiladores
 
Introduccion
IntroduccionIntroduccion
Introduccion
 
C:\documents and settings\clientea\mis documentos\compiladores
C:\documents and settings\clientea\mis documentos\compiladoresC:\documents and settings\clientea\mis documentos\compiladores
C:\documents and settings\clientea\mis documentos\compiladores
 
Actividad 3
Actividad 3Actividad 3
Actividad 3
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Evolucion de los compiladores1
Evolucion de los compiladores1Evolucion de los compiladores1
Evolucion de los compiladores1
 
Glosario De Trabajo De Examen
Glosario De Trabajo De ExamenGlosario De Trabajo De Examen
Glosario De Trabajo De Examen
 
Glosario de trabajo de examen
Glosario de trabajo de examenGlosario de trabajo de examen
Glosario de trabajo de examen
 
Unidad1 2 Lenguajes y automatas
Unidad1 2  Lenguajes y automatasUnidad1 2  Lenguajes y automatas
Unidad1 2 Lenguajes y automatas
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Compiladores iswi (parte 2)
Compiladores iswi (parte 2)Compiladores iswi (parte 2)
Compiladores iswi (parte 2)
 
Compilador Funcionamiento
Compilador FuncionamientoCompilador Funcionamiento
Compilador Funcionamiento
 
Repuesto de expo de programacion
Repuesto de expo de programacionRepuesto de expo de programacion
Repuesto de expo de programacion
 
1.5 GENERADORES DE CODIGO PARA COMPILADORES (COMPILADOR DE COMPILADORES)
1.5  GENERADORES  DE CODIGO  PARA COMPILADORES (COMPILADOR DE COMPILADORES)1.5  GENERADORES  DE CODIGO  PARA COMPILADORES (COMPILADOR DE COMPILADORES)
1.5 GENERADORES DE CODIGO PARA COMPILADORES (COMPILADOR DE COMPILADORES)
 
Especialidad
EspecialidadEspecialidad
Especialidad
 
Especialidad
EspecialidadEspecialidad
Especialidad
 
Traductores de lenguajes de programación
Traductores de lenguajes de programaciónTraductores de lenguajes de programación
Traductores de lenguajes de programación
 
Compiladores
CompiladoresCompiladores
Compiladores
 

Compiladores unidad1

  • 1.
  • 2. Los compiladores son programas o herramientas encargadas de compilar. Un compilador toma un texto (código fuente) escrito en un lenguaje de alto nivel y lo traduce a un lenguaje comprensible por las computadoras (código objeto). Un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. El segundo lenguaje es lenguaje de máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación. Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel
  • 3. Compiladores cruzados : generan código para un sistema distinto del que están funcionando. Compiladores optimizadores : realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. Compiladores de una sola pasada : generan el código máquina a partir de una única lectura del código fuente. Compiladores de varias pasadas : necesitan leer el código fuente varias veces antes de poder producir el código máquina. Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.
  • 4. Generalmente un compilador se divide en dos partes: * Front End: parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Parte que suele ser independiente de la plataforma o sistema operativo para el que funcionará. * Back End: parte en donde se genera el código máquina exclusivo para una plataforma a partir de lo analizado en el front end. Por lo general el resultado del back end no puede ser ejecutado directamente, se necesita pasar por un proceso de enlazado (linker).
  • 5. El lenguaje de programación Java , fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un lenguaje que pudiera funcionar en redes computacionales heterogéneas ( redes de computadoras formadas por más de un tipo de computadora, ya sean PC, MAC's, estaciones de trabajo , etc.),y que fuera independiente de la plataforma en la que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse en cualquier máquina o plataforma.
  • 6. Evitar errores de memoria Imposibilitar acceso al SO Evitar que caiga la máquina sobre la que corre Ausencia de punteros: Protege frente a imitación de objetos, violación de encapsulación, acceso a áreas protegidas de memoria, ya que el programador no podrá referenciar posiciones de memoria específicas no reservadas, a diferencia de lo que se puede hacer en C y C++.
  • 7. Es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET . Esta es una interfaz de programación de aplicaciones ( API ), mientras que C es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma
  • 8. Microsoft.NET framework SDK (siglas en inglés de software development kit) es generalmente un conjunto de herramientas de desarrollo de software que le permite al programador crear aplicaciones para un sistema concreto, por ejemplo ciertos paquetes de software, frameworks, plataformas de hardware, computadoras, videoconsolas, sistemas operativos, etc. incluye un compilador de C Microsoft Visual Studio versión 2002, 2003, 2005, 2008 y 2010 Mono .NET desarrollado por Novell . Como parte de esta implementación se incluye un compilador de C . Delphi 2006, de Borland Software Corporation. dotGNU Portable.NET , de la Free Software Foundation .
  • 9. Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas . Es un lenguaje muy flexible que permite programar con múltiples estilos. Un sistema de tipos que impide operaciones sin sentido. Usa un lenguaje de pre procesado , el preprocesador de C , para tareas como definir macros e incluir múltiples archivos de código fuente . Acceso a memoria de bajo nivel mediante el uso de punteros . Interrupciones al procesador con uniones . Un conjunto reducido de palabras clave
  • 10. Cualquier lenguaje puede ser ejecutado tanto vía intérprete o vía compilador, pero algunos lenguajes suelen asociarse más a una vía que a la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes compilados" respectivamente. También existen intérpretes que incluyen cierta "compilación" en el medio. Son aquellos que compilan a un código intermedio llamado bytecode, que es más eficiente de ejecutar que hacerlo directamente desde el código fuente. En general, la principal desventaja de los intérpretes, es que cuando un programa es interpretado, suele ejecutarse más lento que si el mismo programa estuviese compilado. Esto se debe a que el intérprete debe analizar cada sentencia en el programa en cada ejecución (un análisis en tiempo real). También el acceso a variables es más lento en un intérprete, porque mapear los identificadores para almacenar las localizaciones debe hacerse repetidas veces en tiempo real.
  • 11. Un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase de un compilador consistente en un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes léxicos) o símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la entrada para el analizador sintáctico (en inglés parser). Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.
  • 12. GRAMÁTICA LÉXICA La especificación de un lenguaje de programación a menudo incluye un conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente en expresiones regulares que indican el conjunto de posibles secuencias de caracteres que definen un Token o lexema. En algunos lenguajes de programación es necesario establecer patrones para caracteres especiales (como el espacio en blanco) que la gramática pueda reconocer sin que constituya un Token en sí. ANÁLISIS Esta etapa está basada usualmente en una máquina de estados finitos. Esta máquina contiene la información de las posibles secuencias de caracteres que puede conformar cualquier Token que sea parte del lenguaje (las instancias individuales de estas secuencias de caracteres son denominados lexemas). Por ejemplo, un Token de naturaleza entero puede contener cualquier secuencia de caracteres numéricos.
  • 13. El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo un árbol de análisis o árboles de sintaxis abstracta. El análisis sintáctico también es un estado inicial del análisis de frases de lenguaje natural. Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto.
  • 14. Tipos generales de analizadores sintácticos para gramáticas: a) Análisis sintáctico descendente. Construye árboles de análisis sintáctico desde arriba (raíz) hacia abajo (hojas). El análisis se realiza de lo general a lo particular. b) Análisis sintáctico ascendente. Construyen árboles de análisis sintáctico comenzando en las hojas y suben hacia la raíz. El análisis se realiza de lo particular a lo general. En ambos casos, se examina la entrada al analizador léxico de izquierda a derecha, un símbolo a la vez.
  • 15. ANALISIS SINTACTICO DESCENDENTE Se considera un intento de encontrar una derivación por la izquierda para una cadena de entrada. También se puede considerar como un intento de construir un árbol de análisis sintáctico para la entrada comenzando desde la raíz y creando nodos del árbol en orden previo. ANALISIS SINTACTICO ASCENDENTE El análisis sintáctico ascendente intenta construir un árbol para la cadena de entrada que comienza por las hojas (el fondo) y avanza hacia la raíz (la cima). ANÁLISIS SINTÁCTICO POR PRECEDENCIA DE OPERADORES Para una pequeña clase de gramáticas se puede construir con facilidad a mano eficientes analizadores sintácticos ascendentes. Estás gramáticas, por precedencia de operadores, tienen la propiedad de que ningún lado derecho de la producción es є ni tiene 2 terminales adyacentes. Una gramática con esta última propiedad de denomina gramática de operadores.
  • 16. ANALIZADORES SINTÁCTICOS IZQUIERDA-DERECHA Es una técnica eficiente de análisis sintáctico ascendente que se puede utilizar para analizar una amplia clase de gramáticas independientes de contexto, denominada Análisis sintáctico LR(k) L es por el examen de la entrada de izquierda a derecha (left to right) R por construir una derivación por la derecha (right most derivation) en orden inverso. K por el número de símbolos de entrada de examen por anticipado utilizados para tomar decisiones del análisis sintáctico. Cuando se omite, se asume que k es 1. Este análisis es atractivo por varias razones: • Reconocen prácticamente todas las construcciones de los lenguajes de programación para los que se pueden escribir gramáticas independientes del contexto. • Puede detectar un error sintáctico tan pronto como sea posible hacerlo en un examen de izquierda a derecha de la entrada.
  • 17. Que es la semántica? Se refiere a los aspectos del significado, sentido o interpretación del significado de un determinado elemento, símbolo, palabra, expresión o representación formal. Análisis semántico Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.
  • 18. Que es un árbol semántico? Es una estructura jerárquica en la cual se registran las operaciones que implica u operan dentro del programa fuente En cada una de las ramas del árbol semántico se registra el valor o significado que este debe tener, y el análisis semántico se encarga de terminar cual de los valores registrados en las ramas es aplicable. Ejemplo: Suponiendo que tenemos esta línea de código en C: res=valor1+valor2; El análisis semántico se va a encargar que tanto el valor1 como el valor2 tengan datos que son compatibles en común y que además se les pueda aplicar dicho operador. En C el símbolo (+) implica una suma de valores o una unión de las cadenas
  • 19. Tabla de símbolos Un compilador necesita guardar y usar la información de los objetos que se va encontrando en el texto fuente, como variables, etiquetas, declaraciones de tipos, etc. Esta información se almacena en una estructura de datos interna conocida como tabla de símbolos. El compilador debe desarrollar una serie de funciones relativas a la manipulación de esta tabla como insertar un nuevo elemento en ella, consultar la información relacionada con un símbolo, borrar un elemento, etc. Como se tiene que acceder mucho a la tabla de símbolos los accesos deben ser lo más rápidos posible para que la compilación sea eficiente.
  • 20.
  • 21.
  • 22. Generación de código – Se realiza mientras se analiza el programa – “Libre del contexto” Optimización – Se realiza después de la generación de código de todo el programa o de un elemento ejecutable del programa (función, procedimiento, etc). – “Dependiente del contexto”
  • 23. Se ejecuta todo junto. Mientras se analiza se genera código Generación de Código y Optimización
  • 24. Optimización • Objetivo – Obtener código que se ejecuta más eficientemente según los criterios • Tiempo de ejecución (optimización temporal) • Espacio de memoria utilizado (optimización espacial) • Funcionamiento – Revisa el código generado a varios niveles de abstracción y realiza las optimizaciones aplicables al nivel de abstracción • Representaciones de código intermedio de más a menos Abstractas – Árbol sintáctico abstracto: optimizar subexpresiones redundantes, reducción de frecuencia, etc. – Ensamblador/Código máquina: convertir saltos a saltos cortos,reordenar instrucciones
  • 25. Optimización • Funcionamiento (continuación) – Representaciones de código para extraer información. • Condiciones que se han de cumplir – El código optimizado se ha de comportar igual que el código de partida excepto por ser más rápido o ocupar menos espacio. – Hay que buscar transformaciones que no modifiquen el comportamiento del código según el comportamiento definido para el lenguaje de programación. Ejemplo • Si no se ha definido el orden de evaluación de los operandos la siguiente optimización es válida B=2*A+(A=c*d); Pasar a A=c*d; B=A*2;
  • 26. BLOQUE BÁSICO • Un bloque básico es un fragmento de código que tiene una única entrada y salida, y cuyas instrucciones se ejecutan secuencialmente. Implicaciones: – Si se ejecuta una instrucción del bloque se ejecutan todas en un orden conocido en tiempo de compilación. • La idea del bloque básico es encontrar partes del programa cuyo análisis necesario para la optimización sea lo más simple posible.
  • 27. El compilador tiene que: –Reportar clara y exactamente la presencia de errores –Recuperarse de cada error lo suficientemente rápido para poder detectar errores subsiguientes –Tratar de evitar mensajes falsos de error Tipos de Errores •Léxicos •Sintácticos •Semánticos •Lógicos
  • 28. Errores Léxicos •Un error que produce un token erróneo •Errores léxicos posibles –Un identificador, palabra reservada u operador mal escrito (typo) Errores Sintácticos Un error de sintaxis se detecta cuando el analizador sintáctico espera un símbolo que no corresponde al que se acaba de leer. Los analizadores sintácticos tienen la ventaja de que pueden detectar errores sintácticos lo más pronto posible, es decir, se genera un mensaje de error en cuanto el símbolo analizado no sigue la secuencia de los símbolos analizados hasta ese momento. –Expresión aritmética con paréntesis no balanceados –Un punto y coma faltante
  • 29. Errores Semánticos •Un error que necesita información sensitiva al contexto para ser identificado •Ejemplos –Un operador aplicado a un tipo incompatible de operando –Accesar una variable no declarada Errores Lógicos •Errores en el modelo de ejecución •Ejemplos –Recursión infinita –Accesar un arreglo fuera de los límites –Diferenciar un null
  • 30. Una tabla de símbolos es una estructura de datos que usa el proceso de traducción de un lenguaje de programación, por un compilador o un intérprete, donde cada símbolo en el código fuente de un programa está asociado con información tal como la ubicación, el tipo de datos y el ámbito de cada variable, constante o procedimiento. Puede tratarse como una estructura transitoria o volátil, que sea utilizada únicamente en el proceso de traducción de un lenguaje de programación, para luego ser descartada, o integrada en la salida del proceso de compilación para una explotación posterior, como puede ser por ejemplo, durante una sesión de depuración, o como recurso para obtener un informe de diagnóstico durante o después la ejecución de un programa. Los símbolos en la tabla de símbolos pueden referirse a constantes, a funciones o a tipos de datos en el código fuente de un programa.
  • 31. La siguiente representa una serie de atributos que no es necesaria para todos los compiladores, sin embargo cada uno de ellos se puede utilizar en la implementación de un compilador particular. Nombre del identificador. Dirección en tiempo de ejecución a partir del cual se almacenara el identificador si es una variable. Tipo del identificador. Si es una función el tipo que devuelve la función. Número de dimensiones del array (arreglo), o número de miembros de una estructura o clase, o números de parámetros si se trata de una función. Tamaño máximo o rango de cada una de las dimensiones de los array, si tiene dimensión estática. Etc.