• stg mstg Как известно, код промежуточного языка претерпевает ряд преобразований между моментоми когда его исторгает фронтенд и переварит кодогенератор. Возникла неприличная идея ввести примопы для прямого взимодействия со стеками исполнителя. Имея их можно переписать функции любой арности в функции нулевой арности, переписать волшебные продолжения возврата как обычные функции. И всё это на относительно легко управляемом промежуточном языке.

Replies (10)

  • @ndtimofeev, В гхц ж так?
  • @qnikst, Не уверен что это то. Суть состоит в том, что я хочу явным образом переписывать все функции от n > 0 аргументов как функции без аргументов, которые при помощи специального примопа вытаскивают n аргументов со стека аргументов. Это сделает вполне обычной функцией замыкание выполняющее диспетчеризацию в case сложных выражений. Его станет можно например поднимать в топлевел как другие функции. Для кодогенератора останется тольк case по unboxed типам.
  • @qnikst, Сейчас просто попробую нарисовать.
  • @ndtimofeev, это и делается в ghc, см. конец статьи
  • @qnikst, Не вижу в упор.
  • @ndtimofeev, Может тогда в предыдущей на эту тему
  • @ndtimofeev, Нашёл кстати?
  • @qnikst, Rather than generating code to deal with all these possibilities at every call-to-unknown-function site, ghc delegates this to a bunch of specialized functions which are part of the RTS. The compilation ofcall_some_want_Int# therefore looks deceptively simple:

    R1 = I32[Sp + 0]; I32[Sp + 0] = 1234; jump stg_ap_n_fast ();

    stg_ap_n_fast deals with the application of an unknown function to a single Int#; hence the _n in the name. It finds out how many arguments f has (by looking at the pointer ...
  • @qnikst, И т.п. для других типов