Язык сценариев для С++
Я немного подрастаю на языках сценариев, если в последнее время они появляются как грибы:)
Сегодня я подумал, что было бы неплохо иметь язык сценариев, который бы легко разговаривал с С++, то есть мог бы использовать классы С++, и, что наиболее важно для меня, можно было скомпилировать в С++ или некоторые DLL/.SO( плюс его .h), чтобы я мог связать его с моей программой на С++ и использовать классы, которые определяет или реализует script.
Я знаю, что могу встроить любые популярные языки сценариев, такие как lua, ruby, python... но интерфейс обычно включает в себя какую-то функцию "eval", которая оценивает предоставленный код сценария. В зависимости от инструмента, используемого для связи С++ и языка сценариев, интеграцию для обратных вызовов script в С++ можно было бы более или менее легко написать, но я не видел языка сценариев, который фактически позволяет мне писать независимые модули которые отображаются как .h и .so/dll для моей программы (возможно, по строкам языка сценариев, который генерирует код на С++).
Знаете ли вы какой-либо такой инструмент/скриптовый язык?
Спасибо заранее.
PD. Я думал о строках Vala или Haskell GHC. Они генерируют C, но не С++...
Ответы
Ответ 1
Следующие объекты более ориентированы на С++, чем языковые привязки:
- ChaiScript - попробовав на данный момент небольшой проект, интересный, этот MADE с С++ в виду и работает, просто включив заголовок! Не уверен, что это хорошо для большого проекта, но покажет, попробуй, чтобы он имел какой-то вкус!
- Falcon - попытка большого проекта, отличная; это не "один включить встраивание" как ChaiScript, а потому, что он очень гибкий и полностью считается используемым в С++ (только код С++ в libs). Я решил придерживаться его для моего самого большого проекта, который требует много гибкость скриптинга (сопоставима с ruby /python)
- AngelScript - не пробовал еще
- GameMonkey - не пытался еще
- Io - еще не пытался
Для вас, если вы действительно хотите написать свой скриптовый модуль на С++ и легко разоблачить его на языке сценариев, , я бы рекомендовал переходить с Falcon. Это полностью СДЕЛАНО в С++, все модули/библиотеки написаны таким образом.
Ответ 2
Вопрос, который обычно задается в этом контексте, заключается в следующем: как я могу предоставить свои классы на С++, чтобы они могли быть созданы из script? И ответ часто похож на http://www.swig.org/
Вы задаете противоположный вопрос, и похоже, что вы немного усложняете дела. Механизм сценариев, который создавал файлы .h и .so, на самом деле не был бы механизмом сценариев - это был бы компилятор! В этом случае вы можете использовать С++.
Сценарии не работают. Вы передаете им script и некоторые обратные вызовы, которые предоставляют набор функций, которые могут быть вызваны из script, и движок интерпретирует script.
Ответ 3
Попробуйте lua: http://www.lua.org/
Для использования классов С++ в lua вы можете использовать:
Чтобы сгенерировать привязку, используйте tolua ++: http://www.codenix.com/~tolua/
Он берет очищенный заголовок как входной сигнал и выводит файл c, который выполняет тяжелую работу. Легко, приятно и приятно работать.
Для использования объектов Lua в С++ я бы взял подход к написанию общего объекта Proxy с помощью таких методов, как (field, setField, callMethod, методы, поля).
Если вы хотите иметь dll, у вас может быть .lua как ресурс (в Windows я не знаю, что может быть подходящим эквивалентом для Linux), а на вашем DllMain инициализируйте свой прокси-объект кодом lua.
Затем код С++ может использовать прокси-объект для вызова кода lua, возможно, несколько методов самоанализа в прокси-сервере, чтобы облегчить эту задачу.
Вы можете просто повторно использовать прокси-объект для каждой библиотеки lua, которую вы хотите написать, просто изменив код lua, предоставленный ему.
Ответ 4
Это немного выходит за рамки моей компетенции, но я готов рискнуть вниз.: -)
Boost:: Python кажется тем, что вы ищете. Он использует немного макрома магии, чтобы делать свои вещи, но он явно демонстрирует классы Python на С++.
Ответ 5
Я являюсь автором LikeMagic, библиотеки привязки С++ для языка Io. (Я не автор Ио).
http://github.com/dennisferron/LikeMagic
Одна из моих явных целей с помощью LikeMagic - полная и полная совместимость с С++ в обоих направлениях. LikeMagic будет создавать собственные типы Io как типы С++ (включая преобразование между STL-контейнерами и Io-родным типом List), и он будет представлять классы, методы, поля и массивы С++ в Io. Вы даже можете передать блок кода Io из среды Io и использовать его на С++ в качестве функтора.
Обтекание типов С++ для потребления в Io script прост, быстр и прост. Доступ к объектам script из С++ требует функции eval, как вы описали, но преобразование типа на основе шаблонов и маршалинг облегчает доступ к результату выполнения строки script. И есть вышеупомянутая способность превратить объекты Io block() в С++-функторы.
Сейчас проект все еще находится на ранней стадии, хотя он полностью работоспособен. Мне все еще нужно делать такие вещи, как документировать его шаги сборки и зависимости, и его можно создавать только с помощью gcc 4.4.1+ (а не Microsoft Visual С++), поскольку использует функции С++ 0x, еще не поддерживаемые в MSVC. Тем не менее, он полностью поддерживает Linux и Windows, а также порт Mac.
Теперь плохая новость: создание сценариев для создания файлов .h и .so или .dll, вызываемых из С++, потребует не только компилятора (сортировки), но и компилятора JIT. Это потому, что (во многих языках сценариев, но особенно в Io) объектные методы и поля неизвестны до выполнения - и в Io методы могут быть добавлены и удалены из живых объектов! Сначала я собирался сказать, что тот факт, что вы просите об этом, заставляет меня задаться вопросом, может быть, вы действительно не понимаете, что такое динамический язык . Но я верю в способ дизайна, в котором вы сначала пытаетесь представить идеальный или простой способ сделать что-то, а затем отработать оттуда до того, что на самом деле возможно. И поэтому я соглашусь с точки зрения простоты использования, то, что вы описываете, легче использовать.
Но в то время как это идеально и едва ли возможно (используя язык script с компиляцией JIT), это не очень практично, поэтому я все еще не уверен, что то, что вы просите, - это то, что вы действительно хотите. Если файлы .h и .so/.dll удалены из изменений script и script, вам нужно будет перекомпилировать вашу программу на С++, чтобы воспользоваться этим изменением! Не нарушает ли это главное преимущество использования script в первую очередь?
Единственный способ практического применения будет заключаться в том, что интерфейсы, определяющие сценарии, не изменяются, а вы просто создаете обертки С++ для функций script. В итоге у вас будет много функций на С++, например:
int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }
Я признаю, что более чистый код выглядит с точки зрения вызывающих функций обертки. Но если это то, что вы хотите, почему бы просто не использовать отражение на языке сценариев и не сгенерировать файл .h из списков методов, хранящихся в объектах script? Такое отражение может быть легко сделано в Io. В какой-то момент я планирую интегрировать OpenС++ source-to-source translator как вызываемую библиотеку из LikeMagic, что означает, что вы даже можете использовать надежный С++ генератор кода вместо того, чтобы записывать строки.
Ответ 6
Вы можете сделать это с помощью Lua, но если у вас есть много классов, вам понадобится инструмент, такой как SWIG или toLua ++, чтобы сгенерировать для вас некоторый код клейма.
Ни один из этих инструментов не будет обрабатывать необычную часть вашей проблемы, которая должна иметь файл .h, за которым скрывается язык сценариев, и иметь сценарии вызова кода на С++, не зная, что это скрипты. Для этого вам нужно будет сделать следующее:
-
Напишите код клей самостоятельно. (Для Lua это относительно легко, пока вы не зайдете в классы, после чего это не так просто, поэтому существуют инструменты, такие как SWIG и toLua ++.)
-
Скрыть за интерфейсом какое-то глобальное состояние интерпретатора сценариев.
-
Предположим, что у вас есть несколько файлов .h, каждый из которых реализован с использованием скриптов, вам нужно решить, какие из них имеют общее состояние на языке сценариев, а какие - в разных сценариях. (В основном у вас есть VM для языка сценариев, а крайности: (a) все файлы .h используют одну и ту же виртуальную машину и (b) каждый файл .h имеет свою отдельную изолированную виртуальную машину. сложный.)
Если вы решите сделать это самостоятельно, написав код клей, чтобы превратить таблицы Lua в классы С++ (так что код Lua выглядит как С++ для остальной части программы) довольно прост. Идя в другом направлении, где вы завершаете свой С++ в Lua (чтобы объекты С++ смотрели на скрипты, такие как значения Lua), большая боль в заднице.
Независимо от того, что вы делаете, у вас впереди какая-то работа.
Ответ 7
Хороший вопрос, я часто думал об этом сам, но, увы, нет простого решения такого рода вещей. Если вы работаете в Windows (я думаю, нет), то вы можете добиться чего-то подобного, создав COM-компоненты в С++ и VB (учитывая это как язык сценариев). Разговор происходит через интерфейсы COM, что является хорошим способом взаимодействия между разрозненными языками. То же самое относится к языкам на основе .NET, которые могут взаимодействовать между собой.
Я тоже очень хочу знать, существует ли что-то подобное для С++, желательно с открытым исходным кодом.
Ответ 8
Вы можете проверить вложение Guile (интерпретатор схемы) или V8 (Google javascript-интерпретатор - используется в Chrome - написан на С++).
Ответ 9
Google V8 engine написан на С++, я ожидаю, что вы сможете интегрировать его в проект. Они говорят об этом в этой статье.
Ответ 10
Попробуйте использовать язык программирования Ring
http://ring-lang.net
(1) Расширение с использованием языков C/С++
https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages
(2) Встраивание Ring Interpreter в программы C/С++
https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs
(3) Генератор кода для обертывания библиотек C/С++
https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries