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

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

Open
VadimAnIsaev opened this issue Aug 18, 2020 · 50 comments

Comments

@VadimAnIsaev
Copy link

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

  • CMath.ob07 - комплексные числа;
  • MathBits.ob07 - побитовые операции для целых чисел;
  • MathExt.ob07 - дополнительные функции общего вида;
  • MathRound.ob07 - дополнительные функции округления;
  • MathStat.ob07 - дополнительные функции, статистика;
  • Rand.ob07 - простой генератор какбыслучайных чисел, алгоритм Лемера;
  • RandExt.ob07 - дополнительные генераторы какбыслучайных чисел:
    - алгоритм 133б из Comm ACM 5,10 (Oct 1962) 553;
    - алгоритм mrg32k3a;
    - алгоритм MT19937 (Мерсена-Твистера).
@AntKrotov
Copy link
Owner

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

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

@VadimAnIsaev
Copy link
Author

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

@VadimAnIsaev
Copy link
Author

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

@AntKrotov
Copy link
Owner

Если сохранять юникод без 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
Copy link
Author

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

@AntKrotov
Copy link
Owner

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

@prospero78
Copy link
Contributor

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

@VadimAnIsaev
Copy link
Author

Ок.

@VadimAnIsaev
Copy link
Author

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

@AntKrotov
Copy link
Owner

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

@VadimAnIsaev
Copy link
Author

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

@prospero78
Copy link
Contributor

prospero78 commented Aug 19, 2020

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

@AntKrotov
Copy link
Owner

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

@VadimAnIsaev
Copy link
Author

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

@Coockie
Copy link

Coockie commented Aug 19, 2020

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

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

@VadimAnIsaev
Copy link
Author

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

@prospero78
Copy link
Contributor

prospero78 commented Aug 19, 2020

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

В закладки))

@Coockie
Copy link

Coockie commented Aug 19, 2020

Спасибо.

@VadimAnIsaev
Copy link
Author

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

@prospero78
Copy link
Contributor

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

@prospero78
Copy link
Contributor

prospero78 commented Aug 19, 2020

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

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

@VadimAnIsaev
Copy link
Author

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

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

@prospero78
Copy link
Contributor

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

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

@VadimAnIsaev
Copy link
Author

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

@prospero78
Copy link
Contributor

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

@VadimAnIsaev
Copy link
Author

VadimAnIsaev commented Nov 20, 2020

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

Очередное небольшое добавление для Вашего суперкомпилятора. :-)
Модуль обработки строк в кодировке 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
Copy link
Owner

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

@prospero78
Copy link
Contributor

prospero78 commented Nov 25, 2020

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

@AntKrotov
Copy link
Owner

Бэк-энд 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
Copy link
Contributor

prospero78 commented Nov 25, 2020

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

@AntKrotov
Copy link
Owner

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

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

@prospero78
Copy link
Contributor

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

@AntKrotov
Copy link
Owner

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

@prospero78
Copy link
Contributor

prospero78 commented Nov 25, 2020

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

@VadimAnIsaev
Copy link
Author

VadimAnIsaev commented Nov 25, 2020

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

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

@prospero78
Copy link
Contributor

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

@AntKrotov
Copy link
Owner

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

^Q O7ARMv7MLinker.Link STM32F103C8 MicroSlowLed

@prospero78
Copy link
Contributor

prospero78 commented Nov 25, 2020

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


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

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

@AntKrotov
Copy link
Owner

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

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

@prospero78
Copy link
Contributor

prospero78 commented Nov 25, 2020

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

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

@AntKrotov
Copy link
Owner

AntKrotov commented Nov 25, 2020

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

@AntKrotov
Copy link
Owner

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

@VadimAnIsaev
Copy link
Author

Здорово! :-)

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

@AntKrotov
Copy link
Owner

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

@VadimAnIsaev
Copy link
Author

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

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

@VadimAnIsaev
Copy link
Author

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

@VadimAnIsaev
Copy link
Author

@AntKrotov
Copy link
Owner

OK.

@AntKrotov
Copy link
Owner

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

@VadimAnIsaev
Copy link
Author

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

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

No branches or pull requests

4 participants