5

Nella pipeline di GHC c'è una fase di traduzione del codice sorgente Haskell in Core e quindi (non necessariamente come passaggio successivo immediato) della conversione di Core in STG. Tuttavia, un problema mi sfugge dalla mia comprensione: quando abbiamo un codice "normale" (cioè come testo normale) e quando qualcosa effettivamente vive nella memoria, come gli alberi sintattici astratti (AST)?Gasdotto GHC: Core, STG - AST o testo?

E per rendere la mia domanda un po 'più precisa, io divido in parti:

1) nella analisi della fase file sorgente Haskell, facciamo a costruire subito AST di linguaggio di base? In caso contrario, mi sembra che dobbiamo costruire AST di Haskell completo (che sembra strano) e poi trasformarli in AST di Core, o in primo luogo nella loro rappresentazione testuale in Core e di nuovo invocare l'analisi per ottenere gli AST di Core.

2) quasi la stessa domanda vale per Core STG di transizione (ma in questo caso credo di poter supporre che ciò che abbiamo è AST Core -? Corretto)

risposta

13

La fonte Haskell viene prima analizzato in un AST di Haskell completo, che viene quindi registrato automaticamente.

Da quel momento in poi, si passa a Core, tradotto in STG, da lì a Cmm in assembly o codice LLVM. Tutte queste fasi sono basate su AST, non vi è alcuna rappresentazione testuale di nessuna di queste fasi fino al codice assembly/llvm, che viene quindi scritto in un file e compilato utilizzando strumenti esterni.

Non è necessario avere un AST di Haskell completo. In effetti, è necessario fornire errori di tipo in termini di codice scritto dall'utente, invece di rilevare errori di tipo solo a livello di Core.

È possibile trovare AST per Haskell nei moduli da HsSym e AST di Core in CoreSyn.

+3

Ora è chiaro, grazie! Oh, e i collegamenti sembrano essere rotti ... – socumbersome

+0

Dai un'occhiata [qui] (https://github.com/ghc/ghc/tree/ghc-7.8/compiler/hsSyn), in particolare [qui] (https: //github.com/ghc/ghc/blob/ghc-7.8/compiler/hsSyn/HsExpr.lhs), quindi [qui] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/ coreSyn/CoreSyn.lhs) e [qui] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/stgSyn/StgSyn.lhs). –

+0

Risolti i collegamenti. Questo è quello che ottengo per cercare di produrre collegamenti 'https: // www.haskell.org/ghc /' invece di collegamenti 'https: // downloads.haskell.org/~ ghc /'. –