fbpx
Wikipedia

Historia de la construcción de los compiladores

En informática, un compilador es un programa informático que transforma código fuente escrito en un lenguaje de programación o lenguaje informático (el lenguaje fuente), en otro lenguaje informático (el lenguaje objetivo, estando a menudo en formato binario conocido como código objeto). La razón más común para querer transformar código fuente es crear un programa ejecutable.

Esquema de compilación

Cualquier programa escrito en un lenguaje de programación de alto nivel debe ser traducido a código objeto antes de que pueda ser ejecutado, para que todos los programadores que usen tal lenguaje usen un compilador o un intérprete. Por esto, los compiladores son muy importantes para los programadores. Cualquier mejora hecha a un compilador lleva a un gran número de programas mejorados.

Los compiladores son programas grandes y complejos, pero el análisis sistemático y la investigación de los científicos informáticos ha llevado a un entendimiento más claro de la construcción de los compiladores y una gran cantidad de teoría ha sido desarrollada sobre ellos. La investigación en la construcción de compiladores ha conducido a herramientas que hacen mucho más fácil crear compiladores, de modo que los estudiantes de informática de hoy en día pueden crear sus propios lenguajes pequeños y desarrollar un compilador simple en pocas semanas.

Primeros compiladores

 
Lenguaje de programación COBOL

El software para los primeros computadores estaba primariamente escrito en lenguaje ensamblador. Normalmente para un programador es más productivo usar un lenguaje de alto nivel, y los programas escritos en lenguajes de alto nivel pueden ser reutilizados en distintos tipos de computadores. Aun teniendo en cuenta esto, pasó un tiempo hasta que los compiladores se establecieran, porque generaban código que no tenía tan buen rendimiento como los ensambladores escritos a mano, eran enormes proyectos de desarrollo por sí mismos, y la limitadísima capacidad de memoria de los primeros computadores creó muchos problemas técnicos para las implementaciones prácticas de los compiladores.

El primer compilador fue escrito por Grace Hopper, en 1952, para el lenguaje Sistema A-0. El término compilador fue acuñado por Hopper.[1]​ El equipo FORTRAN dirigido por John W. Backus de IBM está generalmente acreditado por haber presentado el primer compilador completo, en 1957. El primer compilador FORTRAN necesitó de 18 años-persona para su creación.[2]

En 1960, un compilador FORTRAN extendido, ALTAC, estaba también disponible en el Philco 2000, por lo que es probable que un programa FORTRAN fuera compilado para ambas arquitecturas de computadores a mediados de los años 60.[3]​ El primer lenguaje de alto nivel multiplataforma demostrado fue COBOL. En una demostración en diciembre de 1960, un programa COBOL fue compilado y ejecutado en el UNIVAC II y el RCA 501.[1]

El compilador COBOL para el UNIVAC II fue probablemente el primero en ser escrito en un lenguaje de alto nivel, llamado FLOW-MATIC, por un equipo dirigido por Grace Hopper.

Compiladores auto-alojados

 
Máquina LISP

Como cualquier otro software, hay beneficios obtenidos de la implementación de un compilador en un lenguaje de alto nivel. En particular, un compilador puede ser auto-alojado, es decir, escrito en el lenguaje de programación que lo compila. Construir un compilador auto-alojado es un problema de bootstrapping —el primer compilador para un lenguaje debe ser compilado o en un compilador escrito en un lenguaje distinto, o compilado ejecutando el compilador en un intérprete.

ELIAC

El Navy Electronics Laboratory International ALGOL Compiler o NELIAC fue un dialecto e implementación del compilador del lenguaje de programación ALGOL 58 desarrollado por el Naval Electronics Laboratory en 1958.

ELIAC fue el invento de Harry Huskey — por aquel entonces presidente de la ACM y un reconocido científico informático, y apoyado por Maury Halstead, el jefe del centro computacional en el NEL. La primera versión fue implementada en el ordenador prototipo USQ-17 (llamado la Condesa) en el laboratorio. Fue el primer compilador auto-compilado del mundo. Esto significa que el compilador fue primero codificado en forma simplificada en un lenguaje ensamblador (el bootstrap), y luego reescrito en su propio lenguaje, compilado por el compilador bootstrap, y recompilado por sí mismo, haciendo obsoleto el bootstrap.

Lisp

El primer compilador auto-alojado (excluyendo ensambladores) fue escrito para Lisp por Tim Hart y Mike Levin en el MIT en 1962.[4]​ Ellos escribieron un compilador de Lisp en Lisp, probándolo en un intérprete de Lisp existente. Una vez que ellos hubieron mejorado el compilador hasta el punto de que se pudiera compilar en su propio código fuente, fue auto-alojado.[5]

El compilador tal como existe en la cinta de compilador estándar es un programa en lenguaje de máquina que fue obtenido al tener la definición de la Expresión S del trabajo de compilador en sí mismo a través del intérprete. (AI Memo 39)[5]

Esta técnica solo es posible cuando un intérprete ya existe para el propio lenguaje que va a ser compilado. Lo toma prestado directamente de la noción de ejecutar un programa en sí mismo como salida, lo cual también es usado en varias pruebas de la ciencia computacional teórica, por ejemplo en la prueba de que el problema de la parada es indeterminable.

Gramáticas libres de contexto y analizadores sintácticos

 
Analizador sintáctico

Un analizador sintáctico es un componente importante de un compilador. Analiza el código fuente de un lenguaje de programación para crear algún tipo de representación interna. Los lenguajes de programación tienden a ser especificados en términos de una gramática libre de contexto a causa de los analizadores sintácticos rápidos y eficientes que pueden ser escritos para ellos. Los analizadores sintácticos pueden ser escritos a mano o generado por un compilador de computador. Una gramática libre de contexto ofrece un mecanismo sencillo y preciso para describir la estructura de bloque de un programa - es decir, cómo el lenguaje de programación se construye a partir de bloques más pequeños. El formalismo de las gramáticas libres de contexto fue desarrollado por Noam Chomsky a mediados de los años 50.[6]

La estructura de bloque fue introducida en los lenguajes de programación por el proyecto ALGOL (1957-1960), lo que, en consecuencia, también ofreció una gramática libre de contexto para describir la sintaxis resultante de ALGOL.

Las gramáticas libres de contexto son lo suficientemente simples como para permitir la construcción de algoritmos de análisis sintáctico eficientes los cuales, para una cadena dada, determinan cuándo y cómo pueden ser generados a partir de la gramática. Si un diseñador de lenguajes de programación está dispuesto a trabajar dentro de algunos subconjuntos limitados de las gramáticas libres de contexto, es posible crear analizadores sintácticos más eficientes.

Análisis sintáctico LR

 
Analizador sintáctico LR

El analizador sintáctico LR (left to right: izquierda a derecha) fue inventado por Donald Knuth en 1965 en un artículo, "On the Translation of Languages from Left to Right". Un analizador sintáctico LR es un analizador sintáctico que lee la entrada de izquierda a derecha (como aparecería si se mostrara visualmente) y produce una derivación por la derecha. El término analizador sintáctico LR(k) es también usado, donde k se refiere al número de símbolos de entrada predichos ("look-ahead") sin consumir que son usados en las decisiones que toma el analizador.

Knuth demostró que las gramáticas LR(k) pueden ser analizadas en un tiempo de ejecución esencialmente proporcional a la longitud del programa, y cada gramática LR(k) con k > 1 puede ser mecánicamente transformada en una gramática LR(1) para el mismo lenguaje. En otras palabras, solo es necesario tener un símbolo de predicción para analizar cualquier gramática libre de contexto determinista (DCFG: deterministic context-free grammar).[7]

Korenjak (1969) fue el primero en demostrar que los analizadores sintácticos para los lenguajes de programación podían ser producidos usando estas técnicas.[8]​ Frank DeRemer ideó las técnicas más prácticas SLR y LALR, publicadas en su tesis doctoral del MIT en 1969.[9][10]​ Esto supuso un importante avance, porque los traductores LR(k), como los definió Donald Knuth, eran demasiado grandes para su implementación en los sistemas informáticos de los años 60 y 70.

En la práctica, LALR ofrece una buena solución, porque las gramáticas LALR(1) son más potentes que las gramáticas SLR(1) y LL(1). Las gramáticas LR(1) son más potentes que las LALR(1), sin embargo, los analizadores sintácticos LR(1) pueden ser extremadamente grandes en tamaño y no se consideran prácticos. Los analizadores sintácticos LR(1) mínimos son pequeños en tamaño y comparables a los analizadores sintácticos LALR(1). La sintaxis de muchos lenguajes de programación son definidos por una gramática LALR(1), y por esta razón los analizadores sintácticos LALR son usados a menudo por compiladores para llevar a cabo el análisis sintáctico del código fuente.

Un analizador sintáctico ascendente recursivo implementa un analizador LALR usando funciones mutuamente recursivas en vez de usar tablas. Por esto, el analizador sintáctico es directamente codificado en el lenguaje anfitrión de forma parecida al recursivo descendente. La codificación directa normalmente produce un analizador más rápido que su equivalente basado en tablas[11]​ por la razón de que la compilación es más rápida que la interpretación. También es posible (en principio) editar a mano un analizador sintáctico recursivo ascendente, donde una implementación en forma de tabla es casi ilegible para el ser humano medio.

La recursión ascendente fue descrita por primera vez por Thomas Pennello en su artículo "Very fast LR parsing" en 1986.[11]​ La técnica fue expuesta después por G.H. Roberts[12]​ en 1988 así como en un artículo de Leermakers, Augusteijn y Kruseman Aretz[13]​ en 1992 en el diario Theoretical Computer Science.

Análisis sintáctico LL

Un analizador sintáctico LL analiza la entrada de izquierda a derecha, y construye una derivación por la izquierda de la sentencia o enunciado, al contrario que LR. La clase de gramáticas que son analizables por este método son conocidas como gramáticas LL. Las gramáticas LL son una clase de gramáticas libres de contexto aún más restrictiva que las gramáticas LR. Sin embargo, son de gran interés para los escritores de compiladores, puesto que este analizador es simple y eficiente de implementar.

Las gramáticas LL(k) pueden ser analizadas por un analizador sintáctico descendente recursivo, que es normalmente codificado a mano.

El diseño de ALGOL provocó la investigación del recursivo descendente, dado que el lenguaje ALGOL es en sí mismo recursivo. El concepto de análisis sintáctico descendente recursivo fue objeto de debate en la edición de enero de 1961 del CACM en artículos separados de A.A. Grau y Edgar T. "Ned" Irons.[14][15]​ Richard Waychoff concibió y usó el descendente recursivo en el compilador ALGOL de Burroughs de marzo de 1961.[16]

La idea de las gramáticas LL(1) fue presentada por Lewis y Stearns (1968).[17][18]

El recursivo descendente fue popularizado por Niklaus Wirth con PL/0, un lenguaje de programación educacional usado para enseñar la construcción de compiladores en los años 70.[19]

El análisis sintáctico LR puede manejar un rango mayor de lenguajes que el análisis sintáctico LL, y proporciona mejores informes de errores, es decir, detecta errores sintácticos cuando la entrada no está conforme a la gramática tan pronto como sea posible.

Algoritmo de Earley

En 1970, Jay Earley inventó lo que después se llamó el Algoritmo de Earley. Este algoritmo es atractivo porque puede analizar cualquier lenguaje libre de contexto de forma bastante eficiente.[20]

Lenguajes de descripción de gramáticas

 
John Backus

John Backus propuso "fórmulas meta-lingüísticas"[21][22]​ para describir la sintaxis del nuevo lenguaje de programación IAL, conocido hoy en día como ALGOL 58 (1959). El trabajo de Backus estaba basado en la Máquina de Post ideada por Emil Post.

El posterior desarrollo de ALGOL llevó al ALGOL 60; en su informe (1963), Peter Naur llamó Notación de Backus-Naur (Backus Normal Form: BNF) a la notación de Backus,[23]​ y lo simplificó para minimizar el conjunto de caracteres usados.

Niklaus Wirth definió la Notación de Backus-Naur Extendida (Extended Backus-Naur Form: EBNF), una versión refinada de la BNF, a principios de los años 70 para PL/0. La Notación de Backus-Naur Aumentada (Augmented Backus-Naur Form: ABNF) es otra variante. Tanto EBNF como ABNF son muy usadas para especificar la gramática de los lenguajes de programación, como en las entradas de los generadores de analizadores sintácticos, y en otros campos como la definición de protocolos de comunicación.

Compilador de computador

 
Laboratorios Bell, uno de los primeros en desarrollar un sistema operativo en un lenguaje de alto nivel (PL/1)

Un compilador de computador (compiler compiler) o generador de analizador sintáctico es un programa que toma una descripción de la gramática formal de un lenguaje de programación y produce un analizador sintáctico para ese lenguaje.

El primer compilador de computador en usar ese nombre fue escrito por Tony Brooker en 1960 y fue usado para crear compiladores para la computadora Atlas en la Universidad de Mánchester, incluyendo el compilador Atlas Autocode. Sin embargo, era bastante diferente de los compiladores de computador modernos, y hoy probablemente sería descrito como algo entre un compilador genérico altamente personalizable y un lenguaje extensible. El nombre 'compilador de computador' era bastante más apropiado para el sistema de Brooker de lo que lo es para la mayoría de los compiladores de computador modernos, los cuales sería mejor llamarlos generadores de analizadores sintácticos. Es casi seguro que el nombre "compilador de computador" se usa comúnmente debido a Yacc más que al trabajo de Brooker.

A principios de los años 60, Robert McClure en Texas Instruments inventó un compilador de computador llamado TMG, el nombre extraído de "transmogrificación".[24][25][26][27]​ En los posteriores años TMG fue portado a muchos computadores centrales de UNIVAC e IBM.

El proyecto Multics, un proyecto conjunto entre el MIT y los Laboratorios Bell, fue uno de los primeros en desarrollar un sistema operativo en un lenguaje de alto nivel. PL/1 fue escogido como el lenguaje, pero un proveedor externo no podía proveer un compilador en funcionamiento.[28]​ El equipo Multics desarrolló su propio dialecto de PL/1, llamado Early PL/1 (EPL), como su lenguaje de implementación de 1964. TMG fue portado a las GE-600 series y usado para desarrollar EPL por Douglas McIlroy, Robert Morris y otros.

No mucho después de que Ken Thompson escribiera la primera versión de Unix para el PDP-7 en 1969, Doug McIlroy creó el primer lenguaje de programación de alto nivel del nuevo sistema: una implementación del TMG de McClure.[29]​ TMG fue también la herramienta de definición del compilador usada por Ken Thompson para escribir el compilador del lenguaje B en su PDP-7 en 1970. B fue el inmediato predecesor de C.

Uno de los primeros generadores de analizador sintáctico LALR fue llamado “TWS”, creado por Frank DeRemer y Tom Pennello.

XPL

XPL es un dialecto del lenguaje de programación PL/1, desarrollado en 1967, usado para el desarrollo de compiladores de lenguajes de computación. Fue diseñado e implementado por un equipo formado por William McKeeman, James J. Horning y David B. Wortman en la Universidad Stanford y la Universidad de California, Santa Cruz. Se anunció por primera vez en la Conferencia de Ordenadores de Otoño de 1968 en San Francisco, California.[30][31]

Es el nombre de tanto el lenguaje de programación como el sistema generador de analizador sintáctico LALR (o TWS: Translator Writing System) basado en el lenguaje.

XPL presentó un sistema de compilador de abajo a arriba (bottom-up compiler) relativamente simple denominado MSP (Mixed Strategy Precedence) por sus autores. Fue cargado a través de Burroughs Algol en el computador de IBM S/360. Implementaciones posteriores de XPL ofrecieron un analizador sintáctico SLR(1).

Yacc

Yacc es un generador de analizador sintáctico desarrollado por Stephen C. Johnson en AT&T para el sistema operativo Unix.[32]​ El nombre es un acrónimo de "Yet Another Compiler Compiler". Genera un analizador sintáctico LALR(1) basado en una gramática escrita en una notación similar a la Notación de Backus-Naur.

Johnson trabajó en Yacc a principios de los años 70 en Laboratorios Bell.[33]​ Estaba familiarizado con TMG y su influencia puede verse en Yacc y en el diseño del lenguaje de programación C. A causa de que Yacc fue el generador de analizador sintáctico por defecto en la mayoría de sistemas Unix, fue ampliamente distribuido y usado. Desarrollos como GNU Bison todavía están en uso.

El analizador sintáctico generado por Yacc requiere un analizador léxico. Los generadores de analizadores léxicos, tales como Lex o Flex están ampliamente disponibles. El estándar IEEE POSIX P1003.2 define la funcionalidad y los requerimientos para Lex y Yacc.

Compilación cruzada

Un compilador cruzado se ejecuta en un entorno pero produce código objeto para otro. Los compiladores cruzados son usados para desarrollo embebido, donde el ordenador objetivo tiene capacidades limitadas.

Uno de los primeros ejemplos de compilación cruzada fue AIMICO, donde un programa FLOW-MATIC en un UNIVAC II fue usado para generar lenguaje ensamblador para el IBM 705, que fue después ensamblado en el computador de IBM.[1]

El compilador ALGOL 68C generaba una salida ZCODE, que luego podía ser compilado en código de la máquina local por un traductor ZCODE o ejecutarlo interpretado. ZCODE es un lenguaje intermedio basado en registros. Esta habilidad para interpretar o compilar ZCODE fomentó la portabilidad de ALGOL 68C a numerosas plataformas de computador diferentes.

Compiladores de optimización

 
Frances E. Allen, una pionera en el campo de la optimización de compiladores

La optimización de compiladores es el proceso de mejora de la calidad del código objeto sin cambiar los resultados que produce.

Los desarrolladores del primer compilador de FORTRAN se propusieron generar código que fuese mejor que la media de los ensambladores codificados a mano, para que los clientes pudieran usar su producto. En uno de sus primeros compiladores, ellos tuvieron éxito.[34]

Posteriores compiladores, como el compilador Fortran IV de IBM, priorizó más en los buenos diagnósticos y en ejecutarse más rápidamente, a costa de la optimización del código objeto. No fue hasta las series IBM 360 en las que IBM proveyó dos compiladores separados en las que estuvo disponible: un comprobador de ejecución de código rápida y un optimizador más lento.

Frances E. Allen, trabajando sola y conjuntamente con John Cocke, presentó muchos de los conceptos de optimización. El artículo de Allen de 1966, Program Optimization,[35]​ presentó el uso de las estructuras en forma de grafo para codificar el contenido de un programa para la optimización.[36]​ Su artículo de 1970, Control Flow Analysis[37]​ y A Basis for Program Optimization[38]​ estableció intervalos como el contexto para el análisis y la optimización del flujo de datos eficiente y efectivo. Su artículo de 1971 conjunto con Cocke, A Catalog of Optimizing Transformations,[39]​ dio la primera descripción y sistematización de las transformaciones de optimización. Sus artículos de 1973 y 1974 sobre el análisis del flujo de datos interprocedural extendió el análisis a los programas por completo.[40][41]​ Su artículo de 1976 conjunto con Cocke describe una de las dos principales estrategias de análisis usadas en los compiladores de optimización de hoy día.[42]

Allen desarrolló e implementó sus métodos como parte de compiladores para el IBM 7030 Stretch-Harvest y el experimental Advanced Computing System. Este trabajo estableció la factibilidad y la estructura de los optimizadores de las máquinas modernas. Ella llegó a establecer y liderar el proyecto PTRAN en la ejecución paralela automática de programas FORTRAN.[43]​ Su equipo PTRAN desarrolló nuevos esquemas de detección de paralelismo y creó el concepto de grafo de dependencias del programa, el método de estructurado primario usado por la mayoría de los compiladores de paralelización.

Programming Languages and their Compilers de John Cocke y Jacob T. Schwartz, publicado por primera vez en 1970, dedicó más de 200 páginas a algoritmos de optimización. Incluyó muchas de las ahora familiares técnicas tales como eliminación de código redundante y reducción de esfuerzo.[44]

Optimización Peephole

La optimización Peephole es una técnica de optimización muy simple pero efectiva. Fue inventada por William McKeeman y publicada en 1965 en CACM.[45]​ Fue usada en el compilador XPL que McKeeman ayudó a desarrollar.

Optimizador Capex COBOL

La Corporación Capex desarrolló el "Optimizador COBOL" a mediados de los años 70 para COBOL. Este tipo de optimizador depende, en este caso, del conocimiento de las 'debilidades' en el compilador IBM COBOL estándar, y de hecho reemplaza (o parchea secciones del código objeto con un código más eficiente. El código de reemplazo podría sustituir una tabla de consulta linear con una búsqueda binaria por ejemplo o a veces simplemente reemplazar una instrucción relativamente 'lenta' por una conocida más rápida que fuese funcionalmente equivalente en su contexto. Esta técnica es ahora conocida como "Reducción de esfuerzo". Por ejemplo en el hardware IBM S/360 la instrucción CLI era, dependiendo del modelo, entre 2 y 5 veces tan rápido como una instrucción CLC para comparaciones de un único byte.[46][47]

Los compiladores modernos típicamente proveen opciones de optimización, para que los programadores puedan elegir si quieren o no ejecutar un pase de optimización.

Diagnósticos

Cuando a un compilador se le pasa un programa incorrecto sintácticamente, un buen, claro mensaje de error es útil. Desde la perspectiva del escritor del compilador, esto es a menudo difícil de conseguir.

El compilador Fortran WATFIV fue desarrollado en la Universidad de Waterloo, Canadá en los finales de los años 60. Fue diseñado para dar mejores mensajes de error que los compiladores Fortran de IBM de la época. Además, WATFIV era mucho más utilizable, porque combinaba compilación, enlazado y ejecución en un paso, mientras que los compiladores de IBM tenían tres componentes separados para su ejecución.

PL/C

PL/C fue un lenguaje de programación de computador desarrollado en la Universidad de Cornell a principios de los años 70. Mientras que el PL/C era un subconjunto del lenguaje de IBM PL/1, fue diseñado con el objetivo específico de ser usado para enseñar programación. Los dos investigadores y profesores académicos que diseñaron PL/C fueron Richard W. Conway y Thomas R. Wilcox. Presentaron el famoso artículo "Design and implementation of a diagnostic compiler for PL/1" publicado en las comunicaciones del ACM en marzo de 1973.[48]

PL/C eliminó algunas de las más complejas características de PL/1, y añadió depuración extensiva y facilidades para recuperación de errores. El compilador PL/C tenía la inusual capacidad de nunca fallar al compilar cualquier programa, mediante el uso de la corrección automática de muchos errores sintácticos y la conversión de los errores sintácticos restantes a las declaraciones de salida.

Véase también

Referencias

  1. The World's First COBOL Compilers
  2. Backus et al. "The FORTRAN automatic coding system", Proc. AFIPS 1957 Western Joint Comuter Conf., Spartan Books, Baltimore 188-198
  3. [2] Rosen, Saul. ALTAC, FORTRAN, and compatibility. Proceedings of the 1961 16th ACM national meeting
  4. T. Hart and M. Levin "The New Compiler", AIM-39 (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). CSAIL Digital Archive - Artificial Intelligence Laboratory Series
  5. Tim Hart and Mike Levin. «AI Memo 39-The new compiler». Consultado el 23 de mayo de 2008. 
  6. Chomsky, Noam (Sep 1956). «Three models for the description of language». Information Theory, IEEE Transactions 2 (3): 113-124. doi:10.1109/TIT.1956.1056813. Consultado el 18 de junio de 2007. 
  7. Knuth, Donald. . Archivado desde el original el 15 de marzo de 2012. Consultado el 29 de mayo de 2011. 
  8. Korenjak, A. “A Practical Method for Constructing LR(k) Processors,” Communications of the ACM, Vol. 12, No. 11, 1969
  9. DeRemer, F. Practical Translators for LR(k) Languages. Ph.D. dissertation, MIT, 1969.
  10. DeRemer, F. “Simple LR(k) Grammars,” Communications of the ACM, Vol. 14, No. 7, 1971.
  11. Thomas J Pennello (1986). «Very fast LR parsing». ACM SIGPLAN Notices 21 (7). 
  12. G.H. Roberts (1988). «Recursive ascent: an LR analog to recursive descent». 
  13. Leermakers, Augusteijn, Kruseman Aretz (1992). «A functional LR parser». 
  14. A.A. Grau, "Recursive processes and ALGOL translation", Commun. ACM, 4, #1, pp. 10-15. Jan. 1961
  15. Edgar T. Irons, "A syntax-directed compiler for ALGOL 60", Commun. ACM, 4, #1, Jan. 1961, pp. 51-55.
  16. web.me.com/ianjoyner/Files/Waychoff.pdf
  17. P. M. Lewis, R. E. Stearns, "Syntax directed transduction," focs, pp.21-35, 7th Annual Symposium on Switching and Automata Theory (SWAT 1966), 1966
  18. Lewis, P. and Stearns, R. “Syntax-Directed Transduction,” Journal of the ACM, Vol. 15, No. 3, 1968.
  19. . Archivado desde el original el 8 de diciembre de 2008. 
  20. J. Earley, "An efficient context-free parsing algorithm", Communications of the Association for Computing Machinery, 13:2:94-102, 1970.
  21. Backus, J.W. (1959). «The syntax and semantics of the proposed international algebraic language of the Zurich ACM-GAMM Conference». Proceedings of the International Conference on Information Processing. UNESCO. pp. 125-132. 
  22. Farrell, James A. (August 1995). «Compiler Basics». Extended Backus Naur Form. Consultado el 11 de mayo de 2011. 
  23. Donald E. Knuth, "Backus Normal Form vs. Backus Naur Form", Commun. ACM, 7(12):735–736, 1964.
  24. . Archivado desde el original el 4 de marzo de 2016. Consultado el 9 de marzo de 2012. 
  25. http://portal.acm.org/citation.cfm?id=806050&dl=ACM&coll=DL&CFID=29658196&CFTOKEN=62044584
  26. R. M. McClure, TMG—A Syntax Directed Compiler Proc. 20th ACM National Conf. (1965), pp. 262-274.
  27. http://multicians.org/pl1.html
  28. «Copia archivada». Archivado desde el original el 10 de enero de 2015. Consultado el 3 de agosto de 2011.  Dennis M. Ritchie. The Development of the C Language
  29. McKeeman, William Marshall; Horning, James J.; and Wortman, David B., A Compiler Generator (1971), ISBN 978-0-13-155077-3.
  30. Computer Science Department, University of Toronto, "The XPL Programming Language"
  31. Johnson, S.C., “Yacc - Yet Another Compiler Compiler”, Computing Science Technical Report 32, AT&T Bell Labs, 1975
  32. http://www.techworld.com.au/article/252319/a-z_programming_languages_yacc/
  33. http://compilers.iecc.com/comparch/article/97-10-017
  34. F.E. Allen. Program optimization. In Mark I. Halpern and Christopher J. Shaw, editors, Annual Review in Automatic Programming, volume 5, pages 239-307. Pergamon Press, New York, 1969.
  35. Frances E. Allen and John Cocke. Graph theoretic constructs for program control flow analysis. Technical Report IBM Res. Rep. RC 3923, IBM T.J. Watson Research Center, Yorktown Heights, NY, 1972.
  36. Frances E. Allen. Control flow analysis. ACM SIGPLAN Notices, 5(7):1-19, July 1970.
  37. Frances E. Allen. A basis for program optimization. In Proc. IFIP Congress 71, pages 385-390. North-Holland, 1972.
  38. Frances E. Allen and John Cocke. A catalogue of optimizing transformations. In R. Rustin, editor, Design and Optimization of Compilers, pages 1-30. Prentice-Hall, 1971.
  39. Frances E. Allen. Interprocedural data flow analysis. In Proc. IFIP Congress 74, pages 398-402. North-Holland, 1974.
  40. Frances E. Allen. A method for determining program data relationships. In Andrei Ershov and Valery A. Nepomniaschy, editors, Proc. International Symposium on Theoretical Programming, Novosibirsk, USSR, August 1972, volume 5 of Lecture Notes in Computer Science, pages 299-308. Springer-Verlag, 1974.
  41. Frances E. Allen and John Cocke. A program data flow analysis procedure. Communications of the ACM, 19(3):137-147, March 1976.
  42. Vivek Sarkar. The PTRAN Parallel Programming System. In Parallel Functional Programming Languages and Compilers, edited by B. Szymanski, ACM Press Frontier Series, pages 309-391, 1991.
  43. John Cocke and Jacob T. Schwartz, Programming Languages and their Compilers. Courant Institute of Mathematical Sciences, New York University, April 1970.
  44. MCKEEMAN, W.M. Peephole optimization. Commun. ACM 8, 7 (July 1965), 443-444
  45. http://www.bitsavers.org/pdf/ibm/360/A22_6825-1_360instrTiming.pdf
  46. http://portal.acm.org/citation.cfm?id=358732&dl=GUIDE&dl=ACM
  47. CACM March 1973 pp 169-179.

Lecturas adicionales

  • Backus, John, et al., "The FORTRAN Automatic Coding System", Proceedings of the Western Joint Computer Conference, Los Angeles, California, febrero de 1957. Describe el diseño y la implementación del primer compilador de FORTRAN por el equipo IBM.
  • Bauer, Friedrich L.; Eickel, Jürgen (Eds.), Compiler Construction, An Advanced Course, 2nd ed. Lecture Notes in Computer Science 21, Springer 1976, ISBN 3-540-07542-9
  • Cheatham, T. E., and Sattley, K., Syntax directed compilation, SJCC p. 31. (1964).
  • Cocke, John; Schwartz, Jacob T., Programming Languages and their Compilers: Preliminary Notes, Courant Institute of Mathematical Sciences technical report, New York University, 1969.
  • Conway, Melvin E., Design of a separable transition-diagram compiler, Communications of the ACM, Volume 6, Issue 7 (Julio 1963)
  • Floyd, R. W., Syntactic analysis and operator precedence, Journal of the ACM, Vol. 10, p. 316. (Julio 1963).
  • Gries, David, Compiler Construction for Digital Computers, New York: Wiley, 1971. ISBN 0-471-32776-X
  • Irons, Edgar T., A syntax directed compiler for ALGOL 60, Communications of the ACM, Vol. 4, p. 51. (Jan. 1961)
  • Knuth, D. E., On the translation of languages from left to right., Information and Control, Vol. 8, p. 607. (1965).
  • Knuth, D. E., RUNCIBLE-algebraic translation on a limited computer, Communications of the ACM, Vol. 2, p. 18, (Nov. 1959).
  • Randell, Brian]]; Russell, Lawford John, ALGOL 60 Implementation: The Translation and Use of ALGOL 60 Programs on a Computer, Academic Press, 1964
  • Dick Grune's Annotated Literature Lists - Compiler Construction before 1980

Notas

  • Este artículo utiliza contenidos de History of compiler construction en Wikipedia en Inglés.
  •   Datos: Q3502371

historia, construcción, compiladores, informática, compilador, programa, informático, transforma, código, fuente, escrito, lenguaje, programación, lenguaje, informático, lenguaje, fuente, otro, lenguaje, informático, lenguaje, objetivo, estando, menudo, format. En informatica un compilador es un programa informatico que transforma codigo fuente escrito en un lenguaje de programacion o lenguaje informatico el lenguaje fuente en otro lenguaje informatico el lenguaje objetivo estando a menudo en formato binario conocido como codigo objeto La razon mas comun para querer transformar codigo fuente es crear un programa ejecutable Esquema de compilacion Cualquier programa escrito en un lenguaje de programacion de alto nivel debe ser traducido a codigo objeto antes de que pueda ser ejecutado para que todos los programadores que usen tal lenguaje usen un compilador o un interprete Por esto los compiladores son muy importantes para los programadores Cualquier mejora hecha a un compilador lleva a un gran numero de programas mejorados Los compiladores son programas grandes y complejos pero el analisis sistematico y la investigacion de los cientificos informaticos ha llevado a un entendimiento mas claro de la construccion de los compiladores y una gran cantidad de teoria ha sido desarrollada sobre ellos La investigacion en la construccion de compiladores ha conducido a herramientas que hacen mucho mas facil crear compiladores de modo que los estudiantes de informatica de hoy en dia pueden crear sus propios lenguajes pequenos y desarrollar un compilador simple en pocas semanas Indice 1 Primeros compiladores 2 Compiladores auto alojados 2 1 ELIAC 2 2 Lisp 3 Gramaticas libres de contexto y analizadores sintacticos 3 1 Analisis sintactico LR 3 2 Analisis sintactico LL 3 3 Algoritmo de Earley 4 Lenguajes de descripcion de gramaticas 5 Compilador de computador 5 1 XPL 5 2 Yacc 6 Compilacion cruzada 7 Compiladores de optimizacion 7 1 Optimizacion Peephole 7 2 Optimizador Capex COBOL 8 Diagnosticos 8 1 PL C 9 Vease tambien 10 Referencias 11 Lecturas adicionales 12 NotasPrimeros compiladores Editar Lenguaje de programacion COBOL El software para los primeros computadores estaba primariamente escrito en lenguaje ensamblador Normalmente para un programador es mas productivo usar un lenguaje de alto nivel y los programas escritos en lenguajes de alto nivel pueden ser reutilizados en distintos tipos de computadores Aun teniendo en cuenta esto paso un tiempo hasta que los compiladores se establecieran porque generaban codigo que no tenia tan buen rendimiento como los ensambladores escritos a mano eran enormes proyectos de desarrollo por si mismos y la limitadisima capacidad de memoria de los primeros computadores creo muchos problemas tecnicos para las implementaciones practicas de los compiladores El primer compilador fue escrito por Grace Hopper en 1952 para el lenguaje Sistema A 0 El termino compilador fue acunado por Hopper 1 El equipo FORTRAN dirigido por John W Backus de IBM esta generalmente acreditado por haber presentado el primer compilador completo en 1957 El primer compilador FORTRAN necesito de 18 anos persona para su creacion 2 En 1960 un compilador FORTRAN extendido ALTAC estaba tambien disponible en el Philco 2000 por lo que es probable que un programa FORTRAN fuera compilado para ambas arquitecturas de computadores a mediados de los anos 60 3 El primer lenguaje de alto nivel multiplataforma demostrado fue COBOL En una demostracion en diciembre de 1960 un programa COBOL fue compilado y ejecutado en el UNIVAC II y el RCA 501 1 El compilador COBOL para el UNIVAC II fue probablemente el primero en ser escrito en un lenguaje de alto nivel llamado FLOW MATIC por un equipo dirigido por Grace Hopper Compiladores auto alojados Editar Maquina LISP Como cualquier otro software hay beneficios obtenidos de la implementacion de un compilador en un lenguaje de alto nivel En particular un compilador puede ser auto alojado es decir escrito en el lenguaje de programacion que lo compila Construir un compilador auto alojado es un problema de bootstrapping el primer compilador para un lenguaje debe ser compilado o en un compilador escrito en un lenguaje distinto o compilado ejecutando el compilador en un interprete ELIAC Editar El Navy Electronics Laboratory International ALGOL Compiler o NELIAC fue un dialecto e implementacion del compilador del lenguaje de programacion ALGOL 58 desarrollado por el Naval Electronics Laboratory en 1958 ELIAC fue el invento de Harry Huskey por aquel entonces presidente de la ACM y un reconocido cientifico informatico y apoyado por Maury Halstead el jefe del centro computacional en el NEL La primera version fue implementada en el ordenador prototipo USQ 17 llamado la Condesa en el laboratorio Fue el primer compilador auto compilado del mundo Esto significa que el compilador fue primero codificado en forma simplificada en un lenguaje ensamblador el bootstrap y luego reescrito en su propio lenguaje compilado por el compilador bootstrap y recompilado por si mismo haciendo obsoleto el bootstrap Lisp Editar El primer compilador auto alojado excluyendo ensambladores fue escrito para Lisp por Tim Hart y Mike Levin en el MIT en 1962 4 Ellos escribieron un compilador de Lisp en Lisp probandolo en un interprete de Lisp existente Una vez que ellos hubieron mejorado el compilador hasta el punto de que se pudiera compilar en su propio codigo fuente fue auto alojado 5 El compilador tal como existe en la cinta de compilador estandar es un programa en lenguaje de maquina que fue obtenido al tener la definicion de la Expresion S del trabajo de compilador en si mismo a traves del interprete AI Memo 39 5 Esta tecnica solo es posible cuando un interprete ya existe para el propio lenguaje que va a ser compilado Lo toma prestado directamente de la nocion de ejecutar un programa en si mismo como salida lo cual tambien es usado en varias pruebas de la ciencia computacional teorica por ejemplo en la prueba de que el problema de la parada es indeterminable Gramaticas libres de contexto y analizadores sintacticos Editar Analizador sintactico Un analizador sintactico es un componente importante de un compilador Analiza el codigo fuente de un lenguaje de programacion para crear algun tipo de representacion interna Los lenguajes de programacion tienden a ser especificados en terminos de una gramatica libre de contexto a causa de los analizadores sintacticos rapidos y eficientes que pueden ser escritos para ellos Los analizadores sintacticos pueden ser escritos a mano o generado por un compilador de computador Una gramatica libre de contexto ofrece un mecanismo sencillo y preciso para describir la estructura de bloque de un programa es decir como el lenguaje de programacion se construye a partir de bloques mas pequenos El formalismo de las gramaticas libres de contexto fue desarrollado por Noam Chomsky a mediados de los anos 50 6 La estructura de bloque fue introducida en los lenguajes de programacion por el proyecto ALGOL 1957 1960 lo que en consecuencia tambien ofrecio una gramatica libre de contexto para describir la sintaxis resultante de ALGOL Las gramaticas libres de contexto son lo suficientemente simples como para permitir la construccion de algoritmos de analisis sintactico eficientes los cuales para una cadena dada determinan cuando y como pueden ser generados a partir de la gramatica Si un disenador de lenguajes de programacion esta dispuesto a trabajar dentro de algunos subconjuntos limitados de las gramaticas libres de contexto es posible crear analizadores sintacticos mas eficientes Analisis sintactico LR Editar Analizador sintactico LR El analizador sintactico LR left to right izquierda a derecha fue inventado por Donald Knuth en 1965 en un articulo On the Translation of Languages from Left to Right Un analizador sintactico LR es un analizador sintactico que lee la entrada de izquierda a derecha como apareceria si se mostrara visualmente y produce una derivacion por la derecha El termino analizador sintactico LR k es tambien usado donde k se refiere al numero de simbolos de entrada predichos look ahead sin consumir que son usados en las decisiones que toma el analizador Knuth demostro que las gramaticas LR k pueden ser analizadas en un tiempo de ejecucion esencialmente proporcional a la longitud del programa y cada gramatica LR k con k gt 1 puede ser mecanicamente transformada en una gramatica LR 1 para el mismo lenguaje En otras palabras solo es necesario tener un simbolo de prediccion para analizar cualquier gramatica libre de contexto determinista DCFG deterministic context free grammar 7 Korenjak 1969 fue el primero en demostrar que los analizadores sintacticos para los lenguajes de programacion podian ser producidos usando estas tecnicas 8 Frank DeRemer ideo las tecnicas mas practicas SLR y LALR publicadas en su tesis doctoral del MIT en 1969 9 10 Esto supuso un importante avance porque los traductores LR k como los definio Donald Knuth eran demasiado grandes para su implementacion en los sistemas informaticos de los anos 60 y 70 En la practica LALR ofrece una buena solucion porque las gramaticas LALR 1 son mas potentes que las gramaticas SLR 1 y LL 1 Las gramaticas LR 1 son mas potentes que las LALR 1 sin embargo los analizadores sintacticos LR 1 pueden ser extremadamente grandes en tamano y no se consideran practicos Los analizadores sintacticos LR 1 minimos son pequenos en tamano y comparables a los analizadores sintacticos LALR 1 La sintaxis de muchos lenguajes de programacion son definidos por una gramatica LALR 1 y por esta razon los analizadores sintacticos LALR son usados a menudo por compiladores para llevar a cabo el analisis sintactico del codigo fuente Un analizador sintactico ascendente recursivo implementa un analizador LALR usando funciones mutuamente recursivas en vez de usar tablas Por esto el analizador sintactico es directamente codificado en el lenguaje anfitrion de forma parecida al recursivo descendente La codificacion directa normalmente produce un analizador mas rapido que su equivalente basado en tablas 11 por la razon de que la compilacion es mas rapida que la interpretacion Tambien es posible en principio editar a mano un analizador sintactico recursivo ascendente donde una implementacion en forma de tabla es casi ilegible para el ser humano medio La recursion ascendente fue descrita por primera vez por Thomas Pennello en su articulo Very fast LR parsing en 1986 11 La tecnica fue expuesta despues por G H Roberts 12 en 1988 asi como en un articulo de Leermakers Augusteijn y Kruseman Aretz 13 en 1992 en el diario Theoretical Computer Science Analisis sintactico LL Editar Un analizador sintactico LL analiza la entrada de izquierda a derecha y construye una derivacion por la izquierda de la sentencia o enunciado al contrario que LR La clase de gramaticas que son analizables por este metodo son conocidas como gramaticas LL Las gramaticas LL son una clase de gramaticas libres de contexto aun mas restrictiva que las gramaticas LR Sin embargo son de gran interes para los escritores de compiladores puesto que este analizador es simple y eficiente de implementar Las gramaticas LL k pueden ser analizadas por un analizador sintactico descendente recursivo que es normalmente codificado a mano El diseno de ALGOL provoco la investigacion del recursivo descendente dado que el lenguaje ALGOL es en si mismo recursivo El concepto de analisis sintactico descendente recursivo fue objeto de debate en la edicion de enero de 1961 del CACM en articulos separados de A A Grau y Edgar T Ned Irons 14 15 Richard Waychoff concibio y uso el descendente recursivo en el compilador ALGOL de Burroughs de marzo de 1961 16 La idea de las gramaticas LL 1 fue presentada por Lewis y Stearns 1968 17 18 El recursivo descendente fue popularizado por Niklaus Wirth con PL 0 un lenguaje de programacion educacional usado para ensenar la construccion de compiladores en los anos 70 19 El analisis sintactico LR puede manejar un rango mayor de lenguajes que el analisis sintactico LL y proporciona mejores informes de errores es decir detecta errores sintacticos cuando la entrada no esta conforme a la gramatica tan pronto como sea posible Algoritmo de Earley Editar En 1970 Jay Earley invento lo que despues se llamo el Algoritmo de Earley Este algoritmo es atractivo porque puede analizar cualquier lenguaje libre de contexto de forma bastante eficiente 20 Lenguajes de descripcion de gramaticas Editar John Backus John Backus propuso formulas meta linguisticas 21 22 para describir la sintaxis del nuevo lenguaje de programacion IAL conocido hoy en dia como ALGOL 58 1959 El trabajo de Backus estaba basado en la Maquina de Post ideada por Emil Post El posterior desarrollo de ALGOL llevo al ALGOL 60 en su informe 1963 Peter Naur llamo Notacion de Backus Naur Backus Normal Form BNF a la notacion de Backus 23 y lo simplifico para minimizar el conjunto de caracteres usados Niklaus Wirth definio la Notacion de Backus Naur Extendida Extended Backus Naur Form EBNF una version refinada de la BNF a principios de los anos 70 para PL 0 La Notacion de Backus Naur Aumentada Augmented Backus Naur Form ABNF es otra variante Tanto EBNF como ABNF son muy usadas para especificar la gramatica de los lenguajes de programacion como en las entradas de los generadores de analizadores sintacticos y en otros campos como la definicion de protocolos de comunicacion Compilador de computador Editar Laboratorios Bell uno de los primeros en desarrollar un sistema operativo en un lenguaje de alto nivel PL 1 Un compilador de computador compiler compiler o generador de analizador sintactico es un programa que toma una descripcion de la gramatica formal de un lenguaje de programacion y produce un analizador sintactico para ese lenguaje El primer compilador de computador en usar ese nombre fue escrito por Tony Brooker en 1960 y fue usado para crear compiladores para la computadora Atlas en la Universidad de Manchester incluyendo el compilador Atlas Autocode Sin embargo era bastante diferente de los compiladores de computador modernos y hoy probablemente seria descrito como algo entre un compilador generico altamente personalizable y un lenguaje extensible El nombre compilador de computador era bastante mas apropiado para el sistema de Brooker de lo que lo es para la mayoria de los compiladores de computador modernos los cuales seria mejor llamarlos generadores de analizadores sintacticos Es casi seguro que el nombre compilador de computador se usa comunmente debido a Yacc mas que al trabajo de Brooker A principios de los anos 60 Robert McClure en Texas Instruments invento un compilador de computador llamado TMG el nombre extraido de transmogrificacion 24 25 26 27 En los posteriores anos TMG fue portado a muchos computadores centrales de UNIVAC e IBM El proyecto Multics un proyecto conjunto entre el MIT y los Laboratorios Bell fue uno de los primeros en desarrollar un sistema operativo en un lenguaje de alto nivel PL 1 fue escogido como el lenguaje pero un proveedor externo no podia proveer un compilador en funcionamiento 28 El equipo Multics desarrollo su propio dialecto de PL 1 llamado Early PL 1 EPL como su lenguaje de implementacion de 1964 TMG fue portado a las GE 600 series y usado para desarrollar EPL por Douglas McIlroy Robert Morris y otros No mucho despues de que Ken Thompson escribiera la primera version de Unix para el PDP 7 en 1969 Doug McIlroy creo el primer lenguaje de programacion de alto nivel del nuevo sistema una implementacion del TMG de McClure 29 TMG fue tambien la herramienta de definicion del compilador usada por Ken Thompson para escribir el compilador del lenguaje B en su PDP 7 en 1970 B fue el inmediato predecesor de C Uno de los primeros generadores de analizador sintactico LALR fue llamado TWS creado por Frank DeRemer y Tom Pennello XPL Editar XPL es un dialecto del lenguaje de programacion PL 1 desarrollado en 1967 usado para el desarrollo de compiladores de lenguajes de computacion Fue disenado e implementado por un equipo formado por William McKeeman James J Horning y David B Wortman en la Universidad Stanford y la Universidad de California Santa Cruz Se anuncio por primera vez en la Conferencia de Ordenadores de Otono de 1968 en San Francisco California 30 31 Es el nombre de tanto el lenguaje de programacion como el sistema generador de analizador sintactico LALR o TWS Translator Writing System basado en el lenguaje XPL presento un sistema de compilador de abajo a arriba bottom up compiler relativamente simple denominado MSP Mixed Strategy Precedence por sus autores Fue cargado a traves de Burroughs Algol en el computador de IBM S 360 Implementaciones posteriores de XPL ofrecieron un analizador sintactico SLR 1 Yacc Editar Yacc es un generador de analizador sintactico desarrollado por Stephen C Johnson en AT amp T para el sistema operativo Unix 32 El nombre es un acronimo de Yet Another Compiler Compiler Genera un analizador sintactico LALR 1 basado en una gramatica escrita en una notacion similar a la Notacion de Backus Naur Johnson trabajo en Yacc a principios de los anos 70 en Laboratorios Bell 33 Estaba familiarizado con TMG y su influencia puede verse en Yacc y en el diseno del lenguaje de programacion C A causa de que Yacc fue el generador de analizador sintactico por defecto en la mayoria de sistemas Unix fue ampliamente distribuido y usado Desarrollos como GNU Bison todavia estan en uso El analizador sintactico generado por Yacc requiere un analizador lexico Los generadores de analizadores lexicos tales como Lex o Flex estan ampliamente disponibles El estandar IEEE POSIX P1003 2 define la funcionalidad y los requerimientos para Lex y Yacc Compilacion cruzada EditarUn compilador cruzado se ejecuta en un entorno pero produce codigo objeto para otro Los compiladores cruzados son usados para desarrollo embebido donde el ordenador objetivo tiene capacidades limitadas Uno de los primeros ejemplos de compilacion cruzada fue AIMICO donde un programa FLOW MATIC en un UNIVAC II fue usado para generar lenguaje ensamblador para el IBM 705 que fue despues ensamblado en el computador de IBM 1 El compilador ALGOL 68C generaba una salida ZCODE que luego podia ser compilado en codigo de la maquina local por un traductor ZCODE o ejecutarlo interpretado ZCODE es un lenguaje intermedio basado en registros Esta habilidad para interpretar o compilar ZCODE fomento la portabilidad de ALGOL 68C a numerosas plataformas de computador diferentes Compiladores de optimizacion Editar Frances E Allen una pionera en el campo de la optimizacion de compiladores La optimizacion de compiladores es el proceso de mejora de la calidad del codigo objeto sin cambiar los resultados que produce Los desarrolladores del primer compilador de FORTRAN se propusieron generar codigo que fuese mejor que la media de los ensambladores codificados a mano para que los clientes pudieran usar su producto En uno de sus primeros compiladores ellos tuvieron exito 34 Posteriores compiladores como el compilador Fortran IV de IBM priorizo mas en los buenos diagnosticos y en ejecutarse mas rapidamente a costa de la optimizacion del codigo objeto No fue hasta las series IBM 360 en las que IBM proveyo dos compiladores separados en las que estuvo disponible un comprobador de ejecucion de codigo rapida y un optimizador mas lento Frances E Allen trabajando sola y conjuntamente con John Cocke presento muchos de los conceptos de optimizacion El articulo de Allen de 1966 Program Optimization 35 presento el uso de las estructuras en forma de grafo para codificar el contenido de un programa para la optimizacion 36 Su articulo de 1970 Control Flow Analysis 37 y A Basis for Program Optimization 38 establecio intervalos como el contexto para el analisis y la optimizacion del flujo de datos eficiente y efectivo Su articulo de 1971 conjunto con Cocke A Catalog of Optimizing Transformations 39 dio la primera descripcion y sistematizacion de las transformaciones de optimizacion Sus articulos de 1973 y 1974 sobre el analisis del flujo de datos interprocedural extendio el analisis a los programas por completo 40 41 Su articulo de 1976 conjunto con Cocke describe una de las dos principales estrategias de analisis usadas en los compiladores de optimizacion de hoy dia 42 Allen desarrollo e implemento sus metodos como parte de compiladores para el IBM 7030 Stretch Harvest y el experimental Advanced Computing System Este trabajo establecio la factibilidad y la estructura de los optimizadores de las maquinas modernas Ella llego a establecer y liderar el proyecto PTRAN en la ejecucion paralela automatica de programas FORTRAN 43 Su equipo PTRAN desarrollo nuevos esquemas de deteccion de paralelismo y creo el concepto de grafo de dependencias del programa el metodo de estructurado primario usado por la mayoria de los compiladores de paralelizacion Programming Languages and their Compilers de John Cocke y Jacob T Schwartz publicado por primera vez en 1970 dedico mas de 200 paginas a algoritmos de optimizacion Incluyo muchas de las ahora familiares tecnicas tales como eliminacion de codigo redundante y reduccion de esfuerzo 44 Optimizacion Peephole Editar La optimizacion Peephole es una tecnica de optimizacion muy simple pero efectiva Fue inventada por William McKeeman y publicada en 1965 en CACM 45 Fue usada en el compilador XPL que McKeeman ayudo a desarrollar Optimizador Capex COBOL Editar La Corporacion Capex desarrollo el Optimizador COBOL a mediados de los anos 70 para COBOL Este tipo de optimizador depende en este caso del conocimiento de las debilidades en el compilador IBM COBOL estandar y de hecho reemplaza o parchea secciones del codigo objeto con un codigo mas eficiente El codigo de reemplazo podria sustituir una tabla de consulta linear con una busqueda binaria por ejemplo o a veces simplemente reemplazar una instruccion relativamente lenta por una conocida mas rapida que fuese funcionalmente equivalente en su contexto Esta tecnica es ahora conocida como Reduccion de esfuerzo Por ejemplo en el hardware IBM S 360 la instruccion CLI era dependiendo del modelo entre 2 y 5 veces tan rapido como una instruccion CLC para comparaciones de un unico byte 46 47 Los compiladores modernos tipicamente proveen opciones de optimizacion para que los programadores puedan elegir si quieren o no ejecutar un pase de optimizacion Diagnosticos EditarCuando a un compilador se le pasa un programa incorrecto sintacticamente un buen claro mensaje de error es util Desde la perspectiva del escritor del compilador esto es a menudo dificil de conseguir El compilador Fortran WATFIV fue desarrollado en la Universidad de Waterloo Canada en los finales de los anos 60 Fue disenado para dar mejores mensajes de error que los compiladores Fortran de IBM de la epoca Ademas WATFIV era mucho mas utilizable porque combinaba compilacion enlazado y ejecucion en un paso mientras que los compiladores de IBM tenian tres componentes separados para su ejecucion PL C Editar PL C fue un lenguaje de programacion de computador desarrollado en la Universidad de Cornell a principios de los anos 70 Mientras que el PL C era un subconjunto del lenguaje de IBM PL 1 fue disenado con el objetivo especifico de ser usado para ensenar programacion Los dos investigadores y profesores academicos que disenaron PL C fueron Richard W Conway y Thomas R Wilcox Presentaron el famoso articulo Design and implementation of a diagnostic compiler for PL 1 publicado en las comunicaciones del ACM en marzo de 1973 48 PL C elimino algunas de las mas complejas caracteristicas de PL 1 y anadio depuracion extensiva y facilidades para recuperacion de errores El compilador PL C tenia la inusual capacidad de nunca fallar al compilar cualquier programa mediante el uso de la correccion automatica de muchos errores sintacticos y la conversion de los errores sintacticos restantes a las declaraciones de salida Vease tambien EditarCompilador Lenguaje de programacion Proceso de traduccion de programas Lenguaje ensamblador Interprete Lenguaje de alto nivel Lenguaje de bajo nivel Lenguaje de maquina Analizador sintactico LL Lex el analizador sintactico de token comunmente usado en conjuncion con Yacc y Bison Analizador lexico BNF una metasintaxis usada para expresar gramaticas libres de contexto es decir una manera formal de describir lenguajes formales Referencias Editar a b c 1 The World s First COBOL Compilers Backus et al The FORTRAN automatic coding system Proc AFIPS 1957 Western Joint Comuter Conf Spartan Books Baltimore 188 198 2 Rosen Saul ALTAC FORTRAN and compatibility Proceedings of the 1961 16th ACM national meeting T Hart and M Levin The New Compiler AIM 39 enlace roto disponible en Internet Archive vease el historial la primera version y la ultima CSAIL Digital Archive Artificial Intelligence Laboratory Series a b Tim Hart and Mike Levin AI Memo 39 The new compiler Consultado el 23 de mayo de 2008 Chomsky Noam Sep 1956 Three models for the description of language Information Theory IEEE Transactions 2 3 113 124 doi 10 1109 TIT 1956 1056813 Consultado el 18 de junio de 2007 Knuth Donald On the Translation of Languages from Left to Right Archivado desde el original el 15 de marzo de 2012 Consultado el 29 de mayo de 2011 Korenjak A A Practical Method for Constructing LR k Processors Communications of the ACM Vol 12 No 11 1969 DeRemer F Practical Translators for LR k Languages Ph D dissertation MIT 1969 DeRemer F Simple LR k Grammars Communications of the ACM Vol 14 No 7 1971 a b Thomas J Pennello 1986 Very fast LR parsing ACM SIGPLAN Notices 21 7 G H Roberts 1988 Recursive ascent an LR analog to recursive descent Leermakers Augusteijn Kruseman Aretz 1992 A functional LR parser A A Grau Recursive processes and ALGOL translation Commun ACM 4 1 pp 10 15 Jan 1961 Edgar T Irons A syntax directed compiler for ALGOL 60 Commun ACM 4 1 Jan 1961 pp 51 55 web me com ianjoyner Files Waychoff pdf P M Lewis R E Stearns Syntax directed transduction focs pp 21 35 7th Annual Symposium on Switching and Automata Theory SWAT 1966 1966 Lewis P and Stearns R Syntax Directed Transduction Journal of the ACM Vol 15 No 3 1968 The PL 0 compiler interpreter Archivado desde el original el 8 de diciembre de 2008 J Earley An efficient context free parsing algorithm Communications of the Association for Computing Machinery 13 2 94 102 1970 Backus J W 1959 The syntax and semantics of the proposed international algebraic language of the Zurich ACM GAMM Conference Proceedings of the International Conference on Information Processing UNESCO pp 125 132 Farrell James A August 1995 Compiler Basics Extended Backus Naur Form Consultado el 11 de mayo de 2011 Donald E Knuth Backus Normal Form vs Backus Naur Form Commun ACM 7 12 735 736 1964 Copia archivada Archivado desde el original el 4 de marzo de 2016 Consultado el 9 de marzo de 2012 https web archive org web 20070921161049 http hopl murdoch edu au showlanguage prx exp 242 http portal acm org citation cfm id 806050 amp dl ACM amp coll DL amp CFID 29658196 amp CFTOKEN 62044584 R M McClure TMG A Syntax Directed Compiler Proc 20th ACM National Conf 1965 pp 262 274 http multicians org pl1 html Copia archivada Archivado desde el original el 10 de enero de 2015 Consultado el 3 de agosto de 2011 Dennis M Ritchie The Development of the C Language McKeeman William Marshall Horning James J and Wortman David B A Compiler Generator 1971 ISBN 978 0 13 155077 3 Computer Science Department University of Toronto The XPL Programming Language Johnson S C Yacc Yet Another Compiler Compiler Computing Science Technical Report 32 AT amp T Bell Labs 1975 http www techworld com au article 252319 a z programming languages yacc http compilers iecc com comparch article 97 10 017 F E Allen Program optimization In Mark I Halpern and Christopher J Shaw editors Annual Review in Automatic Programming volume 5 pages 239 307 Pergamon Press New York 1969 Frances E Allen and John Cocke Graph theoretic constructs for program control flow analysis Technical Report IBM Res Rep RC 3923 IBM T J Watson Research Center Yorktown Heights NY 1972 Frances E Allen Control flow analysis ACM SIGPLAN Notices 5 7 1 19 July 1970 Frances E Allen A basis for program optimization In Proc IFIP Congress 71 pages 385 390 North Holland 1972 Frances E Allen and John Cocke A catalogue of optimizing transformations In R Rustin editor Design and Optimization of Compilers pages 1 30 Prentice Hall 1971 Frances E Allen Interprocedural data flow analysis In Proc IFIP Congress 74 pages 398 402 North Holland 1974 Frances E Allen A method for determining program data relationships In Andrei Ershov and Valery A Nepomniaschy editors Proc International Symposium on Theoretical Programming Novosibirsk USSR August 1972 volume 5 of Lecture Notes in Computer Science pages 299 308 Springer Verlag 1974 Frances E Allen and John Cocke A program data flow analysis procedure Communications of the ACM 19 3 137 147 March 1976 Vivek Sarkar The PTRAN Parallel Programming System In Parallel Functional Programming Languages and Compilers edited by B Szymanski ACM Press Frontier Series pages 309 391 1991 John Cocke and Jacob T Schwartz Programming Languages and their Compilers Courant Institute of Mathematical Sciences New York University April 1970 MCKEEMAN W M Peephole optimization Commun ACM 8 7 July 1965 443 444 http www bitsavers org pdf ibm 360 A22 6825 1 360instrTiming pdf http portal acm org citation cfm id 358732 amp dl GUIDE amp dl ACM CACM March 1973 pp 169 179 Lecturas adicionales EditarBackus John et al The FORTRAN Automatic Coding System Proceedings of the Western Joint Computer Conference Los Angeles California febrero de 1957 Describe el diseno y la implementacion del primer compilador de FORTRAN por el equipo IBM Bauer Friedrich L Eickel Jurgen Eds Compiler Construction An Advanced Course 2nd ed Lecture Notes in Computer Science 21 Springer 1976 ISBN 3 540 07542 9 Cheatham T E and Sattley K Syntax directed compilation SJCC p 31 1964 Cocke John Schwartz Jacob T Programming Languages and their Compilers Preliminary Notes Courant Institute of Mathematical Sciences technical report New York University 1969 Conway Melvin E Design of a separable transition diagram compiler Communications of the ACM Volume 6 Issue 7 Julio 1963 Floyd R W Syntactic analysis and operator precedence Journal of the ACM Vol 10 p 316 Julio 1963 Gries David Compiler Construction for Digital Computers New York Wiley 1971 ISBN 0 471 32776 X Irons Edgar T A syntax directed compiler for ALGOL 60 Communications of the ACM Vol 4 p 51 Jan 1961 Knuth D E On the translation of languages from left to right Information and Control Vol 8 p 607 1965 Knuth D E RUNCIBLE algebraic translation on a limited computer Communications of the ACM Vol 2 p 18 Nov 1959 Randell Brian Russell Lawford John ALGOL 60 Implementation The Translation and Use of ALGOL 60 Programs on a Computer Academic Press 1964 Dick Grune s Annotated Literature Lists Compiler Construction before 1980 3 Notas EditarEste articulo utiliza contenidos de History of compiler construction en Wikipedia en Ingles Datos Q3502371Obtenido de https es wikipedia org w index php title Historia de la construccion de los compiladores amp oldid 136597046, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos