version 1.1, 1999/12/09 22:44:55 |
version 1.4, 1999/12/15 08:04:50 |
|
|
# Author: 小原功任 @ 金沢大学理学部計算科学教室 |
# Author: 小原功任 @ 金沢大学理学部計算科学教室 |
# URI: http://omega.s.kanazawa-u.ac.jp/ohara/ |
# URI: http://omega.s.kanazawa-u.ac.jp/ohara/ |
# $OpenXM$ |
# $OpenXM: OpenXM/src/ox_toolkit/README,v 1.3 1999/12/15 02:44:12 ohara Exp $ |
|
|
☆ libox.a マニュアル。 |
/*&ja ox_toolkit ユーザガイド |
|
|
|
*/ |
|
/*&en A user's guide for ox_toolkit. |
|
|
|
*/ |
|
/*&ja |
libox.a を利用するには次のヘッダファイルをインクルードする必要があります。 |
libox.a を利用するには次のヘッダファイルをインクルードする必要があります。 |
|
*/ |
|
/*&en |
|
How to use OpenXM C library? |
|
|
|
The OpenXM C libraiy has header files: |
|
*/ |
|
/*&common |
|
|
#include <oxtag.h> |
#include <oxtag.h> |
#include <ox.h> |
#include <ox.h> |
#include <parse.h> |
#include <parse.h> |
|
|
各構造体および関数の宣言はそれぞれのヘッダファイルを見てください。 |
*/ |
ここでは基本的な考え方について説明します。 |
/*&ja |
|
1. データ型 |
|
|
まず、すべての CMO データはそのデータ型に対応した new 関数によって生成 |
このツールキットで定義されている各構造体の生成については次節を参照せよ。 |
します。たとえば CMO_ZZ 型のオブジェクトは new_cmo_zz() 関数によって生 |
|
成されます。 |
|
|
|
CMO データを送受信するには、CMO の種類によらず send_cmo(), |
1.1 CMO (Common Math Object) |
receive_cmo() を用います。これらの関数は OX ヘッダを扱いませんので、OX |
|
メッセージを送受信するときには send_ox_tag(), receive_ox_tag() をその |
|
前に呼ぶ必要があります。 |
|
|
|
|
|
☆ CMO オブジェクト |
|
次のデータ型(構造体)が用意されている。 |
次のデータ型(構造体)が用意されている。 |
|
*/ |
|
/*&en |
|
1. Types |
|
|
|
1.1 CMO (Common Math Object) |
|
The following structures is defined in ox.h: |
|
*/ |
|
/*&common |
|
|
cmo |
cmo |
cmo_null |
cmo_null |
cmo_int32 |
cmo_int32 |
Line 43 cmo_distributed_polynomial |
|
Line 56 cmo_distributed_polynomial |
|
cmo_indeterminate |
cmo_indeterminate |
cmo_error2 |
cmo_error2 |
|
|
|
*/ |
|
/*&ja |
このうち cmo 型はいわば抽象基底クラスに相当するものであり、この型のオ |
このうち cmo 型はいわば抽象基底クラスに相当するものであり、この型のオ |
ブジェクトをつくってはいけない。また cmo_distributed_polynomial は |
ブジェクトを明示的には生成されない。このクラスはポインタ型のキャストの |
cmo_list の派生クラスであると思ってもよい。ユーザはオブジェクトの実体を |
ために用意されている。また cmo_distributed_polynomial は cmo_list の派 |
直接扱ってはならない。必ず、new_... 関数、すなわち |
生クラスであると思ってもよい。 |
|
|
|
*/ |
|
/*&en |
|
The cmo above is similer to abstract base class; |
|
you never make an object of cmo class. |
|
|
|
*/ |
|
/*&ja |
|
1.2 OX オブジェクト |
|
次のデータ型(構造体)が用意されている。 |
|
*/ |
|
/*&en |
|
1.2 OX objects |
|
The following structures is defined in ox.h: |
|
*/ |
|
/*&common |
|
|
|
ox |
|
ox_command |
|
ox_data |
|
|
|
*/ |
|
/*&ja |
|
このうち、ox 型は抽象基底クラスなので、オブジェクトをつくってはいけない。 |
|
|
|
*/ |
|
/*&en |
|
The ox above is abstract base class. |
|
|
|
*/ |
|
/*&ja |
|
2. オブジェクトの生成 |
|
|
|
オブジェクトを生成するために、new 関数群が用意されている。それぞれの関 |
|
数はオブジェクトを生成して、そのオブジェクトへのポインタを返す。 |
|
*/ |
|
/*&en |
|
2. How to make CMObjects? |
|
|
|
You may use new functions which generate an object and return its pointer. |
|
*/ |
|
/*&common |
|
|
new_cmo_null(); |
new_cmo_null(); |
new_cmo_int32(int i); |
new_cmo_int32(int i); |
new_cmo_string(char* s); |
new_cmo_string(char* s); |
Line 66 new_cmo_ring_by_name(cmo* ob); |
|
Line 123 new_cmo_ring_by_name(cmo* ob); |
|
new_cmo_indeterminate(cmo* ob); |
new_cmo_indeterminate(cmo* ob); |
new_cmo_error2(cmo* ob); |
new_cmo_error2(cmo* ob); |
|
|
によってオブジェクトを生成し、ユーザはポインタのみを扱うこと。 |
*/ |
|
/*&ja |
|
3. 高水準 API |
|
|
☆ OX オブジェクト |
高水準 API は「OpenXM クライアント」から利用することを前提に設計されている。 |
次のデータ型(構造体)が用意されている。 |
|
|
|
ox |
3.1 通信の開始 |
ox_command |
|
ox_data |
|
|
|
このうち、ox 型は抽象基底クラスなので、オブジェクトをつくってはいけない。 |
通信を開始する場合には、次の関数のいずれかを利用する。 |
|
*/ |
|
/*&en |
|
3. High-level API |
|
|
|
High-level API is prepared for implementation of your OpenXM clients. |
|
|
|
3.1 How to make connection to OpenXM server? |
|
|
|
You may call ox_start or ox_start_insecure_nonreverse. |
|
*/ |
|
/*&common |
|
|
|
ox_file_t ox_start(char* host, char* prog1, char* prog2); |
|
ox_file_t ox_start_insecure_nonreverse(char* host, short portControl, short portStream); |
|
|
|
*/ |
|
/*&ja |
|
第一の関数は、ローカルマシン上に OpenXM サーバを起動し、そのサーバとの |
|
間に"reverse モード"で通信路を開設する。通信に使われるポート番号は自動 |
|
的に生成される。host はローカルマシンのホスト名(あるいは "localhost")、 |
|
prog1 はコントロールサーバの実行ファイル名、 |
|
prog2 は計算サーバの実行ファイル名でなければならない。 |
|
|
|
第二の関数は、リモートマシン上に既に起動されている OpenXM サーバとの間に |
|
通信路を開設する。通信に使われるポート番号は明示的に与えなければならない。 |
|
host はリモートマシンのホスト名、 |
|
portControl はコントロールサーバとの通信のためのポート番号、 |
|
portStream は計算サーバとの通信のためのポート番号である。 |
|
|
|
それぞれの関数はサーバ(正確には二つのサーバの組)の識別子を返す。 |
|
この識別子は高水準 API の各関数で利用される。 |
|
|
|
*/ |
|
/*&ja |
|
3.2 通信の終了 |
|
|
|
通信の終了のためには次の二つの関数が用意されている。 |
|
|
|
*/ |
|
/*&en |
|
3.2 How to close connection to OpenXM server? |
|
|
|
You may call ox_close or ox_shutdown. |
|
|
|
*/ |
|
/*&common |
|
void ox_close(ox_file_t sv); |
|
void ox_shutdown(ox_file_t sv); |
|
|
|
*/ |
|
/*&ja |
|
第一の関数はコントロールサーバに SM_control_kill を送ることによって、 |
|
サーバを終了させる。第二の関数は計算サーバに SM_shutdown を送ることに |
|
よって、サーバを終了させる(予定)。 |
|
|
|
/* |
|
/*&ja |
|
3.3 SM コマンドの送信 |
|
|
|
*/ |
|
/*&en |
|
3.3 How to command to OpenXM stack machine? |
|
|
|
*/ |
|
/*&common |
|
void ox_push_cmd(ox_file_t sv, int sm_code); |
|
|
|
*/ |
|
/*&ja |
|
サーバにスタックマシンコマンドを送る。コマンドはコマンド番号で与える。 |
|
|
|
*/ |
|
/*&en |
|
This function send operation code to an OpenXM stack machine. |
|
Table of opecode is defined in oxtag.h. |
|
*/ |
|
/*&ja |
|
3.4 CMO の送受信 |
|
|
|
void ox_push_cmo(ox_file_t sv, cmo *c); |
|
cmo* ox_pop_cmo(ox_file_t sv); |
|
char* ox_popString(ox_file_t sv); |
|
|
|
ox_push_cmo は cmo を送信、ox_pop_cmo は cmo を受信する。ox_popString |
|
は cmo を文字列形式に変換して受信するが、変換の結果はサーバによって異 |
|
なる。 |
|
|
|
3.5 スタック処理 |
|
|
|
int ox_pops(ox_file_t sv, int num); |
|
|
|
スタック上の num 個のオブジェクトを廃棄する。 |
|
|
|
3.6 |
|
|
|
int ox_flush(ox_file_t sv); |
|
|
|
通信路を flush する(実際には何もしない)。 |
|
|
|
3.7 |
|
|
|
void ox_reset(ox_file_t sv); |
|
|
|
計算を中断する。 |
|
|
|
3.8 |
|
|
|
void ox_execute_string(ox_file_t sv, char* str); |
|
|
|
サーバのローカル言語で書かれた命令を評価し、結果をスタックに積む。 |
|
|
|
3.9 |
|
|
|
int ox_cmo_rpc(ox_file_t sv, char *function, int argc, cmo *argv[]); |
|
|
|
function(argv[1], ...) を計算し、結果をスタックに積む。 |
|
|
|
3.10 |
|
|
|
cmo_mathcap* ox_mathcap(ox_file_t sv); |
|
|
|
Mathcap を受け取る。現在は Mathcap の処理はユーザプログラムに任されている。 |
|
いずれこの関数は廃止される予定。 |
|
|
|
*/ |
|
/*&ja |
|
4. 低水準 API |
|
|
|
低水準 API はファイルディスクリプタを直接利用する。 |
|
|
|
4.1 通信に使われるバイトオーダの決定 |
|
|
|
*/ |
|
/*&en |
|
4. Low-level API. |
|
|
|
4.1 How to decide a byte order of integers? |
|
|
|
*/ |
|
/*&common |
|
int decideByteOrderServer(int fd, int order); |
|
|
|
*/ |
|
/*&ja |
|
このツールキットは、サーバが開始されるときにはすでに通信路が設定されて |
|
いるが、その通信路に用いるバイトオーダの決定は行われていないと仮定して |
|
いる。詳しくは、高山-野呂, "OpenXM の設計と実装" を参照せよ。 |
|
|
|
(注意) クライアント側でのバイトオーダの設定は、高水準 API で自動的に行われる。 |
|
|
|
*/ |
|
/*&common |
|
4.2 |
|
|
|
int send_int32(int fd, int integer); |
|
|
|
*/ |
|
/*&ja |
|
fd に 32bit 整数を書き込む。 |
|
|
|
*/ |
|
/*&common |
|
int receive_int32(int fd); |
|
|
|
*/ |
|
/*&ja |
|
fd から 32bit 整数を読み込む。 |
|
|
|
*/ |
|
/*&common |
|
4.3 |
|
|
|
int send_cmo(int fd, cmo* m); |
|
|
|
*/ |
|
/*&ja |
|
fd に cmo を書き込む。 |
|
|
|
*/ |
|
/*&common |
|
cmo* receive_cmo(int fd); |
|
|
|
*/ |
|
/*&ja |
|
fd から cmo を読み込む。 |
|
|
|
4.4 |
|
|
|
int next_serial(); |
|
|
|
シリアルナンバを生成する。 |
|
|
|
4.5 |
|
|
|
int send_ox_tag(int fd, int tag); |
|
|
|
fd に OX メッセージのヘッダ(tag+id)を書き込む。 |
|
シリアル番号は自動的に生成される。 |
|
|
|
int receive_ox_tag(int fd); |
|
|
|
fd から OX メッセージのヘッダ(tag+id)を読み込む。 |
|
|
|
4.6 |
|
|
|
int send_ox(int fd, ox* m); |
|
int send_ox_cmo(int fd, cmo* m); |
|
void send_ox_command(int fd, int sm_command); |
|
|
|
ox メッセージを送信する。 |
|
*/ |
|
|