Тема: Компилятор языка 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, сейчас их поддержка ограничивается только необходимыми для самого компилятора функциями.