Wolframシステムセッションの全体的な状況を見る

メインループ
Wolframシステムセッションにおける対話モードを可能にしているのがフロントエンドの「メインループ」である.これは,ユーザからの入力待ち,カーネルへの入力の送出,評価結果の表示,そして再び入力待ちに戻るといった一連の操作を常時繰り返す機構のことである.本章ではこのメインループに関連した大域オブジェクトの扱い方を説明する.
ユーザの使うフロントエンドが特別なものならば,上述のループとは別の形態の機構が使われているかもしれない.そのようなときはここの説明は適応されないだろう.
In[n]
n 入力行の式
InString[n]
n 入力行の式のテキスト形式
%n
または
Out[n]
n 出力行の式
Out[{n1,n2,}]
出力式のリスト
%%%
n 回)または
Out[-n]
n 行前の出力行の式
MessageList[n]
n 行の入力の評価中に発生したメッセージを列挙する
$Line
現在の行番号(変更可)
入出力行
標準的なセッションでは,対話が進められるに従い入力と出力の行が交互に連なって表示される.これらの行の式の値はそれぞれIn[n]Out[n]に保管される.
通常のIn[n]:=プロンプトで示されるように,入力される式は遅延型の割当てとともに保管される.つまり,In[n]の要求があるたびに,それに対応する入力式は現在の環境において再び評価される.
xに値を割り当てる:
xを使った式を計算させる.割り当てられた値が使われる:
xに割り当てられた値を消去する:
2番目の入力式を再計算させる.前と違い,xには何も値が割り当てられていない:
同じ式のテキスト形式を見る.テキスト形式を使うと編集等のテキストを直接操作する作業で便利である:
$HistoryLength
一時保管する入力と出力の最大数
セッションの履歴長の指定
セッションの開始から終了まで,ユーザの入力行と出力行は通常すべて保管される.このため,長引くセッションでは大量のメモリを消費するような事態を招きかねない.そこで,不要になった入力行と出力行は個別に消去できるようになっている.入力式をInとし出力式をOutとするならば,これらの式を消去するには,Unprotect[In,Out]と入力した後に,Clear[In,Out]と入力する.また,大域変数$HistoryLengthを小さめに設定することで,入出力履歴の保管サイズを限定することもできる.
$Lineと呼ばれる行番号のカウンタが用意されている.このカウンタをセッションのどこからでも再設定することで,新規に生成される式が古い式を上書きするようにすることができる.
$PreRead
カーネルに送る前に各入力文字列に適用する関数
$Pre
評価処理の前に各入力式に適用する関数
$Post
評価処理の後に各入力式に適用する関数
$PrePrint
Out[n]へ評価結果である出力式が割り当てられた後で,表示される前に適用する関数
$SyntaxHandler
文法上の誤りがある入力行に適用する関数
メインループで使われる大域関数
Wolframシステムには各種の「フック」が用意されているので,それらに対して関数を指定しておけば,メインループの各段階においてカスタム的な式の処理方法を使うことができる.例えば,大域変数$Preに対してある関数を割り当てておけば,入力される式が何であってもそれは式が評価される前に自動的に適用される.
標準メインループで行われる最初の処理項目は入力された文字列の取込みである.特に,特殊文字を扱う必要がある場合はWolframシステムに処理させる前にこの文字列を編集しておきたいことがある.その場合は,大域変数$PreReadに編集に使う関数を指定しておく.すると,処理の前にその関数が文字列に適用され,その結果が特定の入力行に対する実際の入力文字として使われる.
入力行にlistHeadがあれば{}で置換するよう指定しておく:
これでリストをlistHead式として入力することができる:
少なくとも$PreReadに対する定義がこの入力文字列を変更しない限り,$PreReadの値は右のように除去できる:
文法上の誤りのない入力式が正常に読み込まれると,評価処理が次に施される.ただし,$Preに関数が割り当てられた場合は,評価の前にその関数により定義される前処理が行われる.また,$Postに割当て指定があれば,それは後処理として評価の後に行われる.$Pre関数に与えられる引数を評価保留にしておかないと,$Post関数と同じ効果を持つので注意が必要である.
Wolframシステムからの結果に対して任意の「後処理」を行うには後処理を定義する関数を$Postに指定しておく.例えば,結果が生成されるたびにその数値近似値を得るには$Post=Nと設定しておく.
カーネルから結果が出るたびにNを適用する:
計算させると,結果は数値近似値として返される:
後処理として割り当てた関数を除去する:
Wolframシステムが結果を生成し,$Postの後処理が適用されると,直ちにOut[$Line]の値としてのその結果の割当てが行われる.次に,結果の表示が行われる.ここで,$PrePrintに関数が割り当てられている場合はその前にこの関数が適用され表示に関する前処理が行われる.
出力される式はすべて2行分だけ表示する:
最初の2行だけが表示される:
$PrePrintに割り当てた値を除去する:
Wolframシステムのセッションからは各種の出力が生成される.「ストリームと低レベルの入出力」で説明しているように,出力されるものの種類によって違う出力チャンネルが使われる.各出力チャンネルには,そのチャンネルに割り当てられた出力ストリームのリストを与える大域変数が設けられる.
$Output
標準出力とPrintコマンドのテキスト出力
$Echo
入力行のエコー(InString[n]として記憶される)
$Urgent
入力プロンプトと他の緊急出力
$Messages
標準メッセージとMessageコマンドの出力
標準Wolframシステムセッションにおける出力チャンネル
出力チャンネルに割り当てられているストリームのリストを変更することで,出力の種類を限定した上でリダイレクトしたりコピーしたりすることが可能になる.例えば,ファイルを出力ストリームとしておき,そのストリームを$Echoのリストに入れておけば,カーネルに入力されるすべての式を自動的にファイルに取っておくことができる.
Streams[]
現在開いた状態にあるすべてのストリームのリスト
Streams["name"]
指定名を持つ開いた状態にあるすべてのストリームのリスト
$Input
現行入力ストリームの名前
$InputFileName
現在入力が検索されているファイルへの完全な絶対パス
Wolframシステムセッションにおける開いた状態のストリーム
関数Streamsを使えば,現行のセッションでアクティブなストリームをすべて列挙することができる.また,変数$InputはWolframシステムへ入力を送るのに現在使われている入力ストリームの名前を与える.$InputGetコマンド等が実行されると再設定される.また,Get$InputFileNameを入力が読み込まれているファイルへの完全な絶対パスに設定する.
$MessagePrePrint
メッセージに含まれる式に適用する関数
$Language
メッセージ表示に使うデフォルト言語のリスト
メッセージ表示の制御パラメータ
各種の大域変数が用意されており,それらを使うことでWolframシステムにより生成されるメッセージの表示形式を決めることができる.
「メッセージ」で説明したように,通常,メッセージはStringFormを通してメッセージのテキストと結び付けられた一連の式を含む.表示の前に,$MessagePrePrintに割り当てた関数が式に適用され前処理が行われる.$MessagePrePrintのデフォルトでは,テキストのフォーマットにはShortが,タイプセットにはShortShallowの組合せが使われる.
「メッセージ:英語以外の言語への対応」で説明したように,メッセージ表示に使う言語が指定できるようになっている.セッションごとに言語名のリストを$Languageの変数として割り当てることができる.
Exit[]
または
Quit[]
セッションを終了する
$Epilog
終了前に評価しておく大域変数
Wolframシステムセッションの終了
セッションを終了するように命令するまでメインループにおける操作処理は続く.フロントエンドによっては終了命令のために特別な操作法が用意されているが,ExitもしくはQuitを呼び出せば,フロントエンドの操作法によらず終了処理ができる.
$Epilogと呼ばれる大域変数が用意されており,そこにセッション終了直前にWolframシステムに処理させたいことを指定できるようになっている.こうすると,例えば終了前に特定のオブジェクトを保存できる.
$IgnoreEOF
エンド・オブ・ファイルの識別記号を無視するかしないかを指定する大域変数
エンド・オブ・ファイル識別記号(EOF)の処理
「特殊文字」で説明したが,文字が特別なものであっても通常特別な扱いをしない.ただし,例外となり得るものが1つある.それはエンド・オブ・ファイル記号(EndOfFile,EOFと省略)で,$IgnoreEOF=Falseの条件が設定してあるときは,記号EOFが有効となり特別扱いされる.つまり,標準対話セッションにおいて,ある入力行で入力したものがEOFだけの場合,そのセッションは即座に終了する.
記号EOFの入力の仕方は使っているオペレーティングシステム環境により違う.例えば,Unixでは通常,組合せキーのCtrl+Dを押すことで入力できる.
バッチ処理的にWolframシステムを使い,ファイルからすべての入力を行う場合は,$IgnoreEOFの現行設定によらずファイルが終了した時点でWolframシステムが終了する.
ダイアログ
計算を進めていく途中でカーネル処理の中間過程を追うことができると,式がどう計算されるかが分かるため便利である.標準対話セッションでは,コマンドDialogを使いダイアログ(二次セッション)を設け中間処理を追跡できるようになっている.「評価処理のトレース」で説明したように,評価する式にTraceDialogを入れておくと,挿入部が評価される際にDialogが自動的に呼び出され中間結果を参照できるようになる.また,計算中にカーネルを一時停止させた場合も,ダイアログを開き計算状況を参照できるようになっている.
Dialog[]
ダイアログを開始する
Dialog[expr]
expr% の現行値として,ダイアログを開始する
Return[]
% の現行値を戻り値としてダイアログを終了する
Return[expr]
expr の現行値を戻り値としてダイアログを終了する
ダイアログの開始と終了
ダイアログを開始する:
通常のセッションと同じようにダイアログの中でも計算させることが可能である:
Returnでダイアログを終了させる:
ダイアログを終了する際に,コマンド書式Return[expr]を使い式を指定しておくと,その式を計算させ,計算値をダイアログの戻り値として得ることができる.戻り値が必要なく,また,$IgnoreEOF=Falseの条件が設定してあるなら,EOFを入力するだけでダイアログを止めることができる.ただし,この操作はテキスト型インターフェースに限る.
計算したい式にダイアログコマンドを使う.すると,ダイアログが開始する:
ダイアログからa+bの値が返ってくる.その値がもとの式に挿入される:
ダイアログを開始する上で,「初期式」を与えられると便利である.Dialog[expr]を使うことで,expr を初期式とするダイアログを設けることができる.この式をダイアログの中で参照するには % を使う.
ダイアログを続けて開く.最初のダイアログでは,初期式に式a^2を使う:
ダイアログで初期式を参照するには % とすればよい:
第1ダイアログを終了させる.戻り値が戻ってきて,第2ダイアログが始まる.今度はb+cが初期式である:
第2ダイアログを終える.結果として両ダイアログから得た値を代入した形のもとの式が得られる:
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]
絶対時間を日付へ変換
日付情報と絶対時間の変換
日付を調べ,dに取っておく:
現在の日付に1ヶ月割増しする:
1ヶ月間に相当する秒単位の時間を計算する:
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は日付あるいは時間の水平座標を持つデータをプロットするのに使うことができる.日付はDateListDateStringAbsoluteTimeと同様にリスト,文字列,絶対時間のいずれでもよい.日付指定 datespec は日付を{y1,y2,}として与えられるデータに関連付けるために与えることができる.DateListLogPlotではデータを対数垂直スケールでプロットすることができる.
以下で金融の時系列データを集める:
金融データをプロットする:
同じデータを対数スケール上にプロットする:
次は明示的な日付を含まない月別データをプロットする:
Timing[expr]
expr を評価し,評価に使ったCPU時間(リスト形式)と評価結果を表示する
AbsoluteTiming[expr]
expr を評価し,評価に使った絶対時間を与える
評価時間の計測
1つのWolfram言語式の評価にどれだけの時間がかかるかを知りたければ関数Timingを使う.TimingTimeUsedの増分に相当する.注意してほしいが,Timingは式評価のためにWolfram言語カーネルが使ったCPU時間だけを計測する.出力への書式適用や外部プログラムで使った時間は含まれない.
AbsoluteTimingを用いて絶対的な経過時間を計測することができる.AbsoluteTimingで計測される時間もTimingで計測される時間も評価される式だけではなく,環境条件によっても違ってくるので注意が必要である.
第一に,使用時間は使っているコンピュータの機種やオペレーティングシステムに依存する.CPU処理の速度だけでなく,メモリキャッシュの設定等にも依存する.また,言うまでもないが,計算で使われるカーネルの内部コードに使われているコンパイル時の最適化処理の詳細にも依存する.
さらに,計測対象となる計算が行われているときのセッション状態にも使用時間は依存する.これは,実時間的にカーネルが採用する計算の最適化法の多くは前の計算結果に依存する形で選定されるためである.例えば,計算を進める上で,カーネルは前に取得した結果を保持しておき同じ式が現れたなら不必要には再評価をせず,保持した結果を呼び戻す,というような処理がよく行われる.さらに,組込み関数によっては,最初に呼び出したときに内部に値のテーブルを作成しておき,再度同じ形式で呼出しがあったときにはそのテーブルを参照することで実行に必要な時間を短縮する,というような処理が行われる.このような理由から,同じ式を繰り返し計算させても,セッションの現況が違うため,前とは違った時間が計測されることもしばしばある.
計算に費したCPU時間を見る.計算結果自体は表示しないように(Nullとなるように)セミコロンを付け足しておく:
同じ階乗を計算する.前回の計算で内部テーブルができているので,計測できるほどのCPU時間はかからない:
しかし,全体時間はある程度計測できる:
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システムが使用中のメモリ量を調べる:
10000個の要素からなるリストを作る:
リストのため使用量が増えている:
リストはOut[41]に割り当てられた値として保管されている.したがって,Out[41]を消去するともとのリストが消える:
メモリ使用量が減った:
セッションで使える最大メモリ量を調べる:
特定のコンピュータにおいて,Wolframシステムで使用可能なメモリ量はどう決まるのだろうか.コンピュータの実行している処理の数や量によらず,使えるメモリ量には限りがある.また,メモリの上限はオペレーティングシステムの種類や設定条件により変わる.設定によっては物理的に搭載してあるメモリ量に相当する.また,大容量記憶装置の空間の一部を仮想メモリとして使っている場合は,物理メモリ量より大きくなる.
Wolframシステムの実行にはデータとプログラムの両方を保持する空間が必要である.プログラムだけで数メガバイトの大きさなので,要求のあった計算に応じて必要なコード部だけが,通常,メモリに読み込まれる.あるデータを保管するのにメモリ量がどのくらい必要かを計算するなら,プログラム部の使う量も勘定に入れることを忘れないようにする.さらに,他のプログラムも同時に動作している場合は,使える容量はさらに減るだろう.別に実行しているプログラムが少なければ少ないほど計算に使える容量は普通増える.
計算にかかる時間も物理メモリ量に大きく依存する.つまり,搭載メモリが大きいほど時間が短くて済むようになる.仮想メモリを使うよう設定しておけば使えるメモリ量は増えるが,アクセスに要する時間が物理メモリの数百から数千倍かかってしまう.計算の規模が大きいため,どうしても仮想メモリを使わなければできない場合もあるが,そのようなときは余計に時間がかかってしまう.
MemoryConstrained[expr,b]
expr を評価するが,メモリ使用量が b バイトを上回るようなら評価を中止する
MemoryConstrained[expr,b,failexpr]
メモリの制約条件が満たされず評価中止になると式 failexpr を返す
メモリ使用量の制限
MemoryConstrainedを使ったメモリの制限設定は計算時間の制限で使うTimeConstrainedの設定に似ている.指定した上限より大きなメモリの要求があると,評価処理が強制的に中止する.ただし,TimeConstrainedでそうであるように,MemoryConstrainedでも実際に中止する前に指定した上限量以上のメモリが使われてしまうこともある.
ByteCount[expr]
expr の保管に必要な最大メモリ量(単位:バイト)
LeafCount[expr]
expr の木構造における葉(リーフ)の部分に当たる節数
式の大きさ情報
ByteCountを使うと計算したい式がどの程度の大きさかが分かり便利である.ただし,ByteCountで与えられる特定の結果は,違うWolframシステムバージョンではメモリの使用量が大きく異なることもあるということに注意が必要である.
また,ByteCountの返してくる使用量は上限の目安なので,実際の式の保管では,通常,それより少ないメモリで間に合う.これは式の成分によっては共通なものがあり,全成分を保管する必要がなくなるからである.
f[1+x,1+x]の式には成分が2つあるが,どちらも1+xで同じである.実際には片方だけしか保管されないかもしれないし,両方とも保管されるかもしれない.ByteCountの出す値は成分の共有がないことを前提とした使用量である.関連事項として,式成分の共有は/.による置換操作等が行われると即座に無効になるので注意すること.
式の成分を強制的に共有するようにすることも可能である.それを行うには関数Shareを使う.共有することで実際に使うメモリ量を低く押さえることができる.
Share[expr]
expr を保管するとき共通成分を共有化する
Share[]
メモリに保管してある式の中で共通成分があれば共有化する
メモリ使用量の最適化
多くのコンピュータシステムでは,実行中のプログラムは2つの部分から構成されている.プログラムが取得したメモリ空間,そして,スタック空間である.内部ルーチンが呼び出されるたびにスタック空間の一部が使われ,呼出しに関連した引数等のパラメータが一時保管される.多くのコンピュータシステムではプログラムの使うスタック量をあらかじめ指定しておかなければいけない.もし,実行時にスタック空間を使い切ってしまうと,プログラムは通常,強制的に終了してしまう.
Wolframシステムでは,スタック空間は主に関数呼出し時に発生する各種の処理を行うために使われる.Wolframシステムのスタック(Stackで参照)にはすべてのレベルにおける関数の呼出しが記録される(詳細は「評価処理用スタック」を参照のこと).スタックの大きさを変えるには大域変数$RecursionLimitの値を変更する.設定値をあまり大きくし過ぎると,使用しているコンピュータシステムの許容量を超えてしまい,スタック空間を確保できなくなってしまうので注意が必要である.
グローバルなシステム情報
汎用性の高いWolfram言語用プログラムを作成するにはグローバル(大域的)な環境設定の情報が必要になる.
例えば,プログラムからNotebookWrite等の関数を呼び出す必要があるかどうかは,プログラムを実行するセッションがノートブック用フロントエンドで設けられたものかどうかを見極めた上でないと判断することができない.この場合,$Notebooksを参照する.
$Notebooks
フロントエンドがノートブック用のものかどうかを識別するブール変数
ノートブック用フロントエンドの識別
Wolframシステムの機能は普通対話的に使う.しかし,バッチ処理的に使うことも可能で,その場合,入力はファイルから読み込まれ,出力はファイルに書き出される.バッチモードではユーザは対話的な入力を行うことはできない.
$BatchInput
入力をバッチモードでするかしないかを識別するブール変数
$BatchOutput
出力をバッチモードでするかしないかを識別するブール変数 (出力プロンプト等は禁止)
バッチモードによる入出力の識別
Wolfram言語カーネルもオペレーティングシステムの下で稼動するプロセスの1つである.オペレーティングシステム関連の大域変数がいくつか用意されているので,それらを参照することでプロセスの状況や動作環境の情報を取得することができる.
$CommandLine
Wolfram言語カーネルの起動に使ったもとのコマンドライン
$ParentLink
カーネルを起動したプログラムを登録したWSTP LinkObject(カーネルを起動した場合はNull
$ProcessID
オペレーティングシステムによりWolfram言語カーネルのプロセスに割りふられた識別番号
$ParentProcessID
Wolfram言語カーネルを起動したプロセスに割りふられた識別番号
$Username
Wolfram言語カーネルを起動したプロセスに割りふられた識別番号
Environment["var"]
カーネルを使用しているユーザのログイン名
Wolfram言語カーネルプロセスに関連した変数
同時に進行される複数のセッションにおいて,同じ名前,例えば x のような変数が使われるとき,各変数の値は必ずしも他のWolfram言語セッションでの x と同じ値にしておきたくないかもしれない.そこで,セッションごとにオブジェクトを区別するため,Wolfram言語では大域変数$SessionIDが使われる.この変数には,開始時間,プロセス番号,そして,コンピュータの機種番号等に基づいて生成された現行セッションの識別番号が割り当てられている.カーネルのプロセスに使われるコンピュータが同一のものでも,セッションが別ならば,異なったセッション番号が与えられる.
$SessionID
Wolfram言語のセッションごとに割りふられる識別番号
Wolfram言語セッションの識別番号
Wolfram言語には,どのバージョンのカーネルが使われているか等を調べるための大域変数も用意されている.例えばバージョン6というように,特定バージョンの機能に依存した形でプログラムが記述してある場合等では,バージョン情報が重要になる.使用中のカーネルのバージョンが対応するものかどうかを調べるには$VersionNumberを参照する.
$Version
使用中のWolframシステムのバージョン名を綴った文字列
$VersionNumber
Wolfram言語カーネルのバージョン番号(例:11.2
$ReleaseNumber
Wolfram言語カーネルのオペレーティングシステム別リリース番号
$CreationDate
使用中のWolframシステムの作成日(DateObject書式で表示)
使用中のWolframシステムのバージョンを指定する変数
Wolframシステムの動作環境はオペレーティングシステムになるべく依存しない形で設定されている.それでも,Wolframシステムの操作には直接関係ないオペレーティングシステム関連の情報にアクセスしたい場合も出てくる.
$System
使っているコンピュータシステムの名前
$SystemID
使っているコンピュータのシステムの短縮名
$ProcessorType
プロセッサの種類
$MachineType
使っているコンピュータの一般機種名
$ByteOrdering
各コンピュータシステムのバイナリデータのバイトのネイティブな順序
$OperatingSystem
使っているオペレーティングシステムの名前
$SystemCharacterEncoding
使っているオペレーティングシステムの外部文字コード
システム関連の情報
「Wolframシステムファイルの読み書き」「WSTPプログラムの移植性」で説明したが,オペレーティングシステム別のファイルのバージョンを保存するディレクトリには$SystemIDの名前が与えられる.$SystemIDの名前が同じコンピュータシステムは通常,バイナリレベルで互換である.
$OperatingSystemには,"Windows""Unix"等のオペレーティングシステムの名前が割り当てられる.使いたい外部プログラムがあるときは,あらかじめ$OperatingSystemを参照しておき必要なプログラムがあるかどうかを確認しておくとよい.
入力を評価するのに使ったコンピュータシステムが何かを調べる:
$MachineAddresses
現行のIPアドレスのリスト
$MachineName
Wolframシステムの動作しているコンピュータの登録名
$MachineDomains
コンピュータのネットワークドメイン
$MachineID
Wolframシステムの定義するコンピュータの固有識別番号
Wolframシステムを実行しているコンピュータに関する情報
$ActivationKey
Wolframシステムを実行させているアクティベーションキー
$LicenseExpirationDate
ライセンス契約の切れる日付
$NetworkLicense
ネットワークライセンスかどうかを識別するブール値
$LicenseServer
ライセンスを行使する機械の名前
$LicenseProcesses
ライセンスのもとで現在稼動中のカーネルプロセス数
$MaxLicenseProcesses
ライセンス契約で許されている最大プロセス数
$PasswordFile
カーネルが起動するときに使われるパスワードファイル
ライセンス管理に関する変数
Wolframシステムセッション

コマンドラインオプションと環境変数

-pwfile
Wolframシステムパスワードファイル
-run
起動するWolfram言語入力(カーネルのみ)
-initfile
Wolframシステム初期化ファイル(カーネルのみ)
-noinit
初期化ファイルを使用しない(カーネルのみ)
-wstp
WSTPを通してのみ通信
Wolframシステム実行プログラムの通常のコマンドラインオプション
ノートブックファイルをコマンドラインの引数として用い,Wolframシステムフロントエンドを起動した場合は,そのノートブックが最初に選択されたノートブックとなる.その他の場合は新たなノートブックが作成される.
Wolfram言語カーネルおよびフロントエンドは,特定のウィンドウ環境でのみ有効なコマンドラインオプションを付け加えることが可能である.
Wolframシステムフロントエンドのコマンドラインオプションの環境変数
Wolfram言語カーネルのコマンドラインオプションの環境変数
環境変数
Wolframシステムはオペレーティングシステムの環境変数の値を読み,その値をコマンドラインオプションとして用いる.

初期化

Wolfram言語カーネル起動直後,以下の事項が実行される.

メインループ

Wolframシステムセッションはすべて以下のメインループを繰り返し実行する.
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の実行で,特定のメッセージが式評価中に生成されたかどうかが分かる.$MessageListMessageList[n]は,Wolframシステムセッションで指定された行の評価中に生成されたすべてのメッセージを記録する.
メッセージはStringFormの最初の引数に使われる文字列として指定される.$MessagePrePrintは文字列に変換される各式に適用される.

終了

Exit[]
または
Quit[]
Wolframシステムを終了する
$Epilog
Wolframシステムが終了する前に評価するシンボル
$IgnoreEOF
ファイル末尾記号を受け取った時点でインタラクティブなWolframシステムセッションを終了するかどうか
end.m
Wolframシステムが終了したときに読み込むファイル
Wolframシステムの終了
Wolframシステムセッションを終了するにはいくつかの方法がある.Wolframシステムをインタラクティブに使っている場合は,入力行にExit[]Quit[]をタイプすると Wolframシステムが終了できる.
ファイルからWolfram言語への入力を取っている場合,ファイルの最後に達した時点でWolframシステムは終了する.Wolframシステムをインタラクティブに使っている場合でも,Wolframシステムがファイル末尾文字(通常Ctrl+d)を受け取ると終了する.これでWolframシステムが終了しないようにするには,$IgnoreEOF=Trueと設定するとよい.

ネットワークライセンス管理

シングルマシンライセンス
プロセスは常に特定のマシンで起動する必要がある
ネットワークライセンス
プロセスはネットワーク上の任意のマシンで起動することができる
シングルマシンおよびネットワークライセンス
Wolframシステムは単一マシン上で,あるいはネットワークライセンスとして起動設定が可能である.ネットワークライセンスはmathpassファイルの中の!name で始まる行に示されている.name とは,ネットワークライセンスのサーバマシン名である.
ネットワークライセンスはWolframシステムライセンス管理プログラムであるmathlmで管理されおり,これはサーバマシン上で起動する.このプログラムはネットワークライセンスでWolframシステムが使用されている間は常に作動している必要がある.通常はシステムが起動するたびにmathlmが自動的に実行するよう,システムを設定しておいた方がよい.
コマンドラインから直接.mathlmとタイプする
Windowsのサービスにmathlmを加える
Microsoft Windows上でのネットワークライセンスマネージャの起動方法
Unixコマンドラインから直接./mathlmとタイプする
中央のシステム起動スクリプトにmathlmを起動する1行を加える
MacintoshまたはLinux上でのネットワークライセンスマネージャの起動方法
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版のみ)
mathlmのコマンドラインオプションの例
mathlmについてのより詳しい情報は,「Mathematica システム管理」を参照のこと.
monitorlm
ネットワークライセンスの状況を監視するプログラム
monitorlm name
ライセンスサーバ name のアクティビティを監視する
ネットワークライセンスの状況の監視
monitorlmがWebブラウザをスタートできる環境で実行されている場合は,自動的にHTML出力がブラウザに生成される.その他の場合はテキストが生成される.
-file file
出力をファイルに書き出す
-format spec
指定された形式で出力を書き出す.形式はtexthtmlcgiのいずれかである
-template file
出力のテンプレートとして指定されたファイルを使う
monitorlmのコマンドラインオプションの例