compiler-construction - descargar - instalar haskell en ubuntu
¿Cómo funciona un compilador Haskell? (5)
¿Dónde puedo obtener algún documento / documento / lo que describa cómo funciona realmente un compilador Haskell? Leí bastantes documentos de GHC, pero me detuve después de sufrir un dolor de cabeza. Por lo tanto, sería preferible algo que no requiera un doctorado para entenderlo y que no esté escrito en el estilo You''re supuestamente para ser ya familiar. Sin embargo, no es un problema si es realmente largo y toma algo de tiempo entenderlo.
PD: lo más interesante sería algo sobre GHC, pero todo está bien.
¡Puedes obtener una respuesta de la boca del caballo! Simon Peyton Jones (asistente de GHC) escribió un libro que explica cómo implementar lenguajes de programación funcionales. Está disponible de forma gratuita en línea ya que está agotado: http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/
Por supuesto, GHC ha avanzado desde que se escribió el libro, pero sigue siendo muy relevante.
Desafortunadamente, sospecho que lo que estás buscando no existe. La teoría del compilador y la teoría del lenguaje formal son temas razonablemente complejos en informática, y Haskell no es en absoluto un punto de partida.
Primero, probablemente deberías obtener una buena base en:
- Análisis léxico: http://en.wikipedia.org/wiki/Lexical_analysis
- Análisis: http://en.wikipedia.org/wiki/Parsing#Programming_languages
- Sistemas de gramática sin contexto (y otros) (CFG, BNF)
- Generación de código: http://en.wikipedia.org/wiki/Code_generation_(compiler )
Sospecho que cualquier cosa que explique algo sobre el funcionamiento interno de Haskell requeriría una comprensión mucho mejor de los temas anteriores que decir, C lo haría.
Hasta ahora he tomado un curso único sobre el tema, por lo que no tengo literatura formal que recomendar, pero estoy seguro de que existen muchas buenas fuentes.
¿Está buscando detalles especialmente sobre compilar evaluación diferida? Hay un libro de Simon Peyton-Jones mencionado por Max Bolingbroke, y el libro que detalla la implementación de Clean está en línea:
http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting
Si tienes una afiliación universitaria y quieres algo más pequeño, podrías intentar obtener estos libros (Henderson & Diller están definitivamente agotados):
Antoni Diller "Compilación de idiomas de funciones" ISBN 0 471 92027 4
Peter Henderson "Aplicación de Programación Funcional e Implementación" ISBN 0-13-331579-7
AJT Davie "Una introducción a los sistemas de programación funcional utilizando Haskell" ISBN 0 521 27724 8
Diller tiene un compilador completo para un lenguaje lento (implementado en Pascal) a través de la reducción del combinador. Esta fue la técnica de implementación inventada por David Turner para SASL. Henderson tiene muchas partes de un compilador para LISPkit, una variante en miniatura y floja de Lisp. Davie detalla un poco de la maquinaria para compilar un lenguaje perezoso, por ejemplo, hay una descripción del STG que es mucho más corta que el libro de Simon Peyton-Jones (el STG es la máquina abstracta que SPJ usó para Haskell).
Los desarrolladores de Clean tienen bastante información sobre la implementación de SAPL (un lenguaje de aplicación simple) si consulta su lista de publicaciones:
http://www.st.cs.ru.nl/Onderzoek/Publicaties/publicaties.html
Finalmente, hay un buen número de documentos que documentan aspectos del compilador UHC de Utrecht Haskell (y EHC). Creo que la mayoría de la información es cómo se organiza el compilador (con gramáticas de atributos y "Shuffle") y cómo se implementan los sistemas de tipos (hay varios niveles de sistema de tipos en EHC), en lugar de cómo la ''compilación'' de back-end trabajos.
Los compiladores son un gran tema y sería imposible explicarlos en su totalidad aquí. Pero aquí hay una descripción general de un compilador general. Con suerte, esto le dará una comprensión que puede hacer que la lectura de cosas específicamente sobre GHC sea un poco más fácil de entender.
Los compiladores generalmente trabajan mediante una serie de transformaciones en 2 partes, el front-end y el back-end.
La primera transformación es convertir el texto plano en algo un poco más fácil de atravesar. Esto en sí mismo generalmente se divide en 2 partes:
Análisis léxico o tokenización : el acto de transformar el texto plano en pequeños fragmentos (normalmente operadores, identificadores, literales, etc.).
Análisis sintáctico o análisis sintáctico : convertir estos pequeños trozos en una estructura de árbol. (típicamente un AST, un Árbol de sintaxis abstracto )
La siguiente etapa es el análisis semántico. En esta etapa, un compilador usualmente agregará información al AST (como información de tipo) y construirá una tabla de símbolos. Eso concluye el front-end.
La siguiente transformación transforma el AST en un IR, una Representación Intermedia . Esto es generalmente, hoy en día un formulario de SSA, una única tarea estática .
Esto se optimiza a través de Propagación constante, Análisis de código muerto, Vectorización, etc.
La última transformación es la generación de código. Transformando el IR en código de máquina. Esto puede ser muy complicado. También se lo conoce como descenso.
Para más información, recomiendo esta página de wikipedia .
Wikipedia tiene una visión general fácil de leer de las partes internas del GHC (similar a la explicación de @ dan_waterworth, pero específica para Haskell y el GHC):
http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler#Architecture