Здравствуйте, jazzer, Вы писали:
J>Правильно, не надо быть прорицателем, надо книжку почитать. J>В 1979 году у Страуструпа уже была степень Ph.D., защищенная в Кембридже. J>http://www.research.att.com/~bs/bio.html
J>В 78-м году он начал работу по использованию идиом Симулы в С. J>И это был "С с классами", а не С++, которым мы пользуемся сейчас. J>Это был даже не С++, каким он был в 83-м.
Я и имел в виду Си с классами, который он начал изобретать будучи аспирантом. Название "С++" появилось позже.
Здравствуйте, Mamut, Вы писали:
M>>>Просьба к коду не придираться
AVC>>Да Бог с ним, с кодом; какая разница, ведь Вы просто не знаете языка. AVC>>И в Си++, и в Обероне в данном случае сравниваются переменные. AVC>>И вызов функции, и ее определение требуют круглых скобок, даже если функция вызывается без параметров.
M>О! Я этого не знал, но! Нигде (ни в постах Сергея, например, ни даже в примерах на ETH) не указано такое требование.
M>Например M>
M>Только посмотрев в описание модулей можно понять, что Out.Ln — процедура, а Display.get — это переменная
В Обероне это легко (ИМХО) определяется по контексту.
Вызов "чистой" процедуры — всегда отдельный оператор.
Процедуры-функции используются в выражениях и именно поэтому требуют скобок, даже если у них нет параметров.
Переменная используется либо как левая часть оператора присваивания, либо в выражении, но никогда "сама по себе", поэтому ее не спутаешь с процедурой.
M>Более того, в EBNF Оберона записано следующее: M>
Мне кажется, что вызов процедуры-функции должен упоминаться не в операторе (statement), а в выражении (expression).
Скорее всего — в множителе (factor).
Но я еще подумаю.
AVC>>В Си++, например, напротив, конструктор без параметров не должен иметь скобок, чтобы компилятор не принял его за прототип функции. AVC>>Понимаете, в чем закавыка. Я программирую как на Си++, так и на Обероне. (Оберон мне нравится больше, но для того, что я хочу Вам сказать, это не имеет значения.) AVC>>В то же время ни Вы, ни большинство других "оппонентов" (какими они зачастую себя только воображают) Оберона не знают и на нем не пишут.
M>
AVC>>Отсюда беспрерывные "откровения" вроде Вашего (со сравнением переменных) или уж откровенно глупого "оказывается, в Обероне есть BEGIN!!!". О перлах вроде "мне нас**ть на принципы структрного программирования" я уж и не говорю.
M>Ну, на принципы эти мне не неср*ть в общем случае Дело в том, что слишком часто от того же принциа "одна точка входа — одна точка выхода" необходимо отходить, потому что следование ему приводит к усложнению программы.
M>На самом деле меня интересовал (в этой подветке) всего один вопрос — почему недопустимо более одной точки выхода из циклов FOR и WHILE в Обероне и почему необходимо было вводить цикл LOOP (он уже нарушает принцип структурного программирования Дейкстры).
Я это обдумаю.
До сих пор я воспринимал "одну точку выхода" так: в данной процедуре после выхода из цикла (а также IF или CASE) мы можем оказаться толькой в одной точке программы — сразу после этого цикла. Если цикл был с предусловиеи, то в точке сразу после него оно будет обязательно ложным. Если цикл был с постусловием, оно обязательно будет истинным. Ну, а если был LOOP (выход из тела цикла) — то смотри в оба!
AVC>>Можете рассматривать это как "открытое письмо". M>
Я ни в коем случае не хотел Вас обидеть. Я обратился лично к Вам именно потому, что был уверен, что Вы поймете меня правильно.
Просто, как мне показалось, вчера дело зашло слишком далеко.
Добрался ночью до Инета — и о ужас! По первому впечатлению я воспринял ситуацию как травлю и пинание ногами.
Вот я и выбрал, ИМХО, самого разумного и спокойного оппонента, чтобы высказать свое "фэ".
Разумеется, я никоим образом не хотел сказать, что сторонники Оберона всегда правы, а его противники всегда неправы.
За год дискуссий на RSDN я многое понял только благодаря критике.
Потому и участвую в здешних дискуссиях (иногда перерастающих в побоища ), хотя некоторые (уважаемые мной) люди удивляются этому. Говорят, в частности, что язык программирования как религия — никто никого не переубедит. Я же хочу испытать некоторые идеи (и не думаю "насаждать" Оберон "огнем и мечом"), так что мне критика только полезна.
Но вчера... уж я сам, каюсь, язвительный , но вы, ребята, просто поставили мировой рекорд какой-то...
Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Его можно использовать для математического доказательства правильности алгоритмов. Об этом говорилось в самом начале (верификация).
Вас еще там же просили что-нибудь верифицировать в качестве примера, как можно обойтись без отладки. И что, вышло что-нибудь? Если у Вас затруднения с примерами, то вот подсказка: в книге Вирта "Алгоритмы + структуры данныхь их полно. а то, что они все на Модуле-2, у Вас не должно вызывать затруднений — синтаксис-то правильный.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Кстати, можно усовершенствовать:
СГ>LOOP a[i] := b[j]; СГ> IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END СГ>END
СГ>так короче.
А так можно?
LOOP a[i] := b[j];
IF b[j] = 0X THEN EXIT END; INC(i); INC(j)
END
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Amidlokos, Вы писали:
A>> Однако имеет смысл только для одной проверки. Ну двух. А если точек выхода десяток (по найденному, по обнаруженному битому, срочно по переключению мютекса и т.п.)?
СГ>Так Вы определитесь, что конкретно нужно. Приведите конкретный пример. Чтобы потом без всяких там, а вот если бы да кабы, то в носу бы выросли грибы...
Если Вы когда-нибудь писали что-то реальное, таких примеров у Вас самого должно хватать.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, alexku, Вы писали:
A>>В этом вашем примере assert(n <= -1) совершенно не имеет смысла, потому что значение n предсказуемо на 100% и всегда будет равно -1.
СГ>Это было бы так если бы использовался Modula/Oberon в которых из цикла WHILE нельзя выйти ни каким другим способом. В С# же был выход по break. Поэтому значение n на реальных данных всегда было больше нуля, а не то что больше -1. Ошибку я нашел просто случайно поглядев на исходник, а вовсе не от того что программа упала (она не падала) и я залезши в дебагер стал там чего-то крутить.
А я вообще не понял смысл такой проверки. Или ты забыл присвоить новое значение после цикла?
Здравствуйте, Сергей Губанов, Вы писали:
SJA>>Да-да. Совершенно тривиальное. Авторы отчаялись его кому-нибудь впарить, и открыли коды. Думали наверное кого-то завлечь беплатным сыром...
СГ>Да не бесплатности объяснение, а объяснение почему сборщик мусора в BlackBox работает в несколько раз быстрее чем сборщик мусора в .NET.
Ну ничего. Значит я привёл объяснение бесплатности. В случе чего буду приводить цитату на свой пост.
Здравствуйте, Сергей Губанов, Вы писали:
A>>В этом вашем примере assert(n <= -1) совершенно не имеет смысла, потому что значение n предсказуемо на 100% и всегда будет равно -1.
СГ>Это было бы так если бы использовался Modula/Oberon в которых из цикла WHILE нельзя выйти ни каким другим способом. В С# же был выход по break. Поэтому значение n на реальных данных всегда было больше нуля, а не то что больше -1. Ошибку я нашел просто случайно поглядев на исходник, а вовсе не от того что программа упала (она не падала) и я залезши в дебагер стал там чего-то крутить.
Ну вот я написал в обероне прогу. Аналог.
MODULE TestTest;
IMPORT StdLog, Files;
PROCEDURE dec(OUT x : INTEGER) : INTEGER;
BEGIN
DEC(x);
RETURN x + 1;
END dec;
PROCEDURE Test*();
VAR i: INTEGER;
BEGIN
i:=10;
WHILE dec(i) > 0 DO(* ...do work... *)END;
(* I think i==0 *)END Test;
END TestTest.
Поскольку пост декремента там нету, то я написал свой. Использовал отличный WHILE, как положено, а лажа — та же....
СГ>Кроме того, код while (*a++ = *b++); вообще писать нельзя так как он не проверяет выход за границы
Кто вам сказал? Вы знаете какого типа a и b? Знаете как перегружены в них операторы инкремента?
СГ>С другой стороны, массивы в Pascal/Modula/Oberon это есть обычные типы значения, так что для полного копирования одного массива в другой можно просто написать a := b. Что касается строк, то для работы с ними есть уже встроенные механизмы.
Ага. Если a и b — это массив или строка. Чего в общем-то из данного куска кода никак не следует.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Socrat, Вы писали:
S>>Сравни: S>>
S>>while (*a++ = *b++);
S>>
S>>и S>>
S>>LOOP
S>> a[i] := b[j];
S>> IF b[j] = 0X THEN EXIT END;
S>> INC(i);
S>> INC(j)
S>>END
S>>
СГ>Можно еще короче:
СГ>LOOP a[i] := b[j]; СГ>IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END СГ>END
Что-то не заметил разницы... Разве что в одну строчку написал.
СГ>А инструкции с побочным эффектом опасны. Кроме того, код while (*a++ = *b++); вообще писать нельзя так как он не проверяет выход за границы и может привести к такой любомой сишной ошибке как переполнение буфера.
СГ>Надо писать хотя бы так: СГ>
СГ>LOOP
СГ> IF (i < LEN(a)) & (j < LEN(b)) THEN
СГ> a[i] := b[j];
СГ> IF b[j] # 0X THEN INC(i); INC(j) ELSE EXIT END
СГ> ELSE EXIT END
СГ>END
СГ>
for (int i=0; i < MAX_LEN && *a++ = *b++; i++);
или
for (int i=0; i < MAX_LEN && a [i++] = *b++;);
СГ>С другой стороны, массивы в Pascal/Modula/Oberon это есть обычные типы значения, так что для полного копирования одного массива в другой можно просто написать a := b. Что касается строк, то для работы с ними есть уже встроенные механизмы.
M>>Только посмотрев в описание модулей можно понять, что Out.Ln — процедура, а Display.get — это переменная
AVC>В Обероне это легко (ИМХО) определяется по контексту. AVC>Вызов "чистой" процедуры — всегда отдельный оператор. AVC>Процедуры-функции используются в выражениях и именно поэтому требуют скобок, даже если у них нет параметров. AVC>Переменная используется либо как левая часть оператора присваивания, либо в выражении, но никогда "сама по себе", поэтому ее не спутаешь с процедурой.
[skip ebnf]
AVC>Мне кажется, что вызов процедуры-функции должен упоминаться не в операторе (statement), а в выражении (expression). AVC>Скорее всего — в множителе (factor). AVC>Но я еще подумаю.
Only one value, however, can be returned as the result of a function. This value, moreover, cannot be of a structured type.
[skip]
M>>На самом деле меня интересовал (в этой подветке) всего один вопрос — почему недопустимо более одной точки выхода из циклов FOR и WHILE в Обероне и почему необходимо было вводить цикл LOOP (он уже нарушает принцип структурного программирования Дейкстры).
AVC>Я это обдумаю. AVC>До сих пор я воспринимал "одну точку выхода" так: в данной процедуре после выхода из цикла (а также IF или CASE) мы можем оказаться толькой в одной точке программы — сразу после этого цикла. Если цикл был с предусловиеи, то в точке сразу после него оно будет обязательно ложным. Если цикл был с постусловием, оно обязательно будет истинным. Ну, а если был LOOP (выход из тела цикла) — то смотри в оба!
Если честно, то не понимаю я такого ограничения на while и for.
AVC>>>Можете рассматривать это как "открытое письмо". M>>
AVC> AVC>Я ни в коем случае не хотел Вас обидеть. Я обратился лично к Вам именно потому, что был уверен, что Вы поймете меня правильно.
AVC>Просто, как мне показалось, вчера дело зашло слишком далеко. AVC>Добрался ночью до Инета — и о ужас! По первому впечатлению я воспринял ситуацию как травлю и пинание ногами.
Это я вчера злой и голодный был
AVC>Вот я и выбрал, ИМХО, самого разумного и спокойного оппонента, чтобы высказать свое "фэ". AVC>Разумеется, я никоим образом не хотел сказать, что сторонники Оберона всегда правы, а его противники всегда неправы. AVC>За год дискуссий на RSDN я многое понял только благодаря критике. AVC>Потому и участвую в здешних дискуссиях (иногда перерастающих в побоища ), хотя некоторые (уважаемые мной) люди удивляются этому. Говорят, в частности, что язык программирования как религия — никто никого не переубедит. Я же хочу испытать некоторые идеи (и не думаю "насаждать" Оберон "огнем и мечом"), так что мне критика только полезна.
"В споре рождается истина", как говорится. Правда, мы и в самом деле немного офанатели с этими языками.
AVC>Но вчера... уж я сам, каюсь, язвительный , но вы, ребята, просто поставили мировой рекорд какой-то...
Как мне кажется (это не попытка оправдаться, ни в коем случае), что произошло вот что. Была попытка указать на некий факт. Просто на факт. Даже с обоснованием этого факта, пускай, возможно, не до конца корректным. Но воспринята была эта попытка крайне отрицательно, с таким подходом — "мол, ты что нас за детей считаешь?" И понеслось.
С одной стороны — да, сами предоставленные факты были не то, чтобы неубедительны, но преподнесены, как минимум, неправильно, имхо. Но и мы тоже хороши
Кстати, я, по-моему, только сейчас понял ту идею, которую хотел донести Сергей, когда он начинал говорить об оверхеде. А именно то, что он указал гораздо позже. А именно:
* a * b * c * d * e
где, исключая пробелы, "*" — это служебные лексемы.
А ведь действительно, с именно таким синтаксисом сложнее допустить ошибку при написании программы:
while(i != 0)
do_sth();
do_sth2();
WHILE i # 0
do_sth;
do_sth2;
во втором случае глаз сразу натыкается на отсутсвие лексем. А если это еще и компилятором обрабатывается, то вообще красота. Ну а мы помчались в другую сторону.
Q>> Хочу знать: зачем это мне, программисту.
СГ>Для того чтобы составлять алгоритмы грамотно.
Я же просил без указаний на то, что это требует какая-то парадигма программирования. Если из цикла есть выход по брейку, то из этого вовсе не следует, что алгоритм составлен неграмотно. В конце концов в Обероне ввели LOOP именно потому, что бывают случаи, когда без этого не обойтись (в отличие, например, от goto, без которого обойтись можно, но путем усложнения программы).
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Здравствуйте, AVC, Вы писали:
AVC>Видели бы вы все себя со стороны! AVC>Попробуйте сами объяснить для себя присутствие столь многих и столь заведомо необъективных и даже откровенно злых людей на этом форуме, если эта тема так им неинтересна, если Оберон — такой уж плохой язык? AVC>Можете рассматривать это как "открытое письмо".
Да бог с ними, Оберонами и Сиплюсплюсами. Дело не в них. Дело в том, как автор ветки ведёт дискуссию, какие аргументы приводит и как отвечает на прямо поставленные вопросы. Большинству здесь, ИМХО, не особенн-то интересна разница в этих языках, а оверхед и подавно. Личность автора ветки и его постинги — вот причина присутствия здесь "столь многих и столь заведомо необъективных и даже откровенно злых людей". Так что, обратившись лично к Mamut'у, Вы обратились не по адресу. Именно автор ветки своим неуважительным отношением к собеседникам, некомпетентностью и претензией на абсолютную истину заводит участников форума и заставляет их быть "необъективными и злыми", а не наоборот. Вот и всё объяснение.
Предложите автору ветки посмотреть на себя со стороны.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, jazzer, Вы писали:
J>>А в Обероне эти ассерты насильно впаривает компилятор, даже если они тебе здесь нафиг не нужны
СГ>Это Вы погорячились. После WHILE или REPEAT их впаривать просто не зачем, математика рулит...
А Вы невнимательно прочитали мое сообщение.
Их туда впаривает сама грамматика языка, не давая мне их нарушить по определению этой самой грамматики.
Даже если эти ассерты мне не нужны.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, jazzer, Вы писали:
J>>Правильно, не надо быть прорицателем, надо книжку почитать. J>>В 1979 году у Страуструпа уже была степень Ph.D., защищенная в Кембридже. J>>http://www.research.att.com/~bs/bio.html
J>>В 78-м году он начал работу по использованию идиом Симулы в С. J>>И это был "С с классами", а не С++, которым мы пользуемся сейчас. J>>Это был даже не С++, каким он был в 83-м.
СГ>Я и имел в виду Си с классами, который он начал изобретать будучи аспирантом. Название "С++" появилось позже.
Только вот не название, а язык.
С++ — это не С с классами, так же как Оберон — не Паскаль.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>while(true) = LOOP
Типа глупые сиплюсплюсники сами этого не видят?
И что, while от этого стал какой-то особенной инструкцией С++? Или смысл LOOP от этого поменялся? Или это как-то влияет на парадигму структурного программирования? Или это очередной тык пальцем в небо? Или что вы хотели этим сказать? Поясните.