OMG IDL接口定义语言

上传人:jin****ng 文档编号:110347407 上传时间:2022-06-18 格式:DOC 页数:11 大小:100.50KB
返回 下载 相关 举报
OMG IDL接口定义语言_第1页
第1页 / 共11页
OMG IDL接口定义语言_第2页
第2页 / 共11页
OMG IDL接口定义语言_第3页
第3页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
developerWorks 中国 Java technology OMG接口定义语言定义分布式服务的能力Dave Bartlett (),顾问、作家和讲师简介:一切都要从接口定义语言(IDL)开始。当我们采用RPC或COM技术以及 CORBA技术来编写分布式系统时都需要它。在各种情况下,接口定义语言提供了将对象 的接口与其实现分离的能力。IDL提供了抽象,它提供了将事务与其具体实现分离的概念。 它还为我们提供了一套通用的数据类型使得我们可以使用它们来定义更为复杂的类型。我们 将采用所有这些数据类型来定义分布式服务的功能。IDL的另一个好处是它剥离了编程语 言和硬件的依赖性。本文探讨了 OMG IDL的内置类型和关键字。发布日期:2000年9月01日级别:初级访问情况:1696次浏览评论:0 (查看|添加评论-登录)噪僚嚥錚鱼平均分(4个评分)为本文评分IDL是一种规范语言。它允许我们从实现中剥离对象的规范(如何与它交互)。这是一个约 定:“客户机女士,如果您要调用这个方法,请传送这些参数,然后我,服务器先生,将把 这个字符串数组返回给您。”使用这个接口的客户机程序员不知道接口背后的实现细节。OMG IDL看上去很像C语言。这就很容易将这两种语言以及它们的关键字做比较。但是, 这种相似性只流于表面。每种语言的目的是完全不同的。我们在讨论这种语言时,您已经记 住OMG IDL的目的是定义接口和精简分布对象的过程。IDL基本类型OMG接口定义语言有一些看上去应该很熟悉的基本类型。以下就是这些内置类型的表: 表1. IDL基本类型类型范围最小大小(以位为单位short-2 15 到 2 15-116unsignedshort0 到 2 16-116long-2 31 到 2 31-132unsignedlong0 到 2 32-132long long-2 63 到 2 63-164unsigned longlong0 到 2 64-164floatIEEE单精度32doubleIEEE双精度64longdoubleIEEE双字节扩展浮点数15位指数,64位带符号charISOLatin-18wchar从任何宽字符集编码宽字符,如Unicode依赖于实现stringISO Latin-1,除了 ASCII NUL 以外可变化BooleanTRUE 或 FALSE未指定octet0 到 2558any自己描述的数据类型,可表示任何IDL类 型可变化整数类型OMG IDL的整数类型非常简单。虽然它没有提供int类型,但它不会受到int在不同平台上的取值范围不同所带来的多义性的困扰。然而,IDL确实提供几种整数类型,2字节(short )、4字节(long )和8字节(long long )的整数类型。所有这些整数类型都有相应的无符号数类型。这对于Java程序又产生了问题,因为Java 编程语言不支持无符号数类型。尽管这不是OMG IDL的特性,它还是在Java-to-IDL的映 射中创建了一种独有的局面,我们将在下个月的专栏文章中讨论Java-to-IDL的映射。但在 此之前,您已经考虑如何将IDL中的unsigned short映射成一种Java类型。使用 Java short还是Java int ?它们各自的利弊是什么?这些是语言映射的作者必须努力 解决的问题,并且这是一个很好的练习,可以帮助您为阅读下一篇专栏文章做好准备。浮点类型OMG IDL 浮点数类型 float、double 和 long double 遵循 IEEE 754-1985 二进 制浮点数算术的标准。目前,long double用于巨大数字,您也许会发现您的特殊语 言映射还不支持这种类型。char 和 wchar我们都使用相同的术语,字符集就是字母或其它构成单词的字符以及其它本机语言或计算机 语言的基本单元的集合。编码字符集(或代码集)是一组明确的规则,它建立了字符集和集 合的每个字符与其位表示法之间的一一对应关系。处理char时,必须记住OMG IDL必须分两个层次处理字符集。首先必须明确规定从哪 个字符集生成IDL定义。词法约定(表示IDL文件的关键字、注释和文字的字符记号)规 定ISO 8859.1字符集表示IDL文件中的字符。是的,连IDL都必须有一个标准字符集, 它将构建在这个字符集上。ISO 464定义了空字符(null)和其它图形字符。接着,OMG必须处理从一个计算机系统到另一个计算机系统之间的字符传输。这意味着可 能涉及到从一个字符代码集到另一个字符代码集的转换,这取决于语言绑定。在上个月的 专栏文章中,我们对Orbacus Object Referenee执行了 IORDump操作,并且发现了以下 信息:Native char codeset:ISO 8859-1:1987; Latin Alphabet No. 1Char conversion codesets:X/Open UTF-8; UCS Transformation Format 8 (UTF-8)ISO 646:1991 IRV (International Reference Version)Native wchar codeset:ISO/IEC 10646-1:1993; UTF-16,UCS Transformation Format 16-bit formWchar conversion codesets:ISO/IEC 10646-1:1993; UCS-2, Level 1ISO 8859-1:1987; Latin Alphabet No. 1X/Open UTF-8; UCS Transformation Format 8 (UTF-8)ISO 646:1991 IRV (International Reference Version)可以看到,IOR可以包含代码集信息,以在转换时协调首选代码集和可用代码集。解决了所有问题后,您应该知道OMG IDL char是一个8位变量,可以用两种方法表示 一个字符。首先,它可以从面向字节的代码集编码单字节字符,其次,当在数组中使用时, 它可以从多字节字符集(如Uni code),编码任何多字节字符。Wchar只允许大于8个字节的代码集。规范不支持特殊的代码集。它允许每个客户机和服 务器使用本机的代码集,然后指定如何转换字符和字符串,以便在使用不同代码集的环境之 间进行传输。Boolean这里没有什么可以多说的-Boolean值只能是TRUE或FALSE。Octetoctet是8位类型。因为保证了 octet在地址空间之间传送时不会有任何表示更改, 因此这就使它变成了一种非常重要的类型。这就表示您可以发送二进制数据,并且知道当将 它打包时,它的形式仍然相同。其它每种IDL类型在传输时都有表示变化。例如,根据IOR 代码集信息的指示,char数组会经历代码集转换。而octet数组却不会。any类型IDL any是一种包含任何数据类型的结构。该类型可以是char或longlong或string或另一种any,或者是已经创建的一种类型,如Address。any容 器由类型码和值组成。类型码描述any的值部分中的内容是什么。如果您拥有C+经验,则可以将any看作是自我描述的数据类型,它类似于void*, 但更安全。如果有Visual Basic经验,可以将any看作类似于variant。当我们讨论 IDL-to-Java映射时,any类型的结构和它如何对用户定义的类型产生作用将变得一目了 然。回页首用户定义的类型基本类型是必不可少的;它们为接口定义提供了构件块。OMG IDL为您提供了定义您自己 的类型的能力,这可以帮助减少复杂程度并且让您可以根据基本类型组成更精巧的数据类型。 这些复杂的类型可以是枚举、结构和联合,或者您可以使用typedef来创建类型的新名 称。命名的类型应该使用typedef创建新的类型名称,这将帮助解释接口或保存输入。例如,您也许想在方法 PresentWeather(., in floatPressure, .) 中 传送气压值。如果在该方法中使用typedef float语句,这将使该方法更具可读性。typedef float AtmosPressure;在C+中,typedef关键字表示类型定义实际上别名也许是更为精确的术语。对于 OMG IDL,也许是这样,也许不是,这取决于其所映射到的实现语言。CORBA规范不保 证short的两种typedef是兼容的和可互换的。在文体上,应注意不要为现有类型创建别名。您应该尝试创建不同概念的类型,它将为您的 IDL添加可读性和可扩展性。最好是明确定义一次逻辑类型,然后在整个接口中不断使用该 定义。枚举OMG IDL枚举是将名称附加到数字的一种方法,从而读取代码的人就可以了解到更多的含 义。OMGIDL版的枚举看上去象C+版本的枚举。enum CloudCovercloudy, sunny;CloudCover现在就成为可以在IDL中使用的一种新类型。由于在一个枚举中可以有最 多2 32个标识,OMG IDL保证枚举被映射到至少32位的类型。规范中没有规定标识的有 序数值,但它规定了将保持顺序。因此,不能假设cloudy永远拥有序数值0 -某些语 言映射可能将1赋值给它。但可以确保cloudy小于sunny。如果认为IDL的目的是定义跨各种系统的接口,那么不指定序数值是明智的。您只将值发 送到服务器。即,cloudy。在服务器空间中,cloudy可以由0、1或如何实现语言规 定的值表示。某些实现语言不允许您控制序数值,而C+允许。OMG IDL不允许空的枚 举。结构struct关键字提供了将一组变量集中到一个结构的方法。一旦创建了,struct表示 可以在整个接口定义中被使用的新类型。struct Date short month;short day;long year;定义struct时,要确保所创建的类型是可读的。不要在不同的名称空间中创建几个不同 的同名结构,这只会使IDL的用户搞糊涂。识别联合OMG CORBA规范将IDL联合描述成C联合类型和switch语句的混合物。IDL识别联 合必须有一个类型标记字段用于确定在当前实例中使用哪个联合成员。像C+一样,一次 只能有一个联合成员是活动的,并且可以从其识别名称来确定该成员。enum PressureScalecustomary,metric;union BarometricPressure switch (PressureScale) case customary :float Inches;case metric :default:short CCs;在以上示例中,如果识别名称是metric,或者使用了不能识别的识别名称值,那么short CCs就是活动的。如果识别名称是customary,那么float成员Inches是活动的。联合 成员可以是任何类型,包括用户定义的复杂类型。识别名称类型必须是整数类型(short、 long、 long long 等,以及 char、 boolean 或 enumeraton)。回页首常数定义在IDL中定义常数的语法和语意与C+一样。常数可以是整数、字符、浮点数、字符串、 Boolean、octet或枚举型,但不能是any类型或用户定义的类型。这里有一些例子:const float MeanDensityEarth = 5.522;/ g/cm人3const float knot = 1.1508;/ miles per hourconst char NUL = 0;可以用十进制、十六进制或八进制记数法定义整数常数:const long ARRAY_MAX_SIZE = 10000;const long HEX_NUM = 0xff;对于指数和小数,浮点字符使用常用的C+约定:字符和字符串常数支持标准换码序列:const char TAB = t; const char newline = n;只要没有混合的类型表达式,就可以在常数说明中使用算术运算符。回页首用户异常IDL允许创建异常来指出错误条件。IDL用户异常类似于一个结构,在这个结构中,异常可 以包含所选类型的任意多错误信息。最终是从方法中使用异常。这里有一个例子: exception divide_by_zero string err;interface someiface long div(in long x, in long y) raises(DiviDE_BY_ZERO);;异常将创建名称空间-因此,异常中的成员名必须是唯一的。异常不能当作用户定义类型 的数据成员使用。OMGIDL中没有异常继承。冋页首数组、序列和字符串每次只传送一个元素是可以的,但我们通常有一个列表或向量或矩阵的信息要在客户机和服 务器之间来回传送。数组几乎是所有编程语言所共有的类型,但一种语言的数组与另一种语 言的数组实现通常是不同的。OMGIDL开发者面临的挑战是创建一组数组类型,它可以轻 易地被映射到实现语言中。这种需求产生了 IDL array和sequence。string类型 是一种特殊的序列,它允许语言使用它们的字符串库和优化。数组OMG IDL有任意元素类型的多维固定大小的数组。所有数组都必须是有界的。数组非常适 合于与拥有固定数量元素的列表一起使用,而这些元素通常都是存在的。例如:/ bounded and unbounded array examples typedef long shares1000;typedef string spreadsheet100100;struct ofArrays long anArray1000;/ unbounded arrays NOT allowed/ typedef long orders;必须指定数组维数,并且它们必须为正的整型常量来表示。IDL不支持在C和C+中的 开放数组,这是因为没有指针支持。必须出现typedef关键字,除非指定的数组是结构 的一部分。在许多实例中,CORBA规范所没有提及的内容与它提及的内容是一样重要的。规范不以 任何方式、形态或形式指定数组下标编排方法。这表示从一种实现语言到另一种实现语言的 数组下标可以是不同的,这样您不能假定将数组下标从客户机发送到服务器时,服务器会调 整并指向正确的数组元素。某些语言的数组下标从0开始,而其它的则是从1开始。序列在开发接口定义时,会大量使用序列。如果正在处理数据数组,其中许多值相同,那么序列 就可以提供灵活性。序列是变长向量,它有两个特征:元素的最大大小,在编译时确定,可以是无限的;长度, 在运行时确定。序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。 序列可以是有界的,也可以是无界的。例如:/ bounded and unbounded sequence examplestypedef sequence Unbounded;typedef sequence Bounded;一个无限序列可以拥有任意多个元素,只会受到平台内存大小的限制。有限序列则有边界限 制。这两种序列都可以不包含元素、用户定义的类型,但可以包含其它序列。string 和 wstringstring等价于char的序而wstring 表示wchar的序列。作为C和C+的 折衷,OMG IDL string和wstring可以包含任何字符,除空字符以外。char或wchar约定确定了类型为string的元素大小由8个字节表 示,wstring类型的元素大小是16个字节或更多。回页首名称和作用域IDL中的字符串很特殊,然而在大多数语言中字符串都很特殊。许多语言都用库和特殊优化 来处理字符串处理。通过将字符串归到它自己的类型,OMG允许语言映射使用特殊优化, 这些优化不会与通用序列一起处理。所有OMG IDL标识都是区分大小写的。这意味着将把两个只有字符大小写不同的标识看作 是彼此的重新定义。应该注意根据区分大小写的语言,所有的定义引用必须与定义的大小写 相同。IDL作用域规则非常易于掌握。整个OMG IDL内容和通过预处理器伪指令传入的所有文件 共同组成了命名作用域。任何未出现在某个作用域中的定义都是全局作用域的一部分-只有 一个全局作用域。在全局作用域中,以下定义组成了作用域:module、interface、 struct、 union、 operation 和 exception。module关键字用于创建名称空间;这是其唯一目的。您定义的模块将创建一个逻辑组, 模块的自由使用防止了全局名称空间的污染。根或全局空间被认为是空的,文件扫描中每次 遇到模块关键字时,字符串:和其标识都会附加到当前根的名称后面。这就可以通过包 括其它名称作用域来引用其它模块中的类型,如以下示例中的 Pennsylvania:river。一个标识可以在一个作用域中定义一次,但可以在嵌套作用域中重新定义。下例将解释这些 要点:module States / error: redefinition/ typedef sequence states;module Pennsylvania typedef string river; interface Capital void visitGovernor();module NewYork interface Capital void visitGovernor();interface Pennsylvania void visit();module NewJersey typedef Pennsylvania:river NJRiver;/ Error/ typedef string Pennsylvania; interface Capital void visitGovernor();每个内部模块(Pennsylvania、New York 和New Jersey ) 都有一个接 口 Capital和一个操作visitGovernor()。但它们并不相互牵连,因为它们在各 自的模块中。当我们尝试在模块States中创建一个同名序列时,遇到了一个重新定义 State的问题。重新定义Pennsylvania发生在已经将它介绍为New Jersey中 NJRiver的作用域解析标识之后。请注意,我们在带有接口 Pennsylvania的New York模块中没有发生错误,因为通过某些作用域解析标识介绍外部Pennsylvania模 块。回页首接口现在该定义接口了,它是我们学习OMG接口定义语言的首要原因。有一个好方法来理解 IDL接口:它指定了服务实现和使用它的客户机之间的软件约定。让我们开始定义接口吧, 这将运用我们所学到的IDL知识。由于这一切都与通信有关,就让我们看一些定义 Listener 和 Speaker 的 IDL。 Listener 必须连接至Speaker,然 后Speaker将消息传送给Listener。这是一个回调的例子。/ Thrown by server when the client passes/ an invalid connection id to the serverexception invalidConnectionidExceptionlong invalidId;/ This is the callback interface that/ the client has to implement in order/ to listen to a talker.interface Listener/ Called by the server to dispatch messages on the clientvoid listen(in string message);/ Called by the server when the connection/ with the client is successfully openedvoid engage(in string person);/ Called by the server when the connection with the client is closed void disengage(in string person);/ interface on the server sideinterface Speaker/ Called by the client to open a new connection/ Returned long is the connection IDlong register(in Listener client, in string listenerName);/ Makes the server broadcast the message to all clientsvoid speak(in long connectionId, in string message)raises(InvalidConnectionIdException);/ Called by the client to sever the communicationvoid unregister(in long connectionId)raises(InvalidConnectionIdException);使用这个定义,我们定义了两个新的CORBA接口类型:Listener和Speaker。每 个接口都有一些方法,它们将由连接的另一端使用。客户机将通过获取对实现Speaker接 口的服务器对象的初始对象引用来启动连接。这个对象引用可以传送给客户机,或者可以从 命名服务中检索到这个引用。最重要的是,客户机首先联系Speaker。接着,客户机 (即Listener,因为它实现Listener接口)必须注册到Speaker,并将引用传 给Listener接口。这就使它们可以从Speaker处接收到消息。要注意的一点是在register方法中Listener接口被当作一个类型使用。接口名称变成 了类型,可以当作参数传送。看上去就像在传送Listener对象,但实际是一个对象引用。 这是提供位置透明性的CORBA模型的另一个示例。有一点值得注意,每个对象引用(IOR)仅指向一个接口。每个接口都披露一个或多个分布式 对象的详细信息。我说“一个或多个”是因为可以有几千个对象实现分布式系统中的同一个接 口。在这个示例中,Speaker可以将消息发送到几千个Listeners。因而在某种程 度上,IDL接口对应于类定义,CORBA对象对应于类实例。回页首结束语对于OMG IDL,我只是介绍了其的皮毛。显而易见,OMG IDL提供了一组内容丰富的内 置类型和关键字,它们可以用来为与分布式系统中的对象的交互创建严密的描述。由于这种 语言类似于C语言,您应该了解所有使C语言变得如此成功的描述功能。所有OMG服 务定义都是用IDL编写的,证明OMG IDL的强大功能。所有垂直市场标准化努力(Financial、CORBAMed等)都是用IDL编写的,这证明了其灵活性。学习正确和有效地使用OMG IDL是您开始学习CORBA和编写优秀的分布式系统的良好 起点。每件事都从IDL开始,如果您在项目开始时正确运用了 IDL,那么您成功的机会会 成倍增长。参考资料 您可以参阅本文在developerWorks全球站点上的英文原文. 请阅读上个月的CORBA连接专栏文章接触CORBA内幕:IOR、GIOP和IIOP 从OMG网站了解更多关于OMG IDL和CORBA的信息。 请阅读 Michi Henning 和 Steve Vi noski 的优秀著作 Advan ced CORBA Programming with C+ 从 Object Oriented Concepts: Inc.下载 Orbacus。 从 Bruce Eckel 的 M 和 Thinking in C+第二版中学习 C 和 C+ 编 程知识。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!