Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Oberon-07/16
https://zx.oberon.org/forum/viewtopic.php?f=40&t=424
Страница 1 из 7

Автор:  akron1 [ 17 окт 2018, 12:51 ]
Заголовок сообщения:  Oberon-07/16

Я написал новый компилятор Оберона-07 по ревизии 2016 г. Компилятор использует промежуточное представление в виде кода стэковой виртуальной машины. Такой промежуточный код плохо подходит для оптимизации и распределения регистров (фактически для вычислений выражений используются только три регистра), зато он сравнительно просто транслируется для разных типов процессоров. Пока есть бэк-энд только для x86_32, но планирую (когда-нибудь) сделать еще как минимум для x86_64. Также предполагаю усовершенствовать промежуточный код, чтобы можно было рациональнее использовать регистры и инлайнить процедуры. Скорость исполнения программ, конечно, так себе, но гораздо лучше, чем было -- сейчас она составляет 70-80% от скорости BlackBox. Да, пока он производит только ассемблерный листинг (fasm), на машинный код переделаю позднее. Я понимаю, что для мультитаргетности и высокого качества машинного кода, надо делать трансляцию в C или LLVM, но я делаю не то что лучше, а то, что мне интереснее. Поддерживаются ОС Windows и KolibriOS, для Linux пока не сделал.

Репозиторий на гитхабе https://github.com/AntKrotov/oberon-07-compiler

Автор:  Comdiv [ 17 окт 2018, 15:19 ]
Заголовок сообщения:  Re: Oberon-07/16

Поздравляю с достигнутыми улучшениями.
1. Попробовал. С пользовательской точки зрения им пока не очень удобно пользоваться. Из описания, например, даже неясно как собрать многомодульное приложение. Планируются ли улучшения в этой области? Хотя бы в описании и примерах?
2. Чего не хватает для работы в GNU/Linux? Для этого семейства ОС формат ассемблерного кода сильно отличается или мешают другие детали?
3. Вам интересно работать над проектом только целиком или более интересна генерация низкоуровневого кода?

Экспериментально выяснилось, что многомодульное приложение собирается, если запускать компилятор из каталога с файлами с исходным кодом.

Автор:  akron1 [ 18 окт 2018, 07:17 ]
Заголовок сообщения:  Re: Oberon-07/16

Comdiv писал(а):
Поздравляю с достигнутыми улучшениями.

Спасибо.

1. Вроде всё понятно -- надо просто указать главный модуль (полный путь, относительные пути пока не поддерживаются). Раздельной компиляции нет, любое приложение многомодульное: RTL и API всегда включаются в выходной файл. Все используемые модули должны находиться в одной папке с главным, либо в папке lib/Windows32 (lib/KolibriOS).
2. Не скажу, что я хорошо знаю Windows, но я её понимаю, в общих чертах. KolibriOS устроена очень наивно и поддержку
этой ОС сделать совсем просто. А с Linux я никогда вплотную не работал. Когда-то я читал (но сейчас уже смутно помню), что там в библиотеках используется позиционно-независимый код (PIC), это может усложнить задачу, поэтому пока я отложил поддержку Linux до лучших времен. Можно, конечно, сделать без поддержки генерации библиотек, но в любом случае на всё нужно время, нельзя всё сделать сразу. Сначала делаю то, что могу сделать быстрее.
3. Вообще, мне более интересна генерация низкоуровневого кода, хотя высококачественная кодогенерация -- это крайне сложная задача, но я не гонюсь за этим. Если хоть как-то работает -- уже хорошо.

Автор:  Comdiv [ 18 окт 2018, 11:31 ]
Заголовок сообщения:  Re: Oberon-07/16

akron1 писал(а):
1. Вроде всё понятно -- надо просто указать главный модуль (полный путь, относительные пути пока не поддерживаются)
Необходимость указания полного пути как раз и не является понятной из описания.
Цитата:
3. Вообще, мне более интересна генерация низкоуровневого кода, хотя высококачественная кодогенерация -- это крайне сложная задача, но я не гонюсь за этим. Если хоть как-то работает -- уже хорошо.
Я это спрашивал, чтобы понять, может ли Вам быть интересна кооперация или Вы нацелены на полный контроль всего транслятора, как это происходит со многими разрозненными группами. Раз Вам интересна именно низкоуровневая генерация в машинный код, то, возможно, сотрудничество могло бы позволить сосредоточиться на этой задаче. Такую возможность Вы не рассматриваете?


Мой опыт запуска Вашего транслятора таков:
Я его запускал в GNU/Linux из WINE - работает исправно. Если в .ini файле прописать _fasm_win "/usr/bin/fasm", то транслятор собирает и конечный исполняемый файл - забавный симбиоз. Также, мне удалось собрать транслятор проекта Восток, правда, нерабочий в полной мере, потому что псевдо-библиотечные модули - это просто интерфейсные заглушки. Но это уже особенности транслятора Восток. Это, наверно, говорит о достаточно хорошем качестве Вашего компилятора. К примеру, транслятор byte-code https://github.com/lboasso/oberonc ломается при попытке собрать этот же код.

Автор:  geniepro [ 18 окт 2018, 13:01 ]
Заголовок сообщения:  Re: Oberon-07/16

akron1 писал(а):
Пока есть бэк-энд только для x86_32, ... Да, пока он производит только ассемблерный листинг (fasm), на машинный код переделаю позднее.

А fasm для него какой именно версии требуется? Я попробовал скомпилировать hello-world каким-то fasmw, который нашёл у себя где-то на компе, так при запуске экзешника выдаётся сообщение об ошибке в модуле In (вроде как выход за пределы массива)...

UPD. Скачал последнюю версию fasmw17304, прописал его в инишнике компилятора -- вроде скомпилировалось и выполнилось без ошибок...

Автор:  geniepro [ 18 окт 2018, 13:18 ]
Заголовок сообщения:  Re: Oberon-07/16

Кстати, я там посмотрел получающийся asm-файл, слишком много разных ассемблерных команд. Ведь любую программу, любой алгоритм можно записать одной единственной командой mov (она полна по Тьюрингу).
Не хочешь переделать кодогенератор, что бы он выдавал только команды mov? :lol:

Цитата:
https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf - доказательство её тюринг полноты

https://github.com/xoreaxeaxeax/movfuscator - Собственно, реализация обфускатора, который заменяет обычный код на код, в котором есть ТОЛЬКО инструкции mov

https://bolknote.ru/all/4656/

Автор:  akron1 [ 18 окт 2018, 16:42 ]
Заголовок сообщения:  Re: Oberon-07/16

Comdiv писал(а):
Необходимость указания полного пути как раз и не является понятной из описания.

Да, это просто временная недоделка.

Comdiv писал(а):
Я это спрашивал, чтобы понять, может ли Вам быть интересна кооперация или Вы нацелены на полный контроль всего транслятора, как это происходит со многими разрозненными группами. Раз Вам интересна именно низкоуровневая генерация в машинный код, то, возможно, сотрудничество могло бы позволить сосредоточиться на этой задаче. Такую возможность Вы не рассматриваете?

Я не против сотрудничества. Просто компилятор это сложная и сильно связная программа. Там непросто сделать разделение труда.

Comdiv писал(а):
Также, мне удалось собрать транслятор проекта Восток, правда, нерабочий в полной мере, потому что псевдо-библиотечные модули - это просто интерфейсные заглушки.

Может нам, по-возможности, максимально сблизить наши реализации, т. е. сделать их как можно более совместимыми? А то реализаций O7 много, но каждая создает свой собственный диалект.

geniepro писал(а):
Скачал последнюю версию fasmw17304, прописал его в инишнике компилятора -- вроде скомпилировалось и выполнилось без ошибок...

Про версию fasm я забыл написать. Версия 1.72 тоже годится.

Автор:  Comdiv [ 18 окт 2018, 17:20 ]
Заголовок сообщения:  Re: Oberon-07/16

akron1 писал(а):
Я не против сотрудничества. Просто компилятор это сложная и сильно связная программа. Там непросто сделать разделение труда.
Но есть вполне разделяемые части. Разбор высокоуровневого языка - это одно, генерация кода - другое, взаимодействие с пользователем - третье. Главная проблема, как я это вижу, это договороспособность людей. Оберон привлекает одиночек, так как по силам почти любому желающему без жёсткой необходимости взаимодействия с другими людьми.

akron1 писал(а):
Может нам, по-возможности, максимально сблизить наши реализации, т. е. сделать их как можно более совместимыми? А то реализаций O7 много, но каждая создает свой собственный диалект.
Да, это было бы хорошо, я готов двигаться в этом направлении. Конкретно Восток не вводит диалектных отличий, кроме тех, которые вызваны неопределённостью в описании. Благодаря этому его можно собрать почти любым корректным транслятором Оберона. Но есть ещё и библиотеки.

akron1 писал(а):
Про версию fasm я забыл написать. Версия 1.72 тоже годится.
В GNU/Linux работает и с 1.71

Автор:  akron1 [ 20 дек 2018, 06:54 ]
Заголовок сообщения:  Re: Oberon-07/16

Есть бэк-энд для AMD64 (Windows)!
Еще очень сырой, но уже в состоянии компилировать сам себя. Пока есть некоторые недоработки:

- не поддерживаются длинные константы (те, которые не помещаются в диапазон [-2147483648..2147483647]): AMD64 не позволяет обрабатывать такие константы за одну инструкцию

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

- для плавающей точки используется x87 вместо xmm

- пока, по традиции, компилятор производит ассемблерный код fasm


Провел сравнение по скорости с компилятором Patchouli:

рекурсивное вычисление чисел Фибоначчи: одинаково
сортировка "пузырьком" целочисленного массива: Patchouli быстрее на 13%
задача о ферзях: Patchouli быстрее на 20%

Думаю, для начала, неплохо. Кодогенератор Patchouli немного лучше, но он изначально разрабатывался для AMD64.

Также, 64-битный компилятор без ограничений может производить и 32-битный код (обратное, конечно, неверно).
Хотя в AMD64 на 8 регистров больше, чем в x86, компилятор активно использует только 3 регистра (такое вот промежуточное представление). Нерационально, да. Возможно, в дальнейшем, я подумаю над этой проблемой.

Автор:  SovietPony [ 20 дек 2018, 12:04 ]
Заголовок сообщения:  Re: Oberon-07/16

akron1 писал(а):
Хотя в AMD64 на 8 регистров больше, чем в x86, компилятор активно использует только 3 регистра (такое вот промежуточное представление). Нерационально, да. Возможно, в дальнейшем, я подумаю над этой проблемой.

Почему не "стек на регистрах"? Я такое распределение использую в своём arm-компиляторе. В оригинальном компиляторе oberon-07 тоже такой ход используется.

Страница 1 из 7 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/