stringtranslate.com

Compilador Glasgow Haskell

Glasgow Haskell Compiler ( GHC ) es un compilador de código nativo o de máquina para el lenguaje de programación funcional Haskell . [5] Proporciona un entorno de software multiplataforma para escribir y probar código Haskell y admite muchas extensiones, bibliotecas y optimizaciones que agilizan el proceso de generación y ejecución de código. GHC es el compilador Haskell más utilizado. [6] Es un software gratuito y de código abierto publicado bajo una licencia BSD .

Historia

GHC comenzó originalmente en 1989 como un prototipo, escrito en Lazy ML (LML) por Kevin Hammond en la Universidad de Glasgow . Más tarde ese año, el prototipo fue completamente reescrito en Haskell, excepto por su analizador , por Cordelia Hall, Will Partain y Simon Peyton Jones. Su primera versión beta fue el 1 de abril de 1991. Las versiones posteriores agregaron un analizador de estrictez y extensiones de lenguaje como E/S monádica , matrices mutables, tipos de datos no encapsulados, modelos de programación concurrente y paralela (como memoria transaccional de software y paralelismo de datos ) y un generador de perfiles . [2]

Peyton Jones y Marlow se trasladaron posteriormente a Microsoft Research en Cambridge , donde continuaron siendo los principales responsables del desarrollo de GHC. GHC también contiene código de más de trescientos colaboradores. [1] Desde 2009 hasta aproximadamente 2014, las contribuciones de terceros a GHC fueron financiadas por el Industrial Haskell Group. [7]

Nombres de GHC

Desde los primeros lanzamientos, el sitio web oficial [8] se ha referido a GHC como The Glasgow Haskell Compiler , mientras que en la versión ejecutable command se identifica como The Glorious Glasgow Haskell Compilation System . [9] Esto se ha reflejado en la documentación. [10] Inicialmente, tenía el nombre interno de The Glamorous Glasgow Haskell Compiler . [11]

Arquitectura

GHC está escrito en Haskell , [12] pero el sistema de ejecución de Haskell, esencial para ejecutar programas, está escrito en C y C-- .

El front-end de GHC , que incorpora el analizador léxico , el analizador sintáctico y el verificador de tipos , está diseñado para preservar la mayor cantidad posible de información sobre el lenguaje fuente hasta que se complete la inferencia de tipos , con el objetivo de proporcionar mensajes de error claros a los usuarios. [2] Después de la verificación de tipos, el código Haskell se desglosa en un lenguaje intermedio tipado conocido como "Core" (basado en System F , extendido con expresiones lety case). Core se ha extendido para admitir tipos de datos algebraicos generalizados en su sistema de tipos , y ahora se basa en una extensión de System F conocida como System F C. [13]

En la tradición de la compilación dirigida por tipos, el simplificador de GHC, o "extremo medio", donde se realizan la mayoría de las optimizaciones implementadas en GHC, está estructurado como una serie de transformaciones de fuente a fuente en el código Core. Los análisis y transformaciones realizados en esta etapa del compilador incluyen análisis de demanda (una generalización del análisis de estrictez ), aplicación de reglas de reescritura definidas por el usuario (incluido un conjunto de reglas incluidas en las bibliotecas estándar de GHC que realizan la fusión foldr/build ), desdoblamiento (llamado " inlining " en compiladores más tradicionales), let-floating, un análisis que determina qué argumentos de función se pueden desempaquetar, análisis de resultados de productos construidos , especialización de funciones sobrecargadas y un conjunto de transformaciones locales más simples como plegado constante y reducción beta . [14]

El back end del compilador transforma el código Core en una representación interna de C--, a través de un lenguaje intermedio STG (abreviatura de "Spineless Tagless G-machine"). [15] El código C-- puede tomar una de tres rutas: se imprime como código C para compilación con GCC , se convierte directamente en código de máquina nativo (la tradicional fase de " generación de código "), o se convierte a LLVM IR para compilación con LLVM. En los tres casos, el código nativo resultante se vincula finalmente con el sistema de ejecución de GHC para producir un ejecutable.

Idioma

GHC cumple con los estándares de lenguaje, tanto Haskell 98 [16] como Haskell 2010. [ 17] También admite muchas extensiones opcionales al estándar Haskell: por ejemplo, la biblioteca de memoria transaccional de software (STM), que permite transacciones de memoria componibles .

Extensiones para Haskell

Se han propuesto muchas extensiones de Haskell que proporcionan características no descritas en la especificación del lenguaje o que redefinen construcciones existentes. Por ello, es posible que no todas las implementaciones de Haskell admitan cada extensión. Hay un esfuerzo continuo [18] para describir las extensiones y seleccionar aquellas que se incluirán en futuras versiones de la especificación del lenguaje.

Las extensiones [19] compatibles con el compilador Glasgow Haskell incluyen:

Extensiones del sistema de tipos

Un sistema de tipos estáticos expresivos es una de las principales características definitorias de Haskell. Por ello, gran parte del trabajo de extensión del lenguaje se ha dirigido a los tipos de datos y las clases de tipos .

El compilador Glasgow Haskell admite un sistema de tipos extendido basado en el sistema teórico FC . [ 13] Las principales extensiones del sistema de tipos incluyen:

Las extensiones relacionadas con las clases de tipos incluyen:

Portabilidad

Existen versiones de GHC para varios sistemas o plataformas informáticas , incluidos Windows y la mayoría de las variedades de Unix (como Linux , FreeBSD , OpenBSD y macOS ). [22] GHC también se ha adaptado a varias arquitecturas de procesador diferentes . [22]

Véase también

Referencias

  1. ^ ab "El equipo de GHC". Haskell.org . Consultado el 1 de septiembre de 2016 .
  2. ^ abc Hudak, P.; Hughes, J.; Peyton Jones, S .; Wadler, P. (junio de 2007). "Una historia de Haskell: ser perezoso con las clases" (PDF) . Procedimientos de la Tercera Conferencia de Historia de los Lenguajes de Programación SIGPLAN de ACM (HOPL-III) . Consultado el 1 de septiembre de 2016 .
  3. ^ "Descargar – El compilador Glasgow Haskell". Haskell.org .
  4. ^ ab "Desuso de las plataformas Darwin y Windows de 32 bits". Equipo GHC.
  5. ^ "Guía del usuario del glorioso sistema de compilación Haskell de Glasgow". Haskell.org . Consultado el 27 de julio de 2014 .
  6. ^ "Resultados de la encuesta sobre el estado de Haskell en 2017". taylor.fausak.me . 15 de noviembre de 2017 . Consultado el 11 de diciembre de 2017 .
  7. ^ "Industrial Haskell Group". Haskell.org . 2014 . Consultado el 1 de septiembre de 2016 .
  8. ^ "GHC El compilador Glasgow Haskell". Haskell.org . Consultado el 14 de enero de 2022 .
  9. ^ "Repositorio: configure.ac". gitlab.haskell.org . 12 de enero de 2022 . Consultado el 14 de enero de 2022 .
  10. ^ "Guía del usuario del glorioso sistema de compilación Glasgow Haskell, versión 7.6.3". downloads.haskell.org . Consultado el 14 de enero de 2022 .
  11. ^ "ghc-0.29-src.tar.gz" ( tar gzip ) . downloads.haskell.org . Archivo: ghc-0.29/ghc/PATCHLEVEL . Consultado el 14 de enero de 2022 .
  12. ^ "Comentario de GHC: El compilador". Haskell.org . 23 de marzo de 2016. Archivado desde el original el 23 de marzo de 2016. Consultado el 26 de mayo de 2016 .
  13. ^ ab Sulzmann, M.; Chakravarty, MMT; Peyton Jones, S .; Donnelly, K. (enero de 2007). "Sistema F con coerciones de igualdad de tipos". Procedimientos del taller de la ACM sobre tipos en el diseño e implementación de lenguajes (TLDI) .
  14. ^ Peyton Jones, S. (abril de 1996). "Compilación de Haskell mediante transformación de programas: un informe desde las trincheras". Procedimientos del Simposio Europeo de Programación (ESOP) .
  15. ^ Peyton Jones, S. (abril de 1992). "Implementación de lenguajes funcionales perezosos en hardware estándar: la máquina G sin etiquetas y sin espinas, versión 2.5". Revista de programación funcional . 2 (2): 127–202. doi :10.1017/S0956796800000319.
  16. ^ "Lenguaje y bibliotecas Haskell 98: informe revisado". Haskell.org . Consultado el 28 de enero de 2007 .
  17. ^ "Haskell 2010 Language Report". Haskell.org . Consultado el 30 de agosto de 2012 .
  18. ^ "Bienvenido a Haskell (Haskell Prime)". Haskell.org . Archivado desde el original el 20 de febrero de 2016. Consultado el 26 de mayo de 2016 .
  19. ^ "Características del lenguaje GHC". Haskell.org . Archivado desde el original el 29 de junio de 2016. Consultado el 25 de mayo de 2016 .
  20. ^ Coutts, D.; Leshchinskiy, R.; Stewart, D. (abril de 2007). "Fusión de flujos: de listas a flujos y a nada en absoluto". Procedimientos de la Conferencia internacional sobre programación funcional (ICFP) de la ACM SIGPLAN . Archivado desde el original el 23 de septiembre de 2007.
  21. ^ Mitchell, Neil; Fletcher, Shayne (3 de mayo de 2020). «Sintaxis de registro de puntos». ghc-proposals . GitHub . Consultado el 30 de junio de 2020 .
  22. ^ Plataformas en gitlab.haskell.org

Enlaces externos