Verse - язык программирования метавселенных от Epic Games

Начнем с того, что слово «метавселенная» сейчас антоним к слову «хайп». Хотелось бы сразу откреститься от этого неудачного термина и положить эту страшную приблуду в одну помойку с NFT. Но, чем больше я изучал этот язык, тем больше я понимал, что он действительно разрабатывался для метавселенных, и кажется, только Epic Games действительно имеет серьезное представление о том, как метавселенная должна работать, хотя бы с инженерной точки зрения.

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

Часть Первая.

Все мы слышали о Roblox – это своего рода песочница на стереоидах, где можно создать игру практически любого жанра, выложить ее в общий магазин и начать зарабатывать миллионы на том, как школьники со всего мира, с любого устройства, собирают монеты в очередном ранере.

Roblox не единственный, прямую конкуренцию ему пытался составить Manticore Games со своим Core. Последний хотел браться графикой — в основе Core лежит UE4. Более того, в один момент можно было подумать, что Core будет получать поддержку от Epic Games, т. к. он залетел в EGS в ранний доступ. Сейчас Roblox имеет огромный успех и аудиторию, а вот Core стагнирует, новые популярные игры в нем не появляются, а игроков очень мало (как и творцов). Еще может кто-то вспомнить «метавселенную» от Цукерберга, но Марк, кажется, выбрал другую бизнес-модель и его видение сильно отличается.

Fortnite Creative первой версии пытался занять часть ниши Roblox, но редактор был слишком ограничен, ведь там предлагалось делать все с помощью сигналов и устройств. Что неудивительно, Roblox дает богатое API и позволяет его дергать с помощью LUA – простого и при этом мощного языка, который по праву являлся отраслевым стандартом как скриптовый язык (Core, кстати, тоже использует LUA). Возможности устройств и сигналов недостаточны, чтобы сравниться с конкурентами, например, Dreams, который без всяких языков программирования является функционально богаче. В итоге, Fortnite Creative нуждался в новом способе, чтобы дать богатые возможности для творчества, и недавно Epic сделала первый шаг

Часть 2.0

На выставке GDC 2023 Epic Games представили UE 5.2 и UEFN, а также Fortnite Creative 2.0. Разработчикам предоставили урезанную версию редактора Unreal Engine и возможность создания собственных устройств с помощью нового языка программирования Verse. Те, кто знакомы с разработкой на Unreal Engine, знают, что для описания игровой логики движок предлагает два варианта: C++ и Blueprints. Verse, в свою очередь, может стать третьим вариантом, и для тестирования этой гипотезы компания предложила его в качестве основного способа описания логики в Fortnite Creative.

Чем же примечателен Verse? Во-первых, тем, что один из разработчиков, Саймон Пейтон-Джонс, приложил руку к созданию Haskell, любимого языка адептов функционального программирования. Помимо него, в разработке участвуют другие выдающиеся ученые и сам Тим Суини. Команда там собралась мощная, а научная основа языка — предмет отдельной статьи (которую я, в силу своей тупости, не способен написать).

Во-вторых, этот язык буквально ставит в ступор. Он одновременно похож на множество других языков и безумно отличается от всех. Настолько, что тема на форуме, посвященном творческому режиму Fortnite, с жалобами на язык — самая горячая. Люди не понимают этот язык, простые вещи, которые должны легко даваться любому опытному программисту, здесь делаются сложно. Язык вводит непривычные для большинства разработчиков игр понятия, такие как, например, failure context, effects и query operator. У него самый отвратительный и неудобный code style: типы здесь выполнены в snake_case, а названия методов и переменных в PascalCase.

Ну и в-третьих, как в следствие первых двух, язык действительно придуман для метавселенных. В этом языке богатый синтаксис для работы с системами, которые будут развернуты на сотнях и тысячах серверов, причем код, который будет выполняться, будет написан бесчисленным множеством независимых разработчиков. Разработчики Verse заверяют, что язык производительный и безопасный. В целом, этот язык, как Haskell, должен следовать принципу: «Если это скомпилировалось, это будет работать» (я бы добавил от себя, что необязательно правильно, но в рантайме не упадет точно).

Часть третья

Здесь давайте взглянем на язык ближе, я не буду писать полный гайд, референс к языку можно по ссылке:

Просто взглянем на некоторые интересные концепции.
Переменные. Переменные в Verse, по умолчанию, иммутабельны. Если мы хотим, чтобы переменную можно было изменять, это нужно объявить явно с помощью ключевого слова «var».

MaxHealth := 10 # := это оператор инициализации переменной. Привычный "=" используется в двух случаях: # Для "присваивания" и "сравнения", о последнем позже var CurrentHealth : int = MaxHealth # Заметьте, тут еще нужно и явно указать тип, после двоеточия set CurrentHealth = 1 # тут мы явно указываем, что присваиваем новое значение для переменной

Пока не так страшно правда? Подобное можно было увидеть например в Elixir да и вообще иммутабельность не в новинку для функциональных языков.
Failure Context. Вот тут становится интересно

if (KillerAgent := Elimination.EliminatingCharacter?.GetAgent[]) { ScoreManager.SetScoreAward(50) ScoreManager.Activate(KillerAgent) }

Что делает этот код? В привычных языках программирования, таких как C# или JS, в условие мы помещаем что-то, что в итоге даст нам булевый тип — True или False. В Verse все сильно иначе. В условия помещаются выражения, которые могут увенчаться успехом или провалом, это и называется «Failure Context». В этом коде, выражение дважды может провалиться: в первый раз, когда EliminatingCharacter не будет существовать, знак вопроса свидетельствует о том, что это поле опционально. Во второй раз, когда мы вызовем метод GetAgent[], квадратные скобки в вызове метода говорят о том, что метод может провалиться. И все же, если у нас все получилось, мы выдаем агенту-убийце 50 очков.
Что же тогда с обычными True и False, они вообще есть в этом языке? Да, существует такой тип как logic и его даже можно использовать в условиях, но не так как мы привыкли.

IsTrue := true if (IsTrue?): # В питоньем стиле тоже можно Print("True")

Здесь появляется так называемый «query» оператор. «Query» выражение использует знак вопроса, чтобы сделать успешным выражение, которое дает «True», и завалить его, если оно «False». Например, для сравнения тоже полезно думать как об успешном и неуспешном результате. Таким образом, оператор «=» провалит выражение, если операнды слева и справа не равны.

«Failure Context» — это, как мне кажется, главнейшая концепция в языке, на ней построено все. Нужно достать значение из карты по ключу? Такая операция может провалится, а значит, должна быть помещена в блок «if». По мимо «if», циклы тоже могут содержать «failable» выражения, например, так: мы получим массив чисел от -5 до 5, исключая 0.

NoZero := for (Number := -5..5, Number <> 0): # != почему не так? Хороший вопрос Number # как видите return не обязателен, но с ним тоже можно

В целом советую почитать про Failure Context и перестроить голову, чтобы потом было удобно понимать код на Verse, возможности это дает удивительные, но требуется опыт.

Продолжение следует?

Тут я пожалуй и сделаю паузу. Я не рассказал про эффекты и про то, как написать метод который может быть завален. Еще не рассказал про систему типов и не отругал на чем свет стоит, API которую дают эпики в Fortnite Creative из-за которой Roblox и Core все еще гибче, планирую это сделать в следущей части.
Расскажите, интересно ли вам читать про Verse или про метавселенные типа Roblox?

155155
54 комментария

Бога ради, просто продолжай. Возможно, это не принесет тебе 100500 лайков, но это контент, который необходим.

35
Ответить

Так и не понял зачем этот язык, если есть lua

6
Ответить

Я постараюсь дать ответ на этот вопрос в следующем посте, сейчас я просто хотел только немного рассказать о языке

11
Ответить

Lua не напомнит о том, что осталось 10 месяцев до 90-летия Никлауса Вирта.

2
Ответить

Они свой UnrealScript прибили в зародыше и перебрались на C, а тут такое родили.

1
Ответить

Это прям какая-то смесь Go + JS(optional chaining)

6
Ответить

Присваивание как в паскале это какой-то гениальный мув для максимального неудобства программирования

7
Ответить