Семантический интерфейс для языка Си++: Идея, архитектура, реализация Евгений Зуев, Интерстрон Конференция «Разработка ПО-2010» CEE SECR 2010 11-15 октября, Москва План Идея Аналогичные проекты Семантическое представление XML-представление Семантический поиск Реализация и текущее состояние 2 Идея семантического API C++ Основная идея – предоставить разработчикам и программистам мощную, гибкую и расширяемую платформу для создания широкого класса языкоориентированных инструментов и приложений (Исследовательский аспект) Эксперимент с полным (?) разделением синтаксиса и семантики C++ (Исследовательский аспект) Эксперимент с использованием XML для представления семантики C++ 3 Аналогичные проекты ASIS Ada Semantic Interface Specification (для Ada95): стандарт ISO SAGE - SAGE II - ROSE (для C/C++, HPF…) Открытая инфраструктура для преобразований source-to-source Pivot (для C++) Stroustrup & Dos Reis; “Инфраструктура общего назначения для преобразования и статического анализа программ на C++” CCI (для .NET) Программная инфраструктура разработки компиляторов для .NET (семантические преобразования) 4 Преимущества SemantiC++ Расширяемость Как входной язык, так и его семантическое представление являются расширяемыми Средства семантического поиска Мощный многоцелевой механизм исследования программ (включая сравнение программ) Независимость Включает собственную функциональность парсинга и семантического контроля; тем самым, снимается необходимость в независимом компиляторе переднего плана 5 Эволюция архитектуры компиляции Компилятор Исходная программа Таблицы компиляции Генератор кода Объектный код Традиционный монолитный компилятор 6 Эволюция архитектуры компиляции Компилятор Исходная программа Исходная программа Таблицы компиляции Компилятор переднего плана Генератор кода Промежуточное представление программы Объектный код Генераторы кода Визуализатор Статический анализатор Виртуальная машина Традиционный монолитный компилятор Многоцелевой/ многоплатформный компилятор 6 Эволюция архитектуры компиляции Компилятор Исходная программа Исходная программа Исходная программа Таблицы компиляции Компилятор переднего плана Генератор кода Промежуточное представление программы Семантическое представление Фрагмент программы UMLдиаграмма Генератор СП Объектный код Генераторы кода Визуализатор Статический анализатор Виртуальная машина Традиционный монолитный компилятор Многоцелевой/ многоплатформный компилятор Генераторы кода Визуализатор Статический анализатор Виртуальная машина СП как основа языкоориентированных инструментов 6 SemantiC++: Общая схема Генераторы кода Исходная программа Статические анализаторы Фрагмент Исходного кода Другое СП СП в виде XML UMLдиаграммы ... Интерфейс iSource Семантическое Program представление Semantic Representation программы Инструменты инжиниринга (UML) Визуализаторы Верификаторы Интерпретаторы (виртуальные машины C++) Оптимизаторы Преобразователи 7 SemantiC++: Основные принципы 1 СП – это множество классов, каждый из которых представляет некоторое понятие C++ (класс, оператор, операция, операнд) Отношения между классами (наследование, агрегация, делегирование) отражают семантические отношения между соответствующими понятиями языка Экземпляры классов СП образуют Абстрактное Синтаксическое Дерево программы 8 SemantiC++: Основные принципы 2 Каждый класс СП – это не просто структура (CCI): он обладает собственной функциональностью для выполнения типичных операций над AST (примеры далее) Классы СП отражают не только синтаксич. структуру программы: в них имеются атрибуты, представляющие семантические свойства соответствующего понятия (“аннотированное AST”) AST не просто соответствует исходному тексту «один к одному»: в нем явно представлена скрытая семантика С++ (вызовы деструкторов, вызовы функций-операций и другое) 9 SemantiC++: Диаграмма наследования классов (фрагмент) ENTITY EXPRESSION PRIMARY POSTFIX_EXPRESSION ... UNARY_EXPRESSION ... STATEMENT EXPRESSION_STATEMENT COMPOUND_STATEMENT TRY_BLOCK SELECTION_STATEMENT TYPE FUNDAMENTAL ... MODIFIER POINTER ... FUNCTION CLASS ... (Отступы обозначают наследование) 10 SemantiC++: Пример класса СП (сокращено) class COMPOUND_STATEMENT : STATEMENT, iSCOPE { // Structure public LIST<STATEMENT> statements; public LIST<DECLARATION> declarations; // Creation protected COMPOUND_STATEMENT() ... public static COMPOUND_STATEMENT create() ... // Opening public static COMPOUND_STATEMENT open ( iSource source, iSCOPE context )... // Validation public override bool check() ... public override bool validate() ... // Semantic search public static COMPOUND_STATEMENT pattern = COMPOUND_STATEMENT.create(); public override bool match ( ENTITY pattern ) ... // Attributes public ENTITY owner; public bool isValid, isChecked, isGenerated; } 11 Пример класса СП: комментарии create(): создание узла/поддерева «с нуля» open(): общий алгоритм чтения узла/поддерева; источники могут быть различные – в частности, исходный текст check(), validate(): проверка структурной и семантической корректности узла или поддерева match(): проверка совпадения узла с другим узлом/поддеревом pattern: общий шаблон для данного узла, который совпадает с любым составным оператором 12 SemantiC++: Пример AAST (фрагмент) class C { … }; float f(const char* s) { C c(s); return c.m; } CLASS_DECL “C” CLASS_BODY FUNC_DECL … FUNC_BODY “f” VAR_DECL FLOAT “c” CLASS RET_STMT PARAMS ID MEMB_SELEC ID ID • Структурные связи PARM_DECL “s” PTR • Информация о типах CONST CHAR • Атрибуты 13 SemantiC++: Пример AAST (фрагмент) class C { … }; float f(const char* s) { C c(s); return c.m; } CLASS_DECL “C” CLASS_BODY FUNC_DECL … FUNC_BODY “f” VAR_DECL FLOAT “c” CLASS RET_STMT PARAMS ID MEMB_SELEC ID ID • Семантические связи PARM_DECL “s” PTR • Области действия CONST CHAR 14 SemantiC++: Пример AAST (фрагмент) class C { … }; float f(const char* s) { C c(s); return c.m; } CLASS_DECL “C” CLASS_BODY FUNC_DECL … FUNC_BODY “f” VAR_DECL FLOAT “c” CLASS ID RET_STMT PARAMS MEMB_SELEC ID DTOR_CALL ID • Скрытая семантика PARM_DECL “s” PTR CONST ID CHAR 15 SemantiC++: Пример использования using Semantic; ... class Example { static void Main() { NAMESPACE_DECL ns = NAMESPACE_DECL.create(IDENT.create("N")); FUNCTION_DECL fun = FUNCTION_DECL.open(new FileSource("file-name"),ns); if ( fun == null || !fun.validate() ) { /* errors in function declaration */ } string source = "int main() { " + “ f(); " + " cout << \"Hello world!\";" + " return 0; } "; FUNCTION_DECL main = FUNCTION_DECL.open( new TextSource(source),ns); if (ns.validate()) ns.execute(); // } } 16 Двоичный и XML-форматы: две стороны семантического преставления Семантическое представление программы Двоичный формат XMLформат Оба формата полностью равноправны Оба формата взаимозаменяемы Эти свойства реализуются встроенными конверторами Binary->XML и XML->Binary 17 Почему XML? • Открытый формат • Расширяемость (XML - метаязык) • В основе лежит предельно простая модель представления • Стандарт де-факто • Большое число доступных технологий (XQuery, XSLT и т.д.) и инструментов для операций над XML-форматом 18 Почему XML? • (Исследоват ельский аспект ) Эксперимент с технологией XSLT: проверить ее полезность, применимость (и, что еще интереснее, узнать границы ее применимост и) к задачам, связанным с манипулированием с семантикой C++, представленной в формате XML • (Исследоват ельский аспект ) Создать «нормативное» описание C++ в формате XML Schema 19 Семантика C++ и XML-технологии (отступление) Определение формата СП: XML Schema Валидация «Каноническое» определение С++ Семантическое представление программы: XML Определение Определение преобразований СП: преобразований СП: Шаблоны XSLT Шаблоны XSLT Результат Результат преобразования: преобразования: XML, HTML, C++, XML, HTML, C++, UML, DOC, … UML, DOC, … Опт имизация Рефакт оринг Конверт ация ... HTML-броузер Компилятор С++ UML Tool … 20 Пример СП в XML-формате (упрощено) while ... { x = ...; P(...); } <while-statement ln=“1” col=“1”> <condition> <expression ln=“1” col=“7”> ... </expression> <condition> <compound-statement> <assignment-expression ln=“2” col=“4”> <name ln=“2” col=“4”>x</name> <expression ln=“2” col=“9”> ... </expression> </assignment> <call ln=“3” col=“4”> <name ln=“3” col=“4”>P</name> <argument-list> <expression ln=“3” col=“5”> ... </expression> </argument-list> </call> </compound-statement> </while-statement> 21 Архитектура доступа к СП на основе XML Стандартный доступ: Семантическое представление программы DOM/SAX, XSLT, XQuery Специализированные APIs Прикладные (клиентские) инструменты в формате XML 22 Семантический поиск В основе поиска – рекурсивный алгоритм обхода дерева AST и процедуры сопоставления с образцом. Образцы конструируются с помощью шаблонов Для каждого узла СП предопределен собственный шаблон: например, «любой составной оператор», «любая функция», «любой класс». Шаблон может быть атрибутирован, например, «любая публичная статическая функция», «любой класс из пространства имен N» Поиск реализуется виртуальной функцией match(), определенной для каждого узла СП. Шаблон передается функции как параметр Дополнительно в функцию match() можно передать «динамические» условия поиска, которые нельзя заранее задать в шаблоне. Например, «найти все использующие вхождения виртуальной функции f, которые не переопределены в производных классах». 23 Подход к реализации Реализация проводится в среде .NET; основной язык - C#: быстрое программирование, простое сопровождение, надежный («managed») код Интероперабельность: СП доступно из программ на любом языке .NET: C#, Managed C++, VB, F#, Python, Zonnon Все компоненты СП API представлены в виде DLL-библиотек и могут быть присоединены к клиентским программам стандартным способом: using xxx.dll 24 Текущее состояние проекта Классы семантического представления, семантический поиск полностью реализованы (без тестирования) Алгоритмы парсинга, Определение XML Schema для СП в разработке Прикладные процессоры: (Ре)инжиниринг для UML – в разработке Бета-тестирование – в планах… 25 Контакты & информация Почта: eugene.zueff@gmail.com Блог: www.zouev.blogspot.com Веб-сайт: www.eugene.zouev.name Фирма: www.interstron.ru 26