Open VadimAnIsaev opened 4 years ago
Спасибо! Лишним не будет. Я посмотрел, чуть позже добавлю. Возможно, там есть что исправить и оптимизировать. И у меня есть одно замечание: если Вы используете юникод, то сохраняйте файлы в UTF8 c BOM.
P. S. Надо будет, когда найду время, переписать модуль Math для быстрого вычисления трансцендентных функций. Сейчас они вычисляются через сумму ряда, это неэффективно, но есть специальные быстрые алгоритмы. Код я нашел, но надо переписать на Оберон-07.
Согласен, наверняка в коде есть что оптимизировать. Я просто сделал перевод кода из FreePascal. Состряпал небольшую программку-переводчик синтаксиса из Pascal в Oberon. Практически всё переводит за раз, но там пока есть одна нерешённая проблема. Про BOM я понял. Просто у меня в Ubuntu этот BOM ни на что не влияет, т.к. UTF-8 - это кодировка системы. Если хотите, выложите мне коды "быстрых алгоритмов", я их переведу. если только это не ассемблер и не Лисп... :-)
BOM в файлы добавил.
Если сохранять юникод без 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.
Здравствуйте! Из той ссылки, что Вы скинули, переделал вычисление синуса и косинуса. Заметная разница в скорости начинается после 1 000 000 итераций: для Вашей библиотеки Math - 11 тиков (HOST.GetTickCount() :-) ), для переделанной MathL - 7 тиков. При 10 000 000 итераций: Math - 109 тиков, MathL - 74 тика.
Спасибо, но я уже переделал SinCos, exp, ln и arctan2, остальное можно выразить через эти четыре функции. Значительно увеличилась скорость exp и обратных тригонометрических функций. Прямые тригонометрические и логарифм ускорились не так сильно. Кстати, в моей библиотеке еще были ошибки, связанные неправильным выбором знака квадратного корня.
Радуете, коллеги!)) Давайте больше либ разных и быстрых))
Ок.
Супер! Среднее время вычисления 10 000 000 синусов стало 68 тиков. :-)
Да, теперь работает быстрее и, главное, правильно. Только это не тики, конечно, а сотые доли секунды. HOST.GetTickCount возвращает сотые доли, т. к. компилятор замеряет время компиляции с точностью до 0.01 с -- большая точность не требуется.
Если кому интересно, для своей книжки по истории языка Pascal проводил сравнение всех бесплатных паскалеподобных компиляторов на скорость решения СЛАУ (матрица 3000х3000). Там есть и тест этого компилятора. :-) https://files.kraslib.ru/artcls/01.png
Ага. Полезно!)) Оберон, конечно, радует)) В любом исполнении))
Удивительно высокий результат у XDS. Но, к сожалению, он только для x86.
XDS делали новосибирцы специально для нашего предприятия ИСС и во времена оны, когда финансирование устремилось к нулю, его разработку полностью забросили. А так - это превосходный оптимизирующий компилятор, слегка сложноватый, но по скорости он чуть ли не ассемблер уделывет. Его исходники доступны на Гитхабе, если бы кто взялся продолжить разработку...
Если кому интересно, для своей книжки по истории языка Pascal проводил сравнение всех бесплатных паскалеподобных компиляторов на скорость решения СЛАУ (матрица 3000х3000). Там есть и тест этого компилятора. :-)
Здравствуйте, Вадим! Может быть скинете ссылку на вашу книгу? Мне и может быть другим было бы интересно почитать.
Вот ссылка на книгу: https://yadi.sk/i/cPFkCwp310SPEA
Вот ссылка на книгу:
В закладки))
Спасибо.
Предупреждаю - это не научный труд. :-) Писал её для наших студентов, специально, чтобы их не клонило ко сну от программирования. :-)
Шеф дал команду отдыхать двое суток (рабочий конфликт по мержу кода). Так что почитаю с интересом.
Вот ссылка на книгу: https://yadi.sk/i/cPFkCwp310SPEA
Думаю, надо завести обсуждение. Есть сразу мысли по тексту. Читается хорошо, идеологически верный текст, но кое-где -- спорно.
но кое-где -- спорно.
Там во введении написано - "... не только факты, но так же многочисленные слухи и сплетни...". ;-) Так что споры приветствуются. Вот только где именно спорить?
Вот только где именно спорить?
Разумеется на соответствующей страничке проекта на github))
Всем доброго времени суток! Создал на Гитхабе отдельный проект с книжкой. Там же выложил и архив с кодами примеров из неё. https://github.com/VadimAnIsaev/HistPascal
Во! Это разговор!))
Доброе время суток!
Очередное небольшое добавление для Вашего суперкомпилятора. :-) Модуль обработки строк в кодировке 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
Отлично! На днях попробую.
Похоже, стандартная библиотека пошла в наработку?)) Все подобные конвертации, безусловно пригодятся. Конечно, хорошо бы иметь библиотечную мультипоточность, сеть, графику и звук -- тогда есть все шансы на успех. STM32 прям вообще удивил)) Подруга тут намекает ей девайс собрать -- прям идея фикс)) ( потихонечку в ООП-вид пример с графикой для линукса пересобираю )
Бэк-энд 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;
Вещественная арифметика эмулируется и довольно неэффективно. Надо будет переписать в машинных кодах, но пока до этого не доходит.
Можно взять все константы из компилятора aix
. Там точно настройки рабочие, проверено на STM32F103C8T6).
Антон, посмотри будь добр пул реквест. Нет, так закрой. Висит уже больше двух месяцев. Главным образом, тесты добавил.
OK, закрою, откровенно говоря, ничего интересного там не вижу.
Можно, конечно, взять из aix, не проблема. Вопрос в том, как это лучше передать в командной строке. Да, еще: некоторые устройства требуют запись контрольной суммы в вектор прерываний, это тоже надо как-то учитывать.
Уууу.... Ну, это какие-то детали -- я не в курсе)) Просто накомпилил, залил и работает.
Но ведь каким-то образом, характеристики, модель устройства передаются в компилятор. Если указывать модель, то их очень много, а если только характеристики, то получается много параметров в командной строке.
Ну так зачем делать параметры командной строки? Тупо взять файл описаний. Они же все уже описаны. Их там оооочень много. Считай, только расширение поменять, да файл переименовать.
... хорошо бы иметь библиотечную мультипоточность, сеть, графику и звук ...
В начале года пробовал реализовать интерфейсные компоненты из GTK (окна, кнопки и т.п. бантики и рюшечки... :-) ) с помощью ихних прямых функций. На окнах дело встало. Так и не удалось его создать, хотя с первого взгляда вроде всё верно. Возможно дело в большом зоопарке излишне "дробанутых" типах данных в Си - 8, 16, 32, 64-битные, плюсминусовые, беззнаковые... , которые Oberon-07 просто-напросто не воспроизводит. Возможно отсюда и проблемы в посылке правильных данных. Не разобрался, плюнул... Сейчас буду пробовать воспроизвести эти компоненты через XML-библиотеку GTK. У BlackBox это дело вроде получалось. Мультипоточность надо попробовать сделать как у FreePascal, т.е. верхний уровень - модуль TThread, а там уже у каждой ОС сделать свою реализацию путём вызова функций этой ОС. Как альтернатива, причём более простая, вместо многопоточности задействовать многопроцессность (MPI). Для FreePascal я такой модуль некоторое время назад сделал, причём как для Mpich (что было сравнительно легко), так и для OpenMPI (застрелиться и не встать с ихними типами данных!!!! :-) ). Интерфейс к сишной сетевой биб-ке тоже начал делать, но там пока всё заглохло, за отсутствием времени. В общем, главная проблема - добиться каким-то образом совместимости с Си-библиотеками, не извращаясь с наворачиваниями новых "урезаных" типов данных.
Ну так SYSTEM же позволяет вообще конём ходить)) Короче, оберонщики всех стран -- соединяйтесь! И пилите код.
Надо будет подробнее изучить aixp/O7, но на первый взгляд, в компилятор зашит список возможных таргетов (LPC4088, STM32F100, STM32F101, ...) (их очень много) и, линкер получает имя таргета из командной строки. Вот, как-то так:
^Q O7ARMv7MLinker.Link STM32F103C8 MicroSlowLed
Ну, ты же можешь оформить вызовом процедуры, а не командной строкой ;)
Я тут немного поработал над примером анимации для lin64)) Можешь вставить в README.md ссылку на мою репу)) https://github.com/prospero78/obGraph
И пора бы уже добавить полноценный README.md
Ладно, сделаю какой-нибудь формальный README.md и тогда добавлю ссылку.
Нужна передача параметров в командной строке. Как иначе указать компилятору, для какого устройства компилировать? Если для STM32F100, то Compiler Module.ob07 STM32F100 Если для LPC4088, то Compiler Module.ob07 LPC4088 Либо перечислить в командной строке все необходимые характеристики: размер памяти, адрес памяти, контрольная сумма есть/нет и т. д.
Вовсе не обязательно. Определяешь модуль stmopt.ob07 и там определяешь переменные для компилятора. При написании программы его надо обязательно импортировать. Как только ты перехватил импорт этого модуля -- значит там лежат параметры. При компиляции подтягиваешь оттуда переменные и упрощаешь себе задачу кратно. С учётом того, что присвоение в другой модуль -- только через процедуры -- ты ещё можешь и валидатор прикрутить.
Точно также вместо опций командной строки для всего компилятора -- ты можешь определять импорт соответствующих контрольных модулей. Даже если такого импорта нет -- определяешь тип операционной системы и по дефолту генеришь бинарник для этой платформы. Надо другая платформа? Велком в параметры командной строки или ещё лучше -- переменные окружения. Чем каждый раз в параметры набивать -- один раз переменную окружения задал и доволен ( особенно когда надо серию бинарников собирать, или сложный сценарий ).
Сложновато в использовании. Ладно, для STM это всё не так уж важно, надо только правильно указать размер RAM и ROM при компиляции. Адреса вроде бы одни и те же, контрольная сумма не нужна. Проблемы будут для других ARMv7 контроллеров: LPC, Arduino Due (AT91SAM3X8E)...
Ну вот и пригодилась процедура Trim из StrUtils).
Здорово! :-)
Я сейчас пытаюсь сетевой модуль допилить. Возможно что-то получится... Там будет самый минимум - создание сокета, для сервера: привязка к интерфейсу, слушание порта, приём связи. Для клиента: передача\приём данных. Закрытие сокета. Пока только для IPv4. Плюс универсальная процедура преобразования строкового адрема и порта в структуру с сетевым расположением байтов. Когда сделаю, пока не знаю. :-)
Я пробовал работать с сетью по протоколу HTTPS (TLS 1.0, 1.1). Получалось запросить html-страницу и сохранить её на диске. Но до ума не довел... Кстати, в StrUtils.Trim есть ошибка: если на вход дать строку, которая состоит из одних пробелов, будет выход за границы массива.
Кстати, в StrUtils.Trim есть ошибка: если на вход дать строку, которая состоит из одних пробелов, будет выход за границы массива.
Ок, проверю, исправлю.
Исправил. Ввёл ограничение на переменные "start" (меньше длины строки) и "end" (больше 0).
OK.
А, нет.
Если
s := "qwerty"; Trim("", s);
то s не изменится, а должно быть s = "".
А если
Trim(" ", s);
то s = " " (одиночный пробел вместо пустой строки).
Возьмите мой вариант из /source/STRINGS.ob07 (STRINGS.trim)
Спасибо, напомнили. :-) Забыл проинициализировать второй параметр нулём. исправил.
Здравствуйте! Могу ли я предложить Вам дополнительные модули для Вашего превосходного компилятора? https://github.com/VadimAnIsaev/Oberon-07-additional-modules