Jac Lang与Nura编程语言的对比
2026-10-08 (分类:技术、开源)
前言
2026年,"AI原生编程语言"从一个概念变成了多条真实的代码线。在众多探索者中,Jac Lang 和 Nura 是两条风格迥异的路径:Jac 走的是"全栈一语言、编译器生成胶水"的宏大路线,Nura 走的是"零依赖嵌入式脚本、AI能力即语法"的轻量路线。
本文从设计哲学、语法、AI集成、并发模型、生态工具链等维度做一次客观对比,帮助读者理解两种语言各自的取舍。
一、定位与设计哲学
| 维度 | Jac Lang | Nura |
|---|---|---|
| 定位 | 全栈统一语言(前端+后端+原生+部署) | AI原生嵌入式脚本语言 |
| 实现语言 | Python(编译器)+ Jac 自身(运行时) | C++(零第三方依赖) |
| 类型系统 | 静态类型 + 类型推导 | 动态类型,可选类型标注(纯提示性) |
| 编译目标 | Python字节码 / JavaScript / 原生机器码(LLVM) | 树遍历解释器(eval)/ 字节码虚拟机(vm) |
| 核心范式 | Object-Spatial Programming(对象-空间编程) | 函数式优先 + 5大特殊类(agent/cell/workflow/distributed/dsl) |
| 核心理念 | Synechic(连续性)+ Topokinetic(拓扑运动) | AI能力即语法,特殊类即框架,零依赖可嵌入 |
Jac 的核心主张是消除胶水代码:一个全栈应用的前端、后端、数据模型、API、部署配置,全由一个编译器生成,开发者只写业务逻辑。它的理论根基来自 Jason Mars 的论文,将编程重新定义为"连续的、拓扑运动的"计算模型。
Nura 的核心主张是AI原生即语法,特殊类即框架:agent、cell、workflow、distributed、dsl 五大特殊类是语言级一等公民,各自内建完整的生命周期和运行时。LLM 类直接调用 DeepSeek/OpenAI 真实 API,支持流式输出、工具调用、多轮对话。同时保持零依赖、可嵌入的脚本语言特性,追求最小侵入地嵌入宿主程序。
二、语法对比
2.1 变量与类型
Jac(静态类型,编译器推导):
can add(a: int, b: int) -> int {
return a + b;
}
name: str = "Jac";
items: list[int] = [1, 2, 3];
Nura(动态类型,可选标注):
fun add(a, b) {
return a + b
}
let name = "Nura"
let items = [1, 2, 3]
Jac 的类型系统是编译期强制的,类型错误在 jac check 时就会被捕获。Nura 的类型标注仅为提示性,运行时不做类型校验,更接近 Python/Ruby 的脚本风格。
2.2 面向对象
Jac 使用 node / edge / walker 构成 Object-Spatial Programming:
node Task {
has title: str;
has done: bool = False;
}
walker:pub add_task {
has title: str;
can create with Root entry {
task = Task(title=self.title);
root ++> task;
report {"id": jid(task), "title": task.title};
}
}
Nura 使用传统 class / extends + 五大特殊类(agent/cell/workflow/distributed/dsl):
class Task {
var title = ""
var done = false
fun constructor(t) { this.title = t }
}
agent Brain {
mem memory
model "deepseek-chat"
persona "你是一个智能助手"
node tool search
fun think(query) { ... }
}
workflow DataPipeline {
stage extract { ... }
stage transform { ... }
stage load { ... }
}
关键区别:Jac 的 node / walker 既是数据模型也是 API 端点(:pub 标记自动生成 REST),而 Nura 的 class 是纯数据结构,agent 是带 LLM 能力的智能体实体(内建 think/chat/remember/工具调用),workflow 是内建生命周期的工作流引擎(Pipeline/DagFlow/Swarm/Debate/Hierarchy 五种模式),distributed 是节点调度器,dsl 允许用户自定义领域特定语言——这些都不仅仅是语法糖,而是各自拥有完整运行时的语言级框架。
2.3 控制流
两者都有 if/else/for/while,但细节不同:
- Nura 有独特的
circle/when重试循环(面向 AI 场景),for i=0 i<5 i++C风格循环(空格分隔,非分号) - Jac 更接近 Python 风格,
with entry {}是程序入口
// Nura circle/when 重试循环
mut retries = 0
circle {
retries += 1
let result = call_api()
if result != null { break }
} when retries >= 3 break
// Jac walker 入口
walker check_tasks {
can start with Root entry {
for t in [-->][?:Task] {
if not t.done {
report t.title;
}
}
}
}
三、AI 集成
这是两种语言最核心的共同点,也是最大的分歧点。
Jac:Meaning-Typed Programming
enum Priority { LOW, MEDIUM, HIGH, URGENT }
def assess(ticket: str) -> Priority by llm();
with entry {
print(assess("Checkout is down!"));
// Priority.URGENT
}
Jac 的 by llm() 是编译器级AI集成:编译器根据函数签名和 sem 注解自动构造 prompt,返回类型作为输出 schema 被强制执行。这是 Meaning-Typed Programming 的实现,AI调用是一个类型安全的函数调用。
Nura:AI能力即语法 + 真实LLM调用
agent Assistant {
mem history = []
model "deepseek-chat"
persona "你是一个智能助手"
node tool search
node tool calculate
fun ask(question) {
let result = this.chat(question)
return result
}
}
let answer = Assistant.ask("今天天气如何?")
// 也可以直接使用 LLM 类
let llm = new LLM().with_model("deepseek-chat").with_timeout(30000)
let response = llm.call_full("解释量子纠缠")
print(response.content)
print("消耗 " + str(response.prompt_tokens) + " + " + str(response.completion_tokens) + " tokens")
// 流式输出
http_stream("POST", "https://api.deepseek.com/chat/completions", headers, body, 60000, fun(chunk) {
print(chunk) // 逐 token 输出
})
Nura 的 AI 集成是双层架构:语法层有 agent/<<prompt>>/tensor/stream/task ~> node 等一等公民概念,运行时层有 LLM 类直接调用 DeepSeek/OpenAI 真实 API(通过 http_request_ex / http_stream 内建函数)。当未配置 API Key 时,Agent 自动降级为 echo 模式;配置后即为真实 LLM 调用,支持流式输出、多轮对话、工具调用、token 统计和成本估算。
AI 集成对比
| 维度 | Jac | Nura |
|---|---|---|
| AI调用方式 | by llm() 函数声明式 |
agent.chat() + LLM.call() 双层调用 |
| 类型安全 | 编译期校验返回类型 | 无类型校验(动态类型) |
| Prompt构造 | 编译器自动生成(基于类型签名+sem) |
手写 <<prompt>> 模板 / Prompt 类链式构建 |
| LLM后端 | 真实 LLM(LiteLLM兼容,多供应商) | 真实 LLM(DeepSeek/OpenAI兼容),Mock降级 |
| 流式输出 | 通过 walker report | http_stream() SSE 逐 token 输出 |
| 工具调用 | 编译器生成 schema | ToolRegistry + [call:name] 标记循环 |
| 多智能体 | walker 组合 | Swarm/Debate/Hierarchy/DagFlow 五种协作模式 |
| 张量支持 | 无内建 | tensor 一等公民类型 |
| 工作流 | walker 串联 | workflow 特殊类(Pipeline/DagFlow/Swarm/Debate/Hierarchy) |
| DSL可扩展性 | 无 | dsl 特殊类允许自定义领域语言驱动 AI |
四、并发与分布式
Jac:Walker 是天然的并发单元,jac scale deploy 自动将 walker 部署为微服务。并发是架构级的——编译器和运行时管理。
Nura:提供 chan()/mutex()/spawn() 等并发原语,distributed 特殊类提供节点调度(LEAST_LOADED/ROUND_ROBIN/RANDOM/RESOURCE_AWARE 四种策略),task ~> node 分布式语法。当前分布式为本地模拟(spawn + chan),已有完整 RPC 迁移路线图(5阶段,从本地到真实跨进程通信)。并发是语言级的——开发者手动管理,但特殊类封装了大部分复杂性。
// Nura 分布式节点调度
distributed InferenceCluster {
node gpu_worker tags=["gpu","inference"] max_tasks=4 gpu_count=1
node cpu_worker tags=["cpu","preprocess"] max_tasks=8
schedule LEAST_LOADED
fun infer(data) ~> gpu_worker {
return llm.call(data)
}
}
// Jac 分布式——代码不变,部署方式变
jac run api.jac # 本地单进程
jac scale deploy api.jac # Kubernetes 集群
五、生态与工具链
| 维度 | Jac | Nura |
|---|---|---|
| 生态来源 | PyPI + npm + C 生态(均通过 import 直接使用) | 自有标准库(6大子系统:ai/agent/cell/dsl/dist/workflow,纯Nura实现) |
| 包管理 | jac install(内置pip+npm) |
手动文件路径 import |
| 类型检查 | jac check(内置全项目检查) |
无(动态类型) |
| 格式化 | jac fmt |
无 |
| 测试 | jac test |
手动运行脚本 |
| LSP | jac lsp |
无 |
| MCP | jac mcp(AI编码助手集成) |
无 |
| 部署 | jac scale deploy(K8s) |
手动 |
| 框架 | 内置 Web/REST/UI/持久化 | nura-web/nura-sqlite/nura-ds 模块 |
Jac 的工具链是一个完整开发环境:一个二进制文件替代了 Python解释器、JS运行时、C编译器、包管理器、部署工具。Nura 的工具链更轻量:eval/vm 两个可执行文件,标准库全覆盖但无 IDE 支持;但 Nura 的特殊类体系相当于语言级框架——agent 即 LangChain,workflow 即 Prefect/Airflow,distributed 即 Ray,dsl 即自定义 DSL 引擎,这些都内建于语言而非外部依赖。
六、代码量对比
Jac 的核心卖点是~5x less code,编译器生成胶水层。Nura 的代码量优势来自语法简洁——动态类型省去了大量声明代码。
一个 TODO 应用的对比:
- Jac:1个文件,~100行(前端+后端+持久化+API,编译器生成所有胶水)
- Nura:需要 nura-web 路由 + class 定义 + 手动 API 搭建,
200行(但每行都很直白);如果用120行agent+workflow特殊类,可以缩短到
七、适用场景
选 Jac 如果你需要:
- 全栈应用,前后端统一类型检查
- AI 集成作为核心业务逻辑,编译器保证类型安全
- 自动生成 REST API + Swagger + 持久化
- 从笔记本到 Kubernetes 的无缝部署
- 编译到原生可执行文件 / WebAssembly
- AI 编码助手(MCP 集成)
选 Nura 如果你需要:
- 嵌入宿主 C++ 程序的脚本语言
- 零依赖、最小侵入的运行时
- AI 智能体 + 工作流 + 分布式 + DSL 作为语言一等公民
- 真实 LLM 调用(DeepSeek/OpenAI),流式输出,工具调用
- 多智能体协作模式(Swarm/Debate/Hierarchy/DagFlow)
- 自定义 DSL 驱动 AI 推理
- 张量运算作为一等公民
- 学习编程语言实现(C++代码库清晰可读)
八、总结
Jac 和 Nura 都是"AI原生"的探索,但走了两条几乎相反的路:
| Jac | Nura | |
|---|---|---|
| 方向 | 大一统——一种语言吃掉整个技术栈 | 语言即框架——特殊类内建 AI/工作流/分布式/DSL 运行时 |
| 复杂度 | 高(~190K行编译器,内置CPython/Bun/LLVM) | 低(C++零依赖,eval+vm双引擎,特殊类纯Nura实现) |
| AI成熟度 | 生产级(真实LLM + 编译器类型安全) | 可用级(真实LLM调用 + Mock降级 + 本地分布式模拟) |
| 上手门槛 | 中高(需学习OSP/walker/edge概念) | 低(类Python语法,动态类型) |
| 社区 | GitHub 747 stars,学术背景 | Gitee,个人项目 |
一句话总结:Jac 是面向"AI时代的Java"——全栈、编译检查、生产就绪;Nura 是面向"AI时代的Lua+LangChain"——嵌入式、轻量、语言即框架。两者不是竞争关系,而是对"AI应该怎么融入编程语言"这一问题的两种回答:Jac 让编译器替你做,Nura 让特殊类替你做。
Nura 开源地址:https://gitee.com/somoe-net/nura
Jac 开源地址:https://github.com/Jaseci-Labs/jac