Cтраница 4
Язык Паскаль не обеспечивает возможности проведения раздельной трансляции. Поэтому авторы каждой реализации транслятора с языка Паскаль принимают на свой страх и риск решение о включении ( или не включении) в осуществляемую ими реализацию возможности проведения раздельной трансляции. Например, многие трансляторы с языка Паскаль не допускают возможности проведения раздельной трансляции ( как, например, интерпретатор языка Паскаль для мини - ЭВМ семейства VAX-11, разработанный в Калифорнийском университете ( г. Беркли), упоминавшийся в разд. ЮЛ), что соответствует и духу и букве языка Паскаль. Ряд трансляторов с языка Паскаль обеспечивает возможность описания того, что тело некоторой подпрограммы описано где-то в другом месте. Однако, как бы то ни было, все механизмы такого рода являются нестандартными и отличаются от реализации к реализации. [46]
При попытке воспользоваться описанным выше механизмом раздельной трансляции у программиста возникает ощущение, аналогичное ощущению мелкого воришки, надеющегося на сппю сообразительность и удачу. Во-первых, опция Е не используется в нормальном режиме работы, а используется только для случаев раздельной трансляции. Если случится, что две процедуры будут иметь одно и то же имя ( что, вообще говоря, допустимо, если эти процедуры имеют непересекающиеся области действия), то в результате раздельной трансляции с опцией Е обе эти процедуры будут иметь точки входа с совпадающим именем. Соответственно все обращения к обеим этим процедурам будут проинтерпретированы как обращения к одной, поскольку компоновщик откажется производить компоновку второй. Поэтому ( как сказано в документации) на самом деле в таких ситуациях следует пользоваться опцией Е -, обеспечивающей генерацию уникальных имен точек входа для всех процедур. На первый взгляд все кажется понятным. Однако возникает интересная ситуация. Предположим, что необходимо произвести раздельную трансляцию группы процедур. Однако так сделать нельзя, поскольку транслятор с языка Паскаль генерирует одни и те же уникальные имена точек входа для каждого случая раздельной трансляции. [47]
Несмотря на столь большую тщательность выполняемых в процессе трансляции проверок транслятор с любого языка программирования должен обеспечивать приемлемую скорость трансляции. Это требование приобретает особенно большое значение при разработке больших программных комплексов, таких, например, как операционные системы или трансляторы с различных языков программирования. Приемлемой является скорость трансляции порядка одной страницы исходного текста в секунду при выполнении трансляции на ЭВМ среднего класса. При обеспечении возможности проведения раздельной трансляции транслятор с некоторого языка программирования должен обеспечивать проведение всех тех проверок, которые были бы проведены в случае совместной трансляции, в том числе и проверок на соответствие типов. В противном случае возможность раздельной трансляции можно отнести к разряду тех благих намерений, которыми вымощена дорога в ад. [48]
Несмотря на столь большую тщательность выполняемых в процессе трансляции проверок транслятор с любого языка программирования должен обеспечивать приемлемую скорость трансляции. Это требование приобретает особенно большое значение при разработке больших программных комплексов, таких, например, как операционные системы или трансляторы с различных языков программирования. Приемлемой является скорость трансляции порядка одной страницы исходного текста в секунду при выполнении трансляции на ЭВМ среднего класса. При обеспечении возможности проведения раздельной трансляции транслятор с некоторого языка программирования должен обеспечивать проведение всех тех проверок, которые были бы проведены в случае совместной трансляции, в том числе и проверок на соответствие типов. В противном случае возможность раздельной трансляции можно отнести к разряду тех благих намерений, которыми вымощена дорога в ад. [49]
Все сколько-нибудь большие программы, написанные на языке Паскаль, страдают одним общим недостатком - отсутствием ясной модульной структуры. Например, обычно транслятор с некоторого языка программирования разделяют на фазы лексического, синтаксического и семантического анализа ( разбора) и фазу генерации объектного кода. В трансляторах с языка Паскаль ( написанных, как правило, на языке Паскаль) такое разделение на фазы оказывается весьма условным и осуществляется фактически лишь средствами комментариев. Поэтому с точки зрения практики пакеты, имеющиеся в языке Ада, представляют собой, быть может, наиболее существенное усовершенствование языка Паскаль, поскольку они позволяют осуществлять более эффективное использование компонентов программ. Обычно спецификаций пакета и соответствующее тело пакета подвергаются раздельной трансляции в процессе проектирования программы и в процессе ( более длительном) реализации программы. Таким образом, язык Ада поддерживает естественным образом подход сверху вниз к разработке программ. [50]