Любой учебник для встраивания Clang в качестве интерпретатора сценариев в код C ++? - PullRequest
16 голосов
/ 12 июля 2010

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

edit: я бы предпочел C-подобный синтаксис для языка сценариев (или даже самого C ++)

Ответы [ 5 ]

13 голосов
/ 12 июля 2010

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

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

7 голосов
/ 04 сентября 2013

Я думаю, вот что именно вы описали.

http://root.cern.ch/drupal/content/cling

6 голосов
/ 18 мая 2013

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

Для этого вы можете использовать стандартный dlopen (unix) или LoadLibrary (windows) для его загрузки, а затем использовать dlsym (unix) для динамической ссылки на скомпилированные функции, скажем, функцию «script» main (), имя известно. Обратите внимание, что для C ++ вам придется использовать искаженные символы. Портативная альтернатива, например, GNU's libltdl .

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

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

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

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

1 голос
/ 13 июля 2010

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

http://www.softintegration.com/

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

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

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

0 голосов
/ 21 февраля 2015

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

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

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

...