Lendo o GHC Core

193

O núcleo é a linguagem intermediária do GHC. O Reading Core pode ajudá-lo a entender melhor o desempenho do seu programa. Alguém me pediu documentação ou tutoriais sobre a leitura do Core, mas não consegui encontrar muita coisa.

Que documentação está disponível para leitura do GHC Core?

Aqui está o que eu encontrei até agora:

tibbe
fonte
Veja também stackoverflow.com/questions/6048194/…
Don Stewart
skillsmatter.com/skillscasts/… também pode ser útil.
Erik Kaplun

Respostas:

272

O GHC Core é o idioma do System FC para o qual todo o Haskell é traduzido. A gramática (aproximada) do Core é dada por:

insira a descrição da imagem aqui

O Core está intimamente relacionado ao Sistema F mais simples e mais conhecido . Todas as transformações que o GHC realiza no nível Core são refatorações de preservação de tipo dessa representação Core, para melhorar o desempenho. E, não tão conhecido, você pode escrever diretamente no Core para programar o GHC.

O GHC Core se encaixa no pipeline do compilador (como em 2002, sans-LLVM e CMM):

insira a descrição da imagem aqui

Os documentos principais para aprender sobre o GHC Core são:

Material relacionado que pode ajudar a entender:

  • A saída GHC -fext-core
  • Passei muito tempo aprendendo o Core lendo a fonte do GHC. Alguns são descritos em minha tese de graduação de 2002, na página 16.
  • Ao usar a ferramenta ghc-core , para gerar o Core em um formato que eu acho agradável.

O Core, por sua vez, é traduzido para o código STG, que se parece com:

insira a descrição da imagem aqui

Os nomes engraçados no Core são codificados na "codificação Z":

insira a descrição da imagem aqui

Tipos e tipos do GHC Core (do artigo de Tolmach):

insira a descrição da imagem aqui

Finalmente, as instruções do GHC aparecem regularmente na saída do GHC Core, quando você otimiza seu Haskell com as instruções básicas que o GHC conhece. O conjunto de primop é fornecido como um conjunto de funções principais em um arquivo pré-processado.

Don Stewart
fonte
61
Cada resposta que você dá é sempre ridiculamente completa. Tenha outro voto positivo e mantenha-o; Eu estou me inclinando.
Robert Massaioli #
3
A quantidade de documentação do CC-wiki que Don e a comunidade geral de Haskell divulgaram via SO é impressionante. Mantenha os bons Q's e A's, pessoal!
Dan Burton
4
Eu sei que é mencionado, mas acho que a utilidade do ghc-core deve ser enfatizada na resposta.
Nikita Volkov
24

Uma dica: se você não se importa com as anotações e coações de tipo, use -ddump-simpljunto com a -dsuppress-allopção A saída Core deve ser muito mais legível.

nominolo
fonte
5
-dsuppress-allé realmente útil. Você também pode usá- -dsuppress-coercionslo se quiser se livrar das transmissões (útil quando houver muitos tipos novos por aí).
Tibbe
8

Embora não seja exatamente o idioma central do GHC, como Don menciona, o idioma STG é bastante semelhante. Recentemente, passei pelo exercício de provar a segurança de tipo da linguagem STG + machine e depois descobri que podia entender o Core facilmente.

O texto que eu aprendi sobre STG é bastante acessível: Implementando Idiomas Funcionais Preguiçosos no Hardware de Estoque: A máquina G Spineless Tagless de Simon Peyton-Jones. Grande parte do artigo está relacionada aos detalhes da implementação, mas eu recomendo a seção 4, em particular, como uma explicação de cima para baixo da linguagem STG que fornece motivações para algumas das decisões de design contra-intuitivas e fornece traduções de exemplos conhecidos map.

acfoltzer
fonte
O STG é um nível muito mais baixo que o Core. O gasoduto compilação é: Haskell -> Núcleo -> STG -> C-- -> Código de Máquina
Akangka
3

"Uma representação externa para a linguagem principal do GHC" é um documento que pode ser encontrado na instalação do ghc ( share/doc/ghc/core.pdf) ou na internet .

Roman Cheplyaka
fonte