Wolframシステムセッションの全体的な状況を見る
Wolframシステムセッションにおける対話モードを可能にしているのがフロントエンドの「メインループ」である.これは,ユーザからの入力待ち,カーネルへの入力の送出,評価結果の表示,そして再び入力待ちに戻るといった一連の操作を常時繰り返す機構のことである.本章ではこのメインループに関連した大域オブジェクトの扱い方を説明する.
In[n] | 第 n 入力行の式 |
InString[n] | 第 n 入力行の式のテキスト形式 |
%n または Out[n] | 第 n 出力行の式 |
Out[{n1,n2,…}] | 出力式のリスト |
%%…% (n 回)または Out[-n] | n 行前の出力行の式 |
MessageList[n] | 第 n 行の入力の評価中に発生したメッセージを列挙する |
$Line | 現在の行番号(変更可) |
$HistoryLength | 一時保管する入力と出力の最大数 |
セッションの開始から終了まで,ユーザの入力行と出力行は通常すべて保管される.このため,長引くセッションでは大量のメモリを消費するような事態を招きかねない.そこで,不要になった入力行と出力行は個別に消去できるようになっている.入力式をInとし出力式をOutとするならば,これらの式を消去するには,Unprotect[In,Out]と入力した後に,Clear[In,Out]と入力する.また,大域変数$HistoryLengthを小さめに設定することで,入出力履歴の保管サイズを限定することもできる.
$Lineと呼ばれる行番号のカウンタが用意されている.このカウンタをセッションのどこからでも再設定することで,新規に生成される式が古い式を上書きするようにすることができる.
$PreRead | カーネルに送る前に各入力文字列に適用する関数 |
$Pre | 評価処理の前に各入力式に適用する関数 |
$Post | 評価処理の後に各入力式に適用する関数 |
$PrePrint | Out[n]へ評価結果である出力式が割り当てられた後で,表示される前に適用する関数 |
$SyntaxHandler | 文法上の誤りがある入力行に適用する関数 |
Wolframシステムには各種の「フック」が用意されているので,それらに対して関数を指定しておけば,メインループの各段階においてカスタム的な式の処理方法を使うことができる.例えば,大域変数$Preに対してある関数を割り当てておけば,入力される式が何であってもそれは式が評価される前に自動的に適用される.
標準メインループで行われる最初の処理項目は入力された文字列の取込みである.特に,特殊文字を扱う必要がある場合はWolframシステムに処理させる前にこの文字列を編集しておきたいことがある.その場合は,大域変数$PreReadに編集に使う関数を指定しておく.すると,処理の前にその関数が文字列に適用され,その結果が特定の入力行に対する実際の入力文字として使われる.
文法上の誤りのない入力式が正常に読み込まれると,評価処理が次に施される.ただし,$Preに関数が割り当てられた場合は,評価の前にその関数により定義される前処理が行われる.また,$Postに割当て指定があれば,それは後処理として評価の後に行われる.$Pre関数に与えられる引数を評価保留にしておかないと,$Post関数と同じ効果を持つので注意が必要である.
カーネルから結果が出るたびにNを適用する:
Wolframシステムが結果を生成し,$Postの後処理が適用されると,直ちにOut[$Line]の値としてのその結果の割当てが行われる.次に,結果の表示が行われる.ここで,$PrePrintに関数が割り当てられている場合はその前にこの関数が適用され表示に関する前処理が行われる.
$PrePrintに割り当てた値を除去する:
Wolframシステムのセッションからは各種の出力が生成される.「ストリームと低レベルの入出力」で説明しているように,出力されるものの種類によって違う出力チャンネルが使われる.各出力チャンネルには,そのチャンネルに割り当てられた出力ストリームのリストを与える大域変数が設けられる.
$Output | 標準出力とPrintコマンドのテキスト出力 |
$Echo | 入力行のエコー(InString[n]として記憶される) |
$Urgent | 入力プロンプトと他の緊急出力 |
$Messages | 標準メッセージとMessageコマンドの出力 |
出力チャンネルに割り当てられているストリームのリストを変更することで,出力の種類を限定した上でリダイレクトしたりコピーしたりすることが可能になる.例えば,ファイルを出力ストリームとしておき,そのストリームを$Echoのリストに入れておけば,カーネルに入力されるすべての式を自動的にファイルに取っておくことができる.
Streams[] | 現在開いた状態にあるすべてのストリームのリスト |
Streams["name"] | 指定名を持つ開いた状態にあるすべてのストリームのリスト |
$Input | 現行入力ストリームの名前 |
$InputFileName | 現在入力が検索されているファイルへの完全な絶対パス |
関数Streamsを使えば,現行のセッションでアクティブなストリームをすべて列挙することができる.また,変数$InputはWolframシステムへ入力を送るのに現在使われている入力ストリームの名前を与える.$InputはGetコマンド等が実行されると再設定される.また,Getは$InputFileNameを入力が読み込まれているファイルへの完全な絶対パスに設定する.
$MessagePrePrint | メッセージに含まれる式に適用する関数 |
$Language | メッセージ表示に使うデフォルト言語のリスト |
「メッセージ」で説明したように,通常,メッセージはStringFormを通してメッセージのテキストと結び付けられた一連の式を含む.表示の前に,$MessagePrePrintに割り当てた関数が式に適用され前処理が行われる.$MessagePrePrintのデフォルトでは,テキストのフォーマットにはShortが,タイプセットにはShortとShallowの組合せが使われる.
セッションを終了するように命令するまでメインループにおける操作処理は続く.フロントエンドによっては終了命令のために特別な操作法が用意されているが,ExitもしくはQuitを呼び出せば,フロントエンドの操作法によらず終了処理ができる.
$Epilogと呼ばれる大域変数が用意されており,そこにセッション終了直前にWolframシステムに処理させたいことを指定できるようになっている.こうすると,例えば終了前に特定のオブジェクトを保存できる.
$IgnoreEOF | エンド・オブ・ファイルの識別記号を無視するかしないかを指定する大域変数 |
「特殊文字」で説明したが,文字が特別なものであっても通常特別な扱いをしない.ただし,例外となり得るものが1つある.それはエンド・オブ・ファイル記号(End‐Of‐File,EOFと省略)で,$IgnoreEOF=Falseの条件が設定してあるときは,記号EOFが有効となり特別扱いされる.つまり,標準対話セッションにおいて,ある入力行で入力したものがEOFだけの場合,そのセッションは即座に終了する.
バッチ処理的にWolframシステムを使い,ファイルからすべての入力を行う場合は,$IgnoreEOFの現行設定によらずファイルが終了した時点でWolframシステムが終了する.
計算を進めていく途中でカーネル処理の中間過程を追うことができると,式がどう計算されるかが分かるため便利である.標準対話セッションでは,コマンドDialogを使いダイアログ(二次セッション)を設け中間処理を追跡できるようになっている.「評価処理のトレース」で説明したように,評価する式にTraceDialogを入れておくと,挿入部が評価される際にDialogが自動的に呼び出され中間結果を参照できるようになる.また,計算中にカーネルを一時停止させた場合も,ダイアログを開き計算状況を参照できるようになっている.
Dialog[] | ダイアログを開始する |
Dialog[expr] | expr を % の現行値として,ダイアログを開始する |
Return[] | % の現行値を戻り値としてダイアログを終了する |
Return[expr] | expr の現行値を戻り値としてダイアログを終了する |
Returnでダイアログを終了させる:
ダイアログを終了する際に,コマンド書式Return[expr]を使い式を指定しておくと,その式を計算させ,計算値をダイアログの戻り値として得ることができる.戻り値が必要なく,また,$IgnoreEOF=Falseの条件が設定してあるなら,EOFを入力するだけでダイアログを止めることができる.ただし,この操作はテキスト型インターフェースに限る.
ダイアログを開始する上で,「初期式」を与えられると便利である.Dialog[expr]を使うことで,expr を初期式とするダイアログを設けることができる.この式をダイアログの中で参照するには % を使う.
Dialogでは,Wolfram言語の標準メインループに従った二次的なループが使われ,メインループと同様な処理が行われる.動作環境の設定として,メインループで設定してある各種の現行値が継承される.ダイアログだけで局所的に有効な設定値も中にはあるので,それらに関しては,ダイアログの終了時にもとの値に戻される.
例えば,ダイアログが開始すると,行番号にはメインの$Lineにある現行値が継承される.すなわち,ダイアログの行番号はメインループで使われた最終番号に続く番号が使われる.しかし,ダイアログ自体の$Lineは局所的に有効なだけなので,ダイアログを終了しメインに戻ったなら,メインでの$Lineはもとの最終番号になる.
行番号10の入力でダイアログを始めると,ダイアログの最初の入力行にはIn[11]が付けられる.続く行にはIn[12],In[13]と行番号が付けられる.また,ダイアログを終了すると,メインにおける次の行番号は再びIn[11]になる.この時点でなら,ダイアログで得た結果はOut[11],Out[12]の指定で参照が可能である.それでも,一度,メインでIn[12],In[13]の入力行が使われると,同じ行番号のダイアログ結果は上書きされなくなってしまう.
標準セッションにおいて,ダイアログにいるのかいないのかは,入出力行がインデントしているかどうかを見ることで判断することができる.ダイアログからもう1つダイアログを開くと,2種類のインデントを得る.つまり,ネストしたダイアログを使うと,レベル d のダイアログ行にはオブジェクトDialogIndent[d]に指定済みの出力書式に準じたインデントが行われる.ダイアログ行の表示の仕方を変えたければインデント書式を変更すればよい.
DialogSymbols:>{x,y,…} | 現行ダイアログだけに有効な局所値を持つシンボルを指定する |
DialogSymbols:>{x=x0,y=y0,…} | 初期値を持つシンボルを指定する |
DialogProlog:>expr | ダイアログ開始前に評価しておく式を指定する |
Dialogのオプション
DialogSymbolsに何を指定しても,Dialogにおける$Line,$Epilog,$MessageListの設定値はそのダイアログだけで有効である.また,$Epilogに後処理を指定しておくと,それはダイアログが終了する際に自動的に行われる.
Dialogを呼び出した後に最初に行われるのが変数の局所化である.次に,オプションDialogPrologに指定した前処理が実行される.また,Dialogに引数を与えた場合は,前処理の次に引数が評価される.これらの処理の後に実際のダイアログが開始する.
Return[expr]のコマンド書式を使いダイアログを終了させると,式を戻り値として得ることができる.特に式を指定しなければダイアログで最後に得られた結果が戻り値になる.
DateList[] | 在の日付と時刻を返す(表示書式は{year,month,day,hour,minute,second}) |
DateList[TimeZone->z] | 時刻帯 z における現在の日付と時刻を返す |
$TimeZone | 使用しているコンピュータシステムに設定されている時刻帯を参照する |
Wolfram言語関数DateListを使うと,オペレーティングシステムの管理する現在の日付と時刻を得ることができる.DateListは夏時間の調整等はオペレーティングシステムにおいてすでに行われていることを前提とする.さらに,オペレーティングシステムレベルで適当な時刻帯が選択済みであることを前提とする.
変数$TimeZoneは,使用中のコンピュータシステムによって仮定される現在の時間帯を返す.時刻帯の値はローカル時からグリニッジ標準時(GMT)を差し引くことで得られる時間差を示す.例えば,米国東部標準時間(EST)ならば,この値はになる.また,夏時間は時刻帯の値に含まれるので,米国東部夏時間(EDT)なら値はになる.
AbsoluteTime[] | 1900年1月1日午前0時から現在までに経過した時間 (単位:秒) |
SessionTime[] | Wolframシステムの現行セッションにおいて開始時から現在までに経過した時間 (単位:秒) |
TimeUsed[] | Wolframシステムの現行セッションで使ったCPU時間(単位:秒) |
$TimeUnit | オペレーティングシステムの管理する時間更新の最小単位 |
オペレーティングシステムの時間管理は一定間隔で行われている.この時間幅は$TimeUnitを参照することで知ることができる.通常,この値は秒あるいは秒程度に設定される.
Pause[n] | 少なくとも n 秒間一時停止する |
10秒待ってから,時間情報を取得する.待機しようがしまいが,TimeUsed[]の返してくるCPU時間は同じことに注目:
AbsoluteTime[date] | 日付を絶対時間へ変換 |
DateList[time] | 絶対時間を日付へ変換 |
DateList["string"] | 日付の文字列をリストに変換する |
DateList[{"string",{"e1","e2",…}}] | "string"から要素"ei"を抽出することにより得られる日付のリストを返す |
DateList["string"]を使うと,日付形式が十分に明確である限り,日付文字列を日付リストに変換することができる.
変換をより制御するために,文字列に現れるデータ要素の順序とタイプを指定することができる.要素には"Year","Quarter","Month","MonthName","Day","DayName","Hour","AMPM","Minute","Second"等の文字列が使える.
DateString[] | 現在のローカル日時を表す文字列 |
DateString[datespec,elems] | datespec で与えられる日付と時間の要素 elems を返す |
DateStringは日付と時間をきれいに文字列表現するために使われる.正確な出力形式は"DateTime","DayName","HourShort"等の日付要素の長いリストから指定することができる.
DatePattern[elems] | データを指定の要素とマッチさせる文字列パターン |
DatePattern[elems]は文字列マッチ関数の文字列パターンとして使うことができる.日付要素はDateListで使われるのと同じであるが,デフォルトの日付要素の区切り記号は/,-,:,.の記号に限られる.他の区切り記号は日付要素のリストで明示的に与えることができる.
DateListPlot[list] | 日付座標のあるデータのリストからプロットを生成する |
DateListPlot[list,datespec] | datespec で指定された日付を持つデータのリストからプロットを生成する |
DateListLogPlot[list] | 日付座標のあるデータのリストから線形対数プロットを生成する |
DateListLogPlot[list,datespec] | datespec により指定された日付のリストから線形対数プロットを生成する |
DateListPlotは日付あるいは時間の水平座標を持つデータをプロットするのに使うことができる.日付はDateList,DateString,AbsoluteTimeと同様にリスト,文字列,絶対時間のいずれでもよい.日付指定 datespec は日付を{y1,y2,…}として与えられるデータに関連付けるために与えることができる.DateListLogPlotではデータを対数垂直スケールでプロットすることができる.
Timing[expr] | 式 expr を評価し,評価に使ったCPU時間(リスト形式)と評価結果を表示する |
AbsoluteTiming[expr] | 式 expr を評価し,評価に使った絶対時間を与える |
1つのWolfram言語式の評価にどれだけの時間がかかるかを知りたければ関数Timingを使う.TimingはTimeUsedの増分に相当する.注意してほしいが,Timingは式評価のためにWolfram言語カーネルが使ったCPU時間だけを計測する.出力への書式適用や外部プログラムで使った時間は含まれない.
AbsoluteTimingを用いて絶対的な経過時間を計測することができる.AbsoluteTimingで計測される時間もTimingで計測される時間も評価される式だけではなく,環境条件によっても違ってくるので注意が必要である.
第一に,使用時間は使っているコンピュータの機種やオペレーティングシステムに依存する.CPU処理の速度だけでなく,メモリキャッシュの設定等にも依存する.また,言うまでもないが,計算で使われるカーネルの内部コードに使われているコンパイル時の最適化処理の詳細にも依存する.
さらに,計測対象となる計算が行われているときのセッション状態にも使用時間は依存する.これは,実時間的にカーネルが採用する計算の最適化法の多くは前の計算結果に依存する形で選定されるためである.例えば,計算を進める上で,カーネルは前に取得した結果を保持しておき同じ式が現れたなら不必要には再評価をせず,保持した結果を呼び戻す,というような処理がよく行われる.さらに,組込み関数によっては,最初に呼び出したときに内部に値のテーブルを作成しておき,再度同じ形式で呼出しがあったときにはそのテーブルを参照することで実行に必要な時間を短縮する,というような処理が行われる.このような理由から,同じ式を繰り返し計算させても,セッションの現況が違うため,前とは違った時間が計測されることもしばしばある.
計算に費したCPU時間を見る.計算結果自体は表示しないように(Nullとなるように)セミコロンを付け足しておく:
Timingにより計測される時間は,使われるコンピュータによっても違うが,ある最小時間幅($TimeUnit)までの精度でしかないことに注意すること.例えば,0〜$TimeUnitの間の時間ならすべて0として報告されてしまう.
TimeConstrained[expr,t] | t 秒経っても expr の計算が終了しない場合は計算を中断する |
TimeConstrained[expr,t,failexpr] | 制限時間を過ぎた場合,戻り値として failexpr を返す |
対話的に計算を進める場合,非常に長い時間がかかるようならば手動で計算を途中で止めたいことがある.TimeConstrainedを使えば,プログラムの中から自動的に計算を強制的に中止することが可能になる.TimeConstrainedで指定した時間内に式の評価が終了しない場合は,評価は中断され,$Aborted(もしくは,特別指定した式)が戻り値として返される.
TimeConstrainedを使うと,最初にある計算法で問題を解かせてみて,時間がかかるようならば,別の方法を試してみることも可能である.ただし,設定した時間が経過しても計算が中断しない場合もあるので注意が必要である.このような状況はカーネルが中止不可の計算部分を処理しているときに起る.さらに,同じTimeConstrainedの指定をしても,違うコンピュータで評価した場合,結果が違ってくることがある.
MemoryInUse[] | Wolframシステムが使っているメモリ量(単位:バイト) |
MaxMemoryUsed[] | 現行セッションでWolframシステムが使用可能な最大メモリ量(単位:バイト) |
特にメモリ容量が記号計算における計算規模を決定する主要な要因になっている.計算が遅いと,そのまま長く計算させておくことができる.しかし,計算過程においてメモリに入り切らないほどの大きな中間結果が生成されると,計算を続けることは不可能になってしまう.
Wolframシステムはメモリをなるべく効率的に使うようにプログラムされている.計算で生成された中間結果が必要なくなったなら,その保管に使われていたメモリ領域はすぐに解放されるようになっている.つまり,セッションのどの時点においても実際に必要な式しか保管されない.後で「ゴミ収拾」しなければならないような,いらなくなったオブジェクトは手元には置かない.
特定のコンピュータにおいて,Wolframシステムで使用可能なメモリ量はどう決まるのだろうか.コンピュータの実行している処理の数や量によらず,使えるメモリ量には限りがある.また,メモリの上限はオペレーティングシステムの種類や設定条件により変わる.設定によっては物理的に搭載してあるメモリ量に相当する.また,大容量記憶装置の空間の一部を仮想メモリとして使っている場合は,物理メモリ量より大きくなる.
Wolframシステムの実行にはデータとプログラムの両方を保持する空間が必要である.プログラムだけで数メガバイトの大きさなので,要求のあった計算に応じて必要なコード部だけが,通常,メモリに読み込まれる.あるデータを保管するのにメモリ量がどのくらい必要かを計算するなら,プログラム部の使う量も勘定に入れることを忘れないようにする.さらに,他のプログラムも同時に動作している場合は,使える容量はさらに減るだろう.別に実行しているプログラムが少なければ少ないほど計算に使える容量は普通増える.
計算にかかる時間も物理メモリ量に大きく依存する.つまり,搭載メモリが大きいほど時間が短くて済むようになる.仮想メモリを使うよう設定しておけば使えるメモリ量は増えるが,アクセスに要する時間が物理メモリの数百から数千倍かかってしまう.計算の規模が大きいため,どうしても仮想メモリを使わなければできない場合もあるが,そのようなときは余計に時間がかかってしまう.
MemoryConstrained[expr,b] | expr を評価するが,メモリ使用量が b バイトを上回るようなら評価を中止する |
MemoryConstrained[expr,b,failexpr] | メモリの制約条件が満たされず評価中止になると式 failexpr を返す |
MemoryConstrainedを使ったメモリの制限設定は計算時間の制限で使うTimeConstrainedの設定に似ている.指定した上限より大きなメモリの要求があると,評価処理が強制的に中止する.ただし,TimeConstrainedでそうであるように,MemoryConstrainedでも実際に中止する前に指定した上限量以上のメモリが使われてしまうこともある.
ByteCountを使うと計算したい式がどの程度の大きさかが分かり便利である.ただし,ByteCountで与えられる特定の結果は,違うWolframシステムバージョンではメモリの使用量が大きく異なることもあるということに注意が必要である.
また,ByteCountの返してくる使用量は上限の目安なので,実際の式の保管では,通常,それより少ないメモリで間に合う.これは式の成分によっては共通なものがあり,全成分を保管する必要がなくなるからである.
f[1+x,1+x]の式には成分が2つあるが,どちらも1+xで同じである.実際には片方だけしか保管されないかもしれないし,両方とも保管されるかもしれない.ByteCountの出す値は成分の共有がないことを前提とした使用量である.関連事項として,式成分の共有は/.による置換操作等が行われると即座に無効になるので注意すること.
式の成分を強制的に共有するようにすることも可能である.それを行うには関数Shareを使う.共有することで実際に使うメモリ量を低く押さえることができる.
多くのコンピュータシステムでは,実行中のプログラムは2つの部分から構成されている.プログラムが取得したメモリ空間,そして,スタック空間である.内部ルーチンが呼び出されるたびにスタック空間の一部が使われ,呼出しに関連した引数等のパラメータが一時保管される.多くのコンピュータシステムではプログラムの使うスタック量をあらかじめ指定しておかなければいけない.もし,実行時にスタック空間を使い切ってしまうと,プログラムは通常,強制的に終了してしまう.
Wolframシステムでは,スタック空間は主に関数呼出し時に発生する各種の処理を行うために使われる.Wolframシステムのスタック(Stackで参照)にはすべてのレベルにおける関数の呼出しが記録される(詳細は「評価処理用スタック」を参照のこと).スタックの大きさを変えるには大域変数$RecursionLimitの値を変更する.設定値をあまり大きくし過ぎると,使用しているコンピュータシステムの許容量を超えてしまい,スタック空間を確保できなくなってしまうので注意が必要である.
例えば,プログラムからNotebookWrite等の関数を呼び出す必要があるかどうかは,プログラムを実行するセッションがノートブック用フロントエンドで設けられたものかどうかを見極めた上でないと判断することができない.この場合,$Notebooksを参照する.
$Notebooks | フロントエンドがノートブック用のものかどうかを識別するブール変数 |
Wolframシステムの機能は普通対話的に使う.しかし,バッチ処理的に使うことも可能で,その場合,入力はファイルから読み込まれ,出力はファイルに書き出される.バッチモードではユーザは対話的な入力を行うことはできない.
$BatchInput | 入力をバッチモードでするかしないかを識別するブール変数 |
$BatchOutput | 出力をバッチモードでするかしないかを識別するブール変数 (出力プロンプト等は禁止) |
Wolfram言語カーネルもオペレーティングシステムの下で稼動するプロセスの1つである.オペレーティングシステム関連の大域変数がいくつか用意されているので,それらを参照することでプロセスの状況や動作環境の情報を取得することができる.
$CommandLine | Wolfram言語カーネルの起動に使ったもとのコマンドライン |
$ParentLink | カーネルを起動したプログラムを登録したWSTP LinkObject(カーネルを起動した場合はNull) |
$ProcessID | オペレーティングシステムによりWolfram言語カーネルのプロセスに割りふられた識別番号 |
$ParentProcessID | Wolfram言語カーネルを起動したプロセスに割りふられた識別番号 |
$Username | Wolfram言語カーネルを起動したプロセスに割りふられた識別番号 |
Environment["var"] | カーネルを使用しているユーザのログイン名 |
同時に進行される複数のセッションにおいて,同じ名前,例えば x のような変数が使われるとき,各変数の値は必ずしも他のWolfram言語セッションでの x と同じ値にしておきたくないかもしれない.そこで,セッションごとにオブジェクトを区別するため,Wolfram言語では大域変数$SessionIDが使われる.この変数には,開始時間,プロセス番号,そして,コンピュータの機種番号等に基づいて生成された現行セッションの識別番号が割り当てられている.カーネルのプロセスに使われるコンピュータが同一のものでも,セッションが別ならば,異なったセッション番号が与えられる.
$SessionID | Wolfram言語のセッションごとに割りふられる識別番号 |
Wolfram言語には,どのバージョンのカーネルが使われているか等を調べるための大域変数も用意されている.例えばバージョン6というように,特定バージョンの機能に依存した形でプログラムが記述してある場合等では,バージョン情報が重要になる.使用中のカーネルのバージョンが対応するものかどうかを調べるには$VersionNumberを参照する.
$Version | 使用中のWolframシステムのバージョン名を綴った文字列 |
$VersionNumber | Wolfram言語カーネルのバージョン番号(例:11.2) |
$ReleaseNumber | Wolfram言語カーネルのオペレーティングシステム別リリース番号 |
$CreationDate | 使用中のWolframシステムの作成日(DateObject書式で表示) |
Wolframシステムの動作環境はオペレーティングシステムになるべく依存しない形で設定されている.それでも,Wolframシステムの操作には直接関係ないオペレーティングシステム関連の情報にアクセスしたい場合も出てくる.
$System | 使っているコンピュータシステムの名前 |
$SystemID | 使っているコンピュータのシステムの短縮名 |
$ProcessorType | プロセッサの種類 |
$MachineType | 使っているコンピュータの一般機種名 |
$ByteOrdering | 各コンピュータシステムのバイナリデータのバイトのネイティブな順序 |
$OperatingSystem | 使っているオペレーティングシステムの名前 |
$SystemCharacterEncoding | 使っているオペレーティングシステムの外部文字コード |
「Wolframシステムファイルの読み書き」,「WSTPプログラムの移植性」で説明したが,オペレーティングシステム別のファイルのバージョンを保存するディレクトリには$SystemIDの名前が与えられる.$SystemIDの名前が同じコンピュータシステムは通常,バイナリレベルで互換である.
$OperatingSystemには,"Windows"や"Unix"等のオペレーティングシステムの名前が割り当てられる.使いたい外部プログラムがあるときは,あらかじめ$OperatingSystemを参照しておき必要なプログラムがあるかどうかを確認しておくとよい.
$MachineAddresses | 現行のIPアドレスのリスト |
$MachineName | Wolframシステムの動作しているコンピュータの登録名 |
$MachineDomains | コンピュータのネットワークドメイン |
$MachineID | Wolframシステムの定義するコンピュータの固有識別番号 |
$ActivationKey | Wolframシステムを実行させているアクティベーションキー |
$LicenseExpirationDate | ライセンス契約の切れる日付 |
$NetworkLicense | ネットワークライセンスかどうかを識別するブール値 |
$LicenseServer | ライセンスを行使する機械の名前 |
$LicenseProcesses | ライセンスのもとで現在稼動中のカーネルプロセス数 |
$MaxLicenseProcesses | ライセンス契約で許されている最大プロセス数 |
$PasswordFile | カーネルが起動するときに使われるパスワードファイル |
コマンドラインオプションと環境変数
-pwfile | Wolframシステムパスワードファイル |
-run | 起動するWolfram言語入力(カーネルのみ) |
-initfile | Wolframシステム初期化ファイル(カーネルのみ) |
-noinit | 初期化ファイルを使用しない(カーネルのみ) |
-wstp | WSTPを通してのみ通信 |
ノートブックファイルをコマンドラインの引数として用い,Wolframシステムフロントエンドを起動した場合は,そのノートブックが最初に選択されたノートブックとなる.その他の場合は新たなノートブックが作成される.
初期化
- ライセンス管理実行.
- -runオプションでカーネルへ渡されたWolfram言語コマンドの実行.
- システム全体の初期化ファイル$BaseDirectory/Kernel/init.mでのWolfram言語コマンドの実行.
- ユーザ指定の初期化ファイル$UserBaseDirectory/Kernel/init.mでのWolfram言語コマンドの実行.
- Autoloadディレクトリにあるinit.mおよびKernel/init.mのロード.
- メインループの実行開始.
メインループ
- 入力を読む.
- すでに定義されている場合,$PreRead関数を入力列に適用.
- 必要に応じてシンタックスエラーを出力.
- シンタックスエラーがある場合,$SyntaxHandler関数を適用.
- InString[n]の割当て.
- $Pre関数が定義されていれば,入力式に適用する.
- In[n]の割当て.
- 式の評価.
- すでに定義されている場合,$Post関数を適用.
- Out[n]を割り当てて,すべてのフォーマット用のラッパーを除去.
- すでに定義されている場合,$PrePrint関数を適用.
- MessageList[n]を割り当てて,$MessageListをクリア.
- Nullでなければ式を出力.
- $Lineを増やす.
- 未完了のすべての中止命令をクリア.
Wolfram Symbolic Transfer Protocol (WSTP)を通してWolfram言語を外部プログラムから呼ぶ場合は,通常,上記とは異なる特別のメインループを作成する必要がある.
メッセージ
Wolframシステムセッション中,メッセージはMessageの明示的な呼出しにより生成されるか,他の組込み関数実行中に生成される.
f::name::lang | 特定言語でのメッセージ |
f::name | デフォルトの言語でのメッセージ |
General::name | 与えられた名前での一般メッセージ |
メッセージの言語が指定されていない場合,$Languageで指定された言語によるメッセージテキストを探す.f::name が定義されていない場合はGeneral::name での定義を使用する.それでもメッセージが見付からない場合,$NewMessageで定義された値が f および"name"に適用される.
Quiet[expr]は評価中にメッセージが出力されないようにしたままで expr を評価する.Off[message]により特定のメッセージを表示しないようにできる.Checkの実行で,特定のメッセージが式評価中に生成されたかどうかが分かる.$MessageListとMessageList[n]は,Wolframシステムセッションで指定された行の評価中に生成されたすべてのメッセージを記録する.
終了
Exit[] または Quit[] | Wolframシステムを終了する |
$Epilog | Wolframシステムが終了する前に評価するシンボル |
$IgnoreEOF | ファイル末尾記号を受け取った時点でインタラクティブなWolframシステムセッションを終了するかどうか |
end.m | Wolframシステムが終了したときに読み込むファイル |
Wolframシステムセッションを終了するにはいくつかの方法がある.Wolframシステムをインタラクティブに使っている場合は,入力行にExit[]かQuit[]をタイプすると Wolframシステムが終了できる.
ファイルからWolfram言語への入力を取っている場合,ファイルの最後に達した時点でWolframシステムは終了する.Wolframシステムをインタラクティブに使っている場合でも,Wolframシステムがファイル末尾文字(通常Ctrl+d)を受け取ると終了する.これでWolframシステムが終了しないようにするには,$IgnoreEOF=Trueと設定するとよい.
ネットワークライセンス管理
Wolframシステムは単一マシン上で,あるいはネットワークライセンスとして起動設定が可能である.ネットワークライセンスはmathpassファイルの中の!name で始まる行に示されている.name とは,ネットワークライセンスのサーバマシン名である.
ネットワークライセンスはWolframシステムライセンス管理プログラムであるmathlmで管理されおり,これはサーバマシン上で起動する.このプログラムはネットワークライセンスでWolframシステムが使用されている間は常に作動している必要がある.通常はシステムが起動するたびにmathlmが自動的に実行するよう,システムを設定しておいた方がよい.
mathlmをコマンドラインから直接起動しなければ,通常はバックグラウンドプロセスとなり,強制終了されるまで連続して作動する.すでにmathlmプロセスが動作している場合は,別のmathlmプロセスを起動しようとしても自動的に終了する.
-logfile file | ライセンスサーバのアクションのログを file に書く |
-loglevel n | ログに記録される情報量のレベルを示す(1から4まで) |
-logformat string | string で指定されたログ形式を使う |
-language name | メッセージで使われる言語(デフォルトEnglish) |
-pwfile file | 指定されたmathpassファイルを使用する(デフォルト値では./mathpass) |
-timeout n | n 時間経過した中断されているWolframシステムジョブの終了を許可する |
-restrict file | 指定された制限ファイルを使用する |
-mathid | ライセンスサーバのMathIDを出力して終了する |
-foreground | mathlm がフォアグラウンドで起動した状態でstdoutに出力する |
-install |
mathlm
をWindowsのサービスに加える(Microsoft Windows版のみ)
|
-uninstall |
mathlm
をWindowsのサービスから削除する(Microsoft Windows版のみ)
|
-file file | 出力をファイルに書き出す |
-format spec | 指定された形式で出力を書き出す.形式はtext,html,cgiのいずれかである |
-template file | 出力のテンプレートとして指定されたファイルを使う |