Jvav 编程语言

形式的纯粹
功能的纯粹

语义清晰,计算纯粹,副作用显式。

一门仍在设计中的语言。 最初由张浩扬博士提出。

值计算
与副作用。

用 transition 描述一次计算,预览它对状态的影响。先看结果,再决定是否应用。

move.jvav
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
实体当前状态与计算所得的变化
字段当前值预览值
position10
velocity3
acceleration2

先预览计算结果,实体保持不变。

根据规范草案设计的语义示例。状态转换 · §12 (PDF,在新标签页打开)

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
  • .NETCIL (MSIL)
  • JVMBytecode
编译目标规划

Jvav 仍在设计中。成员函数分类的完整规则与多目标后端仍在规划;当前草案中的待定问题继续保留。

Jvav
语言规范。

了解 Jvav 的语法、类型与求值规则。草案通过精确定义和示例,说明值、副作用与状态转换的行为。

阅读草案 (PDF,在新标签页打开)下载 PDF 浏览规范目录
规范草案Jvav
语言规范
语法 · 类型 · 语义PDF · 英文 51 页