Annotation of OpenXM/doc/OpenXM-specs/implementation.tex, Revision 1.4
1.4 ! takayama 1: %% $OpenXM: OpenXM/doc/OpenXM-specs/implementation.tex,v 1.3 2000/10/12 00:14:51 ohara Exp $
! 2: //&jp \section{ 実装, デバッグ, 検証 }
1.1 noro 3:
1.4 ! takayama 4: //&jp \subsection{ 実装の手順 }
1.1 noro 5:
6: /*&jp
1.4 ! takayama 7: ソフト xxx を, open XM 対応にするのには以下のような
! 8: 手順をふむと開発が容易であろう.
1.1 noro 9: \begin{enumerate}
10: \item[Step 1.]
11: {\tt executeStringByLocalParser}
1.4 ! takayama 12: および {\tt popString} の機能を実現して,
! 13: xxx をライブラリとしてまとめ, 他のソフトとリンクして
! 14: 使用できるかテストする.
! 15: C での実現の場合 割り込みの取扱に注意を要する.
! 16: これだけの実現でも, サンプルサーバ
! 17: ({\tt nullserver00.c}) とリンクすれば,
! 18: open XM 対応のクライアントと通信できる.
! 19: クライアント側では, このシステムに対応した機能呼び出し
! 20: プログラムを書く.
1.1 noro 21: \item[Step 2.]
1.4 ! takayama 22: 次に, CMO を可能な限り実装する.
! 23: open sm1 や open asir で, CMO 形式のデータを
! 24: 作成して, 読み込めるかテストする.
1.1 noro 25: \item[Step 2'.]
1.4 ! takayama 26: {\tt kan/sm1} の plugin として組み込むとサーバの開発が楽かもしれない.
! 27: {\tt kan/sm1} のソースファイルのディレクトリ {\tt plugin} を見よ.
1.1 noro 28: \item[Step 3.]
1.4 ! takayama 29: CMO の stream への転送, stream よりの転送は,
! 30: 巨大データの送信受信にきわめて大切である.
! 31: これを実装しサンプルサーバとリンクする.
1.1 noro 32: \end{enumerate}
33:
34:
1.4 ! takayama 35: \subsection{歴史}
! 36: kan -- asir 間でも以上のように開発がすすんだ.
1.1 noro 37:
1.4 ! takayama 38: Risa/Asir の開発が沼津の富士フォーラムでおこなわれていた
! 39: ころ, 私が沼津を, 1996年, 1月19日に訪問し,
1.1 noro 40: {\tt Asir\_executeString()}
1.4 ! takayama 41: の機能を野呂さんに書いてもらって, kan より asir を文字列で呼び出す
! 42: 機能およびその逆を実現したのがことの発端である.
! 43: たとえば, asir より kan/sm1 の機能を呼び出すには,
1.1 noro 44: \begin{verbatim}
45: F = x; G = y;
46: Ans = kan("(%p). (%p). mul toString",F,G)
47: \end{verbatim}
1.4 ! takayama 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 Primitive の機能を
! 59: 1997, 5 月, 6 月に実現した.
! 60: その後, 1997年 7 月に, SMObject/Basic の実装,
! 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} である.
1.1 noro 89:
1.4 ! takayama 90: \subsubsection{OpenXM/src/ox\_toolkit にあるサンプル実装}
! 91: このディレクトリの解説文書を見よ.
1.1 noro 92:
93: \subsubsection{ ox\_null }
94:
1.4 ! takayama 95: Primitive のスタックマシンのソケットによる実装.
! 96: スタックマシンは {\tt nullstackmachine.c} に実装されており,
! 97: {\tt oxserver00.c} にリンクしてサーバとなる.
! 98: サンプルサーバであり, これに CMO Primitive 仕様の関数を結合すれば,
! 99: 一応 サーバが動作するはずである.
! 100: スタックには,CMO の Primitive の object へのポインタがそのまま push される.
! 101: コントロール機能なし. 1997/11/29 版よりコントロール機能追加.
1.1 noro 102: @Old/nullserver00.c.19971122c,
103: @Old/mytcpip.c.19971122c
104:
1.4 ! takayama 105: 現在はこのサーバはメンテナンスされていない
! 106: (object 関係の関数を追加しないとコンパイルできない.)
1.1 noro 107:
108: \subsubsection{ testclient }
109:
110:
1.4 ! takayama 111: Java による実装:
1.1 noro 112: @Old/client.java.19971122c
1.4 ! takayama 113: これも現在はふるい.
! 114: OX パケットのシリアル番号に対応していない.
! 115: ちかいうちに改訂する予定.
! 116: {\tt executeString} および {\tt popString} を要請する能力しか持たない.
! 117: 受信は スレッド {\tt listner} がおこなっている.
! 118: 受信は byte データを表示するのみである.
! 119: スレッドの優先度をうまくバランスとらないと, 受信データがあるのに
! 120: 表示しなかったりする.
1.1 noro 121:
1.4 ! takayama 122: C による {\tt testclient}
! 123: 同じような機能をもつプログラムの実装もある.
1.1 noro 124: {\footnotesize \begin{verbatim}
1.4 ! takayama 125: ./ox -ox ox_sm1 -host localhost -data 1300 -control 1200 (サーバの立ち上げ)
! 126: ./testclient (testclient の立ち上げ)
1.1 noro 127: \end{verbatim}}
1.4 ! takayama 128: これも現在はふるい.
1.1 noro 129:
1.4 ! takayama 130: 田村 ({\tt tamura@math.kobe-u.ac.jp}) による Java への新しい実装がある
! 131: (1999, 3月, 神戸大学修士論文).
1.1 noro 132:
133: \subsubsection{ {\tt ox} }
1.4 ! takayama 134: {\tt ox} は ox サーバをたちあげるためのプログラムである.
! 135: クライアントよりサーバへ接続するには二つの方法がある.
! 136: 一つは {\tt ox} で データとコントロール用の二つの
! 137: ポート番号を明示的に起動し, クライアントがこのポートへつなぎに
! 138: いく方法である.
! 139: もう一つは, クライアント側でまず, 空いているポートを二つ
! 140: さがし, それから {\tt ox} を {\tt -reverse} で起動して
! 141: サーバ側がクライアントにつなぎにくる方法である.
! 142: この場合, {\tt ox} はたとえば次のように起動される.
1.1 noro 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:
1.4 ! takayama 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: 子どもプロセスを起動する.
1.1 noro 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:
1.4 ! takayama 164: [ この節の記述は古い]
! 165: CMObject と asir の object は次の規則にしたがって変換される.
! 166: なお asir の object のタグをみるには関数 {\tt type} を用いる.
1.1 noro 167: \begin{enumerate}
1.4 ! takayama 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 : 不定元に変換される.
1.1 noro 181: \end{enumerate}
1.4 ! takayama 182: 記述のない CMObject に関しては, 利用できない (cf. mathcap ).
1.1 noro 183:
184: \noindent
1.4 ! takayama 185: 問題点: 0 の扱いの仕様がまださだまっていない.
! 186: Null が数 (type = 1) の 0 に変換される版もある.
1.1 noro 187:
188: \medbreak
189: \noindent
1.4 ! takayama 190: 例:
! 191: 分散表現多項式の $x^2-1$ の因数分解を asir にやってもらう
! 192: OXexpression の列をあげる.
1.1 noro 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:
1.4 ! takayama 214: ここで, ZZ の元を普通の整数表記であらわした.
! 215: {\tt dtop1} および {\tt ptod1} はそれぞれ, 分散表現多項式を, Asir の再帰表現
! 216: 多項式に, 逆に, Asir の再帰表現多項式を, 分散表現多項式に変換する,
! 217: ユーザ定義の 1 引数関数である. %% kxx/oxasir.sm1
! 218: これらの関数は Asir の リストにも作用させることが可能であり, その場合は
! 219: 要素としてでてくる, 分散表現多項式 または Asir の再帰表現多項式
! 220: を必要な形に変換する.
! 221: {\tt fctr} は因数分解をする組み込み関数である.
1.1 noro 222:
1.4 ! takayama 223: {\tt kxx/oxasir.asir} のソース.
1.1 noro 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:
1.4 ! takayama 246: [ この節の記述は古い]
! 247: CMObject と kan/sm1 の object は次の規則にしたがい変換される.
! 248: なお, kan/sm1 の object のタグをみるには, {\tt tag} または {\tt etag}
! 249: を用いる.
1.1 noro 250: \begin{enumerate}
1.4 ! takayama 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) に変換される.
1.1 noro 260: \end{enumerate}
261:
262:
1.4 ! takayama 263: \noroa{ {\tt SS475/memo1.txt} も見よ.}
1.1 noro 264:
1.4 ! takayama 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: へのシンボリックリンクとして作成する.
1.1 noro 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");
1.4 ! takayama 313: 1 <=== これがサーバの番号.
1.1 noro 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]]
1.4 ! takayama 326: [332] ox_rpc(1,"fctr",x^1000-y^1000); ox_cmo_rpc もあり.
1.1 noro 327: 0
328: [333] ox_flush(1);
329: 1
330: [334] ox_pop_local(1);
331: 0
332:
1.4 ! takayama 333: ox_sync(1); --- sync ball を送る.
1.1 noro 334:
335: \end{verbatim}}
336:
1.4 ! takayama 337: \subsection{開発中のサーバ, クランアント}
1.1 noro 338:
1.4 ! takayama 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 を作るべきだろう.
1.1 noro 360:
361: \subsection{ Change log }
362: \begin{enumerate}
1.4 ! takayama 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 コマンドに加えた.
1.1 noro 369: \end{enumerate}
370:
371: \subsection{ }
1.4 ! takayama 372: Java で sm1 サーバをすべて書いてみるか?
1.1 noro 373: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>