web-dev-qa-db-fra.com

Lecture de GHC Core

Le noyau 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:

188
tibbe

GHC Core est la langue System FC dans laquelle tous les Haskell sont traduits. La grammaire (approximative) de Core est donnée par:

enter image description here

Le noyau est étroitement lié au plus simple et mieux connu System F . Tous les transformations que GHC fait au niveau Core sont des refactorings préservant le 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 c'était le cas en 2002, sans-LLVM et CMM):

enter image description here

Les principaux documents à connaître sur GHC Core sont:

Documents connexes pouvant aider à la compréhension:

  • Le sortie GHC -fext-core
  • J'ai passé beaucoup de temps à apprendre Core en lisant la source GHC. Certains sont décrits dans mon 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.

Le noyau est à son tour traduit en code STG, qui ressemble à ceci:

enter image description here

Les noms drôles dans Core sont encodés dans le "Z-encoding":

enter image description here

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

enter image description here

Enfin, les GHC primops apparaissent régulièrement dans la sortie GHC Core, lorsque vous avez optimisé votre Haskell jusqu'aux instructions de base dont GHC est au courant. L'ensemble primop est donné comme un ensemble de fonctions de base dans n fichier prétraité.

263
Don Stewart

Un conseil: si vous ne vous souciez pas des annotations de type et des contraintes, utilisez -ddump-simpl avec la -dsuppress-all option. La sortie Core devrait être beaucoup plus lisible.

24
nominolo

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 de la machine + langage STG, puis j'ai découvert que je pouvais facilement comprendre Core.

Le texte que j'ai utilisé pour apprendre le STG est assez accessible: Implémentation de langages fonctionnels paresseux sur le matériel courant: la machine G sans étiquette sans rotation par Simon Peyton-Jones. Une grande partie du document 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 donne des motivations pour certaines des décisions de conception contre-intuitives et fournit des traductions d'exemples familiers comme map.

8
acfoltzer

"Une représentation externe pour le langage GHC Core" est un document qui se trouve dans l'installation de ghc (share/doc/ghc/core.pdf) ou sur Internet .

3
Roman Cheplyaka