Здравствуйте, Sergey, Вы писали:
S> в паскалевском пиши
Синтаксис языка Паскаль устарел более чем 25 лет тому назад и он мало чем в этом смысле отличается от Си-образного сиснтаксиса "begin" = "{", "end" = "}". То есть синтаксис Си тоже устарел более чем 25 лет тому назад.
Приведенный мной синтаксис есть синтаксис языков Modula/Oberon (используется с середины 1970-тых годов).
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Где-то в середине 1970-тых годов был открыт реально необходимый и достаточный синтаксис (Modula-2, 1979 год) СГ>
СГ>WHILE a DO x; y; z END
СГ>
СГ>Обратите внимание: слово "BEGIN" отсутствует вообще во всех инструкциях — оно лишнее.
Hello, Сергей!
You wrote on Thu, 09 Jun 2005 10:05:56 GMT:
СГ> Упомянутый Вами синтаксис устарел более чем двадцать пять лет тому СГ> назад.
СГ> Где-то в середине 1970-тых годов был открыт реально необходимый и СГ> достаточный синтаксис (Modula-2, 1979 год)
СГ> WHILE a DO x; y; z END
СГ>
СГ> Обратите внимание: слово "BEGIN" отсутствует вообще во всех инструкциях СГ> — оно лишнее.
while (a) x, y, z;
With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>1) Известно, что...
Анонимный источник, близкий к правительству сообщает...
СГ>2) Известно, что стандарты оформления Си-образного кода требуют использования большего количества строчек чем это реально необходимо
Стандарты есть разные, Вы о каком их них?
СГ>синтаксический оверхед = a/b = c
Чтобы не возвращаться к этому впоследствии, скажу, что простой подсчёт количества лексем, включая сюда все скобочки, малоосмыслен. Фишка синтаксиса в удобном восприятии, а лишняя пара скобок практически никогда этому не мешает — они маленькие
Цикл с проверкой условия в начале итерации
while(a) x();
Я предпочитаю выносить x() на отдельную строку, чтобы было удобно ставить breakpoint. Для Виртовских языков это тоже актуально, кстати.
Цикл с проверкой условия в середине итерации
Если уж мы взялись оптимизировать кол-во строчек (занятие почти бессмысленное, но тем не менее...), то никто ничего не теряет от помещения открывающей скобки на одну строку с предваряющей конструкцией.
while(true) {
x();
if(a) {
y();
break;
}
z();
}
СГ>
СГ>LOOP
СГ> x;
СГ> IF a THEN y; EXIT END;
СГ> z
СГ>END
СГ>
В Вашем синтаксисе неясно, что "y" это вызов функции. Если эта функция принимает параметры, то скобочки и в Обероне потребуются. Новые перерасходы считайте сами.
Цикл с проверкой условия в конце итерации
do x(); while(a);
Инструкция выполнения по условию
if(a) x();
Инструкция выполнения по условию с альтернативой
if(a)
x();
else
y();
Сложная инструкция выполнения по условию
if(a)
x();
else if(b)
y();
else
z();
Здесь я не стал вытягивать оператор в одну строку, но порекомендовал бы и d Обероне разбить его на три. Для наглядности.
Инструкция выбора варианта выполнения
Реально необходимый и достаточный синтаксис:
CASE n OF
a: x |
b: y
ELSE z
END
Давайте всё-таки не будем громоздить спецсимволы один на другой и напишем красиво, тем более, что в реальном коде вместо x, y, z наверняка будет что-то помассивнее. А если записать в пять строк, явно видна асимметрия синтаксиса Оберона: каждая строка завершается по-своему.
Я везде поубирал в примерах лишние {} и предвижу возражение: мол, если действия будут сложнее x(), y(), z(), то сишный синтаксис потребует лишних скобок, а обероновский — нет. На это я сразу отвечу, что тогда и в Обероне для наглядности потребуется перенос по строчкам, а пара скобочек в массе кода просто визуально потеряется. Пример (скопировал кусок отлаживаемого кода):
"Оберонообразный" (сорри, выражения внутри я не преобразовал, не знаю, как; скажу спасибо, если кто-то это за меня сделает)
IF a THEN
ItemIndex.Index = atoi( Buff.POSTINDEX );
ItemIndex.IndexState = ItemIndex.Index == 0 ? INDEX_UNKNOWN : INDEX_EXACT;
Syncronize( ItemIndex );
ELSE
ItemIndex.IndexState =
Buff.FLAGS & ADDR_FLAG_ACTUAL ? INDEXES_DIFFERENT : INDEX_UNKNOWN;
END
IF FirstItem THEN //...
Что видим? Те же 10 строк.
Ну и финальный плевок в Оберон — идентификаторы ЗАГЛАВНЫМИ буквами. Вот это напрягает втрое больше, чем все сишные скобочки вместе взятые — ну не ориентированы шрифты на то, чтоб подряд идущие заглавные хорошо читались! Те, кто рисуют шрифты добиваются того, чтобы строчные буквочки плавно взглядом воспринимались, а на заглавных взгляд чтобы наоборот — спотыкался.
Резюме
Синтаксис языка C++ (Java, C#...) возможно страдает некоторой избыточностью, но её масштабы сильно преувеличены в исходном сообщении. Вопрос удобочитаемости остаётся открытым — люди, уже знакомые с сишным синтаксисом как правило не испытывают ни малейших затруднений в чтении программ, данных про Оберон не имею, полагаю, ситуация та же. Компактность кода (измеряемая в количестве лексем или символов), как таковая, является сомнительным приоритетом, никак не обосновано то, что буквы надо экономить. Количество строк более обоснованный критерий, ибо когда функция/алгоритм занимаешь меньше места (а особенно, если целиком влазит на экран), он проще понимается, "охватывается одним взглядом". Однако для этого нужно брать какой-то реальный код и сравнивать его (как сделал я в примере выше и который не показал никаких преимуществ Оберона). Отдельные синтаксические конструкции тут роли не играют.
Берёшься сравнивать — сравнивай добросовестно. Мы технари, а не рекламисты. Imho.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Курилка, Вы писали:
К>>Т.е. на паскалеподобном языке не пишут промышленный код?
СГ>1) Не на Паскале подобном (он устарел более чем двадцать пять лет назад), а на Modula/Oberon — подобном. СГ>2) Для разных языков общепринятые способы оформления текста — разные. Для Си-образного языка, я насчитал оверхед по оформлению в 700 процентов по сравнению с минимально возможным.
Ну дак пиши на K тогда, что мозги-то компостировать?
Здравствуйте, Сергей Губанов, Вы писали:
СГ>2) Для разных языков общепринятые способы оформления текста — разные. Для Си-образного языка, я насчитал оверхед по оформлению в 700 процентов по сравнению с минимально возможным.
А причём тут СИ? Тогда речь идёт о общепринятых нормах оформления, но они почти во всех языках одинаковы — даже в ассемблере иногда можно сделать нечитаемой программу не поставив лишний cr (уж он то требует cr так же ка ";" Си)
Давайте тогда беседовать о новой модели синтаксиса, ведь Си только один из сотен языков с такой избыточностью. Нужно ещё доказать, что избыточность плохо влияет на качество кода (легко читаемый код содержит меньше ошибок и гораздо легче отлаживается). Давайте тогда и от коментариев откажемся (особенно в ассемблере, ха-ха).
Кострукции, которые Вы приводили, могут быть совершенно нечитаемы при длинных названиях.
Проводя аналогию, можно сказать что Вы хотите создать тензорное исчисление когда все пользуются векторным.
Здравствуйте, tarkil, Вы писали:
T>Берёшься сравнивать — сравнивай добросовестно. Мы технари, а не рекламисты. Imho.
По моему, количество строчек не имеет значения — одно нажатие клавиши и схватывается код легче. Т.о. нужно сначала смотреть, что сравниваешь, а то и получаются рекламные приёмы.
<...прочитано по диагонали из-за невозможности серьезного восприятия...>
СГ>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?
Спрашивается, а в чем смысл данного стенания?
ИМХО: подобная критика не конструктивна. Если тебе не нравится C/C++, то доказывай лучше реальные достоинства Modula/Oberon. Лично мне упертость в продвижении C# Влада (VladD2) импонирует гораздо больше, т.к. она очень часто конструктивна.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Privalov, Вы писали:
P>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Путаницы не возникает ни когда — любые две инструкции всегда разделяются разделителем.
P>
P>
P>WHILE a DO x; y; z END
P>
P>То есть здесь z и END — одна инструкция?
1) Можно ответить: Да! Семантика этой инструкции: "Выполнить z и перейти к началу цикла WHILE".
2) Можно ответить: END — это не инструкция, а часть составной инструкции WHILE DO END, ведь инструкции бывают как простыми так и составными.
Выбирайте что Вам больше нравится.
P>Да, а что там с доказательством того что P>
СГ>>Где-то в середине 1970-тых годов был открыт реально необходимый и достаточный синтаксис (Modula-2, 1979 год)
P>действительно необходимый и достаточный?
Это очень просто. При условии не наделять каким-либо дополнительным смыслом символы пробела, табуляции и новой строки кроме смысла и так натурально им присущим, все представленные в том сообщении отдельные инструкции являются минимально возможными.
Вот смотрите, заменим все служебные слова на символ "*"
REPEAT x UNTIL b = * x * b
WHILE a DO x END = * a * x *
IF a THEN x END = * a * x *
IF a THEN x ELSE y END = * a * x * y *
IF a THEN x ELSIF b THEN y ELSE z END = * a * x * b * y * z *
CASE n OF a: x | b: y ELSE z END = * n * a * x * b * y * z *
между каждой "пользовательской" лексемой стоит не более одной звездочки. Меньше одной звездочки поставить нельзя — мы договорились пробельные символы не перегружать. Значит минимум достигнут. А то что этого достаточно, следует из смысла рассматриваемых инструкций.
1. Спасибо Сергей. Объявляю от все общественности благодарность. Культуру в массу. Я только сейчас начал ощущать как надо писать на С++. Незнал, что обязательные фигурные скобки есть промышленный стандарт. Но теперь я прозрел. Теперь я просвещенный.
2. Если мы не будем говорить о "промышленных" стандартах, то С++ программа вполне может записываться в одну строку. Как собственно и многие языки. Только пользы от этого мало. По сети ходят большое количество программ на С++ из раздела угадай что она делает. И во многом их путанность основана именно на этом свойстве языка.
3. Джентельмены! Мы обсуждаем неправильные языки. Хлопая по клавишам, мы выполняем лишнюю работу. Истинный язык не С++ и даже не великий Оберон. Представляю наиболее гениальный язык. HQ9+. Например опишем в ней программу Hello World.
H
Видите насколько это изысканный язык. Как игра мысли! Какая великолепная структурированность. И ведь это не буква H (в переводе Х), это целая программа. Далее дам краткое описание языка:
The H command prints out "Hello, world!"
The Q command prints out a copy of the source code of the program (i.e., it's a quine).
The 9 command prints out the lyrics for 99 Bottles of Beer on the Wall.
The + command increments the accumulator.
http://en.wikipedia.org/wiki/HQ9_Plus
И по объему самого компилятора, он значительно меньше не только С++ с его либами, С# с его Framework. Он меньше чем даже Oberon.
HQ9+ interpreters are extremely simple to write, so there have been many written. For example, this HQ9+ interpreter was written (in Python) in around five minutes and is only 18 lines long. And, this HQ9+ compiler written in C compiles HQ9+ programs to C code and is only about 40 lines long.
Здравствуйте, tarkil, Вы писали:
T>В Вашем синтаксисе неясно, что "y" это вызов функции.
А это не вызов функции. Это вызов процедуры и ни чем другим быть не может. Спрашивается, почему это не вызов функции? А потому что в оберонах нельзя вызвать функцию и не сохранить куда-либо возвращаемое значение.
"value := y()" — вот это вызов функции.
"value := y" — вот это присвоение значения переменной value. В том случае если ее тип есть процедурный тип, то присваивается адрес процедуры y. А просто отдельно стоящее "y" безо всего однозначно обозначает только вызов процедуры.
T>идентификаторы ЗАГЛАВНЫМИ буквами. Вот это напрягает втрое больше, чем все сишные скобочки вместе взятые — ну не ориентированы шрифты на то, чтоб подряд идущие заглавные хорошо читались! Те, кто рисуют шрифты добиваются того, чтобы строчные буквочки плавно взглядом воспринимались, а на заглавных взгляд чтобы наоборот — спотыкался.
Совершенно согласен с тем, что шрифты семейсва Courier в заглавных буквах смотрятся не очень, а ведь именно они по умолчанию стоят в ряде популярных IDE. Однако, есть другие шрифты, например, Verdana — заглавные буквы выглядят очень красиво. Кстати, я у себя в MS Visual Studio 2003 поставил именно шрифт Verdana — совсем другой вид.
T>Берёшься сравнивать — сравнивай добросовестно. Мы технари, а не рекламисты. Imho.
Я добросовестно оформил текст примеров именно так как общепринято оформлять текст на языках Си и Modula/Oberon.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Я добросовестно оформил текст примеров именно так как общепринято оформлять текст на языках Си и Modula/Oberon.
Общепринятых стандартов в Сях не меньше трёх, Вы о каком? А по факту каждая компания собственный стандарт на код придумывает.
Остальное видимо, проигнорировано? И что нужны реальные примеры кода и зачем понадобилось экономить буквы и как всё изменится, если у процедур/функций появлятся параметры, что их имена обычно длиннее и что блоки кода чаще состоят не из одного вызова...
Здравствуйте, eao197, Вы писали:
E>ИМХО: подобная критика не конструктивна.
Если бы я просто сказал, что вот, в Си-образном синтаксисе используется больше лексем чем нужно, это было бы одно, а тут я сказал, что их используется не просто больше, а от двух до трех раз больше чем нужно. Привел числа. Даже среднее число вывел 235 процентов получил.
E> Если тебе не нравится C/C++
О языках, это совсем другая история. Я тут исключительно о синтаксисе. А на счет языков этих, так даже если бы был бы в них правильный синтаксис, то ...(а хотя ладно)...
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Совершенно согласен с тем, что шрифты семейсва Courier в заглавных буквах смотрятся не очень, а ведь именно они по умолчанию стоят в ряде популярных IDE. Однако, есть другие шрифты, например, Verdana — заглавные буквы выглядят очень красиво. Кстати, я у себя в MS Visual Studio 2003 поставил именно шрифт Verdana — совсем другой вид.
Вообще-то неудобочитаемость заглавных букв — свойство любого шрифта. Пробую Вердану... попробовал — те же шары, только фиолетовые. Да, заглавные буквы выделяются, их проектируют так — чтоб начало предложения хорошо видно было и хотелось сделать паузу... (а может мы привыкли, что на заглавных буквах надо делать паузу, потому что это начало предложения — фиг знает). Так или иначе, но читать их подряд неприятно.
Наверное, можно придумать особый шрифт для набора программ, где заглавные буквы будут иметь тот же вид, что и строчные, только крупнее... Но смысл?!
Здравствуйте, Cyberax, Вы писали:
C>Кстати, если рассуждать о синтаксической избыточности, то зачем в C>Обероне/Паскале абсолютно ненужные лексемы: C>procedure C>function C>var C>do C>to, downto C>... C>А?
В Modula/Oberon ни одно из указанных Вами слов не присутсвует. До Паскаля мне дела нет, он устарел давным давно.
[кусь] СГ>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?
Rfr бы я ни любил Паскаль, и как бы я неприязненно не относился к С, должен сказать, что в данном примере Pascal-style код зря написан в одну строку. для читабельности это также разносится на несколько строк. имхо. в остальном — согласен. хотя это конечно дело вкуса
P>>То есть здесь z и END — одна инструкция?
СГ>1) Можно ответить: Да! Семантика этой инструкции: "Выполнить z и перейти к началу цикла WHILE". СГ>2) Можно ответить: END — это не инструкция, а часть составной инструкции WHILE DO END, ведь инструкции бывают как простыми так и составными.
x тоже часть составной инструкции, однако ";" после нее стоит.
СГ>Выбирайте что Вам больше нравится.
Мне нравится, когда ";" является частью инструкции, а не разделителем между ними.
СГ>Это очень просто. При условии не наделять каким-либо дополнительным смыслом символы пробела, табуляции и новой строки кроме смысла и так натурально им присущим, все представленные в том сообщении отдельные инструкции являются минимально возможными.
СГ>Вот смотрите, заменим все служебные слова на символ "*" СГ>
СГ>REPEAT x UNTIL b = * x * b
СГ>WHILE a DO x END = * a * x *
СГ>IF a THEN x END = * a * x *
СГ>IF a THEN x ELSE y END = * a * x * y *
СГ>IF a THEN x ELSIF b THEN y ELSE z END = * a * x * b * y * z *
СГ>CASE n OF a: x | b: y ELSE z END = * n * a * x * b * y * z *
СГ>
СГ>между каждой "пользовательской" лексемой стоит не более одной звездочки. Меньше одной звездочки поставить нельзя — мы договорились пробельные символы не перегружать. Значит минимум достигнут. А то что этого достаточно, следует из смысла рассматриваемых инструкций.
Вместо REPEAT можно использовать WHILE, а вместо CASE — IF / ELSEIF / ELSE /END. Потому их можно выбросить => необходимость не доказана. О достаточности я пока молчу.
Здравствуйте, Drago, Вы писали:
D>Здравствуйте, Сергей Губанов, Вы писали:
D>[кусь] СГ>>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?
D>Rfr бы я ни любил Паскаль, и как бы я неприязненно не относился к С, должен сказать, что в данном примере Pascal-style код зря написан в одну строку. для читабельности это также разносится на несколько строк. имхо. в остальном — согласен. хотя это конечно дело вкуса
Не Паскаль это, а Modula/Oberon.
Если текст короткий, то он пишется в одну строчку, а если длинный, то естественно в несколько строчек.
Кроткий:
IF a THEN x ELSE y END
Длинный:
IF aabababbabababababbaba THEN
xqwghcqhbwehqhgwbehjbdcqkjwbefkycgvrqe(wkjehfjke, kwfbwer, kwefb)
ELSE
yjwejhdbwjebdhwwhjebhbweb(wefbuiweicfuiuwbnceu, wibecibweibciwwe)
END