'

Семантический интерфейс для языка Си++: Идея, архитектура, реализация

Понравилась презентация – покажи это...





Слайд 0

Семантический интерфейс для языка Си++: Идея, архитектура, реализация Евгений Зуев, Интерстрон Конференция «Разработка ПО-2010» CEE SECR 2010 11-15 октября, Москва


Слайд 1

План Идея Аналогичные проекты Семантическое представление XML-представление Семантический поиск Реализация и текущее состояние 2


Слайд 2

Идея семантического API C++ Основная идея – предоставить разработ- чикам и программистам мощную, гибкую и расширяемую платформу для создания широкого класса языко- ориентированных инструментов и приложений (Исследовательский аспект) Эксперимент с полным (?) разделением синтаксиса и семантики C++ (Исследовательский аспект) Эксперимент с использованием XML для представле- ния семантики C++ 3


Слайд 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


Слайд 4

Преимущества SemantiC++ Расширяемость Как входной язык, так и его семантическое представление являются расширяемыми Средства семантического поиска Мощный многоцелевой механизм исследования программ (включая сравнение программ) Независимость Включает собственную функциональность парсинга и семантического контроля; тем самым, снимается необходимость в независимом компиляторе переднего плана 5


Слайд 5

Эволюция архитектуры компиляции Компилятор Таблицы компиляции Исходная программа Генератор кода Объектный код Традиционный монолитный компилятор 6


Слайд 6

Эволюция архитектуры компиляции Компилятор Таблицы компиляции Исходная программа Генератор кода Объектный код Традиционный монолитный компилятор Компилятор переднего плана Промежу-точное представ-ление программы Исходная программа Генераторы кода Визуализатор Статический анализатор Виртуальная машина Многоцелевой/ многоплатформный компилятор 6


Слайд 7

Эволюция архитектуры компиляции Компилятор Таблицы компиляции Исходная программа Генератор кода Объектный код Традиционный монолитный компилятор Компилятор переднего плана Промежу-точное представ-ление программы Исходная программа Генераторы кода Визуализатор Статический анализатор Виртуальная машина Многоцелевой/ многоплатформный компилятор Семантическое представление Генератор СП Исходная программа Фрагмент программы UML- диаграмма Генераторы кода Визуализатор Статический анализатор Виртуальная машина СП как основа языко-ориентированных инструментов 6


Слайд 8

SemantiC++: Общая схема Program Semantic Representation Исходная программа Семантическое представление программы Другое СП СП в виде XML UML- диаграммы Интер-фейс iSource Генераторы кода Статические анализаторы Инструменты инжиниринга (UML) Визуализаторы Верификаторы Интерпретаторы (виртуальные машины C++) Оптимизаторы Фрагмент Исходного кода Преобразователи . . . 7


Слайд 9

SemantiC++: Основные принципы 1 СП – это множество классов, каждый из которых представляет некоторое понятие C++ (класс, оператор, операция, операнд) Отношения между классами (наследование, агрегация, делегирование) отражают семантические отношения между соот- ветствующими понятиями языка Экземпляры классов СП образуют Абстракт- ное Синтаксическое Дерево программы 8


Слайд 10

SemantiC++: Основные принципы 2 Каждый класс СП – это не просто структура (CCI): он обладает собственной функциональностью для выполнения типичных операций над AST (примеры далее) Классы СП отражают не только синтаксич. структуру программы: в них имеются атрибуты, представ- ляющие семантические свойства соответ- ствующего понятия (“аннотированное AST”) AST не просто соответствует исходному тексту «один к одному»: в нем явно представлена скрытая семантика С++ (вызовы деструкторов, вызовы функций-операций и другое) 9


Слайд 11

SemantiC++: Диаграмма наследования классов (фрагмент) ENTITY EXPRESSION PRIMARY POSTFIX_EXPRESSION ... UNARY_EXPRESSION ... STATEMENT EXPRESSION_STATEMENT COMPOUND_STATEMENT TRY_BLOCK SELECTION_STATEMENT TYPE FUNDAMENTAL ... MODIFIER POINTER ... FUNCTION CLASS ... (Отступы обозначают наследование) 10


Слайд 12

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


Слайд 13

Пример класса СП: комментарии create(): создание узла/поддерева «с нуля» open(): общий алгоритм чтения узла/поддерева; источники могут быть различные – в частности, исходный текст check(), validate(): проверка структурной и семантической корректности узла или поддерева match(): проверка совпадения узла с другим узлом/поддеревом pattern: общий шаблон для данного узла, который совпадает с любым составным оператором 12


Слайд 14

SemantiC++: Пример AAST (фрагмент) class C { … }; float f(const char* s) { C c(s); return c.m; } CLASS_DECL “C” CLASS_BODY FUNC_DECL “f” FLOAT FUNC_BODY PARAMS PARM_DECL “s” PTR CONST CHAR VAR_DECL RET_STMT “c” CLASS ID MEMB_SELEC … ID ID Структурные связи Информация о типах Атрибуты 13


Слайд 15

SemantiC++: Пример AAST (фрагмент) CLASS_DECL “C” CLASS_BODY FUNC_DECL “f” FLOAT FUNC_BODY PARAMS PARM_DECL “s” PTR CONST CHAR VAR_DECL RET_STMT “c” CLASS ID MEMB_SELEC … ID ID class C { … }; float f(const char* s) { C c(s); return c.m; } Семантические связи Области действия 14


Слайд 16

SemantiC++: Пример AAST (фрагмент) class C { … }; float f(const char* s) { C c(s); return c.m; } CLASS_DECL “C” CLASS_BODY FUNC_DECL “f” FLOAT FUNC_BODY PARAMS PARM_DECL “s” PTR CONST CHAR VAR_DECL RET_STMT “c” CLASS ID MEMB_SELEC … ID ID DTOR_CALL ID Скрытая семантика 15


Слайд 17

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


Слайд 18

Двоичный и XML-форматы: две стороны семантического преставления Семантическое представление программы Двоичный XML- формат формат Оба формата полностью равноправны Оба формата взаимо- заменяемы Эти свойства реализуются встроенными конвер- торами Binary->XML и XML->Binary 17


Слайд 19

Почему XML? Открытый формат Расширяемость (XML - метаязык) В основе лежит предельно простая модель представления Стандарт де-факто Большое число доступных техноло- гий (XQuery, XSLT и т.д.) и инструментов для операций над XML-форматом 18


Слайд 20

Почему XML? (Исследовательский аспект) Эксперимент с технологией XSLT: проверить ее полезность, примени- мость (и, что еще интереснее, узнать границы ее применимости) к задачам, связанным с манипули- рованием с семантикой C++, представленной в формате XML (Исследовательский аспект) Создать «нормативное» описание C++ в формате XML Schema 19


Слайд 21

Результат преобразования: XML, HTML, C++, UML, DOC, … Определение преобразований СП: Шаблоны XSLT Семантика C++ и XML-технологии (отступление) Семантическое представление программы: XML Определение формата СП: XML Schema Валидация «Каноническое» определение С++ Определение преобразований СП: Шаблоны XSLT Оптимизация Рефакторинг Конвертация ... Результат преобразования: XML, HTML, C++, UML, DOC, … HTML-броузер Компилятор С++ UML Tool … 20


Слайд 22

Пример СП в XML-формате (упрощено) <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> while ... { x = ...; P(...); } 21


Слайд 23

Стандартный доступ: DOM/SAX, XSLT, XQuery Семантическое представление программы в формате XML Специа-лизиро-ванные APIs Прикладные (клиентские) инструменты Архитектура доступа к СП на основе XML 22


Слайд 24

Семантический поиск В основе поиска – рекурсивный алгоритм обхода дерева AST и процедуры сопоставления с образцом. Образцы конструируются с помощью шаблонов Для каждого узла СП предопределен собственный шаблон: например, «любой составной оператор», «любая функция», «любой класс». Шаблон может быть атрибутирован, например, «любая публичная статичес- кая функция», «любой класс из пространства имен N» Поиск реализуется виртуальной функцией match(), определен- ной для каждого узла СП. Шаблон передается функции как параметр Дополнительно в функцию match() можно передать «динами- ческие» условия поиска, которые нельзя заранее задать в шаблоне. Например, «найти все использующие вхождения виртуальной функции f, которые не пере- определены в производных классах». 23


Слайд 25

Подход к реализации Реализация проводится в среде .NET; основной язык - C#: быстрое програм- мирование, простое сопровождение, надежный («managed») код Интероперабельность: СП доступно из программ на любом языке .NET: C#, Managed C++, VB, F#, Python, Zonnon Все компоненты СП API представлены в виде DLL-библиотек и могут быть присоединены к клиентским програм- мам стандартным способом: using xxx.dll 24


Слайд 26

Текущее состояние проекта Классы семантического представления, семантический поиск - полностью реализованы (без тестирования) Алгоритмы парсинга, Определение XML Schema для СП - в разработке Прикладные процессоры: (Ре)инжиниринг для UML – в разработке Бета-тестирование – в планах… 25


Слайд 27

Контакты & информация Почта: eugene.zueff@gmail.com Блог: www.zouev.blogspot.com Веб-сайт: www.eugene.zouev.name Фирма: www.interstron.ru 26


×

HTML:





Ссылка: