Чи реальна реалізація вашої власної мови сценаріїв?


21

Я кодую гру «бити» в C ++, і настав час впроваджувати сценарії для подій, тригерів, котлет тощо. Я читав в Інтернеті і отримав неабияку інформацію. Першим моїм рішенням було б реалізувати власну мову сценаріїв, подібну до тієї, як у Cave Story . Я бачив це, що пропонується, але більшість poeple пропонують луа, але це, здається, не відповідає моєму типу програмування.

Ви створили власну мову сценаріїв? Чому ви вирішили прокрутити свій власний, а не використовувати існуючий? З якими ресурсами ви консультувались під час розробки?


43
Моє особисте правило: якщо вам потрібно запитати інших людей, чи гарна ідея прокатати свій _____, то це не дуже гарна ідея.
sam hocevar

2
Зауважте, що якщо ви реалізуєте свою власну мову, люди повинні її вивчити і сподіватися, що у вашому перекладачі немає помилок, тоді як такі мови, як Lua, є більш популярними і набагато рідше мають помилки.
Нік Каплінгер

2
@NickCaplinger б'є по голові. Прокат власних засобів не має жодної документації, жодної спільноти, сторонніх підручників, не StackExchange і т. Д. Незалежні досягнення в синтаксисі чи інтеграції переважать відсутність підтримки, якщо ви справді не відомий розробник з мільйони шанувальників.
Шон Міддлічч

4
Також пам’ятайте про інструментальне обладнання. Це моя проблема з D, Rust, Dart і т. Д. Ваш синтаксис сам по собі є безглуздим. Вам потрібен належний редактор, виділення, "Intellisense" (доповнення коду), хороша діагностика, підтримка рефакторингу, підтримка вбудованої документації тощо, щоб справді нічого не вартий. Не кажучи вже про всі фактичні мовні особливості, інтеграцію, ефективність тощо.
Шон Міддлічч

1
Якщо ви програміст на C ++ і не любите LUA, спробуйте скористатися JavaScript.
зеель

Відповіді:


42

Ні . Принаймні, ймовірно , немає.

Це дуже частий винайдення колеса - це розробка ігор, помилка, яка все ще досить популярна.

Якщо ви задаєте це запитання, на вас, швидше за все, вплинуть те, що роблять інші, тому просто подивіться, що Epic Games щойно зробили з Unreal Engine:

  • UE3 мав користувацьку, дивну, неоптимізовану, важко налагоджувану річ UnrealScript,
  • Якщо слух правдивий, його підтримка знімається в UE4 , на користь перезавантажених DLL C ++.

Як ви думаєте, ви можете зробити краще, ніж Епік?

Створення мов прогамінга належить творцям мови програмування , а не інженерам ігор.

Потрібні роки та роки, щоб мова стала повністю зрілою, а супроводжуючий набір інструментів (компілятор, лінкер, перекладач, налагоджувач ..) можна використовувати. На сьогоднішній день у вас є безліч доступних рішень, тому немає абсолютно ніякої реальної причини починати нове з нуля, принаймні, не, якщо мета просто зробити гру. Період.

Щоб відповісти на ваші побічні запитання, ні, саме з цих причин я ніколи не реалізував власну мову сценаріїв. Але я багато страждав з деякими напівпеченими. Оскільки вони були створені з дуже вузькою функцією на увазі, у них завжди були такі маленькі божевільні химерності, які змушують вас з розуму. Часто ви виявите, що витрачаєте дуже багато часу, просто намагаючись подолати обмеження мови, а не просто зробити свою гру.

Якщо ви хочете створити мову, це те, що вона призначена для використання людьми, які не дуже добре знають програмування, або якщо ви вважаєте, що вам це потрібно, тому що ви хочете щось дуже доменне, дозвольте мені сказати, що вони також погані причини. Ви можете написати API високого рівня з функціями, які do_what_they_say_and_say_what_they_do(), і деякий дуже простий код котла, який розкриває його основне використання. Ваші не дуже технічні користувачі будуть раді дізнатись трохи програмування, і ви будете раді, що не обмежуєтесь якоюсь погано реалізованою мовою.

Отже, оскільки це буде звучати трохи різко або навіть суворо, я скажу, що є один випадок, коли це могло б мати сенс: якщо ви хочете дізнатися, як робиться мова сценаріїв. Але, будь ласка, будь ласка, якщо ви це зробите: не змушуйте інших використовувати його.

Редагувати

Я щойно переглянув список команд Cave Story, який ви зв'язали. Ой:

<ECJx:y      [EC?] Jump           @ Jump to event Y if any npc with ID X is present

Я не хочу проявляти неповагу до розробника, що стоїть за Cave Story, але це прекрасний приклад простого списку команд, який мутував неконтрольованою спеціальною мовою сценаріїв. Це може бути корисно для одного розробника або дуже малої команди, але на цьому етапі я радимо перейти на належну та добре перевірену мову Тюрінга (наприклад, Lua), де ви могли б зробити:

if (npc.id == x) then
    jump_to_event(y)
end

Це набагато полегшить ситуацію, коли, наприклад, вам знадобиться більш складна умова:

if (npc.id == x) or (npc.type == "enemy") then
    jump_to_event(y)
end

21
+1 "Створення мов наборів належить творцям мови програмування, а не інженерам ігор." Ця цитата не могла бути правильнішою. Узявши клас концепцій мови програмування, який викладав хлопець, який займався мовою програмування, ці люди є різною породою. Один клас змусив мене зрозуміти кількість теорії та математики CS, яка перетворюється на створення справжньої мови програмування. Це змусило мене ще більше оцінити цих людей та їхній набір навичок. Вони дозволяють мені створювати ігри, я не заважаю їм і дозволяю їм створювати мови.
Дін Лицар

+1, я не знаю луа чи користувальницьку мову сценаріїв, але було очевидно, що саме відбувається в луа, і саме там важлива зручність використання
RhysW

1
Немає нічого магічного в тому чи іншому, що не дає можливості навчитися обом. Unreal, можливо, видаляє UnrealScript, але вони значно покращують і заповнюють Kismet, щоб бути здатною і повною мовою візуального сценарію. Вони не видалили UnrealScript, оскільки це збій, вони видаляють, оскільки його застаріли значно складніші функції (гаряче перезавантаження C ++, оновлений Kismit). Не сприймайте це так, що я не згоден з вашою думкою: написання власної мови - це велика марнотрата часу, джерело помилок та причин великих кривих навчання тощо.
Шон Міддлічч,

2
@ ott-- Я також не боюся, я мою думку, що розширення цього позначення ускладнить його, тоді як використання правильної мови в першу чергу допоможе в перспективі. Накладні витрати не мають відношення до простоти використання в цьому випадку IMHO.
Лоран Кувіду

1
Зауважте, що UnrealScript замінюється кресленнями (але я поклав ставку на своїх колег, що це повернеться). Завантаження DLL-файлів з гарячим набором є ортогональною особливістю.
sam hocevar

9

Ви створили свою власну мову сценаріїв і чому ви вирішили скористатись своєю власною замість існуючої?

Я маю, хоча синтаксис я запозичив з інших мов. Загалом це було чудовим досвідом навчання, і в моєму випадку не таким складним, оскільки мова була простою.

Я робив це головним чином тому, що хотів використовувати звичайний синтаксис у стилі С для своїх сценаріїв, оскільки всі в колективі були з ним знайомі.

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

З якими ресурсами ви консультувались під час розробки?

Головним моїм ресурсом була ця книга:

введіть тут опис зображення

Мені вдалося навчитися досить з цієї книги, щоб реалізувати:

  • Лексер: що було майже тривіально, використовуючи регулярні вирази, просто використовуючи Regex.Match для ідентифікації та розділення лексем.
  • Рекурсивний синтаксичний аналізатор: в основному одна функція для кожного правила в граматиці та деякі допоміжні методи пошуку та використання лексем. Я надихався на специфікацію граматики C #. Найважче було стосуватися пріоритетів арифметичних та відносин операторів, не вдаючись до нескінченної рекурсії.
  • Інтерпретатор AST: використовуючи шаблон дизайну відвідувачів, я обходив дерево, сформоване з аналізатора, і виконував кожен вузол інструкцій рекурсивно.

Я би там зупинився, бо майже все, що мені було потрібно, вже працював, за винятком однієї речі - дзвінки та поступки на супроводи Unity3D глибоко зсередини рекурсивного перекладача. Щоб вирішити цю проблему, мені довелося позбутися рекурсії і ще раз звернувся до книги. Цього разу я доповнив:

  • Компілятор: інший відвідувач, але замість виконання коду він генерує список невеликих атомних вказівок із кожного вузла AST (тобто простої спеціальної мови складання на основі стеку). Такі операції, як цикл while або умова if, перетворюються на мітки та інструкції goto-type. У цей момент я також записую складений скрипт на диск у вигляді двійкового файлу.
  • Інтерпретатор байт-коду: просто повторюється за рівним списком інструкцій. Без рекурсії тепер було легко інтегруватись із ко-рутинами Unity3D.

Весь процес за нульових знань зайняв близько 2 тижнів, і було дуже весело :)

PS: На завершення я також хотів додати підсвічування синтаксису та інтелігенцію для моєї користувальницької мови на наших інструментах. У цьому плані Сцинтилья була рятувальником життя. Я використовував таку обгортку:

http://scintillanet.codeplex.com/


5

Я бачив це, що пропонується, але більшість poeple пропонують луа, але це, здається, не відповідає моєму типу програмування.

Гаразд, спробуємо це з іншого кута: що з Луа вам не подобається? Це щось, що легко виправити, чи це щось фундаментальне?

Наприклад, скористайтеся такими ключовими словами, як then/do/endпозначення блоку коду, а не хорошими фігурними дужками стилю C / C ++. Якщо це ваша проблема ... це ви можете виправити. Все, що вам потрібно зробити, - це визначити свій власний маленький діалект Луа та написати простий інструмент перетворення, який перетворить ваш фігурний синтаксис фігури у фактичний Луа.

Ви хочете + = в якійсь формі? Це також легко, що можна зробити в системі попередньої обробки. Просто включите заяви форми expr1 += expr2в expr1 = expr1 + expr2.

Зрозуміло, вам доведеться знайти спосіб визначити, чи пара фігурних брекетів являє собою таблицю чи do/endпару. І ви повинні підключити систему попередньої обробки в Lua Переопределелів dofile, loadstringі іншими стандартними функціями бібліотеки Lua. Але в кінцевому підсумку все це можливо.

Якщо такі дрібні проблеми викликають ваше занепокоєння, і ви занадто пов'язані з одним стилем програмування, щоб просто змінити спосіб кодування (зауважте: це, як правило, жахлива якість мати програміста), це набагато більш життєздатна альтернатива, ніж просто написання власної мови. Це б , можливо , пару тижнів максимум . Порівняйте це з роками, які були б витрачені на належну мову, з багатою підтримкою налагодження тощо.

Якщо ваших проблем більше, ніж це (глобальні глобальні за замовчуванням, тому вимагаєте використовувати їх localскрізь), деякими з них можна керувати (просто зробіть оголошення нової глобальної помилки, використовуючи змінені середовища та метадані). Якщо ви ненавидите функції як першокласні предмети, підпрограми, збирання сміття чи інші основні елементи Луа ... ну тоді ви знаходитесь у пеклі власного створення;)

І якщо ви дуже, дуже хочете бути жорстким щодо цього, ви можете написати свою власну мову, яку ви складете в Lua. Таким чином, ви, принаймні, зможете використовувати дуже добре перевірений час роботи Lua, винятковий API Lua та інші основні засоби Lua - все з вашої мови! Lua. Це займе час, але все одно не буде років, які ви витратили б на щось інше.


Мені здається, я міг би просто кодувати функції, якби я використовував Lua. Схоже, я просто переміщую код.
skiperic

1
@skiperic: Я не знаю, що ти маєш на увазі під цим. Чи можете ви навести приклад?
Нікол Болас

Дивіться відповідь Лоран вище.
skiperic

2
@skiperic: Це насправді не пояснює те, що ти хвилюєшся. Ви можете ввести код у Луа? Так. І проблема в ...?
Нікол Болас

1
@BartekBanachewicz: Навіть приймаючи, що це API API, він все ще перевершує багато сценаріїв API, заснованих на C ++. Це єдиний сценарій API, який я б фактично розглядав як використання сировини , без якогось автоматизованого в'яжучого.
Нікол Болас

3

Щоб доповнити інші відповіді, це не є строго бінарним варіантом. В рамках існуючої мови сценаріїв ви також можете створити свій власний доменний_лангваж . Перевагами такого підходу є:

  • Вам насправді не доводиться возитися з офіційними граматиками, парсерами, реалізацією користувальницьких редакторів тощо.
  • Ви отримуєте більшу частину переваг, використовуючи спеціалізовану мову сценаріїв, тобто додаткову абстракцію, характерну для вашої гри.
  • vs. homebrew: користувачі, які ознайомилися з обраною вами мовою сценаріїв, одразу зможуть використовувати ваш DSL.
  • порівняно із звичайною наявною мовою: користувачам, які не знайомі з мовою сценаріїв, знадобляться лише DSL для модифікації вашої гри.

Основний недолік полягає в тому, що ви б розробляли DSL з обмеженнями вашої "базової" мови.


2

Це може мати сенс залежно від механіки вашої гри. Деякі ігри з досить простою механікою можуть використовувати інтерпретовану мову, щоб врятувати себе від надмірно складного кодування Lua / Python, але економія складності може не надто вартувати. Наприклад, в одній з таких інтерактивних романових ігор можна було легко використовувати спеціально написаний сценарій.

Якщо ваша гра включає в себе двигун фізики, різні ігрові компоненти та різну складність персонажів та здібностей, вам обов'язково слід розглянути інші існуючі мови сценаріїв, тому ви не намагаєтеся додавати необхідні функції до своєї власної або виправляти помилки за допомогою це. Хоча Луа, швидше за все, найшвидший, є багато інших, які, можливо, вам сподобаються більше за їх синтаксис, і багато хто з них хвалиться тим, як легко вони інтегруються з C. Python, Ruby та Angelscript - кілька. (Не соромтесь згадувати інших у коментарях)

Якщо ви гарантуєте, що такі мови використовуються лише для "логічного керування" (тобто обробка конкретного випадку зіткнення для певних типів об'єкта, наприклад, вибуховий пістолет, що торкається блоку льоду), продуктивність навряд чи буде проблемою. Звичайно, з іншого боку, якщо ви використовуєте їх для більш рутинного коду (виготовлення користувацького алгоритму перевірки зіткнення, який запускає кожен кадр), швидше за все, це зірве.


1
Lua також є дуже популярною мовою сценаріїв у розробці гри.
Філіп

Так, Луа використовується в усьому світі, але ОП зазначив, що йому це не дуже подобається. Переваги стилю кодування можуть бути важливими.
Katana314

1
" Наприклад, в одній із таких інтерактивних ігор" Роман "можна було б легко скористатися спеціально написаним сценарієм. " Ви, очевидно, не бачили Inform . Дійсно, навіть для текстових пригод немає сенсу складати власну мову.
Нікол Болас

1
@ Katana314: " Переваги стилю кодування можуть бути важливими ". Чесно кажучи, світу було б краще, якби програмісти зійшли з високих коней з приводу "стилю кодування". Усі ми були б кращими програмістами, якби ми перестали думати, що <вставити тут бажану мову> принципово краще, ніж усі інші <тут вставити бажану мову>. Використання мов, які можуть вам не сподобатися в синтаксисі символів будує і допомагає уникнути подібних помилок.
Нікол Болас

1

Я кажу, іди. Після резюме це було б додатковим проявом здібностей. Хоча майте на увазі, спочатку вам потрібна ця здатність. Це буде непросто, це буде досить важко. Існують книги з цього приводу, і онлайн-підручники теж, але в кінцевому рахунку це зводиться до вас і вашого розуміння того, як працює компілятор, і як розбирається і перекладається код.

Зробіть переконання, що ви починаєте просто, часто випробовуйте і тримайтесь за свій ідеал. Але завжди пам’ятайте, LUA є для вас.


1
Я думаю, що тут питання полягає в тому, чи є мета зробити гру чи зробити щось, що добре виглядає в резюме.
Тридус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.