Добрый день, Александр! После отпуска разгребаю почту и потихоньку отвечаю, когда чувствую, что надо. В Вашем письме мне непонятно вот что. Вы пишете:
*Компилятор Рефал-5λ создаёт исполнимые файлы операционной системы * Но почему не "объектные модули"? Во всех известных мне рефалах компилируется не вся программа, а какая-то ее часть, оформленная как файл. А потом эти "объектные модули" собираются в один исполнимый файл (или грузятся как в рефале-6, или конкатенируются) У вас в рефале-5л есть раздельная компиляция? Если да, то результат компиляции одного файла уже не может быть исполнимым, не так ли? И есть ли у Вас что-то вроде сборки (отдельной от компиляции)? Возможно, нечеткость в этих вопросах и стала причиной Ваших трудностей? Аркадий 27 июля 2018 г., 17:35 пользователь Alexander Konovalov aka Маздайщик < [email protected]> написал: > *Переотправлю письмо через Яндекс, а то с **Mail.**Ru какие-то проблемы.* > > Добрый день всем! > > Как многие в рассылке знают, я работаю над компилятором Рефала-5λ — > точного надмножества Рефала-5. Одним из полезных расширений языка являются > нативные вставки — вставки кода C++ в исходном коде на Рефале. Например, > > /* это файл на Рефале */ > %% > #include <stdio.h> > %% > > $ENTRY Go { > = <Hello> <Hello> > } > > Hello { > %% > printf("Hello!\n"); > refalrts::splice_to_freelist(arg_begin, arg_end); > return refalrts::cSuccess; > %% > } > > Как это работает. Компилятор Рефал-5λ создаёт исполнимые файлы > операционной системы (.exe-файлы для Windows, ELF для Linux, какие-то ещё > для macOS). Скомпилированный файл устроен на манер SFX-архива: он состоит > из префикса-интерпретатора, исполнимого файла операционной системы, > и суффикса-интерпретируемого кода — двоичного языка сборки. Как если бы > в конец интерпретатора refgo приписали бы несколько .rsl-файлов. > > Когда компилятор транслирует файлы без нативных вставок, то он берёт уже > готовый префикс-интерпретатор (скомпилированный ранее) и в конец к нему > приписывает файлы языка сборки. > > Если среди исходных файлов есть файлы с нативными вставками, то компилятор > из таких файлов создаёт исходники на C++, содержащие текст этих самых > нативных вставок. Потом вызывает компилятор C++, передавая ему исходники > интерпретатора языка сборки и эти самые файлы с текстом вставок. Получается > исполнимый файл, который становится префиксом-интерпретатором. Функции, > описанные на C++ (вроде функции Hello в примере выше) становятся своего > рода встроенными в интерпретатор функциями. > > Кстати, все библиотечные функции (Prout, Add, Sub, Type) тоже описаны > в файле на Рефале примерно таким образом: https://github.com/bmstu-iu9/ > simple-refal/blob/master/src/srlib/Library.sref > > > > Но уже давно я планирую реализовать динамическую загрузку модулей на манер > .dll/.so. В этом случае компилятор сможет порождать не-.exe модули, > которые могут подгружаться как статически (если прописана соответствующая > ссылка в языке сборки), так и динамически (вызывается соответствующая > библиотечная функция для загрузки модуля и поиска функции в нём). Если > исходные файлы модуля не содержат нативных вставок, то создаётся > динамически загружаемый модуль только с одним языком сборки. Если > содержат — вызывается компилятор C++, который создаёт .dll/.so операционной > системы с нативными функциями, и к нему в хвост приписывает язык сборки как > раньше. > > > > На этом пути много технических проблем, я с ними справлюсь, скорее всего. > Но вот возникла одна архитектурная, про которую я не вижу красивого > гладкого решения. > > Нужно (как и в случае .dll/.so) обеспечить корректную обработку повторной > загрузки модуля. Т.е. если некоторый файл был загружен, не грузить его > повторно, а только увеличивать у него счётчик ссылок. > > Но вот как понять, что он уже был загружен? По пути к файлу это сделать > сложно. На UNIX-системах один и тот же файл может быть доступен как subdir > /filename, ./subdir/./././filename /home/user/subdir/filename, /home//user > ///subdir////filename, /home/otheruser/../user/otherdir/../subdir/filename > и т.д. На Windows ещё веселее: добавляются тонкости с регистром символов > в именах, синонимичность / и \ и текущие папки на разных дисках. > Эмулировать всё это слишком громоздко и тем самым некрасиво. > > Можно к каждому файлу добавлять хэш, таким образом обнаруживать идентичные > модули по их содержимому (даже если у них разные имена файлов). Но мне > почему-то это кажется костылём. > > > > С уважением, > Александр Коновалов > -- _______________ *С уважением, * *Аркадий Климов,* *с.н.с. ИППМ РАН,* *+7(499)135-32-95* *+7(916)072-81-48*
