Epic Games 推出 Verse 编程语言,用于 Fortnite 和元宇宙开发
来源标题:The Verse Programming Language
Epic Games 开发了多范式编程语言 Verse,用于在 Unreal Editor for Fortnite 中创建游戏玩法,以及构建元宇宙体验。该语言融合函数式、逻辑式和命令式传统,基于「Just Code」「Just One Language」「Metaverse First」三项原则设计,兼顾初学者学习与长期演进的稳定性。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Verse 是一门多范式编程语言,由 Epic Games 开发,用于在 Unreal Editor for Fortnite 中创建游戏玩法,以及构建元宇宙体验。它融合了函数式、逻辑式和命令式编程传统,与传统编程语言不同,专为长期演进和稳定性而设计。
Verse 建立在三项基本原则之上:
它就是代码:在其他语言中可能需要特殊语法或构造的复杂概念,在 Verse 中都用普通的 Verse 代码表达。没有魔法——一切都由相同的基础构造搭建而成,形成统一且可预测的编程模型。
只有一门语言:相同的语言构造在编译期和运行期都能工作。没有预处理器。你写的就是执行的,无论是在编译期间还是运行时。
元宇宙优先:Verse 是为代码在单一全局模拟——即元宇宙——中运行的未来而设计的。这影响了语言的方方面面,从强大的兼容性保证,到跟踪副作用并确保安全并发执行的效果系统。
- 足够简单,让初学者也能学会,规则一致,特例极少。
- 足够有表现力,能承载复杂的游戏逻辑和分布式系统,具备可扩展到大型代码库的高级特性。
- 足够安全,让不可信代码在共享环境中运行,具备强大的沙箱和效果跟踪。
- 足够快,满足实时游戏和模拟的需求,其实现可以激进地优化纯计算。
- 足够稳定,能够延续数十年,具备强大的向后兼容保证和谨慎的演进策略。
传统编程语言背负着数十年的历史包袱和设计妥协。Verse 从头开始,借鉴过去但不被其束缚。它是为这样的未来而设计的:
准备好了吗?从内置类型开始了解 Verse 的基本数据类型,或直接跳到表达式,看看 Verse 中一切如何计算值。
对于来自其他语言的经验丰富的程序员,失败系统和效果两节重点介绍了 Verse 的一些独特特性。
在 Verse 中,没有语句——一切都是产生值的表达式。这创造了一个可组合的系统,任何代码片段都可以用在期望值的地方。
Scores := array{10, 20, 30}
# 控制流也会产生值
Verdict := if (Scores.Length > 2) then "long" else "short"
Verdict = "long"
# 循环也一样
Doubled := for (Score : Scores) { Score * 2 }
Doubled = array{20, 40, 60}
失败作为控制流
Verse 不使用布尔条件和异常,而是将失败作为主要的控制流机制。表达式可以成功(产生一个值)或失败(不产生值),从而实现自然的控制流模式:
ValidateName(N:string)<computes><decides>:void = N.Length > 0
Greet(N:string):void = Print("Hello, {N}")
Welcome(Name:string):void =
if (ValidateName[Name]): # 方括号:此调用可能失败
Greet(Name) # 圆括号:此调用必须成功
失败章节深入介绍了可失败表达式和失败上下文,控制流则解释了 if 表达式。
Verse 拥有强大的类型系统,能在编译期捕获错误,同时通过类型推断最大限度地减少类型注解的需要。有关类型系统和子类型的更多内容,请参阅类型。
Level := 42 # int,从字面量推断
Names := array{"Ada", "Alan"} # []string,从元素推断
效果跟踪
函数通过 <computes>、<reads>、<writes>、<transacts>、<decides> 和 <suspends> 等说明符声明其副作用。这些效果说明符让人一眼就能看出函数除了计算返回值之外还能做什么:
scoreboard := class:
var Score:int = 0
BonusFor(Streak:int)<computes>:int = Streak * 100 # 无副作用
CurrentScore()<reads>:int = Score # 可读取可变状态
AddPoints(N:int)<transacts>:void = set Score += N # 可读、写、分配
效果章节提供了效果系统的完整细节。
并发是一等特性,具备结构化并发原语,使并发编程安全且可预测。
StartLevel()<suspends>:void =
# 同时运行两者,等待较慢的完成
sync:
LoadTerrain()
LoadTextures()
# 同时运行两者,保留先完成的那个
race:
ReadFromCache()
FetchFromServer()
推测执行
Verse 可以推测性地执行代码,并在执行失败时回滚更改,从而实现灵活的验证和错误处理模式。
wallet := class:
var Gold:int = 100
# 扣除价格,如果导致账户透支则失败
Buy(Price:int)<transacts><decides>:void =
set Gold -= Price
Gold >= 0
Purse := wallet{}
not Purse.Buy[150] # 太贵了,所以整个调用失败……
Purse.Gold = 100 # ……它已经执行的扣除被回滚
Purse.Buy[30]
Purse.Gold = 70
使用实时变量的响应式编程
Verse 通过实时变量提供对响应式编程的一等支持,这些变量在其依赖项变化时自动重新计算,减少了手动事件处理的需要。
var MaxHealth:int = 100
var Damage:int = 0
var live Health:int = MaxHealth - Damage
# 用于事件处理的响应式构造
when(Health < 25):
Log("Low health warning!")
# 每当其读取的变量变化时,Health 会重新计算
set Damage = 20
Health = 80
set MaxHealth = 150
Health = 130
Verse 为在持久虚拟环境中构建交互式体验提供了基础。
以下示例通过构建一个游戏物品栏管理系统来演示关键语言特性,展示 Verse 的构造如何创建健壮、可维护的代码。
# 枚举:类型安全的常量,无样板代码
item_rarity := enum<persistable>:
common
rare
legendary
# 结构体:不可变的值数据,随玩家档案保存和恢复
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。