-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Разработать подходы и пользовательский интерфейс для создания многомодульных программ #86
Comments
Создана задача #87, содержащая спецификацию, удовлетворяющую постановке задачи. Рассмотрим каждую из комбинаций: Префикс задан, рантайм среди единиц трансляции есть, нативный код есть.Если используется Если используется При использовании core-утилит ответственность на конфигурации лежит на программисте. В худшем случае второй экземпляр рантайма будет находиться в Э-э-э. Фейл. Комбинация с |
Задача #87 уточнена. Нездоровая комбинация запрещена. Рассмотрим каждую из комбинаций: 1. Префикс задан, рантайм среди единиц трансляции есть, нативный код есть.Ошибка трансляции во всех комбинациях
2. Префикс задан, рантайм среди единиц трансляции есть, нативного кода нет.Программа может собраться.
2. Префикс задан, рантайма среди единиц трансляции нет, нативный код есть.Ошибка трансляции во всех комбинациях
4. Префикс задан, рантайма среди единиц трансляции нет, нативного кода нет.Штатная ситуация для
5. Префикс не задан, рантайм среди единиц трансляции есть, нативный код есть.Штатное использование в режиме
6. Префикс не задан, рантайм среди единиц трансляции есть, нативного кода нет.Штатное использование в режиме
7. Префикс не задан, рантайма среди единиц трансляции нет, нативный код есть.Штатное использование в режиме
8. Префикс не задан, рантайма среди единиц трансляции нет, нативного кода нет.Можно либо собрать модуль типа R, либо при помощи
Все перечисленные комбинации приемлемые и предсказуемые, странный битый Случаи, когда рантайм имеет имя, отличное от Задачу закрываю как выполненную. |
Эта задача — подзадача для #76.
Обзор достигнутого
Самый простой механизм из предложенных в задаче #76, уже реализован (модули I+, #77) — он почти ничего не меняет в архитектуре и интерфейсе компилятора. Целевой исполнимый файл по прежнему создаётся из набора единиц трансляции, среди которых могут быть как исходные тексты, так и уже скомпилированные. Для создания по-прежнему вызывается компилятор C++. Отличие во внешнем поведении — сгенерированные файлы это либо один файл RASL-а, либо файл RASL-а + исходник на C++ с нативными функциями. Библиотека рантайма в этом случае представляется как файл
.rasl
нулевого размера + файл.cpp
, содержащий, собственно, рантайм.При реализации многомодульных программ программа (модуль типа I) будет состоять из:
(Опционально) префикса — исполнимого модуля с рантаймом, функцией
main()
, возможно, со скомпилированными библиотеками (Library
,LibraryEx
), возможно, с кодом RASL’а. Т.е. по факту префикс может представлять собой либо результат трансляции рантайма в исполнимый файл, либо уже полноценную скомпилированную программу на Простом Рефале (модуль типа I)Программы, предназначенные для запуска интерпретатором, префикса не имеют.
(Опционально) интерпретатора, запускающего программы без префикса. Интерпретатором может служить программа, динамически загружающая модуль и вызывающая в этом модуле функцию
Go
. Тут ничего интересного, кроме того, что и интерпретатор, и запускаемая им программа, могут содержать библиотеку общего пользования (Library
,LibraryEx
), причём даже разных версий. Тут нужно обеспечить корректное поведение.Набора модулей, загружаемых при запуске. Они могут быть типа R или N. Загрузка модулей I, скорее всего, будет приводить к ошибке — они будут восприниматься как модули N, но в них не будет необходимой экспортированной функции.
Собственно, результата компиляции кода, написанного на Простом Рефале для данной программы. Тут уже есть нюансы.
Модуль, предназначенный для загрузки (R или N), состоит из тех же компонент, с той лишь разницей, что префиксом может служить либо голый скомпилированный рантайм, либо другой модуль типа N. Ну, и, понятно, роль интерпретатора выполняет загружающая программа. Кстати, модули типа N также можно разделить на модули типа N0 и N+ по аналогии с I0 и I+.
Проблемы
А нюанс следующий. Есть две очевидные ситуации.
Префикс не задан, среди исходных файлов присутствуют скомпилированные единицы трансляции, включающие в себя рантайм. Тогда srefc сам создаёт префикс (вызывая компилятор C++) и к нему приписывает RASL.
Если исходные файлы содержат нативные вставки, либо если включена прямая кодогенерация, то получающиеся файлы
.cpp
будут скомпилированы вместе с префиксом.Собственно, этот подход реализован в задаче Исполнимый файл как SFX (модуль типа I+) #77.
Префикс явно задан, среди исходных единиц трансляции отсутствуют исходники C++ (рантайм и скомпилированные единицы трансляции с нативными вставками). Исходные файлы не содержат нативных вставок, также не используется оптимизация прямой кодогенерации.
В этом случае srefc должен скомпилировать все исходные файлы в RASL, целевой файл сформировать из готового префикса и этого RASL’а.
А дальше начинается комбинаторика:
Последние три пункта можно объединить в один, поскольку с точки зрения сборки их объединяет то, что компонуемые файлы могут включать в себя пару
.rasl
+.cpp
. Итого получается 2×2×2=8 комбинаций, из которых две уже рассмотрены. Можно добавить ещё одно двоичное измерение: пользователь указал сборку библиотеки либо сборку исполнимого файла, но это принципиально нового добавлять не должно.Задача
В рамках данной задачи необходимо разработать подход к сборке и компиляции, позволяющий минимизировать число некорректных комбинаций из перечисленных восьми, при этом сохраняя интуитивно простой интерфейс текущих утилит srefc и srmake. А именно
должно давать ожидаемый результат (сборка программы) независимо от того, имеются ли в исходниках нативные функции, как задан префикс и т.д.
Эта задача будет считаться выполненной, когда будет создана новая задача, текст которой является подробной спецификацией, отвечающей на заданные вопросы.
Некоторые идеи
Компилятор srefc должен принимать в качестве параметра, очевидно, префикс, а также имена библиотек, на которые следует добавить ссылки (блок
REFERENCE
RASL’а).Srmake тоже может принимать эти же параметры, но это не обязательно. В идеале она должна их вычислять (пользователь указал
//FROM Library
, единица трансляции подцепилась).Префикс и внешние ссылки с точки зрения прикладного кода схожи тем, что содержат функции глобальной области видимости, причём они могут быть и нативными.
Если для префикса или внешней ссылки есть исходники, то при необходимости целевой модуль может собираться из их исходников в модуль типа I+ или N+ — это должна быть забота srmake.
Если для префикса исходников нет, но хочется собрать модуль
target.exe
/target.dll
//target
/target.so
из исходных файлов с нативными функциями, то тут два варианта. Или запрещать такую сборку, или параллельно собирать файл с именемtarget.natives.dll
//target.natives.so
соответственно с реализациями нативных функций. Это спорный момент, его надо ещё обдумать.The text was updated successfully, but these errors were encountered: