Closed Mazdaywik closed 5 years ago
В дополнение к критике нативных вставок в #33. Нативные вставки раскрываются в
#line 7 "native-hello.ref"
printf("Hello, World!\n");
r05_splice_to_freelist(arg_begin, arg_end);
#line 15 "native-hello.c"
Нативная вставка предваряется директивой #line
с именем исходного файла и номером строки, что немного усложняет лексический анализ. Также усложняется кодогенерация, поскольку приходится генерировать вторую #line
с номером строки и именем целевого файла.
Удалось достичь небольшого, но измеримого повышения быстродействия. Сравнивались коммиты 3f4aee221ada87b49764930ea04d1108aab64e95 и 81e217389ba7f64bc5d475d7f1263c5624f5a388.
До рефакторинга и почти рефакторинга время Рефала составляло 5,645 секунд (квартили 5,567–5,820), после — 5,391 секунда (5,175–5,529). Ускорение произошло преимущественно из-за поиска нативных вставок открытыми переменными (в лексере и генераторе), время циклов, соответственно, 0,545 (0,515–0,607) и 0,404 (0,329–0,486). Доверительные интервалы показывают, что ускорение достоверное.
Но я делал эту оптимизацию не для ускорения, тем более, что (#34) имеющиеся лексер и парсер будут выкинуты и заменены на сторонние и более медленные. Мне просто было интересно померить и убедиться.
Методику тестирования описывать лень, просто приложу файлы из папки src
:
Эта задача — подзадача #33.
В противоположность задаче #11 предлагается удалить нативные вставки. Обоснование — в задаче #33.
Что надо сделать:
DEFINE_LOCAL_ENUM(name)
,DEFINE_ENTRY_ENUM(name)
для определения пустых функций,DECLARE_LOCAL_FUNCTION(name)
,DECLARE_ENTRY_FUNCTION(name)
для объявления внешних функций и ссылок вперёд для локальных,DEFINE_LOCAL_FUNCTION(name)
,DEFINE_ENTRY_FUNCTION(name)
для определения заголовка функции,Library.ref
вLibrary.c
,Замечание по макросам
DEFINE_…_FUNCTION(name)
. Их использование:Они раскрываются в
Очевидно, их легко использовать и в самописном коде.