Zorko писал(а):
Вообще не удивительно, что проф. Вирт отказался в Обероне от беззнаковых типов. И наверное не только потому, что операции с ними — область системная. А ещё и из-за усложнения компилятора. Весь каркас OP2, на котором построены ETH Oberon, BlackBox и Ofront спроектирован без учёта беззнаковой арифметики, и в системных целях предлагается эмулировать её системными средствами, а в крайнем случае ассемблерными или сишными вставками. А впрямь, много ли мы теряем, лишившись беззнаковости? Потери есть, но они не такие уж значительные. Выигрыш за счёт упрощения системы типов имхо всё же серьёзнее — меньше путаницы.
Основная проблема,имхо, в том и заключается, что даже
теоретически нет хорошей системы, работающей и со знаковыми и с беззнаковыми числами. Мы не только не знаем
как реализовать, мы не знаем даже
что надо реализовать.
Цитата:
Точно также и приведение FOR x:=A TO B в стандарте к x:=A;WHILE x<=B это тоже компромисс для упрощения и описания реализации цикла, и самого компилятора. Но это никак не оправдание на самом деле.
Да уж, код который я уже написал для реализации FOR раз в 10 превышает первоначальную реализацию через WHILE. И это еще не конец... Надеюсь, что не понадобится выносить генерацию FOR в отдельный модуль

Цитата:
Признаюсь честно, что введение беззнаковых в Ofront видится мне очень сложной работой. И я бы предложил чуть-чуть другой способ. Олег, не спеши его сразу отметать, плиз, давай помозгуем что из этого можно использовать, а что нет. Поскольку серьёзное усложнение Ofront'а является идеологически не совсем верным шагом, подумаем как добиться цели малой кровью. Здесь видится привлекательным: 1) библиотечный путь (как в XDev/Multi/CardAsm); 2) путь наращивания каркаса Ofront'а системой расширения типов, которая будет полезной не только для введения беззнаковой арифметики, но и ещё много для чего (я имею ввиду что-то вроде
OberonX).
Хорошо, пусть на первых порах будет библиотека. Может быть практика поможет создать теоретическую базу, которой пока нет. Будем использовать c := Unsigned.Add8(a, b);, вот и увидим когда это нужно и что из этого получается.
Преимущества такого подхода не только в легкости реализации, но еще и в наглядности.
c := Unsigned.Add16(a, b) - сразу видно, что это такое. А вот смысл
c := a+b скрыт "синтаксическим сахаром". На данном этапе это только запутает. Вот выясним, как, когда и для чего следует употреблять беззнаковые числа, тогда можно и "подсластить" для удобства.
Так что, пусть будет библиотека. А потом можно постепенно и новые типы ввести, и операции, когда на библиотеке обкатаем.
Цитата:
Итак, если сделать интерфейс для беззнаковой арифметики на Обероне и реализацию на Си, получим вполне эффективное решение.
А вот не помешает ли уже на этом этапе приведение типов самого С? Ведь мы транслируем в Си, где, например, все однобайтовые операнды приводятся к int. Разберется ли потом с этим компилятор Си->ассемблер? Как это регулировать на уровне Офронт? Ведь в конце концов, мы беззнаковые числа и завели для эффективной реализации в машинном коде, и нужно чтобы до этого кода дошли оптимальные операции с байтами.
Цитата:
Низкоуровневым представлением для беззнакового байта будет, например, тип CHAR (поскольку он подходит по размеру, плюс появится дополнительный барьер для смешивания знаковой и беззнаковой арифметики в обход средств модуля реализации.
Имеется в виду однобайтовый CHAR, который в ББ называется SHORTCHAR?
Ну, не знаю, стоит ли использовать CHAR только ради барьера. И нужен ли барьер? Барьер, конечно, предотвратит путаницу между этими типами, но он же помешает и увидеть общее. Так в общем диапазоне 0..127 нет разницы между знаковыми и беззнаковыми, а этот диапазон не так и мал, включает, например, координаты знакоместа. Да и как быть с 2-байтовыми беззнаковыми, для них допустим путаницу? Может быть всё-таки, для внутреннего представления беззнаковых использовать знаковый того же размера?
Цитата:
У этого решения крайне много недостатков. Такие беззнаковые числа не удастся использовать в качестве меток CASE, такие переменные не удастся использовать для цикла FOR.
Кое-что можно применить в CASE и FOR
как уже предлагалось. Хотя, конечно, это тоже не универсальный путь. Что же, практика укажет нам узкие места, которые мы и будем постепенно расширять.
Цитата:
Но всё же способ привлекает своей простотой, масштабируемостью и невмешательством в код транслятора. Под масштабируемостью я здесь понимаю лёгкость возможности реализации подобного же модуля для других Оберон-трансляторов, и даже для тех платформ, где беззнаковая арифметика не столь актуальна. Из чего следует совместимость с кодом, который разработан, например, с учётом эффективности для процессора Z80, но будет работать, к примеру, и на JVM.
С этим согласен. Но опять следует вспомнить про стандартное приведение типов в Си и Джаве, которое может помешать.
Цитата:
Другое дело правильный цикл FOR. Вот это реально насущная потребность.
Я этим занимаюсь. Но стоило немножко подальше отступить от первоначальной реализации, как выяснилось, что мое представление о механизмах Ofront было поверхностным. Он несколько иначе устроен, чем я думал.
Но нет худа без добра. Изучение тонкостей Ofront может пригодиться не только для реализации FOR. К сожалению, сейчас не могу уделять этому много времени.
Цитата:
Saferoll писал(а):
5) Ввести беззнаковые константы, Навроде, 255u – беззнаковый байт (в отличие от знакового 2-байтного 255). Ну или продумать правила, по которым та или иная константа будет относиться к знаковым или беззнаковым.
Не, имхо так вмешиваться в язык Оберон не нужно. Это же не просто системная возможность, импортированная из модуля SYSTEM. Это фактически посягательство на "улучшение" стандарта языка.
Что же, можно обойтись пока
библиотечными средствами.
Цитата:
Saferoll писал(а):
Вот такой план. Это трудно, но это путь в верном направлении, как я думаю. Правда особо в систему типов в Ofront я не вникал.
2Zorko: Олег, что думаешь по этому поводу?
План хороший. Только давай для начала попробуем выжать всё возможное из библиотечного решения?
Как уже писал выше, согласен, давай обкатаем на библиотеке. Вот только, боюсь, мало найдется людей для обкатки.
