Jamie Jennings |
|
在离开 Lua 社区大约 5 年后,我回来了,对此感到很高兴!
以下是我在 2009 年做的一些工作。我认为这些想法仍然很重要,但代码本身不适用于最新版本的 Lua。
我对 Lua 的兴趣源于我对编程语言设计和实现的一般兴趣。对我来说,这是一个消遣,一个爱好,也是一个与编程保持联系的机会,因为我在工作中不编程。
在 2009 年 6 月/7 月的暑假期间,我编写了Lua 的 Darwin 模块系统的第一个草稿,它是对原生 Lua 模块系统的扩展。早在 1990 年代初,我在 [Jonathan Rees] 工作了几年。我一直用 Lisp 编程,很幸运地从 Jonathan 那里学习了 Scheme。 [Scheme48] 的模块系统非常有用,因为它提供了一些安全保证。Darwin 模块系统是我自己尝试在 Lua 中获得一些相同保证的尝试。特别是
由于我对 Lua 作为嵌入式语言感兴趣,因此我希望对授予用户代码的功能有强有力的保证,因为用户不会是我的项目的开发人员;用户将通过注入自己的 Lua 代码来定制我的项目。
Lua 模块系统非常灵活。与 Lua 本身一样,模块实现相当“暴露”,因此可以扩展以执行各种奇怪而奇妙的事情。为了获得安全保证,我将 Darwin 编写为 Lua 模块系统之上的(旁边?)一层。当您使用 Darwin 时,Lua 模块系统将完全正常运行。Darwin 只是增加了一种额外的功能:创建具有对一组明确模块的只读访问权限且没有更多权限的运行时环境的功能。
使用 Darwin,可以实现一些在没有它的情况下很麻烦(或不可能)的事情,例如:
Darwin 中的主要思想来自 Scheme48,而 Scheme48 又受到 ML 的影响。在写完 Darwin 后,我刚读了 Jonathan Rees 的 [博士论文],看来我在 Lua 中实现了相当一部分他的 *安全内核* 设计。还有一些事情我还没有做,以完善我认为 Darwin 中需要的功能,包括
getfenv
和 setfenv
函数隔离到一个单独的模块中,以便轻松拒绝访问它们(因为它们会泄露权限);以及
下面附有一个包含源代码和一些测试的 tar/gzip 文件。我写了一些文档,这是一篇非正式的论文,描述了设计,以及一个简短的参考部分
Darwin 是 (C) 2009,Jamie Jennings,并将根据 MIT 开源许可证发布。
Darwin 是纯 Lua,并与 Lua 5.1.4 兼容。我不知道它是否与旧版本兼容。
以下是我每次启动 Lua 时(在 Darwin 加载后)加载的文件。它定义了一组我经常使用的模块的结构。我配置 Darwin 的方式(也是默认方式),Darwin 会为每个声明的结构在 package.preload
中添加条目。这样,我的代码就可以简单地调用 require
,例如 require "list"
或 require "lanes"
。Darwin 与现有的 Lua 包系统相当顺畅地协作。
structure.declare { name="list"; location="."; open={"_G"}; objects={"null"}; files="list.lua"; } -- Just for demonstration purposes structure.declare { name="pair"; signature={"cons", "car", "cdr", "isnull", "null"}; open={"_G"}; objects={"null"}; files="list.lua"; } structure.declare { name="recordtype"; -- debug package is only needed because recordtype uses "strict" open={"_G", "package"; "table", "string", "debug"}; environment=[[ require("recordtype"); return recordtype ]]; } structure.declare { name="lprocess"; open={"package"}; environment=[[ require "lprocess"; return lprocess ]]; } structure.declare { name="queuestack"; location="."; files="queuestack.lua"; } structure.declare { name="points"; location="."; open={"_G", "math"}; objects={"point", "points"}; files="points.lua" }
注意 MacOS 和 Windows 用户:您可能需要对 _darwinpackage.lua_ 进行少量修改,以便 Darwin 正确加载原生 (C/C++) 库。更改及其原因在文档的“限制”部分进行了说明。我将在某个时候创建一个解决方法。