Автор Тема: [Oberon-07/11] Беззнаковое целое.  (Прочитано 24404 раз)

DIzer

  • Гость
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #45 : Декабрь 16, 2012, 12:31:52 pm »
Да, я всегда использую толстые биндинги, при этом обычно вообще отвязанные от специфики конкретной либы (ибо я видел очень мало чужих либ, абстракции которых мне бы нравились; либо бывает, что абстракций нет вообще, только болты и гайки).
было бы удивительно увидеть обратное,  если работаете над изолированными самодостаточными проблемами, которые не имеют МАССОВОГО потребителя и конкурентов...

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #46 : Декабрь 23, 2012, 10:38:58 am »
PROCEDURE SignedToUnsigned (x: BYTE): INTEGER;
VAR ch: CHAR;
BEGIN
ch := CHR(x);
RETURN ORD(BITS(ORD(ch)) * {0,1,2,3,4,5,6,7});
END SignedToUnsigned;
Ну зачем такие извращения, господа знатоки Оберонов. Пишите так:
PROCEDURE SignedToUnsigned (x: BYTE): INTEGER;
BEGIN
RETURN x MOD 100H;
END SignedToUnsigned;

И тогда всё хорошо.

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #47 : Декабрь 23, 2012, 12:58:45 pm »
Это конечно здорово, но в Обероне нет типа LONGINT, единственный кандидат на эту роль - LONGREAL.
Ну здрасьте, как это нет. Вы какую реализацию Оберона имеете ввиду? Например, смотрите это описание языка Оберон-2.
Цитировать
Удобный и простой набор базовых типов (символы и строки, короткие и длинные целые и вещественные, логический тип, множества, процедурный тип)

    Простые и удобные правила совместимости числовых типов (SHORTINT<=INTEGER<=LONGINT<=REAL<=LONGREAL)

Как работать с памятью выше 2-х гигабайт, не имея беззнаковых целых? В А2 не смогли, поэтому решили таки эти беззнаковые там реализовать. Как обработать файл, размером больше 2-х гб, не вводя 64-х битное знаковое целое там, где оно совершенно не нужно?

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

Мы, воспитанные на ТурбоПаскале и Си привыкли к зоопарку знаковых и беззнаковых типов, поэтому в первом приближении Оберон кажется ущербным. Однако задумаемся вот о чём. Засилье беззнаковых типов разного размера, приравненных в возможностях к знаковым, естественно ведёт к их широкому использованию не только в системных задачах. Беззнаковыми делаются координаты, индексы и прочее. Это перетекает в API многих ОС и прикладных и системных библиотек. Появляется необходимость в приведении типов — знаковых к беззнаковым и наоборот (как правило без возбуждения исключения при неудаче), таким образом, зоопарк типов ведёт к концептуальной путанице прикладного кода и необходимости приводить типы в прикладных задачах, расставляя самому же себе мины на будущее и настоящее. Что ложится дополнительным бременем на бедные мозги программистов.

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

Оберон предлагает путь добровольного аскетизма, получения в уединении и молитве мистических способностей. Естественно этот путь не предлагается всем. Но что Оберон может предложить сейчас?

Если уж есть желание иметь массив размером > 2 Gb, но непременно меньше 4 Gb, и адресовать его обязательно 32-битной переменной, то индексы можно задавать так:

VAR i: INTEGER; (* Этот INTEGER 32 бит. *)
...
arr[LONG(i) MOD 100000000H]

Никто не будет спорить с тем, что хороший компилятор может оптимизировать это выражение, даже не переходя в область 64 бит.

В системных задачах часто есть потребность адресовать что-либо. И хотя при такой адресации при очередном INC(addr) вполне может быть достигнут переход от MAX(INTEGER) к MIN(INTEGER) на практике это обычно всё равно работает, ибо отслеживание таких исключений как правило выключено. Вроде хорошо, пользоваться можно, но хочется идеологической правильности. Как же быть?

Прикладной уровень не требует зоопарка целых типов, особенно коротких. Вы не задумывались над тем как проблема с типами лихо решена в .NET и JVM? Эти платформы просто зафиксировали размер типов. А у Оберонов, видите ли, размер INTEGER плавает от реализации к реализации ещё с времён Lilith, с 16 и до 32 бит. Стандартом размер INTEGER не оговорен. Но недостаток ли это? Да, ещё остаются реализации Оберона с 16-битным INTEGER даже на архитектуре x86, но, по идее, этот тип должен быть базовой разрядностью платформы и предлагаться для максимального употребления в прикладной части, чтобы не было засилья LONGINT как в исходниках AOS. И необходимости привлекать для 64 бит новый тип HUGEINT. Использование 16-битного INTEGER на современных платформах не несёт никакого преимущества ни в размере кода, ни в его быстродействии, а тем паче в точности вычислений.

А вы рылись в сишном коде, в котором на каждом шагу знаковые и беззнаковые перемешаны и кастятся друг в друга (иногда неявно)? Про надёжность и высокую понимаемость такого кода говорить не приходится, поэтому чтобы оградить Оберон от такого и были хирургически убраны беззнаковые типы. Но потребность в них для системного программирования всё равно есть. И поэтому я вижу решение в том, чтобы просто ограничить их использование. Я за внесение беззнаковых типов в псевдомодуль SYSTEM. Так мы получим эффективную адресацию в системных задачах без риска поймать исключение при от MAX(INTEGER) к MIN(INTEGER). И так мы запретим огульное использование системы беззнаковых типов где попало и как попало. Такое расширение я реализовал в доработанном мною трансляторе Оберона-2 в Си Ofront. Но то, что находится внутри SYSTEM – это нестандартная языковая надстройка, решение как её реализовать ложится на разработчиков компилятора. Что к стандартам Оберон-языков отношения не имеет.
« Последнее редактирование: Декабрь 23, 2012, 01:02:32 pm от Oleg N. Cher »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #48 : Декабрь 23, 2012, 01:03:37 pm »
Это конечно здорово, но в Обероне нет типа LONGINT, единственный кандидат на эту роль - LONGREAL.
Ну здрасьте, как это нет.

Привет.
Вы какую реализацию Оберона имеете ввиду? Например, смотрите это описание языка Оберон-2.
Я не имею ввиду какую-либо конкретную реализацию Оберона. Я имею ввиду ровно то, что написано в топике. Прочитай внимательно название топика, и скажи, при чем тут Оберон-2?
Y = λf.(λx.f (x x)) (λx.f (x x))

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #49 : Декабрь 23, 2012, 01:44:26 pm »
Я не имею ввиду какую-либо конкретную реализацию Оберона. Я имею ввиду ровно то, что написано в топике. Прочитай внимательно название топика, и скажи, при чем тут Оберон-2?
Ах ё. Здесь в ветке активно подвергается гонениям именно Оберон-07 и его все недостачи, но циферка 07 практически не упоминается нигде, кроме топика. Что же могут подумать люди далёкие от Оберонов, читая такие комментарии? И вот уж не думал, что О-07 так активно используется как альтернатива Оберону-2 и КП в программировании для больших компьютеров.

Но неужели в Обероне-07 нет типа LONGINT? Я слышал, в последней редакции документа мэтр таки вытащил из SYSTEM на свет божий даже тип BYTE.

Хорошо, я поправлюсь. Критикуйте себе на здоровье Оберон-07 по полной, ибо он того заслуживает.

P.S. Мы кажется на "ты" не переходили?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #50 : Декабрь 23, 2012, 01:57:25 pm »
Я не имею ввиду какую-либо конкретную реализацию Оберона. Я имею ввиду ровно то, что написано в топике. Прочитай внимательно название топика, и скажи, при чем тут Оберон-2?
Ах ё. Здесь в ветке активно подвергается гонениям именно Оберон-07 и его все недостачи, но циферка 07 практически не упоминается нигде, кроме топика. Что же могут подумать люди далёкие от Оберонов, читая такие комментарии?
Эмм.. Не знаю что они могут подумать, но было бы странно в каждом коментарии уточнять что речь идет о последней версии Виртовского Оберона (за 2012 год Вирт его так и не зарелизил, только черновик info21 выслал помнится). Версия оберона специально была вынесена аж в заголовок обсуждения. Чтобы как раз таких вот недоразумений не было.

И вот уж не думал, что О-07 так активно используется как альтернатива Оберону-2 и КП в программировании для больших компьютеров.
Оберон никогда не позиционировался Виртом как решение исключительно для микроконтроллеров. В том числе и новейшие его версии. Оберон-2->КП это ответвление от Виртовских оберонов все же (родоначальник ответвления, сколь я помню - Object Oberon). И вирт активного участия в этой побочной ветке не принимает.


Но неужели в Обероне-07 нет типа LONGINT? Я слышал, в последней редакции документа мэтр таки вытащил из SYSTEM на свет божий даже тип BYTE.
Нету. Более того - типа BYTE там тоже нету. Даже в SYSTEM'e. В драфте от 2012 года BYTE упоминается, но этот драфт весьма сырой. См. обсуждение.

P.S. Мы кажется на "ты" не переходили?
Эмм.. Извиняюсь, если как-то этим задел, но у нас принято на "ты", по крайней мере это не считается оскорблением/панибратством. Вроде как это распространенная практика.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #51 : Декабрь 23, 2012, 02:03:33 pm »
VAR i: INTEGER; (* Этот INTEGER 32 бит. *)
...
arr[LONG(i) MOD 100000000H]
А константа 100000000H в вашем примере разве не вызовет переполнение?
Если не вызовет, то какой она имеет тип?
(Как я понял, код вы привели на Обероне-2)

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #52 : Декабрь 23, 2012, 02:18:49 pm »
А константа 100000000H в вашем примере разве не вызовет переполнение?
Если не вызовет, то какой она имеет тип?
(Как я понял, код вы привели на Обероне-2)
Тип LONGINT. Это "правильный" Оберон — Компонентный Паскаль. Такой код будет работать в BlackBox и GPCP.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #53 : Декабрь 23, 2012, 02:28:19 pm »
А константа 100000000H в вашем примере разве не вызовет переполнение?
Если не вызовет, то какой она имеет тип?
(Как я понял, код вы привели на Обероне-2)
Тип LONGINT. Это "правильный" Оберон — Компонентный Паскаль. Такой код будет работать в BlackBox и GPCP.
Тогда нет вопросов. Но есть одна маленькая поправочка. Следовало использовать суффикс "L":
Цитировать
The suffix 'H' is used to specify 32-bit constants in the range -2147483648 .. 2147483647. At most 8
significant hex digits are allowed. The suffix 'L' is used to specify 64-bit constants.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #54 : Декабрь 23, 2012, 02:46:02 pm »
А константа 100000000H в вашем примере разве не вызовет переполнение?
Если не вызовет, то какой она имеет тип?
(Как я понял, код вы привели на Обероне-2)
Тип LONGINT. Это "правильный" Оберон — Компонентный Паскаль.
Главное это не говорить Вирту :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #55 : Декабрь 23, 2012, 02:48:28 pm »
Да, верно.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #56 : Декабрь 23, 2012, 03:00:25 pm »
Да, верно.
Вы про суффикс "L" или про то, что лучше Вирту не говорить?

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #57 : Декабрь 23, 2012, 03:12:05 pm »
Я настолько редко использую LONGINT числа, что забыл о суффиксе L напрочь. Погодите, а ведь в AO такой суффикс кажется не применяется?

Ну а про Вирта. Не забывайте, что профессор уже немолод.

Мне было бы интересно услышать какими достоинствами на практике обладает Оберон-07 перед Обероном-2/КП, даже для микроконтроллеров, даже если не брать во внимание такой разброс и шатания в ревизиях.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #58 : Декабрь 23, 2012, 03:14:37 pm »
Мне было бы интересно услышать какими достоинствами на практике обладает Оберон-07 перед Обероном-2/КП, даже для микроконтроллеров, даже если не брать во внимание такой разброс и шатания в ревизиях.
Тем единственным достоинством, что это официальный Оберон. Остальные "обероны" к Вирту отношения не имеют...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: [Oberon-07/11] Беззнаковое целое.
« Ответ #59 : Декабрь 23, 2012, 03:19:16 pm »
Ну, это не такое уж большое достоинство. Переживём.

Ребёнку в 4 годика покупают штаники и ждут хорошего поведения в садике. А в 10 хороших отметок в школе. Оберон тоже растёт, ему пора слазить из рук дедушки. Ничего удивительного, процесс естествен.