Подтвердить что ты не робот

Язык сценариев для С++

Я немного подрастаю на языках сценариев, если в последнее время они появляются как грибы:)

Сегодня я подумал, что было бы неплохо иметь язык сценариев, который бы легко разговаривал с С++, то есть мог бы использовать классы С++, и, что наиболее важно для меня, можно было скомпилировать в С++ или некоторые DLL/.SO( плюс его .h), чтобы я мог связать его с моей программой на С++ и использовать классы, которые определяет или реализует script.

Я знаю, что могу встроить любые популярные языки сценариев, такие как lua, ruby, python... но интерфейс обычно включает в себя какую-то функцию "eval", которая оценивает предоставленный код сценария. В зависимости от инструмента, используемого для связи С++ и языка сценариев, интеграцию для обратных вызовов script в С++ можно было бы более или менее легко написать, но я не видел языка сценариев, который фактически позволяет мне писать независимые модули которые отображаются как .h и .so/dll для моей программы (возможно, по строкам языка сценариев, который генерирует код на С++).

Знаете ли вы какой-либо такой инструмент/скриптовый язык?

Спасибо заранее.

PD. Я думал о строках Vala или Haskell GHC. Они генерируют C, но не С++...

4b9b3361

Ответ 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