Oberon space
General Category => Общий раздел => Тема начата: 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 год, но думаю это опечатка, ибо совпадает и месяц и день).
-
Отличие первое: Вирт поменял определение типа SET, теперь это "SET the sets of integers between 0 and an implementation-dependent limit ", то есть SET может быть и 8 битным и 32 и 128 и даже 3 битным. Зависит от реализации.
Таким образом Вирт окончательно отвязал Оберон от 32битной платформы и мы теперь не знаем какая разрядность у INTEGER'a, SET и так далее.
Портабельность приложений написанных на Обероне становится довольно условной.
-
Семантику CASE Вирт так и не привел в соответствие с Project Oberon.
-
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
-
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
-
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Приведи пример с проблемой.
-
Вообще, в модуле SYSTEM можно определить типы фиксированной размерности.
-
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Приведи пример с проблемой.
Любой код работающий с целочисленной арифметикой либо получающий целочисленные значения из окружающего мира.
А вот работа с константами и литералами останется скорее всего безопасной (потому, что компилятор может сделать там проверку на этапе компиляции и выдать ошибку если результат constexpr не влезает в переменную, хотя он в общем то не обязан это делать, поэтому даже тут возможно неожиданное для программиста поведение).
-
Вообще, в модуле SYSTEM можно определить типы фиксированной размерности.
Нельзя. Во-первых SYSTEM это опциональный модуль (в реализации его может не быть). Во-вторых просто по логике такие типы должны быть не в SYSTEM, а в другом встраиваемом модуле.
К сожалению в Обероне даже нельзя сделать TYPE INT16 = INTEGER -- это запрещено репортом. Можно конечно выкрутиться тестами и прочим, но это уже не просто костыли, это уже целые заросли костылей. Экзоскелет для оберона.
Вирт сделел все, чтобы программа написанная для конкретной реализации оберона была гарантированно работоспособной только на данной реализации оберона. Перенос её на другую реализацию или скажем платформу - это боль и баги на ровном месте.
PS. Я вообще перестал понимать что такое ЯП Оберон в этом репорте - с одной стороны это не тот язык который используется в Project Oberon 2013, то есть компилятором ЯП Оберон эту ОС Оберон и модули её не собрать - там другой язык. С другой стороны в ЯП Оберон Вирт в тот же SYSTEM внес абсолютно бесполезную функцию LED, которая имеет смысл только в его последней реализации ОС Оберон. В общем какая-то фигня на постном масле.
-
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю ;D
-
Очередное подтверждение тому, что Вирт клепает себе DSL под свой интерес.. и насрать ему на гоношение эпигонов (в том числе и с О.Коре ) :D
-
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю ;D
Никому не верь -- сам думай. А веру оставь уделом религиозных людей...
-
В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю ;D
Никому не верь -- сам думай. А веру оставь уделом религиозных людей...
Угу, угу. Верь в свою думалку. ;D
Думать по разному можно. Можно считать себя гением и заниматься хуйней. А можно заткнуть свою гордость в задницу и попытаться понять умного дядьку.
-
Думать по разному можно. Можно считать себя гением и заниматься хуйней. А можно заткнуть свою гордость в задницу и попытаться понять умного дядьку.
:D многое возможно...особенно если дядька достаточно хорошо разрекламирован (если недостаточно - не беда - можно можно помочь ему в этом) - например... устроить из процесса "понимания" ритуал... ;) Вон, у нас из под Ленина.. целую науку сообразили (Марксизм -Ленинизм) и в течении 70 лет повсеместно изучали... тут, конечно, так много не выжмешь :(
-
фигли...17 страниц vs. 50 томами... но зато какой простор для интерпретации :D
-
Почему обязательно ритуал?
Это ученый с мировыми именем. И это подтверждено справкой.
Надо быть полным идиотом, чтобы считать себя умнее его.
Как минимум следует 1000 раз подумать прежде чем ставить его решения под сомнение.
Кто мы собсна такие, чтобы его критиковать?
Из нас тут никто пока еще не сделал даже тысячной доли из того, что сделал он.
Зато такие все специалисты в языках просто охуеть.
Маловата у вас пиписка, товарищи, чтобы Вирта критиковать.
-
Не обязательно... я же сказал - в качестве примера :D - более подробно на ранний OberonCore
(т.е. хотите - критикуйте, хотите - поклоняйтесь, хотите - ВДУМЧИВО ИЗУЧАЙТЕ , наконец, хотите - используйте в своих целях....)
-
Почему обязательно ритуал?
Это ученый с мировыми именем. И это подтверждено справкой.
Надо быть полным идиотом, чтобы считать себя умнее его.
Как минимум следует 1000 раз подумать прежде чем ставить его решения под сомнение.
Кто мы собсна такие, чтобы его критиковать?
Из нас тут никто пока еще не сделал даже тысячной доли из того, что сделал он.
Зато такие все специалисты в языках просто охуеть.
Маловата у вас пиписка, товарищи, чтобы Вирта критиковать.
Я свое мнение обосновал (как обоснованы и решения по дизайну языка той же Ады, где с этим все хорошо). Вирт же свои решения не обосновал.
Да, а авторитетов для меня не было нет и не будет.
-
Пардон, но я не видел обоснования. Можешь процитировать?
-
Портабельность приложений написанных на Обероне становится довольно условной.
По-моему, ты делаешь из мухи слона. ;) Вирт разве где-то эту самую "портабельность" в том виде, в котором ты её хочешь (т.е. между различными реализациями) деклалировал? Нет. Ну, собственно, и точка на этом. Если тебе нужна переносимость между реализациями, то Oberon (в его нынешнем состоянии) тебе противопоказан. :)
-
kemiisto, ну кто так делает? Постепеееенно нужно... человеков троллировать.
-
А ведь как охуительно обвинять что-то в несоответствии твоим бредовым фантазиям.
Например, берем и называем язык непортабельным. И хуй ведь разберешь чего там аффтар под "портабельностью" набредил.
Или вот берем и говорим, что отсутствие отрицательных чисел в языке не позволяет использовать CASE по назначению. И ведь нам совершенно похуй, что инертность мышления не дает нам развидеть в CASE сишный SWITCH. Мы ведь не знаем из курса математики о функциях выбора всяких. Зато мы шарим в функцианальном программировании. Вот так вот. Элементарных вещей о функциях не знаем, но специалисты в ФП ниипаца.
Нет! Это тьюринговый лауреат дурак, а не я!
А еще мы можем заявить, что Вирт говнокодер, только потому, что он использует глобальные переменные.
Нам ведь похуй, что в системе есть глобальное состояние, которое нужно хранить.
Тьфу, блять. Стыдно должно быть.
-
А ведь как охуительно обвинять что-то в несоответствии твоим бредовым фантазиям.
Например...
сколько экспрессии... :D но справедливости ради ради - не менее (охуительно) чем сделать идола и морочить голову начинающим, впрочем, первое можно трактовать как как "заблуждение во время поиска истины" а вот второе... довольно мерзостно (на мой взгляд) - впрочем - дело хозяйское ;)
-
Господь с тобой, dizer, давно уже перевелись идолопоклонники обероновые. Нынче модно ящерам всяким поклоняться ;D
-
Весело у вас тут. ;D
-
Господь с тобой, dizer, давно уже перевелись идолопоклонники обероновые. Нынче модно ящерам всяким поклоняться ;D
1. Если ОН есть , то как от него отвяжешься....
2. По большей части земноводным... но какая разница кому? и из за чего? (я же не зря припомнил Ленинизм).... я ведь говорю про то, что эта ТЕМА вечна.... А ошибки... кто не ошибался из нас ;) то же были и будут...
-
Семантику CASE Вирт так и не привел в соответствие с Project Oberon.
Я правильно понял, что CASE может исползоваться только для расширений типа, имеющих название вида: <base record> + <number>?
-
Там написано:
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;
-
Тип Т 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 - народ тоже в недоумении, что же Вирт имел ввиду в своем примере. Собственно, там и предположили, что забыто присваивание в каждой ветке.
-
> Собственно, там и предположили, что забыто присваивание в каждой ветке.
Ну так старость не радость, кто знает, какими маразматиками мы станем в его возрасте...
-
Зачем в примере переменные 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
-
p0, p1 и p2 - это и есть p
Т.е. в i-той ветке p становится pi
Т.е. все ломается, если я при редактировании поменяю ветки местами, или вставлю новую (в середину) или удалю что-то (из середины). А может и не сломается (переменные-то объявлены в VAR!), а просто будет падать или неправильно работать. Классно. Больше джаваскрипта, больше, теперь и в обероне!
-
vlad, тебе надо перерыв сделать. Перегрелся походу. Уже не только пендосский, но и родной язык понимать перестал ;D
-
vlad, тебе надо перерыв сделать. Перегрелся походу. Уже не только пендосский, но и родной язык понимать перестал ;D
Да, пойду проветрюсь.
-
Вот сюда еще глянь: http://www.excelsior-usa.com/doc/xds/o2rep09.html#36
Для WITH тоже никто реальный код не приводил. Однако ведь понятно о чем речь.
WITH v: T1 DO S1 |v: T2 DO S2 ELSE S3 END
Это псевдокод такой, если угодно...
-
Классно. Больше джаваскрипта, больше, теперь и в обероне!
Ну и еще до кучи - как будут выглядеть переменные p0, p1, p2 для случая:
CASE object.p OF
...
-
Ты серьезно?
-
Ты серьезно?
Ладно, я просто подожду разъяснений от Вирта. Хотя бы в виде его же кода, использующего описанную семантику.
-
Тык вот куча кода: https://github.com/ilovb/ProjectOberon2013
-
Вообще, в модуле 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.
-
SYSTEM - это уже бородатый баян: http://oberspace.dyndns.org/index.php/topic,506.msg16938.html
-
Вирт часто вносит изменения в публичную версию документа 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
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)
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
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.
]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
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 ";"}]
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
]209..210[ (210)
]209..210[ (211)
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
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)
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
-
Интересно, что Вирт выкинул 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 *)
-
Интересно, что Вирт выкинул ident из case-меток и оставил только литерные константы integer и string (типа CHAR).
Он только заменил ident на qualident.
-
Интересно, что Вирт выкинул ident из case-меток и оставил только литерные константы integer и string (типа CHAR).
Он только заменил ident на qualident.
Нет, думаю по семантике qualident используется только в CASE как WITH, как квалифицированный тип.
CaseLabelList = LabelRange {"," LabelRange} | qualident.
label = integer | string.
Список интервалов значений LabelRange {"," LabelRange} используется в CASE как CASE. В то время как qualident может использоваться только вместо списка интервалов значений, как единичное значение, а для CASE как CASE это странное ограничение.
Вот если бы Вирт написал:
CaseLabelList = LabelRange {"," LabelRange}.
label = integer | string | qualident.
было бы по вашему.
-
Ну как бэ очевидно, что список идентификаторов имеет мало смысла.
-
Зачем в примере переменные 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 к производному типу
-
(http://i1.kym-cdn.com/photos/images/original/000/001/582/picard-facepalm.jpg)
-
Ну как бэ очевидно, что список идентификаторов имеет мало смысла.
Почему мало смысла? Смысл имеют их значения, взятые как изолировано, так и в качестве границ интервалов значений. В предыдущей версии от 16.06.2014, что была еще без CASE как WITH, так и было:
CaseLabelList = LabelRange {"," LabelRange}.
label = integer | string | ident.
Следует учесть, что варианты выбора CASE статические и определены во время компиляции (иначе зачем нужен оператор CASE когда есть IF-THEN?), то есть ident - это был идентификатор константы.
По смылу label вполне можно было определить как константное выражение (ConstExpression), раньше так и было:
CaseLabels = ConstExpression [".." ConstExpression].
Но для простоты исходного кода Вирт оставил только integer, string и ident.
-
Но для простоты исходного кода Вирт оставил только integer, string и ident.
Едва ли (хотя, конечно, он фан простоты) - скорее всего, для его задач это не актуально - типичный DSL (нужно будет - через год добавит :) )
-
Почему мало смысла?
Придумайте пример реального кода где это нужно и поймете.
ps Тут запостить код незабудьте
-
Придумайте пример реального кода где это нужно и поймете.
There are more things in heaven and earth," Борис ", than are dreamt of in your philosophy."- лично я , чем больше живу, тем больше в этом убеждаюсь (да я специально не привел перевод - зацените красоту оригинала применительно к топику). :)
-
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?
Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Всё-же, у тебя несколько специфическое понятие о портабельности.
Ведь есть в плюсцах тип size_t, который не привязан к разрядности, а кпак и INTEGER в Обероне определяется конкретной аппаратной платформой, только никто из плюсовых поклонников, отчего-то, не считает, что это снижает портабельность C++, скорее наоборот.
В Обероне07 тип INTEGER несёт ту же нагрузку, что и size_t, и как-раз и обеспечивает портируемость.
INTEGER всегда соотвествует целому типу оптимального для данной платформы размером.
Если тебе нужна специфика в разрядах, значит тебе требуется реализовать поддержку нужной тебе разрядности отдельно, в виде библиотеки, пространства SYSTEM или даэе глобального пространства.
Но, как и в случае с C++ такой код и не будет портабелен.
-
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
-
ddn:
Можете скинуть все версии репорта?
-
ddn:
Можете скинуть все версии репорта?
Я бы выложил (500K), да не знаю куда. Работающих файлопомоек больше не существует.
-
Хотя попробую прямо в сообщение. Незнаю сколько он будет храниться.
-
Oberon07.Report.doc [25.07.2012] скачал не я, взял из архива какого-то оберонщика.