Skip to content
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

Создание отдельного репозитория для релизов #9

Closed
Mazdaywik opened this issue Dec 16, 2015 · 3 comments
Assignees
Milestone

Comments

@Mazdaywik
Copy link
Member

На первый взгляд самоприменимый компилятор порождает проблему курицы или яйца: как его собрать из исходных текстов, если для сборки исходных текстов требуется уже собранный компилятор. На самом деле, самоприменимый компилятор — это пара компиляторов: первый реализован на исходном языке, второй — на целевом языке. Причём с онтологической точки зрения второй не дублирует первый: в компиляторе на целевом языке может находиться знание, отсутствующее в компиляторе в исходных текстах. Пример. Говорят, что нигде в исходных текстах первого компилятора C Кернигана и Ричи нигде не было записано, что последовательности \n соответствует символ с кодом 10 — было записано, что она соответствует числовому значению, выраженному литерой '\n'.

Для Простого Рефала целевым языком является C++. Первый компилятор (на Простом Рефале) находится в каталоге compiler, второй — в каталоге bootstrap (т. н. «стабильная версия»). Файлы в каталоге обновляются на каждой итерации сборки, но заносятся в репозиторий, когда его старая версия перестаёт быть совместимой либо с исходными текстами первого компилятора, либо с новой версией рантайма (refalrts + Library.cpp).

При глубоких модификациях промежуточного представления такая организация исходного кода создаёт проблемы: хочется иметь старую старую версию компилятора + рантайма, когда текущая версия перестала работать. Следовательно, организацию исходного кода нужно изменять: как минимум завести пару папок для рантайма стабильной и рабочей версии.

Другая проблема состоит в том, что файлы в папке bootstrap обновляются при каждой пересборке компилятора. В результате затрудняется работа с системой контроля версий — файлы в папке bootstrap оказываются подсвеченными как изменённые. Засорять ими коммит не хочется, поскольку тогда дифф будет отражать не смысловые изменения (в файлах *.sref), но ещё и артефакты сгенерированного кода (как правило, стабильную версию часто обновлять не требуется). Время от времени делаются коммиты с сообщением вида «Обновлена стабильная версия», в которую помещаются все кумулятивные изменения файлов папки bootstrap. Имело бы смысл иметь две папки «bootstrap»: в одну (bootstrap1) помещаются все текущие исходники и она не отслеживается в системе контроля версий, вторая (bootstrap2) отслеживается, но файлы в ней автоматически не обновляются. Время от времени пользователь вручную осуществляет копирование файлов из bootstrap1 в bootstrap2. Альтернатива: исходники на C++ в обычном режиме при перекомпиляции не обновляются в папке bootstrap, для их обновления нужно передавать специальную опцию скрипту сборки.

В рамках текущей задачи предлагается сделать отдельный репозиторий на GitHub (например, с именем simple-refal-bootstrap или simple-refal-release), в котором будет находиться:

  • содержимое текущей папки bootstrap,
  • копия стандартной библиотеки, возможно, в скомпилированном виде (LibraryEx.cpp),
  • возможно, утилиты srmake и lexgen, также в скомпилированном виде.
    Репозиторий будет подключаться как подмодуль в репозитории simple-refal. В последнем будет папка build, в которую будут помещаться скомпилированные исходники (либо одного компилятора, либо ещё и сопутствующих утилит), а также скрипт, копирующий исходники из этой папки в подмодуль.

Вариант со слиянием в подпапку работать не будет, поскольку оно однонаправленно: если репозиторий FOO подключён как подмодуль в репозитории BAR, то, находять в подмодуле, можно как получать новые изменения из репозитория FOO, так и контрибьютить в него. Если в репозитории BAR имеется подпапка, в которую вливается репозиторий FOO, то возможно лишь обновление подпапки, контрибуция изменений в репозиторий FOO будет затруднена.

Создания нового репозитория не избежать: отдельную ветку текущего локального репозитория (находящегося в папке .git локальной копии) в подмодуль вынести нельзя, можно указать только путь до удалённого репозитория. И, если всё равно придётся указывать для подмодуля путь на удалённый репозиторий, то будет меньше путаницы, если использовать отдельный репозиторий, а не особую ветку основного.

@Mazdaywik Mazdaywik added the task label Dec 16, 2015
@Mazdaywik Mazdaywik self-assigned this Dec 16, 2015
@Mazdaywik Mazdaywik added this to the feburary 2016 milestone Jan 16, 2016
Mazdaywik added a commit that referenced this issue Feb 4, 2016
Исходные тексты компилятора и утилит располагаются в папке src,
исполнимые файлы располагаются в каталоге /bin, скомпилированные файлы
библиотек — в каталоге /srlib, скомпилированные в C++ исходные тексты
компилятора и утилит — в каталоге /build.

Для обновления дистрибутива (подмодуль distrib) необходимо в подмодуле
удалить папки /compiler, /lexgen, /srlib и /srmake, на их место скопировать
папку /srlib и содержимое папки /build.
@Mazdaywik
Copy link
Member Author

Задача выполнена почти полностью (см. сообщение коммита 567e5d5), осталось сделать следующий заявленный пункт:

  • Нужен скрипт, который автоматически копирует файлы из подпапок /build и /srlib в подмодуль дистрибутива.

Репозитории дистрибутива размещён по адресу https://github.com/Mazdaywik/simple-refal-distrib.git. В принципе, дистрибутив получился самостоятельным проектом, который можно использовать в качестве дистрибутива: склонировать без репозитория simple-refal.git, откомпилировать, прописать папку bin в PATH и использовать. Однако, есть одно неудобство: к папке srlib необходимо каждый раз при компиляции указывать правильный полный путь. Предполагается следующий вариант обхода:

  • Исполнимые файлы помещаются в папку bin под именами srefc-core.exe (srefc-core) и srmake-core.exe (srmake-core), вместе с ними в папке располагаются скрипты srefc.bat (srefc на Bash) и srmake.bat (srmake), которые запрашивают своими средствами путь к каталогу скрипта, конструируют из него путь к каталогу srlib и запускают утилиты *-core.exe (*-core) с соответствующей опцией -d. Пользователь теперь может из командной строки вызывать srefc и srmake, не задумываясь ни о пути на srlib, ни о том, что это не настоящие исполнимые файлы (но в bat’никах придётся использовать call srefc).

В этом случае документация (та её часть, которая написана) частично потеряет актуальность. Кстати, в каталог дистрибутива нужно помещать копию документации. Соответственно, задачи:

  • Поместить папку doc в каталог дистрибутива. В ней должны быть только pdf-ки без исходников, а также некоторые (не все) исторические файлы. Их набор надо продумать.
  • Актуализировать документацию в соответствии с выполненной работой.

Mazdaywik added a commit that referenced this issue Feb 4, 2016
Решена одна из ошибок проблемы «курицы или яйца». В процессе раскрутки нужно
откомпилировать LibraryEx.sref, но доступен только «старый», стабильный
компилятор. Если им компилировать библиотеку, то она в скомпилированном виде
будет несовместима с текущей версией компилятора. Поэтому сначала компилятор
собирается стабильной версией, потом компилируется библиотека, потом компилятор
снова пересобирается собой.
@Mazdaywik
Copy link
Member Author

  • Скрипт автоматического обновления дистрибутива
  • Скрипты srefc.bat и srmake.bat.
  • Документация в дистрибутиве
  • Актуализация документации

Mazdaywik added a commit that referenced this issue Feb 7, 2016
* Перенесён в подкаталог examples/inifile пример с чтением INI-файлов.
* Добавлен пример программы Hello, World.
@Mazdaywik
Copy link
Member Author

Задача полностью выполнена.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant