IDLコンパイラ esidl


はじめに

IDLコンパイラesidlは、IDLで定義したインターフェイスを実装するために必要となるC++のヘッダーファイルやインターフェイスのリフレクションデータを生成するプログラムです。esidlでは、IDLの文法にW3Cなどからの勧告にも採用されているにOMG IDLの文法を採用しています。

注意: esidlはIDLの文法にOMG IDLを採用していますが、C++言語へのマッピングなどはes独自のシンプルなものになっています。IDLの文法以外にはCORBAとの関係はありません。

注意: 以前のes-0.0.xではDCEベースのIDLの文法を採用していましたが、es-0.1.x以降のesidlはDCEベースの文法を処理する機能はありません。

書式

esidl [option] filename ...

解説

esidlはIDLのソースファイル(.idl)からC++のヘッダーファイル(.h)とバイナリ形式のリフレクションデータ(.ent)を生成します。esidlは、その他のIDLコンパイラのように、インターフェイスのメソッド呼び出しのためのスタブコードを生成することはしません。esオペレーティングシステムでは引数のマーシャリング相当の処理 などはオペレーティングシステムのカーネルがリフレクションデータを元に自動的に実行するためです。

また、esidlではIDLファイルの中にjavadoc形式でインターフェイスやメソッドの説明を記述 することができます。esidlコンパイラはIDLファイル中のjavadoc形式のコメントをそのままC++のヘッダーファイルに書き出します。

プリプロセッシング

.idlファイルでは#ifdef , #include等のディレクティブを使用できます(現在のesidlは内部でcppを呼び出しています)。

ES IDL
#ifndef NINTENDO_ES_BASE_IFILE_IDL_INCLUDED
#define NINTENDO_ES_BASE_IFILE_IDL_INCLUDED

#include "es/base/IStream.idl"

module es
{
};

#endif // NINTENDO_ES_BASE_IFILE_IDL_INCLUDED

オプション

-I directory
ディレクトリdirectoryをヘッダーファイルの検索パスに追加します。 ヘッダーファイルやリフレクションデータはdirectory以下の階層構造を保持した状態で生成されます。

C++言語マッピング

IDLのソースファイル(.idl)からC++のヘッダーファイル(.h)へのマッピングは以下のようになっています。

モジュール

moduleは、C++の名前空間を生成します。

ES IDLC++ ヘッダーファイル
module es
{
};
namespace es
{
};

インターフェイス

interfaceは、C++の抽象クラスを生成します。

ES IDLC++ ヘッダーファイル
interface X
{
};
class X
{
};

インターフェイスID

esのインターフェイス定義では(少なくとも現状では)DCEのUUID形式でインターフェイスIDを指定する必要があります。

ES IDLC++ ヘッダーファイル
interface IStream
{
    #pragma ID IStream = "DCE:032c16c8-25db-11db-9c02-0009bf000001";
};








class IStream
{
public:
    static const Guid& iid()
    {
        static const Guid iid =
        {
            0x032c16c8, 0x25db, 0x11db, { 0x9c, 0x02, 0x00, 0x09, 0xbf, 0x00, 0x00, 0x01 }
        };
        return iid;
    }
};

基本型

IDLとC++の基本型の対応を以下に示します。

ES IDL C++ ヘッダーファイル 備考
octet unsigned char  
char char  
wchar wchar_t  
string char*  
wstring wchar_t*  
short short  
long int 4バイト
long long long long 8バイト
boolean bool  
float float  
double double  
long double long double  
uuid Guid esの機能拡張

パラメーター属性

引数の使われ方を指定します。 in は入力のみ、out は出力のみ、inout は入出力の両方に使われることを表します。

注意: ECMAScriptインタープリタから呼び出し可能な関数を定義するには、パラメーター属性に必ず in を指定する必要があります。

ES IDLC++ ヘッダーファイル
void getPosition(out long x, out long y);
void setPosition(in long x, in long y);
virtual void getPosition(int* x, int* y) = 0;
virtual void setPosition(int x, int y) = 0;

インターフェイス名

 メソッドの引数、戻り値としてインターフェイス名を指定すると、ヘッダーファイル中ではインターフェイスポイントとして扱われます。

ES IDLC++ ヘッダーファイル
void mount(in IStream disk);

ICache create(in IStream backingStore);
virtual void mount(IStream* disk) = 0;

virtual ICache* create(IStream* backingStore) = 0;

配列

配列は要素の数が静的に決まっているデータ型です。typedefで型名を定義して使用します。

ES IDLC++ ヘッダーファイル
typedef octet Mac[6];
long addMulticastAddress(in Mac mac);
typedef unsigned char Mac[6];
virtual int addMulticastAddress(const Mac mac) = 0;

シーケンス

シーケンスは実行時にサイズが指定される可変長のデータ構造です。 配列と同様にtypedefで型名を定義して使用します。 配列と異なり、シーケンスの長さを指定する引数が自動的に生成されます。

ES IDLC++ ヘッダーファイル
typedef sequence<unsigned short> Name;
Name getName();
long setName(in Name name);
typedef unsigned short* Name;
virtual int getName(Name name, int nameLength) = 0;
virtual int setName(const Name name, int nameLength) = 0;

オクテットのシーケンス

sequence<octet>は、ヘッダーファイル中ではunsigned char* ではなくvoid*に変換されます。

ES IDLC++ ヘッダーファイル
interface IStream
{
    typedef sequence<octet> Buf;
    Buf read();
    long write(in Buf src);
};
class IStream
{
public:
    virtual int read(void* buf, int bufLength) = 0;
    virtual int write(const void* src, int srcLength) = 0;
};

any

any void* に変換されます。

ES IDLC++ ヘッダーファイル
void exit(in any val);
virtual void exit(const void* val) = 0;

Object

Object も void* を生成します。 ただし、anyで生成されるvoid* とは異なり、インターフェイスポインタを指すことが暗黙のうちに仮定されています。

注意: esidlではObjectのインターフェイスIDをuuid型の引数で指定することができます。戻り値の場合は、メソッドの最後のuuid型の引数によって指定されたIDが返されるObjectのIDになります。引数の場合は、Object型の引数の直前のuuid型の引数によって指定されたIDがObjectのIDになります。

ES IDLC++ ヘッダーファイル
Object queryInterface(in uuid riid);
virtual void* queryInterface(const Guid& riid) = 0;

属性

IDLでattributeを定義するとsetter, getter が自動的に生成されます(readonly attributeはgetterのみを生成します)。 なお、boolean型の属性のgetter は "is + 属性名" という名前になります。

ES IDLC++ ヘッダーファイル
readonly attribute double X;

attribute double Y;


attribute boolean on;

virtual double getX() = 0;

virtual double getY() = 0;
virtual void setY(double Y) = 0;

virtual bool isOn() = 0;
virtual void setOn(bool on) = 0;

定数

定数の定義にはconst を使います(enumは文法上可能ですがesでは原則として使用しません)。 なお、TRUE, FALSE はIDLでは大文字で表します。

ES IDLC++ ヘッダーファイル
const long Stream = 1;

const long ReadOnly = 0x01;
static const int Stream = 1;

static const int ReadOnly = 0x01;

exception

exceptionはヘッダーファイルではstructに変換されます。

ES IDLC++ ヘッダーファイル
exception E
{
    long code;
};
struct E
{
    int code;
};

struct

structはヘッダーファイルでもそのままstructに変換されます。

ES IDLC++ ヘッダーファイル
struct Geometry
{
    unsigned long heads;
    unsigned long cylinders;
    unsigned long sectorsPerTrack;
    unsigned long bytesPerSector;
    long long diskSize;
};
struct Geometry
{
    unsigned int heads;
    unsigned int cylinders;
    unsigned int sectorsPerTrack;
    unsigned int bytesPerSector;
    long long diskSize;
};

注意: es-0.1.1のECMAScriptインタープリタesjsではstructはサポートされていません。この制約は将来のバージョンで取り除く予定です。


Copyright © 2007
Nintendo Co,. Ltd.

Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Nintendo makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

SourceForge.jp