2010-06-30 4 views
36

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

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

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

Знаете ли вы, что такой инструмент/язык сценариев?

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

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

+4

q Кажется, устение не для меня. – sergiol

+0

Извините, но зачем вы используете язык сценариев? Что еще он предоставляет, кроме ввода пользователем? – kim366

+0

@DiegoSevilla родился еще один язык программирования. Я называюсь ZetScript Я не знаю, если вы ищете механизм сценария, но посмотрите на все, только если это соответствует вашим потребностям! http://zetscript.org –

ответ

0

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

+0

Опять же, не ищите подпитывания. Использование V8 или Guile заставляет меня писать ad-hoc-обертки для C++. Я хочу, чтобы язык сценариев мог генерировать .h и т. Д. –

+0

Моя ошибка в том, что вы не внимательно прочитали свой вопрос. Я не знаю никаких языковых инструментов, которые бы легко сделали то, что вы хотите. –

1

Google V8 engine написан на C++, я ожидаю, что вы сможете интегрировать его в проект. Они говорят об этом in this article.

+0

О, нет, не впитывается, но язык сценариев может генерировать автономные .so модули (и соответствующие файлы .h, которые будут использоваться с C++) –

+0

@Diego: Ну, я надеюсь, вы можете завершить некоторые JavaScript код * и * интерпретатор V8 в '.so' :-), но я сомневаюсь, что это то, что вы имеете в виду. Итак, что-то, что компилирует JavaScript для машинного кода (вместо того, чтобы позволить JavaScript легко разговаривать с C++) и устраняет сборщик мусора (возможно, используя подсчет ссылок) и другие аспекты интерпретатора. Это высокий порядок. V8 компилирует JavaScript непосредственно в машинный код, но «на лету» и динамически (потому что JavaScript является динамическим языком). Никогда не слышал об одном для C++. [OT: Есть один для Java (Rhino).] –

13

Это немного вне моей области знаний, но я готов рискнуть вниз. :-)

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

+0

Мой опыт работы с Boost: Python был недоволен. Код также оказывался гниющим на лозе. SWIG был намного лучше. –

21

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

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

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

+0

Даниил, да, сценарии могут выполнять динамическое выполнение, но они могут и не быть. Возможно, то, что я ищу, как я уже сказал, является языком сценариев, а не сценарием. Вдоль линий Vala GNOME, больше помогает писать быстрый код, который он преобразует в C++ (C в случае Vala) или как ghc, который фактически генерирует C-код с учетом сбора мусора и т. Д. Это было бы мило DSL для C++, который также имеет набор исполняемых библиотек, которые можно использовать. Может быть, google go language - это ответ (любопытно не упомянутый кем-либо) ... –

+0

Возможно, потому что Go, как Lua и другие языки, взаимодействует с C, но не напрямую с C++ ... источник: http://golang.org/ doc/go_faq.html # Do_Go_programs_link_with_Cpp_programs – Klaim

+0

Спасибо, что я вообще не знал о Swig ... –

1

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

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

+0

«Это хороший способ вмешаться ...»: Я должен категорически не соглашаться. COM (особенно при использовании для интерфейса VB и C++) особенно сложно использовать ... –

+0

Хорошо, да, COM-взаимодействие имеет несколько причуд :), когда используется между C++ и VB, и, возможно, более того, когда между .NET и COM; вы полностью понимаете и запоминаете много, а не что-то особенно хорошо разработанное. Я сам не поклонник COM и вряд ли рекомендую его. – tathagata

21

Try Lua: http://www.lua.org/

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

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

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

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

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

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

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

+0

Ссылка мертва ....... –

+0

@RanWang Это 7-летний ответ. Прошло некоторое время с тех пор, как я использовал tolua ++. Googling для 'tolua ++' показывает несколько репозиториев GitHub - любой из них работает для вас? –

+0

Нашел это ~ Большое спасибо –

2

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

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

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

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

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

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

Независимо от того, что вы делаете, у вас впереди какая-то работа.

28

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

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

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

+0

Спасибо, Klaim. Это тот ответ, который я искал. Я попробую ваши рекомендации и давайте посмотрим. –

+0

Нет проблем, я сделал много поиска (с помощью на форумах), чтобы получить этот список интересных языков сценариев. – Klaim

+1

@DiegoSevilla Эй, вы пробовали эти языки и правильно ли я ответил на ваш вопрос? :) – Klaim

5

Я являюсь автором 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++ вместо того, чтобы записывать строки.

0

Попробуйте язык программирования кольца языки http://ring-lang.net

(1) Расширение с помощью C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages

(2) Вложение кольца Переводчик в C/C++ программы https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs

(3) Генератор кода для упаковки C/C++ Библиотеки https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries

 Смежные вопросы

  • Нет связанных вопросов^_^