Здравствуйте, AVC, Вы писали:
AVC>1. Собственно синтаксис.
AVC>а) Соответствие структурным принципам.
AVC>на Си/Си++, он не может быть в этом уверен, т.к. внутри цикла может находиться как оператор break, так и знаменитый goto. AVC>Соответственно, проверка корректности программы существенно затрудняется. AVC>То же относится к циклам REPEAT UNTIL ~p и do {} whiie (p).
Как же вы без break-ов обходитесь?
AVC>б) Синтаксический "оверхед".
AVC>Скажите честно: многие ли помнят таблицу приоритетов операторов Си/Си++ полностью? AVC>И сравните это с Обероном, где всего четыре уровня приоритетов: AVC>1) операция ~ (логическое отрицание); AVC>2) мультипликативные операции; AVC>3) аддитивные операции; AVC>4) сравнения. AVC>Остается добавить, что операции одного приоритета выполняются слева направо. И все. Что, сложно?
А что, из логических операций только отрицание? На помойку такой язык.
AVC>2. Исходные тексты Си/Си++ и документы Оберона.
AVC>Есть существенное различие в работе с исходными текстами программ на Си/Си++. AVC>Программа на Си/Си++ — это по-прежнему обыкновенный текст. AVC>Программа на Обероне — это документ, включающий в себя не только текст, но и множество самых разнообразных объектов. AVC>(Причем это различие существует еще с 1980-х годов.) AVC>ИМХО, это существенно сказывается на удобстве разработки.
Все, уговорил. Перехожу на Оберон. Вышли мне на ящик компилятор для 51-го контроллера.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, AVC, Вы писали:
AVC>>В отличие от синтаксиса Модулы/Оберона синтаксис Си/Си++ не соответствует принципам структурного программирования.
AVC>>
AVC>>while (p) { ... }
AVC>>
AVC>>на Си/Си++, он не может быть в этом уверен, т.к. внутри цикла может находиться как оператор break, так и знаменитый goto. AVC>>Соответственно, проверка корректности программы существенно затрудняется.
СГ>Совершенно согласен. Сам на позапрошлой неделе в своей программе на C# обнаружил, что переменная цикла while после его завершения иногда становилась равной -1 вместо ожидаемого минимального значения 0. Ошибка конечно чрезвычайно глупая и мне за нее стыдно, но дело в том, что на Обероне я бы ее просто НЕ СМОГ бы совершить в принципе!
Здравствуйте, boomsic, Вы писали:
B>а че в обероне нельзя из цикла выходить по брейку???
Циклы бывают всего трех типов:
1) Проверка условия продолжения перед выполнением итерации
WHILE a DO ... END
post condition a = FALSE
2) Проверка условия завершения в середине выполнения итерации
LOOP
...
IF a THEN ...; EXIT END;
...
END
3) Проверка условия завершения в конце итерации
REPEAT ... UNTIL a
post condition a = TRUE
EXIT — это, как бы, сишный break. Он завершает выполнение цикла LOOP. Ни каких других брэйков нет, их больше в принципе не нужно. Если бы из циклов WHILE и REPEAT можно было бы выходить как-то иначе, то post condition для них перестали бы иметь смысл.
Здравствуйте, moudrick, Вы писали:
M>1. Поддержка максимального количества парадигм программирования (в том числе и структурного)
1) Как Вам только что показали структурную парадигму не поддерживает.
2) Модульную парадигму не поддерживает (в языке нет модулей)
3) Компонентно ориентированное программирование не поддерживает (в языке нет модулей и нет сборки мусора)
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, boomsic, Вы писали:
B>>а че в обероне нельзя из цикла выходить по брейку???
СГ>Циклы бывают всего трех типов:
СГ>1) Проверка условия продолжения перед выполнением итерации
СГ>WHILE a DO ... END СГ>post condition a = FALSE
СГ>2) Проверка условия завершения в середине выполнения итерации
СГ>LOOP СГ> ... СГ> IF a THEN ...; EXIT END; СГ> ... СГ>END
СГ>3) Проверка условия завершения в конце итерации
СГ>REPEAT ... UNTIL a СГ>post condition a = TRUE
СГ>
СГ>EXIT — это, как бы, сишный break. Он завершает выполнение цикла LOOP. Ни каких других брэйков нет, их больше в принципе не нужно. Если бы из циклов WHILE и REPEAT можно было бы выходить как-то иначе, то post condition для них перестали бы иметь смысл.
плиз посмотрите следующее
AVC>Когда программист пишет (или, что важнее, читает) на Модуле/Обероне цикл AVC>
AVC>WHILE p DO ... END
AVC>
AVC>он абсолютно уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p). AVC>Если программист читает аналогичный цикл AVC>
AVC>while (p) { ... }
AVC>
AVC>на Си/Си++, он не может быть в этом уверен, т.к. внутри цикла может находиться как оператор break, так и знаменитый goto. AVC>Соответственно, проверка корректности программы существенно затрудняется.
так что получается в обероне точно так же програмист не может быть "уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p)."
Здравствуйте, AVC, Вы писали:
AVC>1. Собственно синтаксис.
AVC>а) Соответствие структурным принципам.
AVC>В отличие от синтаксиса Модулы/Оберона синтаксис Си/Си++ не соответствует принципам структурного программирования. AVC>Рассмотрим хотя бы циклы. AVC>Когда программист пишет (или, что важнее, читает) на Модуле/Обероне цикл AVC>
AVC>WHILE p DO ... END
AVC>
AVC>он абсолютно уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p).
EXIT что, отменили?
AVC>б) Синтаксический "оверхед".
AVC>Я согласен с Сергеем, что в синтаксисе Си/Си++ заключен значительный "оверхед". AVC>Но таится он в основном в величине и сложности языка и его описания, а также в некоторых синтаксических деталях. AVC>Например, в количестве уровней и запутанности приоритетов операторов. AVC>Скажите честно: многие ли помнят таблицу приоритетов операторов Си/Си++ полностью?
А зачем ее помнить? Объяснение, почему так, есть еще у Кернигана и Ритчи. Операции логически сгруппированы, поразрядные операции вместе с арифметическими выполняются редко. Таблица приоритетов операций достатоцно компактна, можно ее на стенку повесить или под стекло положить. В крайнем случае существуют скобки. Конечно, оверхед повышается, но и читаемость тоже.
AVC>2. Исходные тексты Си/Си++ и документы Оберона.
AVC>Есть существенное различие в работе с исходными текстами программ на Си/Си++. AVC>Программа на Си/Си++ — это по-прежнему обыкновенный текст. AVC>Программа на Обероне — это документ, включающий в себя не только текст, но и множество самых разнообразных объектов.
Это свойство языка? Тогда почему о нем нет ни слова в 30-страничном руководстве, которое лежит сейчас на моем столе?
AVC>(Причем это различие существует еще с 1980-х годов.) AVC>ИМХО, это существенно сказывается на удобстве разработки. AVC>Попытаюсь это обосновать.
AVC>а) Документирование программ.
AVC>Вот простой пример.
[....]
Это относится к IDE.
AVC>А что же Си/Си++?
AVC>б) Тестирование программ.
AVC>Надеюсь, никто не будет спорить, что надо тестировать как программы в целом, так и отдельные компоненты и подпрограммы.
Естественно.
AVC>На Си/Си++ тесты, как правило, хранятся в отдельных файлах и "запускаются" отдельными скриптами, которые тоже хранятся в отдельных файлах. В итоге, хранение этих вспомогательных, но необходимых файлов вырастает в целую проблему.
Какую?
AVC>(Я уж молчу о той деликатной детали, что многие Си++программисты вообще не хранят тестов. По принципу: протестировал — и забыл. Если не забыл протестировать... )
[...]
Это относится к IDE.
AVC>По моему, это удобно. AVC>А что же Си/Си++?
Команда — это исполняемая программа. В среде Windows программа запускается на выполнение двойным щелчком.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, moudrick, Вы писали:
M>>1. Поддержка максимального количества парадигм программирования (в том числе и структурного)
СГ>1) Как Вам только что показали структурную парадигму не поддерживает.
Не показали. Описание структурной парадигмы в студию.
С указанием мест, где не удовлетворяет.
СГ>2) Модульную парадигму не поддерживает (в языке нет модулей)
namespace.
Описание модульной парадигмы в студию.
С указанием мест, где не удовлетворяет.
СГ>3) Компонентно ориентированное программирование не поддерживает (в языке нет модулей и нет сборки мусора)
Подключи нужную библиотеку — будет тебе сборка мусора, будут и компоненты. А модули тут при чем?
И вообще, список принципов компонентно-ориентированного программирования в студию.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, AVC, Вы писали:
AVC>>В отличие от синтаксиса Модулы/Оберона синтаксис Си/Си++ не соответствует принципам структурного программирования.
AVC>>
AVC>>while (p) { ... }
AVC>>
AVC>>на Си/Си++, он не может быть в этом уверен, т.к. внутри цикла может находиться как оператор break, так и знаменитый goto. AVC>>Соответственно, проверка корректности программы существенно затрудняется.
СГ>Совершенно согласен. Сам на позапрошлой неделе в своей программе на C# обнаружил, что переменная цикла while после его завершения иногда становилась равной -1 вместо ожидаемого минимального значения 0. Ошибка конечно чрезвычайно глупая и мне за нее стыдно, но дело в том, что на Обероне я бы ее просто НЕ СМОГ бы совершить в принципе!
Здравствуйте, moudrick, Вы писали:
M>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Здравствуйте, CrystaX, Вы писали:
CX>>> Для кого это правильно?
СГ>>Вообще. Без относительно к чему-либо. Теорема Пифагора для кого правильна? M>Для Евклидового пространства.
Евклидовое пространство является частью ее формулировки (что такое Сбитень? Это Першин. А что такое Першин? Это сбитень.) Но для кого она правильна?
M>Поэтому же не считаются и скобки.
Смотря какие скобки. Скобки в выражении поставленные просто так для наглядности — не считаются. Скобки в инструкции необходимы согласно определению си-образного синтаксиса. Инструкция while написанная без скобок не будет скомпилирована, так как это будет синтаксической ошибкой. В этом случае скобки считаются.
Сергей Губанов wrote:
> M>Поэтому же не считаются и скобки. > Смотря какие скобки. Скобки в выражении поставленные просто так для > наглядности — не считаются. Скобки в инструкции необходимы согласно > определению си-образного синтаксиса. Инструкция while написанная без > скобок не будет скомпилирована, так как это будет синтаксической > ошибкой. В этом случае скобки считаются.
К пробелам, пожалуйста, такое же отношение проявляйте...
Сергей Губанов wrote:
> EXIT — это, как бы, сишный break. Он завершает выполнение цикла LOOP. > Ни каких других брэйков нет, их больше в принципе не нужно. Если бы из > циклов WHILE и REPEAT можно было бы выходить как-то иначе, то post > condition для них перестали бы иметь смысл.
Что????? _Совсем_ нет??
В морг тогда такой язык, без _всяких_ дальнейших вопросов.
Здравствуйте, Курилка, Вы писали:
СГ>>Совершенно согласен. Сам на позапрошлой неделе в своей программе на C# обнаружил, что переменная цикла while после его завершения иногда становилась равной -1 вместо ожидаемого минимального значения 0. Ошибка конечно чрезвычайно глупая и мне за нее стыдно, но дело в том, что на Обероне я бы ее просто НЕ СМОГ бы совершить в принципе!
К>Математически доказал, что там -1 вместо 0?
Он же сказал: доказано, что там должен быть 0. А если факты не соответствуют теории, то тем хуже для фактов.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, moudrick, Вы писали:
M>>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>>Здравствуйте, CrystaX, Вы писали:
CX>>>> Для кого это правильно?
СГ>>>Вообще. Без относительно к чему-либо. Теорема Пифагора для кого правильна? M>>Для Евклидового пространства.
СГ>Евклидовое пространство является частью ее формулировки. СГ>Но для кого она правильна?
Я написал Вам, как в данном случае понимается выражения "для кого она правильна". Вы же это поскипали. Потрудитесь отвечать по существу.
M>>Поэтому же не считаются и скобки.
СГ>Смотря какие скобки. Скобки в выражении поставленные просто так для наглядности — не считаются. Скобки в инструкции необходимы согласно определению си-образного синтаксиса. Инструкция while написанная без скобок не будет скомпилирована, так как это будет синтаксической ошибкой. В этом случае скобки считаются.
Тогда считаются и пробелы. Ибо если убрать пробелы, то будет ошибка и в горячо любимом Обероне. А если их же убрать в C, то не будет. Не надо нас маленьких дурить. А надо внимательно читать обоснованные возражения.
Здравствуйте, boomsic, Вы писали:
B>так что получается в обероне точно так же програмист не может быть "уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p)."
Может. Таково одно из положений структурного программирования.
WHILE p DO
...
END;
ASSERT(~p)
Этот ассерт ни когда не остановит выполнение программы, условие ~p всегда истинно.
while (p)
{
...
}
assert(!p)
А вот этот ассерт иногда может остановить работу программы. Например, если внутри цикла сделать break не присвоив p ложное значение.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Privalov, Вы писали:
AVC>>>Когда программист пишет (или, что важнее, читает) на Модуле/Обероне цикл AVC>>>
AVC>>>WHILE p DO ... END
AVC>>>
AVC>>>он абсолютно уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p).
P>>EXIT что, отменили?
СГ>Учите "матчасть", а то языка не знаете, а суетесь.
P>>В среде Windows программа запускается на выполнение двойным щелчком.
СГ>Не удержусь от замечания: а в оберонах одинарным! Опять идите учить "матчасть".
И я не удержуть. от смеха.
Во-первых это Вам намек — не путайте свойства языка и свойства IDE и других сопутствующих разработке средств.
А во-вторых — Windows легко настраивается и на один щелчок тоже. Учите матчасть.