← All posts tagged stg

ndtimofeev
Lua stg mstg Вообще эффект переписвывание существующих таблиц в lua вместо создания новых меня ошеломил. Поскольку для реализации ADT'ов, замыканий (которые представлены таблицей с функцией и числом обозначающем арность функции), частичного применения, неба и аллаха используются таблицы, то возникает сравнительно парадоксальная ситуация: в то время как SPJ пишет о дороговизне апдейтов замыканий в системе редукции графов, мне дешевле переписывать все замыкания какие можно лишь бы не аллоцировать новые таблицы.
ndtimofeev
Lua stg В тему #2717879. Переписал рантайм-систему с учётом специфики lua и починил апдейты. Длину списка в 10 ^ 4 элементов удалось посчитать за пол секунды. На 10 ^ 5 переполнился стек. Интересно где.
ndtimofeev
stg Updatable-флаг можно выставить любой лямбда-форме. С другой стороны обновление замыкания значение осуществляется только для санка — заамыкания не зависящего от переменных. Тогда не вполне понятно как трактовать наличие данного флага у функций? В Implementing lazy functional languages on stock hardware в разделе 4.2 написано что совершенно безопасно эти флаги можно (но не нужно развесить везде), но мне тем не менее непонятно что должен сделать компилятор найдя такой флаг на верхнеуровневой функции.
ndtimofeev
Lua stg mstg Моя лунная stg-машина считала длинну сгенерированного списка пропущенного через map четыре минуты времени. В списке было 10 ^ 4 элементов. Мусорщик лунного успешно удерживал объём кучи на 40 мегабайтах. Это так мило. Впрочем у меня нахрен сломаны апдейты графа, так что может быть не всё так плохо.
ndtimofeev
stg Долго искал ошибку из-за который проваливался паттерн-матчинг по алгебраическому типу. Оказалось что я в самом stg-коде не так Nil записал.
ndtimofeev
stg mstg Модель ленивого вычислителя прекрасно отработала и вывела число созданных замыканий несмотря на то что я забыл определить примопы. Годно.
ndtimofeev
Haskell stg В понимании семантики stg у меня остались следующие отверстия: зачем нужен letrec (честно говоря я даже синтаксис letrec представляю себе не очень однозначно)? как исполняются primop'ы, насколько они далеки от ffi и могут ли возвращать коробкованные значения? в каком случае нужно форсировать вычисления связанные с раскоробкованными значениями? Последний момент вроде описан в Unboxed value as class citizens in a non-strict functional language. С остальным как-то совсем глухо.
ndtimofeev
Haskell stg Кажется вся эта петрушка с арностью функции push/enter'ом и eval/apply'ем нужна не тогда когда у функции мало аргументов, а тогда когда их больше чем нужно (точнее когда пять аргументов применяется к функции от двух, возвращающей функцию от трёх). Причём это справедливо только в особо полиморфных случаях, когда функция применяющая аргументы не очень хорошо знает к чему она их применяет. Чем же отличается функция ненасыщенная аргументами от простого замыкания, я всё равно не понимаю.
ndtimofeev
Haskell stg Я правильно понимаю что stg вообще живёт без типов и конструктор что-то вроде именованного тупла как в epic? Мне казалось что это может сделать кодогенерацию грустнее…
ndtimofeev
Haskell stg Что-то у меня какое-то недопонимание partial apply: как оно вообще оказывается на уровне stg и откуда проблемы с неизвестной арностью функции? Происходят ли какие-то редукции при частичном применение и если да, то почему?
ndtimofeev
Haskell Lua stg Кажется понял зачем нужен алгебраический тип вокруг встроеннных типов: встроенные типы unboxed и в общем случае хранить в алгебраическом типе вместо значения указатель на вычисление затруднительно. Таким образом, обёртка вокруг встроеннного типа и правда единственный способ дать ему побыть частью ленивого вычисления. Остался только один нюанс: что в терминах lua является unboxed значением?
ndtimofeev
Haskell Lua stg Моя лунная stg-машина посчитала факториал! Поскольку парсер грамматики stg я написал удивительно трансректальным образом, а сам транслятор никак не проверяет корректность AST-дерева перед переписыванием в луну, факториал видимо останется самой сложной программой которую я смог для него написать.
ndtimofeev
Haskell stg Я правильно понимаю что update flag регулирует факт переписывания замыкания после его форсирования? Но что мы можем переписать кроме замены санка на значение в экзотической ситуации когда замыкание зависит только от свободных переменных?