Задача автоматического синтеза кода — предмет множества исследований в области информатики и программирования на протяжении
десятилетий. Под задачей автоматического синтеза кода понимается задача генерации описания некоторого алгоритма на определенном языке программирования из неполной спецификации данного алгоритма.
В зависимости от подхода спецификацией может быть описание алгоритма на некотором предметно-ориентированном языке (domain specific
language, DSL), описание на естественном языке, набор входов и выходов алгоритма, набор системных вызовов, происходящих при выполнении алгоритма и т.д.
В последние годы все больше исследователей обращаются к данной
проблеме, а на рынке появляются первые промышленные образцы автоматических синтезаторов кода [6]. Однако, большинство современных
инструментов синтеза кода слабо применимы в промышленности, так
как они требуют от программиста освоения совершенно нового и практически всегда оторванного от основной области знаний программиста формализма. К примеру, DSL-подход требует изучения отдельного языка спецификаций.
В этом плане коренным образом отличается подход Bayesian Sketch
Learning (BSL-подход), предложенный группой исследователей из Университета Райса в их статье [10]. BSL-подход позволяет использовать
в качестве такого предметно-ориентированного языка идентификаторы языка и библиотек, используемых программистом. Это позволяет
сократить разрыв между языком спецификации, используемым синтезатором кода, и кодом, синтезируемым системой и используемым в дальнейшем программистом.
У такого подхода есть весомый плюс: так как синтезатор, использующий данный подход, работает с библиотеками и языком, используемым программистом, и более ничем, то его возможно внедрить в интегрированную среду разработки (IDE) программиста, не изменяя
при этом обычных паттернов использования этой IDE. Используя такой
5синтезатор, IDE может предлагать более интеллектуальные контекстные подсказки (Auto-Completion) и даже в некоторых случаях синтезировать части разрабатываемой системы.
Постановка задачи
Исходя из вышесказанного была поставлена цель интегрировать подход BSL-синтезаторов как один из наиболее интересных современных
подходов к синтезу кода с IntelliJ IDEA — ведущей IDE для JVM платформы. Для достижения цели потребовалось:
• разработать архитектуру конфигурируемого BSL-синтезатора;
• реализовать BSL-синтезатор на JVM платформе;
• создать интерфейс для взаимодействия пользователя и синтезатора;
• воспроизвести результаты эталонной реализации Bayou (см. [10]),
таким образом продемонстрировав эквивалентность полученного
синтезатора эталонной реализации.
В ходе выполнения данной работы были достигнуты следующие результаты:
• была предложена архитектура конфигурируемого BSL-синтезатора,
позволяющего выполнять существующие метамодели и добавлять новые;
• конфигурируемый BSL-синтезатор был реализован на JVM-платформе,
что позволило интегрировать его с IntelliJ IDEA;
• был создан плагин, предоставляющий интерфейс к BSL-синтезатору
и предложены два пользовательских интерфейса: аннотирование
методов и предметно-ориентированный язык;
• была проведена апробация, продемонстрирована эквивалентность
полученного BSL-синтезатора эталонному, и определены границы
применимости полученного BSL-синтезатора.
В результате данной работы был создан плагин для IntelliJ IDEA,
предоставляющий принципиально новые возможности синтеза кода в
данной IDE. Кроме того, конфигурируемый BSL-синтезатор, реализованный как часть данной работы, может использоваться в работе [4] как
синтезатор из промежуточного представления цепочки API-вызовов в
итоговый код, и таким образом представить инструмент, синтезирующий естественный язык в код.