Lectura del núcleo GHC

Resuelto tibbe asked hace 13 años • 4 respuestas

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)
tibbe avatar May 25 '11 14:05 tibbe
Aceptado

GHC Core es el lenguaje System FC al que se traduce todo Haskell. La gramática (aproximada) de Core viene dada por:

ingrese la descripción de la imagen aquí

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):

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

Los nombres divertidos en Core están codificados en "codificación Z":

ingrese la descripción de la imagen aquí

Tipos y clases de GHC Core (del artículo de Tolmach):

ingrese la descripción de la imagen aquí

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.

Don Stewart avatar May 25 '2011 08:05 Don Stewart

Un consejo: si no le interesan las anotaciones de tipo y las coerciones, utilícela -ddump-simpljunto con la -dsuppress-allopción. La salida del Core debería ser mucho más legible.

nominolo avatar May 26 '2011 15:05 nominolo

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.

acfoltzer avatar May 26 '2011 03:05 acfoltzer

"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 .

Roman Cheplyaka avatar May 25 '2011 08:05 Roman Cheplyaka