Любой учебник по внедрению Clang в качестве script интерпретатора в код С++?

У меня нет опыта работы с llvm или clang. Из того, что я читаю, кланг считается легко вложенным Wikipedia-Clang, однако я не нашел никаких учебных пособий о том, как достичь этого. Так можно ли предоставить пользователю С++-приложения возможности сценариев с помощью JIT-компиляции и выполнения пользовательского кода во время выполнения? Можно ли назвать приложения собственными классами и методами и общими объектами?

edit: Я бы предпочел синтаксис C-типа для script -languge (или даже самого С++)

Ответы

Ответ 1

Я не знаю ни одного учебника, но есть пример интерпретатора языка C в источнике Clang, который может быть полезен. Вы можете найти его здесь: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

У вас, вероятно, не будет большого выбора синтаксиса для вашего языка сценариев, если вы пройдете этот маршрут. Clang анализирует только C, С++ и Objective C. Если вы хотите каких-либо изменений, вы можете отключить свою работу.

Ответ 3

Вы можете использовать clang как библиотеку для реализации компиляции JIT, как указано в других ответах. Затем вам нужно загрузить скомпилированный модуль (например, библиотеку .so).

Чтобы выполнить это, вы можете использовать стандартные dlopen (unix) или LoadLibrary (windows) для его загрузки, а затем использовать dlsym (unix) для динамического сравнения скомпилированных функций, например, "script" main() - как функция, имя которой известно. Обратите внимание, что для С++ вам придется использовать искаженные символы. Портативная альтернатива - например, GNU libltdl.

В качестве альтернативы "script" может запускаться автоматически во время загрузки, реализуя функции инициализации модуля или ставя некоторый статический код (сразу будет вызываться конструктор глобального объекта С++).

Загруженный модуль может напрямую вызвать что-либо в главном приложении. Конечно, символы известны во время компиляции, используя соответствующие файлы заголовков основного приложения.

Если вы хотите легко добавить "плагины" С++ в свою программу и априори знать интерфейс компонента (скажем, ваше основное приложение знает имя и интерфейс загруженного класса с его .h перед загрузкой модуля в память), после динамической загрузки библиотеки класс доступен для использования, как если бы он был статически связан. Просто убедитесь, что вы не пытаетесь создать экземпляр объекта класса перед тем, как dlopen() его модуль.

Использование статического кода позволяет также реализовать красивые автоматические механизмы регистрации плагинов.

Ответ 4

Я не знаю о Кланге, но вы можете посмотреть на Ch:

http://www.softintegration.com/

Это описывается как встраиваемый или автономный интерпретатор c/С++. Существует статья доктора Доббса с примерами ее внедрения здесь:

http://www.drdobbs.com/architecture-and-design/212201774

Я не делал больше, чем играю с ним, но, похоже, это стабильный и зрелый продукт. Это коммерческий, закрытый источник, но "стандартная" версия описывается как бесплатная как для личного, так и для коммерческого использования. Однако, глядя на лицензию, кажется, что "коммерческий" может включать только внутреннее использование компании, а не встраивание в продукт, который затем продается или распространяется. (Я не юрист, поэтому я должен четко проконсультироваться с SoftIntegration, чтобы быть уверенным в условиях лицензии.)

Ответ 5

Я не уверен, что встраивание C или C++ компилятора, такого как Clang, - хорошая идея в вашем случае. Поскольку "сценарий", то есть код (C или C++), который подается (во время выполнения!), Может быть произвольным, поэтому может произойти сбой всего приложения. Обычно вы не хотите, чтобы неправильный пользовательский ввод мог привести к сбою приложения.

Обязательно прочитайте то, что должен знать каждый программист на Си о неопределенном поведении, потому что оно относится и к C++ (в том числе к любому "сценарию C++", используемому вашим приложением). Обратите внимание, что, к сожалению, многие UB не вызывают сбои процессов (например, переполнение буфера может повредить некоторые совершенно не связанные данные).

Если вы хотите встроить интерпретатор, выберите что-то, предназначенное для этой цели, например Guile или Lua, и будьте осторожны, чтобы ошибки в скрипте не приводили к сбою всего приложения. Посмотрите этот ответ для более подробного обсуждения встраивания интерпретатора.