В отношении синтаксиса. Как нередко говорят, синтаксис -- вопрос вкуса. А вкус, как известно, формируется. Вкус человека во многом формируется той культурной средой, в которой он находится, теми, с кем он общается, тем, какие книги читает и т.д.
Заглавные буквы в зарезервированных словах и предопределенных идентификаторах применяются в Модуле-2 и Обероне, что довольно редко где можно встретить. Не потому ли они и расходятся со вкусом многих? Просто вкус подавляющего большинства формировался под влиянием конкретных факторов -- привычки к традициям языков Си-семейства. Традиция активного использования маленьких букв -- это традиция UNIX. Впрочем, об этом детальнее можно почитать, например, здесь:
http://www.linfo.org/lower_case.htmlХотя и в мире Паскаля, где идентификаторы не чувствительны к регистру, преобладающее использование нижнего регистра в зарезервированных словах тоже уже стало традицией.
В европейской письменности традиция использования заглавных букв преимущественно в сокращениях и в начале предложениях (а также именах собственных) формировалась постепенно. И вряд ли корректно напрямую отображать традиции письменности на языки программирования. Насколько мне известно, во времена Римской империи латинский алфавит имел только одну форму -- заглавные буквы (маюскул). Маленькие (строчные) буквы (минускул) не использовались в книжном почерке. Прошло немало столетий, прежде чем появился минускул, причем это был результат долгой сложной линии развития, восходящей к римскому курсивному письму.
Почему Вирт решил выбрать именно такую форму? Я не знаю в точности ответа на этот вопрос, хотя во время одного из визитов проф. Ю.Гуткнехта в Москву мы эту тему с Юргом обсуждали. Он тогда хотел принять решение в отношении своего языка Zonnon, который можно отнести к семейству Оберонов, хотя по своей сложности и навороченности он явно выпадает из этого ряда (Гуткнехт хотел в него вложить едва ли не все свои идеи, да еще с максимальным использованием возможностей .NET). Я высказал отрицательную оценку желанию пойти на поводу у масс и сделать зарезервированные слова в нижнем регистре. Но Гуткнехт в итоге поступил по-своему.
В отношении Модулы-2 и Оберона могу предположить, что Вирт руководствовался, скорее, не римскими традициями, хотя обращение к античности -- это стильно (если, правда, люди об этом знают). Такой прием Вирт наверняка позаимствовал у языка Mesa (первого языка модульного программирования, блестящая разработка исследовательского центра Xerox PARC начала 1970-х годов). Именно под его влиянием Вирт создавал Модулу-2 из своей экспериментальной Модулы (кстати, в Модуле в отличие от Модулы-2 был принят паскалевский подход, без чувствительности к регистру и с нижним регистром зарезервированных слов). Этот же принцип (верхний регистр) использовался и в языке Cedar (Xerox PARC), который Вирт изучал при создании Оберона. Этот же принцип использовал язык Modula-3 (разработка исследовательских лабораторий DEC SRC). В категорию этих языков можно отнести Occam(-2), в разработке которого участвовал Тони Хоар. Собственно, можно даже говорить, что это традиция модульных языков, которые прошли мимо подавляющей массы программистов. Другая культура. Думаю, это не изобретение Вирта. И даже не изобретение европейской школы программирования.
Вирт больше прагматик, хотя эстетическое начало очень высоко ценит и имеет отличный вкус (на мой взгляд). Ясно, что зарезервированные слова в языке играют роль разделителей. И они должны выделяться. Как? Цветом? В годы Модула-2 с цветом была напряженка. Подчеркиванием или полужирным, как это делали в отношении того же Паскаля? Но это хорошо делать в печатных изданиях, а не в исходных текстах, когда его отображение на экране лишено возможности выбора гарнитуры и начертания. Так что подход Вирта был вполне обоснован. Более того, он действительно удобен. Только, чтобы осознать это удобство, надо с ним поработать. Зарезервированные слова в верхнем регистре формируют очень наглядный каркас исходного текста. И в нем лично мне крайне комфортно ориентироваться. Я не проводил полноценных социологических опросов, но среди тех, кто работал с Модулой-2 (а это куда более обширная аудитория, нежели сменивший его Оберон) мне не встречались отрицательные мнения на этот счет. Хотя то, что это было поначалу многим непривычно -- факт.
Честно говоря, мне нередко приходится слышать сетования на это неудобство синтаксиса Оберона. Ну хорошо, давайте предположим компромисс -- пусть поддерживаются обе формы для зарезервированных слов (как это планируется в новом языке в рамках проекта “Роса”). Проблема ушла? Ушла. Притом элементарным решением. А что же с остальными вопросами синтаксиса? Интересно, почему мы редко задаемся вопросами небрежности доминирующего ныне Си-синтаксиса? Это в самом деле глубокая и серьезная проблема. Желание потакать привычкам, оправдываясь преемственностью языков (C++, Java, C#)? Допустим, что нет необходимости учитывать пресловутую преемственность и привычки масс. Давайте сопоставим Си-синтаксис и виртовский синтаксис (не говорю Паскаль-синтаксис, поскольку Модула-2 и Оберон его сильно уточнили в лучшую сторону). Не является ли небрежность Си-синтаксиса потенциальным источником многих ошибок?
Если мы проблемы Си-синтаксиса сводим преимущественно к оператору присваивания, это будет слишком упрощенный взгляд. Проблемы и в построении выражений, и в операторах, и в объявлениях сущностей, да почти везде... Кстати, проблемы и виртовском синтаксисе.
Важно видеть не детали, а существенную разницу в подходах: Си-синтаксис заточен на удобство
синтеза исходного текста (экономит время написания); виртовский синтаксис -- на удобство
анализа исходного текста (экономит время на понимание программы -- с целью проверки и модификации).
С позиции этого критерия (удобство быстрой записи) Си-синтаксис (я сюда включаю не только Си, но C++, Java, C#) ) вполне достиг своей цели (хотя есть и более изощренные в этом плане языки). Однако проблема в том, что человек должен заниматься не только и не столько синтезом, сколько анализом программы. При этом это может быть как ее автор, так и посторонний человек (для промышленного, некустарного программирования это крайне важно). Более того, сам автор, обратившийся к своей же программе спустя длительный период, сам попадает в позицию постороннего человека. И для него анализ становится много важнее синтеза. Вот тут-то и всплывают проблемы. Чем компактнее запись, чем плотнее она упаковывает конструкции, тем сложнее заниматься распаковкой (в голове). В этом и есть глубинные проблемы Си-синтаксиса.
К чему подталкивает желание экономить время при наборе текста? К неаккуратности. Причем неаккуратности даже не внешней, а смысловой. Меня не удивляет то, что работа с отладчиками и системами тестирования -- это норма для современных языков. Мир Модулы-2 мне открыл совсем иной подход. Я стал не кодировать (как при работе на Фортране, Си или даже том же классическом Паскале -- с этих языков я начинал), а конструировал. При этом меня не интересовало желание побыстрее скомпилировать что-нибудь и запустить. Зачем? Я конструировал здание (модуль, совокупность модулей) методично. Шаг за шагом. И спокойно анализировал исходный текст. Не один день. На этом не экономил. При таком подходе для меня крайне важен синтаксис, позволяющий постоянно работать в режиме анализа. Я вообще не пользовался никаким отладчиком (хотя в той же TopSpeed Modula-2 или в Logitech Modula-2 отладчики по своему уровню превосходили ведущие отладчики для других языков). Мне не нужен был и посмертный отладчик. Это качественно иной подход к программированию. И он дает результат такого качества, которого очень трудно добиться в мире языков с Си-синтаксисом.
Рассмотрим теперь частность, которая почему-то больше всего приковывает к себе внимание -- оператор присваивания ("
=" в Фортране и Си). Если человек немного знаком с математикой, он уверен, что знаком равенства обозначается что-то симметричное. Откуда возникла эта идея использования знака равенства в качестве оператора присваивания? Из желания сэкономить время написания программы (ее синтеза программистом). Да, этот критерий -- экономии при написании -- пропитал весь Си-синтаксис (и фигурные скобки -- из той же оперы). Более того, он стимулировал к такому мышлению и программиста.
Вариант, восходящий к Алголу-60 (а виртовские языки лежат в русле этой традиции), отдает предпочтение записи "
:=". Она лишена недостатка Си, но вряд ли является идеалом. Известны и другие подходы. В первом языке программирования (Plankalkul), созданного Конрадом Цузе в 1940-х годах, для присваивания использовалась запись "
=>" (при этом
что присваивают -- слева, а
чему присваивают -- справа). Именно это вариант хотел пробить проф. Рутисхаузер в конце 1950-х годов в Алголе-60, но его предложение отклонили. Есть вариант "
<-" (так записывался оператор присваивания в языке Mesa).
Позиция Вирта по вопросам синтаксиса изложена, например, в его статье "Хорошие идеи, взгляд из Зазеркалья", в разделе "Особенности языков программирования":
http://www.citforum.ru/programming/digest/wirth/Эта статья, как известно, служила основой для большинства его выступлений, с которыми он проехал по нашей стране в ходе своего Большого турне 2005 г.
К сожалению, Вирт не обратил внимание аудитории на существенную разницу в критериях для оценки синтаксисов разных языков (что я изложил выше). И, на мой взгляд, напрасно. Люди подходят к оценке синтаксиса и семантики языков с позиции своих критериев, забывая о том, что выдвигать претензии к инструменту надо, понимая, какие критерии ставил во главу угла сам автор. Иначе возникает простой вопрос: кто заставляет пользоваться именно этим инструментом.
Из-за игнорирования критериев и их важности для тех или иных задач и возникают, на мой взгляд, проблемы у большинства программистов с пониманием компактного строения Оберона. Это язык-ядро. Созданный для реализации ОС. Но не стремление вложить в язык максимум средств, чтобы облегчить жизнь сегодня (когда надо создавать программу) , но усложнить ее завтра(когда эту программу надо пересматривать и развивать).