为什么使用idl语言描述接口,数据体系结构描述语言

博客访问: 2610171
博文数量: 698
博客积分: 10
博客等级: 民兵
技术积分: 11080
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
IDL接口定义语言
也叫“接口描述语言”(Interface Description Language),是一个描述软件组件接口的语言规范。
IDL用中立语言的方式进行描述,能使软件组件(不同语言编写的)间相互通信。
IDL通常用于RPC(Remote Procedure Call,远程过程调用)软件。
IDL提供了一个“桥”来连接不同的系统。
基于IDL的软件系统包括:
Sun公司的ONC RPC,
The Open Group的Distributed Computing Environment(分布式计算环境),
IBM的System Object Model(系统对象模型),
OMG组织的CORBA,
Facebook公司的Thrift,
用于Web Service的WSDL。
IDL Specification Language
类似于其它的接口描述语言,IDL以独立于语言和硬件的方式来定义接口,允许组件间的接口规范采用不同语言编写,通过RPC可以执行在不同的机器上。
Java IDL把CORBA的能力移植到Java平台,提供了基于标准的互操作能力和连通性。Java IDL使分布式带Web功能的Java应用程序能够透明地调用使用业界标准的OMG IDL的远程网络服务。
Java IDL技术是基于接口的,定义在CORBA IDL之上,为想使用Java编程语言的CORBA程序员进行编程的。这就是“Business as usual”(照常营业,一切正常)的CORBA编程,支持Java技术,同样也支持C++或COBOL。
微软的IDL(MIDL)定义客户端和服务器程序间的接口。MIDL包括用于平台SDK的MIDL编译器,使开发人员能够创建IDL文件和远程过程调用RPC接口和COM/DCOM接口所需的应用程序配置文件ACF。
MIDL能用于所有基于Windows操作系统的C/S应用程序,还能用于异构(heterogeneous)网络环境的C/S应用程序,如Unix和Apple。微软为RPC互操作能力,支持Open Group(开放组织)的DCE标准。
要使用带RPC的MIDL,熟悉C/C++编程和RPC范例是必须的。当使用带COM的MIDL,熟悉C++编程和应用于COM的RPC范例是必须的,熟悉OLE自动建模脚本和典型库也是必须的。
阅读(456) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。3170人阅读
Windows/Unix/操作系统(19)
一、首先要清楚一点,使用IDL只是定义COM接口的一种方法(用C++也可以定义)。
IDL是一种语言,Microsoft Visual C++提供了MIDL工具,可以将IDL文件编译成C/C++兼容的接口描述头文件(.h)。
如下是用IDL写的一个IcwElement接口
uuid(4E-4a3d-A1F0-150A50E402BB),
helpstring(&IcwElement Interface&),
pointer_default(unique)
interface IcwElement : IUnknown
[propget, helpstring(&属性 Type&)] HRESULT Type([out, retval] BSTR * type);
[propget, helpstring(&property Visible&)] HRESULT Visible([out, retval] VARIANT_BOOL* pVal);
[propput, helpstring(&property Visible&)] HRESULT Visible([in] VARIANT_BOOL newVal);
[propget, helpstring(&属性 Modified&)] HRESULT Modified([out, retval] VARIANT_BOOL* pVal);
[propput, helpstring(&属性 Modified&)] HRESULT Modified([in] VARIANT_BOOL newVal);
};其中有一些关键字可以参考MSDN:
使用MIDL编译后得到相应的C/C++代码如下:
EXTERN_C const IID IID_IcwE
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE(&4E-4a3d-A1F0-150A50E402BB&)
IcwElement : public IUnknown
virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Type(
/* [retval][out] */ BSTR *type) = 0;
virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Visible(
/* [retval][out] */ VARIANT_BOOL *pVal) = 0;
virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Visible(
/* [in] */ VARIANT_BOOL newVal) = 0;
virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Modified(
/* [retval][out] */ VARIANT_BOOL *pVal) = 0;
virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Modified(
/* [in] */ VARIANT_BOOL newVal) = 0;
/* C style interface */
可见,生成的是C++代码,定义了一个抽象类,并有五个函数。函数名,参数,返回值,以及这个接口的GUID都是根据IDL文件自动生成的。
并且注意,生成的IcwElement类中是没有成员变量的,而成员变量的定义放在实现此接口的类中。
二、IDL中的接口一经修改,则需要改几个地方。由于接口改了,自动生成的.h文件也被修改,而因为其成员函数被写成纯虚函数,因而实现(继承)此接口的具体类处也必须实现这些纯虚成员函数。幸好,VS提供了工具自动完成这一套,我们只需向IDL的接口中添加属性,实现此接口的类便自动添加了相应的方法(put和get),当然具体类的成员变量需要自己添加。
1. 《COM原理与应用》——潘爱民
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:126924次
积分:2224
积分:2224
排名:第13165名
原创:96篇
(1)(1)(5)(14)(44)(3)(2)(2)(1)(26)(1)hadoop权威指南笔记(5)
也叫“接口描述语言”(Interface Description Language),是一个描述软件组件接口的语言规范。 IDL用中立语言的方式进行描述,能使软件组件(不同语言编写的)间相互通信。 IDL通常用于RPC(Remote Procedure Call,远程过程调用)软件。 IDL提供了一个“桥”来连接不同的系统。
基于IDL的软件系统包括:
Sun公司的ONCRPC,
The Open Group的DistributedComputing Environment(分布式计算环境),
IBM的SystemObject Model(系统对象模型),
OMG组织的CORBA,
Facebook公司的Thrift,
用于WebService的WSDL。
IDL Specification Language
类似于其它的接口描述语言,IDL以独立于语言和硬件的方式来定义接口,允许组件间的接口规范采用不同语言编写,通过RPC可以执行在不同的机器上。
Java IDL把CORBA的能力移植到Java平台,提供了基于标准的互操作能力和连通性。Java IDL使分布式带Web功能的Java应用程序能够透明地调用使用业界标准的OMG IDL的远程网络服务。
Java IDL技术是基于接口的,定义在CORBA IDL之上,为想使用Java编程语言的CORBA程序员进行编程的。这就是“Business as usual”(照常营业,一切正常)的CORBA编程,支持Java技术,同样也支持C++或COBOL。
IDL(Interface Definition Language)即接口定义语言,是CORBA规范的一部分,是跨平台开发的基础。IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。可变化 IDL 基本类型 整数类型 OMG IDL 摒弃int 类型在不同平台上取值范围不同带来的多义性的问题。常数定义常数可以是整数、字符、浮点数、字符串、Boolean、octet 或枚举型,不能是 any 类型或用户定义的类型。OMG IDL数组类型IDL array 和sequence,可以轻易地被映射到实现语言中。序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。
OMG IDL文件概述
  从本质上讲,OMG IDL接口定义语言不是作为程序设计语言体现在CORBA体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口的语言。OMG IDL文件描述数据类型和方法框架,而服务对象则为一个指定的对象实现提供上述数据和方法。
  OMG IDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。在大多数CORBA产品中都提供IDL到相关编程语言的编译器。程序设计人员只需将定义的接口文件输入编译器,设定编译选项后,就可以得到与程序设计语言相关的接口框架文件和辅助文件。
IDL文件应用过程如图1所示。
图1OMG IDL文件编译过程&
在语法规则方面,类似于C++或Java中关于接口或对象的定义,OMG IDL增加了一些构造方法支持IDL特有的方法调用机制。OMG IDL只是一种说明性的语言,支持C++语法中的常量、类型和方法的声明。采用OMG IDL这样的说明性语言,其目的在于克服特定编程语言在软件系统集成及互操作方面的限制,这正是CORBA的诱人之处,同样也体现出采用CORBA构造分布式应用程序在网络时代的强大生命力。OMG IDL已经为C、C++、Java等主要高级程序设计语言制定了IDL到高级编程语言的映射标准。项目开发人员可以根据需要选择自己最熟悉的编程语言来独立开发基于CORBA的应用,而对软件系统的互操作能力不产生影响。
OMG IDL的语法规则
1. OMG IDL文件举例
  module Compute
  interface PI
  { double getResult( in radiusaRadius, in times time); }
  上述接口定义文件主要用于客户端向服务对象提出请求:计算π值。因此,模块中定义了一个方法getResult(),以圆的直径(aRadius)和迭代次数(times)作为该方法的输入参数。
2. OMG IDL词法规则
  OMG IDL采用ASCII字符集构成接口定义的所有标识符。标识符由字母、数字和下划线的任意组合构成,但第一个字符必须是ASCII字母。IDL认为大写字母和小写字母具有相同的含义,例如anExample和AnExample是相同的。
与C++和Java类似,采用以“/*”开始,以“*/”结束来注释一段代码,以“//”开始注释从“//”开始直至行尾的所有内容。
  另外,IDL保留了47个关键字,程序设计人员不能将关键字用作变量或方法名。需要注意的是关键字的大小写,例如:
  //错误:定义的变量context是关键字
  typedef double CONTEXT;
  //错误:CONTEXT与关键字context冲突
3. 数据类型
  (1)基本数据类型:OMG IDL基本数据类型包括short、long和相应的无符号(unsigned)类型,表示的字长分别为16、32位。
  (2)浮点数类型:OMG IDL浮点数类型包括float、double和longdouble类型。其中float表示单精度浮点数,double表示双精度浮点数,long double表示扩展的双精度浮点数。
  (3)字符和超大字符类型:OMG IDL定义字符类型char为面向字节的码集中编码的单字节字符; 定义类型wchar为从任意字符集中编码的超大字符。
  (4)逻辑类型:用boolean关键字定义的一个变量,取值只有true和false。
  (5)八进制类型:用octet关键字定义,在网络传输过程中不进行高低位转换的位元序列。
(6)any数据类型:引入该类型用于表示OMG IDL中任意数据类型。
  OMG IDL用const关键字声明一个常量,用于模块(module)或接口(interface)中定义保持不变的量,如:
  const double PI = 3.1415926;
  在IDL中,可以定义long、unsigned long、unsigned short、char、boolean、float、double、string类型的常量。
5. 构造数据类型
  类似于C和C++的语法规则,OMG IDL中构造数据类型包括结构、联合、枚举等形式。如下例:
(1)结构类型:
  typedef long GoodsN
  struct
  { GoodsN
(2)联合类型:
  union stockIn switch( short )
  { case 1: stocker :
  case 2: goodsName1 :
  case 3: goodsName2 : }
(3)枚举类型:
  enum GoodsStatus { GOODS_SALED,GOODS_INSTOCK};
6. 数组类型
  OMG IDL的数组类型提供了多维定长、统一数据格式的数据存储方式——数组。每一维的长度必须在定义时给定,所有数据单元必须存储相同类型的元素。如下例定义一个长度为20×100的整数数组:
  typedef long aDimension[20][100];
7.模板(template)类型
  OMG IDL提供两种类型的模板:
(1) 序列(sequence)类型:
  用该方法定义长度可变的任意数值类型的存储序列,通常在定义时可以指定长度,也可以不指定,如:
  typedef sequence &long,80& aS
  //长度定义为80
  typedef sequence &long&anotherS
  //长度不定
(2) 字符串(string)序列:
  同样对于字符串序列类型,也有两种定义方式:
  typedef string &80& aN//长度定义为80
  typedef string anotherN //长度不定
8.接口(interface)
  在前几讲中,均提到了CORBA接口,接口作为服务对象功能的详细描述,封装了服务对象提供服务方法的全部信息,客户对象利用该接口获取服务对象的属性、访问服务对象中的方法。
  接口用关键字interface声明,其中包含的属性和方法对所有提出服务请求的客户对象是公开的,如下例:
  interface JobManager
  { readonly attribute stringFirstN
  string QueryJobStatus( in longNumber, out string property); }
CORBA(CommonObject Request Broker Architecture公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。或者说CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。
  OMG组织成立后不久就制订了OMA(ObjectManagement Architecture,对象管理体系结构)参考模型,该模型描述了OMG规范所遵循的概念化的基础结构。OMA由对象请求代理ORB、对象服务、公共设施、域接口和应用接口这几个部分组成,其核心部分是对象请求代理ORB(ObjectRequest Broker)。对象服务是为使用和实现对象而提供的基本服务集合;公共设施是向终端用户应用程序提供的一组共享服务接口;域接口是为应用领域服务而提供的接口;应用接口是由开发商提供的产品,用于它们的接口,不属于OMG标准的内容。ORB提供了一种机制,通过这种机制,对象可以透明的发出请求和接收响应。分布的、可以互操作的对象可以利用ORB构造可以互操作的应用。
  CORBA标准由对象管理组织(OMG)设立并进行控制,CORBA定议了一系列API,通信协议,和物件/服务信息模型用于使得异质应用程序能够互相操作,这些应用程序用不同的程序语言编写,运行在不同的平台上。CORBA因此为定义明确的物件提供了平台和位置的透明性,这些物件是分布式计算平台的基础。
  CORBA分布计算技术,是由绝大多数分布计算平台厂商所支持和遵循的系统规范技术,具有模型完整、先进,独立于系统平台和开发语言,被支持程度广泛的特点,已逐渐成为分布计算技术的标准。COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理ORB,规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的&软总线&;在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。
  CORBA(公共对象请求代理架构):这是个和微软com,com+齐名的同类软件技术规范,由OMT提出。
  用于在不同进程(程序)之间,甚至是不同物理机器上的进程(程序)之间通讯。底层技术依靠RPC[远程过程调用]实现。
  面向对象的软件,以数据为中心设计,对象类既具有模块的封装性和类属等特性,还具有继承特性
  ,极大地提高了类的可扩充性和可再用能力。对象类较之于传统软件的功能模块而另具有的优点是:
  (1)易于理解,具有完整的语义特征;
  (2)易于扩充和修改,具有较高的通用性和适应性;
  (3)易于构造组装,具有规范的外部接口。
  开发应用组件必须遵循标准,以保证软件组件的互操作性,只有遵循统一的标准,不同厂商的、不同时期的、不同程序设计风格的、不同编程语言的、不同操作系统的、不同平台上的软件或软件部件才能进行交流与合作。为此,OMG(ObjectManageGroup)提供了一个对象标准CORBA,它定义了一个网连对象的接口,使得对象可以同时工作。基于CORBA的对象请求代理ORB为客户机/服务器开发提供了中间件的新格式。
  作为OMG成员的微软公司撇开CORBA而另辟了COM(ComponetObjectModel),即组件对象模型,并把COM定位成基于对象的软件开发模型,尽管COM被认为是微软鼓噪出来的技术,但支持COM的开发工具却不断增多,其中大部分来自于微软,包括VisualBasic和VisualC++。
  公共对象请求代理结构:CORBA标准
  全球性网络使线上的所有设备和软件成为全球共享的浩瀚的资源,计算机环境也从集中式发展到分布式环境,开放式系统的发展使用户能够透明地应用由不同厂商制造的不同机型不同平台所组成的异构型计算资源,因此,分布式处理和应用集成自然而然地成为人们的共同要求,那么什么是分布式处理和应用集成呢?它们的功能和关键技术是什么呢?简单地讲,分布式处理和应用集成就是指在异构的、网络的、物理性能差别很大的、不同厂商的、不同语言的信息资源的基础上构建信息共享的分布式系统,并且能够有效地进行应用系统和分布式处理的集成。分布式处理的关键在于定义可管理的软件构件,即面向对象技术中的“对象”。应用集成的关键在于为跨平台、跨机种、跨编程语言的产品提供统一的应用接口。OMG组织针对当今信息产业的要求,公布了CORBA标准,即公共对象请求代理体系结构(CommonObject
Request Broker Architecture),这是一个具有互操作性和可移植性的分布式面向对象的应用标准。
  CORBA的核心是对象请求代理ORB,它提供对象定位、对象激活和对象通讯的透明机制。客户发出要求服务的请求,而对象则提供服务,ORB把请求发送给对象、把输出值返回给客户。ORB的服务对客户而言是透明的,客户不知道对象驻留在网络中何处、对象是如何通讯、如何实现以及如何执行的,只要他持有对某对象的对象引用,就可以向该对象发出服务请求。
  CORBA允许用户以两种不同的方式提出对象请求:
  1)静态调用:
  通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须在编译时就知道对象及其类型。
  2)动态调用:
  通过ORB的动态调用接口DII,在运行时生成访问对象的代码。
  不管客户以哪一种形式提出请求,ORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。对象执行所请求的服务后,把输出值返回给ORB,然后再由ORB返回给客户。
  CORBA的重要概念是:
  1.对象连接
  CORBA广泛地支持对象的实现,在单服务器系统中也可以实现由接口定义语言定义的接口。ORB的灵活性既可以直接集成已有的应用,又不会使新对象受某些原则的制约。
  对象连接提供了有不同类型对象实现时,使用ORB服务的方法,服务包括:对象引用、方法调用、安全控制、对象实现的激活与静候等。
  2.接口定义语言(IDL)
  CORBA用IDL来描述对象接口,IDL是一种说明性语言,它的语法类似于C++。
  IDL提供的数据类型有:基本数据类型、构造类型、模板类型、和复合类型、操作说明。这些类型可以用来定义变元的类型和返回类型,操作说明则可以用来定义对象提供的服务。
  IDL还提供模块构造,其中可以包含接口,而接口是IDL各类型中最重要的,它除了描述CORBA对象以外,还可以用作对象引用类型。
  IDL提供了接口继承性,派生接口可以继承其基类接口所定义的操作与类型。IDL的接口继承性有其特殊性,此处不赘述。
  总之,CORBA的IDL是一种说明性语言,描述面向对象系统开发所遵循的接口与实现相分离的基本原则。
  3.动态调用接口
  把IDL说明编译成面向对象程序设计语言的实代码后,客户可以调用已知对象的操作。在某些应用中,用户并不了解应用接口编译信息,但也要求调用对象的操作,这时就要动态调用接口来调用用户的操作了。例如,图形用户接口应支持用户浏览接口公共库,以获得每个对象所支持的操作信息,用户可根据自己的需求从浏览对象中挑选出所需的对象操作,具体的对象操作的调用实际上是用动态调用接口来完成的。
  4.接口公用库
  接口公用库持久地存储IDL的接口说明,借助于接口公用库,可以实现对象继承性层次结构的导航,并且提供了有关对象支持的所有操作的描述。接口公用库最常见的功能是为接口浏览器提供信息,帮助应用开发者找出潜在的可重用的软件部件。ORB可以利用接口公用库检查运行时的操作参数类型,但接口公用库的基本功能是提供类型信息,为动态调用接口发送请求提供信息支持。
  CORBA的不足之处:
  尽管有多家供应商提供CORBA产品,但是仍找不到能够单独为异种网络中的所有环境提供实现的供应商。不同的CORBA实现之间会出现缺乏互操作性的现象,从而造成一些问题;而且,由于供应商常常会自行定义扩展,而CORBA又缺乏针对多线程环境的规范,对于像C或C++这样的语言,源码兼容性并未完全实现。
  CORBA过于复杂,要熟悉CORBA,并进行相应的设计和编程,需要许多个月来掌握,而要达到专家水平,则需要好几年。
一、什么是Java IDL
----Java IDL(InterfaceDefinition Language)可实现网络上不同平台上的对象相互之间的交互,该技术基于通用对象请求代理体系结构CORBA规范说明。IDL是不依赖于语言的接口定义语言,所有支持CORBA的语言都有IDL到该语言的映射。就像其名字所表示的那样,Java IDL支持到Java语言的映射。CORBA规范说明和IDL映射是由OMG(ObjectManagement Group)定义的。OMG由700多个成员组成,Sun公司是其成员之一,它在定义IDL到Java映射的工作中起了主要作用。
----JDK1.1给Java开发人员提供了开发100%纯Java分布式应用的功能,即远程方法调用Java RMI。而Java2平台提供的JavaIDL可以在分布式应用中使用非Java语言,也就是说,Java2平台提供的ORB(ObjectRequest Broker)可以和任何遵从CORBA规范的ORB互操作,包括IONAT echnologies的Orbix、Visigenic Software的Visi Broker、IBM的Component Broker等。目前,主要的Web浏览器(MicrosoftIE4.0和NetscapeNavigator4.0)实现的主要是JDK1.1中的功能。不过,利用Sun公司提供的Java插件(Plug-in)可以使浏览器具备Java2平台的所有特征。
----需要说明的是,Java2平台提供了两种不同的方法来构造分布式应用系统,即Java RMI和Java IDL,它们具有相似的特征和功能,Java RMI支持用Java语言写的分布式对象,Java IDL可以与支持CORBA的任何程序设计语言如C、C++、COBOL等写的分布式对象交互。这两种方法各自具有不同的特点:
----(1)100%纯Java和对遗产应用系统(legacy system)的支持。JavaRMI是对分布式应用系统的100%纯Java解决方法,具有Java的&Writeonce, run anywhere&的优点。用JavaRMI开发的应用系统可以部署在任何支持Java运行环境的平台上。
----相反,JavaIDL是基于CORBA规范标准的技术,可以远程调用非Java语言编写的对象,因此Java IDL提供了对那些用非Java语言开发的遗产应用系统的支持。
----(2)使用不同的通信协议。Java RMI和Java IDL目前使用不同的通信协议,Java IDL使用CORBA/IIOP协议,IIOP(InternetInter-ORBProtocol)协议可以使位于不同平台上、用不同语言写的对象以标准的方式进行通信;Java RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信,JRMP是专为Java的远程对象制定的协议,不过Sun和IBM已经宣布将来会支持在RMI中使用IIOP协议,以便和遵从CORBA规范的远程对象通信。
----(3)通过引用调用对象还是通过值调用对象。在Java IDL中,客户端通过引用与远程对象交互,即客户机使用桩(Stub)对远程服务器上的对象进行操作,但并不拷贝服务器上的对象。
----相反,RMI使得客户机可以通过引用和远程对象交互,也可以把远程对象下载到客户机运行环境进行操作,由于在RMI中使用的对象都是Java对象,因此RMI使用Java中的对象串行化(Serialization)功能在服务器和客户机之间传输对象。不过CORBA规范的以后版本将包括按值调用对象的功能。
----Java RMI和JavaIDL各有自己的优缺点,从某种意义上说,RMI可以看作是RPC(Remote Procedure Calls)的面向对象版本。RMI的最大优势是可以用它来提供100%纯Java的解决方案,这意味着构造RMI应用系统将比较简单,但这也正是基于RMI的应用系统的一个缺点,即只能在Java环境中运行,不能充分利用遗产应用系统。
----Java RMI和JavaIDL均可满足一定范围的用户需求,都适用于一定范围的应用,两者之间存在着重叠,有些应用可使用两者中的任何一种技术开发,但对于某些应用来说,采用其中的某一种比采用另一种更为恰当。
二、使用CORBA和JavaIDL
----从1989年以来,OMG一直致力于开放的软件总线体系结构CORBA的规范说明的定义,利用CORBA,不同供应商开发的、运行在不同平台上的构件可以互操作,而不管该对象位于何处,用什么语言实现。Java IDL使得Java也支持CORBA规范说明。作为Java企业计算API的一部分,Java IDL可以保证企业异质计算中的无缝互操作性和可连接性。
----CORBA对象和一般的程序设计语言中的对象的区别在于:
& CORBA对象可以位于网络中的任何位置;
& CORBA对象可以和其他平台上的对象交互;
& CORBA对象可以用任何程序设计语言编写,只要有IDL到该语言的映射即可(目前已包括到Java、C++、C、Smalltalk、COBOL、Ada等语言的映射)。
----接口定义语言IDL用于定义CORBA对象的接口,所有的CORBA对象都支持IDL接口。IDL语法和C++非常类似,利用Java IDL,可以在Java中定义、实现、存取CORBA对象。对于每个IDL,idl to java生成一个Java接口和其他一些必要的.java文件,包括一个客户端桩(Stub)和服务器端骨架(Skeleton)。
----为了使用JavaIDL,需要有idl to java编译器,idl to java产生和任何遵从CORBA规范的ORB一起工作的客户端桩和服务器端骨架,Java2平台中包括CORBAAPI和ORB,使得Java应用系统通过IIOP协议可以调用远程的CORBA对象,JavaORB支持暂态(Transient)CORBA对象,提供了暂态名字服务器把对象组织成树目录结构,名字服务器遵从CORBA中COS规范说明的命名服务规范说明(Naming Service Specification)。
----图1说明了从客户端到服务器发送一个消息请求的过程,其中客户端也可以是一个CORBA对象:
----客户机不需要了解CORBA对象的位置与实现细节,也不需要了解哪个ORB用于存取对象。
----在客户端,应用系统包括远程对象的引用,对象引用使用桩方法作为远程方法的代理,这个方法事实上在ORB中的,所以调用桩方法会调用ORB的连接功能,ORB会把对桩方法的调用传递到服务器端。
----在服务器端,ORB利用骨架代码把远程调用转换成本地对象的方法调用,骨架需要对调用和参数的格式进行转换。同时,当方法返回时,骨架对结果进行变换,然后通过ORB把结果返回给客户机。
----不同的ORB之间通过IIOP协议进行通信,IIOP是建立在TCP/IP之上的协议。
----CORBA目前还处于发展阶段,一些标准还在定义之中,但CORBA中的大部分基本结构已经定义,许多软件供应商已根据CORBA的定义作了很多开发工作,Java IDL就是该规范说明的一个实现。但在Java2平台中,并没有实现CORBA规范说明中的所有特征,如:
& 接口库:在一般的Java IDL操作中并不需要接口库,Java客户机可以存取其他的接口库,如C++ORB提供的接口库;
&RMI/IIOP协议;
& 按值调用对象;
& IDL中的一些类型如wchar、wstring、longdouble等。
三、IDL到Java的映射
----为了使Java支持CORBA规范说明,需要一个把IDL中的元素映射为Java中元素的标准途径,Sun已经制订了两者之间的映射规则,并提供了编译器idl to java,以便从IDL得到相应的桩和骨架。
----下表列出了一些IDL中元素和Java中元素的映射关系。
----和Java中的接口一样,IDL接口不包含方法的具体实现,Java开发人员需在Java类中提供对这些方法的具体实现。
四、使用Java IDL开发应用的过程及实例
----用JavaIDL开发分布式应用系统一般可分为五个步骤:
----1.定义远程接口
----用IDL定义远程对象的接口,使用IDL而不是Java语言是因为idl to java编译器可以自动地从IDL产生Java语言的桩和骨架源文件,以及和ORB连接时所需要的一些代码。使用IDL,开发人员可以用其他语言来实现客户机和服务器。如果要为一个已经存在的CORBA服务实现客户机,或为一个已经存在的客户机实现服务,则首先要给出IDL接口,然后运行idl to java编译器产生桩和骨架,在此基础上再进行实现。
----2.编译远程接口
----在IDL文件运行idl to java编译器,产生Java版本的接口,以及桩和骨架代码文件,这些代码文件使得应用程序可以和ORB相连接。
----3.实现服务器
----把idlto java编译器产生的骨架和服务器应用程序集成在一起,除了要实现远程接口中的方法之外,服务器代码还要包括启动ORB以及等待远程客户机的调用等部分。
----4.实现客户机
----类似地,以桩作为客户端应用程序的基础,客户机建立在桩之上,通过Java IDL提供的名字服务查询服务器,获得远程对象的引用,然后调用远程对象中的方法。
----5.启动应用程序
----一旦实现了服务器和客户机,就可以启动名字服务,接着启动服务器,然后运行客户机。
----下面以一个经典的HelloWorld程序来说明具体的开发过程。HelloWorld包含一个操作,该操作返回一个字符串并打印出来,Client和Server之间的通信过程如下:
----(1)客户端应用程序或小应用程序调用HelloServer的sayHello操作;
----(2)ORB把调用传递到已注册的服务对象;
----(3)服务对象运行sayHello方法,返回一个Java字符串;
----(4)ORB把该字符串返回给客户机;
----(5)客户机打印该字符串的值。
----尽管HelloWorld程序比较简单,但它涉及到的任务和几乎任何一个使用CORBA静态调用的分布式应用系统所涉及到任务相同,图2说明了如何用CORBA在客户机和服务器之间实现经典的&HelloWorld&程序。
----首先是定义Hello.idl,下面是用IDL描述的Hello.idl,只有一个操作(方法),该操作返回一个字符串。
&Module Hello App
&interface Hello
&stringsay Hello ( );
----然后把Hello.idl文件映射为Java源代码文件,用以下命令编译Hello.idl文件:
----idl to javaHello.idl
----根据命令行中的不同选项,idl to java编译器产生不同的文件,上面这条命令将创建子目录HelloApp并在其中产生五个文件:_HelloImplBase.java、_HelloStub.java、Hello.java、HelloHelper.java、HelloHolder.java。
----要完成该应用程序,还要分别在这五个文件的基础上提供服务器端和客户机端的实现。
----CORBA服务器程序的结构和大部分Java应用程序的结构一样,即导入所需要的包,声明服务器类,定义main方法,处理一些例外等。另外,CORBA服务器要有一个ORB对象,每个服务器实例化一个ORB,并向其注册服务对象,因此当ORB接收到调用请求时可以寻找到服务器。最后是服务对象的管理,服务器是一个进程,实例化了一个或多个服务对象,服务对象具体实现接口中说明的操作。HelloServer和命名服务一起工作,使得服务对象对于客户机来说是可用的,服务器需要对名字服务的对象引用,可以向名字服务注册,并保证向Hello接口的调用被路由到其服务对象上,最后是等待客户机的调用。
----CORBA客户机的结构和大部分Java应用程序的结构基本相似,即导入所需要的包、声明应用类、定义main方法、处理一些例外等。另外和服务器程序一样,一个CORBA客户机也需要本地的ORB来执行所有的配置工作,每个客户机实例化一个org.omg.CORBA.ORB对象,然后向该对象传递一些必要的信息以进行初始化,最后是利用ORB取得所需要的服务。一旦一个应用有了ORB,即可通过ORB来确定应用所需要的服务的位置,在本例子中即是Helloserver。为了调用CORBA对象中的操作,客户端应用要有对该对象的引用,有很多种方法可以得到这种引用,如调用ORB.resolve_initial_references或使用其他的CORBA对象(如命名服务),当在分布式环境中没有命名服务可用时,CORBA客户机使用字符串化对象引用(Stringifiedobjectreference)来得到其第一个对象。
1.4 接口定义语言(IDL)
一个IDL文件定义公共的应用程序接口(API),通过服务程序中的对象向外公布。一个CORBA对象的类型称作接口,与C++中的类或者Java中的接口类似。IDL接口支持多重继承。
一个IDL文件示例如图1.1所示。IDL接口可以包括方法和属性。很多人都误以为一个IDL接口的属性类似于C++中的示
例变量(或者Jave中的域)的概念。这是错误的。一个属性只是在语法上对一对儿get-和set-类型方法的称谓。属性可以是只读的,这种情况时该属性只有一个get-类型的方法。
module Finance {
&&&typedef sequence&string& StringS
&&&struct AccountDetails {
&&&StringS
&&&exception insufficientFunds { };
&&&interface Account {
&&&&&&&void deposit(in double amount);
&&&&&&&void withdraw(in double amount)
&&&&&&&&&&&raises(insufficientFunds);
&&&&&&&readonly attribute AccountD
*****************************************************************************************************
图1.1: IDL文件示例
方法的参数有一个指定的方向,可以是in(意味着参数由客户程序传入服务程序),out(参数从服务程序传回客户程序)或者inout(参数是双向传递的)。方法同样可以有返回值。方法在某块出错时可以引发(抛出)一个异常。有30多种预定义的异常类型,称作系统异常,他们都可以由方法抛出,尽管在实际系统中CORBA运行时系统引发的异常多于应用程序代码引发的。除了预定义的系统异常,新的异常类型可以在IDL文件中定义,这些异常可称为用户定义的异常。方法署名的raises子句指定该方法可能抛出的用户定义异常。
方法的参数(包括返回值)可以是内置类型的一种——例如:string,boolean或者long,也可以是IDL文件中定义的用户自定义的类型。用户定义类型可以是一下的任意一种:
结构体。类似于C/C++中的结构体或者Java中只包含公共域的类。
序列。集合类型,就像一个可以增或减的一维数组。
数组。IDL数组的维度在IDL文件中指定,所以数组是固定大小的,这就是说他不能在运行时增或者减。数组在IDL中很少用到。序列类型更灵活,所以用的更多。
自定义。给现存的类型定义一个新名字。例如,下面的语句定义age可用来描述short。
&&&typedef short age;
默认情况下,IDL的序列和数组是匿名类型,也就是说他们没有名字。通常使用typedef的重要意义在于给序列或者数组的声明关联一个名字。例句可以在图1.1中StringSeq的定义中看到。
联合体。该类型可以在运行时保留多个值中的一个。例如:
union Foo switch(short) {
&&&case 1: boolean boolV
&&&case 2: long longV
&&&case 3: string stringV
一个Foo类型的实例可以保存一个boolean、long或者string值。前面的case标记(成为判别式)表明当前是哪种值。与IDL联合体相同的理念可以在很多面向过程的语言中找到。但是,他们很少在面向对象的语言中使用,因为多态统称能以更好的方式达到同样的目的。
枚举类型。枚举在概念上类似于一个常整型集合的声明。例如:
enum color (red, green, blue );
enum city (Dublin, London, Paris, Rome );
从本质上说,CORBA使用整数表达不同的枚举值,使用枚举声明的好处在于很多编程语言都有对它的内在支持,或者相似的机制,可以用来进行强类型判识,这样程序员就不会将city变量和color变量相加。
定点类型。定点类型保存定点数值,而float和double类型保存浮点数值。浮点计算适用于很多用途,但是,可能导致几个小数位后的舍入误差。对比来说,定点数值可能比对应的浮点数值占用更多的内存空间,但是他们有避免舍入误差的优点。使用定点数值趋向于限制在适当的应用领域。例如金融计算和数字信号处理等。尽管一个工程使用定点类型数字,它很可能使用定点计算作为细节实现却不将定点数字的使用公布为公共的IDL接口。由于以上原因,定点类型很少在IDL文件中声明。
值类型。在9.2节、96页讨论。
IDL类型可以组织在一个module中。module结构与C++中的namespace或者Java中的package有异曲同工之妙,也就是说,他事先给类型名称前添加了一个前缀,以避免命名空间冲突。IDL中的域操作符是“::”。例如,
Finance::Account是Finace模块中定义的Account类型的全域名
编译 IDL 后生成的 Java 类
Helper&&&&&&&&&
为接口客户提供有用的助手功能的类。编译器为 narrow 功能自动生成代码,这种 narrow 功能让客户将CORBA对象引用强制转换为接口类型。还提供了绑定(bind)功能,用户可以用其查找该类型的对象。
Holder&&&&&&&&&
含有接口类型的公共实例成员的类。用户和服务器用其来以方法调用的 out 和 inout 参数的形式传递接口类型的对象
Stub&&&&&&&&&&&
为接口对象实现客户端存根的类,它是真正的提供排列功能的接口的内部实现。
Operations
定义了 IDL 功能的类。
Tie&&&&&&&&&&&&
CORBA支持两种类型的程序:基于继承(inheritance-based)的和基于委托的(delegantion-based)。Tie类只是扩展了POA,但它没有提供自己的实现语义。它把所有的工作委托到一个实现对象上。每一个Tie对象存储一个实现对象的引用。
委托方法可用两种类实现IDL接口:1.一个IDL生成的Tie类,该类继承自POA,但是委托所有的调用到一个实现类;2.一个实现IDL生成的Operations接口的类,它定义了IDL的功能。
POA&&&&&&&&&&&&
为接口实现CORBA服务器端框架的类。这个类将 CORBA 和 Java 对象模型组合到一起。它是通过使用一个实现了Java的org.omg.CORBA.Object接口的 Java 对象做到这一点的。这是CORBA根接口,所有得CORBA对象都必须实现它。
CORBA IDL-to-Java 映射
通用结构:
1.CORBA模块
&ORBA IDL 模块(module)映射成与IDL模块同名的Java包
2.CORBA异常
&CORBA定义了两类异常
&I.system exceptions&&&&&&&&&&&&&& 一种被CORBA定义的异常
&II.user-defined exceptions&&&&& 由用户在IDl中定义的异常 &&&&&&&&
3.CORBA 参数
&CORBA定义了三种参数传递模式:in、out和 inout。Java 只支持in 。 &&&&&&&&
4.CORBAHolder 类
&由于Java中没有IDLout 和 inout 的对应物,对IDL out 和inout 参数,IDL-to-Java 映射必须提供一些附加的机制来支持值传递(并返回结果)。
&映射定义 Holder 类,这些 Holder 类在Java中实现附加的参数传递模式。对每个IDL out 或 inout 参数,客户必须实例化一个适当的 Holder 类的实例(它是通过值传递的)。
5.CORBAHelper 类
&Helper 类包含用于不同方式操作IDL的方法。
&Helper 类提供客户可以用来操作类型的静态方法,这些包括该类型的任何插入和取出操作、获得库(repository)ID、获得类型码(typecode)、从流中读取类型并把类型写入流中。
&另外,映射IDL接口的Helper类提供一个静态的narrow方法,可以用于进行强制类型转换。
6.CORBA属性
&CORBA IDL 接口可以拥有属性,这些都是类型域中set和get操作所需的。
&每个属性都被映射到一对与属性同名的重载Java访问器和修改器方法上。
结构类型:
1.sequence(序列)
一个可变大小的一维元素序列,其中元素可以是任何IDL定义的类型。可以限制序列的最大长度。
2.struct(结构)
可以使用结构将多种类型的命名字段组装在一起
每个struct都有两个构造函数。一个是默认的构造函数,把结构中的所有字段设置为空。第二个构造函数把结构字段作为参数并初始化每个字段
3.union(联合)
&用于在任何给定的时间只引用几个数据成员中的一个(任何时间,内存中只能有一个成员)。联合使用discriminator标签值来显示该值含有联合中的那个成员。
&Any是一个保留其类型的自描述数据结构,它使你可以在运行时用类型安全的转换函数提取和插入预定义的IDL类型的值。
&Any类型让你指定一个属性值、参数或返回类型,该类型包含一个在运行时而不是在编译时确定的任意类型。可以使用Any传递任何东西。
IDL-to-Java 的映射
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:148457次
积分:2391
积分:2391
排名:第12033名
原创:29篇
转载:389篇
(1)(1)(1)(2)(12)(14)(9)(1)(1)(1)(2)(4)(6)(4)(8)(12)(8)(3)(5)(12)(18)(30)(15)(23)(30)(14)(17)(13)(56)(43)(18)(10)(16)(10)

我要回帖

更多关于 数据结构java语言描述 的文章

 

随机推荐