Closed Mazdaywik closed 8 years ago
Надо заметить, что на уровне сгенерированного кода я отказался от инкапсуляции. Теперь функции, независимо от их области видимости (entyry или локальная), компилируются как внешние.
Это связано с тем, что, во-первых, попытка соблюсти инкапсуляцию усложнит кодогенерацию (вместо статических объявлений придётся использовать безымянные пространства имён, а сохранение совместимости с OpenWatcom (bmstu-iu9/simple-refal#60, open-watcom/open-watcom-v2#277) ещё сильнее всё усложнит, во-вторых, что важнее, инкапсуляция гарантируется кодом уровнем выше (модульностью), поэтому возлагать такую проверку на более низкий уровень вовсе не нужно. В коде на Модульном Рефале невозможно вызвать функцию по имени из другого модуля, если она не экспортируется ($ENTRY
) модулем, а сам модуль не импортируется. Возможно, в дальнейшем появятся нативные вставки, допускающие подобный хак, но тогда это будет именно хаком, а не штатной возможностью.
Профиль 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
оказался очень кстати. Кодогенерация существенно изменилась, но при помощи макроса удалось сохранить старые фрагменты рантайма, необходимые для работы Модульного Рефала.Таким образом, макрос на сегодняшний день имеет единственное преимущество:
Недостатков же несколько:
Цель
#ifdef
’ы с макросомMODULE_REFAL
.Эта задача блокирует задачу bmstu-iu9/simple-refal#61