Leggendo GHC Core

Il nucleo è il linguaggio intermedio di GHC. Reading Core può aiutarti a capire meglio le prestazioni del tuo programma. Qualcuno mi ha chiesto documentazione o tutorial sulla lettura di Core, ma non sono riuscito a trovare molto.

Quale documentazione è disponibile per leggere GHC Core?

Ecco cosa ho trovato finora:

  • Scrivi Haskell alla velocità di C: sfruttando rigore, pigrizia e ricorsione
  • Haskell veloce come C: lavora ad alta quota per prestazioni a basso livello
  • RWH: Capitolo 25. Profilazione e ottimizzazione
  • Haskell ad alta performance parla al CUFP (slide 65-80)

GHC Core è il linguaggio System FC in cui viene tradotto tutto Haskell. La grammatica (approssimativa) per Core è data da:

inserisci la descrizione dell'immagine qui

Il core è strettamente correlato al più semplice e più conosciuto sistema F. Tutte le trasformazioni che GHC fa a livello Core sono refactoring di tipo preservativo di questa rappresentazione Core, per migliorare le prestazioni. E, non così ben noto, puoi scrivere direttamente in Core per programmare GHC.

GHC Core si inserisce nella pipeline del compilatore (come nel 2002, sans-LLVM e CMM):

inserisci la descrizione dell'immagine qui

I documenti principali per conoscere GHC Core sono:

  • Una Rappresentazione esterna per il GHC Core Language , Tolmach, 2001
  • ghc / compiler / CoreSyn , la definizione stessa di GHC
  • Segreti di Glasgow Haskell Compiler inliner , Peyton Jones e Marlow, 1999. Il nucleo è descritto nella Sezione 2.3, compresi i dettagli sulle annotazioni dell’analisi di occorrenza.
  • Un ottimizzatore basato sulla trasformazione per Haskell , Peyton Jones e Santos, 1998. Il core è descritto in S3, inclusa una discussione sul polimorfismo e letture operative di Core.

Materiale correlato che può aiutare a capire:

  • L’ output di GHC -fext-core
  • Ho passato molto tempo ad apprendere Core leggendo la fonte di GHC. Alcuni sono descritti nella mia tesi di laurea dal 2002, da pagina 16.
  • Dall’uso dello strumento ghc-core , per generare Core in un formato trovo piacevole.

Il core a sua volta è tradotto in codice STG, che assomiglia a qualcosa di simile:

inserisci la descrizione dell'immagine qui

I nomi divertenti di Core sono codificati nella “Z-encoding”:

inserisci la descrizione dell'immagine qui

Tipi e tipi di GHC Core (dal documento di Tolmach):

inserisci la descrizione dell'immagine qui

Infine, i primops di GHC appaiono regolarmente nell’output di GHC Core, quando hai ottimizzato Haskell con le istruzioni di base che GHC conosce. Il set di primop è fornito come un insieme di funzioni di base in un file pre-elaborato.

Un consiglio: se non ti preoccupi delle annotazioni di tipo e delle coercizioni usa -ddump-simpl insieme -dsuppress-all . L’output del core dovrebbe essere molto più leggibile.

Sebbene non sia esattamente il linguaggio GHC Core, come dice Don il linguaggio STG è abbastanza simile. Recentemente ho svolto l’esercizio di dimostrare la sicurezza del tipo di linguaggio STG +, e successivamente ho scoperto di poter capire facilmente Core.

Il testo che ho usato per imparare STG è abbastanza accessibile: Implementazione di Lazy Functional Languages ​​su Hardware di scorta: la G-machine Spineless senza tag di Simon Peyton-Jones. Gran parte del documento riguarda i dettagli di implementazione, ma raccomando la sezione 4 in particolare come spiegazione top-to-bottom del linguaggio STG che fornisce motivazioni per alcune delle decisioni progettuali contro-intuitive e fornisce traduzioni di esempi familiari come la map .

“Una rappresentazione esterna per la GHC Core Language” è un documento che può essere trovato nell’installazione di ghc ( share/doc/ghc/core.pdf ) o su internet .