跳到主要内容

(译) 深入了解 3L 项目

· 阅读需 17 分钟
Thomas Hintz

本译文采用与原文相同的许可协议进行授权和传播。

本译文不会对原文做任何除格式调整和拼写错误以外的调整和修改,以确保原文内容的完整性,保证原文所要阐述的事实和思想不被曲解。

注:该视频来自 3L Project

技术细节

3L 实际上只是一个 Lisp 程序。只有一个地址空间和一个运行时,其他所有的东西都在其中运行。 我们可以安全地做到这一点,因为语言运行时提供并施行“头等环境”。环境是一个对象,它包含对系统中可用资源的引用。 就像运行一个程序,但是该程序并不选择它可以访问的库或硬件资源。相反的是,程序运行在属于自己的环境之中, 该环境提供了对允许使用的东西的绑定。如果你不想让程序访问网络,那就在一个没有网络绑定的环境中运行它。 若是程序调用一个与网络交互的函数,该函数将不会在其环境中定义,并且会触发一个异常。 该机制提供了一个非常健壮、细粒度、全面和简单的安全系统。

译注:头等环境,即将环境作为操作系统的头等公民, 与之对等的概念是编程语言中的头等函数

3L 的核心是一个 Lisp 运行时。 除了标准的 Lisp 特性之外,运行时还提供了对硬件和内存的访问、调试、内省头等环境以及头等源代码和文档操作的工具。

译注:内省是指计算机程序在运行时(Runtime)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 见 内省 (计算机科学)

总之,为什么要重写操作系统

今天使用的操作系统的结构和接口大多是基于 45 年前的计算机科学状况,自那以后,人们做了更多的研究,极大地提高了我们当时的认知。 现在硬件也不再是一个限制因素,而且很可能会继续改善。操作系统背后的概念是数十年研究和开发的结果。 虽然自创建第一个 Unix 系统以来,操作系统的实现有了很大的改进,但基础设计却改变不大。这不仅限于基于 Unix 的系统。 所有主流的操作系统均是使用相同的、与语言运行时和用户程序分离的操作系统内核底层模型而构建的。 而且,它们通常使用相同的附加安全措施,例如用户权限和访问控制列表(ACL)。

当今的操作系统不会在很长一段时间内消失,但这并不意味着它们是所有操作系统的最终归宿。 相反,我们需要放眼未来,建立一个基于我们新的知识和理解的系统。

为什么不改进我们现有的操作系统呢?那会是理想化的,它们离我们需要达到的目标太远了,而这也会与从头开始做得到相同的最终结果, 只不过需要花费更长的时间。话虽如此,但也不是所有的东西都丢失了。移植程序依然是可行的,但是, 移植的难易程度将在很大程度上取决于它们的高级程度以及编写它们的语言模块系统和安全模型的处理能力。 也可以创建仿真层,但应该避免这么做,因为它们需要几乎不受限制地访问所有硬件和系统库,这将会完全破坏改进后的安全基础设施。

Lisp 以外的语言

尽管 3L 是用 Lisp 编写的,但并不意味着其他语言就不能使用了。 转译器、字节码编译器和解释器将提供给多种语言,包括流行的语言,如 Javascript、Python 和 Ruby。 实际上,每种语言都可以以安全的方式得到支持,并且可为 Lisp 程序提供全部或大部分的调试特性和内省功能。 甚至像 C 这样的语言也可以通过内存访问模拟技术得到支持(尽管这些程序运行起来一定会很慢)。

译注:转译器是将一种语言的代码转换为另一种语言代码的工具,参考 关于转译器 JavaScript 程序员需要知道的事

放弃文件系统

文件系统并不是存储每种类型数据的最佳方式。3L 只是提供了一个简单的键-值存储映射。 是映射到存储设备上一组块的标签。传统的文件系统可以作为简单的库构建在这种机制之上。 安全是通过库和头等环境提供的。如果你希望只允许程序访问一组特定的块, 则可以创建一个只对这些块进行读写的函数,并将该函数传递给你想要使用它(译注:指创建的函数)的程序。 (在实践中提供了更灵活的抽象。)这意味着你可以 100%地控制可用的存储。 放弃操作系统级别的文件系统控制还可以使数据库之类的事物更容易优化它们的读写操作。

PreScheme

Lisp 本身需要运行时支持,比如垃圾收集器,来管理匿名函数之类的东西。 这意味着在使用完整的 Lisp 之前,必须先进行其他设置。 3L 使用 PreScheme, 它是 Scheme 的一个受限子集,提供低级内存访问。 除了一些必须用汇编语言编写的内容外,整个 Lisp 运行时和操作系统至少是用 Scheme 的一个子集编写的。 这样做的好处,除了更容易开发和更简洁之外,还在于可以使用完整的 Scheme 系统进行开发,包括调试器和分析器。 当然,有些东西,如驱动程序,必须被模拟,但是许多代码,如独立的函数和库,仍然可以在一个完整的 Scheme 运行时上开发。 这大大加快了开发速度。

性能

安全和程序员配套设施是有成本的,但是一些机制将会被用来克服这些限制。 你可以选择块编译部件,或者,整个操作系统、程序和函数也能够被集成和内联起来,并利用块编译所支持的许多其他优化。 当前操作系统处理的一个主要性能问题是中断处理,这需要大量的内存操作和处理能力,3L 不需要处理这个问题。 有了这些性能增强,3L 可能会达到当前操作系统的 80~90%的速度。 (另外,请参阅下面关于“不安全操作”的说明,以了解其他性能改进的可能性。)

不安全操作

作为提高安全性和开发特性的一部分,3L 的主线版本不提供对运行原生代码的任何支持。

然而,3L 并没有在架构上阻止允许程序直接访问内存或运行“原生”代码的扩展。 它甚至可以扩展到允许程序在它们自己的地址空间中运行。 这类扩展不会在默认安装中,但是可以作为一个单独的 3L 版本提供。 如果你想要获得最大的性能,这是一个可选项。

译文-扩展阅读

版权声明