Вот почитал я тут громадные нитки обсуждений на темы "Чем так развлекателен Си++" и "Проектируем старый язык программирования" и задумался над тем, чего хотелось бы мне от языка программирования и от среды в целом.
Пишу я нониче на работе на Си++, компилятор MSVC++ 6, ATL, WTL, COM, COM+, раньше писал на Фортране, Бейсике, Фокс-Про, Дельфах, Паскале, Билдере, и вообще на чем попало. Маненечко интересуюся Дотнетом, хотя возможности заняться оным вплотную нету.
Всякий раз меня что-то доставало, что-то мне не нравилось, более или менее сильно... Дотнет выглядит весьма многообещающим, но опять-таки: кое-чего не хватает!
Вот я и подумал, а что если попытаться свесть воедино мои мыслишки на эту тему? Коротенько так, минут эдак на сорок, больше, думаю, не надо... (c) тов. Огурцов.
Во-первых, сразу определюсь, что имею в виду только языки императивно-декларативного программирования общего назначения. Специализированные языки (типа Перла, скриптов, оболочечных языков) я не трогаю: у них свои задачи и своя ниша.
Во-вторых, языки других типов — функциональные (Лисп), логические (Пролог), реляционные (Дейталог, SQL) и проч. — также рассматривать не буду, т. к. с точки зрения практической для разработки приложений они негодны, хотя и годятся для разработки подсистем и модулей, для решения специальных задач.
В-третьих, языки чисто императивные (типа Фортрана-77 и старого Бейсика), не предоставляющие мало-мальских средств декларативного программирования (ну есть в Фортране-77 структуры, но этого же недостаточно!), также не катят, ибо упрощение и повышение качества программирования заключается в переходе от чисто императивного стиля в сторону все более и более декларативного, и с этой точки зрения эти языки уже безнадежны (Фортран-90 ничего существенного нового в процесс разработки на Фортране не внес, а ВБ — это, простите, уже не Бейсик).
Значицца, так.
Вот тут спорят по поводу Си++. Кто-то утверждает, что Си++ — чудо. Кто-то — что Си++ — отстой. Думаю, и те, и те неправы. Недаром Си++ стал на долгое время самым популярным средством разработки; опять же недаром с него сейчас многие уходят.
Язык Си++, конечно, потрясающе выразителен и богат, но... на чистом языке без среды далеко не уедешь...
Некоторые заявляют, что Си++-де не развивается, чтобы отвечать современным требованиям. Проблема в том, что, как мне скромно кажется, расти ему некуда — за исключением разве что некоторых синтаксических улучшений вроде бурно обсуждавшихся здеся делегатов, в самой примитивной их форме. Самые фундаментальные основы существования этого языка, его
оправдание — строгая статическая типизация, доступ к непосредственному управлению доступной программе памятью и много-много еще чего — ориентированы на создание более или менее монолитных приложений, преемственных к тому же программным модулям 60-70-х годов. Они [основы] были существенно необходимы для разработки приложений тогдашнего уровня сложности. А при нынешних требованиях к сложности приложений создавать их монолитными... — нет, ну я соглашусь, что теоретически возможно все, — но практически-то нереально!
Создание компонентного ПО на Си++ возможно, но это же просто невозможно! Я знаю, что говорю, сам сейчас мучаюсь с ATL/COM... Не говоря уже о том, что поддержка статической типизации в межкомпонентных интерфейсах, возможность использования классов Си++ — это таки отдельная песня! Нет, мне, конечно, скажут: это не вопрос языка, это вопрос среды, библиотек... Отлично: но почему же нету нормальных средств удобной разработки приложений на Си++? Почему нет стандартной среды, функционально подобной, скажем COM, делающей процесс создания качественного ПО на Си++, скажем так, не сложным сверх всякой меры? Почему постоянно приходится путаться между полудюжиной всевозможных средств работы со строками?
А как вам нравится полное отсутствие встроенной в язык целочисленной арифметики с контролем переполнения? Нет, конечно, для многих задач это несущественно, для многих — наоборот, подход Си/Си++ как раз и нужен. Но ведь есть и такие приложения, где нужно иметь разумную защиту от того, что деля на сумму двух положительных чисел, программа может вылететь с криком "Division by zero".
"Мне же нужно программировать прикладную логику! Мне нужно это делать сегодня! Я не желаю все силы отдавать системным вещам в ущерб основной логике! А мне приходится это делать — раз за разом! Дайте же мне что-нибудь не столь чистое и идеальное, чтобы я мог достигать результата проще!" — вот что заявит нормальный разработчик...
Получается так, что, чтобы "расти", Си++ должен преодолеть то, что является его самой основой. Тогда это становится уже другим языком, например Си-шарп.
Время Си++ как такового проходит. Обидно это сознавать, т. к. я сам потратил уйму времени на его изучение и, осмелюсь заявить, знаю его неплохо-с.
Тем не менее, в Си++ есть много чего хорошего, что хотелось бы сохранить...
Статическая типизация по-прежнему является очень важным средством построения программных модулей (недаром ведь ни один новый язык не отказался от прототипов функций). Но нужна стандартная среда, которая брала бы на себя все вопросы обмена объектами между программными компонентами. Нужна стандартная среда, которая бы
динамически отслеживала все, что связано с исполнением
статически (жестко) типизированных контрактов между компонентами...
Очень неприятно было читать в описаниях CLR и языка Си-шарп ("До-диез"

) обороты вроде "это мы отбросили, потому как в этом многие путаются, мы предлагаем взамен другие концепции программирования". Например, взять то же множественное наследование реализаций. При надлежащем объяснении оно оказывается вполне понятным программистам; при надлежащем использовании оно становится весьма удобным средством. Если кто-то не чувствует в себе достаточной уверенности в том, что сможет использовать его, — его можно и не использовать. Если мудрецы из Микрософта решили, что эта возможность не может быть реализована в CLR или что она откладывается на будущее (это можно было бы понять, т. к. объемы работ огромны), — так и следовало честно сказать.
Шаблоны — ну о них вообще многие рыдают... Тут все, на мой взгляд, ясно. Наличие STL — это, можно сказать, третий плюс к Си++. Возникает только одно но: как это реализовать в рамках CLR или аналогичной среды? Вопросец еще тот...
Оптимизация — по всей видимости CLR, MSIL, JIT в совокупности открывают потенциально путь к огромным возможностям оптимизации (как, скажем, полностью безопасное межкомпонентное встраивание вызовов функций) — короче, по этому вопросу — нужно ждать! Если же при этом еще и оставить богатые выразительные возможности Си++ по составлению выражений...
Еще, как я понял, в Дотнете нету автоматических (в смысле Си/Си++) объектов. Вот это непонятно — почему?
Теперь собственно о среде...
Когда я почитал впервые насчет того, что предоставляет Дотнет... Реакция моя была такой: ну почему все это только сейчас?!!
На этом, собственно, обсуждение и закончилось...
Теперь — о том, чего еще желает моя душа...
Ну почему, ну почему языки и среды так мало внимания уделяют собственно разработке?
В среде разработки Дотнета VS.Net наконец-то появился более-менее удобный редактор для Си-шарпа, позволяющий сворачивать-разворачивать определения классов и функций... Как давно мечталось о чем-то подобном для Си++! Но, увы, для Си++ с его раздельным объявлением и определением методов это недостижимо. Так легко получить рассогласование, скажем, между комментариями к одному и тому же методу в точке объявления и определения.
Ни в одном популярном языке нет ни понятий антецедента и консеквента, ни поддержки состояний, проверяемых при компиляции. Слава богу, хоть появились языки, в которых возможно нормальное (не как в Си++) описание того, какие исключения могут быть выброшены из функций, и это даже проверяется компилятором.
Могу еще продолжить, но хотелось бы послушать, что вы все на этот счет думаете...