Список использованных сокращений 1
Введение 4
ПРЕДМЕТНАЯ ОБЛАСТЬ 7
Расширяемое программное обеспечение 7
Многоуровневые приложения 10
RESEMBLER 13
Host Application Interface 13
Генерация C кода 17
RESEMBLY 19
Resembler IR 19
Система типов 23
RESEMBLER VS ВСТРАИВАЕМЫЕ ИНТЕРПРЕТАТОРЫ 29
Производительность 29
Потребление памяти 31
ИНТЕГРАЦИЯ В QT ПРИЛОЖЕНИЕ 33
Заключение 37
Список использованной литературы 40
Приложение 41
Список «расширяемых приложений» 41
Cкоростъ байткода Emacs Lisp 42
Сравнение скорости компиляции
Встраивание языка программирования - это распространённый приём для решения двух классов задач:
1. Расширение программного продукта.
2. Организация многоуровневой архитектуры1.
Для многоуровневой архитектуры обычно достаточно одного встроенного языка программирования, а в расширяемом программном обеспечении работает правило «чем больше, тем лучше»2.
Проблема #1 - встроить несколько языков программирования значительно сложнее, чем один.
Не любой язык программирования может быть эффективно3 встроен в произвольную систему. Выбор здесь - почти всегда компромисс между желаемым и доступным.
Проблема #2 - не у любого языка программирования есть имплементация, предназначенная для встраивания.
Если система позволяет интегрировать пользовательские модули на разных языках программирования, это ещё не означает, что возможно свободное взаимодействие между этими модулями. Если какой-то из модулей представляет собой набор функций (библиотеку), то, чаще всего, воспользоваться ей можно только из того же языка программирования, на котором написана библиотека.
Проблема #3 - взаимодействие между различными встроенными языками программирования внутри одного процесса зачастую осложнено или невозможно.
1 См. главу «Многоуровневые приложения».
2 Пример: игровой движок Unity предоставляет более одного языка программирования.
3 Производительность, потребление памяти и возможность запуска интерпретатора в режиме «песочницы».
Проект Resembler - это совокупностью компонентов, которые решают задачу интеграции группы языков программирования в программные продукты. Все поддерживаемые языки программирования имеют единый Host Application Interface и могут свободно взаимодействовать друг с другом практически без накладных расходов.
Основной идеей является транскомпиляция всех запрашиваемых языков программирования в язык программирования, на котором написано ядро интегрирующего приложения.
Целью данной работы является разработка комплекса Resembler:
• Host Application Interface (FFI)
o Binary encoder & decoder для файлов HAI конфигураций
• Менеджер загрузки динамических модулей (плагинов)
• SDK для лексического и синтаксического разбора
• Генератор C кода из промежуточного представления
• Синтаксический анализатор языка программирования Go
• Qt приложение, которое использует Go плагины
MVP включает в себя поддержку интеграции языка программирования Go в приложения, которые могут взаимодействовать с языком программирования C.
Архитектура Resembler позволяет добавлять новые frontend и backend компоненты без необходимости редактировать существующую кодовую базу. Со временем может появиться поддержка JVM как целевой платформы. Следующими языками, доступными для встраивания, будут: Lua, JavaScript, PHP и Scheme.
Почти каждый реализованный в Resembler язык программирования удовлетворяет лишь части спецификации этого языка. Соответственно их можно назвать диалектами, во многом соответствующие оригиналам. Причин такому решению несколько:
• Реализовать 80% спецификации значительно проще, чем все 100%.
• Не всем нужно полное соответствие. Не каждый знает все тонкости стандарта языка.
• Качество некоторых формальных описаний оставляет желать лучшего. Иногда они просто огромные, а для некоторых языков и вовсе нет спецификации.
Настоящий документ сначала описывает предметную область, затем сам Resembler и только потом существующие решения.
Описание предметной области вводит некоторые определения, которые необходимы для понимания сути работы. Там же приведены некоторые доводы, обуславливающие актуальность проектируемой системы.
В основной части описывается высокоуровневая архитектура, параллельно поднимаются некоторые вопросы реализации и возможные альтернативы. Дополняющие табличные материалы вынесены в приложение (ссылка на исходные коды Resembler там же).
Результатом дипломной работы являются компоненты системы Resembler, которые в совокупности представляют MVP решение.
Пользователь может интегрировать в свои C/C++ приложения язык программирования Go и использовать клиентскую библиотеку для загрузки этих модулей в работающее приложение без его перезагрузки.
На основе Resembler можно построить интерактивную оболочку , ведь HotPlug маленьких сниппетов выполняется почти мгновенно и не снижает отзывчивость приложения (особенно если запускать эту процедуру в отдельном потоке). В дальнейшем может появиться возможность интерпретировать Resembly, что окончательно устранит разрыв в скорости вычисления коротких программ по отношению к встраиваемым интерпретаторам.
Помимо разработки самого программного пакета, были проведены измерения производительности нескольких встраиваемых интерпретаторов, а также производительность генерируемого кода других транскомпиляторов в язык программирования C. Самые значимые результаты приведены в приложении.
Resembler не упрощает задачу подготовки экспортируемого приложением API. И даже стандартная библиотека, которая поставляется вместе с основным дистрибутивом, может не подойти каждому мыслимому проекту. Скорее наоборот, трудно представить серьёзное приложение, где интегрирующей стороне было бы безразлично, как плагинами выделяется память и как именно они могут взаимодействовать с файловой системой. Проектирование этих интерфейсов - сложная задача, которую следует решать в отрыве от Resembler.