Leitura do GHC Core

Core é 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.

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

Aqui está o que eu encontrei até agora:

  • Escreva Haskell tão rápido quanto C: explorando rigidez, preguiça e recursion
  • Haskell tão rápido quanto C: trabalhando em alta altitude para desempenho de baixo nível
  • RWH: Capítulo 25. Criação de perfil e otimização
  • Conversa de Haskell de alto desempenho na CUFP (slide 65-80)

O GHC Core é a linguagem do System FC na 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 a GHC faz no nível principal são refatorações de preservação de tipo dessa representação do Core, para melhorar o desempenho. E, não tão bem conhecido, você pode escrever diretamente no Core para programar o GHC.

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

insira a descrição da imagem aqui

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

  • Uma Representação Externa para a GHC Core Language , Tolmach, 2001
  • ghc / compilador / CoreSyn , a própria definição do GHC
  • Segredos do compilador Glasgow Haskell , Peyton Jones e Marlow, 1999. O Core é descrito na Seção 2.3, incluindo detalhes sobre as annotations de análise de ocorrências.
  • Um otimizador baseado em transformação para Haskell , Peyton Jones e Santos, 1998. O Core é descrito no S3, incluindo uma discussão do polymorphism e leituras operacionais do Core.

Material relacionado que pode ajudar a compreensão:

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

O núcleo por sua vez é traduzido em código STG, que se parece com algo como:

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, os primários do GHC aparecem regularmente na saída do GHC Core, quando você otimizou o seu Haskell até as instruções básicas que o GHC conhece. O conjunto primop é fornecido como um conjunto de funções principais em um arquivo pré-processado.

Uma dica: Se você não se preocupa com annotations de tipos e coerções, use -ddump-simpl juntamente com a opção -dsuppress-all . A saída do Core deve ser muito mais legível.

Embora não seja exatamente a linguagem do GHC Core, como Don menciona a linguagem STG é bastante semelhante. Eu recentemente passei pelo exercício de provar a segurança do tipo da linguagem + máquina STG, e depois descobri que conseguia entender facilmente o Core.

O texto que eu usei para aprender STG é bastante acessível: Implementando Lazy Functional Languages ​​no Stock Hardware: O Spineless Tagless G-machine de Simon Peyton-Jones. Grande parte do artigo trata de detalhes de 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 familiares como o map .

“Uma Representação Externa para o GHC Core Language” é um documento que pode ser encontrado na instalação do ghc ( share/doc/ghc/core.pdf ) ou na internet .