|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Становление и развитие языкаЭволюцию Си можно условно разбить на три стадии: детство (1971–1977), юность (1978–1988) и зрелость (с 1989 г.). В табл. 3 показаны основные вехи «большого пути». На первой стадии основное внимание уделялось технической стороне дела, на второй — во главу угла были поставлены популяризация и формирование сообщества пользователей, на третьей (после стандартизации) — начался процесс активного промышленного использования языка. Одним из определяющих событий стало появление в 1978 г. бестселлера K&R, иначе называемого «белой книгой» [1]. Он де-факто установил стандарт языка и сделал его каноническим как минимум на целое десятилетие. Ритчи вспоминает: «Керниган написал почти весь пояснительный материал, я же отвечал за приложение, куда было включено справочное руководство по языку, и за главу по взаимодействию с UNIX». Вот так и раскрылся секрет: язык создал Ритчи, а книгу в основном написал Керниган. Де-юре язык Си был стандартизирован в 1989 г. Американским национальным институтом стандартов (ANSI). Практически тот же самый стандарт был принят Международной организацией по стандартизации (ISO) годом позже. Формально с появлением ISO-стандарта ANSI-стандарт был изъят, но вместо ISO в среде разработчиков было принято все же говорить о диалекте ANSI C. По мнению Брайана Кернигана, «главные достоинства Си состоят в том, что он предоставляет программисту возможность полного управления реализацией и что программы, написанные на Си, работают, как правило, весьма быстро». Большое влияние на Си, помимо BCPL и B, оказал Алгол-68, в частности это касается схемы композиции типов, конструкций struct и union, приведения типов. Важным изменениям язык подвергся в 1972–1973 гг., когда шла подготовка к «погружению» в него ОС UNIX. Самым значительным из них стал препроцессор, на создание которого наибольшее влияние произвели идеи Алана Шнайдера и механизмы импорта файлов в языках BCPL и ПЛ/1. Условная компиляция и макросы в Си появились в тот же период благодаря работам Майка Леска и Джона Рейзера. Что касается стандартной библиотеки ввода-вывода, ставшей важной составляющей популярности и практической ценности языка, то она была разработана в 1973 г. там же, в Bell Labs, Майком Леском. «Си — это инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В этом малоизвестном утверждении Кернигана скрыт важный смысл. Он пытается отвратить программистов от бездумного применения всех имеющихся в их распоряжении средств. «Какова роль языка? — размышляет он. — Основной движущей силой эволюции языков программирования стала попытка предотвратить ошибки, используя возможности этих языков. Одни из таких возможностей уменьшают шанс появления целых классов ошибок: проверка диапазонов индексов, ограничение использования указателей или полный отказ от них, сборка мусора, строковые типы данных, типизированный ввод-вывод, строгая проверка типов. Однако другие возможности языка напрашиваются на ошибку, например оператор goto, глобальные переменные, свободно применяемые указатели, автоматические преобразования типов. Программистам следует знать зоны повышенного риска в своих языках и обращаться с ними особенно осторожно». Сегодня Си, как и Паскаль, нередко подвергают критике, во многом вполне справедливо. Даже сам Керниган признает: «Сравнивая способы, которыми программы на Си и Java представляют и обрабатывают одни и те же структуры данных, следует отметить, что в случае Java функциональные обязанности разделены лучше». Бывают и более резкие оценки. Так, Питер Мойлан не без сарказма замечает: «Бытует мнение, что Си апеллирует к «мужскому началу» программистов, которым нравится сражаться с малопонятными ошибками и находить невероятные и хитроумные решения проблем. Многих привлекает и компактность нотации Си. Похоже, сторонники этого языка считают, что возможность написать такой, скажем, оператор, как **p++^=q++=*r-s, служит серьезным аргументом в пользу применения Си, поскольку экономится время. Скептик может возразить: такое ускорение сведет на нет необходимость в дополнительных комментариях. Достаточно просмотреть несколько типичных программ на языке Си, чтобы убедиться: на комментариях здесь тоже экономят, причем даже так называемые профессиональные программисты». Ахиллесовой пятой языка Си, как и в случае классического Паскаля, является отсутствие поддержки модулей (хотя бы в понимании Ады и Модулы-2) и, следовательно, полноценной раздельной компиляции. Суррогат в виде препроцессорных директив «#include» не спасает ситуацию, а лишь усугубляет ее еще больше. Вместо раздельной компиляции получается независимая, при которой вопросы рассинхронизации интерфейса и реализации решаются весьма замысловатым и ненадежным образом. Что уж тут говорить о поддержке контрактных форм интерфейсов, исповедуемых Бертраном Мейером, автором языка Eiffel. Но Кернигану надо отдать должное. Критику он признает и отмечает: «Препроцессор Си — мощный, но несколько туповатый инструмент, а макросы — вообще довольно опасная вещь, поскольку они изменяют лексическую структуру программы». И все же недостатки — оборотная сторона достоинств. Если бы в отношении Си это было бы не так, вряд ли язык дал бы жизнь многим своим потомкам (см. табл. 4), среди которых самым известным стал Си++. При создании Си++ Бьерн Страуструп искал базовый язык для расширения его концепцией классов из языка Симула. Как альтернатива Си, по словам Страуструпа, рассматривались Модула-2, Ада, Smalltalk, Mesa и CLU. Но предпочтение было отдано все же Си.
Появление благодаря работам Бьерна Страуструпа языка Си++ (1984), ставшего фактически главным языком программной индустрии, а также повальное увлечение объектно-ориентированным проектированием и программированием заставили уйти в тень его именитого предшественника — язык Си. С другой стороны, в ходе программной эволюции возникли два направления, которые закрепили за языком Си статус безусловного лидерства: API-программирование и перенацеливаемые компиляторы. Программные интерфейсы (API), порождаемые бесчисленными производителями ПО и понимаемые в широком смысле как интерфейсы системного и прикладного программирования, формируются с прицелом на Си. Остальные языки вынуждены либо пользоваться этим слоем, либо подстраивать его под себя, что в условиях безудержной гонки версий создает массу проблем. Итак, при формировании программной инфраструктуры Си стал основным связующим слоем между разнородными системами и компонентами. Другой его конек — генерация промежуточного кода с настройкой на особенности целевой платформы. Если раньше при разработке компиляторов кодогенератор «затачивался» под конкретную аппаратную и операционную платформу, то сейчас требуется гибкость перенацеливания генерации. А ее проще всего бывает обеспечить, если выбрать Си в качестве языка промежуточного представления программного кода, сводя, как в математике, новую задачу к уже решенной. Брайан Керниган особо отмечает эту важную роль языка Ритчи: «Си часто используется в качестве языка ассемблера высокого уровня. Modula-3 и Си++ относятся к тем языкам общего назначения, для которых первые компиляторы создавали код на Си, обрабатывающийся уже затем стандартным компилятором... Подобный подход очень помог этим языкам на ранних стадиях их внедрения». Неизменность языка Си на протяжении многих лет и стала одной из серьезных предпосылок для его лидерства в упомянутых областях. Теперь же, с выходом стандарта C99, ситуация становится менее ясной. Си фактически превращается из подмножества Си++ в самостоятельно развивающийся язык, нарушая сложившуюся в последние годы и уже успевшую укорениться структуру связей, когда эти языки применялись неразрывно. Бьерн Страуструп высказывает серьезную озабоченность подобными обстоятельствами: «Новшества Си-99 (C99) касаются расширения низкоуровневых средств Си в области численного программирования, а включенные в Си++ средства абстрагирования и универсализации в основном проигнорированы. Это усложняет достижение совместимости, поскольку в Си добавляются специализированные возможности для конкретных случаев, а в Си++ те же потребности программиста удовлетворяются с помощью библиотек, реализованных с применением языковых средств общего назначения». По поводу нового стандарта и сам Ритчи выражает свое мнение сдержанно-скептически [9]: «Я был удовлетворен стандартом ANSI/ISO 1989–1990 гг. Новый стандарт C99 намного более громоздкий, и хотя комитет сообщил, что потратил значительную часть своего времени на отсеивание предложений о нововведениях, принял он тоже немало, и все это еще предстоит переварить. Я определенно не хочу дополнительных возможностей и, очевидно, предпочел бы, чтобы комитет сопротивлялся более стойко... Стандарт C99 мне не очень нравится, однако я не пытаюсь его отменить. Комитет отлично поработал; Си действительно должен развиваться». Однако где проходит та грань, которую при внесении изменений в язык нельзя переступать? Главное, чтобы новации не приводили к еще более серьезным проблемам, к появлению таких побочных эффектов, которые перечеркнули бы весь выигрыш от новых чудодейственных «препаратов». Тони Хоар в этой связи отмечает: «Программистам всегда приходится соприкасаться со сложностью, и этого нельзя избежать. Наши приложения сложны, потому что мы честолюбивы и стремимся использовать наши компьютеры все более сложными способами. Программирование сложно из-за большого числа противоречивых целей, преследуемых каждым программным проектом. Если наш основной инструмент, язык, на котором мы составляем и кодируем программу, также непрост, то сам язык становится частью нашей проблемы, а не ее решения. Когда какой-нибудь проект нового языка близится к завершению, то всегда возникает безумная спешка — нужно внести новые свойства еще до стандартизации. Это стремление действительно безумно, потому что оно заводит в ловушку, из которой нет выхода. Недостающие свойства всегда можно добавить позже, когда их конструкция и последствия будут хорошо поняты. Свойство, включенное до того, как стало понято, никогда нельзя изъять позже». С такой позицией солидарен и другой классик программирования — Эдсгер Дейкстра: «Я вспоминаю одну лекцию на симпозиуме по языкам программирования высокого уровня, прочитанную в защиту языка ПЛ/1 человеком, который называл себя его преданным пользователем. Но в конце этой часовой лекции, восхваляющей ПЛ/1, он ухитрился попросить добавления около 50 новых «свойств», совсем не предполагая, что основным источником его трудностей является именно то, что язык и так имеет слишком много «свойств». Лектор проявил все удручающие симптомы наркомании: дошедший до отупения, он мог лишь просить все больше, больше, больше...» Бьерн Страуструп все же надеется, что разрыва между Си и Си++ удастся избежать. Он подчеркивает: «Моим идеалом по-прежнему остается единый язык, и техническая возможность слить Си++ с C99 пока сохраняется. На мой взгляд, такой язык мог бы соответствовать любым разумным техническим условиям. Однако я не уверен, что это приемлемо политически. Для начала потребовалось бы объединить комитеты по стандартизации Си и Си++: нельзя было бы иметь две различные группы, параллельно развивающие два языка». Вне зависимости от того, по какому пути пойдет Си, возникает вопрос: останется ли Си и через пять или десять лет таким же популярным и незаменимым, как сейчас? Деннис Ритчи на сей счет высказывается очень осторожно: «Я, честно говоря, не знаю ответа на этот вопрос. Могу только заметить, что программное обеспечение в целом труднее поддается замене, чем аппаратное. Скажем, число программ на Си++ и Java, вероятно, растет быстрее, чем число программ на обычном Си, но я готов спорить, что Си сохранится. Инфраструктура не позволит его вытеснить. То же самое, конечно, можно сказать и о других языках (например, о версиях Паскаля, о языке Ада)». В чем же секрет феномена Си? Деннис Ритчи в своем выступлении на Международной конференции по истории языков программирования (1993) сформулировал разгадку так: «Язык Си — это невероятный, оглушительный и огромный успех. Хотя повороты судьбы ему помогали, он безусловно удовлетворил потребности в таком языке реализации систем, который был достаточно эффективным, чтобы заменить ассемблер, и в то же время достаточно абстрактным и гибким, чтобы описывать алгоритмы и взаимодействия в широком спектре программных сред». Да, Си, несмотря на справедливую критику в его адрес и техническое несовершенство, все же сумел завоевать мир. Ибо — такова жизнь. «Существует масса прекрасных языков (прекраснее, чем Си), которые не привились,— признает Ритчи,— но кто-то все же выигрывает...»
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |