语言设计
把意图,
写进语言。
计算依赖什么,可以修改什么,会产生什么副作用。Jvav 让这些意图成为语言语义,供程序员表达,也供编译器理解。
先看结果。
再让它发生。
transition 描述一次针对状态的计算,让计算的结果可以被预览。移动到哪里、速度变成多少,都可以先算清楚。
同一次计算可用于预览、模拟与实际更新。应用结果是显式的操作:这一步才改变目标状态。
试试移动计算val result = move(entity, 1)
transition(entity) = result第一行得到计算结果,第二行将它应用到实体。预览时,当前状态保持原样。
输入确定,
结果确定。
pure 函数只描述一次纯粹的计算。同样的输入与上下文,始终得到同样的结果,不修改外部状态,也不产生可观察的副作用。
一套计算逻辑,可以用于预览、模拟、测试,也可以直接参与实际执行时的决策。
pure fun distance(
speed: Float,
time: Float
): Float {
return speed * time
}输入决定结果。pure 函数只进行计算并返回值,不读取隐藏状态,也不会改变外部世界。
在保持可观察行为的前提下,纯计算可以被重排、复用、合并或消除;依赖允许时,也可以并行执行。具体优化仍须遵守数值、失败和终止行为等语义约束。
从纯计算开始。
越少的能力,意味着越少需要考虑的状态。
pure 函数只依赖输入并返回结果,因此更容易复用、测试、并行和优化;需要与外部状态交互时使用 const,仍然可以保证 this 不被修改;只有真正需要改变对象时,才使用 mut。如果你不关心,也可以使用 auto,让函数实现决定实际所需的能力。
| 修饰符 | 对 this | 外部副作用 |
|---|---|---|
pure | 只读 | 无 |
const | 只读 | 允许 |
mut | 可修改 | 允许 |
auto | 由实现确定 | 由实现确定 |
计算返回值
pure fun doubled(): Int {
return value * 2
}
doubled 读取当前值,返回它的两倍。只进行计算,不修改对象,也不产生外部副作用。
输出当前值
const fun report() {
println(value)
}
report 需要产生输出,但不需要修改当前对象,因此只获得它所需要的能力。
重置对象状态
mut fun reset() {
value = 0
}
reset 将当前对象的 value 归零。需要改变对象时,用 mut 明确表达修改能力。
由实现确定能力
auto fun next(): Int {
return value + 1
}
next 只读取 value 并返回结果,因此可被推导为 pure。实际所需的能力由编译器根据实现判断。
这是 Jvav 的成员函数设计方向。const / auto 等分类的完整推导与组合规则尚未纳入当前规范草案;成员函数上的 mut 与参数类型中的 mut T 也需要分别理解。
编译目标 · 规划中
一份代码,
面向不同运行时。
Jvav 计划支持原生代码、.NET 和 JVM 等不同编译目标。你可以根据项目选择运行平台,而不需要因此更换语言、重写核心逻辑,或重新适应另一套语义模型。
pure、访问能力与状态转换等语言特性,会在不同编译目标上保持一致。
Jvav IR保留语义,分目标编译- 原生代码
LLVM IR - .NET
CIL (MSIL) - JVM
Bytecode
编译目标仍在规划中。这些方向不表示相应后端已可用,也不承诺各平台具有相同的对象布局或可以直接互操作。
每个承诺,都有语义依据。
在规范草案中阅读已经确定的规则、示例,以及仍待决定的问题。
阅读语言规范