分类:
2010-10-14 16:49:52
开放电信平台(Open Telecom Platform, OTP)是为了构建和运行电信系统而设计的一个开发系统。图7.1给出了该系统的一个方块图,该图来自参考文献[66]。如图中所示,OTP系统是设计来运行在通常的操作系统之上的一个所谓的“中间件平台”。
图7.1:OTP系统架构
OTP其实是在Ericsson内部开发的,但是其中大部分软件已经按照Erlang公开许可(Erlang public license)1公布给了公共领域。
OTP的发布包含有如下一些部件:
1.Erlang的编译器和开发工具。
2.适应多种不同目标环境的Erlang运行时系统。
3.覆盖广泛的公共应用的一些库。
4.实现公共行为模式的一组设计模式。
5.用来学习如何使用该系统的一些教学资料。
6.大量的文档。
1 非常类似于一个开源许可。
137
OTP已经被移植到了许多不同的操作系统上,包括所有的Unix类的系统(Linux、 FreeBSD、Solaris、OS-X…),大多数的Windows操作系统(Windows 95、98、NT…)和一些VxWorks之类的嵌入式操作系统。
Erlang运行时系统是一个用来运行由Erlang 的BEAM编译器产生的中间码(intermediate code)的虚拟机。它同时也为Erlang编译器产生的本地码(native code)提供运行时支撑服务。
Erlang的BEAM编译器自1998年后就取代了原始的JAM编译器。BEAM编译器[41,42]将Erlang源代码编译成为32bit字宽的线索化解释器(threaded interpreter)使用的指令序列。而原始的JAM机是一个非线索化(non-threaded)字节码解释器(byte code interpreter)。
另外,为了提高效率,Erlang程序还可以用Uppsala大学开发的HIPE编译器[47]编译成本地码(native code)。编译成被解释执行的BEAM中间码的模块和编译成本地码的模块在模块级是可以自由混合的,即整个模块既可以被编译成BEAM码,也可以被编译成HIPE码,但是在模块内部,两种码不能混合。
BEAM机和HIPE机共同使用了Erlang运行时系统中关于内存管理、输入/输入、进程管理、垃圾收集等部件的代码。
Erlang运行时系统提供了许多传统上由操作系统提供的服务,所以,Erlang运行时系统远不仅仅提供纯序列化语言的运行时支撑,而比这要复杂得多。所有得Erlang进程都由Erlang运行时进程来管理——即使在一个Erlang运行时系统控制着数以万计的Erlang进程的时候,宿主操作系统也只会感到只有一个进程在运行,那就是Erlang运行时系统本身。
另一方面,与其他语言相比,Erlang的编译器又是相当简单的。编译通常只是一个从Erlang代码到一条合适的虚拟机原语的一个简单翻译。所以,例如Erlang中的spawn原语被翻译成虚拟机中的一条单独的操作码(opcode)(即spawn原语的实现),然后付出很大的努力使得操作码的实现尽量的高效。
138
7.1 库
OTP的发布包包含由一个很大的库集,为了发布的目的,其中所有的库都作为OTP应用的实例。例如发布包R9B(译注:Erlang/OTP的一个发布版本号)就包含如下这些应用:
appmon ——一个监控和操纵监督树的一个图形化工具。
asn1 ——一个按照ASN.1定义的一个编译器和运行时编/解码支持包。
compiler ——Erlang的编译器。
crypto ——一个用于加密/解密数据和计算消息摘要(message digests)的函数集。
debugger ——一个Erlang源代码调试器。
erl_interface——一个用于与分布式Erlang节点通信的库文件集。
erts——Erlang运行时系统。
et——一个事件跟踪器和一些记录事件数据并进行图形化表示的工具。
eva——负责“事件与告警”处理的应用。
gs——一个图形系统,一组用于构建GUI的图形函数。
ic——Erlang的IDL编译器
inets——一个HTTP服务器和一个FTP客户。
jinterface——一个编写Java与Erlang的接口的工具。
kernel——系统得以运行所需要的两个基本库之一(另一个是stdlib)。本库包含文件服务器、代码服务器的实现。
megaco——支持Megaco2/H248协议的库集。
mnemosyne——一种用在mnesia上的数据库查询语言。
2 Media Gateway Control,即媒体网关控制器
139
mnesia——一个具有Erlang的软实时特性的DBMS(译注:数据库管理系统)。
observer——一个用于跟踪和观测分布式系统的行为的工具集。
odbc——一个用于Erlang访问SQL数据库的ODBC接口。
orber——一个CORBA对象请求代理的Erlang实现。注意:还有其它一些单独的应用,来提供对不同CORBA服务(如事件、通知、文件传输等)的访问。
os_mon——一个监控外部操作系统的资源使用情况的工具。
parsetool——解析Erlang的工具。包括yecc,即LALR(1)解析器生成器(parser generator)。
pman——一个查看系统状态的图形化工具。pman可以用来查看本地或远端的Erlang节点。
runtime_tools——运行时系统所需要的各种小函数。
sasl——“System Architecture Support Libraries”(系统结构支持库)的缩写。本应用包含对告警处理(alarm handling)和发布管理(managing releases)的支持。
snmp——简单网络管理协议(Simple Network Management Protocol)[24]的Erlang实现。本应用包含一个MIB编译器和一些MIB编写的工具。
ssl——一个Erlang的安全套接字层(secure sockets layer)接口。
stdlib——系统得以运行的“必备的”Erlang库集。另一个必备的库集是kernel。
toolbar——一个可以从中开启应用的图形化工具条。
tools——一个由各种用于分析和监测Erlang程序的独立应用组成的包。这些应用即一些性能评估(profiling)、覆盖率分析(coverage analysis)、交叉引用分析(cross reference analysis)的工具。
140
tv——一个“表浏览器”(table viewer)。本表浏览器是一个可以对mnesia数据库种的表进行图形化浏览的图形化应用。
webtool——一个用于管理基于网页的工具(如inets)的系统。
OTP库集提供了一个高度成熟的工具集,是编写任何商用软件的一个很好的起点,然而,OTP库集是相当庞杂的。
回想一下,我们的第6章只是对五种behaviour(gen_server、gen_event、gen_fsm、supervisor、application)进行了一个简明的解释,而对其中任何一种behaviour的完整的解释都超出了本文的范围。本文只是在第4.1节对其中一个behaviour(gen_server)背后的原理进行了较完整的交待。
发布包R9B中的stdlib应用一共包含71个模块——我们已经在这里描述了其中的4个。