Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 14:02

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 29 ноя 2018, 03:45 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
budden писал(а):
А SovietPony зажал свои записки...


Поверьте, некоторые записки не стоят даже копейки, в основном самое ценное, как раз бесплатно! :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 29 ноя 2018, 07:12 
Не в сети
Аватара пользователя

Сообщения: 67
Откуда: Equestria
Ну так да. Исходники компилятора свободные.
Ну а выкладывать сырые заметки я не хочу. Гору денег за них не выпрашиваю. И пока нет возможности их допилить до презентабельного вида, суровый irl и на меня давит. Я их вообще делал для себя, а после публичного релиза BBARM хотел сделать полноценную документацию и/или туториал. Врядли комуто горит, потерпите.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 29 ноя 2018, 08:28 
Не в сети

Сообщения: 350
Ну как, горит - не горит, а по часу в день я этому делу посвящаю. Можете в личку прислать, если стыдно.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 29 ноя 2018, 17:36 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Пришло время добавить типы в наш компилятор и обработку выражений. В файл MCB.pas я добавил типы и объекты описывающие их:
Код: "OBERON"
  1.  
  2. Create(byteType,fByte , 1);
  3. Create(boolType,fBool , 1);
  4. Create(charType,fChar , 1);
  5. Create(intType ,fInt , 4);
  6. Create(realType,fReal , 4);
  7. Create(setType ,fSet , 4);
  8. Create(nilType ,fNilTyp, 4);
  9. Create(noType ,fNoTyp , 4);
  10. Create(hugeType,fHuge , 8);
  11. Create(strType ,fString, 8);
  12.  
  13. Enter('SET' , cTyp, setType , 0);
  14. Enter('BYTE' , cTyp, byteType, 0);
  15. Enter('CHAR' , cTyp, charType, 0);
  16. Enter('REAL' , cTyp, realType, 0);
  17. Enter('BOOLEAN' , cTyp, boolType, 0);
  18. Enter('INTEGER' , cTyp, intType , 0);
  19.  


И процедуру свертывания констант и проверку типов MCE.CheckTypes
Код: "OBERON"
  1.  
  2. PROCEDURE CheckTypes(op: INTEGER; VAR x, y: MCB.Item);
  3. VAR
  4. z : MCB.Item;
  5. v : INT64;
  6. BEGIN
  7.  
  8. IF (x.clas = MCB.cConst) AND (y.clas = MCB.cConst) THEN BEGIN
  9. ...
  10.  

Вот теперь надо определиться, строго относится к типам или сделать синтаксический сахар в виде автоматического приведения типа?
Я думаю, что в приципе автомат удобен и не помешает, хотя и усложнит немного код!

В принципе это самая ёмкая функция в данном модуле, поэтому стоит её вынести в отдельный модуль, например MCO.pas (Micro Oberon Optimizer)... Да потом ещё и симплификатор добавим...
Ну вот, в следующий раз займёмся константами, константными массивами со всеми вытекающими!

Грубо говоря получился не плохой калькулятор :)

Изображение


Вложения:
part3.zip [884.28 КБ]
Скачиваний: 294
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 01 дек 2018, 13:10 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Давайте немного посмотрим строение наших деревьев при различных вводимых данных.
Как мы знаем из курсов математики
1) От перестановки мест слагаемых сумма не меняется
2) От перестановки мест множителей произведение не меняется

Изображение Изображение Изображение

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

Но, перед этим, что бы удобнее было работать, сделаем идентификаторы, просто симулируем так, что бы компилятор принимал идентификаторы. Для этого временно переместим поле name из MCB.Object_ в MCB.Item и в процедуру MCE.Factor добавим:
Код: "OBERON"
  1.  
  2. IF sym = MCS.lx_ident THEN BEGIN
  3. MCB.MakeConstItem(x,MCB.noType,0);
  4. x.name := MCS.id;
  5. x.clas := MCB.cLit;
  6. MCS.Get(sym);
  7. END ELSE IF sym = MCS.lx_int ...
  8.  

Как бы идентификаторы все будут у нас константами без типа. Пока мы эксперементируем нам хватит.

Я всё таки разнёс проверку типов и упрощение выражений в разные модули для удобства.

Напишем новую процедуру MCO.Simplification; И в ней вложеные процедуры Multiplier и Summand
Код: "OBERON"
  1.  
  2. PROCEDURE Simplification(VAR x: MCB.Item);
  3. PROCEDURE Multiplier(VAR x: MCB.Item);
  4. PROCEDURE Summand(VAR x: MCB.Item);
  5. ...
  6.  

Они как раз и будет заниматься вышеописаным.

Давайте посмотрим дерево для выражения 1+2+3*a/b*4+5+c+6 (мы уже можем позволить псевдо-переменные ;) )

Изображение

Мы видим, что на конечных веточках, иногда остаются непросчитываемые выражения 3*a , остаются свободные константы 5 и 6 ...
Теперь если подключить нашу функцию, то дерево будет выглядеть так

Изображение

Результат как говорится на лицо.
Теперь есть возможность просчитать суммы и произведения и привести дерево к виду

Изображение

Наше дерево свернулось до вида 14 + 12*a/b + с
В итоге мы получили довольно не плохой оптимизатор.
Уж на сколько реализация в нём эффективная - не мне судить, делал из собственных соображений, может быть есть алгоритмы более эффективные, если кто о них знает просьба написать!


Вложения:
part4.zip [877.08 КБ]
Скачиваний: 304
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 01 дек 2018, 19:27 
Не в сети

Сообщения: 350
Цитата:
1) От перестановки мест слагаемых сумма не меняется
2) От перестановки мест множителей произведение не меняется

Это так только в математике, но не в компьютере. Для плавающих это вообще совсем не так. Для целых от порядка действий зависит, возникнет ли переполнение.
Кроме того, учитывая то, что Оберон, наверное, приводит типы при сложении 2 + 2.0, возникает ещё один класс зависимостей от порядка операндов.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 01 дек 2018, 23:53 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
S.Atan писал(а):
Для плавающих это вообще совсем не так


Справедливо только для разных разрядностей, пока что REAL и INTEGER одной разрядности, и переполнение проверяется 64 битной переменной, 64 битные типы LONGREAL и HUGEINT будем проверять 128 битной...
А вообще да, возможно и переполнение, так что надо установить проверку и на целые и на вещественные... (как заметка)!

Ну в общем пока что их не вводил, так что волноваться рано! :) , а там посмотрим.

В Обероне 07 вообще нельзя 2+2.0 или 3.5*4
Там очень строго, можно только один тип операндов, так что 2 / 2 не прокатит абсолютно ни с каким типом, а вот 2.0 / 2.0 да, и 3.0 + 5.0 и 3 + 5 абсолютно верные по значению, но абсолютно разные по типу!


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 02 дек 2018, 00:36 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Отвлеченная тема...

Никто не задавался вопросом философским о том, почему даже последняя перуанская шлюха мечтает в душе стать принцессой?
Я вот не задавался. Конец темы :D , ...шутка.

Ну вот давайте пофилософствуем на основе наших представлений. Как вот в нашем представлении выглядят первая и вторая дамы?

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

Результат:

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

Всё сказанное можно перенести и на языки программирования.
Каким членом (компилятором) вы сделаете даму (программу) тем она в итоге и окажется. И в некоторых случаях - хорошо если пронесет. :D :D :D

Тему можно считать инструкцией по использованию неополитанских членов при посадки гречихи на приусадебном участке.
(перевод - использование компиляторов при разработке программного обеспечения)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 02 дек 2018, 11:54 
Не в сети

Сообщения: 350
S.Atan писал(а):
S.Atan писал(а):
Для плавающих это вообще совсем не так

Цитата:
Справедливо только для разных разрядностей, пока что REAL и INTEGER

Для двух чисел сумма, может быть, и не поменяется, но для трёх уже может поменяться. Например: 1e100-1e100+1e-100 или 1e100+1e-100-1e100 запросто могут дать разный результат. И, соответственно, 32767+100-32767 или 32767-32767+100 может дать или не дать переполнение.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 02 дек 2018, 12:16 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
S.Atan писал(а):
32767+100-32767 или 32767-32767+100 может дать или не дать переполнение


Точно, поэтому перевожу всё в большую разрядность и проверять результат придётся в конце...
Но это только для констант, так как результат должен быть известен.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club