用 RPC / COM /CORBA 技术来编写分布式系统时都需要接口定义语言 (IDL)。
IDL特点:
1、IDL 是一种规范语言。
2、IDL 看上去很像 C 语言。
3、OMG IDL 的目的是定义接口和精简分布对象的过程。
4、IDL分离对象的接口与其实现。
5、IDL剥离了编程语言和硬件的依赖性。
6、使用IDL定义接口的客户机程序员不知道接口背后的实现细节。
7、IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。
本文讲解 OMG IDL 的内置类型和关键字。
OMG 接口定义语言内置类型表:
类型
|
范围
|
最小大小(bit)
|
short
|
-215 到 215-1
|
16
|
unsigned short
|
0 到 216-1
|
16
|
long
|
-231 到 231-1
|
32
|
unsigned long
|
0 到 232-1
|
32
|
long long
|
-263 到 263-1
|
64
|
Unsigned long long
|
0 到 264-1
|
64
|
float
|
IEEE 单精度
|
32
|
double
|
IEEE 双精度
|
64
|
long double
|
IEEE 双字节扩展浮点数
|
15 位指数,64 位带符号小数
|
char
|
ISO Latin-1
|
8
|
wchar
|
从任何宽字符集编码宽字符,如 Unicode
|
依赖于实现
|
string
|
ISO Latin-1,除了 ASCII NUL 以外
|
可变化
|
Boolean
|
TRUE 或 FALSE
|
未指定
|
octet
|
0 到 255
|
8
|
any
|
自己描述的数据类型,可表示任何 IDL 类型
|
可变化
|
IDL 基本类型
整数类型
OMG IDL 摒弃int
类型在不同平台上取值范围不同带来的多义性的问题。
IDL提供2 字节 (short
)、4 字节 (long
) 和 8 字节 (long long
) 的整数类型。
所有这些整数类型都有相应的无符号数类型。
浮点类型
OMG IDL 浮点数类型 float
、double
和 long double。
OMG IDL 遵循 IEEE 754-1985 二进制浮点数算术的标准。
目前,long double
用于巨大数字,有些语言映射还不支持这种类型。
char 和 wchar
IDL标准字符集:词法约定(表示 IDL 文件的关键字、注释和文字的字符记号)规定 ISO 8859.1 字符集表示 IDL 文件中的字符。ISO 464 定义了空字符(null)和其它图形字符。
OMG IDL必须处理从一个计算机系统到另一个计算机系统之间的字符传输。从一个字符代码集到另一个字符代码集的转换,取决于语言绑定。
OMG IDL char
是一个 8 位变量,可以用两种方法表示一个字符。
首先,它可以从面向字节的代码集编码单字节字符。
其次,在数组中使用时,可以从多字节字符集(如 Unicode),编码任何多字节字符。OMG IDL Wchar
只允许大于 8 个字节的代码集。规范不支持特殊的代码集。
OMG IDL Wchar
允许每个客户机和服务器使用本机的代码集,然后指定如何转换字符和字符串,以便在使用不同代码集的环境之间进行传输。
Boolean
Boolean 值只能是 TRUE 或 FALSE。
Octet
octet
是 8 位类型,一种非常重要的类型。
octet
在地址空间之间传送时不会有任何表示更改。octet
在发送二进制数据,并且将它打包时,它的形式仍然相同。其它每种 IDL 类型在传输时都有表示变化。例如,根据 IOR 代码集信息的指示,char
数组会经历代码集转换。而 octet
数组却不会。
any 类型
IDL any
是一种包含任何数据类型的结构。
IDL any
由类型码和值组成。类型码描述 any
的值的内容。
IDL any
该类型可以是 char
或 long long
或 string
或另一种 any
,或者是已经创建的一种类型,如 Address
。
IDL any
类似于C++ 的自我描述数据类型void *
,但它更安全。
IDL any
类似于 Visual Basic的用户定义的类型variant
。
OMG IDL提供自定义数据类型,可以是枚举、结构和联合,或者用 typedef
创建的新类型。
命名的类型
应该使用 typedef
创建新的类型名称,这将帮助解释接口或保存输入。
例如, typedef float AtmosPressure;
在文体上,应注意不要为现有类型创建别名。CORBA 规范不保证 short
的两种 typedef
是兼容的和可互换的。
OMG IDL typedef
关键字具体含义取决于其所映射到的实现语言。在 C++ 中,typedef
关键字表示类型定义,实际上别名也许是更为精确的术语。
枚举
OMG IDL 枚举是将名称附加到数字的一种方法,从而了解代码更多的含义。
OMG IDL 版的枚举看上去象 C++ 版本的枚举。
例如, enum CloudCover{cloudy, sunny};
CloudCover
现在就成为可以在 IDL 中使用的一种新类型。
枚举最多有 232 个标识。
规范中没有规定标识的有序数值。
OMG IDL 不允许空的枚举。
结构
struct
关键字提供了将一组变量集中到一个结构的方法。
例如,
struct Date {
short month;
short day;
long year;
};
定义 struct
时,要确保所创建的类型是可读的。
不要在不同的名称空间中创建几个不同的同名结构,会使 IDL 的用户糊涂。
识别联合
联合是 C 联合类型和 switch 语句的混合物。
联合必须有类型标记字段。
一次只能有一个联合成员是活动的,并且可以从其识别名称来确定该成员。
例如,
enum PressureScale{customary,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
)。
常数定义
常数可以是整数、字符、浮点数、字符串、Boolean、octet 或枚举型,
不能是 any
类型或用户定义的类型。
例如,
const float MeanDensityEarth = 5.522; // g/cm^3
const float knot = 1.1508; // miles per hour
const 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;
字符和字符串常数支持标准换码序列:
例如,
const char TAB = '/t';
const char NEWLINE = '/n';
只要没有混合的类型表达式,就可以在常数说明中使用算术运算符。
用户异常
异常类似于一个结构,从方法中使用异常。
例如,
exception DIVIDE_BY_ZERO {
string err;
};
interface someIface {
long div(in long x, in long y) raises(DIVIDE_BY_ZERO);
};
异常将创建名称空间。
异常中的成员名必须是唯一的。
异常不能当作用户定义类型的数据成员使用。
OMG IDL 中没有异常继承。
数组、序列和字符串
每次只传送一个元素是可以的。
一种语言的数组与另一种语言的数组实现通常是不同的。
OMG IDL数组类型IDL array
和 sequence
,可以轻易地被映射到实现语言中。
string
类型是一种特殊的序列,它允许语言使用它们的字符串库和优化。
数组
OMG IDL 有任意元素类型的多维固定大小的数组。
所有数组都是有界的。
数组非常适合于与拥有固定数量元素的列表一起使用,而这些元素通常都是存在的。
例如,
// bounded and unbounded array examples
typedef long shares[1000];
typedef string spreadsheet[100][100];
struct ofArrays {
long anArray[1000];
};
// unbounded arrays NOT ALLOWED
// typedef long orders[];
必须指定数组维数,并且必须为正的整型常量来表示。
IDL 不支持在 C 和 C++ 中的开放数组。
IDL没有指针支持。
IDL必须出现 typedef
关键字,除非指定的数组是结构的一部分。
IDL不以任何方式、形态或形式指定数组下标编排方法。
一种实现语言到另一种实现语言的数组下标可以是不同的。
不能假定将数组下标从客户机发送到服务器时,服务器会调整并指向正确的数组元素。
某些语言的数组下标从 0 开始,而其它的则是从 1 开始。
序列
序列是变长向量,它有两个特征:元素的最大大小,在编译时确定,可以是无限的;
长度,在运行时确定。
序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。
序列可以是有界的,也可以是无界的。
例如,
// bounded and unbounded sequence examples
typedef sequence<long> Unbounded;
typedef sequence<long, 31> Bounded;
一个无限序列可以拥有任意多个元素,只会受到平台内存大小的限制。
有限序列则有边界限制。
无限序列和有限序列都可以不包含元素、用户定义的类型,但可以包含其它序列。
string 和 wstring
string
等价于 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
关键字唯一目的是创建名称空间。
一个标识可以在一个作用域中定义一次,但可以在嵌套作用域中重新定义。
例
module States {
// error: redefinition
// typedef sequence<string> 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();
};
};
};
接口
接口指定了服务实现和使用它的客户机之间的软件约定。
一个回调的例子。
// Thrown by server when the client passes
// an invalid connection id to the server
exception 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);
// Called 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 side
interface Speaker
{
// Called by the client to open a new connection
// 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 long connectionId)
raises(InvalidConnectionIdException);
};
接口名称变成类型,可以当作参数传送。实际是对象引用。
每个对象引用 (IOR) 仅指向一个接口。
IDL 接口对应于类定义,CORBA 对象对应于类实例。
分享到:
相关推荐
Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记Java-J2SE学习笔记
本书内容非常全面,涵盖了《Java编程思想》、《Java学习笔记》等书籍所有知识要点,并结合作者自己经验总结而编写,内容丰富程度胜过一切书籍 众所周知,一般书籍为了销售需要,往往很少的知识点,却需要添加大量的...
Java-J2SE学习笔记
j2se-doc-cn java的API文档,有助于你写JAVA程序.希望大家更加踊跃的学习和更好的学习JAVA。
自己的j2se学习笔记和收集的一部分笔记
资源名称:Java-J2se、J2ee开发全程视频教程和源码(87集)资源目录:【】Java-J2se-J2ee全程教程(01-10)【】Java-J2se-J2ee全程教程(11-20)【】Java-J2se-J2ee全程教程(21-30)【】Java-J2se-J2ee全程教程(31...
j2se学习笔记.doc j2se学习笔记.doc j2se学习笔记.doc j2se学习笔记.doc
资源名称:【一脚揣进J2SE】视频教程(持续更新)资源目录:【】《一脚踹进J2SE》1-1Java...《一脚踹进J2SE》2-2注释,标识符命名规则及Java中的关键字【I 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
我的学习笔记 需要就下载吧 接口 上课时的课堂笔记及相关程序
Java Web ppt 开发 J2SE 学习笔记
J2SE学习实例 1、Java的基础知识 2、Java面向对象 3、集合Collection的使用 4、IO使用 5、Socket编程 6、Thread线程技术 7、Subject反射技术 8、GUI图形编程
中文译名是J2SE参考大全(第5版) 这份是自己制作的电子书,现在还没有制作完成,因为内容太多,关打字就打个半死.
java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记
java学习总结1 -- j2se 项目环境: jdk8 字符集:UTF-8 开发工具:Eclipse 包括内容: basic 基本语法 oop 面向对象 api 常用api及工具类 javadoc javaDoc的使用 debug 代码调试方法 datastructure 基本数据结构 ...
java学习中纪录的笔记,JAVA学习中不可多得的一个帮助文档或学习工具。