• Like
Contenido
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Published

 

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
805
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
7
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES1. COMPILADOR Un compilador no es más que un traductor, es decir, un programa que nos permitepasar información de un lenguaje a otro. Por ejemplo, un compilador de C nos permitetraducir ficheros escritos en lenguaje C a un lenguaje legible para la máquina(ensambladora). En este proceso de compilación no siempre es directo. Esto quiere decir que nospermite que un lenguaje A lo queremos traducir a un lenguaje B, no siempre serárecomendable traducir directamente de A a B, si no que puede ser conveniente usar unlenguaje intermedio (que llamaremos X) y entonces diseñaremos un traductor de A a X, yotro de X a B. En este caso, el primer traductor recibe el nombre de front-end mientrasque el segundo se llama back-end. El lenguaje A es el lenguaje fuente y el lenguaje B esel lenguaje objeto o destino. En el caso de que el lenguaje fuente sea un lenguaje de programación de alto nivel yel objeto sea un lenguaje de bajo nivel (ensamblador o código de máquina), a dichotraductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguajefuente es el lenguaje ensamblador. Un intérprete no genera un programa equivalente, sinoque toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce alcódigo equivalente y al mismo tiempo lo ejecuta, con la escasez de memoria de losprimeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores,pues el programa fuente sin traducir y el intérprete juntos daban una ocupación dememoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompañados de unintérprete de BASIC (Spectrum, Commodore VIC-20, PC XT de IBM, etc.). La mejorinformación sobre los errores por parte del compilador así como una mayor velocidad deejecución del código resultante hizo que poco a poco se impusieran los compiladores. Hoyen día, y con los problemas de las memorias prácticamente resueltas, se puede hablar deun gran predominio de los compiladores frente a los intérpretes, aunque intérpretes comolos incluidos a los navegadores de Internet para interpretar el código JVM de Java son lagran excepción. Ventajas de compilar frente a interpretar:• Se compila una vez, se ejecutan varias veces.• En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas veces una línea como veces se repite el bucle.• El compilador tiene una visión global del programa, por lo que la información de mensajes de error es más detallada.• Ventajas del intérprete frente al compilador.• Un intérprete necesita menos memoria que un compilador. En principio eran más abundantes dado que los ordenadores tenían poca memoria.• Permiten una mayor interactividad con el código en tiempo de desarrollo. Un compilador no es un programa que funciona de manera aislada, sino que necesitade otros programas para conseguir su objetivo, para obtener un programa ejecutable apartir de un programa fuente en un lenguaje de alto nivel. Algunos de esos programas sonpreprocesados, el linker, el depurador y el ensamblador. El preprocesado se ocupadependiendo del lenguaje de incluir ficheros, expandir macros, eliminar comentarios, yotras tareas similares.CISNERO, ADRIAN 1JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 2. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES Los linker se encargan de construir el fichero ejecutable añadiendo al fichero objetogenerado por el compilador las cabeceras necesarias y las funciones de librería utilizadaspor el programa fuente. Algunos se encargan de depurador permitiendo asi el compiladorha generado adecuadamente el programa objeto, seguir paso a paso la ejecución de unprograma. Finalmente, muchos compiladores, en vez de generar código objeto, generanun programa en lenguaje ensamblador que debe después convertirse en un ejecutablemediante un programa ensamblador. 1.1. CARACTERÍSTICAS DE LOS COMPILADORGeneralmente un compilador se divide en dos partes:* Front End: parte que analiza el código fuente, comprueba su validez, genera el árbol dederivación y rellena los valores de la tabla de símbolos. Parte que suele ser independientede las plataformas sistema operativo para el que funcionará.* Back End: parte en donde se genera el código máquina exclusivo para una plataforma apartir de lo analizado en el front end. Por lo general el resultado del back end no puede ser ejecutado directamente, senecesita pasar por un proceso de enlazado (linker). Existen varios tipos de compiladores: Compiladores cruzados, Compiladoresoptimizadores, Compiladores de una sola pasada, Compiladores de varias pasadas,Compiladores JIT. Para el uso de la informática como herramienta de ayuda a la medicina es unarealidad en auge. Desde hace algún tiempo muchas de las actividades humanas se hanbasado en la repetición, en algunos cálculos y del mismo modo que se inventaronoperaciones matemáticas básicas para simplificarlas, surgió la necesidad de mejorar laslimitadas prestaciones que ofrece la mente del hombre para calcular, a medida que lasdiversas ciencias se hicieron más complejas.CISNERO, ADRIAN 2JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 3. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES Las primeras aplicaciones desarrolladas fueron dirigidas a resolver tareas (task-oriented) centradas en ciertos servicios o departamentos, siendo sus típicos usuariossecretarias o técnicos empleados para la introducción de datos, usándose sobre todo confines administrativos, análisis financieros, manejo de bases de datos, sistemas deinformación de laboratorios o servicios de radiología. Estas aplicaciones han tenido un gran impacto desde el punto de vistaadministrativo o de organización, pero no están dirigidos a las tareas propiamentemédicas, aunque han contribuido a reducir el tiempo dedicado a acceder a este tipo dedatos. Posteriormente el mayor beneficio para las actividades propiamente médica hasido la posibilidad de acceder a la bibliografía médica de una forma rápida mediante laaparición de las bases de datos bibliográficos inicialmente en cederrón y actualmente através de INTERNET y en los últimos años, se intenta realizar aplicaciones informáticasque vayan dirigidas a resolver problemas (problem-based), más cercanas a la prácticamédica, pero encontramos algunos problemas basados fundamentalmente en la ausenciade comprensión de cual es el proceso que seguimos los médicos para tomar una decisióny en la forma de representar el conocimiento y el proceso de razonamiento dentro delordenador. En estos últimos años se han añadido nuevas aplicaciones informáticas a lamedicina, como son las publicaciones electrónicas biomédicas, la telemedicina, impulsadacon un gran auge de INTERNET y su World Wide Web y los registros informáticos de lahistoria clínica. Hemos agregado sobre todo en sistemas privados por el pago porservicio, que obliga a un gran detalle de las actuaciones médicas para identificar el costode beneficio, precisando crear registros informáticos de alta calidad. La telemedicina es quizá, la que más ventajas aporta y con la que se puedeobtener reducción de costos, al poder establecer comunicación con lugares lejanos delmundo, gracias a INTERNET y a los satélites de comunicación, evitando desplazamientosinnecesarios y comunicaciones rápidas entre médicos, otros miembros del sistemasanitario e incluso los propios pacientes. En la informática se ha introducido una nueva dimensión en el pensamientohumano, haciendo reales los sueños. No obstante, las aplicaciones informáticas para elmanejo clínico del paciente siguen estando en el campo de los proyectos, con honrosasexcepciones, existiendo pocos sistemas que sean operativos de una forma generalizada. Los avances en esta tecnología y en el desarrollo de redes de información van apermitir una reducción de costos y un aumento en la calidad del cuidado de nuestrospacientes. El cambio en la enseñanza de las ciencias médicas permitirá entender alordenador como una importante herramienta de trabajo, que además permitirá cambiar laactual forma memorística e intuitiva de la actuación médica a una forma basada en unaCISNERO, ADRIAN 3JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 4. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESestructura con una mayor base de conocimientos, un proceso analítico de los mismos yuna mayor eficacia en la toma de decisiones. El médico no solo quedará apoyado por el ordenador sino que se mantendrá liberadode sus tareas más repetitivas y tediosas, pasará a ser el eje sobre el que se apoye todo elsoporte informático, al actuar como selector y controlador de los datos de entrada, creadorde los protocolos y algoritmos que éste seguirá, interpretando, además, sus resultados ypor lo tanto siendo el máximo responsable del sistema. 1.2. FASES DE LOS COMPILADOR En el llamado análisis léxico, el compilador revisa y controla que las palabras esténbien escritas y pertenezcan a algún tipo de token definido dentro del lenguaje, como porejemplo que sea algún tipo de palabra reservada, o si es el nombre de una variable queeste escrita de acuerdo a las pautas definidas del lenguaje. En esta etapa se crea la tablade símbolos, la cual contiene las variables y el tipo de dato al que pertenece, lasconstantes literales, el nombre de funciones y los argumentos que reciben. El análisis semántico se encarga de revisar que cada agrupación o conjunto detoken tenga sentido, y no sean muy absurdo. En esta etapa se reúne la información sobrelos tipos para la fase posterior, en la otra etapa se utilizara la estructura jerárquica de laetapa anterior y así poder determinar los operadores, y operando de expresiones ypreposiciones. En el análisis sintáctico como su nombre lo indica se encarga de revisar que lostokens estén ubicados y agrupados de acuerdo a la definición del lenguaje. Dicho esto deotra manera, que los tokens pertenezcan a frases gramaticales validas, que el compiladorutiliza para sintetizar la salida. Por lo general las frases gramaticales son representadaspor estructuras jerárquicas, por medio de árboles de análisis sintáctico. En esta secompleta la tabla de símbolos con la dimensión de los identificadores y los atributosnecesarios. Generación de código intermedio, aunque algunos compiladores no la tienen, esbueno saber que existen, en esta etapa se lleva el código del programa fuente a uncódigo interno para poder trabajar más fácilmente sobre él. Esta representación internadebe tener dos propiedades, primero debe ser fácil de representar y segundo debe serfácil de traducir al código objeto. Optimización de código, se busca obtener el código más corto y rápido posible,utilizando distintos algoritmos de optimización. Etapa de generación de código, se lleva el código intermedio final a códigomaquina o código objeto, que por lo general consiste en un código maquina re localizableo código ensamblador. Se selecciona las posiciones de memoria para los datos variablesy se traduce cada una de las instrucciones intermedias a una secuencia de instruccionesde maquina puro.CISNERO, ADRIAN 4JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 5. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES La tabla de símbolos no es una etapa del proceso de compilación, sino que unatarea, una función que debe realizar el proceso de compilación. En ella se almacenan losidentificadores que aparecen en el código fuente puro, como así también los atributos delos mismos, su tipo, su ámbito y en el caso de los procedimientos el número deargumentos el tipo del mismo. En otras palabras una tabla de símbolos es una estructurade datos, que contiene un registro por cada identificador, y sus atributos. La tabla desímbolo es accedida tanto para escritura como parar lectura por todas las etapas. Los detectores de errores o manejador de errores, al igual que la tabla de símbolosno es una etapa del proceso de compilación, si no que es una función, muy importante,pues al ocurrir un error esta función debe tratar de alguna forma el error para así seguircon el proceso de compilación la mayoría de errores son detectados en las etapas deanálisis léxico, análisis sintáctico, análisis semántico. 1.3. ESTRUCTURACION DE LOS COMPILADORES La estructura de un compilador, está dividida en cuatro grandes módulos, cadauno independiente del otro, se podría decir que un compilador está formado por cuatrosmódulos más a su vez. El primero de ellos es el preprocesador, es elencargado de transformar el código fuente de entrada originalen el código fuente puro. Es decir en expandir las macros,CISNERO, ADRIAN 5JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 6. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESincluir las librerías, realizar un preprocesado racional con la capacidad de enriquecer aun lenguaje antiguo con recursos más modernos, extender el lenguaje y todo aquelloque en el código de entrada sea representativo de una abreviatura para facilitar laescritura del mismo.En el segundo modulo encontramos compilación que recibe el código fuente puro, estees él modulo principal de un compilador, pues si ocurriera algún error en esta etapa elcompilador no podría avanzar. En esta etapa se somete al código fuente puro deentrada a un análisis léxico gráfico, a un análisis sintáctico, a un análisis semántico, queconstruyen la tabla de símbolos, se genera un código intermedio al cual se optimizapara así poder producir un código de salida generalmente en algún lenguajeensamblador. Para este tercer modulo es el llamado modulo de ensamblado, este modulo noes ni más mi menos que otro compilador pues recibe un código fuente de entradaescrito en ensamblador, y produce otro código de salida, llamado código binario noenlazado. Si por un momento viéramos a este modulo como un programaindependiente, veríamos que en este caso los términos programa compilador y procesode compilación son los mismos. Pues este modulo no es mas que un compilador, que en su interior realiza comosu antecesor un análisis léxico gráfico, un análisis sintáctico, un análisis semántico,crea una tabla de símbolos, genera un código intermedio lo optimiza y produce uncódigo de salida llamado código binario no enlazado, y a todo este conjunto de tares selos denomina proceso de compilación. Como se puede ver este compilador (llamado ensamblador) a diferencia de losdemás compiladores no realiza una expansión del código fuente original (código fuentede entrada), tiene solamente un proceso de compilación y por supuesto no enlaza elcódigo fuente. Es un compilador que carece de los módulos de preprocesado yenlazado, y donde los módulos de compilación y ensamblado son los mismos.CISNERO, ADRIAN 6JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 7. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESEl cuarto y ultimo modulo es el encargado de realizar el enlazado del código de fuentede entrada (código maquina re localizable) con las librerías que necesita, como asítambién de proveer al código de las rutinas necesarias para poder ejecutarse ycargarse a la hora de llamarlo para su ejecución, modifica las direcciones relocalizables y ubica los datos en las posiciones apropiadas de la memoria. Este ultimo modulo es el que produce como salida el código binario enlazado.Ya sea dinámico o estático, al decir dinámico se refiere a que el código producido utilizalibrerías dinámicas (librerías ya cargadas en el sistema), esto implica que se obtendráun código más corto y que se actualizara automáticamente si aparece alguna nuevaversión de las librerías, mientras que el estático se refiere al echo que no se realizaenlace con ninguna librería y por lo tanto se obtendrá un código mas largo con unacopia de las rutinas de librería que necesita.2. ELEMENTOS DE UN COMPILADORElementos primariosElemento DescripciónElemento Elemento raíz de cada archivo de configuración usado por las<configuration> aplicaciones de Common Language Runtime y .NET Framework.<system.codedom> Especifica las opciones de configuración del compilador para los(Elemento) proveedores de lenguaje disponibles.Elemento <compilers> Contenedor de elementos de configuración del compilador; contieneCISNERO, ADRIAN 7JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 8. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES el cero o más elementos <compiler>.Elementos secundariosElemento Descripción<providerOption> Especifica los atributos de versión del compilador para un proveedor(Elemento) de lenguaje. 2.1. TIPOS DE COMPILADORES Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puedehaber compiladores que se adscriban a varias categorías:Compiladores cruzados: generan código para un sistema distinto del que estánfuncionando.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 únicalectura del código fuente.Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes depoder producir el código máquina.Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes delcódigo según se necesitan. Pauta de creación de un compilador: En las primeras épocas de la informática, elsoftware de los compiladores era considerado como uno de los más complejos existentes. Los primeros compiladores se realizaron programándolos directamente enlenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, sepueden escribir nuevas versiones del compilador (u otros compiladores distintos) en ellenguaje que compila ese compilador. Actualmente existen herramientas que facilitan la tarea de escribir compiladores óintérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizadorsintáctico a partir de una definición formal del lenguaje de partida, especificadanormalmente mediante una gramática formal y barata, dejando únicamente alprogramador del compilador la tarea de programar las acciones semánticas asociadas3. EMSAMBLADORCISNERO, ADRIAN 8JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 9. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES El ensamblador se refiere a un tipo de programa, informático que se encarga detraducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto quecontiene código máquina ejecutable directamente por la máquina para la que se hagenerado. Los lenguajes ensambladores fueron desarrollados hace muchos años atrás,cuando fueron referidos como lenguajes de programación de segunda generación. Porejemplo, el SOAP (Symbolic Optimal Assembly Program) era un lenguaje ensambladorpara el computador IBM 650. Los lenguajes ensambladores eliminaron mucha de lapropensión a errores y del consumo de tiempo de la programación de los lenguajes deprimera generación que se necesitaban con los primeros computadores, liberando a losprogramadores como recordar códigos numéricos y cálculo de direcciones. Una vez fueron ampliamente usados para todo tipo de programación. Sinembargo, los microcomputadores se usaban en gran parte suplantado por los lenguajesde alto nivel, en la búsqueda de una mejorada productividad en programación. Hoy endía, aunque el lenguaje ensamblador es casi siempre manejado y generado por loscompiladores, todavía se usa para la manipulación directa del hardware, acceso ainstrucciones especializadas del procesador, o para resolver problemas de desempeñocrítico. Los usos típicos son drivers de dispositivo, sistemas embebidos de bajo nivel, ysistemas de tiempo real. Un gran número de programas han sido escritos enteramente en lenguajeensamblador. Los sistemas operativos fueron casi exclusivamente escritos en lenguajeensamblador hasta la aceptación amplia del lenguaje de programación C. También,muchas aplicaciones comerciales fueron escritas en lenguaje ensamblador, incluyendouna gran cantidad del software escrito por grandes corporaciones para mainframes deIBM. Los lenguajes COBOL y FORTRAN eventualmente desplazaron mucho de estetrabajo, aunque un número de organizaciones grandes conservaran las infraestructurasde aplicaciones en lenguaje ensamblador. La mayoría de los primeros microcomputadores confiaron en el lenguajeensamblador codificado a mano, incluyendo la mayoría de los sistemas operativos y delas aplicaciones grandes. Esto era porque estos sistemas tenían limitaciones severasde recursos, impusieron idiosincráticas arquitecturas de memoria y de pantalla queproporcionaron servicios de sistema limitados con errores. Quizás más importante erala falta de compiladores de primera clase de lenguajes de alto nivel adecuados para eluso en el microcomputador. En un contexto más comercial, las más grandes razones para usar el lenguajeensamblador era hacer programas con mínimo tamaño, mínima sobrecarga, mayorvelocidad y confiabilidad. Los típicos ejemplos de programas grandes en lenguaje ensamblador de esetiempo son los sistemas operativos IBM PC DOS y aplicaciones tempranas tales comola hoja de cálculo Lotus 1-2-3, y casi todos los juegos populares para la familia Atari800 de computadores personales. La mayoría de los videojuegos de consola fueronescritos en ensamblador, incluyendo la mayoría de los juegos para la MegaDrive/Genesis y el Super Nintendo Entertainment System.CISNERO, ADRIAN 9JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 10. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES Según algunos insiders de la industria, el lenguaje ensamblador era el mejorlenguaje de programación a usar para obtener el mejor desempeño del Sega Saturn,una consola para la cual era notoriamente desafiante desarrollar y programar juegos. Elpopular juego de arcade NBA Jam es otro ejemplo. El ensamblador ha sido por largotrecho, el lenguaje de desarrollo primario en los computadores hogareños Commodore64, Atari ST, así como el ZX Spectrum. Esto fue así en gran parte porque los dialectos del BASIC en estos sistemasofrecieron insuficiente velocidad de ejecución, así como insuficientes característicaspara aprovechar completamente el hardware disponible. Algunos sistemas, másnotablemente el Amigo, incluso tienen IDEs con características de depuración y macrosaltamente avanzados, tales como el freeware ASM-One assembler, comparable a lasdel Microsoft Visual Studio (el ASM-Uno precede al Microsoft Visual Studio). El ensamblador para el VIC-20 fue escrito por Don French y publicado porFrench Silk. Con 1639 bytes de longitud, se cree que es el más pequeño ensambladorsimbólico jamás escrito. El ensamblador soportaba el direccionamiento simbólico usualy la definición de cadenas de caracteres o cadenas hexadecimales. También permitíaexpresiones de direcciones que podían combinarse con las operaciones de adición,substracción, multiplicación, división, AND lógico, OR lógico, y exponenciación. Han habido siempre debates sobre la utilidad y el desempeño del lenguajeensamblador relativo a lenguajes de alto nivel. El lenguaje ensamblador tiene algunasespecificaciones donde son importante. Pero, en general, los modernos compiladoresde optimización para traducir lenguajes de alto nivel en el código que puede correr tanrápidamente como el lenguaje ensamblador escrito a mano, a pesar de los contraejemplos que pueden ser encontrados. La complejidad de los procesadores modernos ydel subsistema de memoria hace la optimización efectiva cada vez más difícil para loscompiladores, así como para los programadores en ensamblador. Adicionalmente, ypara la consternación de los amantes de la eficiencia, el desempeño cada vez mayordel procesador ha significado que la mayoría de los CPU estén desocupados la mayorparte del tiempo, con retardos causados por embotellamientos predecibles tales comooperaciones de entrada/salida y paginación de memoria. Esto ha hecho la velocidad deejecución cruda del código un problema para muchos programadores. Hay algunas situaciones en las cuales los profesionales pudieran elegir utilizar ellenguaje ensamblador. Por ejemplo cuando: • es requerido un ejecutable binario independiente (stand-alone), es decir uno que deba ejecutarse sin recursos a componentes de tiempo de ejecución o a bibliotecas asociadas con un lenguaje de alto nivel; ésta es quizás la situación más común. Son programas empotrados que solo almacenan una pequeña cantidad de memoria y el dispositivo está dirigido para hacer tareas para un simple propósito. Ejemplos consisten en teléfonos, sistemas de combustible e ignición para automóviles, sistemas de control del aire acondicionado, sistemas de seguridad, y sensores. • interactuando directamente con el hardware, por ejemplo en drivers de dispositivo y manejadores de interrupción.CISNERO, ADRIAN 10JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 11. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES • usando instrucciones específicas del procesador no explotadas o disponibles por el compilador. Un ejemplo común es la instrucción de rotación bit wise en el núcleo de muchos algoritmos de cifrado. • creando funciones vectorizadas para programas en lenguajes de alto nivel como C. En el lenguaje de alto nivel esto es a veces ayudado por funciones intrínsecas del compilador que mapean directamente a los mnemónicos del SIMD, pero sin embargo resulta en una conversión de ensamblador de uno a uno para un procesador de vector asociado. • es requerida la optimización extrema, en un bucle interno en un algoritmo intensivo en el uso del procesador. Los programadores de juegos toman ventaja de las habilidades de las características del hardware en los sistemas, permitiendo a los juegos correr más rápidamente. También las grandes simulaciones científicas requieren algoritmos altamente optimizados, ej, álgebra lineal con BLAS o la transformada de coseno discreta la versión SIMD en ensamblador del x264, una biblioteca para codificar streams de video. • un sistema con severas limitaciones de recursos un sistema empotrado debe ser codificado a mano para maximizar el uso de los limitados recursos; pero esto está llegando a ser menos común a medida que el precio del procesador decrece y el desempeño mejora. • no existe ningún lenguaje de alto nivel, en un procesador nuevo o especializado. • escribiendo programas de tiempo real que necesitan sincronización y respuestas precisas, tales como sistemas de navegación de vuelo, y equipo médico. En un sistema fly-by-wire, vuelo por mandos eléctricos, la telemetría debe ser interpretada y hay que actuar dentro de limitaciones estrictas de tiempo. Tales sistemas deben eliminar fuentes de retrasos impredecibles, que pueden ser creados para algunos lenguajes interpretados, recolección de basura automática, operaciones de paginación, o multitarea preventiva. Sin embargo, algunos lenguajes de alto nivel incorporan componentes de tiempo de ejecución e interfaces de sistema operativo que pueden introducir tales retrasos. Elegir el ensamblador o lenguajes de bajo nivel para tales sistemas da a los programadores mayor visibilidad y control sobre el proceso de los detalles. • es requerido control total sobre el ambiente, en situaciones de seguridad extremadamente alta donde nada puede darse por sentado. • se escriben virus de computadora, bootloaders, ciertos drivers de dispositivo, u otros elementos muy cerca del hardware o al sistema operativo de bajo nivel • se escriben simuladores del conjunto de instrucciones para monitoreo, trazado y depuración de errores donde la sobrecarga adicional es mantenida al mínimo • se hace ingeniería inversa en binarios existentes que pueden o no haber sido escritos originalmente en un lenguaje de alto nivel, por ejemplo al crackear la protección anticopia del software propietario. • se hace ingeniería inversa y modificación de video juegos, también denominado ROM hacking, que es posible por medio de varios métodos. El más ampliamente implementado es alterando el código del programa a nivel de lenguaje ensamblador • se escribe código automodificable, algo para lo que el lenguaje ensamblador se presta bien • se escriben juegos y otros softwares para calculadoras gráficas • se escribe software compilador que genera código ensamblador, y por lo tanto los desarrolladores deben ser programadores de lenguaje ensamblador. • se escriben algoritmos criptográficos que siempre deben tomar estrictamente el mismo tiempo para ejecutar, previniendo ataques de tiempo.CISNERO, ADRIAN 11JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 12. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES Sin embargo, el lenguaje ensamblador es todavía enseñado en la mayoría de losprogramas de ciencias de la computación e ingeniería electrónica. Aunque hoy en día,pocos programadores trabajan regularmente con el lenguaje ensamblador como unaherramienta, los conceptos fundamentales continúan siendo muy importantes. Tales tópicos fundamentales, como aritmética binaria, asignación de memoria,procesamiento del stack, codificación de conjunto de caracteres, procesamiento deinterrupciones, y diseño de compiladores, serían duros de estudiar en detalle sin lacomprensión de cómo el computador opera a nivel del hardware. Puesto que elcomportamiento del computador es fundamentalmente definido por su conjunto deinstrucciones, la manera lógica de aprender tales conceptos es estudiar un lenguajeensamblador. La mayoría de los computadores modernos tienen un conjunto de instruccionessimilares. Por lo tanto, estudiar un solo lenguaje ensamblador es suficiente para aprender:i) los conceptos básicos; ii) reconocer situaciones donde el uso de lenguaje ensambladorpuede ser apropiado; y iii) ver cómo el código ejecutable eficiente puede ser creado porlos lenguajes de alto nivel18 El lenguaje ensamblador hard-coded es típicamente usado en el ROM de arranquedel sistema (BIOS en los sistemas compatible IBM PC). Este código de bajo nivel esusado, entre otras cosas, para inicializar y probar el hardware del sistema antes de cargarel sistema operativo, y está almacenado en el ROM. Una vez que ha tomado lugar uncierto nivel de inicialización del hardware, la ejecución se transfiere a otro código,típicamente escrito en lenguajes de alto nivel; pero el código corriendo inmediatamentedespués de que es aplicada la energía usualmente está escrito en lenguaje ensamblador.Lo mismo es cierto para los boot loaders. Muchos compiladores traducen lenguajes de alto nivel a lenguaje ensambladorprimero, antes de la compilación completa, permitiendo que el código en ensamblador seavisto para propósitos de depuración y optimización. Lenguajes de relativo bajo nivel, comoC, con frecuencia proveen sintaxis especial para empotrar lenguaje ensamblador en cadaplataforma de hardware. El código portable del sistema entonces puede usar estoscomponentes específicos a un procesador a través de una interface uniforme. El lenguaje ensamblador también es valioso en ingeniería inversa, puesto quemuchos programas solamente son distribuidos en una forma de código de máquina. Elcódigo de máquina es usualmente fácil de trasladar hacia lenguaje ensamblador paraluego ser cuidadosamente examinado en esta forma, pero es muy difícil de trasladar haciaun lenguaje de alto nivel. Herramientas como Interactive Disassembler, hacen usoextenso del desensamblador para tales propósitos. Un nicho que hace uso del lenguaje ensamblador es el demoscene. Ciertascompeticiones requieren a los concursantes restringir sus creaciones a un muy pequeñotamaño 256 bytes, 1 KB, 4 KB ó 64 KB, y el lenguaje ensamblador es el lenguaje depreferencia para alcanzar este objetivo. Cuando los recursos son una preocupación, es una necesidad la codificación enensamblador, especialmente en sistemas constreñidos por el procesamiento del CPU,como los primeros modelos del Amiga, y el Commodore 64. El código optimizado enCISNERO, ADRIAN 12JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 13. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESensamblador es escrito "a mano" por los programadores en un intento de minimizar elnúmero de ciclos de CPU usados. Las limitaciones del CPU son tan grandes que cadaciclo cuenta. Usar tales métodos ha habilitado, a sistemas como el Commodore 64, paraproducir gráficos en 3D en tiempo real con efectos avanzados, una hazaña que puede serconsiderada improbable o incluso imposible para un sistema con un procesador de 0.99MHz.4. ÁRBOLES PARTE SEMANTICAS. Hemos visto que las deducciones pueden hacerse atendiendo a los problemas dederivación, realizándose esta última a través de la aplicación de las reglas básicas oderivadas. Pero también podemos utilizar otro criterio: el semántico, según el cual, ysuponiendo que la deducción sea correcta, no podemos obtener una conclusión falsa depremisas verdaderas. La semántica atiende por una parte al hecho al que se refiere laproposición y, por otra parte, a su valor de verdad. El método de las tablas semánticas supone una búsqueda de contraejemplos queinvaliden el argumento. Es una especie de reducción al absurdo, en la que se supone laverdad de la negación de la conclusión y, a partir de ella, se llega a una contradicción.CISNERO, ADRIAN 13JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 14. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESCISNERO, ADRIAN 14JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 15. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES 4.1. COMO SE IDENTIFICAN El analizador semántico verificara que en este caso cada operador tenga losoperadores permitidos.=/id1 +/id2 +/id3 tipo_ent|105. GRAMATICA BNFUna especificación de BNF es un sistema de reglas de derivación, escrito como:<simbolo> ::= <expresión con símbolos>donde <símbolo> es un no terminal, y la expresión consiste en secuencias de símbolos osecuencias separadas por la barra vertical, |, indicando una opción, el conjunto es unaposible substitución para el símbolo a la izquierda. Los símbolos que nunca aparecen enun lado izquierdo son terminales.EjemploComo ejemplo, considere este BNF para una dirección postal de los EE.UU.<dirección postal> ::= <nombre> <dirección> <apartado postal><personal> ::= <primer nombre> | <inicial> "."<nombre> ::= <personal> <apellido> [<trato>] <EOL> | <personal> <nombre><dirección> ::= [<dpto>] <número de la casa> <nombre de la calle> <EOL><apartado postal> ::= <ciudad> "," <código estado> <código postal> <EOL>Esto se traduce a español como: • Una dirección postal consiste en un nombre, seguido por una dirección, seguida por un apartado postal. • Una parte "personal" consiste en un nombre o una inicial seguido(a) por un punto. • Un nombre consiste de: una parte personal seguida por un apellido seguido opcionalmente por una jerarquía o el trato que se la da a la persona (Jr., Sr., o número dinástico) y un salto de línea (end-of-line), o bien una parte personal seguida por un nombre (esta regla ilustra el uso de la repetición en BNFs, cubriendo el caso de la gente que utiliza múltiples nombres y los nombres medios o las iniciales).CISNERO, ADRIAN 15JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 16. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES • Una dirección consiste de una especificación opcional del departamento, seguido de un número de casa, seguido por el nombre de la calle, seguido por un salto de línea (end-of-line). • Un apartado postal consiste de una ciudad, seguida por una coma, seguida por un código del estado (recuerde que es un ejemplo que ocurre en EE.UU.), seguido por un código postal y este seguido por un salto de línea (end-of-line). Observe que muchas cosas (tales como el formato de una parte personal, de unaespecificación del apartamento, o código postal) están dejadas sin especificar aquí. Si esnecesario, pueden ser descritas usando reglas adicionales de BNF, o dejadas comoabstracción si es inaplicable para el propósito actual.Otros ejemplosBastante interesante, la sintaxis de BNF se puede representar en BNF como sigue:<syntax> ::= <rule> [<syntax>]<rule> ::= <whitespace> "<" <rule-name> ">" <whitespace> "::=" <expression> <whitespace> <line-end><expression> ::= <whitespace> <or-expression><or-expression> ::= <whitespace> <list-expression> [ "|" <or-expression> ]<list-expression> ::= <whitespace> ("<" <rule-name> ">" | <QUOTE> <text> <QUOTE> | "(" <expression> ")" | "[" <expression> "]") [<list-expression>]<whitespace> ::= [" " <whitespace>]<line-end> ::= [<whitespace>] <EOL> [<line-end>] Esto asume que no hay Whitespace necesario para la interpretación apropiada dela regla. El <QUOTE> se presume para ser el carácter ", y el <EOL> para ser el fin delínea apropiado especificado (en ASCII, retorno de carro o línea nueva, dependiendo delsistema operativo). El <rule-name> y el <text> deben ser substituidos con nombre/etiquetao el texto literal de una regla declarada, respectivamente. Hay muchas variantes y extensiones de BNF, posiblemente conteniendo algunos otodos los comodines de expresiones regulares como un "*" o "+". El Extended Backus-Naur form (EBNF) es una variante común. De hecho el ejemplo anterior no es la formapura inventada para el informe del ALGOL 60. La notación de los corchetes "[ ]" fueintroducida algunos años más tarde en la definición de PL/I de la IBM pero ahora sereconoce universal. La ABNF es otra extensión usada comúnmente para describirprotocolos del IETF. Las expresiones gramaticales de analizadores sintácticos construidas en BNF y lasnotaciones de expresión regular para formar una clase alternativa de la gramática formal,que es esencialmente analítica más que generativa en carácter. Muchas especificaciones de BNF disponibles en línea tienen como propósito serlegibles a simple vista y no son especificaciones formales. Estas incluyen con frecuenciaalgunas de estas reglas sintácticas y extensiones:CISNERO, ADRIAN 16JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 17. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES • Elementos opcionales son presentados entre paréntesis cuadrados. Por ejemplo [<elemento-x>] • Los elementos que se repiten 0 o más veces son presentados entre paréntesis de llave o terminados con un asterisco. Por ejemplo <palabra> ::= <letra> {<letra>} • Los elementos que se repiten 1 o más veces son terminados con un + • Los terminales pueden aparecer en negrillas y los no-terminales en texto normal en lugar de utilizar itálicas o paréntesis de ángulo • Alternativas opcionales son separadas por el símbolo |Cuando se requiere agrupar varios elementos, se hace con paréntesis simple 5.1. SU DEFINICION La notación de Backus-Naur, también conocida por sus denominaciones inglesasBackus-Naur form (BNF), Backus-Naur formalism o Backus normal form, es unametasintaxis usada para expresar gramáticas libres de contexto: es decir, una maneraformal de describir lenguajes formales. El BNF se utiliza extensamente como notación para las gramáticas de loslenguajes de programación de la computadora, de los sistemas de comando y de losprotocolos de comunicación, así como una notación para representar partes de lasgramáticas de la lengua natural (por ejemplo, el metro en la poesía de Venpa). La mayoríade los libros de textos para la teoría o la semántica del lenguaje de programacióndocumentan el lenguaje de programación en BNF. Algunas variantes, tales como la Augmented Backus-Naur form (ABNF) y laExtended Backus–Naur Form (EBNF), tienen su propia documentación. Con la aparición de la notación BNF - desarrollada en primer lugar por Backusen 1960 cuando trabajaba en un borrador del ALGOL 60, modificada en 1963 por Naury formalizada por Knuth en 1964 - se tiene una guía para el desarrollo del análisissintáctico. Los diversos métodos de parsers ascendentes y descendentes sedesarrollan durante la década de los 60. En 1959, Sheridan describe un método deparsing de FORTRAN que introducía paréntesis adicionales alrededor de los operandospara ser capaz de analizar las expresiones. Más adelante, Floyd introduce la técnica dela precedencia de operador y el uso de las funciones de precedencia. A mitad de la década de los 60, Knuth define las gramáticas LR y describe laconstrucción de una tabla canónica de parser LR. Por otra parte, el uso por primera vezde un parsing descendente recursivo tuvo lugar en el año 1961. En el año 1968 seestudian y definen las gramáticas LL así como los parsers predictivos. También seestudia la eliminación de la recursión a la izquierda de producciones que contienenacciones semánticas sin afectar a los valores de los atributos. En los primeros años de la década de los 70, se describen los métodos SLR yLALR de parser LR. Debido a su sencillez y a su capacidad de análisis para una granvariedad de lenguajes, la técnica de parsing LR va a ser la elegida para losgeneradores automáticos de parsers. A mediados de los 70, Johnson crea el generadorCISNERO, ADRIAN 17JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 18. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESde analizadores sintácticos YACC para funcionar bajo un entorno UNIX . Junto alanálisis sintáctico, también se fue desarrollando el análisis semántico. La idea de transcribir la estructura del lenguaje con reglas de reescritura seremontan cuando menos al trabajo del gramático indio Panini (hacia el 460 a. C.), que lautilizó en su descripción de la estructura de palabras del idioma sánscrito (algunos inclusohan sugerido renombrar BNF a Forma Panini-Backus). Lingüïstas estadounidenses comoLeonard Bloomfield y Zellig Harris llevaron esta idea un paso más adelante al tratar deformalizar el lenguaje y su estudio en términos de definiciones formales y procedimientos(1920-1960). Noam Chomsky, maestro de lingüística de alumnos de teoría de la información delMIT, combinó la lingüística y las matemáticas, tomando esencialmente el formalismo deAxel Thue como la base de su descripción de la sintaxis del lenguaje natural. Tambiénintrodujo una clara distinción entre reglas generativas (de la gramática libre de contexto) yreglas transformativas (1956). John Backus, un diseñanor de lenguajes de programación de IBM, adoptó lasreglas generativas de Chomsky para describir la sintaxis del nuevo lenguaje deprogramación IAL, conocido en la actualidad como ALGOL 58 (1959), presentando en elprimer Congreso de Computación Mundial (World Computer Congress) el artículo "Thesyntax and semantics of the proposed international algebraic language of the Zurich ACM-GAMM Conference". Peter Naur, en su reporte sobre ALGOL 60 de 1963, identificó la notación deBackus como la Forma Normal de Backus (Backus Normal Form), y la simplificó parausar un conjunto de símbolos menor, pero a sugerencia de Donald Knuth, su apellido fueagregado en reconocimiento a su contribución, reemplazando la palabra "Normal" porNaur, dado que no se trata de una forma normal en ningún sentido, a diferencia, porejemplo de la Forma Normal de Chomsky.6. LAS MAQUINAS DE TURING Una máquina de Turing (MT) es un modelo computacional que realiza una lectura/escritura de manera automática sobre una entrada llamada cinta, generando una salidaen esta misma. Este modelo está formado por un alfabeto de entrada y uno de salida, un símboloespecial llamado blanco (normalmente b, Δ o 0), un conjunto de estados finitos y unconjunto de transiciones entre dichos estados. Su funcionamiento se basa en una funciónde transición, que recibe un estado inicial y una cadena de caracteres (la cinta, la cualpuede ser infinita) pertenecientes al alfabeto de entrada. La máquina va leyendo una celda de la cinta en cada paso, borrando el símboloen el que se encuentra posicionado su cabezal y escribiendo un nuevo símboloperteneciente al alfabeto de salida, para luego desplazar el cabezal a la izquierda o a laderecha (solo una celda a la vez). Esto se repite según se indique en la función detransición, para finalmente detenerse en un estado final o de aceptación, representandoasí la salida.CISNERO, ADRIAN 18JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 19. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES La entrada de una máquina de Turing viene determinada por el estado actual y elsímbolo leído, un par (estado, símbolo), siendo el cambio de estado, la escritura de unnuevo símbolo y el movimiento del cabezal, las acciones a tomar en función de unaentrada. En el caso de que para cada par (estado, símbolo) posible exista a lo sumo unaposibilidad de ejecución, se dirá que es una máquina de Turing determinista, mientras queen el caso de que exista al menos un par (estado, símbolo) con más de una posiblecombinación de actuaciones se dirá que se trata de una máquina de Turing nodeterminista.La función de transición δ en el caso no determinista, queda definida como sigue: ¿Cómo sabe una máquina no determinista qué acción tomar de las variasposibles? Hay dos formas de verlo: una es decir que la máquina es "el mejor adivinoposible", esto es, que siempre elige la transición que finalmente la llevará a un estado finalde aceptación. La otra es imaginarse que la máquina se "clona", bifurcándose en variascopias, cada una de las cuales sigue una de las posibles transiciones. Mientras que unamáquina determinista sigue un único "camino computacional", una máquina nodeterminista tiene un "árbol computacional". Si cualquiera de las ramas del árbol finalizaen un estado de aceptación, se dice que la máquina acepta la entrada. La capacidad de cómputo de ambas versiones es equivalente; se puede demostrarque dada una máquina de Turing no determinista existe otra máquina de Turingdeterminista equivalente, en el sentido de que reconoce el mismo lenguaje, y viceversa.No obstante, la velocidad de ejecución de ambos formalismos no es la misma, pues si unamáquina no determinista M reconoce una cierta palabra de tamañon en un tiempo , la máquina determinista equivalente reconocerá la palabra enun tiempo . Es decir, el no determinismo permitirá reducir la complejidad de lasolución de los problemas, permitiendo resolver, por ejemplo, problemas de complejidadexponencial en un tiempo polinómico.Una máquina de Turing con una sola cinta puede definirse como una 7-tupladonde:CISNERO, ADRIAN 19JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 20. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES • es un conjunto finito de estados. • es un conjunto finito de símbolos distinto del espacio en blanco, denominado alfabeto de máquina o de entrada. • es un conjunto finito de símbolos de cinta, denominado alfabeto de cinta ( ). • es el estado inicial. • es un símbolo denominado blanco, y es el único símbolo que se puede repetir un número infinito de veces. • es el conjunto de estados finales de aceptación. • es una función parcial denominada función de transición, donde es un movimiento a la izquierda y es el movimiento a la derecha. Existen en la literatura un abundante número de definiciones alternativas, pero todasellas tienen el mismo poder computacional, por ejemplo se puede añadir el símbolocomo símbolo de "no movimiento" en un paso de cómputo.7. ANALISIS SINTACTICO. Como ya sabemos la sintaxis en lógica es la forma correcta de escribir una fórmulay la semántica es lo que significa. Como en lógica solamente tenemos dos valores unafórmula solamente puede ser verdadera o falsa. Para determinar su valor seguimos lasreglas simples que dimos en las definiciones básicas de acuerdo a su tabla de verdad.Esto lo hacemos mediante interpretaciones. Una interpretación de una fórmula es unconjunto de valores que se les asignan a sus proposiciones atómicas. Al interpretar una fórmula lo que finalmente vamos a obtener es un valor deverdad, bien sea verdadero o falso. Pero para poder encontrarlo muchas veces el procesoen laborioso porque puede estar formada por varias proposiciones atómicas.Primeramente se le asignan valores de verdad a los átomos y se puede encontrar el valorde la expresión. Si deseamos hacerlo en general, debemos analizar todas las posibilidades, esto sepuede hacer construyendo una tabla de verdad. Para fines prácticos cuando se tienenvarios átomos las tablas de verdad no resultan prácticas por lo que analizaremossolamente expresiones con tres átomos como máximo. Por supuesto que se puede construir una tabla para un número mayor de átomos,pero notemos que por cada átomo que se aumente el número de renglones se duplica.CISNERO, ADRIAN 20JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 21. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESEsto es, para un átomos son dos renglones, para dos átomos son cuatro, para tresátomos son ocho, para cuatro dieciséis, etc. Algoritmo para construir una tabla de verdad de una fórmula en lógica deproposiciones. Escribir la fórmula con un número arriba de cada operador que indique sujerarquía. Se escriben los enteros positivos en orden, donde el número 1 corresponde aloperador de mayor jerarquía. Cuando dos operadores tengan la misma jerarquía, se leasigna el número menor al de la izquierda. Construir el árbol sintáctico empezando con la fórmula en la raíz y utilizando encada caso el operador de menor jerarquía. O sea, del número mayor al menor. Numerar las ramas del árbol en forma secuencial empezando por las hojas haciala raíz, con la única condición de que una rama se puede numerar hasta que esténnumerados los hijos. Para empezar con la numeración de las hojas es buena idea hacerloen orden alfabético, así todos obtienen los renglones de la tabla en el mismo orden parapoder comparar resultados. Escribir los encabezados de la tabla las fórmulas siguiendo la numeración que sele dió a las ramas en el árbol sintáctico. Al asignarle a los átomos, las hojas del árbol, todos los posibles valores de verdadde acuerdo al orden establecido. Por supuesto que el orden es arbitrario, pero como elnúmero de permutaciones es n!, conviene establecer un orden para poder compararresultados fácilmente. Asignar valor de verdad a cada una de las columnas restantes de acuerdo aloperador indicado en el árbol sintáctico utilizando la tabla de verdad correspondiente,conviene aprenderse de memoria las tablas de los operadores, al principio pueden tenerun resumen con todas las tablas mientras se memorizan. La última columna, correspondiente a la fórmula original, es la que indica losvalores de verdad posibles de la fórmula para cada caso.Ejemplo. Construya la tabla de verdad de las siguientes expresiones lógicas:i) (p → ¬q) v (¬p v r)ii) p → (q ^ r)CISNERO, ADRIAN 21JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 22. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESiii) (p → ¬ r) ↔ (q v p)iv) ¬(p ¬ q) → ¬ rv) (¬p ^ q) → ¬(q v ¬r)Solución:i) Seguimos los pasos del algoritmo con la fórmula (p → ¬q) v (¬p v r)1. Vemos que los operadores de los paréntesis tienen mayor jerarquía, empezamos por elparéntesis izquierdo por lo que la fórmula con jerarquías marcadas sería: 7.1. LIMITACIONEl análisis semántico toma su nombre por requerir información relativa al significado dellenguaje, fuera del alcance del análisis sintáctico.Mediante el empleo de gramáticas sensibles al contexto tipo 1 se podrían comprobarcaracterísticas del lenguaje. Ejemplo: la utilización de una variable requiere que estédeclarada previamente.Un autómata de tipo 1 es complejo de implementar e ineficiente.Solución: Análisis semántico a partir de gramáticas y autómatas de tipo 2 sintáctico eimplementación de reglas semánticas del lenguaje.Se emplean estructuras de datos auxiliares como las tablas de símbolos.El análisis semántico realiza todas las comprobaciones del lenguaje necesarias y nollevadas a cabo por el sintáctico 7.2. COMO SE UTILIZA El analizador sintáctico impone una estructura jerárquica a la cadena decomponentes léxicos, generada por el analizador léxico, que es representada en forma deun árbol sintáctico.=/id1 +/id2 +/id3 10CISNERO, ADRIAN 22JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 23. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES 7.3. DESCENDENTE Y ASCENDENTEEl estudio de gramáticas atribuidas se basa en la distinción de atributos heredados ysintetizados.Determinará cómo podremos implementarlas.Sintetizados: se calculan ascendentemente en el árbol sintáctico.Heredados: cálculo descendente.8. ANALISIS LEXICO Analizador léxico (scanner): lee la secuencia de caracteres del programa fuente,carácter a carácter, y los agrupa para formar unidades con significado propio, loscomponentes léxicos (tokens en ingles). Estos componentes léxicos representan:palabras reservadas: if, while, do, . . .identificadores: asociados a variables, nombres defunciones, tipos definidos por el usuario, etiquetas,... Por ejemplo: posición, velocidad,tiempo, . . . operadores: = * + - / == > < & ! = . . . símbolos especiales: ; ( ) [ ] f g ...constantes numéricas: literales que representan valores enteros, en coma dotante, etc,982, 0xF678, -83.2E+2,... constantes de caracteres: literales que representan cadenasconcretas de caracteres, hola mundo",... El analizador léxico opera bajo petición del analizador sintáctico devolviendo uncomponente léxico conforme el analizador sintáctico lo va necesitando para avanzar en lagramática. Los componentes léxicos son los símbolos terminales de la gramática. Suele implementarse como una subrutina del analizador sintáctico. Cuando recibela orden obtiene el siguiente componente léxico, el analizador léxico lee los caracteres deentrada hasta identificar el siguiente componente lexico.analizador El analizador léxico lee los caracteres del programa fuente, y verifica quecorrespondan a una secuencia lógica (identificador, palabra reservada etc.). EstaCISNERO, ADRIAN 23JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 24. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORESsecuencia de caracteres recibe el nombre componente léxico o lexema. En este caso elanalizador léxico verifica si el identificador id1 (nombre interno para "suma") encontradose halla en la tabla de símbolos, si no esta produce un error porque todavía no fuedeclarado, si la preposición hubiese sido la declaración del identificador "suma" enlenguajes C, C++ (int suma;) el analizador léxico agregaría un identificador en la tabla desímbolos, y así sucesivamente con todos los componentes léxicos que aparezcan.id1= id2+ id3 * 10 8.1. BUFFER DE ENTRADA El proceso de lectura de los caracteres de la entrada y formar los componentesléxicos es lo mas costoso en tiempo en el proceso de traducción. Es importanteimplementarlo eficientemente. Se utiliza un buffer dividido en dos mitades de tamaño N caracteres, donde N esun bloque de disco (1024, 4096). Se leen N caracteres de la entrada en cada mitad delbuffer con una única orden de lectura. Se mantienen dos apuntadores. Uno marca el iniciodel lexema y el otro el carácter actual que se mueve hasta encontrar una subcadena quecorresponde con un patrón. Una vez reconocido un componente léxico ambosapuntadores se colocan en la misma posición y justo detrás del lexema reconocido.buffer de entradaif avanza est´a final primera mitad then recargar segunda mitad; avanza = avanza+1;else if avanza est´a final segunda mitad then recargar primera mitad; pasar avanza a principio primera mitad;else avanza = avanza+1; 8.2. LAS EXPRESIONES REGULARESExpresiones Regulares:Los componentes léxicos se especifican haciendo uso de expresiones regulares. Ademásde las tres operaciones básicas: concatenación, repetición (*) y alternativas (j) vamos ausar los siguientes meta símbolos:Una o mas repeticiones +r+ indica una o mas repeticiones de r(0j1)+ = (0j1)(0j1)*Cualquier carácter..*b.* indica cualquier cadena que contiene una letra bUn rango de caracteres [ ] (clase)[a-z] indica cualquier carácter entre la a y z minúsculas[a-zA-Z] indica cualquier letra del abecedario minúscula o mayúscula[0-9] indica cualquier digito de 0 a 9[abc] indica ajbjcCualquier caracter excepto un conjunto dado ~CISNERO, ADRIAN 24JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO
  • 25. NIVERSIDAD METROPOLITANA DE EDUCACION, CIENCIA Y TECNOLOGÍAMATERIA: COMPILADORES~ (ajb) indica cualquier caracter que no sea una a o bOpcionalidad ?r? indica que la expresion r puede aparecer o no. En el caso deque aparezca solo lo haria una vez.Cuando queremos usar estos simbolos con su significado ten-emos que usar la barra de escape, [an-z] significar a cualquier letraque sea a, guion o z.Algunos ejemplos:Numerosnat = [0-9]+signedNat = ( + j -)? natnumber = signedNat(‘‘.’’nat)? (E signedNat)?Identi¯cadoresletter = [a-zA-Z]digit = [0-9]8.3. LAS EXPRESIONES DE MAQUINAS FINITAS.Los AFD se pueden utilizar para reconocer las expresiones regulares asociadas a loscomponentes léxicos.Identificadoresidentifier = letter (letter j digit)*Números naturales y realesnat = [0-9]+signedNat = (-)? natnumber = signedNat(‘‘.’’nat)? (E signedNat)?CISNERO, ADRIAN 25JUSTINIANI, ALIKIREINA DAVIDVON CHONG, ROLANDO