Risa/Asir
*********

Risa および Asir
=============

Risa は, 富士通研で開発中の数式処理システム/ライブラリの総称である. Risa の構成は次の通りである.

  * 基本演算部

     これは, Risa の内部形式に変換されたオブジェクト (数, 多項式など) の間の演算を実行する部分であり, UNIX の libc.a などと同様の, ライブラリとして存在する. エンジンは, C および アセンブラで記述され, 後述する言語インタフェース Asir の基本演算部として用いられている一方, 数式計算を必要とするさまざまなプログラム中にリンクして用いることができる. (未公開)

  * メモリ管理部

     Risa では, メモリ管理部として, [Boehm,Weiser] によるフリーソフトウェア (gc-5.0alpha2) を用いている. これはガーベジコレクション (以下 GC と呼ぶ) を自動的に行うメモリ割り当て機構を持ち, Risa の各部分はすべてこれにより必要なメモリを得ている.

  * Asir

     Asir は, Risa の計算エンジンの言語インタフェースである. Risa では, 比較的容易にユーザ用の言語インタフェースを作ることができる. Asir はその一つの例として作ったもので, C 言語に近い文法をもつ. また, C のデバッガとして広く用いられている dbx 風のデバッガも備えている.

Asir の特徴
========

Asir は, 前述の通り, 計算エンジンの言語インタフェースである. 通常 Asir という名前の実行可能ファイルとして提供される. 現在サポートされている機能は概ね次の通りである.

  * C 言語風のユーザ言語

  * 数, 多項式, 有理式の加減乗(除)

  * ベクトル, 行列の演算

  * 最小限のリスト処理

  * 組み込み函数 (因数分解, GCD, グレブナ基底など)

  * ユーザ定義函数によるツール (代数体上の因数分解など)

  * dbx 風のデバッガ

  * 陰函数の描画

  * PARI (see pari) による初等超越函数を含む式の評価

  * UNIX 上での分散計算機能 (Open XM)

インストレーション
=========

以下の手続きで不明な点, 不都合な点があった場合の問い合わせは

     noro@para.flab.fujitsu.co.jp

宛に e-mail でお願いします.

UNIX 版
------

必要なファイルは asir.tgz である. これらは全て gzip で圧縮してあるので, 入手後 gzip で展開する. まず, インストールするディレクトリを決める. デフォルトでは /usr/local/lib に asir というディレクトリとしてインストールされることを仮定している. 以下このディレクトリをライブラリディレクトリと呼ぶ.

     # gzip -dc asir.tgz | ( cd /usr/local/lib; tar xf - )

個人的に使用する場合には, $HOMEなどに置いてもよい.

     % gzip -dc asir.tgz | ( cd $HOME; tar xf - )

この場合, ライブラリディレクトリの名前を環境変数 ASIR_LIBDIR に設定する必要がある.

     % setenv ASIR_LIBDIR $HOME/asir

Asir 本体は, ライブラリディレクトリの asir である. /usr/local/bin あるいはユーザの実行ファイルサーチパスのどこかにシンボリックリンクを作ると便利である.

     # ln -s /usr/local/lib/asir/asir /usr/local/bin/asir

この状態で asir を起動してみる.

     % /usr/local/bin/asir
     asir_key not found.
     ID for this machine is XXXXXXXX.
     See the file ASIR_INSTALL to get the correct key.

すると, このようなメッセージが出て asir は終了する. UNIX 版では, マシンごとに key と呼ばれる文字列が必要である. key を入手するためには,

     risa@para.flab.fujitsu.co.jp

宛に,

     ASIR XXXXXXXX

という 1 行のみからなる e-mail を送ればよい. XXXXXXXX は表示された ID である. 折り返し

     YYYYYYYY YYYYYYYY YYYYYYYY

という形の 1 行のみからなる e-mail が届くので, この 1 行を含む asir_key なるファイルをカレントディレクトリに作って asir を起動してみる.

     % /usr/local/bin/asir
     This is Asir, Version 990831.
     Copyright (C) FUJITSU LABORATORIES LIMITED.
     3 March 1994. All rights reserved.
     [0]

このようなプロンプトが出れば, 入手した key はそのマシンに対して有効である. key を書いておくファイルに関しては, 環境変数 ASIR_KEY の説明の項で詳しく述べるが, ライブラリディレクトリにここで作成したファイル asir_key を置けば, そのマシン上で全てのユーザが asir を使用できるようになる. asir_key には複数のマシンに対する key を書けるので, ライブラリディレクトリを共有している場合でも asir_key に行を追加していけばよい.

     # cp asir_key /usr/local/lib/asir

Windows 版
---------

必要なファイルは asirwin.tgz である. 他に, gzip.exe, tar.exe が必要だが, asirwin.tgz と同じディレクトリに用意してある. これら 3 つのファイルを同一ディレクトリにおき, DOS プロンプトから

     C:\...> tar xzf asirwin.tgz

を実行すれば, Asir というディレクトリ (Asir ルートディレクトリ) ができる. 990831 版では, GUI と本体が分離され, またデバッグウィンドウも別プロセスとして GUI が呼び出されるため, Asir ルートディレクトリが正しく登録されていることが必要である.  Asir ルートディレクトリのサブディレクトリ bin に asirgui.exe (GUI), engine.exe (本体) が置かれている. asirgui.exe の初回の立ち上げは, エクスプローラから行う. これにより

     HKEY_LOCAL_MACHINE\SOFTWARE\FUJITSU\Asir\99.03.31\Directory

というレジストリに Asir ルートディレクトリが正しく登録される.

コマンドラインオプション
============

コマンドラインオプションは次の通り.

-heap NUMBER
     Risa/Asir では, 4KB のブロックをメモリ割り当ての単位として用いている. デフォルトでは, 初期 heap として, 16 ブロック (64KB) 割り当てるが, それを変更する場合, -heap を用いる. 単位はブロックである. heap の大きさは, heap() 函数で調べることができる (単位はバイト).

-adj NUMBER
     この値が大きいほど, 使用メモリ量は大きくなるが, GC 時間が少なくなる. NUMBER として 1 以上の整数が指定できる. デフォルトでは 3 である. この値が 1 以下になると GC をしない設定になるので要注意である. heap をなるべく伸ばさずに, GC を主体にしてメモリ管理したい場合には, この値を大きく (例えば 8) 設定する.

-norc
     初期化ファイル $HOME/.asirrc を読まない.

-f FILE
     標準入力の代わりに, FILE から入力を読み込んで実行する. エラーの際にはただちに終了する.

-paristack NUMBER
     PARI (see pari) 専用の領域の大きさを指定する. 単位はバイト. デフォルトでは 1 MB.

-maxheap NUMBER
     heap 領域の上限を指定する. 単位はバイト. デフォルトでは無制限. UNIX の場合, 実際には limit コマンドで表示される datasize の値に制限されているため, -maxheap の指定がなくても一定量以上に heap を獲得できない場合があるので注意.)

環境変数
====

Asir の実行に関するいくつかの環境変数が存在する. UNIX 上では環境変数は shell のコマンドラインから直接設定するか, shell の rc ファイルで設定する. Windows NT では, [設定]->[システム]->[環境] で設定する. Windows 95/98 では, c:\autoexec.bat に書いて reboot する.

  * ASIR_KEY

     UNIX 版では, Asir が起動されたマシンに対する key がなければそのマシン上で Asir は動作しない. key は 16 進 8 桁 3 ワードからなり,

          % cat asir_key
          cf6f236c 61a35091 dddc4529 geisha
          82281685 d1929945 a8bd24ca yorktown
          34b75d30 63f8df93 3e881113 nyanchu

     という形で複数台のマシンに対する key を一つのファイルにまとめて書くことができる. key の後ろは無視されるので, コメントを書くことができる. key を含むファイルは, 以下の順でサーチされる.

      1. 環境変数 ASIR_KEY に指定されたファイル

      2. カレントディレクトリの asir_key

      3. 環境変数 ASIR_LIBDIR で指定されたディレクトリ (指定がなければ /usr/local/lib/asir) の asir_key

  * ASIR_LIBDIR

     Asir のライブラリディレクトリ, すなわちユーザ言語で書かれたファイルなどがおかれるディレクトリ. 指定がない場合 UNIX 版では /usr/local/lib/asir, Windows 版では Asir メインディレクトリの下の lib ディレクトリが用いられる.

  * ASIRLOADPATH

     ロードされるファイルがあるディレクトリを UNIX の場合 ':', Windowsの場合 ';' で区切って並べる. ディレクトリは左から順にサーチされる. この指定がない場合, および指定されたファイルが ASIRLOADPATH になかった場合, ライブラリディレクトリもサーチされる.

  * HOME

     -NORC オプションつきで起動しない場合, $HOME/.asirrcがあれば, 予めこのファイルを実行する. HOME が設定されていない場合, UNIX 版ではなにも読まないが, Windows 版では Asir メインディレクトリ (get_rootdir() で返されるディレクトリ) の .asirrc を探し, あればそれを実行する.

起動から終了まで
========

Asir を起動すると,

     [0]

なるプロンプトが表示され, セッションが開始する. $HOME/.asirrc (Windows 版の場合, HOME 設定されていない場合には get_rootdir() で返されるディレクトリにある .asirrc) が存在している場合, このファイルを Asir ユーザ言語でかかれたファイルと見なし, 解釈実行する.

プロンプトは入力の番号を表す. セッションは, end; または quit; を入力することにより終了する. 入力は, ; または $ までを一区切りとして評価される. ; のとき結果は表示され, $ のとき表示されない.

     % asir
     [0] A;
     0
     [1] A=(x+y)^5;
     x^5+5*y*x^4+10*y^2*x^3+10*y^3*x^2+5*y^4*x+y^5
     [2] A;
     x^5+5*y*x^4+10*y^2*x^3+10*y^3*x^2+5*y^4*x+y^5
     [3] a=(x+y)^5;
     evalpv : invalid assignment
     return to toplevel
     [3] a;
     a
     [4] fctr(A);
     [[1,1],[x+y,5]]
     [5] quit;
     %

この例では, A, a, x, y なる文字が使用されている. A はプログラムにおける変数で, a, x, y は数学的な意味での不定元である. 一般にプログラム変数は大文字で始まり, 不定元は小文字で始まる. この例でわかるように, プログラム変数は, 数, 式などを格納しておくためのものであり, C 言語などにおける変数に対応する. 一方, 不定元はそれ自身で値を持つことはできず, 従って, 不定元に対する代入は許されない. 後に示すが, 不定元に対する代入は, 組み込み函数 subst() により明示的に行われる.

割り込み
====

計算を実行中に割り込みをかけたい場合, 割り込みキャラクタ(通常は C-c, DOS 版では C-x, Mac 版では command+. ) を入力する.

     @ (x+y)^1000;
     C-cinterrupt ?(q/t/c/d/u/w/?)

各選択肢の意味は次の通り.

q
     Asir を終了する. (確認あり)

t
     トップレベルに戻る. (確認あり)

c
     実行を継続する.

d
     デバッグモードに入る. デバッガに関しては see デバッガ.

u
     register_handler() (see ox_reset register_handler) で登録された関数を実行後トップレベルに戻る. (確認あり)

w
     中断点までの函数の呼び出し列を表示する.

?
     各選択肢の意味を説明する.

エラー処理
=====

組み込み函数に不正な型の引数を渡した場合などには実行が中断されるが, ユーザ函数の中でエラーが起きた場合にはトップレベルに戻る前に自動的にデバッグモードに入る. この状態でエラーの場所, 直前の引数の値などを調べることができる. 表示されるエラーメッセージはさまざまであり, 内部の函数名に引き続いてメッセージが表示される. これは, 呼び出された組み込み函数と必ずしも対応はしない.

その他, さまざまな原因により内部演算函数においてエラーが生ずることがある. UNIX 版の場合, これは次のいずれかの internal error として報告され, 通常のエラーと同様に扱って, デバッグモードに入る.

SEGV
BUS ERROR

     組み込み函数によっては, 引数の型を厳密にチェックせずに演算ルーチンに引き渡してしまうものも存在している. このような状況において, 不正なポインタ, あるいは NULL ポインタによるアクセス違反があった場合, これらのエラーとなる.

BROKEN PIPE

     プロセス間通信において, 相手先のプロセスとの間のストリームが既に存在していない場合 (例えば既に相手先のプロセスが終了している場合など) に, そのストリームに入出力しようとした場合にこのエラーとなる.

これらは実際には, 組み込み函数の入口において, 引数を完全にチェックすることにより大部分は防げるが, 手間が多くかかることと, 場合によっては効率を落すことにもなるため, あえて引数チェックはユーザ任せにしてある.

計算結果, 特殊な数
==========

@ はエスケープ文字として使用される. 現在次のような規定がある.

@N
     N 番目の計算結果.

@@
     直前の計算結果.

@i
     虚数単位.

@pi
     円周率.

@e
     自然対数の底.

@
     2 元体 GF(2) 上の一変数多項式の変数 (不定元).

@>, @<, @>=, @<=, @==, @&&, @||
     quantifier elimination における, 一階述語論理演算子

     [0] fctr(x^10-1);
     [[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]]
     [1] @@[3];
     [x^4+x^3+x^2+x+1,1]
     [2] eval(sin(@pi/2));
     1.000000000000000000000000000000000000000000000000000000000
     [3] eval(log(@e),20);
     0.99999999999999999999999999998
     [4] @0[4][0];
     x^4-x^3+x^2-x+1
     [5] (1+@i)^5;
     (-4-4*@i)
     [6] eval(exp(@pi*@i));
     -1.0000000000000000000000000000
     [7] (@+1)^9;
     (@^9+@^8+@+1)

トップレベルで計算された値はこのようにヒストリとして取り出し可能であるが, このことは, ガベージコレクタにとっては負担をもたらす可能性がある. 特に, 大きな式をトップレベルで計算した場合, その後の GC 時間が急速に増大する可能性がある. このような場合, delete_history() (see delete_history) が有効である.