1

Тема: Компилятор языка Context под KolibriOS

Раньше на том форуме обсуждался компилятор языка Context.
И я также выкладывал чуть более новую версию компилятора, работающую в KolibriOS.
С тех пор прошло уже много времени, но, оказывается, автор продолжает развивать свой проект.
Теперь это уже Context3. Коммиты были относительно недавно.

Мне тоже захотелось перенести этот компилятор в KolibriOS.
Я добавил в исходник Target=tKOS. Теперь можно собрать приложение KolibriOS из-под любой системы(Windows, Linux, KolibriOS).
Для сборки приложения под KolibriOS нужно указать ключ командной строки "/k".
Попробовал сделать простые примеры:

  • HelloWorld — просто вывод строки в консоль;

  • Factorials — вывод в консоль значений факториалов от 1 до 12;

  • Triangles — треугольники в консоли;

  • MessageBox(только для Windows) — окно с сообщением;

  • Window(только для Windows) — простое окно.

В файле ctx4all сделал, чтобы сообщение "Zero type size of " выдавалось только в случае реальной ошибки(если тип не void).

Из особенностей:

  • после return — точка с запятой в конце не нужна;

  • но если возвращается значение return Value; — то нужна;

  • из базовых типов есть char(1 байт), byte(1 байт), int(4 байт знаковое), word(4 байта беззнаковое);

  • но нет 2-ух байтового типа;

  • непривычная логика с указателями: поддерживаются ^ @ [], но используются немного необычно.

Сам себя компилятор успешно компилирует, как в Windows, так и в KolibriOS, по идее он и под Linux-ом должен работать.
В папке "src" есть командные скрипты для сборки ".bat" из-под Windows и ".sh" из-под KolibriOS.
Для сборки нужен ассемблер FASM, в KolibriOS он есть в дистрибутиве "из коробки".
После запуска скрипта в папке создаётся файл ".asm", который передаётся FASM-у, после чего будет создан исполняемый файл("exe" для Windows, или "kex" для KolibriOS, или формата "Elf" для Linux).
Чтобы собрать какой-нибудь пример из-под KolibriOS, нужно запустить файл make_in_KOS.sh в папке с примером, после этого в папке появится исполняемый файл ".kex".

Функции для KolibriOS в файле sys4kos я перенёс из предыдущей версии.
Некоторые вещи там требуют улучшения.
Например, сейчас загрузка библиотеки Console находится в самой функции puts и вызывается при самом первом вызове puts, необходимо выделить эти действия в отдельные процедуры.

Но есть неприятная ситуация:
Если собирать компилятор из-под KolibriOS с помощью скрипта для Shell, то появляются ошибки Fasm-а, причём рандомно, а иногда отрабатывает и без ошибок.
К тому же, Fasm начинает ругаться на то, что на самом деле ошибками вовсе и не является(!).
Пробовал даже вставлять командную строку в окно Shell — всё то же самое.
Если же полученный asm-файл компилировать не через Shell, а  через приложение Fasm, или через RUN, или открыть в TinyPad и нажать в меню "Compile", то всё нормально, ошибок нет.
Заметил, что после запуска Shell на доске отладки пишет про какой-то AppHeader номер 2.
Вероятно, что проблема именно с этим.
Похоже новички-колибристы снова что-то поломали, толком не протестировали и залили в trunk.
Всё как обычно, не в лучших традициях проекта, к сожалению.
Тестировалось в недавней сборке svn9872-img.
Но примеры вроде и так собираются(размер файла у них гораздо меньше и ошибок не возникает), а если повезёт, то и компилятор соберётся.
В крайнем случае, открывайте полученный asm-файл в TinyPad и нажимайте "Compile".
Но иногда и TinyPad не хочет открывать слишком большие файлы.
Кстати, со старой версией компилятора Context такой проблемы нет — снова играет роль размер asm-файла, он немного меньше, чем в новой версии.

Ещё можно попробовать немного извращенский вариант скрипта для Shell с запуском через программу RUN

/sys/run /sys/develop/fasm ctx4kos.asm,context.kex,./

Собирать так:

  • запустить файл make_in_KOS_RUN.sh;

  • когда появится окно программы RUN, нажать кнопку запуска в этом окне.

Этот вариант компилируется всегда без ошибок.

В архиве 2 версии: старая(OldVersion) и новая(NewVersion).
Их возможности и синтаксис различаются, например, константные выражения в старой версии не поддерживаются(то есть, нельзя писать 2+3 — будет неверно считать).

Если кому-то будет интересно, то можно поработать в направлении улучшения поддержки системных функций KolibriOS, сейчас их поддержка ограничивается только необходимыми для самого компилятора функциями.

Post's attachments

Иконка вложений Context3_26_08_2022.7z 174.57 Кб, 35 скачиваний с 2022-08-26