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

Какой язык сценариев лучше встраивать в многопоточное приложение C/С++

Учитывая следующие требования:

  • Должен поддерживаться в Windows. Предпочтительно работает и на других платформах.
  • Должен поддерживать многопоточность. Под этим я подразумеваю, что двигатель может работать параллельно в нескольких потоках.
  • Считываемость важна.
  • Лицензия должна быть совместима с проектами с закрытым исходным кодом.

Мне нравится Python для его удобочитаемости. У меня также больше опыта работы с Python, чем на других языках сценариев. Однако CPython не многопоточен, и IronPython требует размещения CLR и совместимого языка (С++/CLI или С#).

4b9b3361

Ответ 1

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

В соответствии с этим ответом движок SpiderMonkey является потокобезопасным, тогда как Google/Chrome V8 может и не быть.

Ответ 3

Lua - лучший выбор. Python, Ruby и JavaScript - это большие языки, и они не предназначены для встраивания. Но Lua отличается, предназначен для встраивания.

Вы должны рассматривать "ограничение" больше, чем любые другие вещи для вашего языка script. Встраиваемые скрипты могут легко использовать для взлома (плохого значения).

Например, по умолчанию Lua не может печатать на консоли. Как я знаю, Blizzard использует Lua из-за этого.

Ответ 4

У меня была одна и та же дилемма: выберите Lua над Python и JScript. То, что Lua делает лучше всего, - это отличное взаимодействие с кодом C/С++ с использованием библиотек, таких как luabridge и luabind. То есть вы можете вызвать lua из С++ и вернуть script обратно на С++ без проблем, получить доступ к данным С++ из script и наоборот.

Проблема с такими языками, как Python и Lua, заключается в том, что язык не является многопоточным в правильном смысле слова: если один поток С++ использует механизм сценариев языка для запуска script, вы не можете использовать чтобы запустить другой script. Оба языка имеют блокировку на двигателе, которая может использоваться в этих случаях, чтобы обеспечить целостность двигателя. Однако оба языка многопоточны в том смысле, что вы можете запускать функцию в фоновом режиме и взаимодействовать с любым объектом синхронизации (как и с С++). Поэтому я выбираю, чтобы все потоки, созданные из С++, и код сценариев выполнялись только в выделенных потоках (поток на движок) и взаимодействовали с другими потоками в приложении обычными способами.

Если вам нужно передать данные и управлять с С++ на script и наоборот, Lua намного лучше, чем Python. Кроме того, я не буду размещать CLR в проекте на С++. Это слишком грязно.

Ответ 5

Можно использовать Guile, которая является встраиваемой схемой.

Ответ 6

JScript - отличное решение. Он уже поддерживается Windows Script Host и эмулирует многопоточность с событиями. Это проще, чем Python, я обещаю вам. Эта статья MSDN является отличной ссылкой.

Ответ 7

Lua действительно легко интегрируется и может работать в нескольких потоках, используя что-то вроде Lua Lanes (это кросс-платформа Windows/Linux/MacOS).

Ответ 8

Я уверен, что Stackless Python будет единственным, поддерживающим многопоточность. Stackless Python был выбран CCP для их MMO: Eve-Online специально потому, что бесконтактный характер кода позволял им планировать продолжения в любом потоке ОС, который им нужен, после того как они построили необходимые примитивы, чтобы обеспечить целостность всей темы.

Lua может использоваться в многопоточной среде, но каждому параллельному потоку нужен отдельный объект lua_State, поэтому вам нужно будет создать свою собственную систему передачи промежуточных сообщений для кода lua, выполняемую в контексте отдельных состояний lua, чтобы общаться.

Ответ 9

Вы можете попробовать spidermonkey. Проверьте оболочку на основе шаблонов Libjspp С++ для встраивания и расширения движка Javascript spidermonkey: http://code.google.com/p/libjspp/

Ответ 10

Полностью зависит от предпочтений. Большинство языков имеют возможность встраивания в C с параметрами экспорта в среду сценариев.

Если бы это был я, я бы пошел с V8 Javascript.

Ответ 11

Под "многопоточным" я предполагаю, что вы имеете в виду "может эффективно использовать несколько ядер"? Если ваша система имеет только один процессор, тогда вы будете делать только одну вещь за раз, независимо от языка сценариев, который вы выберете.

Если вы решите перейти на CPython-маршрут, то главное, что нужно помнить, это то, что только механизм сценариев защищен глобальной блокировкой интерпретатора. Если выполняемый script тратит много времени на вызов кода, отличного от Python (включая операции ввода-вывода и других операций на системном уровне), он может успешно использовать несколько потоков довольно счастливо.

Еще один фактор, который следует учитывать, заключается в том, что возможности интроспекции Python по своей сути трудно защитить должным образом (Google сделал это для AppEngine, но им пришлось отказаться от некоторых вещей в этом процессе).

Учитывая преобладание Javascript-движков в браузерах и движках Lua в компьютерных играх, один из них, вероятно, будет более простым путем.

Ответ 12

Попробуйте Falcon язык программирования