AntKrotov / oberon-07-compiler

Oberon-07 compiler for x64 (Windows, Linux), x86 (Windows, Linux, KolibriOS), MSP430x{1,2}xx, STM32 Cortex-M3
BSD 2-Clause "Simplified" License
63 stars 6 forks source link

Дополнительные модули для компилятора #14

Open VadimAnIsaev opened 4 years ago

VadimAnIsaev commented 4 years ago

Здравствуйте! Могу ли я предложить Вам дополнительные модули для Вашего превосходного компилятора? https://github.com/VadimAnIsaev/Oberon-07-additional-modules

AntKrotov commented 4 years ago

Спасибо! Лишним не будет. Я посмотрел, чуть позже добавлю. Возможно, там есть что исправить и оптимизировать. И у меня есть одно замечание: если Вы используете юникод, то сохраняйте файлы в UTF8 c BOM.

P. S. Надо будет, когда найду время, переписать модуль Math для быстрого вычисления трансцендентных функций. Сейчас они вычисляются через сумму ряда, это неэффективно, но есть специальные быстрые алгоритмы. Код я нашел, но надо переписать на Оберон-07.

VadimAnIsaev commented 4 years ago

Согласен, наверняка в коде есть что оптимизировать. Я просто сделал перевод кода из FreePascal. Состряпал небольшую программку-переводчик синтаксиса из Pascal в Oberon. Практически всё переводит за раз, но там пока есть одна нерешённая проблема. Про BOM я понял. Просто у меня в Ubuntu этот BOM ни на что не влияет, т.к. UTF-8 - это кодировка системы. Если хотите, выложите мне коды "быстрых алгоритмов", я их переведу. если только это не ассемблер и не Лисп... :-)

VadimAnIsaev commented 4 years ago

BOM в файлы добавил.

AntKrotov commented 4 years ago

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

( комментарий ) i := i DIV 10.0;

Также, будут неправильно транслироваться операции с типом WCHAR (напр. присваивание для ARRAY n OF WCHAR):

wstr := "Привет, мир!";

BOM нужно, чтобы компилятор отличал UTF8 от какой-либо однобайтовой кодировки. Поддержка однобайтовой кодировки сейчас нужна только по историческим причинам для работы в KolibriOS (там имеющиеся текствовые редакторы не умеют UTF8). Иначе я бы оставил только UTF8 с BOM или без.

быстрые алгоритмы здесь: https://github.com/Oleg-N-Cher/OfrontPlus/blob/master/Mod/Lib/MathL.Mod Там Оберон, но более развитый диалект, поэтому многое надо переписывать, хотя, в принципе, достаточно sin, cos, arctan, ln и exp.

VadimAnIsaev commented 4 years ago

Здравствуйте! Из той ссылки, что Вы скинули, переделал вычисление синуса и косинуса. Заметная разница в скорости начинается после 1 000 000 итераций: для Вашей библиотеки Math - 11 тиков (HOST.GetTickCount() :-) ), для переделанной MathL - 7 тиков. При 10 000 000 итераций: Math - 109 тиков, MathL - 74 тика.

AntKrotov commented 4 years ago

Спасибо, но я уже переделал SinCos, exp, ln и arctan2, остальное можно выразить через эти четыре функции. Значительно увеличилась скорость exp и обратных тригонометрических функций. Прямые тригонометрические и логарифм ускорились не так сильно. Кстати, в моей библиотеке еще были ошибки, связанные неправильным выбором знака квадратного корня.

prospero78 commented 4 years ago

Радуете, коллеги!)) Давайте больше либ разных и быстрых))

VadimAnIsaev commented 4 years ago

Ок.

VadimAnIsaev commented 4 years ago

Супер! Среднее время вычисления 10 000 000 синусов стало 68 тиков. :-)

AntKrotov commented 4 years ago

Да, теперь работает быстрее и, главное, правильно. Только это не тики, конечно, а сотые доли секунды. HOST.GetTickCount возвращает сотые доли, т. к. компилятор замеряет время компиляции с точностью до 0.01 с -- большая точность не требуется.

VadimAnIsaev commented 4 years ago

Если кому интересно, для своей книжки по истории языка Pascal проводил сравнение всех бесплатных паскалеподобных компиляторов на скорость решения СЛАУ (матрица 3000х3000). Там есть и тест этого компилятора. :-) https://files.kraslib.ru/artcls/01.png

prospero78 commented 4 years ago

Ага. Полезно!)) Оберон, конечно, радует)) В любом исполнении))

AntKrotov commented 4 years ago

Удивительно высокий результат у XDS. Но, к сожалению, он только для x86.

VadimAnIsaev commented 4 years ago

XDS делали новосибирцы специально для нашего предприятия ИСС и во времена оны, когда финансирование устремилось к нулю, его разработку полностью забросили. А так - это превосходный оптимизирующий компилятор, слегка сложноватый, но по скорости он чуть ли не ассемблер уделывет. Его исходники доступны на Гитхабе, если бы кто взялся продолжить разработку...

Coockie commented 4 years ago

Если кому интересно, для своей книжки по истории языка Pascal проводил сравнение всех бесплатных паскалеподобных компиляторов на скорость решения СЛАУ (матрица 3000х3000). Там есть и тест этого компилятора. :-)

Здравствуйте, Вадим! Может быть скинете ссылку на вашу книгу? Мне и может быть другим было бы интересно почитать.

VadimAnIsaev commented 4 years ago

Вот ссылка на книгу: https://yadi.sk/i/cPFkCwp310SPEA

prospero78 commented 4 years ago

Вот ссылка на книгу:

В закладки))

Coockie commented 4 years ago

Спасибо.

VadimAnIsaev commented 4 years ago

Предупреждаю - это не научный труд. :-) Писал её для наших студентов, специально, чтобы их не клонило ко сну от программирования. :-)

prospero78 commented 4 years ago

Шеф дал команду отдыхать двое суток (рабочий конфликт по мержу кода). Так что почитаю с интересом.

prospero78 commented 4 years ago

Вот ссылка на книгу: https://yadi.sk/i/cPFkCwp310SPEA

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

VadimAnIsaev commented 4 years ago

но кое-где -- спорно.

Там во введении написано - "... не только факты, но так же многочисленные слухи и сплетни...". ;-) Так что споры приветствуются. Вот только где именно спорить?

prospero78 commented 4 years ago

Вот только где именно спорить?

Разумеется на соответствующей страничке проекта на github))

VadimAnIsaev commented 4 years ago

Всем доброго времени суток! Создал на Гитхабе отдельный проект с книжкой. Там же выложил и архив с кодами примеров из неё. https://github.com/VadimAnIsaev/HistPascal

prospero78 commented 4 years ago

Во! Это разговор!))

VadimAnIsaev commented 4 years ago

Доброе время суток!

Очередное небольшое добавление для Вашего суперкомпилятора. :-) Модуль обработки строк в кодировке UTF-8. Простейшие процедуры.

Список процедур:

Length() - длина строки в символах. Copy() - копирование части строки из строки. Pos() - позиция части строки в строке. Delete() - удаление части строки из строки. Insert() - вставка одной строки в другую. Trim() - удаление пробелов и управляющих символов с начала и конца втроки. UpperCase() - преревод маленьких букв в заглавные. LowerCase() - перевод заглавных букв в маленькие.

*Примечание: обе процедуры выше работают с большинством парных европейских символов с диакритами. Плюс греческие символы и кирилица. Для азиатских языков пока не сделано.

IntToHex() - представление целого числа в шестнадцатеричном строковом виде. HexToInt() - перевод строки шестнадцатиричных символов в целое число. StrToInt() - перевод строки с целым числом в целое число. IntToStr() - представление целого числа в строковом виде.

Ссылка на модуль: https://github.com/VadimAnIsaev/Oberon-07-additional-modules/tree/master/src/srtrings

AntKrotov commented 4 years ago

Отлично! На днях попробую.

prospero78 commented 4 years ago

Похоже, стандартная библиотека пошла в наработку?)) Все подобные конвертации, безусловно пригодятся. Конечно, хорошо бы иметь библиотечную мультипоточность, сеть, графику и звук -- тогда есть все шансы на успех. STM32 прям вообще удивил)) Подруга тут намекает ей девайс собрать -- прям идея фикс)) ( потихонечку в ООП-вид пример с графикой для линукса пересобираю )

AntKrotov commented 4 years ago

Бэк-энд STM32 сейчас подходит не для всех устройств, так как могут различаться адреса начала ROM/RAM памяти. Настроить адреса можно в модуле THUMB, также, можно настроить транслятор на набор инструкций Cortex-M0 (но я тестировал только на M3):

PROCEDURE CortexM3; BEGIN Target.FlashAdr := 08000000H; ( адрес ROM ) Target.SRAMAdr := 20000000H; ( адрес RAM ) Target.IVTLen := 256; Target.Reserved := 0; Target.MinStack := 512; Target.InstrSet.thumb2 := TRUE; ( FALSE, если Cortex-M0 ) Target.InstrSet.it := TRUE; ( FALSE, если Cortex-M0 ) Target.InstrSet.sdiv := TRUE; ( FALSE, если Cortex-M0 ) Target.InstrSet.cbxz := TRUE ( FALSE, если Cortex-M0 ) END CortexM3;

Вещественная арифметика эмулируется и довольно неэффективно. Надо будет переписать в машинных кодах, но пока до этого не доходит.

prospero78 commented 4 years ago

Можно взять все константы из компилятора aix. Там точно настройки рабочие, проверено на STM32F103C8T6). Антон, посмотри будь добр пул реквест. Нет, так закрой. Висит уже больше двух месяцев. Главным образом, тесты добавил.

AntKrotov commented 4 years ago

OK, закрою, откровенно говоря, ничего интересного там не вижу.

Можно, конечно, взять из aix, не проблема. Вопрос в том, как это лучше передать в командной строке. Да, еще: некоторые устройства требуют запись контрольной суммы в вектор прерываний, это тоже надо как-то учитывать.

prospero78 commented 4 years ago

Уууу.... Ну, это какие-то детали -- я не в курсе)) Просто накомпилил, залил и работает.

AntKrotov commented 4 years ago

Но ведь каким-то образом, характеристики, модель устройства передаются в компилятор. Если указывать модель, то их очень много, а если только характеристики, то получается много параметров в командной строке.

prospero78 commented 4 years ago

Ну так зачем делать параметры командной строки? Тупо взять файл описаний. Они же все уже описаны. Их там оооочень много. Считай, только расширение поменять, да файл переименовать.

VadimAnIsaev commented 4 years ago

... хорошо бы иметь библиотечную мультипоточность, сеть, графику и звук ...

В начале года пробовал реализовать интерфейсные компоненты из GTK (окна, кнопки и т.п. бантики и рюшечки... :-) ) с помощью ихних прямых функций. На окнах дело встало. Так и не удалось его создать, хотя с первого взгляда вроде всё верно. Возможно дело в большом зоопарке излишне "дробанутых" типах данных в Си - 8, 16, 32, 64-битные, плюсминусовые, беззнаковые... , которые Oberon-07 просто-напросто не воспроизводит. Возможно отсюда и проблемы в посылке правильных данных. Не разобрался, плюнул... Сейчас буду пробовать воспроизвести эти компоненты через XML-библиотеку GTK. У BlackBox это дело вроде получалось. Мультипоточность надо попробовать сделать как у FreePascal, т.е. верхний уровень - модуль TThread, а там уже у каждой ОС сделать свою реализацию путём вызова функций этой ОС. Как альтернатива, причём более простая, вместо многопоточности задействовать многопроцессность (MPI). Для FreePascal я такой модуль некоторое время назад сделал, причём как для Mpich (что было сравнительно легко), так и для OpenMPI (застрелиться и не встать с ихними типами данных!!!! :-) ). Интерфейс к сишной сетевой биб-ке тоже начал делать, но там пока всё заглохло, за отсутствием времени. В общем, главная проблема - добиться каким-то образом совместимости с Си-библиотеками, не извращаясь с наворачиваниями новых "урезаных" типов данных.

prospero78 commented 4 years ago

Ну так SYSTEM же позволяет вообще конём ходить)) Короче, оберонщики всех стран -- соединяйтесь! И пилите код.

AntKrotov commented 4 years ago

Надо будет подробнее изучить aixp/O7, но на первый взгляд, в компилятор зашит список возможных таргетов (LPC4088, STM32F100, STM32F101, ...) (их очень много) и, линкер получает имя таргета из командной строки. Вот, как-то так:

^Q O7ARMv7MLinker.Link STM32F103C8 MicroSlowLed

prospero78 commented 4 years ago

Ну, ты же можешь оформить вызовом процедуры, а не командной строкой ;)


Я тут немного поработал над примером анимации для lin64)) Можешь вставить в README.md ссылку на мою репу)) https://github.com/prospero78/obGraph

И пора бы уже добавить полноценный README.md

AntKrotov commented 4 years ago

Ладно, сделаю какой-нибудь формальный README.md и тогда добавлю ссылку.

Нужна передача параметров в командной строке. Как иначе указать компилятору, для какого устройства компилировать? Если для STM32F100, то Compiler Module.ob07 STM32F100 Если для LPC4088, то Compiler Module.ob07 LPC4088 Либо перечислить в командной строке все необходимые характеристики: размер памяти, адрес памяти, контрольная сумма есть/нет и т. д.

prospero78 commented 4 years ago

Вовсе не обязательно. Определяешь модуль stmopt.ob07 и там определяешь переменные для компилятора. При написании программы его надо обязательно импортировать. Как только ты перехватил импорт этого модуля -- значит там лежат параметры. При компиляции подтягиваешь оттуда переменные и упрощаешь себе задачу кратно. С учётом того, что присвоение в другой модуль -- только через процедуры -- ты ещё можешь и валидатор прикрутить.

Точно также вместо опций командной строки для всего компилятора -- ты можешь определять импорт соответствующих контрольных модулей. Даже если такого импорта нет -- определяешь тип операционной системы и по дефолту генеришь бинарник для этой платформы. Надо другая платформа? Велком в параметры командной строки или ещё лучше -- переменные окружения. Чем каждый раз в параметры набивать -- один раз переменную окружения задал и доволен ( особенно когда надо серию бинарников собирать, или сложный сценарий ).

AntKrotov commented 4 years ago

Сложновато в использовании. Ладно, для STM это всё не так уж важно, надо только правильно указать размер RAM и ROM при компиляции. Адреса вроде бы одни и те же, контрольная сумма не нужна. Проблемы будут для других ARMv7 контроллеров: LPC, Arduino Due (AT91SAM3X8E)...

AntKrotov commented 3 years ago

Ну вот и пригодилась процедура Trim из StrUtils).

VadimAnIsaev commented 3 years ago

Здорово! :-)

Я сейчас пытаюсь сетевой модуль допилить. Возможно что-то получится... Там будет самый минимум - создание сокета, для сервера: привязка к интерфейсу, слушание порта, приём связи. Для клиента: передача\приём данных. Закрытие сокета. Пока только для IPv4. Плюс универсальная процедура преобразования строкового адрема и порта в структуру с сетевым расположением байтов. Когда сделаю, пока не знаю. :-)

AntKrotov commented 3 years ago

Я пробовал работать с сетью по протоколу HTTPS (TLS 1.0, 1.1). Получалось запросить html-страницу и сохранить её на диске. Но до ума не довел... Кстати, в StrUtils.Trim есть ошибка: если на вход дать строку, которая состоит из одних пробелов, будет выход за границы массива.

VadimAnIsaev commented 3 years ago

Кстати, в StrUtils.Trim есть ошибка: если на вход дать строку, которая состоит из одних пробелов, будет выход за границы массива.

Ок, проверю, исправлю.

VadimAnIsaev commented 3 years ago

Исправил. Ввёл ограничение на переменные "start" (меньше длины строки) и "end" (больше 0).

VadimAnIsaev commented 3 years ago

https://github.com/VadimAnIsaev/Oberon-07-additional-modules/tree/master/src/srtrings

AntKrotov commented 3 years ago

OK.

AntKrotov commented 3 years ago

А, нет. Если s := "qwerty"; Trim("", s); то s не изменится, а должно быть s = "". А если Trim(" ", s); то s = " " (одиночный пробел вместо пустой строки). Возьмите мой вариант из /source/STRINGS.ob07 (STRINGS.trim)

VadimAnIsaev commented 3 years ago

Спасибо, напомнили. :-) Забыл проинициализировать второй параметр нулём. исправил.