Mazdaywik / Refal-05

Очень минималистичный компилятор Рефала
https://mazdaywik.github.io/Refal-05/
Other
3 stars 2 forks source link

Удалить нативные вставки #36

Closed Mazdaywik closed 5 years ago

Mazdaywik commented 5 years ago

Эта задача — подзадача #33.

В противоположность задаче #11 предлагается удалить нативные вставки. Обоснование — в задаче #33.

Что надо сделать:

Замечание по макросам DEFINE_…_FUNCTION(name). Их использование:

DEFINE_LOCAL_FUNCTION(Foo) {
  ...
}

DEFINE_ENTRY_FUNCTION(Bar) {
  ...
}

Они раскрываются в

static r05c_Foo(struct r05_node *arg_begin, struct r05_node *arg_end);
static r05_function r05f_Foo = { r05c_Foo, "Foo" };
static r05c_Foo(struct r05_node *arg_begin, struct r05_node *arg_end) {
  ...
}

static r05c_Bar(struct r05_node *arg_begin, struct r05_node *arg_end);
r05_function r05f_Bar = { r05c_Bar, "Bar" };
static r05c_Bar(struct r05_node *arg_begin, struct r05_node *arg_end) {
  ...
}

Очевидно, их легко использовать и в самописном коде.

Mazdaywik commented 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 с номером строки и именем целевого файла.

Mazdaywik commented 5 years ago

Удалось достичь небольшого, но измеримого повышения быстродействия. Сравнивались коммиты 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: