Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 31
Текст из файла (страница 31)
2Л2. АЬ006 68 (1968) АЬ00660 (1960) 6(МЦ(А1(! 964) 81М(Л.А 67 (1967) дмавайс-80 (1980) Рис. 2.12. Генеатагия языка Ба1а(йай 2.16. Объединение императивных и объектно- ориентированных свойств: язык С++ Происхождение языка С рассматривалось в разделе 2.12; происхождение языка Бша(йай( — в разделе 2.15. Язык С++ представляет собой надстройку над языком С, поддерживающую большинство возможностей. открытых языком Бтаййайс Чтобы улучшить императивные свойства языка С и приобрести поддержку объектно-ориентированного про)раммирования, язык С++ прошел через ряд послеловательных модификаций. 2.16.1. Процесс разработки Первый шаг на пути от языка С к языку С++ был сделан в 1980 году Бьярни Страуструпом (В)агпе Ьпоцзпцр) из компании Вей Ьа(701а(ог)ез.
Изменения заключались во введении проверки и преобразования типов параметров функций и, что представляется более важным. классов, родственных аналогичным структурам языков 8(МИ.А 67 и Бгла!)шъ. Помимо этого в язык были включены производные классы, управление открытым/закрытым лоступом к унаследованным компонентам, конструктор и деструктор, а также дружественные классы.
В течение 1981 года были добавлены (пйпе-подставляемые функции, параметры по умолчанию и перегрузка операторов присваивания. Полученный язык был назван языком с ич!1)1 с!аиез, а его описание выполнено страуструпом (Бпоцзпцр, 1983). Полезно рассмотреть несколько целей языка С ий)( С!аззез. Основной его целью было — предоставить язык, на котором программы могли бы формироваться тем же обра- 112 Глава 2. Обзор основных языков программирования зом, что и в языке 8!МО(.А 67; т.е. с классами и наследованием. Кроме того, важно оыло не потерять производительность по сравнению с языком С.
Таким образом. язык С и !гав С!аззез мог использоваться лля тех же приложений, что и язык С, прн этом были сохранены практически все ненадежные свойства языка С. Например, введение проверки диапазона изменения индексов массива лаже не рассматривалось, поскольку это привело бы к значительному снижению производительности по сравнению с языком С. К 1984 году этот язык был расширен за счет включения виртуальных функций.
обеспечиваюших динамическое связывание вызовов функций с их описаниями; перегрузки операторов и имен функций; а также ссылочных типов данных. Эта версия языка, названная С++, была описана Страуструпом (бггоцзгп!р, 1984). В 1985 голу появилась первая лоступная реализация языка С '- — система Сггоп!. которая транслировала программы на языке С > в программы на языке С, Эта версия системы Сб.ои вмесге с реализованной на ее основе версией языка С + получила обшее название де!еаза 1.О.
Описание полученной системы было выполнено Страуструпом (бпоцзпир, 1986]. Между 1985 и 1989 годами язык С++ продолжал эволюционировать. ориентируясь главным образом на реакцию пользователей его первой распространенной реализации. Следующая версия была названа Ке!сазе 2.0. Ее реализация с помошью системы Сггопг была выполнена в июне 1989 года. В язык была добавлена поддержка множественного наследования (классы, имеюшие несколько родительских классов) н абстрактных классов. и внесены другие изменения.
Абстралтные классы рассматриваются в главе 11. Версия йе)еазе 3.0 была выпушена в конце 1980-х годов. Она содержала специфика- торы шаблонов, предоставлявшие собой параметризованные типы, и обработку исключительных ситуаций. Версии Ке1еазе 2.0 и йе!еаза 3.0 были описаны Эллисом и Страуструпом (ЕНВ апд Ягоцзггир, 1990). 2.16.2. Обзор языка Для поддержки объектно-ориентированного программирования необходим механизм классов/объектов, происходяший от языка ЫМБ(.А 67 и являющийся основным свойством языка Ьша1йа!к.
Язык С++ предоставлял пользователям набор встроенных классов. а также возможность самостоятельно определять классы. Классы языка С е — типы данных, экземпляры которых, подобно классам языка Бша!йа1к, могут создаваться в любом количестве. Результатами создания экземпляров в языке С++ являются просто объекты. или объявления данных. В описании класса указываются объекты данных (даниыечлены) и функции (функции-члены). Классы могут называть один или несколько родительских классов, обеспечивая наследование и множественное наследование.
соответственно. Классы наследуют данные-члены и функции-члены родительского класса. определенные в качестве наследуемых. Операторы в языке С++ могут перегружаться, что означает возможность приписывать сушествуюшим операторам новый смысл и применять их к определяемым пользователем типам данных; Функции языка С++ также могут перегружаться, что позволяет определять одноименные функций. изменяя либо количество, либо тнп используемых в них параметров. Динамическое связывание в языке С++ обеспечивается функциями вирзуального класса. Эти функции определяют операции, зависяшие от типов, используя ддя этого перегруженные функции, а также набор классов. связанных между собой методачи наследования.
Указатель на объект класса А может указывать и на объекты классов. насле- 2.16. Объединение имперотивных и объектно-ориентированных свойств... 113 дующих кзасс А. Котла полобный указатель указывает на перегруженную виртуальную функцию, функция, соответствующая текущему типу, выбирается динамически. На функции и классы может действовать спецификатор шаблона, что означает возможность их параметризации.
Например, функция может быть записана в виде шаблонной функции, что позволяет иметь ее версии для разнообразных типов параметров. Подобную гибкость имеют также и классы. Язык Сь+ содержит обработку исключительных ситуаций, которая значительно отличается от аналогичного свойства языка Аба. Одним из отличий является невозможность обработки исключительных ситуаций, обнаруживаемых на аппаратном уровне. Обработка исключительных ситуаций в языке С++ рассмотрена в главе 13. 2 16.3.
Оценка Язык С+~ быстро стал и остается очень популярным языком. Одним из факторов его популярности является доступность хороших и недорогих компиляторов. Кроме того, язык Сь- практически полностью совместим с предшественником — языком С (что позволяет компилировать большинство программ, написанных на языке С, как программы, написанные на языке Сь+ и связывать команды языка С++ с командами языка С). Наконец, программисты сейчас настойчиво интересуются объектно-ориентированным программированием, а язык С++ — его инструмент. Недостатком же языка С++ является его объемность и сложность, т.е. он страдает от тех же изъянов. что н язык Р1Л.
Язык С++ унаследовал большинство ненадежных моментов языка С, что делает его менее належным, чем такие языки, как Ое1рЬ1, Ада н Зата. !!аконец, частично из-за его происхождения от языка С, язык С++ более. чем язык АЕООЕ 68, похож на язык Р1Л тем, что он представляет собой скорее набор идей, собранных вместе, чем результат комплексного плана по разработке языка.
К объектно-ориентированным свойствам языка С+~ мы еше вернемся в главе 11. Происхождение языка С++ показано на рис. 2.10. 2.36.4. Родственный язык: в!тте! Язык ЕИТе1 представляет собой еще один смешанный язык, содержащий как импера~нвные, так и объектно-ориентированные свойства (Меуег, 1992).
Язык ЕИТе! был разрабоган одним человеком, Бертраном Мейером (Вепгапд Меуег), французом, проживающим в Калифорнии. Этот язык содержит свойства поддержки абстрактных типов ланных, наследования и динамического связывания и полностью поддерживает объектноориентированное программирование. Самым характерным свойством языка ЕИТе! является встроенное в него использование утверждений для создания принудительного "контракта' между подпрограммами и вызывающими их операторами.
Эта идея появилась еше в языке Р!ап!са!кй1, но игнорировалась большинством языков, разработанных после него. Сравним языки ЕИТе! и С++. Язык Е!(Ге! меньше и проще языка С++ при практически одинаковой выразительности и легкости написания программ. Причины высолой популярности языка С++ на фоне ограниченною использования языка ЕИТе! определить нетрудно. Язык С++ позволяет компаниям — разработчикам программного обеспечения легко перехолить к объектно-ориентированному про!раммированию, поскольку в большинстве случаев их сотрудники уже знакомы с языком С.
Язык же ЕИТе! не имеет такого легкого способа восприятия. Кроме того, в первые несколько лет широкого иснольюванпя языка С++ система С(гоп! была доступной и недорогой, в то время как в Глава 2. Обзор основных языков программирования первые голы существования языка ЕНТе1 его компиляторы были менее дост> иными и более дорогими. Язык С++ имел за плечами престижную колгпанию Вей ЕаЬогагог1ез. тогла как за языком Е!!Те1 стоял Бертрана Мейер и его относительно небольшая компания по разработке программного обеспечения 1шегасбке Бойч аге Епб1пеег!пд.
2.17. Программирование в М(ог!д %Лье М(еЬ: язык Зача Разработчики языка >ата взяли в качестве основы язык С ~. удалили многочисленные конструкции, что-то изменили, что-то добавили. В результате язык сохранил мошь и гибкость языка С~+, но стал меньше, проше и надежнее. 2.17.1. Процесс розроботки Язык 5ата разрабатывался для целого набора приклалных областей. в частности программирования таких встроенных бытовых электронных устройств, как тостеры. микроволновые печи и интерактивные телевизионные системы.
Может показаться, что при разработке программного обеспечения для микроволновой печи належность не важна. Если на печь будет установлено неправильно функцнонир>юшее программное обеспечение, зто не создаст смертельной опасности ни для кого и, вероятно, не приведет к крупным судебным разбирательствам. Тем не менее, если программное обеспечение конкретной модели будет признано дефектным после продажи миллиона единиц товара. то их изъятие может обернуться потерей значительной суммы.