Lectura de GHC Core

193

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 lectura de Core, pero no pude encontrar mucho.

¿Qué documentación hay disponible para leer GHC Core?

Esto es lo que he encontrado hasta ahora:

tibbe
fuente
Ver también stackoverflow.com/questions/6048194/…
Don Stewart,
skillmatter.com/skillscasts/… también podría ser útil.
Erik Kaplun

Respuestas:

272

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

ingrese la descripción de la imagen aquí

Core está estrechamente relacionado con el Sistema F más simple y mejor conocido . Todas las transformaciones que GHC realiza en el nivel Core son refactorizaciones de preservación de 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, sin LLVM y CMM):

ingrese la descripción de la imagen aquí

Los documentos principales para aprender sobre GHC Core son:

Material relacionado que puede ayudar a comprender:

  • La salida GHC -fext-core
  • Pasé mucho tiempo aprendiendo Core leyendo la fuente de GHC. Algunos se describen 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.

Core a su vez se traduce en código STG, que se parece a:

ingrese la descripción de la imagen aquí

Los nombres divertidos en Core están codificados en la "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 a las instrucciones básicas que GHC conoce. El conjunto primop se proporciona como un conjunto de funciones principales en un archivo preprocesado.

Don Stewart
fuente
61
Cada respuesta que das siempre es ridículamente completa. Tener otro voto positivo y seguir así; Estoy inclinado montones.
Robert Massaioli
3
La cantidad de documentación de CC-wiki que Don y la comunidad general de Haskell han publicado a través de SO es asombrosa. ¡Sigan con las buenas Q's y A's, todos!
Dan Burton
44
Sé que se menciona, pero creo que la utilidad de ghc-core debería enfatizarse en la respuesta.
Nikita Volkov
24

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

nominolo
fuente
55
-dsuppress-allEs realmente útil. También puede usarlo -dsuppress-coercionssi solo desea deshacerse de los moldes (útil cuando hay muchos tipos nuevos).
tibbe
8

Aunque no es exactamente el lenguaje GHC Core, como Don menciona, el lenguaje STG es bastante similar. Recientemente realicé el ejercicio de probar la seguridad de tipo de la máquina STG language +, y luego descubrí que podía entender Core fácilmente.

El texto que solía aprender STG es bastante accesible: Implementación de lenguajes funcionales perezosos en hardware de stock: la máquina G sin etiqueta 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 brinda motivaciones para algunas de las decisiones de diseño contra intuitivas y proporciona traducciones de ejemplos familiares como map.

acfoltzer
fuente
STG es un nivel mucho más bajo que Core. El canal de compilación es: Haskell -> Core -> STG -> C-- -> Código de máquina
Akangka
3

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