Chiba Logo CHIBA v0.6.13
CHIBA blog RSS feed
CHIBA / DOCS / LEVEL-1 SPEC

顶层静态值定义

这里集中展示 CHIBA level-1 specification,覆盖 core language、control flow、memory、patterns、IR lowering 与 package system 等实现边界。

The docs surface keeps CHIBA level-1 specification pages browsable inside the site, with direct paths into language, control flow, memory, pattern, and lowering rules.

顶层静态值定义

语法

使用 def 但是不加 () 来创建顶层静态值类型

def PI : f32 = 3.14159265358

#[world_local]
def FILE : Ref[File] = {
    let f = open("/tmp/log", "rw")
    Ref.new(f)
}

// in function will lift to top
def f() = {
    def E : f32 = 2.7
    def EPlusPI : f32 = E + PI
}

顶层 Ref[T] 必须显式写 #[world_local]

所以下面的虽然看起来很危险但是是合法的,因为它明确声明为 world-local global cell:

#[world_local]
def FILE : Ref[File] = {
    let f = open(f, "rw")
    Ref.new(f)
}

不写 #[world_local] 的顶层 Ref[T] 不合法;需要跨 world 共享的可变状态请使用 Atomic,或者在 unsafe 边界中使用 UnsafeRef[T]

顶层 UnsafeRef[T] 是另一条边界:它会被翻译成 static mutable shared handle。语言只承认它是 unsafe shared global,不保证同步、可见性、ordering 或数据竞争安全。

语义

如果顶层静态值类型非静态类型 则会塞入stub并在init的时候codegen初始化行为

普通顶层静态值表示稳定的顶层绑定。

#[world_local] def x: Ref[T] = expr 表示每个 world 拥有一份独立的 Ref[T] cell。它不是 shared global mutable state,也不会把 Ref[T] 变成 send

需要跨 world 共享的可变全局状态必须使用 Atomic;如果需要低级 shared-owned unsafe handle,则使用 UnsafeRef[T] 或后续显式 shared capability。

def x: UnsafeRef[T] = expr 不需要 #[world_local]。它表示全局 static mutable unsafe handle,所有跨 world 访问都必须由用户或库层协议保证同步。它不能被当成 safe shared mutable global。

level-1 支持顶层静态值。

顶层静态值不要求编译期常量初始化;初始化逻辑进入模块或程序的 init 阶段执行。

因此静态值的语义重点是“存在稳定的顶层绑定”,而不是“必须可 constexpr 求值”。

顺序依赖是合法的:

def A: i64 = 1
def B: i64 = A + 1

cycle 一律拒绝:

def X: i64 = Y
def Y: i64 = X

这里的拒绝发生在 module init dependency gate,而不是等运行时递归初始化失败。

顶层值 surface 收敛到 def x: T = exprdef x(): T = expr 是零参数函数,不再作为伪常量写法使用。

Usage

#[world_local]
def stdout_file: Ref[File] = {
    let f = open("/dev/stdout", "w")
    Ref.new(f)
}

def pi: f32 = 3.1415926

def shared_state: UnsafeRef[State] = open_shared_state()

注释:pi 是普通静态值;stdout_file 是 world-local 顶层 Ref,初始化可发生在每个 world 的 init 阶段而非编译期常量折叠。shared_state 是 static mutable unsafe handle;它的同步安全不由语言保证。

边界

module init 必须保留 owner namespace、symbol id、dependency edge 与 init order。backend 可以选择 target-specific 表示,但不能重新根据名字字符串推断 global/init 语义。