[BACK]Return to implementation.tex CVS log [TXT][DIR] Up to [local] / OpenXM / doc / OpenXM-specs

Annotation of OpenXM/doc/OpenXM-specs/implementation.tex, Revision 1.2

1.2     ! noro        1: %% $OpenXM: OpenXM/doc/OpenXM-specs/implementation.tex,v 1.1.1.1 2000/01/20 08:52:46 noro Exp $
1.1       noro        2: //&jp \section{ 実装, デバッグ, 検証 }
                      3:
                      4: //&jp \subsection{ 実装の手順 }
                      5:
                      6: /*&jp
                      7: ソフト xxx を, open XM 対応にするのには以下のような
                      8: 手順をふむと開発が容易であろう.
                      9: \begin{enumerate}
                     10: \item[Step 1.]
                     11: {\tt executeStringByLocalParser}
                     12: および {\tt popString} の機能を実現して,
                     13: xxx をライブラリとしてまとめ, 他のソフトとリンクして
                     14: 使用できるかテストする.
                     15: C での実現の場合 割り込みの取扱に注意を要する.
                     16: これだけの実現でも, サンプルサーバ
                     17: ({\tt nullserver00.c}) とリンクすれば,
                     18: open XM 対応のクライアントと通信できる.
                     19: クライアント側では, このシステムに対応した機能呼び出し
                     20: プログラムを書く.
                     21: \item[Step 2.]
                     22: 次に, CMO を可能な限り実装する.
                     23: open sm1 や open asir で, CMO 形式のデータを
                     24: 作成して, 読み込めるかテストする.
                     25: \item[Step 2'.]
                     26: {\tt kan/sm1} の plugin として組み込むとサーバの開発が楽かもしれない.
                     27: {\tt kan/sm1} のソースファイルのディレクトリ {\tt plugin} を見よ.
                     28: \item[Step 3.]
                     29: CMO の stream への転送, stream よりの転送は,
                     30: 巨大データの送信受信にきわめて大切である.
                     31: これを実装しサンプルサーバとリンクする.
                     32: \end{enumerate}
                     33:
                     34:
                     35: \subsection{歴史}
                     36: kan -- asir 間でも以上のように開発がすすんだ.
                     37:
                     38: Risa/Asir の開p発が沼津の富士フォーラムでおこなわれていた
                     39: ころ, 私が沼津を, 1996年, 1月19日に訪問し,
                     40: {\tt Asir\_executeString()}
                     41: の機能を野呂さんに書いてもらって, kan より asir を文字列で呼び出す
                     42: 機能およびその逆を実現したのがことの発端である.
                     43: たとえば, asir より kan/sm1 の機能を呼び出すには,
                     44: \begin{verbatim}
                     45: F = x; G = y;
                     46: Ans = kan("(%p).  (%p).  mul toString",F,G)
                     47: \end{verbatim}
                     48: と入力すればよい.
                     49: {\tt x} と {\tt y} の積が kan で解釈実行されて, 結果を
                     50: もどす.
                     51: このレベルの結合では kan/sm1 は, 内蔵インタプリタ付の
                     52: ライブラリとして利用できてずいぶん便利である.
                     53: この関数 {\tt kan} は {\tt builtin/parif.c} に組み込んだ.
                     54: {\tt asir} は {\tt pari} の関数を組み込んでいるが, この組み込みの
                     55: メカニズムを利用すると容易にリンクできた.
                     56: 参照: {\tt  noro/src/Old1/parif.c}.
                     57:
1.2     ! noro       58: 次に, CMO Primitive の機能を
1.1       noro       59: 1997, 5 月, 6 月に実現した.
1.2     ! noro       60: その後, 1997年 7 月に, SMObject/Basic の実装,
1.1       noro       61: 1997年 7 月には, 野呂がイタリアの CoCoA のワークショップにおいて,
                     62: 大阿久の b-function を stratification 込みで計算する計算プログラムを
                     63: asir, kan を連係してデモした. このときは, {\tt Sm1\_executeStringByLocalParser}
                     64: 関数を用いて, ライブラリとしてリンクしてつかった.
                     65: 1997 年 11 月に TCP/IP による, サーバスタックマシン間の通信の
                     66: 実装をおこなっている.
                     67: 通信の実装テストのために, Java および C で null server , null client
                     68: を作成した. 以下, これにつき述べる.
                     69:
                     70:
                     71: \subsection{ サンプルサーバ, クライアント }
                     72:
                     73: Open XM では, 現在のところ,
                     74: サンプルサーバとして  {\tt oxserver00.c} を提供している.
                     75: このサーバをもとにして, {\tt asir} および {\tt kan/sm1}
                     76: の open XM サーバを試験中である ({\tt ox\_asir}, {\tt ox\_sm1}).
                     77: {\tt ox\_sm1} では, {\tt sm1stackmachine.c} が
                     78: open XM スタックマシンを実現している.
                     79: サンプルクライアントは, ネットワークにデータを送出および
                     80: 受信する機能のみをもつ,  {\tt testclient.c} を提供
                     81: している.
                     82: {\tt asir} および {\tt kan/sm1} には本格的な
                     83: クライアント機能(open XM サーバを呼び出す
                     84: 機能)を組み込んである.
                     85: サーバを起動するプログラムは, {\tt kan/sm1} グループでは,
                     86: {\tt ox} なる名前で, {\tt asir} グループでは,
                     87: {\tt ox\_lauch} なる名前であるが, 機能は同じである.
                     88: {\tt ox} のソースは {\tt oxmain.c} である.
                     89:
                     90: \subsubsection{OpenXM/src/ox\_toolkit にあるサンプル実装}
                     91: このディレクトリの解説文書を見よ.
                     92:
                     93: \subsubsection{ ox\_null }
                     94:
1.2     ! noro       95: Primitive のスタックマシンのソケットによる実装.
1.1       noro       96: スタックマシンは {\tt nullstackmachine.c} に実装されており,
                     97: {\tt oxserver00.c} にリンクしてサーバとなる.
1.2     ! noro       98: サンプルサーバであり, これに CMO Primitive 仕様の関数を結合すれば,
1.1       noro       99: 一応 サーバが動作するはずである.
1.2     ! noro      100: スタックには,CMO の Primitive の object へのポインタがそのまま push される.
1.1       noro      101: コントロール機能なし. 1997/11/29 版よりコントロール機能追加.
                    102: @Old/nullserver00.c.19971122c,
                    103: @Old/mytcpip.c.19971122c
                    104:
                    105: 現在はこのサーバはメンテナンスされていない
                    106: (object 関係の関数を追加しないとコンパイルできない.)
                    107:
                    108: \subsubsection{ testclient }
                    109:
                    110:
                    111: Java による実装:
                    112: @Old/client.java.19971122c
                    113: これも現在はふるい.
                    114: OX パケットのシリアル番号に対応していない.
                    115: ちかいうちに改訂する予定.
                    116: {\tt executeString} および {\tt popString} を要請する能力しか持たない.
                    117: 受信は スレッド {\tt listner} がおこなっている.
                    118: 受信は byte データを表示するのみである.
                    119: スレッドの優先度をうまくバランスとらないと, 受信データがあるのに
                    120: 表示しなかったりする.
                    121:
                    122: C による {\tt testclient}
                    123: 同じような機能をもつプログラムの実装もある.
                    124: {\footnotesize \begin{verbatim}
                    125: ./ox -ox ox_sm1 -host localhost -data 1300 -control 1200  (サーバの立ち上げ)
                    126: ./testclient     (testclient の立ち上げ)
                    127: \end{verbatim}}
                    128: これも現在はふるい.
                    129:
                    130: 田村 ({\tt tamura@math.kobe-u.ac.jp}) による Java への新しい実装がある
                    131: (1999, 3月, 神戸大学修士論文).
                    132:
                    133: \subsubsection{ {\tt ox} }
                    134: {\tt ox} は ox サーバをたちあげるためのプログラムである.
                    135: クライアントよりサーバへ接続するには二つの方法がある.
                    136: 一つは {\tt ox} で データとコントロール用の二つの
                    137: ポート番号を明示的に起動し, クライアントがこのポートへつなぎに
                    138: いく方法である.
                    139: もう一つは, クライアント側でまず, 空いているポートを二つ
                    140: さがし, それから {\tt ox} を {\tt -reverse} で起動して
                    141: サーバ側がクライアントにつなぎにくる方法である.
                    142: この場合, {\tt ox} はたとえば次のように起動される.
                    143: {\footnotesize \begin{verbatim}
                    144: /home/nobuki/kxx/ox -reverse -ox /home/nobuki/kxx/ox_sm1
                    145: -data 1172 -control 1169 -pass 1045223078
                    146: \end{verbatim} }
                    147:
                    148: {\tt ox} は, 子どもプロセスとして, {\tt ox\_asir}, {\tt ox\_sm1}
                    149: などを起動するのであるが,
                    150: これらのプロセスは
                    151: 3 よりOX データ, コマンドを読み込み, 4 へ OX データを書き出す.
                    152: 現在の実装では 3 と 4 は dup して同一視してしまっている.
                    153: {\tt ox} はTCP/IP のデータ転送のポートを, 3, 4 へわりあてて,
                    154: 子どもプロセスを起動する.
                    155: {\footnotesize \begin{verbatim}
                    156: close(fdControl);   /* close(0); dup(fdStream); */
                    157: dup2(fdStream,3);
                    158: dup2(fdStream,4);
                    159: \end{verbatim}}
                    160:
                    161:
                    162: \subsubsection{ {\tt ox\_asir} phrase book}
                    163:
                    164: [ この節の記述は古い]
                    165: CMObject と asir の object は次の規則にしたがって変換される.
                    166: なお asir の object のタグをみるには関数 {\tt type} を用いる.
                    167: \begin{enumerate}
                    168: \item Null :  0 として使用される.
                    169: \item Integer32 : 内部的にのみ使用される. 送出は, ZZ に変換される.
                    170:   -1 は (unsigned int) -1 に変換されてから, ZZ に変換されるので,
                    171:   正の数となる.
                    172: \item Cstring : 文字列 (type = 7) に変換される.
                    173: \item ZZ : 数 (type = 1 ) に変換される.
                    174: \item QQ : 数 (type = 1 ) に変換される.
                    175: \item List : リスト (type = 4) に変換される.
                    176: \item Dpolynomial : 分散表現多項式 (type = 9) に変換される.
                    177: order はうけとったモノミアルのリストと同じ order である.
                    178: \item RecursivePolynomial : 再帰表現多項式に変換される.
                    179: 内部順序に自動変換される.
                    180: \item Indeterminate : 不定元に変換される.
                    181: \end{enumerate}
                    182: 記述のない CMObject に関しては, 利用できない (cf. mathcap ).
                    183:
                    184: \noindent
                    185: 問題点: 0 の扱いの仕様がまださだまっていない.
                    186: Null が数 (type = 1) の 0 に変換される版もある.
                    187:
                    188: \medbreak
                    189: \noindent
                    190: 例:
                    191: 分散表現多項式の $x^2-1$ の因数分解を asir にやってもらう
                    192: OXexpression の列をあげる.
                    193: {\footnotesize
                    194: \begin{verbatim}
                    195: (OX_DATA, (CMO_LIST, 4, CMO_DMS,CMO_DMS_GENERIC,
                    196: (CMO_MONOMIAL32,1,2,(CMO_ZZ,1)),
                    197: (CMO_MONOMIAL32,1,0,(CMO_ZZ,-1)))),
                    198: (OX_DATA, (CMO_INT32,1))
                    199: (OX_DATA, (CMO_STRING,"ox_dtop"))
                    200: (OX_COMMAND,(SM_executeString))
                    201:
                    202: (OX_DATA, (CMO_INT32,1))
                    203: (OX_DATA, (CMO_STRING,"fctr"))
                    204: (OX_COMMAND,(SM_executeString))
                    205:
                    206:
                    207: (OX_DATA, (CMO_INT32,1))
                    208: (OX_DATA, (CMO_STRING,"ox_ptod"))
                    209: (OX_COMMAND,(SM_executeString))
                    210:
                    211: (OX_COMMAND,(SM_popCMO))
                    212: \end{verbatim}}
                    213:
                    214: ここで, ZZ の元を普通の整数表記であらわした.
                    215: {\tt dtop1} および {\tt ptod1} はそれぞれ, 分散表現多項式を, Asir の再帰表現
                    216: 多項式に, 逆に, Asir の再帰表現多項式を, 分散表現多項式に変換する,
                    217: ユーザ定義の 1 引数関数である. %% kxx/oxasir.sm1
                    218: これらの関数は Asir の リストにも作用させることが可能であり, その場合は
                    219: 要素としてでてくる,  分散表現多項式 または Asir の再帰表現多項式
                    220: を必要な形に変換する.
                    221: {\tt fctr} は因数分解をする組み込み関数である.
                    222:
                    223: {\tt kxx/oxasir.asir} のソース.
                    224: {\footnotesize \begin{verbatim}
                    225: OxVlist = [x,y,z]$
                    226:
                    227: def ox_ptod(F) {
                    228: extern OxVlist;
                    229: if (type(F) == 4) return(map(ox_ptod,F));
                    230: else if (type(F) == 2) return(dp_ptod(F,OxVlist));
                    231: else return(F);
                    232: }
                    233:
                    234: def ox_dtop(F) {
                    235: extern OxVlist;
                    236: if (type(F) == 4) return(map(ox_dtop,F));
                    237: else if (type(F) == 9) return(dp_dtop(F,OxVlist));
                    238: else return(F);
                    239: }
                    240:
                    241: end$
                    242: \end{verbatim}}
                    243:
                    244: \subsubsection{ {\tt ox\_sm1} phrase book }
                    245:
                    246: [ この節の記述は古い]
                    247: CMObject と kan/sm1 の object は次の規則にしたがい変換される.
                    248: なお, kan/sm1 の object のタグをみるには, {\tt tag} または {\tt etag}
                    249: を用いる.
                    250: \begin{enumerate}
                    251: %% \item Error : Error (etag = 257) に変換される.
                    252: \item Error2 : Error (etag = 257) に変換される.
                    253: \item Null : null (tag = 0) に変換される.
                    254: \item Integer32 : integer (tag = 1) に変換される.
                    255: \item Cstring : 文字列 (type = 5) に変換される.
                    256: \item ZZ : universalNumber (type = 15 ) に変換される.
                    257: \item QQ : rational (tag = 16 ) に変換される.
                    258: \item List : array (tag = 6) に変換される.
                    259: \item Dpolynomial : 多項式 (tag = 9) に変換される.
                    260: \end{enumerate}
                    261:
                    262:
                    263: \noroa{ {\tt SS475/memo1.txt} も見よ.}
                    264:
                    265: 注意: {\tt ReverseOutputOrder = 1} (標準)
                    266: のとき, {\tt xn, ..., x0, dn, ..., d0} の順番で
                    267: ({\tt show\_ring} の形式) Dpolynomial に変換される
                    268: (印刷形式だと,
                    269: {\tt xn} は {\tt e}, {\tt d0} は {\tt h},
                    270: {\tt x0} は {\tt E}, {\tt dn} は {\tt H}).
                    271: たとえば,
                    272: {\tt ox\_send\_cmo(id,<<1,0,0,0,0,0>>)}  は,
                    273: {\tt x2} に変換される.
                    274: {\tt ox\_send\_cmo(id,<<0,0,1,0,0,0>>)}  は,
                    275: {\tt x0} に変換される.
                    276:
                    277: {\tt OxVersion} 変数で openXM のプロトコルの version を表す.
                    278:
                    279: \subsubsection{ {\tt ox\_sm1} を用いたクライアントのテスト方法 }
                    280: まだかいてない.
                    281:
                    282: \subsubsection{ {\tt Asir} を用いたサーバのテスト方法 }
                    283:
                    284: \subsection{ 最小の TCP/IP クライアントの例 }
                    285:
                    286: Java または M2 によるソースコードを掲載の予定.
                    287:
                    288: \subsection{ クライアント asir, sm1 }
                    289:
                    290: sm1 については, ox.sm1 , oxasir.sm1 がクライアントパッケージ.
                    291: {\tt ox}, {\tt ox\_asir}, {\tt ox\_sm1} の存在するパス,
                    292: および sm1 より呼び出すための asir の関数定義である
                    293: {\tt oxasir.asir} のあるパスを
                    294: これらのパッケージに書き込んでおく必要がある.
                    295:
                    296: {\tt ox\_asir} は, {\tt asir} なる名前でよばれると
                    297: asir として動作し, {\tt ox\_asir} なる名前でよばれると,
                    298: open XM サーバとして動作する.
                    299: {\tt /usr/local/lib/asir} または
                    300: {\tt ASIR\_LIBDIR} へ {\tt ox\_asir} 実体をおき,
                    301: {\tt ox\_launch} をおなじディレクトリへ {\tt ox\_asir} へのシンボリックリンク
                    302: として作成する.
                    303: コマンドサーチパスにあるディレクトリへ {\tt asir} を {\tt ox\_asir}
                    304: へのシンボリックリンクとして作成する.
                    305: {\footnotesize
                    306: \begin{verbatim}
                    307:
                    308: This is Asir, Version 990413.
                    309: Copyright (C) FUJITSU LABORATORIES LIMITED.
                    310: 3 March 1994. All rights reserved.
                    311: 0
                    312: [324] ox_launch(0,"/usr/local/lib/asir/ox_asir");
                    313: 1      <=== これがサーバの番号.
                    314: [326] ox_execute_string(1,"fctr(x^10-1);");
                    315: 0
                    316: [327] ox_pop_local(1);
                    317: [[1,1],[x-1,1],[x+1,1],[x^4+x^3+x^2+x+1,1],[x^4-x^3+x^2-x+1,1]]
                    318: [328] ox_execute_string(1,"dp_ptod((x+y)^5,[x,y]);");
                    319: 0
                    320: [329] ox_pop_cmo(1);
                    321: (1)*<<5,0>>+(5)*<<4,1>>+(10)*<<3,2>>+(10)*<<2,3>>+(5)*<<1,4>>+(1)*<<0,5>>
                    322: [330] ox_rpc(1,"fctr",x^10-y^10);
                    323: 0
                    324: [331] ox_pop_local(1);
                    325: [[1,1],[x^4-y*x^3+y^2*x^2-y^3*x+y^4,1],[x^4+y*x^3+y^2*x^2+y^3*x+y^4,1],[x+y,1],[x-y,1]]
                    326: [332] ox_rpc(1,"fctr",x^1000-y^1000);   ox_cmo_rpc もあり.
                    327: 0
                    328: [333] ox_flush(1);
                    329: 1
                    330: [334] ox_pop_local(1);
                    331: 0
                    332:
                    333: ox_sync(1);   --- sync ball を送る.
                    334:
                    335: \end{verbatim}}
                    336:
                    337: \subsection{開発中のサーバ, クランアント}
                    338:
                    339: Mathematica サーバ, クライアント : 小原.
                    340: Java クライアント, Open Math proxy : 田村.
                    341: Gnuplot サーバ, Macaulay 2 クライアント, サーバ,
                    342: その他小さいソフト (Toric GB, Grobner fan)のサーバ,
                    343: Algebraic equation solver by numerical method: 高山.
                    344: Open Asir マニュアル, サンプル: 小原, 高山.
                    345:
                    346: 数学的におもしろい問題を実際にあつかってみないと
                    347: わからない問題点もおおくあると思う.
                    348: 現在, ${\cal A}$-超幾何関数の解のグラフ表示,
                    349: パラメータ付積分のグラフ表示のソフトをかくことで
                    350: さらに問題点をさぐることを
                    351: 計画している.
                    352: グレブナdeformation による多項式解, 有理解の導出(線形および非線形方程式,
                    353: 非線形微分方程式から出発すると代数方程式を解く問題になる)
                    354: は OpenXM 的なプログラムのおもしろい練習問題.
                    355: Java の並列計算記述能力をつかって ox サーバを使うのもおもしろい.
                    356:
                    357: 世界中の人につかってもらえる規格にするには
                    358: まだまだ実験と経験をかさねないといけない.
                    359: Free Mathematical Software Initiative を作るべきだろう.
                    360:
                    361: \subsection{ Change log }
                    362: \begin{enumerate}
                    363: \item 1997/11/20 : この document の最初の version が生まれた.
                    364:   kxx/openxxx.tex なる名前であった.
                    365: \item 1999/07 : {\tt CMO\_ZZ} の形式を変えた.
                    366: \item 1999/09/7, 9/8 : 分散表現多項式, Mathcap, RecursivePolynomial,
                    367: の形式を変えた. asir, sm1 に実装した. エラー処理のために,
                    368: dupErrors, getsp を SM コマンドに加えた.
                    369: \end{enumerate}
                    370:
                    371: \subsection{ }
                    372: Java で sm1 サーバをすべて書いてみるか?
                    373: */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>