Lecture de GHC Core

193

Core est le langage intermédiaire de GHC. Reading Core peut vous aider à mieux comprendre les performances de votre programme. Quelqu'un m'a demandé de la documentation ou des tutoriels sur la lecture de Core, mais je n'ai pas trouvé grand-chose.

Quelle documentation est disponible pour lire GHC Core?

Voici ce que j'ai trouvé jusqu'à présent:

Tibbe
la source
Skillsmatter.com/skillscasts/ ... pourrait également être utile.
Erik Kaplun du

Réponses:

274

GHC Core est le langage System FC dans lequel tout Haskell est traduit. La grammaire (approximative) pour Core est donnée par:

entrez la description de l'image ici

Core est étroitement lié au système F plus simple et mieux connu . Toutes les transformations effectuées par GHC au niveau Core sont des refactorisations de préservation du type de cette représentation Core, pour améliorer les performances. Et, pas si bien connu, vous pouvez écrire directement dans Core pour programmer GHC.

GHC Core s'intègre dans le pipeline du compilateur (comme en 2002, sans-LLVM et CMM):

entrez la description de l'image ici

Les principaux documents pour en savoir plus sur GHC Core sont:

Matériel connexe pouvant aider à la compréhension:

  • La sortie GHC -fext-core
  • J'ai passé beaucoup de temps à apprendre Core en lisant la source GHC. Certains sont décrits dans ma thèse de premier cycle de 2002, à partir de la page 16.
  • De l'utilisation de l' outil ghc-core , pour générer Core dans un format que je trouve agréable.

Core à son tour est traduit en code STG, qui ressemble à quelque chose comme:

entrez la description de l'image ici

Les noms amusants dans Core sont encodés dans le "Z-encoding":

entrez la description de l'image ici

Types et types de GHC Core (d'après l'article de Tolmach):

entrez la description de l'image ici

Enfin, les primops de GHC apparaissent régulièrement dans la sortie de GHC Core, lorsque vous avez optimisé votre Haskell jusqu'aux instructions de base que GHC connaît. L'ensemble primop est donné sous la forme d'un ensemble de fonctions Core dans un fichier prétraité.

Don Stewart
la source
63
Chaque réponse que vous donnez est toujours ridiculement complète. Ayez un autre vote positif et continuez; Je me penche des tas.
Robert Massaioli
3
La quantité de documentation CC-wiki que Don et la communauté Haskell en général ont publiée via SO est stupéfiante. Continuez les bons Q et A, tout le monde!
Dan Burton
4
Je sais que c'est mentionné, mais je pense que l'utilité de ghc-core devrait être soulignée dans la réponse.
Nikita Volkov
24

Un conseil: si vous ne vous souciez pas des annotations de type et des coercitions, utilisez- -ddump-simplles avec l' -dsuppress-alloption. La sortie Core devrait être beaucoup plus lisible.

nominolo
la source
5
-dsuppress-allest vraiment utile. Vous pouvez également l'utiliser -dsuppress-coercionssi vous souhaitez uniquement vous débarrasser des cast (utile lorsqu'il y a beaucoup de nouveaux types autour).
tibbe
8

Bien que ce ne soit pas exactement le langage GHC Core, comme Don le mentionne, le langage STG est assez similaire. J'ai récemment effectué un exercice de vérification de la sécurité de type du langage STG + machine, et ensuite j'ai découvert que je pouvais facilement comprendre Core.

Le texte que j'ai utilisé pour apprendre STG est assez accessible: Implémentation de langages fonctionnels paresseux sur du matériel de stock: la machine G Spineless Tagless de Simon Peyton-Jones. Une grande partie de l'article concerne les détails de mise en œuvre, mais je recommande la section 4 en particulier comme une explication de haut en bas du langage STG qui motive certaines des décisions de conception contre-intuitives et fournit des traductions d'exemples familiers tels que map.

acfoltzer
la source
STG est un niveau beaucoup plus bas que Core. Le pipeline de compilation est: Haskell -> Core -> STG -> C-- -> Machine Code
Xwtek
3

"Une représentation externe pour le langage de base GHC" est un document qui peut être trouvé dans l'installation de ghc ( share/doc/ghc/core.pdf) ou sur Internet .

Roman Cheplyaka
la source