図1に、シンボリックの対象となるプログラムの一例を示す。図1に示されたプログラムは、COBOLで書かれたプログラムであり、以下のような特徴がある。
(1)内部形式が異なる複数の変数が存在する。変数Aは外部10進形式で主記憶装置の領域を確保する。変数Bは内部10進形式で主記憶装置の領域を確保する。変数Cは内部2進形式で主記憶装置の領域を確保する。
(2)同じ変数についてシンボル値と具体値とが混在する状況が生じる。具体的には、プログラムの110行目では、変数Aの2桁目のみを具体値「4」に書き換える。また、120行目では、変数Aの3桁目のみを具体値「9」に書き換える。一方、その他の桁は具体値ではなくシンボル値等である。
(3)或る変数に格納される、シンボル値及び具体値の両方を含む値が、転記演算によって別の変数に転記され、また比較演算によって別の変数と比較される。具体的には、140行目においては、変数Aに格納されている値が、変数Bに転記され、150行目においては、変数Aに格納されている値が、変数Cに転記される。160行目および190行目においては、変数Aに格納されている値が変数B及び変数Cに格納されている値と比較される。
シンボリック実行をする場合、160行目の「IF (変数A=変数B) THEN」においては、処理パスを網羅するため、真も偽も成立すべきである。しかし、以下で説明する本実施の形態の方法を用いない場合、140行目の「MOVE 変数A TO 変数B」および150行目「MOVE 変数A TO 変数C」の転記によって、例えば図2のように主記憶装置の領域が書き換えられる。具体的には、変数Aについては、アドレスA2及びA3に具体値が格納され、その他のアドレスにシンボル値等が格納される。変数Bについては、アドレスA5に具体値が格納され、その他のアドレスにシンボル値等が格納される。変数Cについては、アドレスA8に具体値が格納され、その他のアドレスにシンボル値等が格納される。なお、小数点の位置は別途レジスタ上に格納される。
従って、160行目の「IF (変数A=変数B) THEN」においては、「[00][49][0_0]=[49][00]」が成立するか判定するので、真のみ成立するという結果になる。なお、本例では、括弧は1バイトを表し、例えば[00]であれば1バイトに「00」という値が格納される。また、末尾の値は符号部の値であり、本実施の形態においては、正の値、負の値、及び値無しの3とおりがある。
同様に、190行目の「IF (変数A=変数C) THEN」についても、シンボリック実行では真も偽も成立すべきである。しかし、本実施の形態を用いない場合、「[00][49][00]=[00][49][00]」が成立するか判定するので、真のみ成立するという結果になる。
なお、COBOLの文法仕様により、値の比較時には、桁が不足する箇所に0が補完される。左辺及び右辺のいずれも末尾は符号部である。文法仕様については、例えば、「NetCOBOL V10.5 COBOL文法書(http://software.fujitsu.com/jp/manual/manualfiles/m120024/b1wd1361/06z000/b1wd-1361-06z0.pdf)」を参照のこと。
このように、以下で説明する本実施の形態を用いない場合、同じ変数についてシンボル値と具体値とが混在する(すなわち、異なる桁にシンボル値及び具体値が存在する)状況において、転記が適切に行われなくなる。さらに、比較も適切に行われなくなる。すなわち、シンボリック実行であるにもかかわらず、分岐において真のみ成立すると判定してしまうので、偽である場合の処理パスを網羅することができなくなる。その結果、偽である場合の処理パスについてテストデータを抽出することができなくなる。
そこで、本実施の形態においては、以下で示すような形式で変数の値を保持することによって、シンボリック実行における演算の誤りを無くすことができるようにする。
図3に、本実施の形態における情報処理装置10のブロック図を示す。情報処理装置10は、プログラム格納部6と、プログラム読み出し部51、命令実行装置52、カウンタ制御部53及び記録部54を含むシンボリック実行装置5と、実行履歴格納部4と、外部レジスタ3と、主記憶装置2と、シンボル値演算装置1とを有する。
プログラム格納部6には、シンボリック実行の対象となるプログラムが格納される。プログラム読み出し部51は、プログラム格納部6に格納されているプログラムを読み出し、命令実行装置52に出力する。命令実行装置52は、プログラムを実行すると共に、所定の命令(本実施の形態では、転記命令及び比較命令)を、シンボル値演算装置1に出力する。また、命令実行装置52は、プログラムにおける演算の結果を外部レジスタ3に格納する。命令実行装置52は、プログラム読み出し部51から受け取ったプログラムの実行が完了すると、その旨をカウンタ制御部53に通知する。カウンタ制御部53は、プログラムカウンタを管理しており、プログラム読み出し部51による読み出しを制御する。記録部54は、命令実行装置52から受け取った情報に基づき実行履歴(例えば、パス条件等)を生成し、実行履歴格納部4に格納する。シンボル値演算装置1は、外部レジスタ3に格納されているデータ及び主記憶装置2に格納されているデータ等を用いて転記演算を行い、結果を主記憶装置2に格納する。また、シンボル値演算装置1は、主記憶装置2に格納されているデータを用いて比較演算を行い、結果を外部レジスタ3に格納する。
図4に、シンボル値演算装置1のブロック図を示す。シンボル値演算装置1は、命令デコーダ100と、読み出し部101と、第1転送処理部111及び第2転送処理部112を含む転送処理部110と、第1形式変換部121及び第2形式変換部122を含む第1変換部120と、第3形式変換部131及び第4形式変換部132を含む第2変換部130と、変換装置102と、データレジスタ103と、書き出し部104と、比較演算部105と、混合値生成部106とを有する。
命令デコーダ100は、シンボリック実行装置5から受け取った命令をデコードし、変数(本実施の形態においては、転記元変数及び転記先変数、又は、比較元変数及び比較先変数)の情報を特定する。そして、命令デコーダ100は、変数の情報及びデコードされた命令に基づく処理の実行を、読み出し部101に指示する。
読み出し部101は、命令デコーダ100からの指示に従い、外部レジスタ3から変数の値を読み出し又は主記憶装置2から変数の値を読み出す。読み出し部101は、命令が転記命令である場合には、読み出した転記元変数の値を転送処理部110に出力する。読み出し部101は、命令が比較命令である場合には、読み出した比較元変数及び比較先変数の値を比較演算部105に出力する。
第1転送処理部111は、読み出し部101から受け取った転記元変数の値(ここでは具体値)を、第1形式変換部121及び第3形式変換部131に出力する。第2転送処理部112は、読み出し部から受け取った転記元変数の値(ここではシンボル値)を、第2形式変換部122及び第4形式変換部132に出力する。
第1形式変換部121は、第1転送処理部111から受け取った転記元変数の具体値の形式をパック形式(パック形式は、内部10進形式と同じである)に変換する処理を行い、処理結果を変換装置102に出力する。第2形式変換部122は、第2転送処理部112から受け取った転記元変数のシンボル値の形式を桁数形式に変換する処理を行い、処理結果を変換装置102に出力する。桁数形式は、桁毎に値を有する形式(すなわち、各要素が1桁の値を表す配列)である。
第3形式変換部131は、第1転送処理部111から受け取った転記元変数の具体値及び命令デコーダ100から受け取った転記先変数の情報を用いて、データレジスタ103に格納されているパック形式の具体値を転記先変数の形式に変換する処理を行う。そして、第3形式変換部131は、処理結果を変換装置102に出力する。第4形式変換部132は、第2転送処理部112から受け取った転記元変数のシンボル値及び命令デコーダ100から受け取った転記先変数の情報を用いて、データレジスタ103に格納されている桁数形式の転記元変数のシンボル値を転記先変数の形式に変換する処理を行う。そして、第4形式変換部132は、処理結果を変換装置102に出力する。
変換装置102は、第1変換部120から受け取った処理結果及び第2変換部130から受け取った処理結果をデータレジスタ103に格納する。
書き出し部104は、命令デコーダ100から受け取った転記先変数の情報を用いて、データレジスタ103に格納されているデータを、主記憶装置2に格納する。
比較演算部105は、混合値生成部106に、混合値の生成を指示する。混合値生成部106は、比較元の変数及び比較先の変数の各々について混合値を生成し、データレジスタ103に格納する。また、比較演算部105は、比較元の変数の混合値と比較先の変数の混合値とを比較する処理を行い、処理結果を外部レジスタ3に格納する。
なお、図4における太い矢印はデータの読み出しを表し、図4における太い点線の矢印はデータの書き出しを表す。
図5に、主記憶装置2に格納されるデータの一例を示す。図5の例では、各変数について、値が格納されるアドレスと、各アドレスに対応する具体値と、各アドレスに対応するシンボル値とが格納される。このように、主記憶装置2には、具体値が格納される領域とシンボル値が格納される領域とが別々に設けられる。アドレスA1乃至A8の各々は、1バイトの容量を有する格納領域のアドレスである。S1乃至S4、S6乃至S8、及びS10乃至S12はシンボル値を表し、F5、F9及びF13は符号部の値を表す。なお、内部2進形式においては、1バイトあたり2桁として記憶領域が確保される。図5において、アドレスA7に格納されているS11は変数Cの100の位に対応する。
図6に、外部レジスタ3に格納されるデータの一例を示す。図6の例では、各アドレスに対応する具体値と、各アドレスに対応するシンボル値とが格納される。「NA」は、値が空であることを表す。主記憶装置2と同様、外部レジスタ3には、具体値が格納される領域とシンボル値が格納される領域とが別々に設けられる。
次に、図7乃至図28を用いて、シンボル値演算装置1の動作について説明する。
まず、シンボル値演算装置1における命令デコーダ100は、シンボリック実行装置5から受け取った命令をデコードし、転記元変数及び転記先変数の情報、又は、比較元変数及び比較先変数の情報を特定する(図7:ステップS1)。ステップS1において特定される情報には、例えば、開始アドレス、データ長、開始位置の情報、桁数、小数部、及び変数の形式の情報等が含まれる。
読み出し部101は、命令デコーダから受け取った変数の情報に従い、変数の値を外部レジスタ3又は主記憶装置2から読み出す(ステップS3)。また、読み出し部101は、命令の種類が転記命令であるか判断する(ステップS5)。転記命令である場合(ステップS5:Yesルート)、読み出し部101は、読みだされた転記元変数の値を、転送処理部110に出力する。また、命令デコーダ100は、転記元変数及び転記先変数の情報を転送処理部110に出力し、転記元変数の情報を第1変換部120に出力し、転記先変数の情報を第2変換部130及び書き出し部104に出力する。
これに応じ、転送処理部110は、具体値の転記演算(ステップS7)及びシンボル値の転記演算(ステップS9)を実行する。はじめに、具体値の転記演算について、図8を用いて説明する。
まず、転送処理部110における第1転送処理部111は、転記元変数の具体値を第1形式変換部121及び第3形式変換部131に出力する。第1形式変換部121は、転記元変数の具体値をパック形式に変換し、データレジスタ103のアドレスRAに格納する(図8:ステップS21)。なお、データレジスタ103への格納は、変換装置102が行う。
第1転送処理部111は、命令デコーダ100から受け取った転記先変数の情報を用いて、転記元変数の小数値桁数と転記先変数の小数値桁数との差異を計算し、差異の分だけ、アドレスRAに格納されている変換後の具体値をシフトする(ステップS23)。すなわち、小数点の位置を合わせる処理を実行する。
第1転送処理部111は、転記先変数の符号部に値が格納されていない場合には、ステップS23の処理が実行された後の具体値の符号部に、正の符号値を設定する(ステップS25)。
第1転送処理部111は、ステップS25の処理が実行された後の具体値を、転記先変数の桁数に格納できる桁数に変換する(ステップS27)。
第3形式変換部131は、ステップS27の処理が実行された後の具体値を、命令デコーダ100から受け取った転記先変数の情報を用いて転記先変数の形式に変換し、データレジスタ103のアドレスRAに上書きする(ステップS29)。そして、呼び出し元の処理に戻る。なお、データレジスタ103への上書きは、変換装置102が行う。
次に、シンボル値の転記演算について、図9を用いて説明する。
まず、転送処理部110における第2転送処理部112は、転記元変数のシンボル値を第2形式変換部122及び第4形式変換部132に出力する。第2形式変換部122は、転記元変数のシンボル値を桁数形式に変換し、データレジスタ103のアドレスRBに格納する(図9:ステップS31)。なお、データレジスタ103への格納は、変換装置102が行う。
ここで、第2形式変換部122が実行する、桁数形式への変換について図10を用いて説明する。まず、第2形式変換部122は、格納に使用するアドレスの数を計算する(図10:ステップS41)。ここで、格納に使用するアドレスの数は、(((元のデータ長)−1)/2+((元のデータ長)−1)%2)+1によって求める。「%」は、剰余を求めるための演算子であり、「%2」によって2で割った際の剰余を求めることができる。また、第2形式変換部122は、データレジスタ103のアドレスRBにおける末尾のアドレスから順に、変換後のシンボル値を格納する(ステップS43)。そして処理を終了する。
図9の説明に戻り、第2転送処理部112は、命令デコーダ100から受け取った転記先変数の情報を用いて、転記元変数の小数値桁数と転記先変数の小数値桁数との差異を計算し、差異の分だけ、アドレスRBに格納されている変換後のシンボル値をシフトする(ステップS33)。すなわち、小数点の位置を合わせる処理を実行する。
第2転送処理部112は、転記先変数の符号部に値が格納されていない場合には、ステップS33の処理が実行された後のシンボル値の符号部に、正の符号値を設定する(ステップS35)。
第2転送処理部112は、ステップS35の処理が実行された後のシンボル値を、転記先変数の桁数に格納できる桁数に変換する(ステップS37)。
第4形式変換部132は、ステップS37の処理が実行された後のシンボル値を、命令デコーダ100から受け取った転記先変数の情報を用いて転記先変数の形式に変換し、データレジスタ103のアドレスRBに上書きする(ステップS39)。そして呼び出し元の処理に戻る。なお、データレジスタ103への上書きは、変換装置102が行う。
図7の説明に戻り、書き出し部104は、データレジスタ103に格納されている具体値及びシンボル値を、主記憶装置2に書き出す(ステップS11)。そして処理を終了する。
以上のように、桁毎に値を有する形式で具体値及びシンボル値を管理すると共に、両者を別々の領域に保存することで、同じ変数における異なる桁に具体値とシンボル値とが存在するような場合であっても、適切な演算を行えるようになる。
また、変数がどのような形式であっても、一旦は共通の形式に変換するので、演算に用いられる部品を共通化することが容易になる。
また、上で述べた例では、変数の値における或る桁に具体値が転記された場合に、シンボル値を空としている。これにより、変数の値における各桁が具体値及びシンボル値のいずれであるかを、シンボル値が空であるか否かによって判定できるようになる。
ここで、上で説明した転記演算について具体例を示す。
例えば、図5に示したデータが主記憶装置2に格納され、図6に示したデータが外部レジスタ3に格納されているとする。そして、以下のような転記命令があったとする。
・転記元の具体値は、開始アドレスがR1であり、データ長が1であり、開始位置が1(桁目)であり、桁数が1であり、小数部が0であり、形式が外部10進形式である。
・転記先変数(変数A)は、開始アドレスがA1であり、データ長が4であり、開始位置が2であり、桁数が1であり、小数部が0であり、形式が外部10進形式である。
図11に、上で述べたような状況においてデータレジスタ103に格納される具体値の変化を示す。図11の例では、最初の段階で具体値[4]がデータレジスタ103に格納されており、その後、第1転送処理部111の処理等を経た後も、変化がない。
図12に、上で述べたような状況においてデータレジスタ103に格納されるシンボル値の変化を示す。図12の例では、最初の段階でシンボル値[NA]がデータレジスタ103に格納されており、その後、第2転送処理部112の処理等を経た後も、変化がない。これは、上で述べた命令が具体値の転記命令であり、転送元にシンボル値が無いからである。
図13に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図13においては、図5に示したデータと異なる部分に色が付されている。データレジスタ103における具体値[4]は、主記憶装置2におけるアドレスA2に格納されている。この段階では、シンボル値は格納されていない。
図14に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図14においては、図5に示したデータと異なる部分に色が付されている。データレジスタ103におけるシンボル値[NA]は、主記憶装置2におけるアドレスA2に格納されている。但し、具体値とシンボル値とは別々の領域に格納されている。
また、例えば図15に示したデータが主記憶装置2に格納されている状態において、以下のような転記命令があったとする。
・転記元変数(変数A)の具体値は、開始アドレスがA1であり、データ長が4であり、開始位置が1であり、桁数が4であり、小数部が2であり、形式が外部10進形式である。
・転記先変数(変数B)は、開始アドレスがA5であり、データ長が2であり、開始位置が1であり、桁数が3であり、小数部が2であり、形式が内部10進形式である。
図16に、上で述べたような状況においてデータレジスタ103に格納される具体値の変化を示す。図16の例では、最初の段階で具体値[0][4][9][00]が主記憶装置2から読み出され、第1形式変換部121の処理によって、[00][49][00]というパック形式に変換される。さらに、第1転送処理部111の処理によって、[49][00]という形式に変換される。
図17に、上で述べたような状況においてデータレジスタ103に格納されるシンボル値の変化を示す。図17の例では、最初の段階でシンボル値[S1][NA][NA][S4_F5]が主記憶装置2から読み出され、第2形式変換部122の処理によって、[NA_S1][NA_NA][S4_F5]という桁数形式に変換される。さらに、第2転送処理部112の処理によって、[NA_NA][S4_F5]という形式に変換される。
図18に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図18においては、図15に示したデータと異なる部分に色が付されている。変数Bは内部10進形式であるため、アドレスA5に具体値「4」及び具体値「9」が格納される。この段階では、シンボル値は格納されていない。
図19に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図19においては、図15に示したデータと異なる部分に色が付されている。アドレスA5における、シンボル値を格納する領域に、具体値「4」に対応するシンボル値「NA」及び具体値「9」に対応するシンボル値「NA」が格納される。
また、例えば図19に示したデータが主記憶装置2に格納されている状態において、以下のような転記命令があったとする。
・転記元変数(変数A)の具体値は、開始アドレスがA1であり、データ長が4であり、開始位置が1であり、桁数が4であり、小数部が2であり、形式が外部10進形式である。
・転記先変数(変数C)は、開始アドレスがA7であり、データ長が2であり、開始位置が1であり、桁数が3であり、小数部が1であり、形式が内部2進形式である。
図20に、上で述べたような状況においてデータレジスタ103に格納される具体値の変化を示す。図20の例では、最初の段階で具体値[0][4][9][00]が主記憶装置2から読み出され、第1形式変換部121の処理によって、[00][49][00]というパック形式に変換される。また、第1転送処理部111が、小数点の位置を合わせるため、右シフトして[04][90]という形式にする。さらに、第3形式変換部131の処理によって、[0x00][0x31]という転記先変数の形式に変換される。
図21に、上で述べたような状況においてデータレジスタ103に格納されるシンボル値の変化を示す。図21の例では、最初の段階でシンボル値[S1][NA][NA][S4_F5]が主記憶装置2から読み出され、第2形式変換部122の処理によって、[NA_S1][NA_NA][S4_F5]という桁数形式に変換される。また、第2転送処理部112が、小数点の位置を合わせるため、右シフトして[S1_NA][NA_F5]という形式にする。
図22に、上で述べた転記命令における具体値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図22においては、図19に示したデータと異なる部分に色が付されている。変数Cは内部2進形式であるため、アドレスA7に具体値「0x00」が格納され、アドレスA8に具体値「0x31」が格納される。この段階では、シンボル値は格納されていない。
図23に、上で述べた転記命令におけるシンボル値の転記が終了した際に主記憶装置2に格納されるデータの一例を示す。図23においては、図19に示したデータと異なる部分に色が付されている。アドレスA7における、シンボル値を格納する領域に、具体値「0x00」に対応するシンボル値「S1」及び「NA」が格納され、アドレスA8における、シンボル値を格納する領域に、具体値「0x31」に対応するシンボル値「NA」が格納される。
図7の説明に戻り、ステップS5において命令の種類は転記ではない場合(ステップS5:Noルート)、命令の種類は比較である。よって、読み出し部101は、読みだされた比較元変数の値及び比較先変数の値を、比較演算部105に出力する。そして、比較演算部105は、比較演算を実行する(ステップS13)。比較演算については、図24及び図25を用いて説明する。
まず、比較演算部105は、比較元変数の値及び比較先変数の値を、混合値生成部106に出力する。これに応じ、混合値生成部106は、比較元変数及び比較先変数の各々について、混合値生成処理を実行する(図24:ステップS51)。混合値生成処理については、図25を用いて説明する。
まず、混合値生成部106は、比較元変数のシンボル値及び比較先変数のシンボル値の形式を、桁数形式に変換し、データレジスタ103のアドレスRAに格納する(図25:ステップS61)。なお、ステップS61において、混合値生成部106は、第1変換部120における第2形式変換部122に変換を実行させる。
混合値生成部106は、比較元変数の具体値及び比較先変数の具体値の形式を、パック形式に変換し、データレジスタ103のアドレスRBに格納する(ステップS63)。なお、ステップS63において、混合値生成部106は、第1変換部120における第1形式変換部121に変換を実行させる。
混合値生成部106は、アドレスRAに格納されている、比較元変数のシンボル値及び比較先変数のシンボル値において、空である桁が有るか判断する(ステップS65)。空である桁が無い場合(ステップS65:Noルート)、呼び出し元の処理に戻る。一方、空である桁が有る場合(ステップS65:Yesルート)、空である桁に、アドレスRBに格納されている具体値における同じ桁の値を設定する(ステップS67)。そして呼び出し元の処理に戻る。例えば、比較元変数のシンボル値における3桁目が空である場合は、比較元変数の具体値における3桁目の値を設定する。また、例えば、比較先変数のシンボル値における2桁目が空である場合は、比較先変数の具体値における2桁目の値を設定する。上で述べたように、シンボル値の桁のうち空である桁には、具体値が存在する。
以上のような処理を実行すれば、具体値及びシンボル値が異なる桁に存在する値を生成できるようになる。
図24の説明に戻り、比較演算部105は、混合値生成処理により生成された2つの混合値について、小数値桁数の差異を計算し、差異の分だけ、小数の桁数が少ない方の混合値を左シフトする(ステップS53)。すなわち、小数点の位置を調整する処理を実行する。
比較演算部105は、比較元の混合値及び比較先の混合値のいずれかに符号が無い(すなわち、符号部に値が無い)場合には、両者の符号部に正の符号値を設定する(ステップS55)。
比較演算部105は、充足可能性の判定を行う(ステップS57)。なお、充足可能性の判定は、制約ソルバ等を用いて行ってもよい。制約ソルバについては、例えば、上で示した非特許文献1を参照のこと。
比較演算部105は、充足可能性の判定結果を外部レジスタ3に格納する(ステップS59)。そして、図7の説明に戻り、処理を終了する。
図26に、ステップS59の処理によって外部レジスタ3に格納されるデータの一例を示す。図26の例では、アドレスRTに、分岐条件が真である状態を充足するか否かを表す情報が格納され、アドレスRFに、分岐条件が偽である状態を充足するか否かを表す情報が格納される。図26の例では、「1」であれば条件が成立することを表し、「0」であれば条件が成立しないことを表す。従って、本例では、分岐条件が真である状態と偽である状態との両方を充足する。
例えば、図1に示したプログラムの140行目「MOVE 変数A TO 変数B」および150行目「MOVE 変数A TO 変数C」の転記演算によって、図23に示したデータが主記憶装置2に格納されたとする。そして、そのデータを用いて、160行目「IF (変数A=変数B) THEN」において、混合値[0_S1][4_9][S4_F5]と混合値[4_9][S4_F5]との比較を行うとする。ここで、S1の値が0以外なら(変数A=変数B)の分岐条件は偽であり、S1の値が0なら(変数A=変数B)の分岐条件は真である。
また、190行目「IF (変数A=変数C) THEN」において、混合値[0_S1][4_9][S4_F5]」と混合値[0_S1][4_9][0_F5]」との比較を行うとする。ここで、S4の値が0以外なら(変数A=変数C)の分岐条件は偽であり、S4の値が0なら(変数A=変数C)の分岐条件は真である。
よって、本実施の形態の方法によれば、分岐条件について真及び偽の両方が成立すると判定され、両方の処理パスを実行することができる。これにより、シンボリック実行において、処理パスを網羅することができるので、テストデータの抽出漏れが無くなる。
ここで、上で説明した混合値生成について具体例を示す。
図27に、変数Aについての混合値生成の一例を示す。図27の例では、主記憶装置2に、図23に示したデータが格納されているとする。この場合、まず主記憶装置2から変数Aの具体値[0][4][9][00]が読み出され、また、主記憶装置2から変数Aのシンボル値[S1][NA][NA][S4_F5]が読み出される。具体値[0][4][9][00]は、第1形式変換部121の処理によって[00][49][00]というパック形式に変換される。また、シンボル値[S1][NA][NA][S4_F5]は、第2形式変換部122の処理によって[NA_S1][NA_NA][S4_F5]という桁数形式に変換される。そして、混合値生成部106が、具体値[00][49][00]及びシンボル値[NA_S1][NA_NA][S4_F5]によって混合値を生成すると、[0_S1][4_9][S4_F5]になる。
図28に、変数Cについての混合値生成の一例を示す。図28の例では、主記憶装置2に、図23に示したデータが格納されているとする。この場合、まず主記憶装置2から変数Cの具体値[0x00][0x31]が読み出され、また、主記憶装置2から変数Cのシンボル値[S1][NA][NA][S4_F5]が読み出される。具体値[0x00][0x31]は、第1形式変換部121の処理によって[04][90]というパック形式に変換される。また、シンボル値[S1][NA][NA][S4_F5]は、第2形式変換部122の処理によって[S1_NA][NA_F5]という桁数形式に変換される。そして、混合値生成部106が、具体値[04][90]及びシンボル値[S1_NA][NA_F5]によって混合値を生成すると、[S1_4][9_F5]になる。なお、比較演算部105が、変数Aについての混合値と小数点の位置を合わせる処理を実行すると、最終的に、混合値は[0_S1][4_9][0_F5]という形式になる。
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置10の機能ブロック構成は実際のモジュール構成に一致しない場合もある。
また、上で説明した各テーブルの構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
例えば、上で述べた例では、具体値の転記処理を実行した後にシンボル値の転記処理を実行するが、両者を並列に実行してもよい。
また、1バイトに2桁の値を保持する形式を桁数形式としたが、言語がサポートする形式によって、桁数形式を変更してもよい。例えば、1バイトに1桁の値を格納する形式にしてもよいし、1バイトに4桁の値を格納する形式にしてもよい。
以上述べた本発明の実施の形態をまとめると、以下のようになる。
本実施の形態の第1の態様に係る演算装置は、(A)シンボリック実行における演算の対象である第1の変数の具体値を、桁毎に値を有する形式である第1の形式に変換すると共に、第1の変数のシンボル値を、桁毎に値を有する形式である第2の形式に変換する第1変換部と、(B)第1変換部による変換後の具体値を、第1の記憶領域に格納すると共に、第1変換部による変換後のシンボル値を、第1の記憶領域とは異なる第2の記憶領域に格納する第1格納処理部とを有する。
このようにすれば、シンボリック実行において変数の演算を適切に行えるようになる。具体的には、同じ変数における異なる桁に具体値とシンボル値とが存在するような場合であっても、演算の誤りを無くせるようになる。さらに、変数がどのような形式であったとしても、共通の形式に変換するので、転記演算等に用いられる部品を共通化しやすくなる。
また、上で述べた演算装置が、(C)第1の記憶領域に格納された具体値を、転記先の変数である第2の変数の形式に変換すると共に、第2の記憶領域に格納されたシンボル値を、第2の変数の形式に変換する第2変換部と、(D)第2変換部による変換後の具体値を第3の記憶領域に格納すると共に、第2変換部による変換後のシンボル値を、第3の記憶領域とは異なる第4の記憶領域に格納する第2格納処理部とをさらに有してもよい。このようにすれば、シンボリック実行において変数の間で転記演算を行えるようになる。
また、上で述べた演算装置が、(E)第2変換部による変換の実行前に、具体値及びシンボル値の各々について、小数点の位置を第2の変数に合わせる処理をすると共に、桁数を第2の変数の桁数に合わせる処理を行う第1処理部をさらに有してもよい。これにより、転記演算が適切に行われるようになる。
また、上で述べた演算装置が、(F)第2の記憶領域に格納されたシンボル値の桁のうち空である桁を第1の記憶領域に格納された具体値の同じ桁で置換して第1の混合値を生成すると共に、第5の記憶領域に格納された具体値を第1の形式に変換し、第6の記憶領域に格納されたシンボル値を第2の形式に変換し、変換後のシンボル値の桁のうち空である桁を、変換後の具体値における同じ桁で置換して第2の混合値を生成する生成部と、(G)第1の混合値と第2の混合値との比較を行う比較部とをさらに有してもよい。このようにすれば、シンボリック実行において変数の間で比較演算を行えるようになる。
また、上で述べた比較部は、(g1)第1の混合値の小数点の位置と、第2の混合値の小数点の位置とを合わせる処理をしてもよい。このようにすれば、比較演算が適切に行われるようになる。
本実施の形態の第2の態様に係る演算方法は、(H)シンボリック実行における演算の対象である第1の変数の具体値を、桁毎に値を有する形式である第1の形式に変換し、第1の記憶領域に格納し、(I)第1の変数のシンボル値を、桁毎に値を有する形式である第2の形式に変換し、第1の記憶領域とは異なる第2の記憶領域に格納する処理を含む。
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、CD−ROM、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)
シンボリック実行における演算の対象である第1の変数の具体値を、桁毎に値を有する形式である第1の形式に変換すると共に、前記第1の変数のシンボル値を、桁毎に値を有する形式である第2の形式に変換する第1変換部と、
前記第1変換部による変換後の具体値を、第1の記憶領域に格納すると共に、前記第1変換部による変換後のシンボル値を、前記第1の記憶領域とは異なる第2の記憶領域に格納する第1格納処理部と、
を有する演算装置。
(付記2)
前記第1の記憶領域に格納された具体値を、転記先の変数である第2の変数の形式に変換すると共に、前記第2の記憶領域に格納されたシンボル値を、前記第2の変数の形式に変換する第2変換部と、
前記第2変換部による変換後の具体値を第3の記憶領域に格納すると共に、前記第2変換部による変換後のシンボル値を、前記第3の記憶領域とは異なる第4の記憶領域に格納する第2格納処理部と、
をさらに有する付記1記載の演算装置。
(付記3)
前記第2変換部による変換の実行前に、前記具体値及びシンボル値の各々について、小数点の位置を前記第2の変数に合わせる処理をすると共に、桁数を前記第2の変数の桁数に合わせる処理をする第1処理部
をさらに有する付記2記載の演算装置。
(付記4)
前記第2の記憶領域に格納されたシンボル値の桁のうち空である桁を前記第1の記憶領域に格納された具体値の同じ桁で置換して第1の混合値を生成すると共に、第5の記憶領域に格納された具体値を前記第1の形式に変換し、第6の記憶領域に格納されたシンボル値を前記第2の形式に変換し、変換後の前記シンボル値の桁のうち空である桁を、変換後の前記具体値における同じ桁で置換して第2の混合値を生成する生成部と、
前記第1の混合値と前記第2の混合値との比較を行う比較部と、
をさらに有する付記1乃至3のいずれか1つ記載の演算装置。
(付記5)
前記比較部は、
前記第1の混合値の小数点の位置と、前記第2の混合値の小数点の位置とを合わせる処理をする
ことを特徴とする付記4記載の演算装置。
(付記6)
シンボリック実行における演算の対象である第1の変数の具体値を、桁毎に値を有する形式である第1の形式に変換し、第1の記憶領域に格納し、
前記第1の変数のシンボル値を、桁毎に値を有する形式である第2の形式に変換し、前記第1の記憶領域とは異なる第2の記憶領域に格納する
処理を演算装置が実行する演算方法。