Re[11]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 23.06.05 10:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Правильно, не надо быть прорицателем, надо книжку почитать.

J>В 1979 году у Страуструпа уже была степень Ph.D., защищенная в Кембридже.
J>http://www.research.att.com/~bs/bio.html

J>В 78-м году он начал работу по использованию идиом Симулы в С.

J>И это был "С с классами", а не С++, которым мы пользуемся сейчас.
J>Это был даже не С++, каким он был в 83-м.

Я и имел в виду Си с классами, который он начал изобретать будучи аспирантом. Название "С++" появилось позже.
Re[17]: Яркий пример
От: AVC Россия  
Дата: 23.06.05 10:37
Оценка: 1 (1)
Здравствуйте, Mamut, Вы писали:

M>>>Просьба к коду не придираться


AVC>>Да Бог с ним, с кодом; какая разница, ведь Вы просто не знаете языка.

AVC>>И в Си++, и в Обероне в данном случае сравниваются переменные.
AVC>>И вызов функции, и ее определение требуют круглых скобок, даже если функция вызывается без параметров.

M>О! Я этого не знал, но! Нигде (ни в постах Сергея, например, ни даже в примерах на ETH) не указано такое требование.


M>Например

M>


M>PROCEDURE PrintGadget*;
M>VAR S: Display.SelectMsg; P: Display.DisplayMsg; obj: Objects.Object;
M>BEGIN
M>  Printer.Open("LPT1", "");
M>  Out.String("Printing gadget"); Out.Ln;
M>  S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
M>  Display.Broadcast(S);
M>  IF (S.time > 0) & (S.obj # NIL) THEN
M>    obj := S.obj;
M>    P.device := Display.printer; P.id := Display.contents; P.F := obj(Display.Frame);
M>    P.res := -1;
M>    Display.Broadcast(P);
M>  END
M>END PrintGadget;
M>


M>Только посмотрев в описание модулей можно понять, что Out.Ln — процедура, а Display.get — это переменная


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

M>Более того, в EBNF Оберона записано следующее:

M>
M>...
M>statement  =  [assignment | ProcedureCall | 
M>    IfStatement | CaseStatement | WhileStatement | RepeatStatement | 
M>    LoopStatement | WithStatement | EXIT | RETURN [expression] ].
M>...
M>ProcedureCall  =  designator [ActualParameters].
M>


M>То есть скобки не нужны при вызове


Мне кажется, что вызов процедуры-функции должен упоминаться не в операторе (statement), а в выражении (expression).
Скорее всего — в множителе (factor).
Но я еще подумаю.

AVC>>В Си++, например, напротив, конструктор без параметров не должен иметь скобок, чтобы компилятор не принял его за прототип функции.

AVC>>Понимаете, в чем закавыка. Я программирую как на Си++, так и на Обероне. (Оберон мне нравится больше, но для того, что я хочу Вам сказать, это не имеет значения.)
AVC>>В то же время ни Вы, ни большинство других "оппонентов" (какими они зачастую себя только воображают) Оберона не знают и на нем не пишут.

M>


AVC>>Отсюда беспрерывные "откровения" вроде Вашего (со сравнением переменных) или уж откровенно глупого "оказывается, в Обероне есть BEGIN!!!". О перлах вроде "мне нас**ть на принципы структрного программирования" я уж и не говорю.


M>Ну, на принципы эти мне не неср*ть в общем случае Дело в том, что слишком часто от того же принциа "одна точка входа — одна точка выхода" необходимо отходить, потому что следование ему приводит к усложнению программы.


M>На самом деле меня интересовал (в этой подветке) всего один вопрос — почему недопустимо более одной точки выхода из циклов FOR и WHILE в Обероне и почему необходимо было вводить цикл LOOP (он уже нарушает принцип структурного программирования Дейкстры).


Я это обдумаю.
До сих пор я воспринимал "одну точку выхода" так: в данной процедуре после выхода из цикла (а также IF или CASE) мы можем оказаться толькой в одной точке программы — сразу после этого цикла. Если цикл был с предусловиеи, то в точке сразу после него оно будет обязательно ложным. Если цикл был с постусловием, оно обязательно будет истинным. Ну, а если был LOOP (выход из тела цикла) — то смотри в оба!

AVC>>Можете рассматривать это как "открытое письмо".

M>


Я ни в коем случае не хотел Вас обидеть. Я обратился лично к Вам именно потому, что был уверен, что Вы поймете меня правильно.
Просто, как мне показалось, вчера дело зашло слишком далеко.
Добрался ночью до Инета — и о ужас! По первому впечатлению я воспринял ситуацию как травлю и пинание ногами.
Вот я и выбрал, ИМХО, самого разумного и спокойного оппонента, чтобы высказать свое "фэ".
Разумеется, я никоим образом не хотел сказать, что сторонники Оберона всегда правы, а его противники всегда неправы.
За год дискуссий на RSDN я многое понял только благодаря критике.
Потому и участвую в здешних дискуссиях (иногда перерастающих в побоища ), хотя некоторые (уважаемые мной) люди удивляются этому. Говорят, в частности, что язык программирования как религия — никто никого не переубедит. Я же хочу испытать некоторые идеи (и не думаю "насаждать" Оберон "огнем и мечом"), так что мне критика только полезна.
Но вчера... уж я сам, каюсь, язвительный , но вы, ребята, просто поставили мировой рекорд какой-то...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[7]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 23.06.05 10:39
Оценка:
Здравствуйте, qwertyuiop, Вы писали:

Q> Хочу знать: зачем это мне, программисту.


Для того чтобы составлять алгоритмы грамотно.
Re[18]: Яркий пример
От: Privalov  
Дата: 23.06.05 10:40
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Его можно использовать для математического доказательства правильности алгоритмов. Об этом говорилось в самом начале (верификация).


Вас еще там же просили что-нибудь верифицировать в качестве примера, как можно обойтись без отладки. И что, вышло что-нибудь? Если у Вас затруднения с примерами, то вот подсказка: в книге Вирта "Алгоритмы + структуры данныхь их полно. а то, что они все на Модуле-2, у Вас не должно вызывать затруднений — синтаксис-то правильный.
Re[10]: Короче
От: Socrat Россия  
Дата: 23.06.05 10:41
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Кстати, можно усовершенствовать:


СГ>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
Re[12]: Так Вы определитесь
От: Privalov  
Дата: 23.06.05 10:44
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Amidlokos, Вы писали:


A>> Однако имеет смысл только для одной проверки. Ну двух. А если точек выхода десяток (по найденному, по обнаруженному битому, срочно по переключению мютекса и т.п.)?


СГ>Так Вы определитесь, что конкретно нужно. Приведите конкретный пример. Чтобы потом без всяких там, а вот если бы да кабы, то в носу бы выросли грибы...


Если Вы когда-нибудь писали что-то реальное, таких примеров у Вас самого должно хватать.
Re[9]: Синтаксический оверхед
От: Socrat Россия  
Дата: 23.06.05 10:44
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, alexku, Вы писали:


A>>В этом вашем примере assert(n <= -1) совершенно не имеет смысла, потому что значение n предсказуемо на 100% и всегда будет равно -1.


СГ>Это было бы так если бы использовался Modula/Oberon в которых из цикла WHILE нельзя выйти ни каким другим способом. В С# же был выход по break. Поэтому значение n на реальных данных всегда было больше нуля, а не то что больше -1. Ошибку я нашел просто случайно поглядев на исходник, а вовсе не от того что программа упала (она не падала) и я залезши в дебагер стал там чего-то крутить.


А я вообще не понял смысл такой проверки. Или ты забыл присвоить новое значение после цикла?
Re[18]: Яркий пример
От: alexku Россия  
Дата: 23.06.05 10:52
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:


СГ>Вы путаете процедуру с процедурой-функцией.


А вы путаете божий дар с яичницей.

IF oneItem # anotherItem THEN


Где в этом коде гарантия того, что я сравниваю значения переменных а не адреса процедур?
Re[11]: Синтаксический оверхед
От: Пацак Россия  
Дата: 23.06.05 10:53
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Это Вы погорячились. После WHILE или REPEAT их впаривать просто не зачем, математика рулит...


Логика тоже рулит: их и в C++ впаривать незачем, ибо состояние условия цикла после его завершения никого уже совершенно не волнует.
Ку...
Re[11]: Open source
От: Sergey J. A. Беларусь  
Дата: 23.06.05 10:55
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

SJA>>Да-да. Совершенно тривиальное. Авторы отчаялись его кому-нибудь впарить, и открыли коды. Думали наверное кого-то завлечь беплатным сыром...


СГ>Да не бесплатности объяснение, а объяснение почему сборщик мусора в BlackBox работает в несколько раз быстрее чем сборщик мусора в .NET.


Ну ничего. Значит я привёл объяснение бесплатности. В случе чего буду приводить цитату на свой пост.
Я — свихнувшееся сознание Джо.
Re[9]: Синтаксический оверхед
От: Sergey J. A. Беларусь  
Дата: 23.06.05 10:55
Оценка: 1 (1) +2
Здравствуйте, Сергей Губанов, Вы писали:

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, как положено, а лажа — та же....
Я — свихнувшееся сознание Джо.
Re[9]: Копирование чисел
От: Пацак Россия  
Дата: 23.06.05 11:12
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:


СГ>Кроме того, код while (*a++ = *b++); вообще писать нельзя так как он не проверяет выход за границы


Кто вам сказал? Вы знаете какого типа a и b? Знаете как перегружены в них операторы инкремента?

СГ>С другой стороны, массивы в Pascal/Modula/Oberon это есть обычные типы значения, так что для полного копирования одного массива в другой можно просто написать a := b. Что касается строк, то для работы с ними есть уже встроенные механизмы.


Ага. Если a и b — это массив или строка. Чего в общем-то из данного куска кода никак не следует.
Ку...
Re[9]: Копирование чисел
От: Socrat Россия  
Дата: 23.06.05 11:13
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, 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. Что касается строк, то для работы с ними есть уже встроенные механизмы.


В С++ тоже кое-что имеется...
Re[18]: Яркий пример
От: Mamut Швеция http://dmitriid.com
Дата: 23.06.05 11:24
Оценка: 3 (1) +2
M>>Только посмотрев в описание модулей можно понять, что Out.Ln — процедура, а Display.get — это переменная

AVC>В Обероне это легко (ИМХО) определяется по контексту.

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

[skip ebnf]

AVC>Мне кажется, что вызов процедуры-функции должен упоминаться не в операторе (statement), а в выражении (expression).

AVC>Скорее всего — в множителе (factor).
AVC>Но я еще подумаю.

В EBNF идет вот так:
assignment  =  designator ":=" expression.
designator  =  qualident {"." ident | "[" ExpList "]" | "(" qualident ")" | "^" }.
qualident  =  [ident "."] ident.
ident  =  letter {letter | digit}.
ExpList  =  expression {"," expression}. 
expression  =  SimpleExpression [relation SimpleExpression]
SimpleExpression  =  ["+"|"-"] term {AddOperator term}.
term  =  factor {MulOperator factor}. 
factor  =  number | CharConstant | string | NIL | set | 
    designator [ActualParameters] | "(" expression ")" | "~" factor.
ActualParameters  =  "(" [ExpList] ")".


То есть максимум, что отсюда получается, это designator := designator [([ExpList])]. В другой документации об этом ничего, вроде, не говорится.

Кстати, вопрос, как можно понять следующую фразу из Programming in Oberon:

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;


во втором случае глаз сразу натыкается на отсутсвие лексем. А если это еще и компилятором обрабатывается, то вообще красота. Ну а мы помчались в другую сторону.

Ндаааа... Вот такие мы злобные буратины...


dmitriid.comGitHubLinkedIn
Re[8]: Синтаксический оверхед
От: qwertyuiop Российская Империя  
Дата: 23.06.05 11:31
Оценка: +1
Q>> Хочу знать: зачем это мне, программисту.

СГ>Для того чтобы составлять алгоритмы грамотно.


Я же просил без указаний на то, что это требует какая-то парадигма программирования. Если из цикла есть выход по брейку, то из этого вовсе не следует, что алгоритм составлен неграмотно. В конце концов в Обероне ввели LOOP именно потому, что бывают случаи, когда без этого не обойтись (в отличие, например, от goto, без которого обойтись можно, но путем усложнения программы).
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Re[16]: Яркий пример
От: alexku Россия  
Дата: 23.06.05 11:36
Оценка: +4
Здравствуйте, AVC, Вы писали:

AVC>Видели бы вы все себя со стороны!

AVC>Попробуйте сами объяснить для себя присутствие столь многих и столь заведомо необъективных и даже откровенно злых людей на этом форуме, если эта тема так им неинтересна, если Оберон — такой уж плохой язык?
AVC>Можете рассматривать это как "открытое письмо".

Да бог с ними, Оберонами и Сиплюсплюсами. Дело не в них. Дело в том, как автор ветки ведёт дискуссию, какие аргументы приводит и как отвечает на прямо поставленные вопросы. Большинству здесь, ИМХО, не особенн-то интересна разница в этих языках, а оверхед и подавно. Личность автора ветки и его постинги — вот причина присутствия здесь "столь многих и столь заведомо необъективных и даже откровенно злых людей". Так что, обратившись лично к Mamut'у, Вы обратились не по адресу. Именно автор ветки своим неуважительным отношением к собеседникам, некомпетентностью и претензией на абсолютную истину заводит участников форума и заставляет их быть "необъективными и злыми", а не наоборот. Вот и всё объяснение.

Предложите автору ветки посмотреть на себя со стороны.
Re[16]: Яркий пример
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.05 11:39
Оценка: :)
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Cyberax,


СГ>while(true) = LOOP


Т.е. по окончании цикла true превратится в false??? ;)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: Синтаксический оверхед
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.05 11:44
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, jazzer, Вы писали:


J>>А в Обероне эти ассерты насильно впаривает компилятор, даже если они тебе здесь нафиг не нужны


СГ>Это Вы погорячились. После WHILE или REPEAT их впаривать просто не зачем, математика рулит...


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

В программировании рулит гибкость.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[12]: Синтаксический оверхед
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.05 11:47
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, jazzer, Вы писали:


J>>Правильно, не надо быть прорицателем, надо книжку почитать.

J>>В 1979 году у Страуструпа уже была степень Ph.D., защищенная в Кембридже.
J>>http://www.research.att.com/~bs/bio.html

J>>В 78-м году он начал работу по использованию идиом Симулы в С.

J>>И это был "С с классами", а не С++, которым мы пользуемся сейчас.
J>>Это был даже не С++, каким он был в 83-м.

СГ>Я и имел в виду Си с классами, который он начал изобретать будучи аспирантом. Название "С++" появилось позже.


Только вот не название, а язык.
С++ — это не С с классами, так же как Оберон — не Паскаль.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[16]: Яркий пример
От: alexku Россия  
Дата: 23.06.05 11:49
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>while(true) = LOOP


Типа глупые сиплюсплюсники сами этого не видят?
И что, while от этого стал какой-то особенной инструкцией С++? Или смысл LOOP от этого поменялся? Или это как-то влияет на парадигму структурного программирования? Или это очередной тык пальцем в небо? Или что вы хотели этим сказать? Поясните.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.