• Haskell stg mstg В mstg два стека: стек аргументов (поскольку целью кодогенератора является уже управляемый язык потребности отличать boxed и unboxed значения нет и соответственно раздельного стека A и стека B тоже нет) и стек продолжений. На вершине стека объектов всегда лежит замыкание которому передаст управление код конструктора алгебраического типа после того как закончит свои дела (разложит свои кишки по стеку аргументов, например). Это замыкание скорее всего осуществит диспетчеризацию по вычисленному значению или обновит санк значением находящимся на стеке (и передаст управление следующему замыканию со стека продолжений). К достоинству этого подхода можно отнести то что на стеке продолжений можно разместить любое вычисление. Например закинуть туда вычисление n > 1 ортогональных вычислений из цепочки вложенных case'ов с одной ветвью, а потом собрать все их значения одной внутренней вложенной функцией (примерно так как это и происходит в строгих языках: сначала вычисляем все аргументы, затем вызываем код который их использует). К недостаткам — более агрессивное верчение миниинтерпретатора. В оригинальной статье по stg всё немного не так. Есть где-нибудь более проработанный вариант такого подхода?

Replies (0)