在 Common Lisp 里运行 Java:OpenLDK 的字节码翻译与 CLOS 映射
来源:atgreen.github.io — 2026-10
📋 概述
作者二十多年前写过 gcj,如今主用 Common Lisp,2024 年底为了在 SBCL 里直接用 Java 库,动手写了一个用 Lisp 实现的 JVM:读 Java 字节码,翻译成 Lisp,交给 SBCL 编成本机码。结果是 Java 对象和 Lisp 对象住在同一进程同一堆里——Java 类变成 CLOS 类,实例方法变成泛函数方法,Lisp 可以给 Kotlin 写的方法加 around 方法,Clojure 函数可以塞进 funcall。他甚至能把初始化好的 Spring Boot 应用存进 Lisp 镜像,再以 84 毫秒启动回来。
🔑 核心要点
- 路线是 字节码 → 中间表示 → Lisp → 本机码,编译是惰性的:方法第一次被调用才编,没用到的大半个库永远不编
- 语义映射很有意思:Java 类成为 CLOS 类,实例方法成为按 JVM 签名区分的泛函数方法,静态方法成为普通函数
- Java 的 32 位溢出语义靠 mask-signed-field 保留,(sb-c::mask-signed-field 32 (+ x y)) 一句顶掉整个运行时
- 互操作是双向的:#@kt{... 之类的读法把七种 JVM 语言的原生语法嵌进 Lisp 源码,值直接跨语言传递不序列化
- 最震撼的数字:初始化好的 Spring Boot 应用存进 Lisp 镜像后,重新启动只要约 84 毫秒
- 还能把 Emacs + SLY 接到跑在 OpenLDK 上的 Spring Boot 进程,边跑边查对象、改行为
- 作者也说得老实:通用 Java 执行场景下 HotSpot 快得多,这个项目的目标只是让 Java 库在 Lisp 里像本地货
💡 金句
Java classes become CLOS classes. Lisp can add methods around methods written in Kotlin.
👍 0
👎 0
← 返回 Lobsters 首页