Семинар ”Наукоемкое
программное обеспечение“
PSI-2014
24-27 июня, Санкт-Петербург
Инструментальная поддержка встроенных яз...
Встроенные языки
Динамический SQL
IF @X = @Y
SET @TABLE = ’#table1’
ELSE
SET @TABLE = ’table2’
EXECUTE
(’SELECT x FROM’ + ...
Проблемы
Динамически формируемые выражения – код на некотором языке
и его нужно соответствующим образом поддерживать и
обр...
Актуальность
Да, новый код так почти не пишут. Но:
Многое уже написано и оно требует поддержки, сопровождения
Альтернатив ...
Предлагаемое решение
Статическая обработка встроенных языков
Поддержка в IDE
Многие ошибки можно искать без запуска програ...
Существующие решения
Alvor – плагин для Eclipse для статической проверки встроенного
в Java SQL
Java String Analyzer – ста...
Цели
Платформа для создания инструментов анализа встроенных
языков
Расширяемость в смысле поддержки других языков
Расширяе...
Языковые расширения
Поддержка нового языка – создание плагина на основе общей
функциональности
IDE
Ядро SDK
Lang1 Lang3Lan...
Языковые расширения
SDK
Генератор абстрактных лексических анализаторов
Генератор абстрактных синтаксических анализаторов
О...
Языковые расширения: пример
var tbl1 = “#tbl1”
var tbl2 = “tbl2”
[<InjectedLang("TSQL")>]
execute (“select x from ” + if c...
Как это работает: абстрактный анализ
Kyung-Goo Doh, Hyunha Kim, David A. Schmidt
Комбинация LR-анализа и анализа потока да...
Пример
IF @X = @Y
SET @TABLE = ’#table1’
ELSE
SET @TABLE = ’table2’
EXECUTE
(’SELECT x FROM ’ + @TABLE + ’ WHERE ISNULL(n,...
Абстрактный лексический анализ
Аппроксикация (граф со строками на рёбрах) → граф с токенами
на рёбрах
Привязка к литералу ...
Абстрактный лексический анализ: рваные токены
Токены могут собираться из нескольких частей
0 1
"select x from name_"
2
"1"...
Обобщённый синтаксический анализ
Generalized LR parsing (GLR)
Предназначен для работы с произвольными КС грамматиками
Shif...
Абстрактный синтаксический анализ
Добавим Shift-Shift ”конфликты“ – ситуации, возникающие при
ветвлении входного потока
По...
Диагностика ошибок
Нужно возвращать лес разбора для корректных выражений и
список ошибок для некорректных
Для обычного GLR...
Восстановление после ошибок
Отдельный вопрос для исследований
В больших выражениях хочется видеть все ошибки
В сложных выр...
Вычисление семантики
Результат анализа – минимум одно дерево для пути в графе и
весь лес разбора сжат в SPPF
Что-то можно ...
Вычисление семантики: пример
Подсветка синтаксиса
Достаточно покрыть все токены
Можно возвращать не все деревья, а некотор...
Вычисление семантики
В худшем случае придётся перебирать все деревья
0 1
...
2
...
...
...
...
3
...
4
...
Ленивая генерац...
Демонстрация
Григорьев Семён (JetBrains) 26 июня 2014г. 22 / 30
Что дальше
Большинство задач, применимых к обычному коду, применимо и
ко встроенным языкам:
навигация
проверка типов
транс...
Навигация по коду
Визуальное представление динамического выражения в виде
графа
Навигация в код
Навигация в граф из кода
И...
Проверка типов
Внутри выражения
int x = eval (“12 * ’string’ + 3 ”)
Согласованность с внешним кодом
int x = execute (“sele...
Трансформации
Рефакторинг
Переход с одного диалекта на другой
Для SQL особенно актуально
Переход на новые технологии
Встро...
Результаты
Ядро
Генератор абстрактных лексических анализаторов
Привязка к исходному коду
Генератор абстрактных синтаксичес...
Реализация
Открытый код
Платформа .NE.
Основной язык – F#
Проект YaccConstructor – платформа для исследований в области
си...
Область применения
Поддержка встроенных языков в IDE
Интерактивная ("на лету")
"Офлайновая" проверка (ручной запуск)
Подде...
Информация о проекте
Контакты:
Григорьев Семён: Semen.Grigorev@jetbrains.com
Вербицкая Екатерина: kajigor@gmail.com
Мавчун...
Upcoming SlideShare
Loading in …5
×

Инструментальная поддержка встроенных языков в IDE.

328 views

Published on

Презентация результатов исследовательского проекта лаборатории JetBrains на Математико-Механическом факультете СПбГУ.

Работа посвящена статическому анализу выражений на встроенных языках -- выражения, которые собираются из строковых литералов во время выполнения основной программы. Примеры таких языков -- встроенный SQL (в C++, C#, Java и т.д.), динамический SQL, генерация HTML.

Представлена платформа, предназначенная для разработки различных инструментов для работы со встроенными языками. Описаны основные её компоненты и их особенности: генератор лексических анализаторов для встроенных языков, генератор синтаксических анализаторов, особенности диагностики ошибок, особенности вычисления семантики.

Также представлен плагин для Microsoft Visual Studio IDE на основе ReSharper, который демонстрирует возможности платформы и предоставляет следующие возможности: статический поиск ошибок, подсветка синтаксиса (в том числе динамическая: подсветка парных скобок).

Исследования ведутся на основе проекта с открытым исходным кодом YaccConstructor: https://code.google.com/p/recursive-ascent/ Основной язык разработки: F#.

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
328
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Инструментальная поддержка встроенных языков в IDE.

  1. 1. Семинар ”Наукоемкое программное обеспечение“ PSI-2014 24-27 июня, Санкт-Петербург Инструментальная поддержка встроенных языков в интегрированных средах разработки Автор: Григорьев Семён, Вербицкая Екатерина, Иванов Андрей, Мавчун Екатерина, Полубелова Марина Лаборатория JetBrains на Математико-Механическом факультете Санкт-Петербургского государственного университета Григорьев Семён (JetBrains) 26 июня 2014г. 1 / 30
  2. 2. Встроенные языки Динамический SQL IF @X = @Y SET @TABLE = ’#table1’ ELSE SET @TABLE = ’table2’ EXECUTE (’SELECT x FROM’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’) JavaScript в Java String script = "function hello(name) print(’Hello, ’ + name); "; engine.eval(script); Invocable inv = (Invocable) engine; inv.invokeFunction("hello", "Scripting!!!" ); Григорьев Семён (JetBrains) 26 июня 2014г. 2 / 30
  3. 3. Проблемы Динамически формируемые выражения – код на некотором языке и его нужно соответствующим образом поддерживать и обрабатывать Ошибки в динамически формируемых выражениях обнаруживаются лишь во время выполнения Поддержка в IDE Реинжиниринг ПО, разработанного с использованием встроенных языков Однако для стандартных инструментов это просто строки Ошибки во время выполнения Нет поддержки в IDE Григорьев Семён (JetBrains) 26 июня 2014г. 3 / 30
  4. 4. Актуальность Да, новый код так почти не пишут. Но: Многое уже написано и оно требует поддержки, сопровождения Альтернатив динамическому SQL пока мало Есть кодогенераторы и они генерируют код в виде текста Григорьев Семён (JetBrains) 26 июня 2014г. 4 / 30
  5. 5. Предлагаемое решение Статическая обработка встроенных языков Поддержка в IDE Многие ошибки можно искать без запуска программы Автодополнение, рефакторинги Реинжиниринг Статический анализ Трансформация (трансляция) Григорьев Семён (JetBrains) 26 июня 2014г. 5 / 30
  6. 6. Существующие решения Alvor – плагин для Eclipse для статической проверки встроенного в Java SQL Java String Analyzer – статический анализатор динамических выражеинй для Java PHP String Analyzer – статический анализатор динамических выражеинй для PHP PHPStorm – IDE для PHP с поддержкой HTML, CSS, JavaScript IntelliLang – плагин к PHPStorm и IDEA, осуществляющий поддержку различных языков Предоставляемая функциональность часто скудна Часто поддержка других языков возможна только путём изменения исходного кода инструмента Григорьев Семён (JetBrains) 26 июня 2014г. 6 / 30
  7. 7. Цели Платформа для создания инструментов анализа встроенных языков Расширяемость в смысле поддержки других языков Расширяемость в смысле предоставляемой функциональности Плагин для MS Visual Studio на основе ReSharper Демонстрация возможностей платформы Поддержка встроенных языков в MS Visual Studio Григорьев Семён (JetBrains) 26 июня 2014г. 7 / 30
  8. 8. Языковые расширения Поддержка нового языка – создание плагина на основе общей функциональности IDE Ядро SDK Lang1 Lang3Lang2 Григорьев Семён (JetBrains) 26 июня 2014г. 8 / 30
  9. 9. Языковые расширения SDK Генератор абстрактных лексических анализаторов Генератор абстрактных синтаксических анализаторов Описание общих интерфейсов ... Плагинная система на основе Mono.Addins Механизм разметки кода конечного пользователя Григорьев Семён (JetBrains) 26 июня 2014г. 9 / 30
  10. 10. Языковые расширения: пример var tbl1 = “#tbl1” var tbl2 = “tbl2” [<InjectedLang("TSQL")>] execute (“select x from ” + if cond then tbl1 else tbl2) [<InjectedLang("Calc")>] eval (“12 + 3 * (4 + 5)”) Григорьев Семён (JetBrains) 26 июня 2014г. 10 / 30
  11. 11. Как это работает: абстрактный анализ Kyung-Goo Doh, Hyunha Kim, David A. Schmidt Комбинация LR-анализа и анализа потока данных для обработки встроенных языков Для каждого выражения строится конструкция, аппроксимирующая множество его возможных значений Data-flow уравнение Граф Регулярное выражение Выполнение лексического, синтаксического анализа над графом Григорьев Семён (JetBrains) 26 июня 2014г. 11 / 30
  12. 12. Пример IF @X = @Y SET @TABLE = ’#table1’ ELSE SET @TABLE = ’table2’ EXECUTE (’SELECT x FROM ’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’) Множество значений: {’SELECT x FROM #table1 WHERE ISNULL(n,0) > 1’ ; ’SELECT x FROM table2 WHERE ISNULL(n,0) > 1’} Аппроксимация: 1 2 "SELECT x FROM " 3 "#table1" "table2" 4 " WHERE ISNULL(n,0) > 1" Григорьев Семён (JetBrains) 26 июня 2014г. 12 / 30
  13. 13. Абстрактный лексический анализ Аппроксикация (граф со строками на рёбрах) → граф с токенами на рёбрах Привязка к литералу в исходном коде Точная привязка внутри литерала Например: Входной граф 0 1 "12" 2 "3" 3 "+5" "*6" Результат лексического анализа 0 1 NUM: 123 2* 3 + 4 NUM: 6 NUM: 5 Григорьев Семён (JetBrains) 26 июня 2014г. 13 / 30
  14. 14. Абстрактный лексический анализ: рваные токены Токены могут собираться из нескольких частей 0 1 "select x from name_" 2 "1" " 2" Нужно обрабатывать такие ситуации Нужно сохранять привязку каждой части Григорьев Семён (JetBrains) 26 июня 2014г. 14 / 30
  15. 15. Обобщённый синтаксический анализ Generalized LR parsing (GLR) Предназначен для работы с произвольными КС грамматиками Shift-Reduce и Reduce-Reduce конфликты Использует организованный в виде графа стек (GSS) 1 0 s 4 3 e 2 PLUS 2 PLUS NUM NUM 5 NUM Использует компактное представление леса вывода (SPPF) Переиспользование общих узлов Григорьев Семён (JetBrains) 26 июня 2014г. 15 / 30
  16. 16. Абстрактный синтаксический анализ Добавим Shift-Shift ”конфликты“ – ситуации, возникающие при ветвлении входного потока Получилось расширение GLR Вход: 10 32 1 + 2 3 Результат: 1 + 2 1 + 3 Григорьев Семён (JetBrains) 26 июня 2014г. 16 / 30
  17. 17. Диагностика ошибок Нужно возвращать лес разбора для корректных выражений и список ошибок для некорректных Для обычного GLR умершая ветка — нормально, для абстрактного не всегда Пропускать токены в графе сложнее, чем в линейном потоке 0 1 1 2 + 3 2 6 * 4 ) 7 3 8 - / 5 / 4 9 5 Существуют проблемы, связанные с особенностями базового (GLR) алгоритма Григорьев Семён (JetBrains) 26 июня 2014г. 17 / 30
  18. 18. Восстановление после ошибок Отдельный вопрос для исследований В больших выражениях хочется видеть все ошибки В сложных выражениях может быть много ложных ошибок Бывают принципиально некорректные выражения, которые при реальном выполнении не формируются Например x = condition ? “(1+2” : “1+2”; y = condition ? “)*3” : “*3”; Program.Eval(x + y); 2 из 4 путей не могут быть получены, но в графе есть все 0 1 (1+2 1+2 2 )*3 *3 Григорьев Семён (JetBrains) 26 июня 2014г. 18 / 30
  19. 19. Вычисление семантики Результат анализа – минимум одно дерево для пути в графе и весь лес разбора сжат в SPPF Что-то можно вычислить прямо на графе, но часто нужно извлекать деревья 0 1 "1 + " 2 " 2 "" 3 " n expr prod 1 n expr t PLUS n expr prod 2 prod 2 prod 2 t NUM 1 t NUM 2 t NUM 3 Григорьев Семён (JetBrains) 26 июня 2014г. 19 / 30
  20. 20. Вычисление семантики: пример Подсветка синтаксиса Достаточно покрыть все токены Можно возвращать не все деревья, а некоторое подмножество 0 1 NUM 1 NUM 2 2 PLUS 3 NUM 3 NUM 4 n expr n expr t PLUS n expr t NUM 1 t NUM 3 n expr n expr t PLUS n expr t NUM 2 t NUM 4 Григорьев Семён (JetBrains) 26 июня 2014г. 20 / 30
  21. 21. Вычисление семантики В худшем случае придётся перебирать все деревья 0 1 ... 2 ... ... ... ... 3 ... 4 ... Ленивая генерация деревьев Григорьев Семён (JetBrains) 26 июня 2014г. 21 / 30
  22. 22. Демонстрация Григорьев Семён (JetBrains) 26 июня 2014г. 22 / 30
  23. 23. Что дальше Большинство задач, применимых к обычному коду, применимо и ко встроенным языкам: навигация проверка типов трансформации ... Григорьев Семён (JetBrains) 26 июня 2014г. 23 / 30
  24. 24. Навигация по коду Визуальное представление динамического выражения в виде графа Навигация в код Навигация в граф из кода Информация об ошибках на графе: если ошибка на стыке строковых литералов, то трудно понять, где она реально Григорьев Семён (JetBrains) 26 июня 2014г. 24 / 30
  25. 25. Проверка типов Внутри выражения int x = eval (“12 * ’string’ + 3 ”) Согласованность с внешним кодом int x = execute (“select ’string’ from dual”) Григорьев Семён (JetBrains) 26 июня 2014г. 25 / 30
  26. 26. Трансформации Рефакторинг Переход с одного диалекта на другой Для SQL особенно актуально Переход на новые технологии Встроенный SQL → LINQ Много вопросов Возможны ли нетривиальные трансформации? Как обратно генерировать код? Как гарантировань корректность трансформаций? Григорьев Семён (JetBrains) 26 июня 2014г. 26 / 30
  27. 27. Результаты Ядро Генератор абстрактных лексических анализаторов Привязка к исходному коду Генератор абстрактных синтаксических анализаторов Диагностика ошибок Механизм вычисления семантики Модульная архитектура для языковых расширений Плагин для ReSharper Расширяемая архитектура, позволяющая легко поддержать любой встроенный язык Внешний язык должен поддерживаться в ReSharper Григорьев Семён (JetBrains) 26 июня 2014г. 27 / 30
  28. 28. Реализация Открытый код Платформа .NE. Основной язык – F# Проект YaccConstructor – платформа для исследований в области синтаксического анализа Григорьев Семён (JetBrains) 26 июня 2014г. 28 / 30
  29. 29. Область применения Поддержка встроенных языков в IDE Интерактивная ("на лету") "Офлайновая" проверка (ручной запуск) Поддержка, сопровождение кода со встроенными языками Автоматизированный реинжиниринг ПО, разработанного с применением встроенных языков Верификация генераторов кода Григорьев Семён (JetBrains) 26 июня 2014г. 29 / 30
  30. 30. Информация о проекте Контакты: Григорьев Семён: Semen.Grigorev@jetbrains.com Вербицкая Екатерина: kajigor@gmail.com Мавчун Екатерина: emavchun@gmail.com Иванов Андрей: ivanovandrew2004@gmail.com Полубелова Марина: polubelovam@gmail.com Исходный код YaccConstructor: http://recursive-ascent.googlecode.com Google+ сообщество: https://plus.google.com/u/0/communities/102842370317111619055 Сообщество GitHub: https://github.com/YaccConstructor Григорьев Семён (JetBrains) 26 июня 2014г. 30 / 30

×