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:



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.


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.


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.


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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.