News Hacker|极客洞察

126 66 天前 moglang.org
🤔Mog:为 AI agent 设计的 AOT 嵌入式新语言与争论
造新语言就能赢过 Deno 的训练语料?

🎯 讨论背景

Mog 是一个为 AI agent 场景设计的实验性编程语言,目标是做成 AOT 编译、能在宿主进程内低延迟加载并减少“foot‑guns”(例如取消运算符优先级)。作者用 Rust 实现宿主并通过 extern "C" 暴露 ABI,宣称可嵌入到事件循环(已在 Bun 测试)或可能编译为 WASM。讨论围绕几条主线展开:用不着新语言的实用主义(TypeScript + Deno/JS 运行时的覆盖)、新语言在 LLM 训练语料上的冷启动问题、AOT 与 JIT 在性能与安全上的权衡,以及语言简化对人类可读性与模型生成质量的影响。评论还提到替代方案如 Gleam(面向 BEAM 的静态语言)、WASM、以及数据库/存储(如 SQLite 在并发/WAL 场景的问题)等工程关切。

📌 讨论焦点

实用主义怀疑:Deno/TypeScript/WASM 已够用

许多评论者质疑为何要为 agent 场景造新语言,指出 TypeScript + Deno 已经是经过审计的、带沙箱和完善类型系统的成熟选择,且 LLM 在 TypeScript 上训练得很充分,因此生成代码时具有天然优势。有人强调子进程开销在大多数 agent 工作流里相对可忽略,因为模型推理和往返延迟远大于进程启动或 IPC 的额外成本。维护性与社会信任被认为比语法新颖更重要:Deno 的背书与多年维护难以短时间内被替代。另有评论提出 WASM(WebAssembly)作为将外部代码安全嵌入宿主进程的可行替代方案,但指出 WASM 规范与工具链更复杂,而 Mog 宣称规范小得多。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6]

LLM 训练冷启动与语料问题

讨论普遍关注新语言的训练语料稀缺问题:LLM 在常见语言上有大量样本,缺乏 mog 的示例会让模型生成 Mog 代码时更不可靠且需要把标准库/语法信息常驻上下文窗口。有人提出可以用合成数据生成大规模示例(类似 Stack Overflow 规模)来弥补,但这需要大量计算资源与时间,且可能需要被 AI 实验室纳入主训练集或用 RL 进一步微调。上下文窗口(token 限制)被反复提到:把语言规范与 stdlib 占用在上下文中,会侵蚀用于描述具体任务或函数签名的空间,影响实用性。部分评论认为这不是技术上不可解决但确实是采纳门槛,需要规模与生态支持才能突破。

[来源1] [来源2] [来源3] [来源4] [来源5]

执行模型与安全性权衡(AOT vs JIT)

Mog 采用 AOT 编译并在宿主进程内加载机器码,作者宣称编译器用安全 Rust 编写以降低运行时代码复杂性,目标是消除子进程启动成本并为频繁调用的插件提供低延迟。评论中有人支持 AOT 的可预测性与一次编译多次执行的优势,但也有强烈反驳指出 JIT(例如 V8 的 Ignition + TurboFan)通过分层编译在长期运行中能快速提供高性能并减少冷启动问题。安全讨论集中在把编译器和宿主放在同一信任计算基(TCB)上的风险,以及如何实现安全加载与内存隔离;还有人建议使用现成的 JIT/工具链(如 cranelift)以减少重复造轮子。整体讨论把性能、预测性、安全性和工程复杂度放在同等重要的位置来权衡。

[来源1] [来源2] [来源3] [来源4] [来源5]

语言设计取舍:无优先级与简化特性

Mog 有意做出语法简化以减少“foot‑guns”:取消 operator precedence 要求显式用括号、字符串切片以字节偏移为单位而非 code point、并减少泛型、宏或元编程支持以保持语言规范小且易于验证。支持者认为更简单、显式的语法能降低 LLM 生成时的错误面,并让嵌入与审计更容易;反对者指出大部分 LLM 在训练数据中见到的是带运算优先级的语言,忽略优先级可能反而让模型生成代码更容易出错或不直观。关于字符串处理的具体担忧包括 UTF‑8 多字节字符按字节切割会在多语言文本处理中引发 bug;还有人指出没有宏/泛型会降低人类开发者的表达力与代码复用。总体讨论在“更易被模型正确生成”与“人类可读性/表达力”之间权衡。

[来源1] [来源2] [来源3] [来源4] [来源5]

嵌入、宿主与运行时支持

作者说明宿主以 Rust 实现并通过 extern "C" 导出 ABI,使得多数语言可以通过 FFI 嵌入,Mog 设计为事件循环友好,已在 Bun 的 event loop 下测试并可能编译到 WASM(异步支持更具挑战性)。评论关注实际工程细节与典型 agent 工作流:有人指出 coding agents 常通过下载系统包(apt-get 等)获得工具,说明简单的 plugin API 可能不足以覆盖所有场景;此外还有关于存储层的讨论——SQLite 在冷启动恢复或 WAL 并发时的局限提示 agent 工作负载可能需要专门的内存层或不同的 DB 设计。嵌入到游戏或作为低延迟插件是被反复提及的目标用例,但也有人提醒实现可移植异步支持与安全加载并非易事。

[来源1] [来源2] [来源3] [来源4] [来源5]

替代方案与社区反应

评论里有人推荐成熟的小型语言作为替代或参考,例如 Gleam(面向 BEAM 的小型静态类型语言)被认为能自动消除许多错误并利用 BEAM(Erlang 虚拟机)的稳定并发模型;WASM 也多次被拿来对比作为嵌入安全性的通用选项。社区情绪复杂:一部分人鼓励实验性 DSL 和新思路,另一部分人则对重复造轮子、命名('mog' 的俚语含义)及生成内容的管理表示不满或嘲讽。总体讨论既有技术实用主义,也有对长期维护、生态与文化接受度的担忧。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6]

📚 术语解释

AOT(Ahead‑of‑Time 编译): 在运行前将代码编译为目标机器码,减少运行时编译或解释开销,适合重复调用的插件路径但会有前置编译延迟。

JIT(Just‑In‑Time 编译): 运行时将热点字节码或中间表示编译成机器码,能通过分层优化在长期运行中提升性能,但引入不确定的编译时机与更复杂的运行时行为。

WASM(WebAssembly): 一种在浏览器和其它宿主中运行的低级字节码格式,可用于隔离执行和跨语言嵌入,常用于把不同语言编译为统一的宿主可执行模块。

FFI(Foreign Function Interface): 语言间调用原生函数的接口机制,Mog 通过 extern "C" 导出 ABI,使宿主或其它语言能按 C ABI 嵌入调用。

BEAM: Erlang/Elixir 的虚拟机运行时(BEAM),以高可靠性、轻量进程与并发著称,Gleam 等语言可编译到 BEAM 以利用其生态与稳定性。

context window(上下文窗口): 在 LLM 中一次性可供模型参考的 token 数量;新语言若需把规范或 stdlib 常驻上下文,会占用有限 token,从而影响模型对任务/库信息的利用。

operator precedence(运算符优先级): 决定复合表达式中运算顺序的规则;Mog 放弃默认优先级以强制括号显式表达,但这与许多训练数据里的习惯不同。