Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 83
Текст из файла (страница 83)
В основном разработка языка С+« была закопчена к 1986 г., а в июне 1989 г. была вьшущсна вторая всрсия. В 1989 г. в Американском национальном шц титутс стандартов (АЫ81) был создан комитет ХЗ116, который к 1994 г. выпустил черновой стандарт языка, а чсрсз два года — его полнь>й стандарт. 294 Глава 5, Инкапсуляция Обзор языка В.1. С+ — (произносится как «более или менее С») Воэможности. В отличие от С+э С+- — субьективно ориентированный язык.
Каждый экземпляр классаС«-, известный как субъект, имеет скрытые члены, известные как предубеждения или необъявленные предпочтения, которые являются непробиваемыми предпочтениями, которые невосприимчивы к внешним сообщениям, а также открытые члены, известные как хвастовство или амбиции. Следующие операции С перегружены в Сн- так, как приведено ниже: > лучше чем; < хуже чем; » гораздо лучше чем; «забудьте это; ни за что на свете; сравнимы, две разные вещи являются одним и тем же. С+- является строго типизированным языком, основанным на стереотипах и логике, основным постулатом которой является «Я всегда прав».
Булевы переменные истина и ложь (которые в менее реалистичных языках считаются константами) дополнены такими, как а па«ажно и свини тельно, еще менее четко определенными, чем традиционные нечеткие категории Заде. Все булевы величины могут быть объявлены с модификаторами сильный и слабый. Говорят, что слабая импликация «сохраняет отрицание» и была добавлена по требованию Министерс~ва обороны для совместимое~и с будущими версиями языка Аба. Правильно построенные ложные утверждения совместимы в операции присваивания с любыми булевыми переменными.
Циклы что-если и лсчеиу-не управляются специальным условным оператором дане-если-не Х то!за у. С«- поддерживает сокрытие информации и, только среди дружественных классов, обмен сплетнями. Недружественные классы, заимствованные из лексикона языка Е!((е(, могут взаимно уничтожить друг друга путем заключения контрактов. Заметим, что дружественные отношения между классами являются нетранзитивными, непостоянными и не-Абелевыми. Механизмы простого и множественного наследования реализованы с использованием случайных мутаций. Правила лишения наследства [денаследование) подчиняются сложным официальным про~окопам. Помимо базовых, производных, виртуальных и абстрактных классов в С+- поддерживаются внугриугробные классы. В некоторых локальных версиях языка разрешен вывод полигамных и побочных классов.
Свободные связи между классами недопустимы, поэтому введены операции брака и раааоаа: брак(Родитель М1,Родитель Ж1]; //теперь можно выводить дочерние классы //определение класса МуВс!азз зс)азз Мусс!азз; рц)тйс Родитель М1, Родитель Ж1 //незаконнорожденный класс!! вс)азз уоцгВс!азз: рцЫ)с Роди~ель М1, Роди~ель Ж2 развод(Родитель М1, Родитель Ж1); брак(Родитель М1, Родитель Ж2); //теперь это по правилам зс1авз уоцгВс!азз: рыЫ!с Родитель М1, Роди~ель Ж2 Правила, задающие порядок приоритетов операций, могут быть временно отменены с помощью директивы компилятора()рга9ата оит аЬ известной как прагма Кбо ууба1 ! меап» (« Делай то, что я говорю»]. Язык устойчиво сопротивляется А)чБ)фикации. Девиз языка С+ — «Каждый сам для себя стандарт».
Ссылки. Из Ь. Кейу-Воо1)е, "ТПе Оеиуз А! ()~с1)опагу", А! Бхрег(, (Арп! 1991), 51. Перепечатано в Б. Кейу-Воо()е, "ТПе Согпрц1ег Соп1гатйс()влагу", М!Т Ргезв (1995). Воспроизведено с разрешения автора. 6.7. Задачи и упражнения 295 Краткий обзор языка. Язык Сч-ч- является производным от языка С. Основным отличием языка Сч.+ является наличие классов и механизма наследования объектов класса другими классами. При разработке языка Сч-ь руководствовались следующими тремя принципами: 1) использование классов не должно приводить к более медленному выполнению программ по сравнению с программами без классов; 2) программы на С рассматриваются как подмножество программ на Сч-ь, то есть добавление классов нс должно приводить к тому, что какие-либо свойства С нс будут вклгочены в Сч-ч-; 3) не должна снизиться эффективность выполнения программ. Но большей части все три цели были достигнуты.
Компилятор Сч-ч- способен компилировать большинство программ на С, хотя между этими языками все же существует некоторос несоответствие. Строгая типизация Сч-+ действительно более строгая, чем в С. В Сч-ь были добавлены некоторые зарезервированные слова Среди прочих изменений можно отметить добавление новой формы комментариев; дополнительно к С-комментариям /*...*! был добавлен их новый форматгггг, означающий, что все, что следует за символами гг/ до конца строки, является комментарием.
Также расширились возможности ввода н вывода за счет добавления функций обработки потоков с1п и соп1. Добавлены исклк>чсния, перегрузка операций н форма общего класса под названием шаблгои. б.б. Рекомендуемая литература Три классические статьи, в которых рассматриваются центральные концепции программирования — абстракция данных и сокрытие информации, — это 137), [51) и ~86!.
Определение и реализация различных форм абстрактных тинов данных было предметом изучения и темой многочисленных статей в 70-е гг. В 1977 г. на конференции ЛСМ 1122) были описаны языки С1Л), Л1.РНЛЕР и ЕБС).1Р, Первым широко признанным языком с выраженной возыожностьк> определения абстрактных типов данных стал язык Лс)а 157], хотя 5шайгайс опередил в этом отношении Ада почти на десять лет. Но Вп1а111ай стал приобретать статус одного из основных языков программирования только в последнее время, о чем мы расскажем в разделе 7.2А, В большинстве работ, посвященных созда| ~ ию компиляторов, исследукзтся стеки и стратегия статического распределения памяти (см, ссылки в главе 3). б.7.
Задачи и упражнения 1. Пусть у нас имеется связанное представление вектора Ч, как на рис. 6.1. Напишите алгоритм для определения местоположения компонента Чгй). Предполагается, что дескриптор имеет адрес а, его поле с указателем на первый компонент вектора в блоке дескриптора имеет сдвиг ~ и каждый компонент хранится в о~дельном блоке памяти.
В каждом блоке сдвиг поля указателя па слсдук>щий компонент равен 'х. Глава б Инкапсуляция Предположим, что объявление вектора У задано с использованием некоторого перечислясмого типа в качестве набора индексов Например, с1ааатуре - (ггеа». 5орп, зоолог, 5ею ог, Вгадоаге> гп аггау [С1ааатуре! оГ геа1. + Предложите подходящий способ представлспия в памяти вектора В (включая дсскриптор) и выведитс формулу доступа для вычисления местополо>кспия компонента Ч[> !. + Покажите, как изменится способ прсдставлепия и формула доступа, если У будст объявлен как у аггау [Зоп>ог. Вгадоа[е! оГ геа1 Приведитс формулу доступа для вычисления местоположения элемента матрицы Л[! . Л1, развернутой по столбцам, объявление которой выглядит слсдующим образом: А, аггау [[В, ВВ,, [В, .
ВВ,! Многие вычислспия с использованием матриц включа>от в себя последовательную обработку вссх элементов какого-либо столбца или строки. Обычно эта обработка реализована в впдс цикла по одному из индексов ! или ), в котором элементы матрицы А[1. В! обрабатываются последовательно по мсреувсличспия индекса на единицу. В таких случаях независимое вычисление!-значения для каждого элемента А[1. Я в каждом цикле очень неэффективно. Можно гораздо проще вычислить 1-значение злемсцта А[!,,Ц вЂ” через 1-значеппс элемента А[1 - 1, В! (в прсдположспни, что меняется индекс 1). Напишите формулу для такого рскурсивного вычисления адреса злсментов матрицы.
Обобщите эту формулу на случай массива с произволы п>й размерностью для цикла, в котором измспястся произвольный индекс этого массива. В языкс В!МВСй!РТ многомсрныс однородные массивы представлены как векторы указателей, которыс указыва>от на другис векторы, состоящие из указателей и т. д.
Количсство уровнсй этой структуры вскторов совпадает с размерностьк> исходного массива. Числовая и п.рица размером 3 х 4 представлсна векгором с громя укжтатсл ямп, каждый из которых указывает на вектор, состоящий из четырсх элементов. Для такого прсдставления предложите алгоритм доступа к элемснту А[1. В!.
Сравнитс относитсльпую эффективность использованияя памяти и лоступа к элсмен там массива между этим способом представленияия и обычным послсдоватсльным представленном массива. Рассмотрите этот вопрос как для матриц, так и для массивов более высоких размерностей. Для многомсрпых массивов: + прсдложитс способ создания дсскриптора для вскторных сечений, если нместся дескриптор всего массива; + сконструируйте дескриптор времени выполнения для двухмсрных сечсний (плоскостей в трехмсрном массивс), который позволял бы использовать такуа> же формулу доступа, как и для обычных матриц; + в случае произвольного двухмсрного квадратного массива (то ость массива А[п. п!) разработайте дескриптор для всктора, представляющего собой главную диагональ массива (то есть для вектора А[>, 1!).
6.7. Задачи и упражнения 297 7. Поскольку большая часть аппаратных средств компьютеров не обеспечива- ст непосредственную поддержку проверки соответствия значений индексов массива заданному диапазону при доступе к его компонентам, стоимость этой проверки, проводимой каждый раз при обращении к какому-либо компоненту массива, может оказаться достаточно высокой как в отношении времени выполнения, так и в отношении памяти, требуемой для хранения дополнительного кола. Выберите какой-либо известный вам язык программирования и определите для этого языка относительную стоимость (в отношении времени выполнения дополнительного кода и необходимой памяти) проверки индексов при доступе к компонентам двухмерной матрицы А(!,,Ц.
При возможности распечатайтслистиш обьсктпого кода, сгенерированного компилятором языка, в котором осуществляется проверка индекса на принадлежность диапазону, для какой-.либо простой программы, выполняющей доступ к элементам некоторого массива. После его анализа определите, какие инструкции сгенерировал компилятор для проверки соответствия значений индекса объявленному диапазону и какое время было затрачено на их выполнение в случаях с проверкой и без проверки. 8.