performance - Lectura de GHC Core
compiler-construction haskell (4)
"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 .
Core es el lenguaje intermedio de GHC. Reading Core puede ayudarlo a comprender mejor el rendimiento de su programa. Alguien me pidió documentación o tutoriales sobre la lectura de Core, pero no pude encontrar mucho.
¿Qué documentación está disponible para leer GHC Core?
Esto es lo que he encontrado hasta ahora:
Aunque no es exactamente el lenguaje GHC Core, como Don menciona que el lenguaje STG es bastante similar. Recientemente realicé el ejercicio de probar la seguridad del tipo del lenguaje STG + máquina, y luego descubrí que podía entender el núcleo fácilmente.
El texto que utilicé para aprender STG es bastante accesible: Implementación de lenguajes funcionales vagos en hardware común: la máquina G sin etiquetas sin espinas de Simon Peyton-Jones. Gran parte del documento se refiere a 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 da motivaciones para algunas de las decisiones de diseño contraintuitivas y proporciona traducciones de ejemplos familiares como el map
.
GHC Core es el lenguaje System FC en el que se traduce todo Haskell. La gramática (aproximada) para Core está dada por:
El núcleo está estrechamente relacionado con el Sistema F más simple y mejor conocido. Todas las transformaciones que hace GHC en el nivel Core son refactorizaciones que preservan el tipo de esta representación Core para mejorar el rendimiento. Y, no tan conocido, puede escribir directamente en Core para programar GHC.
GHC Core encaja en la tubería del compilador (como lo fue en 2002, sans-LLVM y CMM):
Los principales documentos para aprender sobre GHC Core son:
- Una representación externa para el lenguaje principal de GHC , Tolmach, 2001
- ghc/compiler/CoreSyn , la definición de GHC en sí
- Los secretos del compilador del compilador Haskell de Glasgow , Peyton Jones y Marlow, 1999. El núcleo se describe en la Sección 2.3, que incluye detalles sobre las anotaciones del análisis de ocurrencias.
- Un optimizador basado en la transformación para Haskell , Peyton Jones y Santos, 1998. Core se describe en S3, que incluye una discusión sobre el polimorfismo y las lecturas operacionales de Core.
Material relacionado que puede ayudar a la comprensión:
- La salida GHC -fext-core
- Pasé mucho tiempo aprendiendo Core leyendo la fuente de GHC. Algo se describe en mi tesis de pregrado de 2002, de la página 16.
- Desde el uso de la herramienta ghc-core , para generar Core en un formato que me parece agradable.
El núcleo, a su vez, se traduce al código STG, que se ve más o menos así:
Los nombres divertidos en Core están codificados en la "codificación Z":
Tipos y tipos de GHC Core (del documento de Tolmach):
Finalmente, las primops de GHC aparecen regularmente en la salida del GHC Core, cuando has optimizado tu Haskell siguiendo las instrucciones básicas que GHC conoce. El conjunto primop se proporciona como un conjunto de funciones Core en un archivo preprocesado.
Un consejo: si no te importan las anotaciones y las coerciones, utiliza -ddump-simpl
junto con la opción -dsuppress-all
. La salida del núcleo debería ser mucho más legible.