FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Mruby2CBridgePlugin の使用例

低水準のファイル入出力関数を Mruby2CBridgePlugin を利用して、mruby から直接呼び出す例を作ってみます。

現時点 (2013年5月4日) では Mruby2CBridgePlugin や MrubyBridgePlugin は未公開ですので、予習資料としてください。

Mruby2CBridgePlugin は、mruby から C 言語の関数を呼び出すためのコードを自動生成する TECS ジェネレータのプラグインです。
mruby から TECS コンポーネントを操作するプログラムを生成する MrubyBridgePlugin と TECS コンポーネントから既存の C 言語の関数を呼び出すための TECS2CBridgePlugin を利用して作られています。

なお、TECS コンポーネントの振る舞いは C 言語で記述しますので、TECS2CBridgePlugin は、元々必要なかったのですが、mruby から C を呼び出すプログラムを作成するためだけに TECS ジェネレータを利用するケースにも対応するために、Mruby2CBridgePlugin と合わせて作成したものです。

まずは TECS CDL (コンポーネント記述) の書き方からです。
以下にすべてを記載します。

/* (1) import headers*/
import_C( "tecs.h" ); // TECS の型定義
import_C( "fcntl.h" ); // open, read, write, close を使用する場合の定義 (なくてもビルドはできる)

/* (2) signature sLowFile */
signature sLowFile {
  int open([in,string]const char *filename, [in]int access, [in]int permission);
  int read([in]int handle, [out,size_is(nbyte)]uint8_t *buffer, [in]int nbyte);
  int write([in]int handle, [in,size_is(nbyte)]const uint8_t *buffer, [in]int nbyte);
  int close( [in]int handle );
};

/*
* (3) プラグインの適用
* Mruby2CBridgePlugin: mruby to C bridge plugin
* mruby の呼出しを C 言語の呼出しに変換する
*/
generate( Mruby2CBridgePlugin, sLowFile, "" );


とても簡単でしょ !?
大きく (1) ~ (3) に分かれています。
簡単に解説します。

(1) はヘッダファイルの取り込みです。
ここでは、tecs.h と fcntl.h を取り込みます。

tecs.h は TECS の組込み型の C 言語での定義を取り込むのが目的です。
とりあえず、取り込むものとしてください。
実際には、TECS の組込み型は、tecs.h をインポートしていなくても CDL 内で参照できます。TECS ジェネレータの生成したコードを C 言語のコンパイラにかけるとエラーがでてしまうため、ここでインポートしておきます。

TECS ジェネレータは、ヘッダで定義された型定義 (typedef と struct) のみを取り込みます。
従って fcntl.h をインポートしても、O_RDONLY など open を使用する際に必要となるマクロ (#define) は、残念ながら取り込まれません。

(2) は、シグニチャの定義です。
TECS 以外ではインタフェースと呼んでいる場合が多いように思われますが、関連する関数をまとめて、それに名前を付けたものがシグニチャです。
シグニチャ定義の、それぞれの関数の '[', ']' で囲まれた部分を除くと、C 言語の関数頭部となるようになっています(プロトタイプ宣言のように仮引数名を省略することはできません)。

'[', ']' の中には、引数の特性を示す指定子を書く必要があります。
in, out, inout のいずれかを指定します。
説明しなくてもわかると思いますが、関数への入力は in、出力は out で、その両方が inout です。
C 言語の文法上、out, inout の場合、必ずポインタ型になります。

TECS の仕様では、この他に、send, receive がありますが、MrubyBridgePlugin は対応していません。

in, out の他に string と size_is 指定子が使われています。これらは、いずれもポインタが指しているものが、文字列か、配列か、あるいはそうではないのかを指定するものになります。
string は、ポインタ型が NULL 終端された文字列であることを表します。
size_is は、ポインタ型が size_is の ( ) 内で示された長さの配列であることを表します。

cygwin 1.7.5 の sys/_default_fcntl.h を見ると open は可変長引数の関数としてプロトタイプ宣言されていましたが、ここでは 3 引数として定義しています。
TECS では、可変長引数の関数を扱う手段が提供されていませんので、不要でも省略して記述することはできません。

また、read, write 関数の第 2 引数は、プロトタイプ宣言としては void * が正しいのですが、このような型を曖昧化する書き方は、MrubyBridgePlugin では扱えません。uint8_t * に置き換えています。

(3) は、Mruby2CBridgePlugin の呼出しです。
generate はシグニチャプラグインの呼出しを表します。第 1 引数はプラグイン名 Mruby2CBridgePlugin で、第 2 引数はシグニチャ名であり、ここでは (2) で定義した sLowFile です。第 3 引数はプラグインに対するオプション指定を文字列で与えます。何もオプションを指定しない場合は空文字列を指定します。

TECS CDL にはシグニチャだけでなく、セルタイプ(コンポーネントの型)やセル(コンポーネント) を書かなければならないのですが、Mruby2CBridgePlugin は必要なすべてを生成してくれます。
TECS CDL の記述だけではなく、C 言語で記述する振る舞いのコード (セルタイプコードと呼びます) も生成してくれます。

以上が、ソースコードのすべてです。
もちろん、これを利用するためのプログラムは別に必要ですが、それは mruby で記述することになります。
次は、ビルドのステップになりますが、別の記事に書くことにします。
スポンサーサイト

テーマ : ソフトウェア
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

hiro22022

Author:hiro22022
TECS 開発ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。