[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.1

1.1     ! noro        1: %% $OpenXM$
        !             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:
        !            58: 次に, CMO Basic0 の機能を
        !            59: 1997, 5 月, 6 月に実現した.
        !            60: その後, 1997年 7 月に, SMObject/Basic1 の実装,
        !            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:
        !            95: Basic0 のスタックマシンのソケットによる実装.
        !            96: スタックマシンは {\tt nullstackmachine.c} に実装されており,
        !            97: {\tt oxserver00.c} にリンクしてサーバとなる.
        !            98: サンプルサーバであり, これに CMO Basic0 仕様の関数を結合すれば,
        !            99: 一応 サーバが動作するはずである.
        !           100: スタックには,CMO の Basic0 の object へのポインタがそのまま push される.
        !           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>