Бьерн Страуструп - Абстракция данных в языке С++ - Реализация и совместимость
ОГЛАВЛЕНИЕ
Реализация и совместимость
Синтаксический анализатор компилятора С++, c f r o n t м
состоит из программы синтаксического разбора на языке YACC [8]
программы на С++. Классы использовались очень широко. Он
примерно такого же размера, как эквивалентная часть компилятора
РСС для старого С (13,501 строк, включая комментарии).
Он выполняется немного быстрее, но использует больше памяти.
Количество используемой памяти зависит от числа внешних
переменных и размера наибольшей функции. Он не может выполняться
на машинах со 128К-байтовым адресным пространством (типа
PDP-11/71 (*1) ; более подходящее количество требуемой памяти
примерно раза в три больше. Выходом является код во внутреннем
представлении, полностью прошедший типовой контроль. Затем он
может быть преобразован в подходящий ввод для старого и нового
кодогенераторов.В частности, можно получить версию любой С++ -
программы на "старом" С. Это обстоятельство делает тривиальным
перенос c f r o n t в любую систему со старым С-компилятором.
С некоторыми исключениями компилятор С++ понимает старый С.
Среда времени выполнения, соглашения по редактору связей, методы
спецификации раздельной компиляции остаются без изменений. Самая
главная несовместимость состоит в том, что описание функции,
например:
int f();
в старом С объявляют функцию с неизвестным числом аргументов
неизвестных типов.В С++ данное описание определяет,что f не
принимает аргументов. Существует С++ - версия описаний стандартных
библиотек, такжеа разрабатывается программаа для получения
"отсутствующих описаний" для набора исходных файлов. Другое
отличие состоит в том, что в С++ нелокальное имя может быть
использовано только в том файле, где оно определено, если только
оно явно не объявлено внешним ; в старом С нелокальное имя
является общим для всех файлов (многофайловой) программы, если
только оно явно не объявлено статическим. Некоторые
незначительные неприятности могут вызвать имена, совпадающие с
новыми ключевыми словами: c l a s s , c o n s t , d e l e t e,
f r i e n d , i n l i n e , n e w , o p e r a t o r ,
o v e r l o a d , p u b l i c , t h i s , v i r t u a l .
Часто утверждается, что одним из достоинст в С является то,
что он настолько мал, что любой программист понимает каждую
конструкцию языка. Напротив, такие языки, как PL/1 и Ада,
представляют так, что, якобы, каждый программист пишет на своем
собственном подмножестве языка и весьма с большим трудом понимает
программы, написанные другими. Отсюда следует, что расширять С -
плохо. Этот аргумент против "больших" языков игнорирует тот
простой факт, что зависимости между структурами данныха и
функциями, использующими их, существуют в программе независимо от
того, входят функции или не входят в описание класса.
_________________________
(*1) - Торговая марка Digital Equipment Corporation.
Программы, использующие классы, имеют тенденцию к тому, чтобы быть
неожиданно короче, чем их неструктурированные эквиваленты (обычно
- от 1 до 10 короче; имело место и 50%-ое сокращение). Более
того, С уже достаточно большой язык для того, чтобы существовали
"субкультуры", использующие подмножества языка,
макровозможности часто используются для создания сомнительных,
маловразумительных вариаций языка С.
Руководство по c f r o n t всего на 14 длиннее руководства
по старому С, так что усилия по овладению новыми возможностями
языка не должны быть непосильноа велики. В частности, усилия
должны быть незначительны по сравнению с изучением нового языка
со свойствами абстракции данных. Однако в случае, если классы
используются для создания нового типа данных, фактически создается
новый диалект языка. Это ведет к созданию различных несовместимых
"диалектов". Это не так уж сильно отличается от существующего
состояния дел, и есть надежда, что "стандартные" классы,
предоставляющие базовые возможности типа в/в, множеств, таблиц,
строк, графикии т.п.м обретут широкое использование.