LINUX.ORG.RU

История изменений

Исправление 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–.