Слайд 1 - CEE-SECR 2010 - Конференция «Разработка ПО

advertisement
Семантический интерфейс
для языка Си++:
Идея, архитектура, реализация
Евгений Зуев, Интерстрон
Конференция «Разработка ПО-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
Download