Язык сценариев для [закрытого] C++

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

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

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

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

Заранее спасибо.

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

39
задан Diego Sevilla 30 June 2010 в 15:01
поделиться

9 ответов

В этом контексте обычно задают следующий вопрос: как открыть мои классы C ++, чтобы их можно было создать из скрипта? И ответ часто бывает примерно таким: http://www.swig.org/

Вы задаете противоположный вопрос, и похоже, что вы немного усложняете ситуацию. Механизм сценариев, создающий файлы .h и .so, на самом деле не был бы механизмом сценариев - это был бы компилятор! В этом случае вы можете использовать C ++.

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

21
ответ дан 27 November 2019 в 02:18
поделиться

Попробуйте lua: http://www.lua.org/

Для использования классов C ++ в lua вы можете использовать:

Для генерации привязки используйте tolua ++: http: // www. codenix.com/~tolua/

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

Для использования объектов Lua в C ++ я бы предпочел написать общий объект Proxy с такими методами, как (field, setField, callMethod, methods, fields).

Если вам нужна dll, вы можете использовать .lua в качестве ресурса (в Windows я не знаю, что может быть подходящим эквивалентом для Linux), а на вашем DllMain инициализируйте свой прокси-объект с помощью кода lua.

Затем код C ++ может использовать прокси-объект для вызова кода lua, возможно, с несколькими методами интроспекции в прокси-сервере, чтобы упростить эту задачу.

Вы можете просто повторно использовать прокси-объект для каждой библиотеки lua, которую хотите написать, просто изменив предоставленный ей код lua.

21
ответ дан 27 November 2019 в 02:18
поделиться

Вы можете сделать это с помощью Lua, но если у вас много классов, вам понадобится такой инструмент, как SWIG или toLua ++, чтобы сгенерировать для вас часть связующего кода.

Ни один из этих инструментов не справится с необычной частью вашей проблемы, заключающейся в том, чтобы иметь файл .h, за которым скрывается язык сценариев, и иметь сценарии вызова кода C ++, не зная, что это сценарии. Для этого вам нужно будет сделать следующее:

  • Напишите клеевой код самостоятельно. (Для Lua это относительно просто, пока вы не попадете в классы, после чего это не так просто, поэтому существуют такие инструменты, как SWIG и toLua ++.)

  • Спрячьте за интерфейсом какое-то глобальное состояние интерпретатора сценариев.

  • Предположим, у вас их несколько.h, каждый из которых реализован с использованием сценариев, вы должны решить, какие из них имеют общее состояние на языке сценариев , а какие используют отдельные состояния сценариев. (По сути, у вас есть виртуальная машина для языка сценариев, и крайности: (а) все файлы .h используют одну и ту же виртуальную машину совместно и (б) каждый файл .h имеет свою собственную отдельную изолированную виртуальную машину. сложно.)

Если вы решите сделать это самостоятельно, написать связующий код для превращения таблиц Lua в классы C ++ (чтобы код Lua выглядел как C ++ для остальной части программы) довольно просто. Переход в другом направлении, когда вы оборачиваете свой C ++ в Lua (так, чтобы объекты C ++ смотрели на сценарии как значения Lua), является большой головной болью.

Что бы вы ни делали, впереди у вас есть работа.

2
ответ дан 27 November 2019 в 02:18
поделиться

Двигатель Google V8 написан на C ++, я думаю, вы сможете интегрировать его в проект. Об этом говорится в этой статье .

1
ответ дан 27 November 2019 в 02:18
поделиться

Это немного не в моей компетенции, но я готов рискнуть понижением голосов. :-)

Boost::Python, похоже, то, что вы ищете. Он использует немного магии макросов, чтобы делать свои вещи, но он довольно чисто отображает классы Python в C++.

13
ответ дан 27 November 2019 в 02:18
поделиться

Вы можете проверить встраивание Guile (интерпретатор схемы) или V8 (интерпретатор JavaScript Google - используется в Chrome - написан на C ++).

0
ответ дан 27 November 2019 в 02:18
поделиться

Следующие из них больше ориентированы на интеграцию с C ++, чем на языковые привязки:

  • ChaiScript - сейчас пробую в небольшом проекте, интересно, этот СДЕЛАН с учетом C ++ и работает, просто включая заголовок! Пока не уверен, подходит ли это для большого проекта, но посмотрю, попробуй, попробуй!
  • Falcon - примерка большого проекта, отлично; это не «одно включение встраивания», как ChaiScript, а потому, что он действительно гибкий и полностью рассчитан на использование в C ++ (только код C ++ в библиотеках) - я решил придерживаться его для моего самого большого проекта, который требует много гибкость сценариев (сравнима с ruby ​​/ python)
  • AngelScript - еще не пробовал
  • GameMonkey - еще не пробовал
  • Ио - еще не пробовал

Если вы действительно хотите написать свой модуль сценариев на C ++ и легко предоставить его языку сценариев, я бы рекомендовал использовать Falcon . Он полностью СДЕЛАН на C ++, все модули / библиотеки написаны именно так.

32
ответ дан 27 November 2019 в 02:18
поделиться

Хороший вопрос, я сам часто думал об этом, но, увы, нет простого решения для такого рода вещей. Если вы работаете в Windows (я думаю, что нет), то вы могли бы добиться чего-то подобного, создав компоненты COM на C ++ и VB (учитывая, что это язык сценариев). Общение происходит через COM-интерфейсы, что является отличным способом взаимодействия между разными языками. То же самое и с языками на основе .NET, которые могут взаимодействовать между собой.

Мне тоже не терпится узнать, существует ли что-то подобное для C ++, желательно с открытым исходным кодом.

1
ответ дан 27 November 2019 в 02:18
поделиться

Я автор LikeMagic, библиотеки привязки C ++ для языка Io. (Я не являюсь автором Ио.)

http://github.com/dennisferron/LikeMagic

Одна из моих явных целей с LikeMagic - полная и полная совместимость с C ++ в обоих направлениях. LikeMagic будет маршалировать собственные типы Io как типы C ++ (включая преобразование между контейнерами STL и собственным типом List Io) и будет представлять классы, методы, поля и массивы C ++ внутри Io. Вы даже можете передать блок кода Io из среды Io и использовать его в C ++ в качестве функтора !!

Обертывание типов C ++ для использования в Io-скрипте просто, быстро и легко. Для доступа к объектам сценария из C ++ требуется функция «eval», как вы описали, но преобразование типов на основе шаблона и маршалинг упрощают доступ к результату выполнения строки сценария. И есть вышеупомянутая возможность превращать объекты Io block () в функторы C ++.

В настоящее время проект все еще находится на начальной стадии, хотя он полностью запущен. Мне все еще нужно делать такие вещи, как документировать его этапы сборки и зависимости, и он может быть построен только с помощью gcc 4.4.1+ (не Microsoft Visual C ++), потому что он использует функции C ++ 0x, еще не поддерживаемые в MSVC. Однако он полностью поддерживает Linux и Windows, и планируется перенос на Mac.

А теперь плохие новости: создание сценариев для создания файлов .h и файлов .so или .dll, вызываемых из C ++, потребует не только компилятора (своего рода), но и JIT-компилятор . Это потому, что (во многих языках сценариев, но особенно в Io) методы и поля объекта неизвестны до времени выполнения - а в Io методы можно даже добавлять и удалять из живых объектов! Сначала я собирался сказать, что сам факт того, что вы просите об этом, заставляет меня задуматься, возможно, вы действительно не понимаете, что такое динамический язык . Но я верю в способ дизайна, при котором вы сначала пытаетесь представить идеальный или самый простой из возможных способов сделать что-либо, а затем двигаетесь в обратном направлении к тому, что действительно возможно. Итак, с точки зрения простоты использования, я признаю, что то, что вы описываете, звучит проще в использовании.

Но хотя это идеально и едва ли возможно (с использованием языка сценариев с JIT-компиляцией), это не очень практично, поэтому я все еще не уверен, действительно ли то, что вы просите, действительно нужно. Если .h и .so /.dll создаются JIT-файлами из сценария, и сценарий изменяется, вам потребуется перекомпилировать программу на C ++, чтобы воспользоваться этим изменением! Разве это не противоречит основному преимуществу использования сценария в первую очередь?

Единственный практический вариант - если интерфейсы, определяющие сценарии, не изменяются, а вы просто создаете оболочки C ++ для функций сценария. В итоге у вас будет много функций C ++, например:

int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }

Я признаю, что код выглядит более чистым с точки зрения вызывающих функцию-оболочку. Но если это то, что вы хотите, почему бы просто не использовать отражение на языке сценариев и не сгенерировать файл .h из списков методов, хранящихся в объектах сценария? Такое отражение может быть легко выполнено в Ио . В какой-то момент я планирую интегрировать OpenC ++ транслятор исходного кода в исходный в качестве вызываемой библиотеки от LikeMagic, что означает, что вы даже можете использовать надежный генератор кода C ++ вместо записи строк.

5
ответ дан 27 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: