• Haskell stg Я правильно понимаю что stg вообще живёт без типов и конструктор что-то вроде именованного тупла как в epic? Мне казалось что это может сделать кодогенерацию грустнее…

Replies (10)

  • @ndtimofeev, Типы нужны для того, чтобы проверять, чего там накодил программист. В STG такой нужды нет, он генерируется из корректного кода.
  • @rkit, Тут речь не о проверке корректности, а о возможности получить список конструкторов типа T глядя только на stg-выхлоп.
  • @ndtimofeev, Его и не надо получать. И вобще смотреть на выхлоп не надо, он не для того.
  • @rkit, Стоп. У кодогенератора на входе только stg. Если он не будет знать список конструкторов каждого типа, то у него будут различные проблемы. Ему например потребуются сквозные теги для всех конструкторов. Ну и многие трюки с оптимизацией алгебраических типов без этого знания не возможны.
  • @ndtimofeev, В ghc информация о конструкторах передается кодогенератору отдельным аргументом вместе с stg-кодом. А вообще этот момент не учтен, конечно.
  • @rkit, Вообще как я понимаю, идея в том, что каждому уникальному имени конструктора дается уникальный код. Едва ли они там даже 8 бит переполнят, так что не особо проблема. Но вот когда начинается раздельная компиляция, тогда начинается беда и необходимость таскать отдельно дополнительную
  • @rkit, Вообще как я понимаю, идея в том, что каждому уникальному имени конструктора дается уникальный код. Едва ли они там даже 8 бит переполнят, так что не особо проблема. Но вот когда начинается раздельная компиляция, тогда начинается беда и необходимость таскать отдельно информацию о типах из импортируемых модулей.
  • @rkit, Помимо этого есть интересные трюки связанные с алгебраическими типами с одним конструктором (например I# Int#) или конструкторами без полей (например Nothing или ()). Они позволяют компактизовать данные. Ну и паттерн-матчинг тоже удобнее осуществлять если имеешь все возможные варианты.
  • @ndtimofeev, Все это спокойно делается на этапе haskell -> stg, а не stg -> машкод.
  • @rkit, Эээ… Нет. Речь идёт о том чтобы опустить динамический тег для I# и Just и сравнивать в case ссылку на значение со ссылкой на единственное значение () или Nothing. У этих вещей нет никакого выражения на уровне stg и эти вещи не возможны без знания состава алгебраического типа.