贝尔实验室的系统编程环境

贝尔实验室的Plan 9尝试把工作站、计算服务器和文件服务器组织成统一的计算环境。系统需要同时处理文件服务、网络通信和交互输入,这些活动的执行速度与等待条件并不相同。Alef就是在这样的系统编程环境中使用的并发语言。

Phil Winterbottom撰写了《Alef语言参考手册》,Bob Flandrena则编写面向使用者的指南。1995年《Plan 9程序员手册》第2卷所收材料,已经描述实际编译与运行环境;同年系统作者论文也把Alef列为并发程序的重要编写工具。这些材料展示了已经能够编译、运行并用于系统软件的语言。

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

编译器之外还需要运行时

用户指南将Alef系统分成编译器、运行时支持函数、头文件和库。它使用ANSI C预处理器,但语言声明与调用机制存在差别,不能直接接受C头文件,Alef与C的目标模块也因栈模型不兼容而不能直接混合链接。外形接近C,并不等于能把现成C程序原样交给它编译。

指南明确提到Plan 9和运行IRIX的Silicon Graphics系统已有Alef编译器,两种实现基本一致,同时指出少量系统依赖。Plan 9论文则给出按目标机器区分工具的例子:面向Intel x86的Alef编译器名为8al。语言因而依托具体系统工具发布和使用,而不是只有一份抽象语法设计。

参考:[2] [3]

进程、任务与通信

参考手册区分进程和任务:进程是由系统抢占式调度的执行线程,一个进程可以含有多个任务;任务则在同一地址空间内协作运行,在通信或同步操作时交接执行。这样的区分让程序既可使用多个系统进程,也可在进程内部组织较轻的执行活动。

Alef支持共享变量与消息传递两种协作方式。共享数据需要通过锁等机制协调,通道则让执行活动交换指定类型的值。通道类似管道,但在声明时确定所传数据的类型,并须先分配初始化才能使用。语言还不提供垃圾回收,程序仍需自行管理内存。

参考:[1] [2]

一段问候程序怎样分工

指南的一个短例子先创建传送字符串地址的通道,再启动一个执行receive函数的新进程。接收方在通道上等待;主进程发送问候字符串,随后输出表示完成的消息。接收方取得地址后打印字符串,再结束自己的执行。这使通信关系和执行顺序分别出现在程序结构中。

关键细节是:接收动作必须等待消息到达,但两处打印的先后次序仍不确定,会受处理器数量、系统负荷及调度影响。因此,不能把程序当作普通顺序函数调用,断言问候一定先于完成消息出现。这个小例子展示了Alef常用的组织方式:主控进程启动其他执行活动,再用通道联系它们。

参考:[2]

类型系统与设计取舍

除了并发,Alef还提供聚合、抽象数据类型和元组等结构。参考手册的元组例子让一个函数一次返回整数、字符串地址和字节,调用方用一组变量同时接收。程序因此能直接表达多项返回结果,而不必把每项结果都放进单独的输出参数。

这些文档呈现的取舍相当清楚:Alef把进程管理、同步和异常等机制放进语言,同时保留显式内存管理及系统依赖。它服务于需要组织并发活动的实际系统软件,1995年的论文与手册记录了这一实现阶段。

参考:[1] [3]