跳转到内容
查看源码

简介

Entelechy 是一个用 Rust 写成的运行时,口号是 Software that becomes, while it runs——软件在运行中生长。在 Entelechy 里,程序不是编译好再发布的成品:AI(或人)编写“定律”(Kernel),组合“结构”(Graph),并且在世界持续运行的同时修改这两者。

Host 是世界。 Kernel 是定律。 Graph 是结构。 AI 是创造者。

角色 是什么 在仓库里
Host 世界本身:内存、设备、时间、预算。它保持小而稳定,不知道“手柄”“光照”“魔方”这些领域概念。 crates/core/host
Kernel 一个小的类型化函数 Y = K(X, P, C),用 .ent 语言编写,只能通过它声明并被授予的能力接触机器。 crates/core/kernel、crates/frontend/*
Graph 用 .esn 场景按稳定 id(如 image.grayscale@1)组合 Kernel,连接它们的类型化端口。Kernel 负责计算,Graph 负责关系。 crates/core/graph、crates/frontend/scene
AI 通过一个开放协议创作:stdin/stdout、socket、WebSocket 或 C 函数上的 JSON lines。任何模型、任何语言,权限规则都一样。 crates/interface/protocol
  1. 一条定律。 写一个 Kernel:

    kernels/grayscale.ent
    kernel image.grayscale@1 {
    requires { field.read; field.write; }
    input source: Image;
    param amount: Float = 1.0;
    output result: Image;
    fn luma(c: Vec4) -> Float {
    return dot(c.rgb, vec3(0.2126, 0.7152, 0.0722));
    }
    compute {
    let c = sample(source);
    let g = luma(c);
    return mix(c, vec4(g, g, g, c.a), amount);
    }
    }
  2. 一个结构。 用场景把 Kernel 连起来:

    scene.esn
    use "kernels/";
    node source: image.gradient@1 { domain = vec2(128, 128); }
    node gray: image.grayscale@1 { source <- source.result; amount = 1.0; }
    node blocks: image.pixelate@1 { source <- gray.result; size = 8; }
    output result <- blocks.result;
  3. 运行中的改动。 修改任意一个文件,新版本会在旁边被编译、校验、准备,然后在下一帧整体换入。错误的改动会在 文件:行:列 处被拒绝,世界照旧运行。

图片、声音、几何、骨骼动画和游戏状态都是同一种资源:类型化的 Field。每个 Kernel 都降级到同一种与后端无关的 IR,可以由参考解释器、JIT(通过 Cranelift 生成本机代码,或生成 WebAssembly)以及 GPU(通过 wgpu 运行 WGSL)执行。解释器是参考实现;JIT 与它逐位一致。

仓库里的示例覆盖了路径追踪、光线步进、百万粒子、Navier–Stokes 烟雾、刚体物理、波函数坍缩、梯度下降训练的神经网络、合成器与 MIDI、glTF / Blender 骨骼、俄罗斯方块和贪吃蛇、体素编辑器、CHIP-8 解释器和 ARM Thumb 核心——全部由 .ent Kernel 和 .esn 场景写成,没有一行 Rust,每一个都有回放测试。

路径追踪示例

  • 权限是授予的。 Kernel 以运行会话的人授予的能力运行;文件只在允许的目录中读写。
  • 每次改动先校验。 Kernel 或场景在替换任何东西之前都会被编译和检查;发布是原子的,并且会核对 Agent 上次看到的代数。
  • 只有正确时才提交状态。 一帧的状态与文件写入只在整个求值成功时提交。
  • 世界可观察。 任意端口可读、任意元素可追踪、任意节点可计时;一次运行就是一次回放,一次回放就是一个测试。
  • 第一次接触:从安装开始,然后跟着分步教程走一遍。
  • 想系统了解语言与运行时:阅读手册。
  • 查某个类型、内置函数、协议操作、包或 crate:查类参考,那里的页面都由源码自动生成。