JPH0950379A - プログラム意味保存コード移動装置 - Google Patents

プログラム意味保存コード移動装置

Info

Publication number
JPH0950379A
JPH0950379A JP20319795A JP20319795A JPH0950379A JP H0950379 A JPH0950379 A JP H0950379A JP 20319795 A JP20319795 A JP 20319795A JP 20319795 A JP20319795 A JP 20319795A JP H0950379 A JPH0950379 A JP H0950379A
Authority
JP
Japan
Prior art keywords
instruction
program
code
flow graph
node
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
JP20319795A
Other languages
English (en)
Inventor
Takao Shimomura
隆夫 下村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ATR TSUSHIN SYST KENKYUSHO KK
Original Assignee
ATR TSUSHIN SYST KENKYUSHO KK
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ATR TSUSHIN SYST KENKYUSHO KK filed Critical ATR TSUSHIN SYST KENKYUSHO KK
Priority to JP20319795A priority Critical patent/JPH0950379A/ja
Publication of JPH0950379A publication Critical patent/JPH0950379A/ja
Withdrawn legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 プログラムの意味を変えずに一般のコードの
移動を可能にし、ソフトウェア改造時の影響を除去でき
るようなプログラム意味保存コード移動装置を提供す
る。 【解決手段】 一般の手続型言語で記述されたプログラ
ムにおいて、プログラム内の命令の間の制御の流れを解
析してフローグラフ作成部1によってフローグラフ3を
作成し、フローグラフ解析部4によってフローグラフ3
を元にして命令の間の支配関係を支配木9と呼ぶ木構造
で記録し、一般コード移動条件検査部10によって支配
木9内のある支配ノードを起点としてフローグラフ3内
のパスを辿りながら、コード移動の対象となる命令がコ
ード移動条件を満足するかどうかを判別し、満足する場
合にはプログラムの意味を変えることなくコード移動の
対象となるコードを支配ノードの直前の位置に移動す
る。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】この発明はプログラム意味保
存コード移動装置に関し、特に、一般の手続型言語で記
述されたプログラムにおいて、プログラムの改造時にコ
ードを移動することにより改造による副作用を自動的に
除去することを可能とするプログラム意味保存コード移
動装置に関する。
【0002】
【従来の技術】プログラムコード移動に関する従来例と
して、ループ不変命令のループ外移動があり、ループの
中で常に実行結果の変わらない命令をループの外に移動
すれば、プログラムの実行効率を上げることができる。
【0003】図3はそのようなループ不変命令のコード
移動について説明するためのフローグラフである。図3
に示したフローグラフは、nを得て、x=0,w=2を
設定した後、i=1に設定して、ループを実行し、v=
w+1の演算式よりvを得て、x=x+vの演算式より
xの値を演算し、iがnになるまでループを実行し、i
がnになったときxを出力する。
【0004】v=w+1の命令はループの中で常に実行
結果の変わらないループ不変命令であり、iを+1する
ごとに同じ演算を実行するためにプログラムの実行効率
が悪くなる。そこで、このような命令をループの外のヘ
ッダの上に移動できればプログラムの実行効率を上げる
ことができる。
【0005】ループ内の命令sをループヘッダの前に移
動できるための移動条件は次のようなものである。ここ
で、ループヘッダ,定義,使用,支配などの用語につい
ては、A. V. Aho and J. D. Ullman, “Principles of
Compliler Design, ”Addison-Wesley, 1977. に記載さ
れている。
【0006】命令sでは変数vを定義(設定)するもの
とする。ここで、Use(s)は、命令sで使用される
変数の集合である。 (L1)任意の変数w∈Use(s)に対して、命令s
に到達する変数wの定義はループ外にある。 (L2)命令sはループのすべての出口を支配する。す
なわち、出口を通り抜けるときは必ずその前に命令sを
実行している。 (L3)ループ内で変数vを定義する命令は、命令sの
みである。 (L4)ループ内での変数vの使用に到達する変数vの
定義は、命令sのみである。
【0007】この従来例では、ループ内の命令sが(L
1)から(L4)までの条件を満足する場合には、プロ
グラムの意味を変えずに、この命令sをループの外に、
すなわちループヘッダの前に移動することができる。図
3に示した例では、命令“v:=w+1;”は(L1)
から(L4)までのすべての条件を満足している。した
がって、この命令“v:=v+1;”は命令“w:=
2;”の直後の位置に移動することができる。
【0008】図4は従来のループ不変命令の移動条件を
検査するシステムのブロック図である。図4において、
フローグラフ作成部1は、ソースプログラム2内の命令
の間の制御の流れを解析して、命令をノード,ノードか
らノードへ制御の流れをアークとするフローグラフ3を
作成する。フローグラフ解析部4はフローグラフ3を基
にして、命令の間の支配関係を、命令をノード,ノード
間の支配関係をアークとする支配木と呼ぶ木構造で記録
するとともに、すべての変数について、その支配木5の
到達するノードを記録する。ループ検出部6は支配木5
を用いてフローグラフ3内に存在するループを検出し、
ループ情報7を記録する。ループ不変命令移動条件検査
部8は、支配木5,到達する定義およびループ情報7を
用いて、コード移動の対象となる命令がループ不変命令
移動条件を満足するか否かを検査し、ループ不変命令移
動条件を満足する場合には、プログラムの意味を変える
ことなく、ループ不変命令をループヘッダの前に移動
し、ループ不変命令移動条件を満足しない場合には、ル
ープ不変命令の移動を禁止する。
【0009】
【発明が解決しようとする課題】上述の従来の方法で
は、ループ不変命令をループ外に移動することはできる
が、ソフトウェアの改造を行なう場合には、任意の命令
をある条件を満たす位置、すなわち、改造による影響が
波及しない位置に移動させたい場合が生じる。しかし、
ループだけに着目した従来のコード移動技術では、この
問題を解決することはできない。ソフトウェアの改造時
に発生するこの問題について、以下に詳細に説明する。
【0010】図5は改造の対象となるプログラムCha
rge1を示す図であり、図6は改造対象機能である通
話料の総計Mのスライスを示す図であり、図7は改造後
のプログラムCharge2を示す図である。
【0011】図5に示す課金プログラムCharge1
は、各呼びにおける通話開始時刻ts,通話終了時刻t
e,通話距離dを入力して、通話料の総計Mと通話時間
の総計Tを出力するプログラムである。TD(ts,t
e),Tn(ts,te)はそれぞれ、各呼びにおける
昼間時間帯(8:00〜19:00),夜間時間帯(1
9:00〜8:00)における通話時間を返す関数であ
り、rs,rtはそれぞれ昼間時間帯,夜間時間帯にお
ける課金率であり、R(d)は距離dに応じた課金率を
返す関数であるとする。通話料の総計Mに関して、プロ
グラムを次のように改造を行なう場合を考える。
【0012】従来の夜間時間帯(19:00〜8:0
0)を夜間時間帯(19:00〜23:00)と深夜時
間帯(23:〜8:00)の2つに分け、各々の課金率
をru,rvとして、通話料の総計Mを出力するよう
に、プログラムを改造する。各呼びにおける深夜時間帯
における通話時間を返す関数として、TL(ts,t
e)を用いることとする。
【0013】ソフトウェアを改造する場合には、改造対
象機能(この場合には、通話料の総計M)を計算してい
る部分をプログラムの中から抽出する。これを改造対象
機能に関するスライスと呼ぶ。改造対象機能に関するス
ライスを求める方法はK. B.Gallagher and J. R. Lyle,
“Using Program Slicing in Software Maintenace,
” IEEE Transactions on Software Engineering, Vo
l. 17, No. 8, August 1991, pp. 751-761. に記載され
ている。課金プログラムCharge1において、改造
対象機能Mに関するスライスを求めると、図6に示すよ
うになる。
【0014】図6において、左側に示した命令が改造対
象機能Mに関するスライスである。右側の雲形で囲まれ
た命令はスライスに含まれない部分、すなわち改造対象
でない部分を表わしている。スライスに含まれる命令の
うち、枠で囲まれた部分は通話時間の総計T(改造対象
ではない)を計算している部分でも使用されている命令
であり、この部分に対する編集は行なわない。この改造
対象機能Mに関するスライスに対して、図7に示すよう
な改造を行なう。
【0015】すなわち、新たに設定した夜間時間帯(1
9:00〜23:00)と深夜時間帯(23:00〜
8:00)の各々の通話料mv,muを求め、それらを
昼間時間帯(8:00〜19:00)の通話料msに加
えるという方法により、新しい通話料mを求める。図7
において、Amは追加した命令であり、rnは命令nを
変更(削除,追加)したことを表わす。命令A1で深夜
時間帯における通話時間uを求め、命令A2で新たに設
定した夜間時間帯における通話時間vを算出し、それら
から命令A3,A4において、夜間時間帯と深夜時間帯
の各々の通話料mv,muを求め、最後に命令R10で
昼間時間帯も併せた合計の通話料mを求めている。旧使
用である夜間時間帯(19:00〜8:00)の通話料
mtを算出していた命令7は不要なので削除している。
【0016】改造対象機能Mに関するスライスは実行可
能な部分プログラムであり、この部分プログラムに対し
て行なった改造の結果は正しい。しかし、改造部分が非
改造部分から影響を受けているため、プログラム全体と
しては正しく実行されない。なぜならば、プログラムは
改造対象部分に着目して改造を行なっており、追加した
命令A2では、改造対象部分内の命令5で算出した夜間
時間帯(19:00〜8:00)におけり通話時間tを
使用しているが、この変数tはプログラマの意図してい
ない非改造部分内(命令8)でも定義されている。その
ために、この例の場合には、命令A2では新たに設定し
た夜間時間帯(19:00〜23:00)における通話
時間vの値を正しく求めることができない。
【0017】このように、非改造部分から影響を受けて
いるコードを移動することにより、このような影響をシ
ステムが自動的に除去できれば、プログラマは改造した
い部分だけに着目して、改造作業を進めることができる
ようになる。また、テスト作業も改造対象機能のスライ
スに対して行なえば、プログラム全体に対してテストし
たのと同じ効果を持つことになる。
【0018】それゆえに、この発明の主たる目的は、こ
のような問題点を解消し得て、プログラムの意味を変え
ずに、コードを移動し得る一般的な手法であるプログラ
ム意味保存コード移動装置を提供することである。
【0019】
【課題を解決するための手段】この発明はプログラム意
味保存コード移動装置であって、フローグラフ作成部に
よってプログラム内の命令の間の制御の流れを解析し
て、フローグラフ作成部によって命令をノード,ノード
からノードへ制御の流れをアークとするフローグラフを
作成し、そのフローグラフを基にして、フローグラフ解
析部によって命令の間の支配関係を、命令をノード,ノ
ード間の支配関係をアークとする支配木と呼ぶ木構造で
記録し、支配木内のある支配ノードを起点としてフロー
グラフ内パスを辿りながら、一般コード移動条件検査部
によってコード移動の対象となるコードがコード移動条
件を満足するか否かを検査し、一般コード移動条件を満
足する場合には、プログラムの意味を変えることなく、
コード移動の対象となるコードを支配ノードの直前の位
置に移動することにより、プログラムの改造時に発生す
る副作用をコード移動することにより自動的に除去する
ことが可能となり、プログラム改造作業を容易にする。
【0020】
【発明の実施の形態】この発明の実施の形態の改造対象
のプログラミング言語としては、Ada,Pasca
l,Cなどの一般の手続型言語を想定しているが、ここ
では図7で用いたAda言語で記述されたプログラムC
harge2を例にとって説明していく。
【0021】図1はこの発明の実施の形態のブロック図
である。図1において、フローグラフ作成部1は図4と
同じであり、ソースプログラム2内の命令の間の制御の
流れを解析して、命令をノード,ノードからノードへ制
御の流れをアークとするフローグラフ3を作成する。フ
ローグラフ解析部4はフローグラフ3を基にして命令の
間の支配関係5、命令をノード,ノード間の支配関係を
アークとする支配木9と呼ぶ木構造で記録する。
【0022】さらに、一般コード移動条件検査部10は
支配木9内のある支配ノードを起点としてフローグラフ
3内のパスを辿りながら、コード移動の対象となるコー
ド(命令)がコード移動条件を満足するか否かを検査す
る。変数vへ値を設定する代入命令sを移動する位置を
posとする。改造対象部分プログラムに関して、以下
の記号を導入する。
【0023】UseIns:命令s以外の変数vを使用
している命令の集合。 DefIns:命令s以外の変数vを定義している命令
の集合。 すると、改造対象部分プログラムにおいて、任意の命令
u∈UseIns,命令d∈DefInsに対して、以
下に示す条件(C1)〜(C4)が成立するならば、命
令sを位置posに移動しても、改造対象プログラムS
liceRの意味は変わらない。すなわち、どんな入力
を与えて実行しても、SliceR内の命令s以外の各
命令の実行結果は変わらない。命令sは変数w∈Use
(s)を使用して変数vを定義している。
【0024】条件(C1):位置posは命令sを支配
する(すなわち、フローグラフ上で、開始ノードから命
令sに至るすべてのパスが位置posを通過する)。
【0025】条件(C2):位置posから命令sに至
るパスで始点以外にposを含まないすべてのパスが、
命令s以外に変数vを定義する命令を含まない。
【0026】条件(C3):位置posから命令sに至
る、始点以外にposを含まないすべてのパスが任意の
変数w∈Use(s)に対して、変数wを定義する命令
を含まない。
【0027】条件(C4):位置posから命令uに至
るパスは、命令sあるいは命令s以外の変数vを定義す
る命令を含む。
【0028】条件(C1)〜(C4)を満足する命令s
を移動できる位置posが見つかった場合には、その位
置(返された命令の直前が位置posを表わす)を出力
し、そうでない場合にはFailureを出力して停止
する一般コード移動アルゴリズムを図2に示す。
【0029】まず、すべての変数w∈Use(s)に対
して、変数wの定義が命令sに到達するパスの集合De
fPaths(w)を予め求めておく(ただし、各パス
を表わす命令の列から、始点である変数wを定義する命
令および終点である命令sを除外しておく)。改造対象
部分プログラムにおいて、命令sを支配するノードの集
合は、支配関係に関して全順序関係を持つ。このことは
前述のA. V. Aho andJ. D. Ullman, “Principles of C
pmplier Design,” Addison-Wesley, 1977.に記載され
ている。命令aが命令bを支配することをa<bで表わ
すこととし、命令sを支配するノードの集合をdom
[1]<dom[2]<…<dom[n](<s)とす
る。ここで、domはdominatorの略であり、
支配を意味している。
【0030】domを始点とするパスを順に辿るには、
分岐箇所において辿っていない分岐をスタックにプッシ
ュダウンして、パスのトラバースを続け、既に辿ったノ
ードに出会うか、あるいは次に続くノードがない場合
に、スタックをポップアップして次のパスを辿っていけ
ばよい。パスを辿りながら、命令u,命令dあるいは命
令sに出会うかどうかを調べ、各命令に応じた処理を行
なう。
【0031】次に、具体的な例として、この発明を用い
て図7に示した改造プログラムCharge2を実行す
る動作について説明する。図7に示した改造プログラム
Charge2では、命令A2で変数tを使用していた
が、非改造部分内に存在する命令8における変数tの定
義が命令A2に到達しているため、非改造部分から影響
を受けている。非改造部分から受けるこの影響を除去す
るために、影響を受けている命令A2を移動できる位置
を見つけるために一般コード移動アルゴリズムを適用し
てみる。
【0032】すなわち、UseIns={A3},De
fIns=φ,Use(A2)={t,u}となる。こ
れは、UseInsは命令s以外の変数vを使用してい
る命令の集合であるため命令A3がこれに相当し、De
fInsは命令s以外の変数vを定義している命令の集
合であるが、定義している命令は存在しないので空集合
φとなる。命令A2で使用している変数はtとuである
ため、Use(a2)={t,u}となる。変数tは命
令5で定義しており、変数tの定義が命令A2に到達す
るパスの集合は、DefPaths(t)={〈A1,
6〉}であり、変数uは命令A1で定義しており、変数
uの定義が命令A2に到達するパスの集合は、DefP
aths(u)={〈6〉}である。
【0033】命令A2を支配するノードは命令1<命令
3<命令4<命令5<命令A1<命令6である。まず、
命令A2を支配する命令6について考えると条件(C
1)をクリアしている。DefPaths(t),De
fPaths(u)内のパスはともに命令6を含む。し
たがって、上述の条件(C3)をクリアしている。命令
A2から命令6を通らないで命令A2に戻るパスは存在
しない。したがって、条件(C2)の一部をクリアして
いる。
【0034】命令6を始点とするパスを辿ると、命令A
2に出会い、命令uやdに出会うことはないので、条件
(C4)をクリアし,条件(C2)も完全にクリアして
いる。それ以外の途中に分岐する箇所はなく、調べるべ
きパスは他に存在しないため、命令A2の移動可能な位
置として命令6が出力される。非改造部分内に存在する
変数tの定義(命令8)は命令6には到達しないため、
命令A2を命令6の直前の位置に移動すれば、プログラ
ムの意味を変えずに、かつ非改造部分からの影響も除去
することができる。
【0035】
【発明の効果】以上のように、この発明によれば、プロ
グラムの意味を変えずに、一般のコードの移動可能な位
置を求めることができるため、ソフトウェア改造時の影
響の自動的除去など、従来技術に比べて広範囲に応用で
きる利点がある。また、ループヘッダの前の位置をpo
sとすると、ループヘッダの性質から条件(C1)が条
件(L3)から(C2)が、(L1)から(C3)が、
また(L2),(L4)から(C4)が導かれる。した
がって、ループ不変命令移動条件は、一般コード移動条
件の特殊な場合となっていることがわかる。
【図面の簡単な説明】
【図1】この発明の実施形態によるプログラム意味保存
コード移動装置のブロック図である。
【図2】この発明の実施形態による一般コード移動のア
ルゴリズムを示す図である。
【図3】ループ不変命令のコードを移動を説明するため
のフローグラフを示す図である。
【図4】従来のループ不変命令の移動条件を検査するシ
ステムのブロック図である。
【図5】改造対象プログラムCharge1を示す図で
ある。
【図6】改造対象機能である通話料の総計Mのスライス
を示す図である。
【図7】改造後のプログラムCharge2を示す図で
ある。
【符号の説明】
1 フローグラフ作成部 2 ソースプログラム 3 フローグラフ 4 フローグラフ解析部 9 支配木 10 一般コード移動条件検査部

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】 一般の手続型言語で記述されたプログラ
    ムにおいて、 前記プログラム内の命令の間の制御の流れを解析して、
    命令をノード,ノードからノードへの制御の流れをアー
    クとするフローグラフを作成するフローグラフ作成手段
    と、 前記フローグラフ作成手段によって作成されたフローグ
    ラフをもとにして命令の間の支配関係を、命令をノー
    ド,ノード間の支配関係をアークとする支配木と呼ぶ木
    構造で解析するフローグラフ解析手段と、 前記フローグラフ解析手段によって解析された支配木内
    のある支配ノードを起点としてフローグラフ内のパスを
    辿りながら、コード移動の対象となるコードがコード移
    動条件を満足するか否かを検査する一般コード移動検査
    手段を備え、 前記コード移動条件を満足する場合には、前記プログラ
    ムの意味を変えることなく、コード移動の対象となるコ
    ードを支配ノードの直前の位置に移動することを特徴と
    する、プログラム意味保存コード移動装置。
JP20319795A 1995-08-09 1995-08-09 プログラム意味保存コード移動装置 Withdrawn JPH0950379A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP20319795A JPH0950379A (ja) 1995-08-09 1995-08-09 プログラム意味保存コード移動装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP20319795A JPH0950379A (ja) 1995-08-09 1995-08-09 プログラム意味保存コード移動装置

Publications (1)

Publication Number Publication Date
JPH0950379A true JPH0950379A (ja) 1997-02-18

Family

ID=16470079

Family Applications (1)

Application Number Title Priority Date Filing Date
JP20319795A Withdrawn JPH0950379A (ja) 1995-08-09 1995-08-09 プログラム意味保存コード移動装置

Country Status (1)

Country Link
JP (1) JPH0950379A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2004081788A1 (ja) * 2003-03-10 2004-09-23 Catena Corporation Lyee指向ソフトウェアに関する静的分析方法
JP2007094753A (ja) * 2005-09-29 2007-04-12 Hitachi Ltd ロジック抽出支援装置
JP2016528622A (ja) * 2013-07-31 2016-09-15 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation プロシージャ間支配節を計算するためのシステム、もしくはその方法、またはその両方

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2004081788A1 (ja) * 2003-03-10 2004-09-23 Catena Corporation Lyee指向ソフトウェアに関する静的分析方法
JP2007094753A (ja) * 2005-09-29 2007-04-12 Hitachi Ltd ロジック抽出支援装置
JP2016528622A (ja) * 2013-07-31 2016-09-15 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation プロシージャ間支配節を計算するためのシステム、もしくはその方法、またはその両方

Similar Documents

Publication Publication Date Title
US5522036A (en) Method and apparatus for the automatic analysis of computer software
CN111104335B (zh) 一种基于多层次分析的c语言缺陷检测方法及装置
EP0461786A2 (en) Methods and apparatus for transforming machine language program constructs into high-level language constructs by manipulating graphical program representations
CN102110051B (zh) 应用程序切片技术的静态缺陷检测方法
JPH06314203A (ja) コンパイラの最適化方法および装置
KR20060045568A (ko) 프로그램 계측 동안의 프로브 최적화 방법 및 시스템
JPH02264329A (ja) プログラム自動生成装置
EP1548581A2 (en) Methods, apparatus and programs for system development
US20020052856A1 (en) Method of data-dependence analysis and display for procedure call
JPS61241837A (ja) 範囲検査の最適化方法
JPH0950379A (ja) プログラム意味保存コード移動装置
JP6719798B1 (ja) 論理結合型プログラムが実行時に発生する非同期型アルゴリズムの正統性の検証を実施可能にするためのプログラム
Beyleda et al. BINTEST-search-based test case generation
Taentzer et al. A formal framework for incremental model slicing
JP2016128941A (ja) 出力判定装置、出力判定方法、出力判定プログラム、及び、静的解析装置
Jo et al. Constructing control flow graph for java by decoupling exception flow from normal flow
Askarpour et al. Mind the gap: Robotic mission planning meets software engineering
JPH0522272B2 (ja)
JP3903514B2 (ja) 未定義変数検出の最適化コンパイラ装置
JP2000200190A (ja) ソフトウェア開発支援装置、ソフトウェア開発支援方法およびその方法をコンピュ―タに実行させるプログラムを記録したコンピュ―タ読み取り可能な記録媒体
Lefticaru Testing Robots Using CSP
Gandor et al. Architectures for Dynamically Coupled Systems
Schlie et al. Architectures for Dynamically Coupled Systems
JPH0793144A (ja) プログラム解析装置
JPH03127127A (ja) コンピュータプログラムの最適化方法

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20021105