Я пишу немного встроенного языка для другого проекта. Хотя разработка игры не была ее первоначальным замыслом, она начинает выглядеть хорошо, и я полагаю, что в какой-то момент я буду ее развивать.
Не раскрывая никаких подробностей (чтобы избежать предвзятости), мне интересно знать:
Какие функции вы любите в языке сценариев для разработки игр?
Если вы использовали Lua, Python или другой встроенный язык, такой как Tcl или Guile, в качестве основного языка сценариев в игровом проекте, какие аспекты вы считаете наиболее полезными?
Языковые особенности (лямбды, классы, параллелизм)
Особенности реализации (оптимизация производительности, JIT, аппаратное ускорение)
Интеграционные функции (привязки C, C ++ или .NET)
Или что-то совершенно другое?
Ответы:
Я ищу две вещи - скорость и интеграцию. Обычно оба идут вместе и со знакомыми. К сожалению, для C ++ практически нет языков, предлагающих скорость и интеграцию. Я использовал Lua, и это ужасно. Я потратил все время на написание связываний и совсем немного времени для написания кода.
Особенности языка? Смысл встраивания языка сценариев не в том, чтобы он мог иметь отличные динамические возможности языка, которых не было в моем исходном языке, а в том, что его можно интерпретировать во время выполнения . Мне действительно все равно, если это в основном функционально, тогда это нормально - и подходит для моего основного языка (в данном случае C ++). Однако, что удивительно, языки, предназначенные для интеграции в хост-приложения, полностью не справляются с задачей интеграции .
Нужны ли мне совместные процедуры? Нет, мне не нужны сопрограммы. Нужна ли мне динамическая печать? Нет, мне нужно знать, какие типы возвращаются мне из моего скриптового языка, и, поскольку весь мой существующий код построен на очень строгой типизации, я бы очень хотел, чтобы мой код скрипта мог это учитывать. Нужна ли сборка мусора? Нет, мои типы уже управляют своими собственными ресурсами, и я определенно хочу детерминированного уничтожения. Хочу ли я пойти? Нет, я хочу бросать исключения.
Проблема, которую я обнаружил, заключалась в том, что в основном все существующие языки сценариев были разработаны для расширения C, а не C ++, и не поддерживают должным образом модель C ++ во многих отношениях, и в дополнение к этому они имеют совершенно другую семантику. Как, черт возьми, я собираюсь перевести
shared_ptr
, то есть автоматическое детерминированное уничтожение, в среду сбора мусора? Вы можете писать любые библиотеки обёрток, которые вам нужны, вы не измените семантику основного языка, поскольку она несовместима с языком, который вы пытаетесь расширить с помощью него. Как я могу гарантировать, что этоvoid*
правильный тип? Как я могу справиться с наследованием? Как бросать и ловить исключения? Это просто не работает.Хороший язык сценариев для C ++ будет иметь статическую типизацию, семантику значений, детерминированно уничтожаться, генерировать исключения и перехватывать и уважать мои конструкторы-деструкторы / конструкторы / копии, потому что тогда все мои типы будут просто работать, красиво и легко, и получающийся язык будет быстро и поддерживает всю мою оригинальную семантику, легко привязывается к.
источник
Для веб-игр для меня важны три фактора:
Мне особенно нравится Perl, отчасти потому, что я уже знаком с языком, и потому что с модулем веб-сервера, таким как mod_perl2, есть огромное преимущество в производительности и интеграции - mod_perl2 сохраняет скомпилированную версию скриптов в ОЗУ (которые интерпретируются только при первой загрузки), что дает ему значительное преимущество в скорости по сравнению с другими интерпретируемыми языками, которые не имеют опций компиляции, а также интегрируется в сервер Apache HTTPd с многофункциональным API, обеспечивающим доступ ко многим очень мощным функциям.
Эти факторы могут быть полезны для разработки игр через Интернет (и там, где необходим доступ к базе данных, кэширование соединений с базой данных помогает еще больше сократить время отклика для пользователей). Конечно, это может быть не самым идеальным решением для всего, так как каждый язык имеет свои преимущества (и недостатки), но он всегда хорошо работал для моих нужд.
источник
Расположены в порядке (убывания) важности:
источник