Здравствуйте, Пацак, Вы писали:
П>Итого: П>лексем — 24 П>строк кода — 12 П>символов (не считая отступов) — 236
(скип)
П>Итого: П>лексем — 33 П>строк кода — 9 П>символов (не считая отступов) — 175
(скип)
Ну и до кучи уж тогда:
Python:
while not end_of_stream:
read_socket()
if checksum == fails:
raise_hacker_alert()
break
if number_of_bytes_read() > MAX_DATA_ALLOWED: break
process_data()
Итого:
лексем — 19
строк кода — 7
символов (не считая отступов) — 160
Не учитывать отступы при подсчете символов в питоновском коде несколько некорректно, но так же некорректно не учитывать пробелы в обероновском или сишном коде. Далее, если посмотреть внимательнее, то можно обнаружить, что в принципе питоновский синтаксис можно еще более упростить, избавившись от ":" при условных операторах и от "()" при вызовах функций (как это сделано в нашем любимом обероне). Получим "усовершенствованный питон":
while not end_of_stream
read_socket
if checksum == fails
raise_hacker_alert
break
if number_of_bytes_read>MAX_DATA_ALLOWED break
process_data
Итого:
лексем — 8
строк кода — 7
символов (не считая отступов) — 147
"Звездочная диаграмма" кода получится примерно такая: (* — лексема, i — идентификатор)
* i i * i * i i * * i * i * i
О каком "минимализме" и "оптимальности" оберона мы еще говорим?
AVC>Она означает, что пока выполняется условие p, из цикла мы не выйдем. Следовательно, после выхода из цикла и перед выполнением Q обязательно выполняется условие ~p.
AVC>А вот в программе на Си/Си++ в аналогичной ситуации AVC>while (p) { ... } Q(); AVC>мы в этом не можем быть уверены
Да задолбали вы уже этой уверенностью! Ну уверены вы, что p после цикла ложно, и какая великая польза от этого? Чем это облегчает жизнь программисту? Кроме дурацких ограничений и отсутствия гибкости не вижу никаких отличий. Чтобы можно было выйти из цикла досрочно, введен новый тип цикла: бесконечный. Но бесконечных циклов не бывает — иначе они бы никогда не закончились. Так не проще ли разрешить досрочный выход из любых циклов и не вводить в язык новый тип который не имеет никаких принципиальных отличий от остальных?
Ведь, по большому счету, циклы могут быть только двух типов: с проверкой условия в начале его (наиболее частый) и с проверкой условия в конце (для экзотических случаев, когда нужно чтобы тело цикла выполнилось хотя бы один раз). Остальное — в т.ч. бесконечные циклы — лишь частные случаи этих двух.
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Здравствуйте, xBlackCat, Вы писали:
P>>А почему? Если a[i]<0, то i с N сравниваться уже не будет. Сэкономим пару тактов. Хотя может я не вижу чего. Устал...
BC>Если N — это длина массива, то при i = N вначале вылетит ошибка и до проверки i < N не дойдёт. Вот и всё
Таки устал вчера. На самом деле всегда сначала пишу i<N. Зато кое у кого повод высказаться появится.
Здравствуйте, moudrick, Вы писали:
M>Я вам могу сказать, какие приоритетные принципы у C++. M>1. Поддержка максимального количества парадигм программирования (в том числе и структурного) здесь
И все из них поддерживаются кое-как. M>2. Поддержка Legacy кода здесь
Написанного по большей части на C++
Здравствуйте, Сергей Губанов, Вы писали:
П>>Ну и где хваленое превышение в разы? СГ>33/24 = 1.375 СГ>12/9 = 1.3333 СГ>Тоже не хилый оверхедец.
Ага, причем в двух случаях — в пользу C++ и только в одном — в пользу оберона
СГ>А если переписать си-образный код так как положено по общепринятым стандартам кодирования в промышленном программировании —
фигурные скобки в любом случае и на новой строке, то и без того не хилый оверхедец возрастет еще.
нет такого "общепринятого стандарта". Если так принято в вашей конкретной фирме — это конкретно ваша головная боль.
Вот что получается после запуска indent -kr b.cpp:
while (!end_of_stream) {
read_socket();
if (checksum == fails) {
raise_hacker_alert();
break;
}
if (number_of_bytes_read() > MAX_DATA_ALLOWED)
break;
process_data();
}
Итого:
лексем — 33
строк кода — 10
символов (не считая отступов) — 176
Здравствуйте, Mr. None, Вы писали:
MN>Не корректный вопрос... Сударь не позорьте сообщество программистов на C++, а то нас всех обвинят ещё и в некомпетентности . Если следовать доказательству теоремы о структурировании, то поступить надо так: MN>Это был не наезд — обидеть не хотел . Просто попытка вас поправить (не всем довелось изучать эту чудную теорему ).
Спасибо. Я, собственно, не пытался доказать, что без break/goto нельзя обойтись. Но делать это ИМХО столь же целесообразно, как, скажем, избавляться от for(;) только из-за того, что его можно заменить while. Парадигма-парадигмой, но и об удобстве забывать не стоит.
Здравствуйте, moudrick, Вы писали:
M>Что, и сборку мустора будем на Оберонах писать? Успехов... покажите только потом исходники, посмеемся вместе.
А на чем она написана?
Здравствуйте, qwertyuiop, Вы писали:
Q>Я часто проверяю условие p именно с целью узнать, как произошел выход из цикла: по брейку или "мирным путем".
Теперь понятно, почему с++программисты так озабочены отладчиками и средствами рефакторинга.
Mamut wrote: > Стена на стенку идут оберонцы и сишники. В них кидаются камнями и > прочими бутылками с зажигательной смесью приверженцы перла, лиспа и > ассемблера.
Паскалисты и схемеры радостно смотрят на поредение толп конкурентов...
> Ядерный Армагеддон. Все умерли
Так просто не отделаетесь.. Австралия останется. В ней беглые любители
sed наконец построят свой, новый мир программирования... Вместе с
bf-щиками...
Здравствуйте, AVC, Вы писали:
AVC>Все это замечательно, но... неверно. AVC>(Наверное, я должен добавить "ИМХО"? ) AVC>Цикл LOOP ничего не "обещает" читателю программы. Он введен для особых ситуаций, где применение WHILE и REPEAT вызывает затруднения. В основном это обработчики прерываний и операции ввода/вывода.
То есть Вы допускаете, то не все циклы должны завершатся с уверенностью "что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p)." ? Ну так в C все циклы такие. Они ничего не обещают. Так что выбирайте, или С и Оберон оба не соответствуют "структурным принципам" или оба соответствуют.
Т.е. я не вижу разницы между
LOOP EXIT; cond; body; cond2 END
и
while(cond) {body; cond2;}
Они оба или структурные, или оба не структурные.
Здравствуйте, qwertyuiop, Вы писали:
Q>Я часто проверяю условие p именно с целью узнать, как произошел выход из цикла: по брейку или "мирным путем".
Плохое построение цикла. В идеале у цикла должен быть один вход (никаких goto центр_цикла и прочих извращений) и один выход (выход только по условию цикла или только по одному break при while(true) ). Т.е. использования одновременно и цикла с условием и выхода из него по break желательно избегать. Но к сожалению это возможно не всегда (или необходимо разбивать цикл на два). Поэтому выход по break необходимо делать как можно более прозрачным и читаемым, располагать как можно ближе к началу цикла. А уж после цикла проверять как из него вышли... это уже совсем Цикл должен быть вещью в себе (не знаю как это выразить, надеюсь эту фразу вы поймете правильно).
Q>Меня за это расстреляют или наказание будет более жестокое: год программирования на Обероне?
Лучше заставить прочитать какой-нибудь фолиант по структурному программированию (не программированию сверху-вниз, а структурному программированию, т.е. именно правльной организации кода). Кстати тут недавно было описание книги Совершенный код
Здравствуйте, AVC, Вы писали:
AVC>Например, в количестве уровней и запутанности приоритетов операторов. AVC>Скажите честно: многие ли помнят таблицу приоритетов операторов Си/Си++ полностью? AVC>И сравните это с Обероном, где всего четыре уровня приоритетов: AVC>1) операция ~ (логическое отрицание); AVC>2) мультипликативные операции; AVC>3) аддитивные операции; AVC>4) сравнения. AVC>Остается добавить, что операции одного приоритета выполняются слева направо. И все. Что, сложно?
С этим согласны сами создатели:
Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинства некоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы быть лучше.
Б. Керниган, Д. Ритчи: "Язык программирования Си", СПб.: "Невский Диалект", 2001.-352 с.:ил.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>С этим согласны сами создатели: СГ>
СГ>Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинства некоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы быть лучше.
Вот именно, "как и любой другой язык программирования". Это первое. Авторы не закрывают глаза на недостатки своего создания, а работают над их преодолением. Это второе. И от них не слышно о языке, позволяющем создавать правильные "по определению" программы. Это третье.
СГ>Не можете написать ни первый ни второй случай. В чем смысл вопроса я не понял. Где костыли (хотя бы один) я тоже не понял.
Правильно. Костылей нет. Потому что костыли помогают ходить. А в Обероне даже костылей нет. Приходится ползать. Обсуждение ниже.
M>>И еще вопрос. Что удобнее писать: M>>
M>>while(!stream.eof())
M>>{
M>> // code
M>>}
M>>
M>>или M>>
M>>LOOP
M>> IF ~stream.end THEN
M>> {* code *}
M>> END
M>>END
M>>
M>>?
СГ>Тоже странный вопрос. В первом случае используется цикл с проверкой условия в начале итерации. Во втором случае используется безусловный цикл (исполняющийся вечно)
Знаете, мне почти не приходилось использовать вечных циклов. Если мне вдруг понадобился вечный цикл, это значит, что я неправильно реализую алгоритм. Далее. Приведенный вами код на Оберонах логически не эквивалентен приведенному мной.
Мой код: Пока у нас есть данные из сокета, обрабатывай их.
Ваш код: Крутись бесконечно (?). Читай данные. Проверяй на конец потока. Обрабатывай
Какой, к чертовой бабушке, крутись бесконечно? Я хочу, чтобы язык позволил мне выражать свои мысли так, как я этого хочу, а не так, как это хочет создатель или компилятор, потому что мне наплевать и на того и на другого.
Опять же вопрос. Почему нельзя по EXIT выйти ни из while ни из for? Почему эта привилегия оставлена LOOP'у. Ведь очевидно, что LOOP — это вырожденная форма while(true) или for( ; ; ) и не имеет право на самостоятельное существование.
Более того, все циклы могут быть представлены в виде только while. О, нашел вот такую вот домашнюю работу: PostScript(текст), где while, for, и do-while могут быть переписаны в виде друг друга без потери начального смысла программы. Это позволяет мне, как программисту, выразить свои мысли настолько ясно, насколько я этого хочу.
The original structural programming advocated dividing programs into subsections that have single point of entry, and single point of exit. While usually there aren't many reasons to have multiple points of entry, very few programs naturally follow the single point of exit paradigm.
A typical example of a simple procedure would be reading data from a file and processing it:
open file;
while (reading not finished)
{
read some data;
if(error){
stop the subprogram, inform rest of the program about the error;
}
}
process read data;
finish the subprogram;
The "stop and inform" may be achieved by throwing an exception, second return from the procedure, labelled loop break, or even a goto. As the procedure has 2 exit points, it breaks the rules of Dijkstra's structured programming. Coding it in accordance with single point of exit rule would be very cumbersome. If there were more possible error conditions, with different cleanup rules, single exit point procedure would be extremely hard to read and understand, very likely even more so than an unstructured one with control handled by goto statements. On the other hand, structural programming without such a rule would result in very clean and readable code.
Most languages have adapted the multiple points of exit form of structural programming. C allows multiple paths to a structure's exit (such as "continue", "break", and "return"), newer languages have also "labelled breaks" (similar to the former, but allowing breaking out of more than just the innermost loop) and exceptions.
While using those abilities may bring both advantages and disadvantages to the readability, providing them is clearly advantageous, as the programmer may use them when they're fit and simply not use them when a single point of exit structure would be more appropriate.
А Оберон упорствует в своем нежелании признать очевидное — то, что multiple exits нужны во всех циклах, а не только в недокостыле под названием LOOP
Здравствуйте, Сергей Губанов, Вы писали:
SJA>>То есть Вы допускаете, то не все циклы
СГ>Почему же не все. Абсолютно все циклы WHILE и абсолютно все циклы REPEAT.