Любой учебник для встраивания Clang в качестве интерпретатора сценариев в код C++?
У меня пока нет опыта работы с llvm или clang. Из того, что я читаю, Clang считается легко встраиваемым Wikipedia-Clang, однако я не нашел ни одного учебного пособия о том, как этого добиться. Так возможно ли предоставить пользователю приложения на языке C++ возможности сценариев путем JIT-компиляции и выполнения пользовательского кода во время выполнения? Можно ли вызывать приложения для собственных классов и методов и делиться объектами?
edit: я бы предпочел C-подобный синтаксис для языка сценариев (или даже самого C++)
5 ответов
Я не знаю ни одного учебного пособия, но в исходном коде Clang есть пример интерпретатора C, который может оказаться полезным. Вы можете найти его здесь: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/
Вероятно, у вас не будет большого выбора синтаксиса для вашего языка сценариев, если вы пойдете по этому пути. Clang анализирует только C, C++ и Objective C. Если вам нужны какие-либо варианты, вам может быть отказано в работе.
Я думаю, вот что именно вы описали.
Вы можете использовать clang в качестве библиотеки для реализации JIT-компиляции, как указано в других ответах. Затем вы должны загрузить скомпилированный модуль (скажем, библиотеку.so).
Для этого вы можете использовать стандартный dlopen (unix) или LoadLibrary (windows) для его загрузки, а затем использовать dlsym (unix) для динамической ссылки на скомпилированные функции, скажем, функцию "script" main(), имя которой известно, Обратите внимание, что для C++ вам придется использовать искаженные символы. Портативная альтернатива - это, например, библиотека GNU libltdl.
В качестве альтернативы "сценарий" может запускаться автоматически во время загрузки путем реализации функций инициализации модуля или размещения некоторого статического кода (конструктор глобально определенного объекта C++ будет вызван немедленно).
Загруженный модуль может напрямую вызывать что угодно в основном приложении. Конечно, символы известны во время компиляции, используя соответствующие заголовочные файлы основного приложения.
Если вы хотите легко добавить "плагины" C++ в вашу программу и априори знать интерфейс компонента (скажем, ваше основное приложение знает имя и интерфейс загруженного класса из его.h до загрузки модуля в память), после того как вы динамически загружать библиотеку, класс доступен для использования, как если бы он был статически связан. Просто убедитесь, что вы не пытаетесь создать экземпляр объекта класса, прежде чем dlopen() его модуль.
Использование статического кода позволяет также реализовать хорошие механизмы автоматической регистрации плагинов.
Я не знаю о Clang, но вы можете посмотреть на Ch:
http://www.softintegration.com/
Это описывается как встраиваемый или автономный интерпретатор c / C++. Здесь есть статья доктора Доббса с примерами ее встраивания:
http://www.drdobbs.com/architecture-and-design/212201774
Я не сделал ничего, кроме того, чтобы поиграть с ним, но он кажется стабильным и зрелым продуктом. Это коммерческая версия с закрытым исходным кодом, но "стандартная" версия описывается как бесплатная как для личного, так и для коммерческого использования. Однако, глядя на лицензию, кажется, что "коммерческий" может включать в себя только внутреннее использование компании, а не встраивание в продукт, который затем продается или распространяется. (Я не юрист, так что нужно четко проверить с помощью SoftIntegration условия лицензии.)
Я не уверен, что встраивание компилятора C или C++, такого как Clang, - хорошая идея в вашем случае. Поскольку "скрипт", то есть код (C или C++), который подается (во время выполнения!), Может быть произвольным, поэтому он может привести к сбою всего приложения. Обычно вы не хотите, чтобы ошибочный пользовательский ввод мог привести к сбою приложения.
Если вы хотите встроить интерпретатор, выберите что-то, предназначенное для этой цели, например, Guile или Lua, и будьте осторожны, чтобы ошибки в скрипте не приводили к сбою всего приложения. Посмотрите этот ответ для более подробного обсуждения встраивания интерпретатора.