-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Вынос дескриптора функции из узла поля зрения #46
Comments
Просьба обратить внимание на временной штамп коммита: 13.12.2015. Правка «мариновалась» в побочной ветке больше полугода (время от времени пересаживаясь на актуальный master), прежде чем пришло её время. Из-за того, что Модульный Рефал также должен работать с рантаймом, пришлось отключить большие куски кода, не используемые этим компилятором. Вырезаны оказались уточнения термов до функций и АТД, все функции обновления и переинициализации узлов, refalrts::create_closure, а также весь интерпретатор.
Теперь, после перехода на дескрипторы функций, можно (а) хранить общее тело пустых функций в рантайме, (б) удалить старый костыль, исправляющий проблему оптимизатором компилятора Visual C++ (коммит 7eb13e0 от 07.06.2015).
Вместо того, чтобы генерировать дескриптор для каждого объявления и определения локальной функции, окружая его стражами включения, используется специальная команда #CmdFuncDescr, формируемая в нужных местах в LowLevelRASL.
В принципе, они могут содержать и мутабельные данные. Например, такими будут статические ящики, в перспективе возможно добавление поля флагов и т. д.
) Дескрипторы этих объектов являются структурами-наследниками структуры refalrts::RefalFunction. Наследование без виртуальных функций, поскольку предполагается, что работа будет выполняться всегда с правильным типом дескриптора (функция refalrts::RefalSwap::run всегда будет вызываться для RefalSwap и наоборот, дескриптор RefalSwap всегда будет содержать в поле функции RefalSwap::run). Поскольку код тела статического ящика вынесен в рантайм, задачу #47 можно закрывать как невыполнимую.
Теперь команды #CmdProfileFunction, #CmdIssueMem и #CmdiReserveStack стали интерпретируемыми. Соответственно, первые две поменяли префикс имени на #Cmdi…. Для последних двух во время выполнения создаётся стек, который пока только растёт в памяти.
Получилось немного костыляво, но это исправимо.
Запуск профилировщика осуществляется явно в функции refalrts::RASLFunction::run, так время выполнения показывается точнее.
Задача выполнена, как и предполагалось. Помимо непосредственно генерации дескрипторов для функций, также сделаны особые дескрипторы для пустых функций, статических ящиков и интерпретируемых функций (как и предполагалось в задании). Быстродействие я не измерял, но даже если оно и упало, снижение с лихвой компенсируется возможностью написать полноценный интерпретатор. P.S. Первоначальный вариант предполагал, что функции описывают дескриптор |
Узел поля зрения представляет собой структуру, содержащую ссылки вперёд, назад, тег типа и объединение. Актуальное поле объединения определяется тегом типа. Большинство полей объединения занимают только одно поле, исключение составляют
function_info
типаrefalrts::RefalFunction
иswap_info
типаrefalrts::RefalSwapHead
. Первый хранит два поля: указатель на функцию и указатель на её имя (const char*
), второй — указатель на следующую голову статического ящика и указатель на имя ящика. Очевидно, в обоих случаях имя используется при печати дампа поля зрения.Предлагается сделать эти поля указателями на соответствующие объекты. Профит:
уменьшение размера узла на 20 % (с точки зрения ОЗУ на современных компьютерах это не интересно, но вот на кэш процессора может повлиять),
устранение костыля
return refalrts::FnResult(refalrts::cRecognitionImpossible | (__LINE__ << 8))
, необходимого для корректной работы с пустыми функциями,упрощение преобразования Простого Рефала в интерпретатор,
возможность пополнять дескриптор функции (запись
refalrts::RefalFunction
) дополнительными полями.Что же это за поля?
return
. Можно указатели на эти массивы помещать в дескриптор, а в поле указателя на функцию разместить функцию-интерпретатор. Интерпретатор будет анализировать терм конкретизации<Callee …>
, находя там себя (Callee
) и находя в себе указатели на массивы. В целях экономии памяти (чтобы функции, скомпилированные в режиме прямой кодогенерации не имели избыточных дескрипторов) дескриптор интерпретируемой функции можно унаследовать от общего дескриптора.Задача реализуема, и даже реализована, лежит в побочной ветви 4words. Влияние на производительность — ничтожное (замедление где-то 0,5 %…1 %), причём его можно списать на большее число шагов рефал-машины.
The text was updated successfully, but these errors were encountered: