Mazdaywik / mrefal

Компилятор Модульного Рефала
BSD 2-Clause "Simplified" License
6 stars 0 forks source link

Удалить макрос MODULE_REFAL из профиля C++/SR #8

Closed Mazdaywik closed 8 years ago

Mazdaywik commented 8 years ago

Профиль C++/SR изначально задумывался как профиль, генерирующий код на C++, совместимый с рантаймом Простого Рефала.

Однако, начиная с версии (вывод git describe --first-parent) 0.1.959-49-g9a96701 (фиксация 9a96701e6cd9872e3f38681b2c82c7736453acd0) пути этих профилей разошлись — имя функции внутри узла-функции стало задаваться не const char *, а как указатель на идентификатор. Замена предполагалась с целью оптимизации объёма сгенерированного файла: дублирование строк-имён избегаем при помощи идентификаторов. Эффект оказался незначительным.

В версии 0.1.959-115-g2e6be07 (фиксация 2e6be0780e0c37c06f1953f29ef5d1f4f145fd48) независимые рантаймы компилятора Простого Рефала и профиля C++/SR были объединены — выбор варианта для поля имени функции определялся макросом MODULE_REFAL. Макрос определялся при компиляции сгенерированных файлов на C++ + файлов рантайма и реализации библиотеки только при использовании профиля C++/SR.

Недавно, при реализации в Простом Рефале функций как дескрипторов (bmstu-iu9/simple-refal#46) макрос MODULE_REFAL оказался очень кстати. Кодогенерация существенно изменилась, но при помощи макроса удалось сохранить старые фрагменты рантайма, необходимые для работы Модульного Рефала.

Таким образом, макрос на сегодняшний день имеет единственное преимущество:

Недостатков же несколько:

Эта задача блокирует задачу bmstu-iu9/simple-refal#61

Mazdaywik commented 8 years ago

Надо заметить, что на уровне сгенерированного кода я отказался от инкапсуляции. Теперь функции, независимо от их области видимости (entyry или локальная), компилируются как внешние.

Это связано с тем, что, во-первых, попытка соблюсти инкапсуляцию усложнит кодогенерацию (вместо статических объявлений придётся использовать безымянные пространства имён, а сохранение совместимости с OpenWatcom (bmstu-iu9/simple-refal#60, open-watcom/open-watcom-v2#277) ещё сильнее всё усложнит, во-вторых, что важнее, инкапсуляция гарантируется кодом уровнем выше (модульностью), поэтому возлагать такую проверку на более низкий уровень вовсе не нужно. В коде на Модульном Рефале невозможно вызвать функцию по имени из другого модуля, если она не экспортируется ($ENTRY) модулем, а сам модуль не импортируется. Возможно, в дальнейшем появятся нативные вставки, допускающие подобный хак, но тогда это будет именно хаком, а не штатной возможностью.