ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:29.29KB ,
资源ID:7074931      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7074931.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OMG IDL接口定义语言.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OMG IDL接口定义语言.docx

1、OMG IDL接口定义语言 developerWorks 中国 Java technology 文档库OMG 接口定义语言定义分布式服务的能力Dave Bartlett(dbartlett), 顾问、作家和讲师简介:一切都要从接口定义语言 (IDL) 开始。当我们采用 RPC 或 COM 技术以及 CORBA 技术来编写分布式系统时都需要它。在各种情况下,接口定义语言提供了将对象的接口与其实现分离的能力。IDL 提供了抽象,它提供了将事务与其具体实现分离的概念。它还为我们提供了一套通用的数据类型使得我们可以使用它们来定义更为复杂的类型。我们将采用所有这些数据类型来定义分布式服务的功能。IDL

2、的另一个好处是它剥离了编程语言和硬件的依赖性。本文探讨了 OMG IDL 的内置类型和关键字。发布日期:2000 年 9 月 01 日级别:初级访问情况 :1696 次浏览评论:0(查看|添加评论- 登录)平均分 (4个评分)为本文评分IDL是一种规范语言。它允许我们从实现中剥离对象的规范(如何与它交互)。这是一个约定:“客户机女士,如果您要调用这个方法,请传送这些参数,然后我,服务器先生,将把这个字符串数组返回给您。”使用这个接口的客户机程序员不知道接口背后的实现细节。OMG IDL 看上去很像 C语言。这就很容易将这两种语言以及它们的关键字做比较。但是,这种相似性只流于表面。每种语言的目的

3、是完全不同的。我们在讨论这种语言时,您已经记住OMG IDL 的目的是定义接口和精简分布对象的过程。IDL 基本类型OMG接口定义语言有一些看上去应该很熟悉的基本类型。以下就是这些内置类型的表:表 1. IDL基本类型类型范围最小大小(以位为单位)short-215到215-116unsignedshort0 到216-116long-231到231-132unsignedlong0 到232-132long long-263到263-164unsigned longlong0 到264-164floatIEEE单精度32doubleIEEE双精度64longdoubleIEEE双字节扩展浮点

4、数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)的整数类型。所有这些整数类

5、型都有相应的无符号数类型。这对于 Java程序又产生了问题,因为 Java 编程语言不支持无符号数类型。尽管这不是OMG IDL 的特性,它还是在 Java-to-IDL的映射中创建了一种独有的局面,我们将在下个月的专栏文章中讨论Java-to-IDL 的映射。但在此之前,您已经考虑如何将 IDL 中的unsigned short映射成一种 Java 类型。使用 Javashort还是 Javaint?它们各自的利弊是什么?这些是语言映射的作者必须努力解决的问题,并且这是一个很好的练习,可以帮助您为阅读下一篇专栏文章做好准备。浮点类型OMG IDL 浮点数类型float、double和long

6、 double遵循 IEEE 754-1985二进制浮点数算术的标准。目前,long double用于巨大数字,您也许会发现您的特殊语言映射还不支持这种类型。char 和 wchar我们都使用相同的术语,字符集就是字母或其它构成单词的字符以及其它本机语言或计算机语言的基本单元的集合。编码字符集(或代码集)是一组明确的规则,它建立了字符集和集合的每个字符与其位表示法之间的一一对应关系。处理char时,必须记住 OMG IDL必须分两个层次处理字符集。首先必须明确规定从哪个字符集生成 IDL定义。词法约定(表示 IDL 文件的关键字、注释和文字的字符记号)规定ISO 8859.1 字符集表示 ID

7、L 文件中的字符。是的,连 IDL都必须有一个标准字符集,它将构建在这个字符集上。ISO 464定义了空字符(null)和其它图形字符。接着,OMG必须处理从一个计算机系统到另一个计算机系统之间的字符传输。这意味着可能涉及到从一个字符代码集到另一个字符代码集的转换,这取决于语言绑定。在上个月的专栏文章中,我们对Orbacus Object Reference 执行了 IORDump操作,并且发现了以下信息:Native char codeset: ISO 8859-1:1987; Latin Alphabet No. 1Char conversion codesets: X/Open UTF-

8、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 1 ISO 8859-1:1987; Latin Alphabet No. 1 X/Open UTF-8; UCS Tr

9、ansformation Format 8 (UTF-8) ISO 646:1991 IRV (International Reference Version) 可以看到,IOR可以包含代码集信息,以在转换时协调首选代码集和可用代码集。解决了所有问题后,您应该知道 OMG IDLchar是一个 8位变量,可以用两种方法表示一个字符。首先,它可以从面向字节的代码集编码单字节字符,其次,当在数组中使用时,它可以从多字节字符集(如Unicode),编码任何多字节字符。Wchar只允许大于 8个字节的代码集。规范不支持特殊的代码集。它允许每个客户机和服务器使用本机的代码集,然后指定如何转换字符和字符串

10、,以便在使用不同代码集的环境之间进行传输。Boolean这里没有什么可以多说的 - Boolean 值只能是 TRUE 或 FALSE。Octetoctet是 8 位类型。因为保证了octet在地址空间之间传送时不会有任何表示更改,因此这就使它变成了一种非常重要的类型。这就表示您可以发送二进制数据,并且知道当将它打包时,它的形式仍然相同。其它每种IDL 类型在传输时都有表示变化。例如,根据 IOR代码集信息的指示,char数组会经历代码集转换。而octet数组却不会。any 类型IDLany是一种包含任何数据类型的结构。该类型可以是char或long long或string或另一种any,或者

11、是已经创建的一种类型,如Address。any容器由类型码和值组成。类型码描述any的值部分中的内容是什么。如果您拥有 C+ 经验,则可以将any看作是自我描述的数据类型,它类似于void*,但更安全。如果有 Visual Basic 经验,可以将any看作类似于variant。当我们讨论IDL-to-Java 映射时,any类型的结构和它如何对用户定义的类型产生作用将变得一目了然。回页首用户定义的类型基本类型是必不可少的;它们为接口定义提供了构件块。OMG IDL为您提供了定义您自己的类型的能力,这可以帮助减少复杂程度并且让您可以根据基本类型组成更精巧的数据类型。这些复杂的类型可以是枚举、结

12、构和联合,或者您可以使用typedef来创建类型的新名称。命名的类型应该使用typedef创建新的类型名称,这将帮助解释接口或保存输入。例如,您也许想在方法PresentWeather(., in floatPressure, .)中传送气压值。如果在该方法中使用typedeffloat语句,这将使该方法更具可读性。typedef float AtmosPressure; 在 C+ 中,typedef关键字表示类型定义,实际上别名也许是更为精确的术语。对于OMG IDL,也许是这样,也许不是,这取决于其所映射到的实现语言。CORBA规范不保证short的两种typedef是兼容的和可互换的。在

13、文体上,应注意不要为现有类型创建别名。您应该尝试创建不同概念的类型,它将为您的IDL添加可读性和可扩展性。最好是明确定义一次逻辑类型,然后在整个接口中不断使用该定义。枚举OMG IDL枚举是将名称附加到数字的一种方法,从而读取代码的人就可以了解到更多的含义。OMGIDL 版的枚举看上去象 C+ 版本的枚举。enum CloudCovercloudy, sunny; CloudCover现在就成为可以在 IDL中使用的一种新类型。由于在一个枚举中可以有最多 232个标识,OMG IDL 保证枚举被映射到至少 32位的类型。规范中没有规定标识的有序数值,但它规定了将保持顺序。因此,不能假设clou

14、dy永远拥有序数值 0 - 某些语言映射可能将 1赋值给它。但可以确保cloudy小于sunny。如果认为 IDL的目的是定义跨各种系统的接口,那么不指定序数值是明智的。您只将值发送到服务器。即,cloudy。在服务器空间中,cloudy可以由 0、1或如何实现语言规定的值表示。某些实现语言不允许您控制序数值,而 C+允许。OMG IDL 不允许空的枚举。结构struct关键字提供了将一组变量集中到一个结构的方法。一旦创建了,struct表示可以在整个接口定义中被使用的新类型。struct Date short month; short day; long year; 定义struct时,要确

15、保所创建的类型是可读的。不要在不同的名称空间中创建几个不同的同名结构,这只会使IDL 的用户搞糊涂。识别联合OMG CORBA 规范将 IDL 联合描述成 C 联合类型和 switch语句的混合物。IDL识别联合必须有一个类型标记字段用于确定在当前实例中使用哪个联合成员。像C+一样,一次只能有一个联合成员是活动的,并且可以从其识别名称来确定该成员。enum PressureScalecustomary,metric;union BarometricPressure switch (PressureScale) case customary : float Inches; case metric

16、 : default: short CCs; 在以上示例中,如果识别名称是metric,或者使用了不能识别的识别名称值,那么short CCs就是活动的。如果识别名称是 customary,那么float成员Inches是活动的。联合成员可以是任何类型,包括用户定义的复杂类型。识别名称类型必须是整数类型(short、long、long long等,以及char、boolean或enumeraton)。回页首常数定义在 IDL 中定义常数的语法和语意与 C+一样。常数可以是整数、字符、浮点数、字符串、Boolean、octet或枚举型,但不能是any类型或用户定义的类型。这里有一些例子:cons

17、t float MeanDensityEarth = 5.522; / g/cm3const float knot = 1.1508; / miles per hourconst char NUL = 0; 可以用十进制、十六进制或八进制记数法定义整数常数:const long ARRAY_MAX_SIZE = 10000;const long HEX_NUM = 0xff; 对于指数和小数,浮点字符使用常用的 C+ 约定:const double SPEED_OF_LIGHT = 2.997925E8;const double AVOGADRO = 6.0222E26; 字符和字符串常数支持

18、标准换码序列: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); 异常将创建名称空间 -因此,异常中的成员名必须

19、是唯一的。异常不能当作用户定义类型的数据成员使用。OMGIDL 中没有异常继承。回页首数组、序列和字符串每次只传送一个元素是可以的,但我们通常有一个列表或向量或矩阵的信息要在客户机和服务器之间来回传送。数组几乎是所有编程语言所共有的类型,但一种语言的数组与另一种语言的数组实现通常是不同的。OMGIDL开发者面临的挑战是创建一组数组类型,它可以轻易地被映射到实现语言中。这种需求产生了IDLarray和sequence。string类型是一种特殊的序列,它允许语言使用它们的字符串库和优化。数组OMG IDL有任意元素类型的多维固定大小的数组。所有数组都必须是有界的。数组非常适合于与拥有固定数量元素

20、的列表一起使用,而这些元素通常都是存在的。例如:/ bounded and unbounded array examplestypedef long shares1000;typedef string spreadsheet100100;struct ofArrays long anArray1000;/ unbounded arrays NOT ALLOWED/ typedef long orders; 必须指定数组维数,并且它们必须为正的整型常量来表示。IDL 不支持在C 和 C+ 中的开放数组,这是因为没有指针支持。必须出现typedef关键字,除非指定的数组是结构的一部分。在许多实例中

21、,CORBA规范所没有提及的内容与它提及的内容是一样重要的。规范不以任何方式、形态或形式指定数组下标编排方法。这表示从一种实现语言到另一种实现语言的数组下标可以是不同的,这样您不能假定将数组下标从客户机发送到服务器时,服务器会调整并指向正确的数组元素。某些语言的数组下标从0 开始,而其它的则是从 1 开始。序列在开发接口定义时,会大量使用序列。如果正在处理数据数组,其中许多值相同,那么序列就可以提供灵活性。序列是变长向量,它有两个特征:元素的最大大小,在编译时确定,可以是无限的;长度,在运行时确定。序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。序列可以是有界的,也可以是无界的。

22、例如:/ bounded and unbounded sequence examplestypedef sequence Unbounded;typedef sequence Bounded; 一个无限序列可以拥有任意多个元素,只会受到平台内存大小的限制。有限序列则有边界限制。这两种序列都可以不包含元素、用户定义的类型,但可以包含其它序列。string 和 wstringstring等价于char的序列,而wstring表示wchar的序列。作为 C 和 C+的折衷,OMG IDLstring和wstring可以包含任何字符,除空字符以外。char或wchar约定确定了类型为string的元素

23、大小由 8 个字节表示,wstring类型的元素大小是 16个字节或更多。回页首名称和作用域IDL中的字符串很特殊,然而在大多数语言中字符串都很特殊。许多语言都用库和特殊优化来处理字符串处理。通过将字符串归到它自己的类型,OMG允许语言映射使用特殊优化,这些优化不会与通用序列一起处理。所有 OMG IDL标识都是区分大小写的。这意味着将把两个只有字符大小写不同的标识看作是彼此的重新定义。应该注意根据区分大小写的语言,所有的定义引用必须与定义的大小写相同。IDL 作用域规则非常易于掌握。整个 OMG IDL内容和通过预处理器伪指令传入的所有文件共同组成了命名作用域。任何未出现在某个作用域中的定义

24、都是全局作用域的一部分-只有一个全局作用域。在全局作用域中,以下定义组成了作用域:module、interface、struct、union、operation和exception。module关键字用于创建名称空间;这是其唯一目的。您定义的模块将创建一个逻辑组,模块的自由使用防止了全局名称空间的污染。根或全局空间被认为是空的,文件扫描中每次遇到模块关键字时,字符串:和其标识都会附加到当前根的名称后面。这就可以通过包括其它名称作用域来引用其它模块中的类型,如以下示例中的Pennsylvania:river。一个标识可以在一个作用域中定义一次,但可以在嵌套作用域中重新定义。下例将解释这些要点:m

25、odule 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; /

26、 Error / typedef string Pennsylvania; interface Capital void visitGovernor(); ; ; 每个内部模块(Pennsylvania、New York和New Jersey)都有一个接口Capital和一个操作visitGovernor()。但它们并不相互牵连,因为它们在各自的模块中。当我们尝试在模块States中创建一个同名序列时,遇到了一个重新定义State 的问题。重新定义Pennsylvania发生在已经将它介绍为New Jersey中 NJRiver的作用域解析标识之后。请注意,我们在带有接口Pennsylvani

27、a的New York模块中没有发生错误,因为通过某些作用域解析标识介绍外部Pennsylvania模块。回页首接口现在该定义接口了,它是我们学习 OMG接口定义语言的首要原因。有一个好方法来理解 IDL接口:它指定了服务实现和使用它的客户机之间的软件约定。让我们开始定义接口吧,这将运用我们所学到的IDL 知识。由于这一切都与通信有关,就让我们看一些定义Listener和Speaker的IDL。Listener必须连接到Speaker,然后Speaker将消息传送给Listener。这是一个回调的例子。/ Thrown by server when the client passes/ an i

28、nvalid connection id to the serverexception InvalidConnectionIdException long 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 client void listen(in string message); / Ca

29、lled by the server when the connection / with the client is successfully opened void 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 co

30、nnection / Returned long is the connection ID long register(in Listener client, in string listenerName); / Makes the server broadcast the message to all clients void speak(in long connectionId, in string message) raises(InvalidConnectionIdException); / Called by the client to sever the communication void unregister(in lo

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1