История изменений
Исправление hateyoufeel, (текущая версия) :
Есть у меня подозрение, что у них сначала там какой-то промежуточный код образуется с do-синтаксисом, из которого потом генерится вычислительная процедура с меткой.
Так и есть. Только без do-синтаксиса. Промежуточный код называется Core, и это такой Haskell, только в нём проставлены все типы, а из синтаксиса только let..in и case..of.
Есть хорошая статья про то, как SPJ и компания дошли до жизни такой — https://www.microsoft.com/en-us/research/wp-content/uploads/1992/04/spineless…
Это статья не о том совершенно. STG – это промежуточное представление кода во время компиляции сейчас.
Вот тебе примерная схема:
+---------+
LLVM backend /--->| LLVM IR |--\
| +---------+ | LLVM
| v
+------------+ Desugar +------+ STGify +-----+ CodeGen +-----+ | NCG +----------+
| Parse tree |--------->| Core |-------->| STG |--------->| C-- |----+-------->| Assembly |
+------------+ +------+ +-----+ +-----+ | +----------+
| ^
| +---+ | GCC
C backend \---->| C |--/
+---+
Взято отсюда: https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/generated-code
Как видишь, промежуточных представлений внутри GHC вообще три: Core, STG и C–. Хотя Cmm – это такой LLVM IR, только с сишным синтаксисом. Я прозреваю, что если бы LLVM был раньше (или GHC появился бы позже), то с Cmm никто бы не запаривался, и STG компилировали бы прямо в LLVM IR.
Исходная версия hateyoufeel, :
Есть у меня подозрение, что у них сначала там какой-то промежуточный код образуется с do-синтаксисом, из которого потом генерится вычислительная процедура с меткой.
Так и есть. Только без do-синтаксиса. Промежуточный код называется Core, и это такой Haskell, только в нём проставлены все типы, а из синтаксиса только let..in и case..of.
Есть хорошая статья про то, как SPJ и компания дошли до жизни такой — https://www.microsoft.com/en-us/research/wp-content/uploads/1992/04/spineless…
Это статья не о том совершенно. STG – это промежуточное представление кода во время компиляции сейчас.
Вот тебе примерная схема:
+---------+
LLVM backend /--->| LLVM IR |--\
| +---------+ | LLVM
| v
+------------+ Desugar +------+ STGify +-----+ CodeGen +-----+ | NCG +----------+
| Parse tree |--------->| Core |-------->| STG |--------->| C-- |----+-------->| Assembly |
+------------+ +------+ +-----+ +-----+ | +----------+
| ^
| +---+ | GCC
C backend \---->| C |--/
+---+
Взято отсюда: https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/generated-code
Как видишь, промежуточных представлений внутри GHC вообще три: Core, STG и C–.