-
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
Новая реализация метафункций (Mu, Residue, Up, Ev-met) #254
Comments
Возможная реализацияЕсть такое соображение: передавать в метафункции таблицу функций. Таблица представляет собой набор пар «идентификатор-имя функции» по одной паре для каждой функции, определённой в данной единице трансляции (и не имеющей суффикса). В метафункцию таблица передаётся неявным аргументом. Метафункция определяется при помощи ключевого слова
Такое определение является синтаксическим сахаром для
где В RASL’е таблица функций представляется как особая функция, локальная для модуля. При попытке её вызвать как обычную функцию, она падает как
которая будет допускать лишь пустой аргумент и возвращать ссылку на таблицу. Здесь наиболее интересна связь с другими задачами. Связь с другими задачамиПри глобальной оптимизации (#255) предлагается переименовывать локальные функции в имена вида Оптимизация прогонки может привести к тому, что в единице трансляции останутся функции, которые ниоткуда не вызываются. И есть задача на удаление таких функций (#228). Но сформулирована она как задача удаления неиспользуемых функций с суффиксами, поскольку удалять локальные функции без суффиксов просто так нельзя: они могут вызываться через Также упрощается реализация метафункций как интринсиков (#260). При преобразовании |
Уточняем возможную реализацию. Встроенные функции должны выполняться за один шаг рефал-машины, например, вызов Если
то функция Можно развести эти два содержательно разных действия, компилируя
в
Функция При инлайне предлагается имя функции Низкоуровневые оптимизации ( Поэтому выкинуть |
К предыдущему комментарию.
Довольно нетривиальная логика потребуется. Проще выкидывать и из определения |
Checker знает, что $META добавляет __Meta_funcname и __Step-Drop.
Функция пока не используется — используется старая реализация Mu через __FindMuPtr и PtrFromName.
Удалены старые Mu, __Mu-Aux, __FindMuPtr и PtrFromName. Последнюю функцию удалить не жалко, поскольку она является обёрткой над Module-LookupFunction.
Влияние новой Поэтому я замерил, на сколько изменилось число шагов при самоприменении после обновления библиотеки (859e4ea). До обновления компилятор делал 26 754 373 шага, после — 26 712 997 шагов. Разница — 41 376 шагов или 0,15 %. Но 41 тысяча — всё равно немало (хотя не очевидно, откуда они взялись). |
Эта задача блокирует #260.
Актуальная реализация функции
Mu
затрудняет решение задачи #181.Во-первых, сама функция
Mu
медленная — написана на Рефале и обращается к функции динамической загрузкиModule-LookupFunction
. А использованиеMap
,MapAccum
иReduce
есть краеугольный камень программирования на Рефале-5λ. Вероятно, из-за медленнойMu
и получены столь плачевные результаты, описанные в #185.Во-вторых, функция
Mu
сложна для автоматического анализа, о чём кратко написано в #181. Она содержит условие с вызовом нативной функции, функцияMu-Aux
вызываетType
и__FindMuPtr
, обе для оптимизации должны быть интринсиками.Соответственно, нужен механизм более быстрый и более удобный для анализа.
The text was updated successfully, but these errors were encountered: