面向不同设备的应用语言

Limbo由肖恩·多沃德(Sean Dorward)、菲尔·温特博特姆(Phil Winterbottom)和罗布·派克(Rob Pike)设计,作为贝尔实验室Inferno系统的应用语言。它沿用C的表达式和控制流程、Pascal的声明方式,也吸收Alef的抽象数据类型与通道设计。语言既要让已有编程经验能够派上用场,又要支持网络服务的不同组件合作。

Inferno面对电视机顶盒、手持终端、网络计算机以及服务器等设备,处理器、内存和宿主系统各不相同。1997年的系统论文因此把应用程序可移植性列为核心目标:Limbo编译为统一的中间指令,应用通过相同接口使用资源。作者回忆1995年初开始的则是Inferno整体项目;语言的早期公开分发,另见1996年的同期报道。

参考:[1] [2] [3] [4]

把移植工作交给Dis

Limbo程序编译成Dis虚拟机的字节码,在不同Inferno平台间保持同一表示。系统可以直接运行于硬件,也能作为Unix、Windows等操作系统中的程序运行;解释器和即时编译器负责把中间指令落实到具体机器。程序员因而不必为每一种机顶盒或工作站另写一份应用逻辑。

Dis的算术指令采用两个源操作数与一个目的操作数的形式,与通用处理器指令较接近,便于即时生成本机代码。内存管理也纳入运行环境:普通无用对象通过引用计数及时释放,循环引用则由另一回收机制处理。对内存较小的设备,代码移植与资源回收是相互关联的工程选择。

参考:[2] [3]

接口声明与实际装入分开

Limbo程序由模块构成。接口文件说明模块向外提供的函数、类型和常量,具体实现则提供代码。编译时用include读入声明,运行时再用load取得实现;装入后返回的句柄,才让程序能够调用该模块。编译检查与装入时的类型检查共同约束各组件的连接。

这种安排允许一个接口有多个实现,也让程序决定何时占用相应的代码和数据空间。1997年的系统论文举例,购物目录程序先查看设备是否具备视频资源,缺少时就不装入视频解码器。模块的选择由应用根据现场条件作出,统一接口与可替换实现并不要求每台设备拥有完全相同的能力。

参考:[1] [2]

图像查看器怎样组织并发

原论文的精简图像查看器View展示了这些机制。它逐个处理命令行中的文件;若不是系统原有图像格式,就按后缀选择GIF或JPEG解码模块。两种模块都实现RImagefile接口,read返回图像和错误信息。主程序因此可以沿用同一处理步骤,而由具体解码器识别格式。

得到图像后,spawn为显示工作启动新进程,主循环立即继续处理下一个文件。各显示进程共享必要数据,但拥有各自的执行栈。窗口命令和尺寸变化被送入通道,alt等待可以进行的通信:关闭命令使显示进程退出,移动或缩放事件则触发重绘。通道同时承担传递信息和同步的作用,使图像处理、窗口事件与程序控制能够分工运行。

参考:[2]

早期试用与后续版本

乔治·劳顿在1996年10月1日修订的报道中记载,Lucent当年5月公开宣布Inferno,9月初宣布分发免费早期版本。软件包包括Limbo语言、开发工具、文档、浏览器和邮件示例应用。这说明外部开发者已能接触实际实现;报道所说的年底商业版则仍是计划。

1997年Build 1的Release 1.0分发说明留下另一条具体边界:Beta编译器生成的Limbo可执行文件不能直接在1.0虚拟机运行,现有程序必须重新编译。可移植的中间代码仍依赖相应版本的运行环境。早期分发、技术论文说明和版本更新共同呈现了Limbo设计如何变成可供开发者使用的工具。

参考:[4] [5]