zoukankan      html  css  js  c++  java
  • OMG 接口定义语言(IDL)

    用 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 = '';

    可以用十进制、十六进制或八进制记数法定义整数常数:

    例如,

    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 = ' ';

    const char NEWLINE = ' ';

    只要没有混合的类型表达式,就可以在常数说明中使用算术运算符。

    用户异常

    异常类似于一个结构,从方法中使用异常。

    例如,

    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 对象对应于类实例。

  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/wuyuans/p/3273687.html
Copyright © 2011-2022 走看看