Oberon space

General Category => Общий раздел => Тема начата: valexey_u от Февраль 26, 2015, 12:28:08 pm

Название: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 26, 2015, 12:28:08 pm
Собственно 22 февраля вышла новая ревизия ЯП Оберон. Брать как обычно тут: http://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf

Подробные изменения пока не смотрел.

Такжа в качестве бонуса вышел тьюториал по ЯП Оберону: http://www.inf.ethz.ch/personal/wirth/Oberon/PIO.pdf (на титульной странице написано что это 2014 год, но думаю это опечатка, ибо совпадает и месяц и день).
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 26, 2015, 12:34:00 pm
Отличие первое: Вирт поменял определение типа SET, теперь это "SET the sets of integers between 0 and an implementation-dependent limit ", то есть SET может быть и 8 битным и 32 и 128 и даже 3 битным. Зависит от реализации.

Таким образом Вирт окончательно отвязал Оберон от 32битной платформы и мы теперь не знаем какая разрядность у INTEGER'a, SET и так далее.

Портабельность приложений написанных на Обероне становится довольно условной.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 26, 2015, 12:44:15 pm
Семантику CASE Вирт так и не привел в соответствие с Project Oberon.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Romiras от Февраль 26, 2015, 05:03:27 pm
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 26, 2015, 08:21:58 pm
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?

Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Romiras от Февраль 28, 2015, 08:34:48 am
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?

Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Приведи пример с проблемой.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Romiras от Февраль 28, 2015, 08:41:27 am
Вообще, в модуле SYSTEM можно определить типы фиксированной размерности.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 28, 2015, 11:57:47 am
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?

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

Любой код работающий с целочисленной арифметикой либо получающий целочисленные значения из окружающего мира.

А вот работа с константами и литералами останется скорее всего безопасной (потому, что компилятор может сделать там проверку на этапе компиляции и выдать ошибку если результат constexpr не влезает в переменную, хотя он в общем то не обязан это делать, поэтому даже тут возможно неожиданное для программиста поведение).
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Февраль 28, 2015, 12:03:49 pm
Вообще, в модуле SYSTEM можно определить типы фиксированной размерности.

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

К сожалению в Обероне даже нельзя сделать TYPE INT16 = INTEGER -- это запрещено репортом. Можно конечно выкрутиться тестами и прочим, но это уже не просто костыли, это уже целые заросли костылей. Экзоскелет для оберона.

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

PS. Я вообще перестал понимать что такое ЯП Оберон в этом репорте - с одной стороны это не тот язык который используется в Project Oberon 2013, то есть компилятором ЯП Оберон эту ОС Оберон и модули её не собрать - там другой язык. С другой стороны в ЯП Оберон Вирт в тот же SYSTEM внес абсолютно бесполезную функцию LED, которая имеет смысл только в его последней реализации ОС Оберон. В общем какая-то фигня на постном масле.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Февраль 28, 2015, 05:00:00 pm
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю  ;D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 01, 2015, 05:15:49 pm
Очередное подтверждение тому, что Вирт клепает себе DSL под свой интерес.. и насрать ему на гоношение эпигонов (в том числе и с О.Коре )   :D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Geniepro от Март 02, 2015, 05:16:04 am
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю  ;D

Никому не верь -- сам думай. А веру оставь уделом религиозных людей...
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 01:00:38 pm
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю  ;D

Никому не верь -- сам думай. А веру оставь уделом религиозных людей...
Угу, угу. Верь в свою думалку.  ;D
Думать по разному можно. Можно считать себя гением и заниматься хуйней. А можно заткнуть свою гордость в задницу и попытаться понять умного дядьку.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 02, 2015, 01:57:45 pm
Думать по разному можно. Можно считать себя гением и заниматься хуйней. А можно заткнуть свою гордость в задницу и попытаться понять умного дядьку.
:D многое возможно...особенно если дядька достаточно хорошо разрекламирован (если недостаточно - не беда - можно можно помочь ему в этом) - например... устроить из процесса "понимания" ритуал...  ;) Вон, у нас из под Ленина.. целую науку сообразили (Марксизм -Ленинизм) и в течении 70 лет повсеместно изучали... тут, конечно, так много не выжмешь  :(
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 02, 2015, 02:04:08 pm
фигли...17 страниц vs. 50 томами... но  зато какой простор для интерпретации    :D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 02:08:56 pm
Почему обязательно ритуал?
Это ученый с мировыми именем. И это подтверждено справкой.
Надо быть полным идиотом, чтобы считать себя умнее его.
Как минимум следует 1000 раз подумать прежде чем ставить его решения под сомнение.
Кто мы собсна такие, чтобы его критиковать?
Из нас тут никто пока еще не сделал даже тысячной доли из того, что сделал он.
Зато такие все специалисты в языках просто охуеть.
Маловата у вас пиписка, товарищи, чтобы Вирта критиковать.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 02, 2015, 02:13:16 pm
Не обязательно... я же сказал  - в качестве примера  :D  - более подробно на ранний OberonCore
(т.е. хотите - критикуйте, хотите - поклоняйтесь, хотите - ВДУМЧИВО ИЗУЧАЙТЕ , наконец, хотите - используйте в своих целях....)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: valexey_u от Март 02, 2015, 03:29:25 pm
Почему обязательно ритуал?
Это ученый с мировыми именем. И это подтверждено справкой.
Надо быть полным идиотом, чтобы считать себя умнее его.
Как минимум следует 1000 раз подумать прежде чем ставить его решения под сомнение.
Кто мы собсна такие, чтобы его критиковать?
Из нас тут никто пока еще не сделал даже тысячной доли из того, что сделал он.
Зато такие все специалисты в языках просто охуеть.
Маловата у вас пиписка, товарищи, чтобы Вирта критиковать.

Я свое мнение обосновал (как обоснованы и решения по дизайну языка той же Ады, где с этим все хорошо). Вирт же свои решения не обосновал.

Да, а авторитетов для меня не было нет и не будет.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 03:45:48 pm
Пардон, но я не видел обоснования. Можешь процитировать?
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: kemiisto от Март 02, 2015, 04:24:35 pm
Портабельность приложений написанных на Обероне становится довольно условной.
По-моему, ты делаешь из мухи слона. ;) Вирт разве где-то эту самую "портабельность" в том виде, в котором ты её хочешь (т.е. между различными реализациями) деклалировал? Нет. Ну, собственно, и точка на этом. Если тебе нужна переносимость между реализациями, то Oberon (в его нынешнем состоянии) тебе противопоказан. :)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 04:37:30 pm
kemiisto, ну кто так делает? Постепеееенно нужно... человеков троллировать.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 05:00:32 pm
А ведь как охуительно обвинять что-то в несоответствии твоим бредовым фантазиям.
Например, берем и называем язык непортабельным. И хуй ведь разберешь чего там аффтар под "портабельностью" набредил.
Или вот берем и говорим, что отсутствие отрицательных чисел в языке не позволяет использовать CASE по назначению. И ведь нам совершенно похуй, что инертность мышления не дает нам развидеть в CASE сишный SWITCH. Мы ведь не знаем из курса математики о функциях выбора всяких. Зато мы шарим в функцианальном программировании. Вот так вот. Элементарных вещей о функциях не знаем, но специалисты в ФП ниипаца.
Нет! Это тьюринговый лауреат дурак, а не я!
А еще мы можем заявить, что Вирт говнокодер, только потому, что он использует глобальные переменные.
Нам ведь похуй, что в системе есть глобальное состояние, которое нужно хранить.
Тьфу, блять. Стыдно должно быть.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 02, 2015, 05:48:24 pm
А ведь как охуительно обвинять что-то в несоответствии твоим бредовым фантазиям.
Например...
   сколько экспрессии... :D но справедливости ради ради - не менее (охуительно) чем сделать идола и морочить голову начинающим, впрочем, первое можно трактовать как как "заблуждение  во время поиска истины" а вот второе... довольно мерзостно (на мой взгляд) -  впрочем - дело хозяйское  ;)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 02, 2015, 05:55:51 pm
Господь с тобой, dizer, давно уже перевелись идолопоклонники обероновые. Нынче модно ящерам всяким поклоняться  ;D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: kemiisto от Март 02, 2015, 06:03:49 pm
Весело у вас тут. ;D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 02, 2015, 06:04:07 pm
Господь с тобой, dizer, давно уже перевелись идолопоклонники обероновые. Нынче модно ящерам всяким поклоняться  ;D
1.  Если ОН есть , то как от него отвяжешься....
2. По большей части земноводным... но какая разница кому? и из за чего? (я же не зря припомнил Ленинизм).... я ведь говорю про то, что эта ТЕМА вечна.... А ошибки... кто не ошибался из нас  ;) то же были и будут...
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 03, 2015, 07:14:26 pm
Семантику CASE Вирт так и не привел в соответствие с Project Oberon.

Я правильно понял, что CASE может исползоваться только для расширений типа, имеющих название вида: <base record> + <number>?
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 03, 2015, 08:09:12 pm
Там написано:
Цитировать
The type T of the case expression (case variable) may also be a record or pointer type. Then the
case labels must be extensions of T, and in the statements Si labelled by Ti, the case variable is
considered as of type Ti.

Цитировать
Тип Т CASE-выражения может быть типом-записью или типом-указателем. CASE-метки должны быть расширениями типа Т и в i-той ветке с i-той меткой (i-тый тип Ti) CASE-переменная считается имеющей тип Ti

Это объяснение примера:
TYPE R = RECORD a: INTEGER END ;
 R0 = RECORD (R) b: INTEGER END ;
 R1 = RECORD (R) b: REAL END ;
 R2 = RECORD (R) b: SET END ;
 P = POINTER TO R;
 P0 = POINTER TO R0;
 P1 = POINTER TO R1;
 P2 = POINTER TO R2;
VAR p: P; p0: P0; p1: P1; p2: P2;
CASE p OF
 P0: p0.b := 10 |
 P1: p1.b := 2.5 |
 P2: p2.b := {0, 2}
END

Он просто занумеровал ветки суффиксом i для наглядности.

Подозреваю, что он в конце концов откажется от:
Цитировать
case variable is considered as of type Ti
И будет тупо выбиралка без охраны.  ;D

Такое ощущение, что он еще в раздумьях (или ему пока лень чистить код). Т.к. в коде можно встретить и такой вариант использования:
CASE M OF
    FontMsg: fnt := M(FontMsg).fnt; w := 0; len := 0; pos := obj(Caption).pos;
      Texts.OpenReader(R, T, pos); Texts.Read(R, ch); dy := R.fnt.minY;
      WHILE ch > 0DX DO
        Fonts.GetPat(fnt, ch, dx, x1, y1, w1, h1, patadr);
        INC(w, dx); INC(len); Texts.Read(R, ch)
      END ;
      INC(obj.y, fnt.minY-dy); obj.w := w; obj.h := fnt.height;
      Texts.ChangeLooks(T, pos, pos+len, {0}, fnt, 0 , 0) |
    ColorMsg: obj.col := M(ColorMsg).col
и такой:
PROCEDURE ChangeMacro(obj: Object; VAR M: Msg);
  BEGIN
    CASE M OF ColorMsg: obj.col := M.col END
  END ChangeMacro;
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 06, 2015, 03:47:26 am
Тип Т CASE-выражения может быть типом-записью или типом-указателем. CASE-метки должны быть расширениями типа Т и в i-той ветке с i-той меткой (i-тый тип Ti) CASE-переменная считается имеющей тип Ti

Так понятнее, спасибо :) Т.е., это полное повторение семантики WITH из CP?

P0: p0.b := 10 |
 P1: p1.b := 2.5 |
 P2: p2.b := {0, 2}

Он просто занумеровал ветки суффиксом i для наглядности.

Зачем в примере переменные p0, p1, p2? Можно представить, что пропущено "p0 := p", "p1 := p", "p2 := p" в каждой ветке? Блин, всего 16 страниц описания очень простого языка и вот такая откровенная херня.

P.S. Я пообсуждал эту тему на буржуйском IRC - народ тоже в недоумении, что же Вирт имел ввиду в своем примере. Собственно, там и предположили, что забыто присваивание в каждой ветке.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Geniepro от Март 06, 2015, 05:39:33 am
> Собственно, там и предположили, что забыто присваивание в каждой ветке.

Ну так старость не радость, кто знает, какими маразматиками мы станем в его возрасте...
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 06, 2015, 06:42:43 am
Зачем в примере переменные p0, p1, p2? Можно представить, что пропущено "p0 := p", "p1 := p", "p2 := p" в каждой ветке? Блин, всего 16 страниц описания очень простого языка и вот такая откровенная херня.
p0, p1 и p2 - это и есть p
Т.е. в i-той ветке p становится pi
Лично я так понял при первом прочтении.
Имхо, этот код нужно понимать как формальное описание поведения CASE, а не как кусок программы на обероне.

Вот представь, что тебе нужно объяснить семантику CASE. Как ты это сделаешь?
Можно было бы так написать:
CASE p OF
 0) P0: p.b := 10 |
 1) P1: p.b := 2.5 |
 2) P2: p.b := {0, 2}
END
Вах вах метки тепрь со скобочкой в языке!  ;D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 06, 2015, 08:35:45 pm
p0, p1 и p2 - это и есть p
Т.е. в i-той ветке p становится pi

Т.е. все ломается, если я при редактировании поменяю ветки местами, или вставлю новую (в середину) или удалю что-то (из середины). А может и не сломается (переменные-то объявлены в VAR!), а просто будет падать или неправильно работать. Классно. Больше джаваскрипта, больше, теперь и в обероне!
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 06, 2015, 09:07:29 pm
vlad, тебе надо перерыв сделать. Перегрелся походу. Уже не только пендосский, но и родной язык понимать перестал  ;D
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 06, 2015, 09:10:21 pm
vlad, тебе надо перерыв сделать. Перегрелся походу. Уже не только пендосский, но и родной язык понимать перестал  ;D

Да, пойду проветрюсь.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 06, 2015, 09:15:00 pm
Вот сюда еще глянь: http://www.excelsior-usa.com/doc/xds/o2rep09.html#36

Для WITH тоже никто реальный код не приводил. Однако ведь понятно о чем речь.

WITH v: T1 DO S1 |v: T2 DO S2 ELSE S3 END
Это псевдокод такой, если угодно...
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 06, 2015, 11:12:50 pm
Классно. Больше джаваскрипта, больше, теперь и в обероне!

Ну и еще до кучи - как будут выглядеть переменные p0, p1, p2 для случая:
CASE object.p OF
...
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 07, 2015, 09:37:58 am
Ты серьезно?
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: vlad от Март 07, 2015, 02:51:58 pm
Ты серьезно?

Ладно, я просто подожду разъяснений от Вирта. Хотя бы в виде его же кода, использующего описанную семантику.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 07, 2015, 06:43:14 pm
Тык вот куча кода: https://github.com/ilovb/ProjectOberon2013
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Romiras от Март 08, 2015, 10:52:28 am
Вообще, в модуле SYSTEM можно определить типы фиксированной размерности.
Нельзя. Во-первых SYSTEM это опциональный модуль (в реализации его может не быть). Во-вторых просто по логике такие типы должны быть не в SYSTEM, а в другом встраиваемом модуле.

Работа с внешними системами опциональна (SYSTEM), как следует из определения языка Оберон. Если требуется интерфейс для работы с ними, то тогда необходимость в таком модуле есть.
К примеру, читай 64 Bit Oberon. Günter Dotzel and Hartmut Goebel (http://www.modulaware.com/mdlt73.htm).

Цитировать
Module SYSTEM got four integer types: SIGNED_8, SIGNED_16, SIGNED_32, and SIGNED_64, with SIGNED_64 being synonym with LONGINT.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 08, 2015, 02:34:36 pm
SYSTEM - это уже бородатый баян: http://oberspace.dyndns.org/index.php/topic,506.msg16938.html
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 15, 2015, 12:56:50 pm
Вирт часто вносит изменения в публичную версию документа Oberon07.Report.pdf (http://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf) никак не указывая это. Если почаще скачивать и сверять файлы, можно увидеть промежуточные версии. Так можно подглядывать за патриархом и процессом чудесного творения (яко не своей волею ведомый глядети, аз токма по велению Духа Святого Программистского). К сожалению, сам Вирт не хранит версии своего творчества (а ведь требуются свидетельства очевидцев для причисления к Лику Святых).
У меня шесть версии документа Oberon07.Report.pdf указанные временем его заливки на сервер (кроме первого, с временем загрузки на мой комп):
(12.07.2013 05:13:54) в документе как ревизия 22.9.2011
 28.10.2013 13:52:18  в документе как ревизия 1.10.2013
 22.02.2014 06:36:12  в документе как ревизия 1.10.2013
 11.03.2014 09:26:52  в документе как ревизия 1.10.2013 / 10.3.2014
 16.06.2014 05:01:04  в документе как ревизия 1.10.2013 / 10.3.2014
 25.02.2015 11:11:48  в документе как ревизия 1.10.2013 / 22.2.2015


Вот строки "сообщений о языке" с текстовыми отличиями в последовательных версиях, где показаны удаления, замены, добавления текста, а также текст смещенный относительно перевода строки. Прочие отличия состоят только в разбивке строк по страницам.

[12.07.2013] to 28.10.2013
Цитата: Oberon07.Report.pdf (12 июля 2013 г., 05:13:54) aka Revision 22.09.2011
3   Revision 22.9.2011
7   1. Introduction
114   ABS  ASR  ASSERT  BOOLEAN  CHAR
115   CHR  COPY  DEC  EXCL  FLOOR
117   LSL  LONG  LONGREAL  NEW  ODD
118   ORD  PACK  REAL  ROR  SET
119   SHORT  UNPK
159 (158)   LONGREAL  real numbers
161 (160)   The type LONGREAL is intended to represent real numbers with a higher number of digits than
162 (]160..161[)   REAL. However, the two types may be identical.
182 (180)   associate from left to right. For example, x-y-z stands for (x-y)-z.
185 (183)   SimpleExpression = ["+"|"-"] term {AddOperator term}.
186 (184)   AddOperator  = "+" | "-" | OR.
309 (307)   - difference
314 (312)   The operators +, -, *, and / apply to operands of numeric types. Both operands must be of the
315 (313)   same type, which is also the type of the result. When used as unary operators, - denotes sign
319 (317)   x = q*y + r  0 ? r < y
324 (321)   - difference
352 (350)   (i+j) * (i-j) (INTEGER)
354 (352)   a[i+j] * a[i-j] (REAL)
357 (355)   k IN {i .. j-1}  (BOOLEAN)
441 (439)   | 1: x := x - y
497 (495)   In addition to its formal parameters and locally declared objects, the objects declared in the
498 (496)   environment of the procedure are also visible in the procedure (with the exception of variables and
499 (]496..497[)   of those objects that have the same name as an object declared locally).
565 (562)   ABS(x) numeric type  type of x  absolute value
566 (563)   ODD(x)  INTEGER  BOOLEAN  x MOD 2 = 1
567 (564)   LEN(v)  v: array  the length of v
568 (565)   LSL(x, n)  x: INTEGER  type of x  logical shift left, x * 2 n
569 (566)   ASR(x, n)  x: INTEGER  type of x  signed shift right, x DIV 2 n
570 (567)   ROR(x, n)  x: INTEGER  type of x  x rotated right by n bits
573 (570)   FLOOR(x)  REAL, LONGREAL  INTEGER  largest integer ? x
577 (]573..574[)   LONG(x)  REAL  LONGREAL x
578 (]573..574[)   SHORT(x)  LONGREAL  REAL  x
587 (]581..582[)   COPY(x, v)  x: character array, string v := x
588 (]581..582[)   v: character array
591 (]583..584[)   ASSERT(b, n) BOOLEAN, INTEGER
592 (584)   PACK(x, y)  REAL; INTEGER  pack x and y into x
593 (585)   UNPK(x, y)  REAL; INTEGER  unpack x into x and y
594 (586)   Procedures INC and DEC may have an explicit increment or decrement. It must be a constant. Also
595 (587)   for INCL and EXCL, x must be a constant. The second parameter n of ASSERT is a value
596 (]587..588[)   transmitted to the system as an abort parameter.
598 (588)   The parameter y of PACK represents the exponent of x. PACK(x, y) is equivalent to x := x * 2 y .
599 (589)   UNPK is the reverse operation of PACK. The resulting x is normalized, i.e. 1.0 <= x < 2.0.
]658..659[ (650)   

Цитата: Oberon07.Report.pdf 28 октября 2013 13:52:18 aka Revision 01.10.2013-I
3   Revision 1.10.2013
7   1. History and introduction
114   ABS  ASR  ASSERT  BOOLEAN  BYTE
115   CHAR  CHR  DEC  EXCL  FLOOR
117   LSL  NEW  ODD  ORD  PACK
118   REAL  ROR  SET  UNPK
]118..119[ (119)   
158 (159)   BYTE  the integers between 0 and 255
160 (161)   The type BYTE is compatible with the type INTEGER, and vice-versa.
]160..161[ (162)   
180 (182)   associate from left to right. For example, x?y?z stands for (x?y)?z.
183 (185)   SimpleExpression = ["+"|"?"] term {AddOperator term}.
184 (186)   AddOperator  = "+" | "?" | OR.
307 (309)   ? difference
312 (314)   The operators +, ?, *, and / apply to operands of numeric types. Both operands must be of the
313 (315)   same type, which is also the type of the result. When used as unary operators, ? denotes sign
317 (319)   x = q*y + r  0 <= r < y
321 (324)   ? difference
350 (352)   (i+j) * (i?j) (INTEGER)
352 (354)   a[i+j] * a[i?j] (REAL)
355 (357)   k IN {i .. j?1}  (BOOLEAN)
439 (441)   | 1: x := x ? y
495 (497)   In addition to its formal parameters and locally declared objects, the objects declared globally are
496 (498)   also visible in the procedure.
]496..497[ (499)   
562 (565)   ABS(x) x: numeric type  type of x  absolute value
563 (566)   ODD(x)  x: INTEGER  BOOLEAN  x MOD 2 = 1
564 (567)   LEN(v)  v: array  INTEGER  the length of v
565 (568)   LSL(x, n)  x, n: INTEGER  INTEGER  logical shift left, x * 2 n
566 (569)   ASR(x, n)  x, n: INTEGER  INTEGER  signed shift right, x DIV 2 n
567 (570)   ROR(x, n)  x, n: INTEGER  INTEGER  x rotated right by n bits
570 (573)   FLOOR(x)  REAL  INTEGER  truncation
]573..574[ (577)   
]573..574[ (578)   
]581..582[ (587)   
]581..582[ (588)
]583..584[ (591)         
584 (591)   PACK(x, n)  REAL; INTEGER  pack x and n into x
585 (592)   UNPK(x, n)  REAL; INTEGER  unpack x into x and n
586 (594)   The function FLOOR(x) truncates x. Its fractional part is discarded.
587 (595)   FLOOR(1.5) = 1  FLOOR(-1.5) = -2
]587..588[ (596)   
588 (598)   The parameter n of PACK represents the exponent of x. PACK(x, y) is equivalent to x := x * 2 y .
589 (599)   UNPK is the reverse operation. The resulting x is normalized, such that 1.0 <= x < 2.0.
650 (]658..659[)   COPY(src, dst, n) all INTEGER copy n consecutive words from src to dst




28.10.2013 to 22.02.2014
Цитата: Oberon07.Report.pdf 28 октября 2013 13:52:18 aka Revision 01.10.2013-I
54 (]53..54[)   unless it contains a scale factor with the letter D, in which case it is of type LONGREAL.
58 (57)     ScaleFactor = ("E" | "D") ["+" | "–"] digit {digit}.
105 (104)   In its declaration, an identifier in the global scope may be followed by an export mark (*) to indicate
106 (105)   that it be exported from its declaring module. In this case, the identifier may be used in other
107 (106)   modules, if they import the declaring module. The identifier is then prefixed by the identifier
121 (120)   ConstantDeclaration = identdef "=" ConstExpression.
513 (512)   value, which cannot be changed by assignment. However, if a value parameter is of a scalar type, it
570 (569)   FLOOR(x)  REAL  INTEGER  truncation
586 (585)   The function FLOOR(x) truncates x. Its fractional part is discarded.
604 (603)   an asterisk (export mark) in their declaration. Variables cannot be exported, with the exception of
605 (]603..604[)   those of scalar types in read-only mode.
634 (632)   definition. It is strongly recommended to restrict their use to specific low-level modules, as such
635 (633)   modules are inherently non-portable and not "type-safe". However, they are easily recognized due
636 (634)   to the identifier S YSTEM appearing in their import lists. The subsequent definitions are generally
637 (635)   applicable. However, individual implementations may include in their module S YSTEM additional
638 (636)   definitions that are particular to the specific, underlying computer. In the following, v stands for a
639 (637)   variable, x, a, and n for expressions.
]639..640[ (638)   
]639..640[ (639)   
]639..640[ (640)   
]650..651[ (652)   
]650..651[ (653)   
]650..651[ (654)   
]650..651[ (655)   
]650..651[ (656)   
]650..651[ (657)   
]650..651[ (658)   
]650..651[ (659)   
]650..651[ (660)   
]650..651[ (661)   
]650..651[ (662)   
665 (677)   ConstantDeclaration = identdef "=" ConstExpression.

Цитата: Oberon07.Report.pdf 22 февраля 2014 г., 06:36:12 aka Revision 01.10.2013-II
]53..54[ (54)   
58 (57)     ScaleFactor = "E" ["+" | "–"] digit {digit}.
104 (105)   In its declaration, an identifier in the module's scope may be followed by an export mark (*) to
105 (106)   indicate that it be exported from its declaring module. In this case, the identifier may be used in
106 (107)   other modules, if they import the declaring module. The identifier is then prefixed by the identifier
120 (121)   ConstDeclaration = identdef "=" ConstExpression.
512 (513)   value, which cannot be changed by assignment. However, if a value parameter is of a basic type, it
569 (570)   FLOOR(x)  REAL  INTEGER  round down
585 (586)   The function FLOOR(x) yields the largest integer not greater than x.
603 (604)   an asterisk (export mark) in their declaration. Variables are always exported in read-only mode.
]603..604[ (605)   
632 (634)   definition.
633 (635)   There are two reasons for provoding facilites in Module S YSTEM ; (1) Their value is implementation-
634 (636)   dependent, that is, it is not derivable from the language's definition, and (2) they may corrupt a
635 (637)   system (e.g. PUT). It is strongly recommended to restrict their use to specific low-level modules, as
636 (638)   such modules are inherently non-portable and not "type-safe". However, they are easily recognized
637 (639)   due to the identifier S YSTEM appearing in the module's import lists. The subsequent definitions are
638 (]639..640[)   generally applicable. However, individual implementations may include in their module S YSTEM
639 (]639..640[)   additional definitions that are particular to the specific, underlying computer. In the following, v
640 (]639..640[)   stands for a variable, x, a, and n for expressions.
652 (]650..651[)   The following are additional procedures accepted by the compiler for the RISC processor:
653 (]650..651[)   Function procedures:
654 (]650..651[)   Name  Argument types  Result type  Function
655 (]650..651[)   VAL(T, n)  scalar  T  identity
656 (]650..651[)   ADC(m, n)  INTEGER  INTEGER  add with carry C
657 (]650..651[)   SBC(m, n)  INTEGER  INTEGER  subtract with carry C
658 (]650..651[)   UML(m, n)  INTEGER  INTEGER  unsigned multiplication
659 (]650..651[)   COND(n)  INTEGER  BOOLEAN  IF Cond(8) THEN ...
660 (]650..651[)   Proper procedures:
661 (]650..651[)   Name  Argument types  Function
662 (]650..651[)   LED(n)  INTEGER  display n on LEDs
677 (665)   ConstDeclaration = identdef "=" ConstExpression.




22.02.2014 to 11.03.2014
Цитата: Oberon07.Report.pdf 22 февраля 2014 г., 06:36:12 aka Revision 01.10.2013-II
3   Revision 1.10.2013
53   factor. The letter E is pronounced as "times ten to the power of". A real number is of type REAL.
158   SET  the sets of integers between 0 and 31
502   DeclarationSequence = [CONST {ConstantDeclaration ";"}]

Цитата: Oberon07.Report.pdf 11 марта 2014 г., 09:26:52 aka Revision 10.03.2014-I
3   Revision 1.10.2013 / 10.3.2014
53   factor. The letter E is pronounced as "times ten to the power of".
158   SET  the sets of integers between 0 and an implementation-dependent limit
502   DeclarationSequence = [CONST {ConstDeclaration ";"}]




11.03.2014 to 16.06.2014
Цитата: Oberon07.Report.pdf 11 марта 2014 г., 09:26:52 aka Revision 10.03.2014-I
]209..210[ (210)   
]209..210[ (211)   

Цитата: Oberon07.Report.pdf 16 июня 2014 г., 05:01:04 aka Revision 10.03.2014-II
210 (]209..210[)   If a type P is defined as POINTER TO T, the identifier T can be declared textually following the
211 (]209..210[)   declaration of P, but [if so] it must lie within the same scope.




16.06.2014 to 25.02.2015
Цитата: Oberon07.Report.pdf 16 июня 2014 г., 05:01:04 aka Revision 10.03.2014-II
3   Revision 1.10.2013 / 10.3.2014
430   executed whose case label list contains the obtained value. The case expression must be of type
431   INTEGER or CHAR, and all labels must be integers or single-character strings, respectively.
434   CaseLabelList =  LabelRange {"," LabelRange}.
436   label  =  integer | string | ident.
]443..444[ (444)   
]443..444[ (445)   
]443..444[ (446)   
]443..444[ (447)   
]443..444[ (448)   
]443..444[ (449)   
]443..444[ (450)   
]443..444[ (451)   
]443..444[ (452)   
]443..444[ (453)   
]443..444[ (454)   
]443..444[ (455)   
]443..444[ (456)   
]443..444[ (457)   
]443..444[ (458)   
]443..444[ (459)   
]443..444[ (460)   
]443..444[ (461)

Цитата: Oberon07.Report.pdf 25 февраля 2015 г., 11:11:48 aka Revision 22.02.2015
3   Revision 1.10.2013 / 22.2.2015
430   executed whose case label list contains the obtained value. If the case expression is of type
431   INTEGER or CHAR, all labels must be integers or single-character strings, respectively.
434   CaseLabelList =  LabelRange {"," LabelRange} | qualident.
436   label  =  integer | string.
444 (]443..444[)   The type T of the case expression (case variable) may also be a record or pointer type. Then the
445 (]443..444[)   case labels must be extensions of T, and in the statements Si labelled by Ti, the case variable is
446 (]443..444[)   considered as of type Ti.
447 (]443..444[)   Example:
448 (]443..444[)   TYPE R = RECORD a: INTEGER END ;
449 (]443..444[)   R0 = RECORD (R) b: INTEGER END ;
450 (]443..444[)   R1 = RECORD (R) b: REAL END ;
451 (]443..444[)   R2 = RECORD (R) b: SET END ;
452 (]443..444[)   P = POINTER TO R;
453 (]443..444[)   P0 = POINTER TO R0;
454 (]443..444[)   P1 = POINTER TO R1;
455 (]443..444[)   P2 = POINTER TO R2;
456 (]443..444[)   VAR p: P; p0: P0; p1: P1; p2: P2;
457 (]443..444[)   CASE p OF
458 (]443..444[)   P0: p0.b := 10 |
459 (]443..444[)   P1: p1.b := 2.5 |
460 (]443..444[)   P2: p2.b := {0, 2}
461 (]443..444[)   END
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 15, 2015, 01:00:19 pm
Интересно, что Вирт выкинул ident из case-меток и оставил только литерные константы integer и string (типа CHAR). Может он прислушался к моей критике (в конце) (http://oberspace.dyndns.org/index.php/topic,593.msg20085.html) и почитывает это форум? (или ему докладывают информаторы)

Основной вклад версии 25.02.2015, это оператор CASE понимаемый как WITH. Теперь использование CASE как старого CASE и CASE как WITH, определяется только на этапе семантического анализа. Вот никогда не понимал этого стремления уменьшить число ключевых слов за счет их семантической перегрузки, очевидно, чтобы продемонстрировать очередное уменьшение сложности языка. Каждому терминалу должен быть сопоставлен единственный семантический смысл (тогда он будет ясен еще при синтаксическом анализе), притом, не зависящий от контекста, и тогда мы увидим подлинный объем лексики языка. Сложность синтаксиса можно оценить только через число его правил и подвыражений. А чтобы увидеть сложность всего языка нужно полностью описать его семантику через контексто-зависимую аттрибутивную грамматику.
К тому же, как я уже говорил, я идеологически против изменения пространства имен внутри операторного блока, и поэтому против оператора WITH, у которого в разных секциях одна и та же переменная имеет разный тип. Динамические типы нужно реализовывать через абстрактные процедуры и модули, тип которых конкретизируется в момент вызова или загрузки.


Отличие первое: Вирт поменял определение типа SET, теперь это "SET the sets of integers between 0 and an implementation-dependent limit ", то есть SET может быть и 8 битным и 32 и 128 и даже 3 битным. Зависит от реализации.

Таким образом Вирт окончательно отвязал Оберон от 32битной платформы и мы теперь не знаем какая разрядность у INTEGER'a, SET и так далее.
Нет, это произошло еще в версии от 11 марта 2014 г. (Revision 10.03.2014-I)

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


К сожалению в Обероне даже нельзя сделать TYPE INT16 = INTEGER -- это запрещено репортом. Можно конечно выкрутиться тестами и прочим, но это уже не просто костыли, это уже целые заросли костылей. Экзоскелет для оберона.
В Обероне-11 и позднее вообще невозможно во время компиляции проверить реализацию базовых типов, или определить реализацию в реал-тайм, даже поверить реализацию в реал-тайм можно только через аварийный выход. В более ранних версиях можно проверить реализацию во время компиляции посредством функций MIN, MAX и DIV.
(* all version: *)
(* MIN(LONGINT) <= MIN(INTEGER) *)
(* MIN(INTEGER) <= MIN(BYTE)    *)
(* MIN(BYTE)    <= MAX(BYTE)    *)
(* MAX(BYTE)    <= MAX(INTEGER) *)
(* MAX(INTEGER) <= MAX(LONGINT) *)


CONST
sheckminint = 1 DIV
MIN(
MIN(
(MIN(BYTE)+1) - MIN(MIN(BYTE)+1,-127-1),
MAX(MIN(BYTE),-127) - MIN(BYTE)
),
MIN(
(MIN(INTEGER)+1) - MIN(MIN(INTEGER),-2147483647-1),
MAX(MIN(INTEGER),-2147483647) - MIN(INTEGER)
),
MIN(
(MIN(LONGINT)+1) - MIN(MIN(LONGINT),-9223372036854775807-1),
MAX(MIN(LONGINT),-9223372036854775807) - MIN(LONGINT)
)
);
(* equivalent: *)
(* 1 <= MAX(LONGINT) *)
(* MIN(BYTE)    = -128 *)
(* MIN(INTEGER) = -2147483648 *)
(* MIN(LONGINT) = -9223372036854775808 *)


CONST
sheckmaxint = 1 DIV
MIN(
MIN(
MAX(BYTE) - MIN(MAX(BYTE),127-1),
MAX(MAX(BYTE)-1,127) - (MAX(BYTE)-1)
),
MIN(
MAX(INTEGER) - MIN(MAX(INTEGER),2147483647-1),
MAX(MAX(INTEGER)-1,2147483647) - (MAX(INTEGER)-1)
),
MIN(
MAX(LONGINT) - MIN(MAX(LONGINT),9223372036854775807-1),
MAX(MAX(LONGINT)-1,9223372036854775807) - (MAX(LONGINT)-1)
)
);
(* equivalent: *)
(* MIN(LONGINT) <= 1 *)
(* MAX(BYTE)    = 127 *)
(* MAX(INTEGER) = 2147483647 *)
(* MAX(LONGINT) = 9223372036854775807 *)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 15, 2015, 03:48:07 pm
Интересно, что Вирт выкинул ident из case-меток и оставил только литерные константы integer и string (типа CHAR).
Он только заменил ident на qualident.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 15, 2015, 05:16:25 pm
Интересно, что Вирт выкинул ident из case-меток и оставил только литерные константы integer и string (типа CHAR).
Он только заменил ident на qualident.

Нет, думаю по семантике qualident используется только в CASE как WITH, как квалифицированный тип.
Цитата: Oberon07.Report.pdf 25 февраля 2015 г., 11:11:48 aka Revision 22.02.2015
CaseLabelList = LabelRange {"," LabelRange} | qualident.
label  =  integer | string.
Список интервалов значений LabelRange {"," LabelRange} используется в CASE как CASE. В то время как qualident может использоваться только вместо списка интервалов значений, как единичное значение, а для CASE как CASE это странное ограничение.

Вот если бы Вирт написал:
CaseLabelList = LabelRange {"," LabelRange}.
label  =  integer | string | qualident.
было бы по вашему.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 16, 2015, 10:47:37 am
Ну как бэ очевидно, что список идентификаторов имеет мало смысла.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Kemet от Март 16, 2015, 06:34:06 pm
Зачем в примере переменные p0, p1, p2?
Очевидно, что это пример - часть программы, в которой опущено созданий переменных разных типов, значения который в дальнейшем и присваиваются p.
Т.е., опущено, например
NEW(p0); NEW(p1); NEW(p2);затем идет код, в котором переменной p приcваиваются нужные значения
TYPE R = RECORD a: INTEGER END ;
 R0 = RECORD (R) b: INTEGER END ;
 R1 = RECORD (R) b: REAL END ;
 R2 = RECORD (R) b: SET END ;
 P = POINTER TO R;
 P0 = POINTER TO R0;
 P1 = POINTER TO R1;
 P2 = POINTER TO R2;

VAR p: P; p0: P0; p1: P1; p2: P2;
...
IF a THEN
  p:= p0;
ELSIF b THEN
  p:= p1
...
END;

CASE p OF
 P0: p0.b := 10 |
 P1: p1.b := 2.5 |
 P2: p2.b := {0, 2}
END
а p0.b := 10
p1.b := 2.5
...
чтобы не производить приведение типа p к производному типу
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 16, 2015, 09:46:26 pm
(http://i1.kym-cdn.com/photos/images/original/000/001/582/picard-facepalm.jpg)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 17, 2015, 03:24:10 pm
Ну как бэ очевидно, что список идентификаторов имеет мало смысла.
Почему мало смысла? Смысл имеют их значения, взятые как изолировано, так и в качестве границ интервалов значений. В предыдущей версии от 16.06.2014, что была еще без CASE как WITH, так и было:
Цитата: Oberon07.Report.pdf 16 июня 2014 г., 05:01:04 aka Revision 10.03.2014-II
CaseLabelList =  LabelRange {"," LabelRange}.
label  =  integer | string | ident.
Следует учесть, что варианты выбора CASE статические и определены во время компиляции (иначе зачем нужен оператор CASE когда есть IF-THEN?), то есть ident - это был идентификатор константы.

По смылу label вполне можно было определить как константное выражение (ConstExpression), раньше так и было:
Цитата: report_oberon.pdf aka Revision 1.10.90
CaseLabels  =  ConstExpression [".." ConstExpression].
Но для простоты исходного кода Вирт оставил только integer, string и ident.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 17, 2015, 03:47:06 pm
Но для простоты исходного кода Вирт оставил только integer, string и ident.
Едва ли (хотя, конечно, он фан простоты) - скорее всего, для его задач это не актуально - типичный DSL (нужно будет - через год добавит :) )
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 17, 2015, 04:21:40 pm
Почему мало смысла?
Придумайте пример реального кода где это нужно и поймете.

ps Тут запостить код незабудьте
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: dizer от Март 17, 2015, 05:30:58 pm

Придумайте пример реального кода где это нужно и поймете.


There are more things in heaven and earth," Борис ", than are dreamt of in your philosophy."-  лично я , чем больше живу, тем больше в этом убеждаюсь (да я специально не привел перевод - зацените красоту оригинала применительно к топику).  :)
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: Kemet от Март 18, 2015, 06:04:33 am
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?

Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Всё-же, у тебя несколько специфическое понятие о портабельности.
Ведь есть в плюсцах тип size_t, который не привязан к разрядности, а кпак и INTEGER в Обероне определяется конкретной аппаратной платформой, только никто из плюсовых поклонников, отчего-то, не считает, что это снижает портабельность C++, скорее наоборот.
В Обероне07 тип INTEGER несёт ту же нагрузку, что и size_t, и как-раз и обеспечивает портируемость.
INTEGER всегда соотвествует целому типу оптимального для данной платформы размером.
Если тебе нужна специфика в разрядах, значит тебе требуется реализовать поддержку нужной тебе разрядности отдельно, в виде библиотеки, пространства SYSTEM или даэе глобального пространства.
Но, как и в случае с C++ такой код и не будет портабелен.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 19, 2015, 07:58:20 pm
vlad: спешл фо ю:
CASE p OF
 P0: p.b := 10 |
 P1: p.b := 2.5 |
 P2: p.b := {0, 2}
END
http://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ilovb от Март 25, 2015, 09:05:00 am
ddn:
Можете скинуть все версии репорта?
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 30, 2015, 03:05:06 pm
ddn:
Можете скинуть все версии репорта?
Я бы выложил (500K), да не знаю куда. Работающих файлопомоек больше не существует.


Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 30, 2015, 03:10:47 pm
Хотя попробую прямо в сообщение. Незнаю сколько он будет храниться.
Название: Re: Oberon rev. 2015 (февраль)
Отправлено: ddn от Март 30, 2015, 03:21:24 pm
Oberon07.Report.doc [25.07.2012] скачал не я, взял из архива какого-то оберонщика.