Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 29
Текст из файла (страница 29)
Выражения являются ос- Зд. Синтаксис языка программирования 101 ионными синтаксическими блокамп, из которых строится оператор (а иногда и программа). В императинпых языках (например, в языке С) выражения формируют основные операции, позволяющие изменять состояния компьютера при выполнении каждого оператора. В функциональных языках, таких как М1 или 118Р, выражения используются для управления последовательностью действий. Мы обсудим построение выражений более подробно н главе 8. Операторы.
Операторы являются самыми важными синтаксическими компонентами императивных языков — доминирующим в настоящее время классом языков. Отсинтаксисаоператоронзависятрегулярностьязыка,удобствочтения изаппсп программы. В некоторых языках принят единственный формат записи операторов, в других используются различные форматы для различных типов операторов.
В первом случае обеспечивается регулярность языка, во втором — удобство чтения. В 8НО ВО14 имеется только синтаксис одного основнога оператора — оператора сопоставления с образцом и подстановки, все остальные типы опера~оров гюлучаются из оснонного путем удаления тех или иных его элементов. Но в большинстве языков наблюлается другая край ность: каждый тип апе рата ран имеет спою синтаксическую структуру. В этом отношении самым ярким представителем являешься СОВО).: каждый оператор этого языка имеет свою особую структуру, н которую входят ключевые и необязательные слова, альтернативные конструкции, необязательные элементы и т.
д. Преимушество использования разнообразных синтаксических струкзур, конечно, заключается в том, что операции могут быть выражены естественным образом. Более существенное различие в структурах операторов затрагивает различие между структурированными (или вложенными) и простыми онераторами. В простом операторе, очевидно, не содержится других встроенных операторов. В языках АР(. и БАЖОВО(.4 допускаются только простые операторы.
В структуриронанном операторе могут содержаться дру1 ие встроенные операторы. Преимущества структурированных операгорон обсуждаются более подробно в главе 8. 3.1.3. Общая структура программы-подпрограммы Обедая синтаксическая организация основной программы и определений подпрограмм варьируется в таких же широких пределах, как и другие аспекты синтаксиса языка. Отдельные определения подпрограмм.
Язык С является примером такой организации языка, при которой каждое отдельное определение подпрограммы рассматривается как отдельный синтаксический компонент. Каждая подпрограмма компилируется отдельно, и затем все они связыва1отся в единую программу во время загрузки. Объектная ориентация требует, чтобы информация передавалась от одного к другому независимо откомпилированному компоненту программы.
Наследование опрелелепий классон требует, чтобы компилятор обработал некоторые из этих отдельных подпрограмм, прежде чем программа будет загружена и начнет выполняться, Отдельные определения данных. Альтернативной моделек) янляется объелинение в одну группу всех операций, которые взаимодействуют с конкретным объектом данных. Например, подпрограмма может состоять из всех операпий, связан- 102 Глава 3.
Вопросы трансляции языка ных с обработкой данных определенного формата, имсюгцихся в программе: операций создания записи данных (т)аса гесогс!), операций печати записи данных и операций вычисления с записью данных. Это общий подход для языков, в которых имеется механизм класса, натгример)ауа, С++ и ВшаИгаИ'.
Вложенные определения подпрограмм. Вложенное определение подпрограмм играло сугцсствепную роль для создания модульных программ на раннем этапе развития таких язьгков программирования, как Л(.ОгО!., ГОСТИЛ)ь! и Рааса!. Но с появлением обьектно-ориентированных языков типа С-ь-ь и )ага эта концепция утратила свое значение.
Рааса! является примером языка со вложенной структурой программ, при которой определения подпрограмм играют роль объявлений в основной программе. Сами эти подпрограммы, в свою очередь, могут содержать другие вложенные определения подпрограмм, и так до любого уровня вложенности. Вложенные определения подпрограмм обеспечивают для этих подпрограмм среду нелокальных ссылок, которая определяется ва время компиляции и допускает статическую проверку типов и компиляцию эффективного выполняемого кода для подпрогралтм, содержащих нелокальные ссылки, Независимые определения интерфейса.
Структура языка ГОКТКАН легко позволяет компилировать отдельные подпрограммы, но недостатком такого подхода является то, что одни и те же данные, нспользуелгые в разных подпрограмлгах, могут по-разному быть объявлены в них. Следствием этого является неспособность компилятора обнаружить подобные несоответствия во время компиляции. Разса!, напротив, позволяет осуществлять такую проверку, так как компилятор языка Разса! имев~ доступ ко всем определениям данных, но недостатком такого подхода является необходимость перекомпиляции всей программы при внесении в нее любого изменения (что, конечно, в случае длинных программ сильно замедляет процесс разработки). В языках Лс!а, Мт. и С для улучшения качества работы компилятора используются возможности обеих методик.
В названных языках реализьция программы состоит из нескольких подпрограмм, которые должны взаимодействовать друг с другом. Все эти компоненты (называемые модтдтяни) связьиаются воедино, как в языке ГОСТИЛ)ч, и образуют выполняемую програмлту; и при изменении какого-либо модуля не приходится компилировать заново всю программу, но толька один измененный лшдуль.
Тем не менее данные, которые используются в нескольких подпрограммах модуля, должны илтеть общие объявления, как в языке Разса!, стобы обеспечи~ь их эффективную проверку компилятором. Однако для передачи информации между независимо компилируемыми модулями нужны дополнительные данные. Для этих целей используется компонент спецификации нрогрцмлгы (ргойгагп-зрес)(!сат(оп соптропепг).
В языке С выбран подход, использующий включение в него некоторых файловых операций операционной системы, что позволяет включать в программу файлы, содержащие определения шггерфейса. Файлы с расширением .п формируют компоненты спецификации программы, а файлы программ с расширением .с формируют компоненты реализации'. В языке Ат(а выбран другой подход: этн сред- В о гтгх имеется популярная программа ма!ге, ко горая используется Лля определения того, какие из файлов с расширениями .с и ж были изменены.
Вто иозво тяет компилировать заново только те компонентьь которые были изменены. Зд. Синтаксис языка программирования 103 ства встроены в язык непосредственно. Программы определены в компонентах, называемых пикетами, в которых содержатся либо спецификации определений интерфейса, либо реализация исходной программы (в теле пакета), использующей эти определения интерфейса. Описания данных, отделенные от выполняемых операторов. Программа на языке СОВО(.
являет собой пример программы, использующей компонентные структуры, характерные для раннего этапа развития языков программирования. В ией описание данных и выполняемые операторы для всех подпрограмм разделены на два отдельных блока раздел данпььт и 1риздел проце0ур. Третий раздел называется раздело»а оборудовиния и содержит описания, относящиеся к внешней операционной среде, Раздел процедур программы организован в виде блоков, каждый из которых соответствует телу какой-либо подпрограммы, но все данные являются глобальными для всех подпрограмм, и ничто пс соответствует обычным локальным данным подпрограмм, Преимущество такого централизованного раздела данных, содержащего объявления всех данных, заключается в том, что появляется логическая независимость форматов данных и алгоритмов в разделе процедур. Незначительные изменения в структуре данных можно осуществить модификацией раздела данных, не затрагивая раздел процедур.
Помимо того, удобнее сосредоточить все описания данных в одном месте, а не рассеивать их по многочисленным подпрограммам. Неотделе нные определения подпрограмм. 8!ч О ВО 14 представляет собой и ример языка, совершенно противоположного языкам с четкой программной организацией — она в ием полностью отсутс1шует. В этом языке не существует никаких синтаксических различий между операторами основной программы и операторами подпрограмм. Независимо от количества имеющихся подпрограмм вся программа синтаксически является просто набором операторов.