Jvav 编程语言
形式的纯粹
功能的纯粹
语义清晰,计算纯粹,副作用显式。
一门仍在设计中的语言。 最初由张浩扬博士提出。
值计算
与副作用。
用 transition 描述一次计算,预览它对状态的影响。先看结果,再决定是否应用。
pure fun move(
entity: transition Entity,
dt: Float
): transition Entity {
val nextVelocity = entity.velocity +
entity.acceleration * dt
return {
position = entity.position +
nextVelocity * dt
velocity = nextVelocity
}
}
在你决定应用变化时val change = move(entity, 1)
transition(entity) = change
下一步,先看清。
预览 move 算出的新位置与速度。决定应用时,实体才会更新。
entitydt = 1
实体当前状态与计算所得的变化
| 字段 | 当前值 | 预览值 |
| position | 10 | — |
| velocity | 3 | — |
| acceleration | 2 | — |
先预览计算结果,实体保持不变。
Jvav 的语言设计
输入确定,
结果确定。
pure 函数只描述一次纯粹的计算。同样的输入与上下文,始终得到同样的结果,不修改外部状态,也不产生可观察的副作用。
一套计算逻辑,可以用于预览、模拟、测试,也可以直接参与实际执行时的决策。
了解纯计算 →pure fun distance(
speed: Float,
time: Float
): Float {
return speed * time
}
输入决定结果。pure 函数只进行计算并返回值,不读取隐藏状态,也不会改变外部世界。
从纯计算开始。
越少的能力,意味着越少需要考虑的状态。
pure 函数只依赖输入并返回结果,因此更容易复用、测试、并行和优化;需要与外部状态交互时使用 const,仍然可以保证 this 不被修改;只有真正需要改变对象时,才使用 mut。如果你不关心,也可以使用 auto,让函数实现决定实际所需的能力。
成员函数对 this 的访问与外部副作用
| 修饰符 | 对 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 计划支持原生代码、.NET 和 JVM 等不同编译目标。你可以根据项目选择运行平台,而不需要因此更换语言、重写核心逻辑,或重新适应另一套语义模型。
pure、访问能力与状态转换等语言特性,会在不同编译目标上保持一致。
了解编译目标规划 →
Jvav纯计算 · 修改能力 · 状态转换
Jvav IR保留语义,分目标编译
- 原生代码
LLVM IR - .NET
CIL (MSIL) - JVM
Bytecode
编译目标规划
Jvav 仍在设计中。成员函数分类的完整规则与多目标后端仍在规划;当前草案中的待定问题继续保留。