Оберон-технология: особенности и перспективы |
Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение.
Всего в теме 6256 сообщений
Добавить свое сообщение
Отслеживать это обсуждение Обсуждение из раздела Школа ОБЕРОНА
№ 5176 24-09-2007 01:24 | |
Ответ на »сообщение 5175« (Руслан Богатырев)
___________________________
В отношении управляющей переменной цикла FOR у меня достаточно давно сформировалась своя модель (идеальная) -- область видимости управляющей переменной должна ограничиваться телом цикла. Вне этого цикла ее значение не просто не определено, а она вообще недоступна. Собственно, такое убеждение у меня сложилось при знакомстве с языком Modula-3 в начале 1990-х годов, где по сути этот подход и реализован. Думаю, в новом языке (усл. название Norebo-1), который будет создаваться в рамках проекта "Роса", именно так и будет реализован цикл FOR.
Семантика оператора FOR в Modula-3 изложена в описании языка (Modula-3 Report, http://www.europrog.ru/paper/src052.pdf), см. с.25
A FOR statement has the form:
FOR id := first TO last BY step DO S END;
where id is an identifier, first and last are ordinal expressions with the same base type, step is an integer-valued expression, and S is a statement. "BY step" is optional; if omitted, step defaults to 1. The identifier id denotes a readonly variable whose scope is S and whose type is the common basetype of first and last.
№ 5175 24-09-2007 01:12 | |
Ответ на »сообщение 5172« (pepper)
___________________________
>В Обероне это как раз вообще не является проблемой (для массивов любой размерности; сравните с Си/Си++).
foreach (помимо более точного выражения намерений) гарантирует отсутствие вот таких ошибок:
Для отсутствия таких ошибок надо просто аккуратно прописать семантику FOR. В классическом Обероне (вариант 1990 г.) нет оператора FOR. В Оберон-2 его включили с подачи Мессенбека (а заодно и в КП). Семантика Оберона-2 (судя по описанию) не запрещает менять управляющую переменную цикла FOR внутри цикла. Это так. Но если мы говорим про то, как это должно быть (скажем, в Oberon-07), то (если исходить из взглядов Вирта), стоит перечитать описание классического Паскаля (образца 1972 г.) -- http://www.europrog.ru/paper/nw_pas.pdf
См. п.9.2.3.3 (с.29). Там четко прописана эта норма закона:
The control variable, the initial value, and the final value must be of the same scalar type (or subrange thereof), and must not be altered by the repeated statement.
В отношении управляющей переменной цикла FOR у меня достаточно давно сформировалась своя модель (идеальная) -- область видимости управляющей переменной должна ограничиваться телом цикла. Вне этого цикла ее значение не просто не определено, а она вообще недоступна. Собственно, такое убеждение у меня сложилось при знакомстве с языком Modula-3 в начале 1990-х годов, где по сути этот подход и реализован. Думаю, в новом языке (усл. название Norebo-1), который будет создаваться в рамках проекта "Роса", именно так и будет реализован цикл FOR.
№ 5174 24-09-2007 00:41 | |
Ответ на »сообщение 5173« (Антон Григорьев)
___________________________
>В отличие от Паскаля, в Обероне вызов процедуры-функции всегда требует присутствия скобок, даже если у функции нет аргументов.
Хорошо, если так. Я проверял это по книге Свердлова "Языки программирования и методы трансляции" - там на 450-ой странице при описании синтаксиса Оберона-2 с помощью БНФ ФактическиеПараметры при вызове процедуры стоят в квадратных скобках и никаких обязательных керуглых скобок там нет. Следовательно, кто-то из вас двоих ошибается.
В классическом Обероне (и в Обероне-2) есть процедуры (proper procedures) и процедуры-функции (function procedures). Оба вида используют одну синтаксическую форму (с вариантами). На уровне EBNF разница между двумя видами не задается. Это уровень семантики. Различие при вызове процедуры и процедуры-функции Вирт обозначил следующей фразой (п. 10.1 в описании языка):
A function procedure without parameters must have an empty parameter list. It must be called by a function designator whose actual parameter list is empty too.
Ровно такая же фраза перекочевала в описание Оберона-2. Можно ли говорить о двусмысленности (фразу об обязательном присутствии пустого списка параметров приравнивать к отсутствию списка)? Естественный язык, используемый для пояснения семантики, -- не идеал.
№ 5173 23-09-2007 23:48 | |
Ответ на »сообщение 5162« (AVC)
___________________________
В отличие от Паскаля, в Обероне вызов процедуры-функции всегда требует присутствия скобок, даже если у функции нет аргументов.
Хорошо, если так. Я проверял это по книге Свердлова "Языки программирования и методы трансляции" - там на 450-ой странице при описании синтаксиса Оберона-2 с помощью БНФ ФактическиеПараметры при вызове процедуры стоят в квадратных скобках и никаких обязательных керуглых скобок там нет. Следовательно, кто-то из вас двоих ошибается.
№ 5172 23-09-2007 21:23 | |
Ответ на »сообщение 5153« (AVC)
___________________________
В Обероне это как раз вообще не является проблемой (для массивов любой размерности; сравните с Си/Си++).
foreach (помимо более точного выражения намерений) гарантирует отсутствие вот таких ошибок:
FOR i := 0 TO LEN(a)-1 DO
i :=0;
a[i] := 3;
END;
№ 5171 23-09-2007 17:21 | |
Ответ на »сообщение 5163« (AVC)
___________________________
Как это выглядит с моей стороны.
Все началось с обсуждения нового поста в блоге Зуева lonely compiler, где он написал, что, предоставляя программисту только процедурную абстракцию и модули, Оберон является слишком низкоуровневым.
Причем это утверждение подается в качестве настолько бесспорного, что даже не снабжается аргументами.
Давайте вспомним, что написал Евгений Зуев в отношении данного момента: "Чем сложнее Оберон-программа, тем яснее становится видно, что лаконичность языка на практике означает его низкий уровень: отсутствие в нем тех или иных возможностей оборачивается избытком низкоуровневых деталей в программах, и для борьбы со сложностью у программиста по существу, имеется только старый как мир процедурный механизм, да понятие модуля, чего совершенно очевидно недостаточно".
Слова эти можно трактовать по-разному. Но здесь нет однозначного утверждения о том, что процедуры и модули при отсутствии других абстракций ведут Оберон к слишком низкоуровневому виду. Что вообще понимается под низкоуровневостью? Какие абстракции? Для каких задач? Язык Оберон создавался для решения задач системного программирования. Причем для реализации вполне конкретной ОС -- Oberon System. Не было, в частности, требования поддержки коллективной разработки (из-за чего "слиплись" DEFINITION И IMPLEMENTATION). Это язык для индивидуального программирования. Без насыщения прагматикой (в контексте промышленного разделения труда) это просто двигатель (ядро), а не автомобиль.
Что касается контроля сложности, то тут я не готов разделить точку зрения Евгения Зуева (по крайней мере, в контексте им изложенного). Именно модуль и процедура -- ключевые сущности в обеспечении контроля сложности. Их недостаточно. Да, с этим согласен. Но они ключевые. Особенно модуль. И это, к сожалению, недооценивают. Впрочем, некоторые свои взгляды я изложил в ветке по "Русской ОС", а в блоге в ближайшее время эти вопросы постараюсь развить поглубже. Они фундаментальные. И здесь источник очень многих проблем современного программирования.
Хотел бы напомнить, что в проекте "Роса" ключевым моментом будет поиск подходов к обеспечению контроля сложности для разработки сложных программных систем (включая и саму ОС).
№ 5170 23-09-2007 17:05 | |
Ответ на »сообщение 5168« (Jack Of Shadows)
___________________________
Опередили. Я думал о том же самом :))
Остается только добавить что "специалист не знакомый с ..." это оксюморон.
Проблема в том, на каком уровне знакомый. Можно знать форму языка (грамматику), но не владеть семантикой (знать эталонную трактовку на уровне толкового словаря). Для английского языка это Merriam-Webster ( http://www.m-w.com). Но и этого мало. Чтобы разбираться в текстах (что естественного языка, что языка программирования), надо знать контекст, а он определяется прагматикой языка. Если человек не знает классическую английскую поэзию, ее традиции, то пытаться судить в этой сфере, изучив учебник английского языка, конечно можно. Но это, увы, будет уровень обывателя, а не специалиста.
№ 5169 23-09-2007 16:59 | |
Ответ на »сообщение 5162« (AVC)
___________________________
>Единственный недостаток Обеорна в этом плане - это то, что в выражении A := B нельзя определить, чем является B - переменной или функцией без параметров.
А вот и неправда Ваша! :)
В отличие от Паскаля, в Обероне вызов процедуры-функции всегда требует присутствия скобок, даже если у функции нет аргументов.
Каждый из вас прав по-своему. Если A и B -- переменные процедурного типа, у которого нет аргументов, то никаких скобок в присваивании (в Обероне) ставить не надо, и программист, изучающий исходный текст, может даже не понять, что речь здесь идет о процедурах!
№ 5168 23-09-2007 15:56 | |
Ответ на »сообщение 5165« (Стэн)
___________________________
Это как возможность читать текст на английском не зная английского?
Опередили. Я думал о том же самом :))
Остается только добавить что "специалист не знакомый с ..." это оксюморон.
Либо он специалист, то есть знаком и не понаслышке с языком. Либо он не знаком, но в таком случае он не специалист.
Это все равно что искать профессиональных математиков, не знакомых с математической нотацией.
№ 5167 23-09-2007 15:52 | |
Ответ на »сообщение 5159« (Антон Григорьев)
___________________________
>>> Я говорил не об ошибках в реализации компилятора и стандартных библиотек, а об ошибках, которые вы можете допустить сами. Вы же можете реализовать свой класс, а в нём - интерфейс IEnumerable.
Да не могу я допустить ошибок... )))
В разбираемом примере функция LEN() применима только ко встроенным типам массивов, а если Вы напишете свой тип, например, сбалансированное дерево... И будет стоять задача обхода всех элементов этого дерева. Что, будете каждый раз весь код обхода копировать? Скорее всего напишете какую-нибудь функцию с процедурным параметром... И тоже от ошибок застрахованы не будете... Используйте foreach только для стандартных типов и все будет ОК...
>>> Например, A.B := <выражение> в Обероне однозначно определяет то, что полю B переменной A будет присвоено значение заданного выражения и более ничего. А в большинстве популярных языков B может быть не полем, а свойством, и при подобном присваивании будет выполнена ещё куча скрытых действий.
Да, есть такая проблема в "большинстве популярных языков"... Только непонятно почему все боятся несоответствующего поведения операторов, но совершенно не боятся несоответствующего поведения функций? Что делает этот код:
SWAP( A, B );
Меняет местами значение переменных или заодно еще и диск форматирует?...
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|