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

Твердыня модульных языков
Текущее время: 19 июн 2025, 10:22

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 15 апр 2013, 16:50 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Saferoll писал(а):
Вот c CASE хуже. Для чего нужен Platform.Unsigned? Чтобы написать Platform.Unsigned(255) и в тексте программы было видно 255, а на самом деле стояло "-1"? Так может вместо функции завести набор констант: Platform.Unsigned_255=-1; Platform.Unsigned_254=-2;... Platform.Unsigned_128=-128? Писать константу, где в имени видно нужное беззнаковое число, а фактически будет знаковое.
Обнаружил, что константы Platform.Unsigned_ХХХ нельзя смешивать в одном константном диапазоне с "обычными" числами 0..127. Так, например,
попытка поставить 100..Platform.Unsigned_200: в одной из ветвей CASE вызовет сообщение "illegal value of constant", потому что фактически у нас написано "100..-56", т.е. правая граница меньше левой.
Однако можно в данном случае разбить диапазон на два и написать "100..127, Platform.Unsigned_128..Platform.Unsigned_200:" , такое Оfront пропустит.

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Кроме того, что такой CASE выглядит коряво, ещё плохо то, что, видимо, в Ofront'е немало таких мест, где надо поправить код в сторону учёта беззнаковости. Значит "малой кровью" обойтись не получится...


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Вот, Олег, хочу показать тебе коммит, реализующий это "подобие работы с беззнаковыми". ;) Тогда я отложил "на потом" многие вопросы, которые нужно было поставить сразу. Например, разрешить ли смешивать знаковые и беззнаковые типы в выражениях (как это разрешено в Си), или напротив — запретить (как в Модуле-2)? Первый вариант порождает бардак и чехарду, второй — значительно ограничивает область применения беззнаковых. В Си меня угнетает, например, вот такое:
Код: "C"
a = -1; // По контексту не видно, что a — беззнаковая
// Спасибо товарищу Сталину... тьху, то есть авторам компайлеров, что хотя бы предупреждают о таких присваиваниях... или нет?
if(a == -1) ... // А вот это не сработает никогда. Потому что -1 уже стало 255.

Признаюсь, я склонен разрешить в XDev произвольное смешивание знаковых и беззнаковых вот по каким причинам. Во-первых, это увеличит применимость беззнаковых (там, где это нужно, конечно), во-вторых беззнаковые у нас — это системные типы, а в-третьих появляется интересная возможность скрыто пользоваться беззнаковыми типами только на некоторых платформах, не нарушая изначальную идеологию Оберона. Т.е.:
Код: "OBERON"
  1. MODULE Types; (* Ver. for ZX Spectrum *)
  2. IMPORT SYSTEM;
  3. TYPE
  4. Coords*: SYSTEM.SHORTCARD;
  5. ArrayIndex*: SYSTEM.CARDINAL;
  6. END Types.
Код: "OBERON"
  1. MODULE Types; (* Ver. for Windows *)
  2. TYPE
  3. Coords*: INTEGER;
  4. ArrayIndex*: INTEGER;
  5. END Types.

Код: "OBERON"
  1. MODULE Graph; IMPORT Types;
  2. PROCEDURE PutPixel* (x, y: Types.Coords); ...
Тогда мы будем иметь на каждой платформе свою идеально оптимальную реализацию, не засвечивая явно, что типы могут быть и беззнаковыми. И я уже разрабатывал таким образом программы, получаеся очень эффективно. Но нет ли здесь подводных камней?

Меня вот несколько смущает неявный импорт SYSTEM (который тянут за собой беззнаковые типы), но с тем же успехом в Обероне/КП можно неявно импортировать SYSTEM, используя и, например, безтеговые указатели, ведь по ним сверху и не скажешь, что они безтеговые. Так что, в принципе, наверно это приемлемо. Но какие будут ещё мысли?


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

Сообщения: 273
Откуда: Россия
Zorko писал(а):
Вот, Олег, хочу показать тебе коммит, реализующий это "подобие работы с беззнаковыми". ;)
Боюсь, Олег, что я еще мало разбираюсь во внутренностях Ofront (и,увы, в компиляторах вообще). Новое, как я понял, в строчке
Код: "OBERON"
  1. IF typ = typ^.BaseTyp THEN OPM.WriteString(prev^.strobj^.name); EXIT END;
Что именно она делает?

Цитата:
Например, разрешить ли смешивать знаковые и беззнаковые типы в выражениях (как это разрешено в Си), или напротив — запретить (как в Модуле-2)? Первый вариант порождает бардак и чехарду, второй — значительно ограничивает область применения беззнаковых.
Конечно, без всяких операций со знаковыми и беззнаковыми мы не обойдемся, но и бездумно смешивать их не хотелось бы. По крайней мере, такому смешению нужно придать какую-то ясную и полезную семантику. Хорошо бы выделить общие случаи, когда такое смешение необходимо и что должно при этом получаться. Например, пусть IF x < y сравнивает величины разной "знаковости". Если мы при этом преобразуем один тип к другому - получим одно (вернее два результата - когда x преобразуется к типу y и когда наоборот), если мы обе величины преобразуем к некому "большему" общему для них типу, то это уже другое. Хотелось бы, чтобы было ясно какой из этих случаев имеет место и как-то управлять выбором этих случаев.

Цитата:
Признаюсь, я склонен разрешить в XDev произвольное смешивание знаковых и беззнаковых вот по каким причинам. Во-первых, это увеличит применимость беззнаковых (там, где это нужно, конечно), во-вторых беззнаковые у нас — это системные типы, а в-третьих появляется интересная возможность скрыто пользоваться беззнаковыми типами только на некоторых платформах, не нарушая изначальную идеологию Оберона....Но нет ли здесь подводных камней?
Да, такая инкапсуляция типов выглядит "в духе Оберона": важно, что это координаты, в какой конкретно тип они транслируются с целью эффективности на данном уровне абстракции не важно. А подводные камни могут быть в том, что употребляя эти типы, программист будет подразумевать какую-то неявную семантику (ошибочно), уповать на неизменность каких-то свойств, что на другой платформе совершенно изменятся. В результате и получится неконтролируемое смешивание типов с неясным результатом. Поэтому важно оговорить, что общее для всех платформ (чем желательно, в основном, и пользоваться), а что специфично для каждой. И как это специфическое настраивать. Т.е. желательно иметь не крайние подходы ("совсем не смешивать", "как угодно смешивать"), а настройка разных уровней:подключим вот это - можно будет делать это, остальное компилятор не даст; подключим еще и это - можно будет и вот так еще и т.д. Т.е. примерно как модуль SYSTEM: обходимся без него - хорошо, значит не делаем ничего платформозависимого. А нужно что-то особое - подключи SYSTEM и можно будет еще вот это и вон то.

Цитата:
Меня вот несколько смущает неявный импорт SYSTEM (который тянут за собой беззнаковые типы), но с тем же успехом в Обероне/КП можно неявно импортировать SYSTEM, используя и, например, безтеговые указатели, ведь по ним сверху и не скажешь, что они безтеговые. Так что, в принципе, наверно это приемлемо.
Да, тоже думаю приемлемо, потому что у нас специфические, "системные" задачи, без SYSTEM нам никак не обойтись.

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 13 май 2013, 18:08 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Сегодня столкнулся с трапом Ofront'а. Хотел уже писать репорт Дж.Темплу, но выяснилось, что косячат мои "прилепленные скотчем" беззнаковые типы. :) Прикладываю фрагмент, воспроизводящий ошибку (трап исчезает, если изменить типы SYSTEM.SHORTCARD на SHORTINT).
Код: "OBERON"
  1. MODULE AI;
  2.  
  3. IMPORT SYSTEM;
  4.  
  5. TYPE
  6. Rank = SYSTEM.SHORTCARD;
  7. Suit = SYSTEM.SHORTCARD;
  8. Card = RECORD
  9. suit: Suit;
  10. rank: Rank;
  11. END;
  12.  
  13. END AI.


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

Сообщения: 273
Откуда: Россия
Zorko писал(а):
Сегодня столкнулся с трапом Ofront'а. Хотел уже писать репорт Дж.Темплу, но выяснилось, что косячат мои "прилепленные скотчем" беззнаковые типы. :) Прикладываю фрагмент, воспроизводящий ошибку (трап исчезает, если изменить типы SYSTEM.SHORTCARD на SHORTINT).

Ошибка возникает из-за превышения глубины рекурсивного вызова процедуры OPC.Stars. Похоже зациклилась обработка типов. Может быть это из-за последнего коммита "IF typ = typ^.BaseTyp THEN OPM.WriteString(prev^.strobj^.name); EXIT END;" ?


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

Сообщения: 273
Откуда: Россия
Оптимальные условия для реализации цикла FOR через REPEAT UNTIL, которым я посвятил аж7 постов, мне несколько надоели, поэтому на этой неделе я прошелся по форуму и написал сообщения в другие темы :) Размышления о беззнаковом делении привели в эту ветку.
Как обстоит сейчас дело с беззнаковыми типами в Ofront? Не слишком хорошо, не так ли? Это, наверно, потому, что мы движемся не в том направлении. Подмена идентификаторов типов и псевдофункция Platform.Unsigned - это путь в тупик. Тем более, что тут уже начали вылезать непонятные ошибки (см предыдущий пост). Единственная польза этого пути в том, что он показал как трудно ввести беззнаковые числа.
Так что предлагаю начать заново.
1) Надо убрать из Ofront изменения, которые должны были обеспечить работу с беззнаковыми числами. Нужно вернуться к чистознаковым типам Дж.Темпла и убедиться, что все стабильно работает.
2) Ввести в структуру данных для хранения типов в Ofront специальный флажок Unsigned:BOOLEAN. Поскольку никакие процедуры Ofront о нем пока не знают, то он ничему пока и не помешает.
3) Заставить Ofront устанавливать этот флажок для идентификаторов типа SYSTEM.SHORTCARD и им подобным и сбрасывать его для обычных знаковых типов. Пусть в остальном пока работа с типами Unsigned и ~Unsigned никак не отличается, но теперь Ofront хотя бы знает, какие из них какие. Вот тут в Си-проге или сам Ofront, ориентируясь на флажок, или макроопределения в библиотеках могут вставлять для таких идентификаторов «unsigned». Т.е. мы достигнем того же функционала, что и сейчас, но получим меньше неприятных сюрпризов (я надеюсь).
4) Для типов unsigned изменить функции MIN и MAX, чтобы они давали верное значение. О, вот тут полезут всевозможные глюки и несоответствия, которые сейчас трудно себе и представить. Что же, для того и вводим новое, чтобы все эти проблемы выявить и устранить.
5) Ввести беззнаковые константы, Навроде, 255u – беззнаковый байт (в отличие от знакового 2-байтного 255). Ну или продумать правила, по которым та или иная константа будет относиться к знаковым или беззнаковым.
6) Изменить для беззнаковых функции с одним аргументом. Тоже думаю какие-то проблемы будут и тут.
7) Ввести операции (присваивания, сравнения) над беззнаковыми (в том числе, если они разной длины), пока без смешения знаковых и беззнаковых. Продумать и отладить эти операции прежде чем переходить к следующему пункту.
8) Операции (присваивания, сравнения)над знаковыми и беззнаковыми вперемешку. Что должно при этом получаться, каким путем. Следует ли приводить первое ко второму или наоборот или к большему типу, содержащему их оба. И какому большему — знаковому или беззнаковому и как этот выбор можно регулировать. Пока нет даже хорошей стройной теории этого, не то что реализации.
Вот такой план. Это трудно, но это путь в верном направлении, как я думаю. Правда особо в систему типов в Ofront я не вникал.

2Zorko: Олег, что думаешь по этому поводу?


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Saferoll писал(а):
Как обстоит сейчас дело с беззнаковыми типами в Ofront? Не слишком хорошо, не так ли?
Именно так, Олег. :)
Saferoll писал(а):
Это, наверно, потому, что мы движемся не в том направлении. Подмена идентификаторов типов и псевдофункция Platform.Unsigned - это путь в тупик. Тем более, что тут уже начали вылезать непонятные ошибки (см предыдущий пост). Единственная польза этого пути в том, что он показал как трудно ввести беззнаковые числа.
Всё правильно. Кстати, ошибки лезут как раз из-за этой подмены. Получается, что беззнаковые типы сейчас являются алиасами знаковых, но код проработан не везде, и часть кода не знает, что могут быть такие алиасы. Поэтому правильным представляется убрать алиасы и ввести честные новые типы полностью, что подразумевает серьёзный объём работы.

Вообще не удивительно, что проф. Вирт отказался в Обероне от беззнаковых типов. И наверное не только потому, что операции с ними — область системная. А ещё и из-за усложнения компилятора. Весь каркас OP2, на котором построены ETH Oberon, BlackBox и Ofront спроектирован без учёта беззнаковой арифметики, и в системных целях предлагается эмулировать её системными средствами, а в крайнем случае ассемблерными или сишными вставками. А впрямь, много ли мы теряем, лишившись беззнаковости? Потери есть, но они не такие уж значительные. Выигрыш за счёт упрощения системы типов имхо всё же серьёзнее — меньше путаницы.

Точно также и приведение FOR x:=A TO B в стандарте к x:=A;WHILE x<=B это тоже компромисс для упрощения и описания реализации цикла, и самого компилятора. Но это никак не оправдание на самом деле.

Признаюсь честно, что введение беззнаковых в Ofront видится мне очень сложной работой. И я бы предложил чуть-чуть другой способ. Олег, не спеши его сразу отметать, плиз, давай помозгуем что из этого можно использовать, а что нет. Поскольку серьёзное усложнение Ofront'а является идеологически не совсем верным шагом, подумаем как добиться цели малой кровью. Здесь видится привлекательным: 1) библиотечный путь (как в XDev/Multi/CardAsm); 2) путь наращивания каркаса Ofront'а системой расширения типов, которая будет полезной не только для введения беззнаковой арифметики, но и ещё много для чего (я имею ввиду что-то вроде OberonX). Итак, если сделать интерфейс для беззнаковой арифметики на Обероне и реализацию на Си, получим вполне эффективное решение. Низкоуровневым представлением для беззнакового байта будет, например, тип CHAR (поскольку он подходит по размеру, плюс появится дополнительный барьер для смешивания знаковой и беззнаковой арифметики в обход средств модуля реализации). Выглядеть это может примерно так:
Код: "OBERON"
  1. MODULE UTest; IMPORT Unsigned;
  2.  
  3. VAR a, b: Unsigned.Int8; c: Unsigned.Int16;
  4. BEGIN
  5. Unsigned.Assign(a, 255); Unsigned.Assign(b, 240);
  6. c := Unsigned.Add8(a, b); (* Однобайтное сложение *)
  7. c := Unsigned.Add16(a, b); (* Двухбайтное сложение *)
  8. (* А можно и так, но менее эффективно с точки зрения кодогенерации: *)
  9. c.Add8(a, b); c.Add16(a, b);
  10. END UTest.
У этого решения крайне много недостатков. Такие беззнаковые числа не удастся использовать в качестве меток CASE, такие переменные не удастся использовать для цикла FOR. Но всё же способ привлекает своей простотой, масштабируемостью и невмешательством в код транслятора. Под масштабируемостью я здесь понимаю лёгкость возможности реализации подобного же модуля для других Оберон-трансляторов, и даже для тех платформ, где беззнаковая арифметика не столь актуальна. Из чего следует совместимость с кодом, который разработан, например, с учётом эффективности для процессора Z80, но будет работать, к примеру, и на JVM.

Буду рад услышать как этот способ можно усовершенствовать.

Saferoll писал(а):
Так что предлагаю начать заново.
1) Надо убрать из Ofront изменения, которые должны были обеспечить работу с беззнаковыми числами. Нужно вернуться к чисто знаковым типам Дж.Темпла и убедиться, что все стабильно работает.
Не возражаю. Но хочу заметить, что Ofront, даже с этими изменениями работает замечательно стабильно если не использовать добавленные беззнаковые типы. Это подтверждается и тестированием, и исходит из самого кода. Там очень просто всё проверить. Но я не возражаю убрать эти изменения. Просто я ими пользуюсь для разработки под ZX, хотя это и явная полумера. А в проекте Ofront for Linux эту возможность убирать не нужно, т.к. её там и так нет.

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

Почему? Да просто ввиду малого количества заинтересованных в появлении беззнаковой арифметики для Ofront'а программистов.

Другое дело правильный цикл FOR. Вот это реально насущная потребность.

Saferoll писал(а):
5) Ввести беззнаковые константы, Навроде, 255u – беззнаковый байт (в отличие от знакового 2-байтного 255). Ну или продумать правила, по которым та или иная константа будет относиться к знаковым или беззнаковым.
Не, имхо так вмешиваться в язык Оберон не нужно. Это же не просто системная возможность, импортированная из модуля SYSTEM. Это фактически посягательство на "улучшение" стандарта языка.

Кроме того, вроде как и необязательно указывать какая константа беззнаковая, если это следует из её описания. Типизированные константы AO — я до сих пор не понимаю в них нужды, разве что для чего-то вроде:
Код: "OBERON"
  1. CONST a: INTEGER = 1000; BEGIN SYSTEM.PUT(addr, a);

Saferoll писал(а):
8) Операции (присваивания, сравнения)над знаковыми и беззнаковыми вперемешку. Что должно при этом получаться, каким путем. Следует ли приводить первое ко второму или наоборот или к большему типу, содержащему их оба. И какому большему — знаковому или беззнаковому и как этот выбор можно регулировать. Пока нет даже хорошей стройной теории этого, не то что реализации.
Да уж, есть над чем почесать тыковку! :)

Saferoll писал(а):
Вот такой план. Это трудно, но это путь в верном направлении, как я думаю. Правда особо в систему типов в Ofront я не вникал.

2Zorko: Олег, что думаешь по этому поводу?
План хороший. Только давай для начала попробуем выжать всё возможное из библиотечного решения?

Второй вариант — в стиле OberonX — можно было бы попробовать запрограммировать и отладить в OPCL (или в ETH Oberon), хотя проблемы с CASE и FOR будут висеть и там. Не, доделка Ofront'а — однозначно самый правильный и самый сложный способ, но вот кто бы сделал это за нас. :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 сен 2013, 19:28 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Кстати, Олег, если есть желание совершенствовать Ofront, то, возможно, более перспективными направлениями будет добавление конкатенации вида:

Код: "OBERON"
  1. VAR a, b: ARRAY OF CHAR; c: ARRAY 100 OF CHAR;
  2. BEGIN c := a + b;
Или параметров процедур IN и OUT, это явная языковая прореха языков Оберон-1 и Оберон-2.

Есть конечно ещё один взгляд на параметры IN/OUT, что нужно сделать передачу массивов и сложных структур всяко без неявного копирования (а копирование при необходимости применять явно), но "это уже будет другой язык", хотя и тут есть над чем подумать.

Эти возможности уже присутствуют в Компонентном Паскале. Такие доработки Ofront'а имхо будут более востребованы в "большом" программировании, т.е. помимо Спектрума.

Сейчас есть 2 течения: к Оберону-07 и ещё большему упрощению; или к КП и балансу между простым и сложным. Мне конечно ближе по духу второй путь, ибо Оберон-07 имеет слишком мало средств для удобной разработки. И не имеет удачных решений, воплощённых в языке КП, которые мне очень нравятся.


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

Сообщения: 273
Откуда: Россия
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: Олег, что думаешь по этому поводу?
План хороший. Только давай для начала попробуем выжать всё возможное из библиотечного решения?
Как уже писал выше, согласен, давай обкатаем на библиотеке. Вот только, боюсь, мало найдется людей для обкатки. :(


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

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


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

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


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

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