Rus Eng
О компании  
Новости компании
Лицензии и сертификаты
Вакансии
Контакты
Публикации
White Paper
Продукты
Технологии
Разработчикам ПО
Производителям микроконтроллеров
Партнеры / Клиенты
Перспективные проекты
| | | |
Главная страница    О компании    Публикации    White Paper
White Paper

Языки программирования, компиляторы, языковые процессоры:
подход компании Интерстрон

5. Современный взгляд на задачу компиляции:
семантическое представление программы

Легко видеть, что архитектуры компиляции, описанные выше, решают, по существу, единственную задачу - получение машинного кода, пригодного для компиляции на некотором процессоре. Расширенная архитектура в этом смысле отличается от первоначальной только числом целевых процессоров.

Соответственно этой задаче (далее будем называть ее компиляцией в собственном, или узком смысле) создается и промежуточное представление. В огромном большинстве случаев оно представляет собой варианты "обобщенных ассемблеров" низкого уровня, на основе которых достаточно легко генерировать реальные машинные коды для конкретных процессоров. С другой стороны, из-за такой крайне узкой специализации ПП их чрезвычайно неудобно (а часто и невозможно) использовать для каких-либо иных целей, кроме генерации кода. Такая структура ПП затрудняет реализацию даже такой крайне необходимой на практике задачи, как поддержка отладки программ в терминах исходного ЯП - для этого требуются специальные усилия по расширению ПП (добавление так называемой "отладочной информации").

В то же время современные проблемы разработки программных систем предполагают существенно более широкую трактовку задачи компиляции - не только как генерацию исполняемого кода, но и как широкий спектр различных операций над текстами программ. Не вдаваясь в подробный анализ, среди типичных задач, связанных с обработкой программных текстов, следует кратко упомянуть следующие:

- Компиляция (в узком смысле) остается основной функцией систем программирования. При этом особое значение придается таким задачам, как межъязыковое связывание, поддержка интероперабельности (динамического взаимодействия программ), межмодульная и глобальная оптимизация.

- Имеется целый комплекс задач, связанных с пониманием программ человеком. Анализ больших программных текстов, приобретая очень важное значение в современной индустрии ПО, остается одним из самых трудоемких и тяжелых задач. За последние годы был предложен ряд методик, призванных отобразить различные характеристики программ (структуру, связи между подпрограммами и модулями, информационные потоки, потоки управления и т.п.) в форме, облегчающей их восприятие человеком. Такие методики (наиболее известной и развитой является нотация Г.Буча и связанная с ней графическая нотация UML), как правило, являются обратимыми, то есть могут использоваться как для анализа существующих программ, так и для проектированиия нового ПО. С некоторой долей огрубления указанный комплекс задач можно назвать визуализацией.

- Принципиально важной остается задача верификации программ. Под этим понимается многоаспектная деятельность как по выявлению тонких ошибок, случаев использования допустимых, но потенциально опасных свойств того или иного языка, сомнительных с точки зрения эффективности фрагментов программ, так и проверка программы на предмет соблюдения корпоративных или отраслевых стандартов на стиль программирования или локальных ограничений. Хотя формально некоторые из перечисленных задач являются, скорее, задачей традиционной компиляции, с практической точки зрения бывает более целесообразно выделить их в отдельную функциональность.

- Сохраняет свою актуальность и задача статического анализа программ. С момента появления первых исследований, связанных с формальной оценкой программ по различным метрикам, было предложено много различных метрик и систем метрик. Во многих случаях статический анализ является необходимым элементом жизненного цикла разработки ПО и потому нуждается в соответствующей программной поддержке.

- В последнее время (прежде всего в связи с успехом языка Java) вновь возник интерес к интерпретационной схеме исполнения программ. Существенно возросшая производительность вычислительных систем поставила интерпретацию в ряд практичных подходов для многих реальных применений, не требующих предельной эффективности. В частности, для языка Си++ интерпретационная схема, не отменяя очевидных достоинств непосредственного выполнения, потенциально может дать ряд преимуществ, среди которых повышенный диагностический сервис периода исполнения, недостижимый в полном объеме для традиционного исполнения на процессоре. Становится возможным адекватно выявлять (и, следовательно, преодолевать) множество типичных для Си++ динамических ошибок (некорректная работа с указателями, утечки памяти при динамическом управлении, неинициализированные переменные и т.д.). Можно сказать, что интерпретация позволяет превратить Си++ из мощного, но ненадежного языка в мощный и надежный.

Решение перечисленных задач базируется на совокупности алгоритмов лексического, синтаксического и семантического анализа исходных программ, то есть, на алгоритмах, составлявших существо традиционного понимания компиляции. Таким образом, перечисленные компоненты традиционного компилятора, часто называемые компилятором переднего плана (front end compiler [18]), выступают в качестве ядра современных систем разработки. Информационное взаимодействие между компилятором переднего плана и другими компонентами такой системы осуществляется посредством информационных структур (основные из которых - дерево программы и таблица символов), которые в данном случае перестают быть внутренними структурами компилятора и логически выносятся вовне его, образуя семантическое представление программы. Описанная модель представлена на рис. 3.


Рис. 3 Архитектура компиляции, основанная на семантическом представлении

Еще раз отметим преимущества такой схемы. Во-первых, семантическое представление, сформированное фазами анализа, по своему назначению и смыслу в точности соответствует исходной программе на ЯП. Оно несет в себе полное знание об исходной программе, в том числе, и такие его аспекты, которые присутствуют в исходной программе неявно (так называемая "скрытая семантика").

Во-вторых, семантическое представление содержит только ту информацию, которая относится к синтаксису и семантике исходной программы, и не включает каких-либо узкоспециализированных структур (например, объектный код). Тем самым, СП может выступать в роли универсального интерфейса между компилятором переднего плана и разнообразными языко-ориентированными компонентами систем разработки. В-третьих, семантическое представление, в отличие от многих форматов (где отладочная информация носит дополнительный и вторичный характер), может быть сконструировано таким образом, чтобы обеспечить макcимально эффективный доступ ко всем его элементам.

Таким образом, основная идея, которая послужила толчком к переосмыслению традиционных архитектур компиляции, может быть сформулирована следующим образом:

Компиляция из узко поставленной задачи получения машинного кода, пригодного для исполнения на процессоре, превращается в центральную часть широкого спектра разнообразных семантических операций над текстами программ на ЯП. Генерация кода из единственной цели компиляции превращается в одну из многочисленных задач, определенных над структурами промежуточного представления. Поэтому центр тяжести при реализации некоторого языка программирования в значительной степени смещается в сторону проектирования такого способа представления исходных программ, который был бы адекватен задачам, стоящим перед современными системами программирования.



< пред.                                                                 след. >


ЗАО "Интерстрон" 1998-08.06.2015, ООО "Интерстрон" 09.06.2015 по н.в. Все права защищены.
Москва, Дмитровское шоссе, 1/1
e-mail: interstron-info@mail.ru
web: www.interstron.ru
Тел.: +7 (495) 769-55-68