Я являюсь автором 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 удалены из сценария, и скрипт изменится, вам нужно перекомпилировать вашу программу на C++, чтобы воспользоваться этим изменением! Не нарушает ли это основное преимущество использования скрипта в первую очередь?
Единственный способ практического применения будет заключаться в том, что интерфейсы определили, что сценарии не изменяются, и вы просто создаете C++-оболочки для функций скрипта. Вы бы в конечном итоге иметь много функций C++ как:
int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }
Я признаю, что это уборщик ищет код с точки зрения абонентов функции-оболочки. Но если это то, что вы хотите, почему бы просто не использовать отражение на языке сценариев и не сгенерировать файл .h из списков методов, хранящихся в объектах сценария? Этот вид отражения может быть easily done in Io. В какой-то момент я планирую интегрировать OpenC++ source-to-source translator как вызываемую библиотеку из LikeMagic, что означает, что вы даже можете использовать надежный генератор кода на C++ вместо того, чтобы записывать строки.
q Кажется, устение не для меня. – sergiol
Извините, но зачем вы используете язык сценариев? Что еще он предоставляет, кроме ввода пользователем? – kim366
@DiegoSevilla родился еще один язык программирования. Я называюсь ZetScript Я не знаю, если вы ищете механизм сценария, но посмотрите на все, только если это соответствует вашим потребностям! http://zetscript.org –