nanolang

GitHub
586 21 较难 1 次阅读 4天前Apache-2.0开发框架语言模型
AI 解读 由 AI 自动生成,仅供参考

nanolang 是一门专为代码大模型(LLM)生成而设计的微型实验性编程语言,同时也兼顾人类的可读性。它旨在解决 AI 生成代码时常见的语法歧义、缺乏形式化验证以及测试缺失等痛点,确保机器编写的程序既安全又可靠。

这款语言非常适合编程语言研究人员、关注 AI 辅助开发的工程师以及对形式化方法感兴趣的技术极客使用。nanolang 的核心亮点在于其语义已通过 Coq 工具进行了零公设的机械证明,从数学层面保证了类型安全和确定性。它强制要求开发者为每个函数编写"shadow"测试块,否则拒绝编译,从而将测试驱动开发融入语言基因。

在技术特性上,nanolang 支持多目标编译,可转译为 C 语言以获得原生性能,也能输出 WebAssembly、LLVM IR 甚至 CUDA 代码。它内置了名为 NanoISA 的栈式虚拟机,能隔离危险的外部调用以增强安全性。此外,它还具备自动内存管理(引用计数)、代数效应、异步编程支持以及前缀与中缀混合表示法等功能,并提供了完善的 VS Code 扩展和网页试玩环境,让探索新型编程范式变得简单有趣。

使用场景

某嵌入式安全团队正在为物联网网关开发高可靠性的固件逻辑,需同时满足机器自动生成代码与人工审计的双重标准。

没有 nanolang 时

  • 测试遗漏风险高:开发人员常因赶进度忘记编写单元测试,导致边界条件错误流入生产环境。
  • 内存管理易出错:在 C 语言中手动管理内存极易引发泄漏或越界访问,调试耗时且难以复现。
  • 形式化验证缺失:核心逻辑缺乏数学层面的正确性证明,面对安全审计时只能依赖经验而非确凿证据。
  • LLM 生成代码不可控:大模型生成的代码语法模糊、风格不一,人工清洗和修正成本极高。

使用 nanolang 后

  • 强制测试机制:nanolang 拒绝编译未附带 shadow 测试块的函数,从源头杜绝了无测试代码上线。
  • 零开销自动内存管理:利用 ARC 机制自动处理资源释放,彻底消除了手动 free() 带来的安全隐患。
  • 内核语义形式化证明:基于 Coq 的零公理证明体系为类型安全和确定性提供了数学级背书,轻松通过严苛审计。
  • 专为 LLM 设计的语法:无歧义的前缀/中缀双记法让大模型能精准生成可执行代码,大幅降低人工修正工作量。

nanolang 通过强制测试、形式化验证及机器友好的语法设计,将固件开发从“依赖人工细心”升级为“数学保证可靠”。

运行环境要求

操作系统
  • Linux (Ubuntu 22.04+)
  • macOS 14+ (Apple Silicon)
  • FreeBSD
  • Windows (仅限 WSL2)
GPU
  • 非必需
  • 支持通过 --target ptx 编译为 CUDA PTX 代码,但未指定具体的显卡型号、显存或 CUDA 版本要求
内存

未说明

依赖
notes该工具主要使用 C/C++ 构建,不依赖 Python。核心功能包括转译为 C 语言、自定义虚拟机 (NanoISA) 以及形式化验证(需单独安装 Rocq Prover)。Windows 用户需通过 WSL2 运行。若需运行图形界面示例,需安装 SDL2 库。
python不需要
C 编译器 (用于构建和 C 后端)
Make / GMake (BSD 用户)
Rocq Prover (Coq) >= 9.0 (仅用于形式化验证)
SDL2 (仅用于运行示例启动器)
Git
nanolang hero image

快速开始

NanoLang

CI License Bootstrap

我是一种极简的编程语言,专为机器编写、人类阅读而设计。我要求必须编写测试,采用无歧义的语法,并且核心语义经过形式化证明。

当你需要原生性能时,我可以编译成 C 语言;同时,我也提供自己的虚拟机 NanoISA,它将危险的外部调用隔离在独立进程中。我的核心语义使用 Coq 工具,在零公理的基础上进行了机械化证明。

文档

用户指南 - 我提供了一个包含可运行示例的教程,建议你从这里开始。

其他资源:

快速开始

# 克隆并构建
git clone https://github.com/jordanhubbard/nanolang.git
cd nanolang
make build

# 创建 hello.nano
cat > hello.nano << 'EOF'
fn greet(name: string) -> string {
    return (+ "Hello, " name)
}

shadow greet {
    assert (== (greet "World") "Hello, World")
}

fn main() -> int {
    (println (greet "World"))
    return 0
}

shadow main { assert true }
EOF

# 编译并运行
./bin/nanoc hello.nano -o hello
./hello

BSD 用户: 请使用 gmake 代替 make

我的特点

  • 形式化证明的语义 - 我已在 Coq 中证明了类型安全性、进展性、确定性和语义等价性,且未使用任何公理。
  • NanoISA 虚拟机 - 我内置一个基于栈的虚拟机,拥有 178 条指令。它可以将 FFI 调用隔离到子进程中,并能以守护进程方式运行。
  • 自动引用计数内存管理(ARC) - 我使用零开销的引用计数机制,无需手动调用 free()
  • 机器主导的优化 - 我会自我剖析并在自动化循环中应用优化策略。此外,在代码生成之前,我还会对抽象语法树进行常量折叠和死代码消除。
  • 多目标编译 - 我可以编译成 C 语言以获得原生性能,也可以输出 WebAssembly (--target wasm)、LLVM IR (--target llvm)、PTX/CUDA (--target ptx) 或 RISC-V 汇编 (--target riscv)。每个 WASM 输出都会附带 source map 文件,并可用 Ed25519 签名。
  • 代数效应 - 我支持带有类型、可恢复的效应,通过 effectperformhandle 实现。副作用是显式的,并且可以组合使用。
  • 异步/等待 - 我会在编译时将 async fnawait 降级为 CPS 状态机。
  • 双重记法 - 我既支持前缀表示法 (+ a b),也支持中缀表示法 a + b。我的前缀调用是无歧义的。
  • 丰富的模式匹配 - 我支持匹配守卫(Ok(v) if v > 0 =>)、或模式(| A | B =>)、通配符 _,以及穷尽性检查。
  • 强制测试 - 如果没有为函数提供 shadow 测试块,我将拒绝编译该函数。
  • 类型推断 - 我使用 Hindley-Milner 类型推断算法。当类型明确时,显式注解是可选的(例如 let x = 42)。
  • F 字符串和管道操作符 - 我支持 f"Hello, {name}!" 字符串插值,以及 x |> f |> g 管道语法。
  • C 互操作性 - 我通过模块与 C 语言通信。为了保护自身,我可以将这些调用隔离到独立进程中。
  • VS Code 扩展 - 我提供语言服务器、调试适配器协议服务器,以及打包好的 .vsix 扩展,支持语义高亮、保存时格式化和任务集成。
  • Web 演示平台 - 我内置了一个基于浏览器的 CodeMirror 6 编辑器,支持分享永久链接和实时评估。

语言概览

# 变量 — 默认不可变,类型注解在可推断时可省略
let x: int = 42
let y = "hello"            # 类型被推断为 string
let mut counter: int = 0

# 函数必须附带 shadow 测试
fn add(a: int, b: int) -> int {
    return (+ a b)
}

shadow add {
    assert (== (add 2 3) 5)
}

# F 字符串插值
let msg = f"Result: {(add 2 3)}"

# 管道运算符
let result = 5 |> add 3 |> double   # 等价于 double(add(3, 5))

# 控制流
if (> x 0) {
    (println "positive")
}

# 带有守卫和或模式的模式匹配
union Shape { Circle { r: float }, Square { side: float }, Point {} }
match shape {
    Circle(c) if c.r > 0.0 => (println "circle"),
    | Square(_) | Point(_) => (println "other")
}

# 结构体、枚举和泛型类型
struct Point { x: int, y: int }
enum Status { Pending = 0, Active = 1 }
let numbers: List<int> = (List_int_new)
(List_int_push numbers 42)

# 代数效应
effect Log { log : string -> void }
handle (perform Log.log "hi") with {
    Log.log(msg) -> { (println msg) }
}

# 并行绑定提示
par-let a = (compute_x)  b = (compute_y)  in (println (+ a b))

NanoISA 虚拟机

我提供了一种替代 C 语言编译的虚拟机方案。

# 编译为 NanoISA 字节码并运行
./bin/nano_virt hello.nano --run

# 编译为原生二进制文件(嵌入 VM 和字节码)
./bin/nano_virt hello.nano -o hello

# 输出原始 .nvm 字节码,然后单独执行
./bin/nano_virt hello.nano --emit-nvm -o hello.nvm
./bin/nano_vm hello.nvm

# 使用 FFI 隔离运行(外部调用在独立进程中)
./bin/nano_vm --isolate-ffi hello.nvm

架构:

  • 178 条指令 - 我采用混合指令集的栈式架构。
  • 子进程 FFI (nano_cop) - 我将外部调用运行在独立进程中。即使它们崩溃,我的主程序仍能继续运行。
  • VM 守护进程 (nano_vmd) - 我可以作为持久化进程运行,以便更快启动。
  • 陷阱模型 - 我将计算与 I/O 分离,这为未来的硬件加速提供了可能。
  • 引用计数垃圾回收 - 我以确定性的方式管理内存。当资源超出作用域时,我会释放它们。

我在 docs/NANOISA.md 中详细记录了我的完整架构。

形式化验证

我称之为 NanoCore 的核心语义已在 Coq 中得到机械化证明,且未使用任何公理。

  • 类型安全性 - 我已证明类型正确的程序不会陷入僵局。
  • 确定性 - 我已证明求值过程只会产生一个结果。
  • 语义等价性 - 我已证明我的大步骤语义和小步骤语义是一致的。

我证明的部分涵盖了整数、布尔值、字符串、数组、记录、变体、模式匹配、闭包、递归和可变变量。更多细节请参阅 formal/README.md

cd formal/ && make    # 构建所有证明(需 Rocq Prover >= 9.0)

IDE与调试器支持

我提供了一个语言服务器(bin/nanolang-lsp)和一个调试适配器(bin/nanolang-dap),用于IDE集成。

make lsp   # 构建 bin/nanolang-lsp  (悬停提示、跳转到定义、补全、诊断)
make dap   # 构建 bin/nanolang-dap  (断点、单步执行、变量检查)

editors/vscode/ 目录下提供了一个VS Code扩展,它可以自动连接LSP和DAP服务器。

# 编译为原生C代码(默认)
./bin/nanoc program.nano -o program

# 编译为WebAssembly(生成 program.wasm 和 program.wasm.map 源映射文件)
./bin/nanoc program.nano --target wasm -o program.wasm

# 其他后端
./bin/nanoc program.nano --target llvm  -o program.ll   # LLVM IR
./bin/nanoc program.nano --target ptx   -o program.ptx  # CUDA PTX
./bin/nanoc program.nano --target riscv -o program.s    # RISC-V汇编

# 对WASM模块进行签名和验证
./bin/nanoc sign   program.wasm   # 使用 ~/.nanoc/signing.key 进行签名
./bin/nanoc verify program.wasm   # 验证嵌入的Ed25519签名

# 从三斜杠注释中导出文档
./bin/nanoc program.nano --doc-md -o program.md

构建与测试

make build          # 构建我的编译器(bin/nanoc)
make lsp            # 构建我的语言服务器(bin/nanolang-lsp)
make dap            # 构建我的调试器(bin/nanolang-dap)
make vm             # 构建我的虚拟机后端(bin/nano_virt、bin/nano_vm、bin/nano_cop、bin/nano_vmd)
make test           # 运行我的完整测试套件
make test-vm        # 通过NanoVM后端运行我的测试
make test-quick     # 运行我的快速语言测试
make examples       # 构建我的示例程序

示例与交互式工具

Web Playground(推荐用于学习我的语法):

./bin/nanoc examples/playground/playground_server.nano -o bin/playground
./bin/playground  # 打开 http://localhost:8080

示例浏览器(需要SDL2):

cd examples && make launcher

单个示例:

./bin/nanoc examples/language/nl_fibonacci.nano -o fib && ./fib

我的游戏和演示程序已分类整理在 examples/README.md 中。

平台支持

我完全支持以下平台:

  • Ubuntu 22.04及以上版本(x86_64、ARM64)
  • macOS 14及以上版本(Apple Silicon)
  • FreeBSD

Windows: 您可以通过WSL2配合Ubuntu来使用我。

用于LLM训练

我被设计为由机器编写。

  • MEMORY.md - 我的模式和惯用法训练参考。
  • spec.json - 我的正式规范,以机器可读格式呈现。

贡献说明

对于希望参与贡献的开发者,我在 CONTRIBUTING.md 中提供了相关指南。

许可证

我采用Apache License 2.0许可协议发布。详情请参阅 LICENSE

NanoLang的真实且毫不夸张的历史

乔丹·哈巴德与雷金纳德·冯·弗拉芬顿三世爵士的持续冒险

连载中的第3部分。← 第2部分:sheme | 第4部分:Aviation → 雷金纳德·冯·弗拉芬顿三世爵士贯穿始终。他并不认可其中任何内容。

此时,这位程序员已经用Bash编写了一个文本编辑器和一个Scheme解释器,并逐渐习惯了那些按理说根本不应该存在的东西。他正坐在书桌前——雷金纳德·冯·弗拉芬顿三世爵士则占据着他最爱的位置:整个键盘——这时,程序员突然冒出一个他自称是“念头”的想法,而雷金纳德爵士则通过强硬地无视它,将其归类为“求救信号”。

“问题在于,”程序员对着房间、对着雷金纳德爵士、也对着他打开的关于形式验证的十七个浏览器标签页说道,“所有我使用的语言都存在歧义。你写f(x),没人知道这是函数调用还是乘法;你写1 + 2 * 3,居然还会引发争议!更别提那些该被定性为战争罪行的隐式类型转换了。”

雷金纳德眨了眨眼。他以前也听过类似的话。通常,这些话最后都会以某个项目提交到代码库告终。

“我需要一种能由机器编写的语言,”程序员继续说道,“一种没有任何歧义、必须通过测试、并且能够被形式化证明其正确性的语言。”他停顿了一下,脸上浮现出一种仿佛刚刚在现实中找到漏洞的表情。“既然这样的语言并不存在,那我就自己造一个。”

雷金纳德缓缓地、刻意地把一支笔推下了桌面,完全清楚这一举动意味着什么。

接下来发生的一切,后来被程序员称为“必要的”,而雷金纳德则把它归入了“又来了”一类。他们设计了一套语法,无需任何参数就能区分前缀和中缀运算;还制定了一套类型系统,其精确度之高,简直堪比桥梁建造的标准。随后,一台拥有178条指令的操作虚拟机诞生了——程序员称其为“极简”,但数字178却暗示着事实恰恰相反。

“它还需要形式化证明,”程序员在大约第四周时说道,“用Coq来完成,而且不能有任何公理。”

一直趴在形式化规范文档上打盹的雷金纳德,稍微挪动了一下身子,把有关语义等价性的那一节盖了个严实。他早就明白,只要自己赖在那些关键文件上不动,进度就会被拖慢;不过他也清楚,这并不能真正阻止进展,只会让它变得有点湿漉漉罢了。

强制性的测试模块——每定义一个函数就必须配套的“shadow”函数,否则编译器绝不允许继续——之所以加入,是因为程序员如他自己所言:“受够了那些写完就从未测试过、结果也就永远没机会被测试的代码。”当有人问起为何要给测试模块取这样一个奇怪的名字时,程序员回答说:“这个名字很有意境。”至于雷金纳德爵士,则对此不置一词。在他看来,关键字什么的,对买到金枪鱼来说根本无关紧要。

最终,这种语言被命名为NanoLang。它的“极简”程度,就像瑞士手表一样:每个部件都不可或缺,整体尺寸小得超乎想象,而要解释它到底是怎么工作的,所需的时间却远远超过了大多数人的承受范围。

此外,NanoLang还拥有了自己的“声音”。程序员在审阅README文件时注意到,语言在描述自身特性时竟然使用第一人称:“这是因为它本来就是为机器而设计的,机器理应能在不产生歧义的情况下读懂它的文档。”这个说法倒也合情合理,只是听起来仍让人有些毛骨悚然。

雷金纳德从键盘上踱步而过,十四位字符被追加到了类型规范中。后来人们才发现,那串字符原来是jjjjjjjjjkkkk,于是便将其移除了。

形式化证明顺利通过,虚拟机运行正常,编译器甚至成功完成了自编译。程序员久久凝视着这一切,就像凝视着自己亲手做出却真的能运转的东西一样,心中涌起一种特殊的自豪感——这种自豪并非源于优雅,而是源自任务的圆满完成。

“搞定了,”他说。

雷金纳德把桌上的咖啡杯碰翻了——当然不是出于恶意,而是出于一种原则性的拒绝,不愿让程序员独享这份毫无争议的成功时刻。

截至本文撰写之时,NanoLang仅被一个人用于生产环境,而这个人也正是它的作者。雷金纳德爵士依旧对这四个项目一概不予背书,理由包括“程序上的顾虑”、“金枪鱼供应不足”、“弥漫着的狂妄气氛”,以及最近提出的“航空事业”。

版本历史

v3.3.52026/04/02
v3.3.42026/04/02
v3.3.32026/03/28
v3.3.22026/03/28
v3.3.12026/03/27
v3.3.02026/03/22
v3.1.122026/03/07
v3.1.112026/03/05
v3.1.102026/03/02
v3.1.92026/03/02
v3.1.82026/03/02
v3.1.72026/03/02
v3.1.62026/02/25
v3.1.52026/02/24
v3.1.42026/02/24
v3.1.32026/02/24
v3.1.22026/02/23
v3.1.12026/02/23
v3.1.02026/02/20
v3.3.62026/04/03

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|5天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|6天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

150k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|昨天
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|昨天
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|4天前
插件开发框架