Hacker News 中文摘要

RSS订阅

SBCL: 可合理自举的Common Lisp (2008) [pdf] -- SBCL: A Sanely-Bootstrappable Common Lisp (2008) [pdf]

文章摘要

这篇文章介绍了SBCL(一种可自举的Common Lisp实现)的开发过程。它采用了一种独特的自举策略:不是仅从自身或其他语言引导,而是从多种Common Lisp实现中引导。作者阐述了这种策略的动机,讨论了实现过程中的技术细节,并评估了这种策略对实现开发和Common Lisp用户的技术及社会影响。

文章总结

SBCL:一种可合理引导的Common Lisp实现

作者:Christophe Rhodes(伦敦大学金史密斯学院计算系)

摘要

本文描述了一种Common Lisp实现(SBCL)的开发过程,其独特之处在于它既不完全依赖自身引导,也不依赖其他单一语言,而是能够从多种Common Lisp实现中进行引导。文章阐述了这种引导策略的动机,讨论了实现过程中的技术细节,并评估了该策略对实现开发和Common Lisp用户群体产生的技术与社会影响。

主要内容

1. 背景与现状

  • Lisp语言家族历史悠久,现代主要方言为Scheme和Common Lisp
  • 当前Common Lisp实现可分为两类:
    1. 主要使用非Lisp语言实现(如C、Java等)
    2. 主要使用Lisp自身实现(多数依赖镜像引导技术)

2. SBCL概况

  • 源自CMU Common Lisp(CMUCL),1999年由Bill Newman发起
  • 代码规模:
    • 标准库:9万行Lisp代码
    • 编译器:6万行Lisp代码
    • 平台相关代码:每个架构1-2万行
    • CLOS实现:2万行
    • C/汇编代码:3.5万行(主要用于垃圾回收和信号处理)

3. 构建过程

SBCL采用独特的跨编译器构建策略:

  1. 阶段一:使用宿主Lisp编译生成跨编译器(xc)
  2. 阶段二:生成目标系统头文件和运行时程序
  3. 阶段三:使用跨编译器重新编译所有Lisp源文件
  4. 阶段四:通过伪加载(pseudo-loading)构建初始内存映像
  5. 阶段五:执行冷启动初始化,完成最终系统构建

关键技术点: - 使用sb!前缀包名隔离构建环境 - 特殊处理eval-whenmake-load-form - 处理不同Lisp实现的数值类型差异

4. 优势与挑战

优势: - 降低贡献门槛,促进社区发展 - 简化重大修改(如类型系统调整) - 支持从多种Common Lisp实现构建

挑战: - 构建时间较长(需编译两次) - CLOS实现存在元循环依赖问题 - 处理不同宿主Lisp的兼容性问题

5. 结论

SBCL证明了使用Common Lisp自身实现Common Lisp编译器的可行性,其可重复的构建过程降低了开发门槛,促进了社区发展。未来工作包括改进构建确定性、完善CLOS引导机制等。

致谢

感谢项目创始人Bill Newman和所有贡献者,以及PPARC和EPSRC的研究支持。

评论总结

评论总结:

  1. SBCL的活跃开发与优化
  • 观点:SBCL(Steel Bank Common Lisp)正在积极开发,性能优秀
  • 论据: "SBCL seems pretty actively developed. A proposal for coroutines implementation appeared recently"(praptak) "SBCL is lovely and very well optimised...it just works and it is so easy to work with and debug"(anonzzzies)
  1. Lisp/Scheme的实际应用疑问
  • 观点:初学者对Lisp家族语言的实际用途存在疑问
  • 论据: "what is this actually used for and do people build anything with lisp???"(krishSingaria)
  1. Scheme与Common Lisp的对比
  • 观点:Scheme更简洁优雅,但Common Lisp更适合实际生产
  • 论据: "I think I agree with the push for minimalism...for my own personal pleasure I will always prefer Scheme"(rusakov-field) "If someone put a gun to my head...I will go with CL to save my life"(rusakov-field)
  1. 开发方式讨论(图像vs源码)
  • 观点:Common Lisp支持图像化开发方式,引发是否完全替代源码的疑问
  • 论据: "Am I reading this right that people can (and do??) use images as a complete replacement for source code files?"(meken)

注:所有评论均未显示评分(None),主要讨论围绕Lisp语言家族的技术特性和使用体验展开。