Задача автоматического синтеза кода — предмет множества исследований в области информатики и программирования на протяжении десятилетий. Под задачей автоматического синтеза кода понимается задача генерации описания некоторого алгоритма на определенном языке программирования из неполной спецификации данного алгоритма.
В зависимости от подхода спецификацией может быть описание алгоритма на некотором предметно-ориентированном языке (domain specific language, DSL), описание на естественном языке, набор входов и выходов алгоритма, набор системных вызовов, происходящих при выполнении алгоритма и т.д.
В последние годы все больше исследователей обращаются к данной проблеме, а на рынке появляются первые промышленные образцы автоматических синтезаторов кода [6]. Однако, большинство современных инструментов синтеза кода слабо применимы в промышленности, так как они требуют от программиста освоения совершенно нового и практически всегда оторванного от основной области знаний программиста формализма. К примеру, DSL-подход требует изучения отдельного языка спецификаций.
В этом плане коренным образом отличается подход Bayesian Sketch Learning (BSL-подход), предложенный группой исследователей из Университета Райса в их статье [10]. BSL-подход позволяет использовать в качестве такого предметно-ориентированного языка идентификаторы языка и библиотек, используемых программистом. Это позволяет сократить разрыв между языком спецификации, используемым синтезатором кода, и кодом, синтезируемым системой и используемым в дальнейшем программистом.
У такого подхода есть весомый плюс: так как синтезатор, использующий данный подход, работает с библиотеками и языком, используемым программистом, и более ничем, то его возможно внедрить в интегрированную среду разработки (IDE) программиста, не изменяя
при этом обычных паттернов использования этой IDE. Используя такой синтезатор, 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-вызовов в итоговый код, и таким образом представить инструмент, синтезирующий естественный язык в код
[1] Barber David. Bayesian reasoning and machine learning. –– Cambridge
University Press, 2012. –– ISBN: 978-0521518147.
[2] Bing Developer Assistant: Improving Developer Productivity by
Recommending Sample Code / Hongyu Zhang, Anuj Jain,
Gaurav Khandelwal et al. // Proceedings of the 2016 24th ACM
SIGSOFT International Symposium on Foundations of Software
Engineering. –– FSE 2016. –– New York, NY, USA : ACM, 2016. ––
P. 956–961.
[3] Buse Raymond P. L., Weimer Westley. Synthesizing API Usage
Examples // Proceedings of the 34th International Conference on
Software Engineering. –– ICSE ’12. –– Piscataway, NJ, USA : IEEE
Press, 2012. –– P. 782–792.
[4] Deep API Learning / Xiaodong Gu, Hongyu Zhang, Dongmei Zhang,
Sunghun Kim // CoRR. –– 2016. –– Vol. abs/1605.08535. –– 1605.08535.
[5] Hoffman Matthew, Bach Francis R., Blei David M. Online Learning
for Latent Dirichlet Allocation // Advances in Neural Information
Processing Systems 23 / Ed. by J. D. Lafferty, C. K. I. Williams,
J. Shawe-Taylor et al. –– Curran Associates, Inc., 2010. –– P. 856–864.
[6] Inductive Programming Meets the Real World / Sumit Gulwani,
José Hernández-Orallo, Emanuel Kitzelmann et al. // Communications
of the ACM. –– 2015. –– oct. –– Vol. 58, no. 11. –– P. 90–99.
[7] Kaufman L., Rousseeuw P. Finding Groups in Data: An Introduction
to Cluster Analysis. –– Wiley Interscience, 2005. –– P. 68–125. ––
ISBN: 9780471878766.
[8] Kingma Diederik P, Welling Max. Auto-Encoding Variational Bayes. ––
2013. –– arXiv:1312.6114.
36[9] McCabe T. J. A Complexity Measure // IEEE Transactions on
Software Engineering. –– 1976. –– Dec. –– Vol. SE-2, no. 4. –– P. 308–
320.
[10] Murali Vijayaraghavan, Chaudhuri Swarat, Jermaine Chris. Bayesian
Sketch Learning for Program Synthesis // CoRR. –– 2017. –– Vol.
abs/1703.05698. –– 1703.05698.
[11] Rajaraman A., Ullman J.D. Mining of Massive Datasets. –– Cambridge
University Press, 2012. –– P. 1–17. –– ISBN: 978-1-139-05845-2.
[12] Robillard Martin P. What makes APIs hard to learn? Answers from
developers // IEEE software. –– 2009. –– Vol. 26, no. 6.
[13] Solar Lezama Armando. Program Synthesis By Sketching : Ph. D.
thesis : UCB/EECS-2008-177 / Armando Solar Lezama ; EECS
Department, University of California, Berkeley. –– 2008. –– Dec.
[14] Baldoni Roberto, Coppa Emilio, D’Elia Daniele Cono et al. A Survey
of Symbolic Execution Techniques. –– 2016. –– arXiv:1610.00502.
[15] Xingxing Zhang Liang Lu Mirella Lapata. Top-down Tree Long ShortTerm Memory Networks // Proceedings of the Conference of the North
American Chapter of the Association for Computational Linguistics:
Human Language Technologies. –– 2016. –– June. –– P. 310–320.
[16] Ксезнов Михаил. Рефакторинг архитектуры программного обеспечения: выделение слоев. –– 2004. –– URL: http://citforum.ru/SE/
project/refactor/ (online; accessed: 17.12.2016).