Re: Синтаксический оверхед
От: AVC Россия  
Дата: 21.06.05 10:12
Оценка: 6 (2) :))
Здравствуйте, Сергей Губанов, Вы писали:

СГ>1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо.

СГ>2) Известно, что стандарты оформления Си-образного кода требуют использования большего количества строчек чем это реально необходимо (чтобы читающему понятно стало где что написано).

Сергей, Вы затронули интересную тему.
В отличие от модераторов RSDN, я не считаю ее смешной.
Но мне кажется, что "количественный" аспект здесь не главный.
Предлагаю Вам расширить тему и рассмотреть некоторые "качественные" аспекты.
Эту расширенную тему можно было бы, например, назвать "Исходные тексты в Си/Си++ и Обероне".
Я набросал несколько несколько наблюдений.
Получилось примерно следующее.

1. Собственно синтаксис.

а) Соответствие структурным принципам.

В отличие от синтаксиса Модулы/Оберона синтаксис Си/Си++ не соответствует принципам структурного программирования.
Рассмотрим хотя бы циклы.
Когда программист пишет (или, что важнее, читает) на Модуле/Обероне цикл
WHILE p DO ... END

он абсолютно уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p).
Если программист читает аналогичный цикл
while (p) { ... }

на Си/Си++, он не может быть в этом уверен, т.к. внутри цикла может находиться как оператор break, так и знаменитый goto.
Соответственно, проверка корректности программы существенно затрудняется.
То же относится к циклам REPEAT UNTIL ~p и do {} whiie (p).

б) Синтаксический "оверхед".

Я согласен с Сергеем, что в синтаксисе Си/Си++ заключен значительный "оверхед".
Но таится он в основном в величине и сложности языка и его описания, а также в некоторых синтаксических деталях.
Например, в количестве уровней и запутанности приоритетов операторов.
Скажите честно: многие ли помнят таблицу приоритетов операторов Си/Си++ полностью?
И сравните это с Обероном, где всего четыре уровня приоритетов:
1) операция ~ (логическое отрицание);
2) мультипликативные операции;
3) аддитивные операции;
4) сравнения.
Остается добавить, что операции одного приоритета выполняются слева направо. И все. Что, сложно?

2. Исходные тексты Си/Си++ и документы Оберона.

Есть существенное различие в работе с исходными текстами программ на Си/Си++.
Программа на Си/Си++ — это по-прежнему обыкновенный текст.
Программа на Обероне — это документ, включающий в себя не только текст, но и множество самых разнообразных объектов.
(Причем это различие существует еще с 1980-х годов.)
ИМХО, это существенно сказывается на удобстве разработки.
Попытаюсь это обосновать.

а) Документирование программ.

Вот простой пример.
При разработке программы со сложным алгоритмом обыкновенно требуется делать ссылки на литературу: ищи пояснения в такой-то книге, на такой-то странице.
Мне же оказалось достаточно взять требуемые фрагменты (и, что немаловажно, с "картинками" ) из документа, содержащего известную книгу Кормена, Лейзерсона и Ривеста, и вставить как комментарий в программу на Компонентном Паскале прямо перед соотвествующим им кодом.
Алгоритм теперь читается и понимается легко и даже приятно.
Кроме того, благодаря тому, что все ключевые слова состоят только из заглавных букв и благодаря этому выделяются сами собой, программист может использовать цвет букв (а также размер и шрифт) по своему усмотрению для выделения особо важных фрагментов кода. Скажем, не уверен в данном коде — пометил его красным: проверить! Это очень эффективная система, т.к. цвет бросается в глаза, и такой участок кода трудно не заметить.
Напоминаю, что подобные возможности доступны в Обероне с 1980-х.
А что же Си/Си++?

б) Тестирование программ.

Надеюсь, никто не будет спорить, что надо тестировать как программы в целом, так и отдельные компоненты и подпрограммы.
На Си/Си++ тесты, как правило, хранятся в отдельных файлах и "запускаются" отдельными скриптами, которые тоже хранятся в отдельных файлах. В итоге, хранение этих вспомогательных, но необходимых файлов вырастает в целую проблему.
(Я уж молчу о той деликатной детали, что многие Си++программисты вообще не хранят тестов. По принципу: протестировал — и забыл. Если не забыл протестировать... )
На Обероне/Компонентном Паскале тесты могут храниться в самом исходном документе: после точки или в комментарии.
С помощью команд в обероновской среде можно запускать тесты для отдельных компонентов и даже отдельных подпрограмм. Для этого я помещаю тестовые команды прямо в исходном модуле, а коммандеры с исходными данными для тестов — после точки или в комментарии. Достаточно одного щелчка мыши, чтобы запустить нужный тест.
После того, как я протестировал модуль, я не убираю тестовые команды в комментарии (и уж, тем более, не удаляю их!), а прячу в складку (fold). Опять же достаточно будет щелчка мыши, чтобы их восстановить.
Исходный код, спрятанный в складке, не компилируется, поэтому спрятанные тесты ничего не "весят".
По моему, это удобно.
А что же Си/Си++?

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

Хоар
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.