Статья с форума по программированию. Уже непомню адреса этого форума... C мёртв
Обучение программированию с помощью Си эквивалентно развращению малолетних
А.А.Берс
Sмена парадигмы
Будущее всегда наступает медленно и незримо. Подкрадывается, словно ниндзя, подступает на мягких лапках. Нельзя проснуться однажды утром и осознать – вот он, технотронный скачок, ведь вместо чашки кофе я возьму шприц и вколю прямо в сердце смесь таурина с чистым адреналином. Человек сильно ограничен в понимании окружающего мира, и пусть он хоть трижды огнекрылая валькирия компьютерного андеграунда и неистовый апологет духа робоцивилизации, смену технопарадигмы ему не заметить.
Даже самым прогрессивным из нас свойственен консерватизм и любые, порой незначительные изменения к лучшему мы готовы встретить в штыки. Особо мы недолюбливаем, когда мир меняется не вокруг нас, а внутри, в собственном сознании. Многие люди мнят себя глубоко законспирированными «живыми воплощениями бога» (в простонародье: экспертами), которым трудно, подчас невозможно, выкинуть из головы накопленные знания и опыт и начать всё заново.
Не так важно, заметили ли вы или нет эволюционный переход. Способность к адаптации позволит вам существовать на любой стадии развития человечества. Осталось только принять сам факт эволюционного скачка.
Cага о трёх яzыках
«На каком языке программировать?» - едва ли не ключевой вопрос в IT-сфере за последние 30 лет, особенно актуальный для российской консервативной индустрии программирования. «Правильный» язык должен максимально способствовать «техничному» программированию, помогать развивать хороший стиль и т.п. Определенные вещи «язык адекватного программирования» должен и запрещать (например, оператор безусловного перехода), а другие гарантировать (сокращенное вычисление логических выражений для грамотной организации циклов).
В 1970 г. Никлаус Вирт опубликовал свой первый язык, спроектированный именно с учетом весьма жестких требований, широко известный язык Паскаль. После изобретения Паскаля понимание технологий программирования углубилось (модульные и объектные методы). Сам Вирт учёл это последовательно в двух языках, прямых потомках Паскаля, - это Модула-2 (1980) и Оберон (1988). Модула-2, появившаяся одновременно с другим паскалеобразным языком Ада, разработанным по заказу министерства обороны США, но более простая и эффективная, естественным образом пришла на смену Паскалю в российской космической и оборонной индустрии.
Оберон - наиболее совершенный наследник старого Паскаля, спроектированный с тщательнейшим учетом требований эффективной профессиональной работы. Однако научно-исследовательские разработки Вирта по углублению и расширению возможностей языков были погребены жёсткой маркетинговой политикой фирмы Борланд, производителя Турбо Паскаля. Поэтому часть программистов ушла с Турбо Паскаля на более «современный», «настоящий», «промышленный» продукт фирмы Борланд - Дельфи. Система Дельфи, однако, основана на версии Паскаля, в которую было бездумно добавлено множество модных наворотов, резко усложнивших язык. Для сравнения: язык Оберон, в который Вирт также ввёл ключевые элементы объектно-ориентированного программирования, сравнительно с Паскалем и Модулой-2 выглядит значительно проще, а не сложнее старого Паскаля. Но Оберон качественно мощнее «дельфийского» Паскаля, несмотря на всю сложность последнего (благодаря механизму автоматического управления памятью, до Оберона остававшегося прерогативой интерпретируемых языков). На будущее заметим, что Оберон существует в нескольких мало отличающихся вариантах, одному из которых ученики Вирта дали название Компонентный Паскаль, чтобы подчеркнуть близость и прямую преемственность со старым Паскалем.
В самой индустрии ПО наибольшую популярность стали приобретать проекты Java и C#, сделанные, хотя и на другой синтаксической основе, но под сильнейшим влиянием именно Оберона. Можно сказать, что индустрия ПО под давлением объективной реальности сумела лучше разобраться в глубинной природе процесса создания ПО, чем программисты, соблазнившиеся поверхностной синтаксической преемственностью «дельфийского» Паскаля с первоначальным вариантом языка.
Тирания мозга веrсии С
Уход в «дельфийский» Паскаль вместо «правильного» Оберона - это лишь одна сторона проблемы программирования. В хаосе последних 10-15 лет проявилась ещё более тревожная и опасная тенденция: распространение C-образных языков.
В середине 1970-х была создана и в дальнейшем широко распространилась в разных вариациях (в т.ч. знаменитый Linux) весьма мощная операционная система Unix. Вместе с ней в мир программирования «въехал» и получил распространение язык C, использованный для её написания. В дальнейшем на его основе был построен (как и «дельфийский» Паскаль, бездумным прямым добавлением множества новомодных, зачастую непроверенных средств) язык C++.
Язык C был сочинен (именно сочинен, т.к. проектированием это назвать нельзя) из бесхитростно проинтерпретированных практических соображений как замена ассемблеру в написании операционной системы Unix (которая сама по себе явилась, безусловно, прорывной разработкой). При создании C была проигнорирована вся накопленная к тому времени мудрость создания высоконадежных языков программирования. В результате на C легко написать совершенно нечитаемые конструкции. Приведу цитату с форума:
{Известны 10 преимуществ Паскаля перед Си:) Я приведу только одно, но самое важное:
На Си Вы можете написать:
for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);
На Паскале Вы НЕ МОЖЕТЕ такого написать.}
При таком аморфном синтаксисе программист совершенно не защищен от случайных ошибок (причем в C рассыпано и множество других «граблей»).
Было обнаружено, что плотность ошибок в больших программных текстах на языке C при прочих равных (квалификация разработчиков, объем и сложность ПО, время разработки и т.п.) в 16 раз превышает плотность ошибок в программах на наиболее совершенном потомке Паскаля BlackBox’е (об этом языке речь пойдет ниже).
Тем не менее, именно те свойства языка C, которые делают его использование источником дыр в больших программах, привели к его популярности среди незрелых киддисов от программирования, рассматривающих его как игру, соревнование, арену демонстрации собственного «интеллекта». Важно понимать, что подобные явления не являются специфичными для программирования: в филологии и детской психологии хорошо известно аналогичное явление «детского фольклора» (страшилки и т.п.), демонстрирующее устойчивость на протяжении многих десятилетий. Таким образом, можно говорить о стихийном распространении своеобразной мифологии вокруг языка C и его производных, коренящейся в естественном недостатке знаний и опыта, а также в особенностях психики юных программеров - желания самоутвердиться среди сверстников («настоящие программеры пишут на C») и т.д.
Возникновение монструозно сложного языка C++, сочиненного путем тупого добавления к C без исправления его многочисленных дефектов модных конструкций объектно-ориентированного программирования (о недостатках C++ написаны целые трактаты), только усугубило ситуацию: многие по наивности путают сложность и мощь языка, об ошибочности чего постоянно говорил Н. Вирт.
Стихийное распространение в среде юных партизан от программирования порочной мифологии, возникшей вокруг языков C/C++, имеет резоны в примитивных архетипах подростковой психологии. К этому стихийному явлению нельзя относиться пренебрежительно по следующим причинам. Во-первых, на примере программистов, учившихся на фортране еще в 1960-х г., мы видим, как долго и упорно сохраняются в зрелом возрасте эмоциональные предпочтения и привычки программистского мышления, зафиксировавшиеся в юности (это явление отражено в старом анекдоте: «Пожилому программисту требуется домработница, говорящая на фортране»). Обучать современным эффективным методам программистов с уже сложившимися привычками почти невозможно, и такие программисты постоянно «тащат» в серьезные проекты эти негодные инструменты. Во-вторых, масса фанатов C/C++ создает стадный эффект: с одной стороны, на него ориентируются коммерческие издательства (которые, как показывает опыт, функционируют как мощный усилитель любого мракобесия, если только находится достаточно покупателей; напомним, что изначально потребность знать C была создана распространением операционной системы Unix, а теперь и Linux). С другой стороны, новички-самоучки (коих множество) не имеют другого ориентира, кроме правила «иди за толпой». Наконец, менеджеры под давлением сиюминутных обстоятельств вынуждены ориентироваться на «предложение» рынка рабочей силы. Возникает порочный замкнутый круг, который разрывается только в относительно специфических классах приложений (встроенные системы управления и т.п.), где в игру вступает неумолимая объективная реальность, разрушающая мифологию. В-третьих (и это самое главное), продолжающий расти массив программ, написанных на C/C++, есть постоянный источник проблем - от потерь времени пользователей (современные версии Windows продолжают регулярно падать, как и 15 лет назад, хотя и научились лучше сохранять работу), до дыр безопасности, связанных с дефектами программ (переполнение буфера, утечки памяти и др.). Дефекты, порожденные использованием таких опасных языков программирования, как C/C++, очень трудно устранять.
{В августе 2001 г. вице-президент Microsoft Джим Олчин объявил во время доклада на открытии конференции Intel Developers Forum в Сан Хосе, что в новой операционной системе Windows XP все возможные проблемы из разряда переполнение буфера были устранены посредством специального анализа исходных текстов на предмет безопасности (security audit). Но в декабре того же года была найдена «дыра» в одной из программ в составе Windows XP (в программах поддержки стандарта подключения внешних устройств Universal Plug and Play), причем, дыра оказалась именно из категории «переполнение буфера».}
The stanд…
Вообще, вся ситуация здесь выглядит совершеннейшим абсурдом: то, чего можно без труда добиться просто выбором качественного и простого языка программирования, решается... невообразимо сложным и дорогостоящим способом, а главной причиной, в конечном счете, оказывается умственная инерция программистов, в начале карьеры подвергшихся «заражению холерой C». Отсюда понятно, почему серьезные специалисты употребляют такие сильные выражения как «развращение малолетних», «интеллектуальная зараза» и т.п., говоря о языках C/C++.
Разумеется, проблемы C/C++ ощущаются и в индустрии (не все же там, в конце концов, «программные анархисты» или менеджеры), даже несмотря на то что конкуренция здесь ослаблена из-за быстрого расширения сферы IT. Именно поэтому возник язык Java, представляющий из себя попытку сделать то, что не сумели сделать авторы C++, а именно - не просто бездумно добавить на предательски ненадежную основу C все возможные новомодные средства, но и сделать какой-то осмысленный отбор, а также перепроектировать «основание» языка, исключив коварные ловушки, которыми знаменит C. При этом сильнейшее влияние оказал виртовский Оберон (компилятор которого, по сообщению Вирта, команда создателей Java изучила в исходниках, дав ему высокую оценку за несколько лет до выпуска Java) - строгая типизация, автоматическое управление памятью, отказ от множественного наследования - фактически, это отказ от главных культовых свойств C, делающих его столь опасным («полная свобода программисту, включая свободу делать любые ошибки»). Разумеется, чтобы убедить фанатов C согласиться с таким отказом, нужен был сильный способ отвлечь их внимание, и средство для этого было найдено в анти-майкрософтовских движениях, широко распространенных в мире IT. Дорогостоящая маркетинговая кампания, в значительной степени построенная на эксплуатации этой «обманки», имела успех.
Успех маркетинга Java привлек достаточно разработчиков, чтобы преимущества Java в плане производительности из-за отказа от культовой «свободы» C моли себя проявить. Вслед за Java возник и ее «близнец» С#. Однако, оба этих языка - это, прежде всего, инструменты конкурентной борьбы соответствующих корпораций за удержание разработчиков: именно поэтому эти языки постоянно усложняются - это делает почти невозможным перенос больших массивов программных текстов на другие языки, прочно привязывая разработчиков к соответствующей платформе. Разработчики же, исходя из мифических соображений «эффективности» и т.п. и не понимая долгосрочную цену своих решений, стремятся использовать все средства, предоставляемые языком, «увязая» в ловушке.
Выход zдесь
Блэкбокс (BlackBox) - весьма удачный и наиболее популярный вариант Оберона, реализующий язык программирования Компонентный Паскаль.
Авторы Блэкбокса - небольшая группа учеников Н.Вирта, объединившаяся в компанию Oberon Microsystems Inc.. Один из них - Клеменс Шиперский - является ведущим авторитетом актуальной методологии компонентно-ориентированного программирования, в настоящее время сотрудник стратегического исследовательского подразделения Майкрософт (!). Блэкбокс доступен бесплатно и с полными исходными текстами, защищен одной из стандартных лицензий «открытого кода», аналогично системе Linux (по настоянию пользователей, Блэкбокс использует одну из стандартных лицензий SleepyCat, в которых смягчен экстремистский характер лицензии GPL). Блэкбокс представляет собой полноценную операционную среду, «погруженную» в другие операционные системы и допускающую взаимодействие с ними. В настоящее время полная версия Блэкбокса работает под MS Windows, а полноценная серверная версия работает под Linux.
Блэкбокс изолирует программиста и пользователя от операционной системы, предоставляя уникальные возможности разработки приложений с интерактивной графикой - как стандартного типа, так и, что самое интересное, нестандартные. По отзывам профессиональных программистов - более мощную и современную, чем графическая система .NET.
Благодаря сочетанию эффективности, автоматического управления памятью и легкости создания специальной интерактивной графики Блэкбокс оказался весьма привлекательным для сложных научных расчетов синтетического характера («умные» численные алгоритмы, символическая алгебра большого объема, системы обработки данных и моделирования). Например, на Блэкбоксе создано ПО для расчета бортовых фазированных решеток истребителя Eurofighter; полный объем ПО - около миллиона строк. На Блэкбоксе сделана система управления крупнейшего каскада ГЭС на Амазонке (корпорация Astom Power), a также целый ряд других приложений, в т.ч. для экспериментальной и теоретической ядерной физики.
Все Обероны отличаются замечательной переносимостью, но Блэкбокс еще обеспечивает средства хорошей интеграции с операционной системой, в которую он погружен. Блэкбокс может быть поставлен и на «голое железо», а также использоваться как основа системы кросс-разработки (например, компонент Denia).
Подчеркнем, что BlackBox, хотя и аналогичен виртуальным машинам Java и .NET, но работает с эффективным компилируемым кодом. Благодаря этому программы, написанные на Компонентном Паскале в Блэкбоксе, качественно более эффективны, чем программы на Java и С#. В то же время сохраняется возможность компилировать Компонентный Паскаль как в Java, так и в MSIL (известный компилятор GPCP - Gardens Point Component Pasca).