Страница 23 из 25 Реализация и совместимость Синтаксический анализатор компилятора С++, 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 длиннее руководства по старому С, так что усилия по овладению новыми возможностями языка не должны быть непосильноа велики. В частности, усилия должны быть незначительны по сравнению с изучением нового языка со свойствами абстракции данных. Однако в случае, если классы используются для создания нового типа данных, фактически создается новый диалект языка. Это ведет к созданию различных несовместимых "диалектов". Это не так уж сильно отличается от существующего состояния дел, и есть надежда, что "стандартные" классы, предоставляющие базовые возможности типа в/в, множеств, таблиц, строк, графикии т.п.м обретут широкое использование. |