Lectura del núcleo GHC
Core es el lenguaje intermedio de GHC. Reading Core puede ayudarle a comprender mejor el rendimiento de su programa. Alguien me pidió documentación o tutoriales sobre cómo leer Core, pero no pude encontrar mucho.
¿Qué documentación está disponible para leer GHC Core?
Esto es lo que he encontrado hasta ahora:
- Escriba Haskell tan rápido como C: explotando el rigor, la pereza y la recursividad
- Haskell tan rápido como C: trabajando a gran altura para un rendimiento de bajo nivel
- RWH: Capítulo 25. Perfilado y optimización
- Charla de Haskell de alto rendimiento en CUFP (diapositiva 65-80)
GHC Core es el lenguaje System FC al que se traduce todo Haskell. La gramática (aproximada) de Core viene dada por:
Core está estrechamente relacionado con el System F, más simple y mejor conocido . Todas las transformaciones que GHC realiza en el nivel Core son refactorizaciones que preservan el tipo de esta representación Core, para mejorar el rendimiento. Y, no tan conocido, puedes escribir directamente en Core para programar GHC.
GHC Core encaja en el proceso del compilador (como lo era en 2002, sin-LLVM y CMM):
Los documentos principales para aprender sobre GHC Core son:
- Una representación externa del lenguaje central GHC , Tolmach, 2001
GHC.Core.Expr
, la propia definición de GHC- Secrets of the Glasgow Haskell Compiler inliner , Peyton Jones y Marlow, 1999. El núcleo se describe en la Sección 2.3, incluidos detalles sobre las anotaciones del análisis de ocurrencia.
- Un optimizador basado en transformaciones para Haskell , Peyton Jones y Santos, 1998. Core se describe en S3, incluida una discusión sobre polimorfismo y lecturas operativas de Core.
Material relacionado que puede ayudar a la comprensión:
- La salida GHC -fext-core
- Pasé mucho tiempo aprendiendo Core leyendo la fuente GHC. Algunos se describen en mi tesis de pregrado de 2002, a partir de la página 16.
- Desde usar la herramienta ghc-core hasta generar Core en un formato que me agrada.
Core, a su vez, se traduce a código STG, que se parece a:
Los nombres divertidos en Core están codificados en "codificación Z":
Tipos y clases de GHC Core (del artículo de Tolmach):
Finalmente, los primops de GHC aparecen regularmente en la salida de GHC Core, cuando ha optimizado su Haskell hasta las instrucciones básicas que GHC conoce. El conjunto primop se proporciona como un conjunto de funciones principales en un archivo preprocesado.
Un consejo: si no le interesan las anotaciones de tipo y las coerciones, utilícela -ddump-simpl
junto con la -dsuppress-all
opción. La salida del Core debería ser mucho más legible.
Aunque no es exactamente el lenguaje GHC Core, como Don menciona, el lenguaje STG es bastante similar. Recientemente realicé el ejercicio de demostrar la seguridad de tipos de la máquina + lenguaje STG y luego descubrí que podía entender Core fácilmente.
El texto que utilicé para aprender STG es bastante accesible: Implementación de lenguajes funcionales perezosos en hardware estándar: la máquina G sin etiquetas y sin columna por Simon Peyton-Jones. Gran parte del artículo se ocupa de los detalles de implementación, pero recomiendo la sección 4 en particular como una explicación de arriba a abajo del lenguaje STG que brinda motivaciones para algunas de las decisiones de diseño contraintuitivas y proporciona traducciones de ejemplos familiares como map
.
"Una representación externa para el lenguaje principal de GHC" es un documento que se puede encontrar en la instalación de ghc ( share/doc/ghc/core.pdf
) o en Internet .