Show HN: 我用 Go 语言实现了一种类似 Clojure 的语言,启动时间仅需 7 毫秒

Show HN: 我用 Go 语言实现了一种类似 Clojure 的语言,启动时间仅需 7 毫秒

Show HN: 我用 Go 语言实现了一种类似 Clojure 的语言,启动时间仅需 7 毫秒

一句话看懂:一位开发者用 Go 语言实现了名为 let-go 的 Clojure 方言,它编译为单一 10MB 二进制文件,冷启动仅需 6-7 毫秒。这意味着 Clojure 家族语言首次拥有了“秒开”级别的独立可执行文件和 WebAssembly 部署能力,直接挑战 Java 虚拟机生态在 Clojure 运行时的主导地位。

事件核心:发生了什么

let-go 是一个完整的字节码编译器与虚拟机,设计上尽可能接近日常使用的 Clojure,但并非为了成为 Clojure/Clojure 的替代品。其关键指标包括:编译产物为单一约 10MB 的 Go 二进制文件,空闲内存占用约 14MB,冷启动耗时 6-7 毫秒。该项目目前已通过 jank-lang/clojure-test-suite 跨方言合规套件的测试,在 217 个测试文件中通过 4696/4921 个断言(95.4%)。let-go 支持宏、解构、协议、记录、 multimethods、换能器、惰性序列、持久化数据结构、BigInt 等 Clojure 核心特性,并内置 core.async 通道、HTTP 服务端/客户端、JSON/Transit 编解码、Babashka pods 协议及 nREPL 服务器。它还能将程序编译为包含 xterm.js 全终端模拟的自包含 HTML 页面,在任意浏览器中运行。

为什么重要

Clojure 长期以来受限于 JVM 的启动延迟和内存开销,在云函数、边缘计算、CLI 工具和 WebAssembly 场景中难以立足。let-go 通过 Go 语言实现,直接将冷启动从秒级压到 6 毫秒,内存占用仅为 Babashka 的七分之一、JDK 的三十三分之一。这在技术路线上提供了一条重要参考:Lisp 方言的运行时可以完全脱离传统虚拟机,获得接近原生 Go 的性能表现。对于 Clojure 社区而言,这意味着“白天写 Go”的开发者终于有了一个合法在 Go 项目里写 Clojure 语法的选项,同时还能直接调用 Go 的函数和类型,实现双向互操作。

对用户/开发者/创作者的影响

对 Clojure 开发者来说,let-go 最大的价值在于“编译即运行”:lg -b myapp main.lg 即可生成独立二进制文件,无需用户额外安装 JVM 或类库。这对分发工具、内部脚本或微服务非常友好。对前端和全栈开发者,lg -w outdir main.lg 可以将程序编译成一个自包含的 HTML 页面,运行在浏览器中的终端模拟器里,适合在浏览器中运行 REPL 或交互式应用。对尝试实践“可编程基础设施”的团队,let-go 的 Direct Linux syscalls 接口(mount、unshare、seccomp 等)让普通 Lisp 代码也能直接进行系统级编程,这在纯 JVM 环境下难以实现。目前公开信息显示,Babashka pods 的完整生态支持意味着 let-go 可以直接使用已有的数据库、AWS、Docker 等外部服务接口。

值得关注的后续

  1. 生态兼容性进展:let-go 目前通过 95.4% 的合规套件测试,剩余失败点集中在溢出检测和 BigDecimal 行为等边界情况。如果后续补齐这些差异,将显著降低从标准 Clojure 迁移的成本。
  2. Go 后端集成深度:let-go 已支持“let-go 字节码 → Go 翻译”的远期目标。如果这项能力成熟,将允许开发者将 let-go 代码直接编译为原生 Go 源码,进一步消除运行时性能折衷。
  3. WASM 场景的实用性:该项目的冷启动速度意味着可以在单个 requestAnimationFrame 内完成完整运行时启动并仍有 10 毫秒剩余,这对 WebAssembly 上的交互式应用(如代码编辑器、数据可视化工具)有实际吸引力,值得关注是否会有基于 let-go 的在线 Clojure 工作台出现。

来源:Hacker News · 24h最热

celebrityanime
celebrityanime
文章: 968

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注