IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 新日鐵住金株式会社の特許一覧

特開2024-8473プログラム変換支援装置、プログラム変換支援方法、およびプログラム
<>
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図1
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図2
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図3
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図4
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図5
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図6
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図7
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図8A
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図8B
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図9
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図10
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図11
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図12
  • 特開-プログラム変換支援装置、プログラム変換支援方法、およびプログラム 図13
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024008473
(43)【公開日】2024-01-19
(54)【発明の名称】プログラム変換支援装置、プログラム変換支援方法、およびプログラム
(51)【国際特許分類】
   G06F 8/30 20180101AFI20240112BHJP
   G06F 8/70 20180101ALI20240112BHJP
【FI】
G06F8/30
G06F8/70
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2022110383
(22)【出願日】2022-07-08
(71)【出願人】
【識別番号】000006655
【氏名又は名称】日本製鉄株式会社
(74)【代理人】
【識別番号】100090273
【弁理士】
【氏名又は名称】國分 孝悦
(72)【発明者】
【氏名】中村 英都
(72)【発明者】
【氏名】河村 伸吾
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC38
5B376BC69
5B376DA22
5B376FA13
(57)【要約】
【課題】 人手によるプログラムの変換ミスの可能性があることを検出することができるようにする。
【解決手段】 プログラム変換支援装置100は、元のC言語のソースプログラム500の構文解析を含む処理と、構造体化されたC言語のソースプログラム810、820の構文解析を含む処理と、を行い、元のC言語のソースプログラム500の構文解析の結果に基づく情報と、構造体化されたC言語のソースプログラム810、820の構文解析の結果に基づく情報と、を比較し、当該比較の結果に基づく情報である比較結果情報を出力する。
【選択図】 図1
【特許請求の範囲】
【請求項1】
変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援装置であって、
前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理手段と、
前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理手段と、
前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較手段と、
前記比較手段による比較の結果に基づく情報である比較結果情報を出力する出力手段と、
を備える、プログラム変換支援装置。
【請求項2】
前記出力手段は、
前記変換後プログラムの構文解析の結果に基づく情報のうち、前記変換前プログラムの構文解析の結果に基づく情報と相違する情報である変換後相違情報の、当該相違に関する情報を前記比較結果情報として出力する、請求項1に記載のプログラム変換支援装置。
【請求項3】
前記出力手段は、
前記変換後プログラムに前記比較結果情報を埋め込み、前記比較結果情報が埋め込まれた前記変換後プログラムのソースコードを示す情報を表示装置に表示させる、請求項2に記載のプログラム変換支援装置。
【請求項4】
前記構文解析の結果に基づく情報は、構文解析の結果に出現する変数に関する情報である変数情報を含む、請求項1~3のいずれか1項に記載のプログラム変換支援装置。
【請求項5】
前記変換前プログラムは、第1のプログラミング言語のプログラムを第2のプログラミング言語に変換することにより得られたプログラムである、請求項1~3のいずれか1項に記載のプログラム変換支援装置。
【請求項6】
前記変換後プログラム処理手段は、
前記比較手段により、前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、が相違するという比較結果が得られた場合、その後に新たに得られた前記変換後プログラムの構文解析を含む処理を行い、
前記比較手段は、
前記変換前プログラムの構文解析の結果に基づく情報と、前記新たに得られた前記変換後プログラムの構文解析の結果に基づく情報と、を比較する、請求項1~3のいずれか1項に記載のプログラム変換支援装置。
【請求項7】
変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援方法であって、
前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理工程と、
前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理工程と、
前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較工程と、
前記比較工程による比較の結果に基づく情報である比較結果情報を出力する出力工程と、
を備える、プログラム変換支援方法。
【請求項8】
請求項1~3のいずれか1項に記載のプログラム変換支援装置の各手段としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラム変換支援装置、プログラム変換支援方法、およびプログラムに関する。
【背景技術】
【0002】
各種の分野において実行結果が同じなるようにプログラムを変換することが行われる。例えば、或るシステムで稼働している或るプログラミング言語で記述されたプログラムを別のシステムで稼働させたり、システムの老朽化のためにシステムを更新したりする際に、当該プログラムを別のプログラミング言語に変換することが行われる。また、プログラムの可読性を向上させるために、当該プログラムの記述を変換することが行われる。
【0003】
例えば、小規模なプログラムを変換する場合や、用途に合ったトランスコンパイラ(コンバージョンソフトウェア)を用意できない場合がある。また、例えば、プログラムを自動変換することができても(トランスコンパイラを適用することができても)、トランスコンパイラによる変換結果を、プログラムの実行結果が変わらない範囲で修正したい場合がある。
【0004】
以上のような人手によるプログラムの変換を支援する技術として特許文献1に記載の技術がある。
特許文献1には、データ構造が定義されたメンバを有する構造体をプログラムから検出し、移植元の計算機および移植先の計算機で、メンバのデータ配置領域、サイズ、およびオフセットが相違する場合、当該メンバを有する構造体を特定する情報と、当該相違する情報と、を出力することが開示されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開平5-233237号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
ところで、人手によるプログラムの変換が行われる場合に変換ミスが発生する可能性がある。人手によるプログラムの変換ミスが、変換後のプログラム(ソースプログラム)をコンパイルすることができないようなミスであれば、当該コンパイルの際に変換ミスであることが検出される。しかしながら、このような場合でも、どこにエラーがあるのかをプログラマが何の手がかりもなく探索する必要がある。また、人手によるプログラムの変換ミスがあっても、当該変換ミスが、変換後のプログラムをコンパイルすることができるようなミスである場合(例えば、変換後のプログラムに構文上の問題がない場合)には、変換後のプログラムを実際に稼働させた際にエラーが発生したり、変換後のプログラムが想定通りに処理を行わなかったりする場合がある。変換後のプログラムが想定通りに処理を行わずに、変換前のプログラムによる処理の実行結果と異なる結果が得られていても、プログラマがそのことに気が付くことができない場合、大きな問題を引き起こす可能性がある。例えば、製造設備においてこのような問題が発生すると、仕様とは異なる製品が製造される虞があり、その影響は甚大である。
【0007】
このように人手によるプログラムの変換ミスの可能性があることを検出することができるようにすることが望まれるところ、特許文献1に記載の技術は、比較の対象となるソースプログラムが同一であることを前提とし、プログラムを動作させるシステム(または環境)の違いによる誤動作を抑制するための技術であり、人手によるプログラムの変換ミスを検出するための技術ではない。
【0008】
本発明は、以上のような問題点に鑑みてなされたものであり、人手によるプログラムの変換ミスの可能性があることを検出することができるようにすることを目的とする。
【課題を解決するための手段】
【0009】
本発明のプログラム変換支援装置は、変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援装置であって、前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理手段と、前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理手段と、前記変換前プログラの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較手段と、前記比較手段による比較の結果に基づく情報である比較結果情報を出力する出力手段と、を備える。
【0010】
本発明のプログラム変換支援方法は、変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援方法であって、前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理工程と、前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理工程と、前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較工程と、前記比較工程による比較の結果に基づく情報である比較結果情報を出力する出力工程と、を備える。
【0011】
本発明のプログラムは、前記プログラム変換支援装置の各手段としてコンピュータを機能させる。
【発明の効果】
【0012】
本発明によれば、人手によるプログラムの変換ミスの可能性があることを検出することができる。
【図面の簡単な説明】
【0013】
図1】プログラム変換支援装置の機能的な構成の一例を示す図である。
図2】プログラム変換支援方法の一例を説明するフローチャートである。
図3】プログラム変換支援方法の具体例を説明するフローチャートである。
図4】FORTRANのソースプログラムの一例を示す図である。
図5】元のC言語のソースプログラムの一例を示す図である。
図6】元のC言語のソースプログラムの抽象構文木の一例を示す図である。
図7】元のC言語のソースプログラムの抽象構文木から抽出された変数情報の一例を示す図である。
図8A】正しく構造体化されたC言語のソースプログラムの一例を示す図である。
図8B】誤って構造体化されたC言語のソースプログラムの一例を示す図である。
図9】正しく構造体化されたC言語のソースプログラムの抽象構文木の一例を示す図である。
図10】正しく構造体化されたC言語のソースプログラムの抽象構文木から抽出された変数情報の一例を示す図である。
図11】誤って構造体化されたC言語のソースプログラムの抽象構文木から抽出された変数情報の一例を示す図である。
図12】元のC言語のソースプログラムの抽象構文木から抽出された変数情報と、誤って構造体化されたC言語のソースプログラムの抽象構文木から抽出された変数情報と、の比較の結果に関する情報を含むレポートの一例を示す図である。
図13】修正ガイド付きの構造体化されたC言語のソースプログラムの情報の一例を示す図である。
【発明を実施するための形態】
【0014】
以下、図面を参照しながら、本発明の一実施形態を説明する。
(プログラム変換支援装置100の機能構成)
図1は、本実施形態のプログラム変換支援装置100の機能的な構成の一例を示す図である。プログラム変換支援装置100のハードウェアは、例えば、CPU(Central Processing Unit)など一又はそれ以上の数のハードウェアプロセッサ、RAM(Random Access Memory)、ROM(Read Only Memory)など一又はそれ以上の数のメモリを具備し、メモリに格納される一又はそれ以上の数のプログラムが一又はそれ以上の数のハードウェアプロセッサにより実行されることで各種の演算を実行する。さらに、プログラム変換支援装置100のハードウェアは、入力装置、および出力装置を具備する。
【0015】
本実施形態のプログラム変換支援装置100は、取得部110と、変換前プログラム処理部120と、変換後プログラム処理部130と、比較部140と、出力部150と、を備える。
【0016】
プログラム変換支援装置100は、変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行う。例えば、アルゴリズムの変更(例えば、ソートを実施するプログラムにおいて、ソートの方式をバブルソートからクイックソートに変更すること)等が行われない場合には、変換前後のプログラミング言語が異なっていても、プログラムの先頭からの、変数の参照を行う順番は変更されないことが想定される。したがって本実施形態では、変換前プログラムにおける実行文の記述順序が変わらないように変換前プログラムの少なくとも一部が人手により変換される場合を例示する。このような変換として、例えば、プログラミング言語の変換、および、プログラムの可読性を高めるための変換(例えば構造体化)がある。構造体化とは、構造体のメンバではない変数(例えば、配列と配列要素番号として表される変数)を構造体のメンバとすることである。なお、変換前プログラムに対し実行文の記述順序が変わらないとは、変換前プログラムと変換後プログラムとで、各実行文の記述位置の相対的な位置関係が変わらないことを指し、記述位置(行番号)そのものが変わらないということではない。例えば、変換前プログラムにおいて1行目に記述されている或る実行文が10行目に記述されている別の実行文よりも前に記述されているとする。この場合、変換後プログラムにおいても当該或る実行文が当該別の実行文よりも前に記述されていれば、例えば、変換後プログラムにおいて、当該或る実行文が2行目に記述され、当該別の実行文が9行に記述されていても、これらの実行文の記述順序は変わらないことになる。
【0017】
ここで、本実施形態の説明において、変換前プログラムおよび変換後プログラムは、ソースプログラムである。また、変数の書き出しは代入と称され参照とは区別されることもあるが、本実施形態の説明において、変数の参照は、変数の読み出しおよび書き出しを意味するものである(すなわち、変数の参照は、代入を含む概念であるもの)とする。
【0018】
取得部110は、変換前プログラムの情報と、変換後プログラムの情報と、を取得する。変換前プログラムの情報、変換後プログラムの情報には、それぞれ変換前プログラム、変換後プログラムのソースコードが含まれる。
【0019】
取得部110における変換前プログラムの情報および変換後プログラムの情報の取得形態は特に限定されない。例えば、取得部110は、プログラム変換支援装置100に装着された記憶媒体に記憶されている変換前プログラムの情報および変換後プログラムの情報を読み出すことにより取得しても良い。また、取得部110は、外部装置から送信された変換前プログラムの情報および変換後プログラムの情報を受信することにより取得しても良い。また、取得部110は、プログラマがプログラム変換支援装置100のユーザインターフェース(キーボード等)を操作することにより入力した変換前プログラムの情報および変換後プログラムの情報を取得しても良い。また、後述する具体例のように、或る言語のソースプログラムを別の言語に自動変換することにより得られたソースプログラムを変換前プログラムとする場合、取得部110は、当該或る言語のソースプログラムを、トランスコンパイラ等を用いて自動変換することにより変換前プログラムを取得しても良い。
【0020】
また、変換前プログラムの情報および変換後プログラムの情報の取得形態は同じであっても異なっていても良い。例えば、取得部110は、プログラム変換支援装置100に装着された記憶媒体に記憶されている変換前プログラムの情報を読み出して取得することと、プログラマがプログラム変換支援装置100のユーザインターフェース(キーボード等)を操作することにより入力した変換後プログラムの情報を取得することと、を行っても良い。
【0021】
変換前プログラム処理部120は、変換前プログラムに対する処理として、変換前プログラムの構文解析を含む処理を行う。
変換後プログラム処理部130は、変換後プログラムに対する処理として、変換後プログラムの構文解析を含む処理を行う。
【0022】
例えば、変換前プログラムに対し、コメントおよび改行の挿入等を行う変換は、プログラムの実行結果に影響しない変換である。このような変換によっても変換後プログラムは変換前プログラムと相違する。このような相違点を検出して出力(プログラマに報知)しても良いが、プログラムの実行結果に影響がある相違点をプログラマにより分かりやすく報知するために、変換前プログラムと変換後プログラムとの相違点のうち、プログラムの実行結果に影響がある相違点に限って出力するのが好ましい。抽象構文木(abstract syntax tree)は、ソースプログラムをそのまま木構造として表した構文木から、コードの生成に必要のない部分が除かれたものである。そこで本実施形態では、変換前プログラムの抽象構文木と、変換後プログラムの抽象構文木と、を比較する場合を例示する。
【0023】
例えば、C言語のコンパイラの一つであるClang等、ソースプログラムを解釈することにより抽象構文木を作成して外部で利用できるようにしているコンパイラがある。したがって本実施形態では、変換前プログラム処理部120および変換後プログラム処理部130が、このようなコンパイラを用いて抽象構文木を作成する場合を例示する。
【0024】
ただし、変換前プログラム処理部120および変換後プログラム処理部130は、コンパイラを用いて抽象構文木を作成する必要はない。例えば、変換前プログラム処理部120および変換後プログラム処理部130は、コンパイラを用いずに、構文解析用に別途作成された構文解析器(構文解析を行うプログラム)を用いて抽象構文木を作成しても良い。また、変換前プログラム処理部120および変換後プログラム処理部130は、必ずしも抽象構文木を作成する必要はない。前述したように抽象構文木を比較するのが好ましいが構文木を比較しても良い。この場合、変換前プログラム処理部120および変換後プログラム処理部130は、抽象構文木を作成せずに構文木を作成して後述する比較部140に出力する。なお、構文木は、プログラムをそのまま木構造にしたものであり、抽象構文木は、構文木から言語の意味に関係ない情報を取り除き、言語の意味に関係のある情報のみを木構造としたものである。
【0025】
比較部140は、変換前プログラムの構文解析の結果に基づく情報と、変換後プログラムの構文解析の結果に基づく情報と、を比較する。前述したように本実施形態では、変換前プログラム処理部120により変換前プログラムの抽象構文木が作成され、変換後プログラム処理部130により変換後プログラムの抽象構文木が作成される。そこで、比較部140は、変換前プログラムの抽象構文木と、変換後プログラムの抽象構文木と、を比較する。
【0026】
比較部140は、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致するか否かを判定する。この際、比較部140は、変換後プログラムの抽象構文木の全ての情報を、変換前プログラムの抽象構文木と比較しても良い。しかしながら、人手による変換ミスが生じる可能性が高いのは、構文解析の結果(本実施形態では抽象構文木)に出現する変数に関する情報である。したがって、比較部140は、変換後プログラムの抽象構文木に出現する変数に関する情報と、変換前プログラムの抽象構文木に出現する変数に関する情報と、を比較する。
【0027】
変換前プログラムの抽象構文木に出現する変数に関する情報と、変換前プログラムの抽象構文木に出現する変数に関する情報と、の全てを抽出して比較しても良い。しかしながら、前述したように、変換前プログラムと変換後プログラムとの相違点のうち、プログラムの実行結果に影響がある相違点に限って出力(プログラマに報知)するのが好ましい。
そこで、本実施形態では、構文解析の結果に出現する変数に関する情報のうち、変数の読み出しおよび書き出しに必要な情報(例えば、変数に格納されている値と変数の格納先とが少なくとも特定される情報)を記述しているノードに対応する部分を、変換前プログラムの抽象構文木および変換後プログラムの抽象構文木のそれぞれから抽出する場合を例示する。以下の説明では、変換前プログラムおよび変換後プログラムの構文解析の結果(本実施形態では抽象構文木)から抽出する情報を、必要に応じて変数情報と称する。
【0028】
また、本実施形態では、比較部140が、変数情報のうち、プログラムを実行する際に使用される変数情報を比較する場合を例示する。プログラムを実行する際に使用される変数情報には、例えば、変数の属性(例えば型)と、変数の参照に係る情報(例えば、変数の参照先のメモリ領域の先頭からのオフセットなど)と、が含まれる。よって本実施形態では、比較部140は、変換後プログラムの抽象構文木に含まれる、当該変換後プログラムを実行する際に使用される変数情報と、変換前プログラムの抽象構文木に含まれる、当該変換前プログラムを実行する際に使用される変数情報と、を比較する。
【0029】
このとき比較部140は、参照が行われる順番が同じ順番の変数の変数情報を比較する。すなわち、比較部140は、変換後プログラムにおいて参照が行われる順番がn番目の変数の変数情報と、変換前プログラムにおいて参照が行われる順番がn番目の変数の変数情報と、を比較する(nは正の整数)。例えば、参照が行われる順番がn番目の変数が、変換前プログラムにおいては実数型(Float型)であるのに対し、変換後プログラムにおいては整数型(Int型)である場合、当該変数の変数情報(データの型)は相違することになる。
【0030】
なお、参照が行われる順番が同じ順番は、ソースプログラムの先頭から数えた場合の順番である。また、実行文において同じ変数名の変数が繰り返し出現する場合、参照が行われる順番を数える際に、当該繰り返し出現する変数のそれぞれに異なる順番が与えられる。
【0031】
比較部140は、変換後プログラムにこのような相違が1つもない場合、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致すると判定し、そうでない場合、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致しないと判定する。このように、変換後プログラムの抽象構文木に、変換前プログラムの抽象構文木と一致しない部分がある場合(部分一致の場合)には、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致しないと判定される。
【0032】
出力部150は、比較部140による比較の結果に基づく情報である比較結果情報を出力する。出力部150における比較結果情報の出力形態は特に限定されない。例えば、出力部150は、比較結果情報をコンピュータディスプレイに表示することにより出力しても良い。また、出力部150は、比較結果情報をプログラム変換支援装置100の内部または外部の記憶媒体に記憶することにより出力しても良い。また、出力部150は、比較結果情報を外部装置に送信することにより出力しても良い。
【0033】
出力部150は、例えば、変換後プログラムの構文解析の結果に基づく情報のうち、変換前プログラムの構文解析の結果に基づく情報と相違する情報である変換後相違情報の、当該相違に関する情報を比較結果情報として出力する。前述したように本実施形態では、変換前プログラムの抽象構文木から抽出された変数情報と、変換後プログラムの抽象構文木から抽出された変数情報と、が比較される場合を例示する。したがって本実施形態では、変換後プログラムの変数情報のうち、変換前プログラムの変数情報と相違する情報が、変換後相違情報の一例である。なお、以下の説明では、変換後相違情報が変数情報であることが分かりやすくなるように、変換後プログラムの変数情報のうち、変換前プログラムの変数情報と相違する情報を、必要に応じて変換後相違変数情報と称する。
【0034】
比較結果情報は、変換後相違変数情報が、変換後プログラムに記述されている変数のうちのどの変数の変数情報であるのかを示す情報を含んでいても良い。また、比較結果情報は、例えば、変換前プログラムに対して変換後相違変数情報がどのように相違しているのかを特定することができる情報を含んでも良い。
【0035】
変換前プログラムと変換後プログラムとの相違点をプログラマに分かりやすく報知するのが好ましい。したがって本実施形態では、出力部150が、変換後プログラムに変換後相違変数情報を埋め込み、当該比較結果情報が埋め込まれた変換後プログラムのソースコードを示す情報をコンピュータディスプレイに表示させる場合を例示する。例えば、出力部150は、変換後プログラムの実行文において変換後相違変数情報が使用される変数が記述されている位置に応じて、当該変換後相違変数情報についての比較結果情報を埋め込む位置を定めても良い。より具体的には、出力部150は、変換後プログラムにおいて変換後相違変数情報が使用される変数が記述されている実行文の次の行を空欄とし、当該空欄の行に当該変換後相違変数情報についての比較結果情報を埋め込む(後述する図13の比較結果情報1301~1303を参照)。
【0036】
なお、実行文の次の行に加えてまたは代えて、実行文と同じ行、および実行文の1つ前の行に比較結果情報が埋め込まれても良い。また、変換後プログラムに、比較結果情報の一覧が埋め込まれても良い。比較結果情報の一覧の一例は、後述する図12に示すような、変数情報の比較の結果に関する情報を含むレポート1200である。ただし、出力部150は、このような比較結果情報の一覧を変換後プログラムに埋め込まずに出力しても良い。
【0037】
また、比較結果情報が、変換後プログラムに記述されている変数のうちのどの変数の変数情報であるのかを示す情報を含む場合、変換後プログラムの実行文に記述されている変数の表示態様(例えば、色、大きさ、フォント、および太さの少なくとも1つ)を、他の情報と異ならせても良い。
【0038】
プログラマは、変換後相違変数情報についての比較結果情報を参照することにより、どの変数情報がどのように誤っているのかを把握し、変換前プログラムの少なくとも一部を人手により再変換して変換後プログラムを新たに作成する。取得部110は、このようにして新たに作成された変換後プログラムを取得する。そして、変換後プログラム処理部130は、新たに作成された変換後プログラムに対し、前述したようにして構文解析を含む処理を行う。比較部140は、変換前プログラムの構文解析の結果に基づく情報と、新たに作成された変換後プログラムの構文解析の結果に基づく情報と、を前述したようにして比較する。出力部150は、当該比較の結果に基づく比較結果情報を前述したようにして出力する。このような取得部110、変換後プログラム処理部130、比較部140、および出力部150の処理は、変換前プログラムの構文解析の結果に基づく情報と、変換後プログラムの構文解析の結果に基づく情報と、が一致することが比較部140により判定されるまで繰り返される。変換前プログラムの構文解析の結果に基づく情報と、変換後プログラムの構文解析の結果に基づく情報と、が一致することが比較部140により判定された場合、出力部150は、そのことを示す情報を出力する。以下の説明では、変換前プログラムの構文解析の結果に基づく情報と、変換後プログラムの構文解析の結果に基づく情報と、が一致することを示す情報を、必要に応じて、変換前後相違なし情報と称する。変換前後相違なし情報の出力形態は特に限定されない。変換前後相違なし情報の出力形態の具体例は、例えば、前述した比較結果情報の出力形態の具体例と同じである。
【0039】
(プログラム変換支援方法)
次に、図2のフローチャートを参照しながら、本実施形態のプログラム変換支援装置100を用いて行われるプログラム変換支援方法の一例を説明する。
【0040】
まず、ステップS201において、取得部110は、変換前プログラムのソースプログラムを取得する。
次に、ステップS202において、変換前プログラム処理部120は、変換前プログラムに対する処理として、変換前プログラムの構文解析を含む処理を行う。前述したように本実施形態では、変換前プログラム処理部120は、コンパイラを用いて、変換前プログラムのソースプログラムの構文解析を行うことにより、変換前プログラムの抽象構文木を作成する。
【0041】
次に、ステップS203において、変換前プログラム処理部120は、ステップS202で作成された抽象構文木から変数情報を抽出する。前述したように本実施形態では、変数情報のうち、変換前プログラムを実行する際に使用される変数情報が比較部140により比較される。したがって本実施形態では、変換前プログラム処理部120は、変数情報のうち、変換前プログラムを実行する際に使用される変数情報を、ステップS202で作成された抽象構文木から抽出する。変換前プログラム処理部120は、抽出した変数情報を、変換前プログラムにおいて参照が行われる順番に並べる。
【0042】
また、ステップS204において、取得部110は、変換後プログラムのソースプログラムを取得する。変換後プログラムは、変換前プログラムの少なくとも一部を人手により変換したプログラムである。前述したように本実施形態では、プログラマは、変換前プログラムにおける実行文の記述順序が変わらないように変換前プログラムの少なくとも一部を人手により変換する。
【0043】
次に、ステップS205において、変換後プログラム処理部130は、変換後プログラムに対する処理として、変換後プログラムの構文解析を含む処理を行う。前述したように本実施形態では、変換後プログラム処理部130は、コンパイラを用いて、変換後プログラムのソースプログラムの構文解析を行うことにより、変換後プログラムの抽象構文木を作成する。
【0044】
次に、ステップS206において、変換後プログラム処理部130は、ステップS205で作成された抽象構文木から変数情報を抽出する。前述したように本実施形態では、変数情報のうち、変換後プログラムを実行する際に使用される変数情報が比較部140により比較される。したがって本実施形態では、変換後プログラム処理部130は、変数情報のうち、変換後プログラムを実行する際に使用される変数情報を、ステップS205で作成された抽象構文木から抽出する。変換後プログラム処理部130は、抽出した変数情報を、変換後プログラムにおいて参照が行われる順番に並べる。
【0045】
次に、ステップS207において、比較部140は、変換前プログラムの構文解析の結果に基づく情報と、変換後プログラムの構文解析の結果に基づく情報と、を比較する。前述したように本実施形態では、比較部140は、変換後プログラムの抽象構文木に含まれる、当該変換後プログラムを実行する際に使用される変数情報と、変換前プログラムの抽象構文木に含まれる、当該変換前プログラムを実行する際に使用される変数情報と、を比較する。
【0046】
なお、ステップS207の処理が開始する前にステップS203、S206の処理が終了していれば、ステップS202、S203と、ステップS204~S206と、はいずれが先に行われても良い。
【0047】
そして、比較部140は、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致するか否か(変換後相違変数情報の有無)を判定する。
この判定の結果、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致する場合(変換後相違変数情報が1つもない場合(ステップS207でYESの場合))、ステップS208において、出力部150は、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致することを示す情報である変換前後相違なし情報を出力する。ステップS208の処理が終了すると、図2のフローチャートによる処理は終了する。
【0048】
一方、変換後プログラムの抽象構文木と、変換前プログラムの抽象構文木と、が一致しない場合(ステップS207でNOの場合)、ステップS209において、出力部150は、変数情報の比較の結果に関する情報を含むレポートを作成する。レポートには、変換後相違変数情報についての比較結果情報が含まれる。
【0049】
次に、ステップS210において、出力部150は、ステップS209で作成したレポートに基づいて、変換後プログラムのソースプログラムにおいて変換後相違変数情報が使用される実行文に対応する位置に、当該変換後相違変数情報についての比較結果情報を埋め込む。
次に、ステップS211において、出力部150は、比較結果情報をコンピュータディスプレイに表示させる。例えば、出力部150は、変換後プログラムのソースプログラムにおいて変換後相違変数情報が使用される実行文が位置する行と同じ行(同じ行番号)に、当該変換後相違変数情報についての比較結果情報を表示させる。
【0050】
プログラマは、変換後相違変数情報についての比較結果情報を参照することにより、どの変数情報がどのように誤っているのかを把握し、変換前プログラムの少なくとも一部を人手により再変換して変換後プログラムを新たに作成する。ステップS204において、取得部110は、このようにして新たに作成された変換後プログラムを取得する。そして、前述したステップS205~S207の処理が再び行われる。そして、ステップS207において、変換後プログラムの抽象構文木の中に、変換前プログラムの抽象構文木と相違する部分があると判定された場合(ステップS207でNOの場合)には、ステップS209~S211の処理が再び行われる。
【0051】
(プログラム変換支援装置100およびプログラム変換支援方法の具体例)
次に、プログラム変換支援装置100およびプログラム変換支援方法の具体例を説明する。或る言語で記述されたソースプログラムを別の言語で記述されたソースプログラムにトランスコンパイラ等を用いて自動変換する場合、自動変換後のソースプログラムの可読性が良くない場合等、プログラマが自動変換後のソースプログラムを人手により修正したいと考える場合がある。そこで、本例では、FORTRANからC言語に自動変換されたソースプログラムの可読性を高めるために、C言語のソースプログラムの一部を人手により変換する場合を例に挙げて説明する。
【0052】
本例においてもプログラム変換支援装置100の機能的な構成は図1に示す構成になる。図3は、本例におけるプログラム変換支援方法を説明するフローチャートである。図3を参照しながら、本例におけるプログラム変換支援装置100を用いて行われるプログラム変換支援方法の一例を説明する。
【0053】
ステップS301において、取得部110は、FORTRANのソースプログラムを取得する。FORTRANのソースプログラムの取得は、例えば、記憶媒体からの読み出し、外部装置からの受信、またはプログラマの操作入力によって行われる。図4は、FORTRANのソースプログラム400の一例を示す図である。なお、FORTRANのソースプログラム400のソースファイル名を「fortran.f」とする。
【0054】
次に、ステップS302において、取得部110は、市販のトランスコンパイラ等を用いて、FORTRANのソースプログラム400をC言語のソースプログラムに自動変換する。図5は、FORTRANのソースプログラム400を言語変換することにより得られたC言語のソースプログラム500の一例を示す図である。なお、C言語のソースプログラム500のソースファイル名を「converted.c」とする。本例においては、ステップS301~S302が図2のステップS201に対応し、C言語のソースプログラム500が変換前プログラムに対応する。以下の説明では、C言語のソースプログラム500を、必要に応じて元のC言語のソースプログラム500と称する。
【0055】
次に、ステップS303において、変換前プログラム処理部120は、コンパイラを用いて、元のC言語のソースプログラム500の構文解析を行うことにより、元のC言語のソースプログラム500の抽象構文木を作成する。図6は、元のC言語のソースプログラム500の抽象構文木600の一例を示す図である。本例では、オープンソースとして提供されているClangを用いて抽象構文木が作成される場合を例示する。なお、Clangを用いる場合、抽象構文木は、Clangの内部で、必要に応じてライブラリを用いることにより作成される。また、図6では、表記の都合上、元のC言語のソースプログラム500の抽象構文木の一部を省略して示す。図6において「...一部省略...」の表記はこのことを示し、実際のソースプログラムで記述される情報ではない。本例においては、ステップS303が図2のステップS202に対応する。
【0056】
次に、ステップS304において、変換前プログラム処理部120は、ステップS303で作成された抽象構文木から変数情報を抽出する。図7は、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報を含む変数情報群700の一例を示す図である。
【0057】
前述したように本実施形態では、構文解析の結果に出現する変数に関する情報のうち、変数の読み出しおよび書き出しに必要な情報(例えば、変数に格納されている値と変数の格納先とが少なくとも特定される情報)を記述しているノードに対応する部分を、変換前プログラムの抽象構文木および変換後プログラムの抽象構文木のそれぞれから抽出する場合を例示する。元のC言語のソースプログラム500の抽象構文木600において、変数の読み出しおよび書き出しに必要な情報を記述しているノードに対応する部分は、[DECL_REF_EXPR]601~603である。したがって、本実施形態では、これらが変数情報601~603である。図7に示す変数情報群700の1行目から3行目が変数情報601~603に対応する。なお、変数情報群700の4行目以降は、図6において「...一部省略...」とされている部分に記述されている変数情報に対応する。このように本実施形態では、構文解析の結果として得られる、(図6では省略している)宣言文に対応する部分と、コンパイラにおける変換のために必要な部分([UNEXPOSED_EXPR]等)等は、構文解析の結果に出現する変数に関する情報であっても、抽象構文木からの抽出対象としない場合を例示する。しかしながら、これらの情報の少なくとも1つを抽象構文木からの抽出対象(変数情報)に含めても良い。
【0058】
図7に示す変数情報群700には、変数情報として、元のC言語のソースプログラム500のファイル名701(「converted.c」)と、元のC言語のソースプログラム500において当該変数情報が使用される変数が記述されている実行文の行番号702(「12」、「13」等)および列番号703(「02」、「07」等)と、当該変数の変数名704(「x」、「atsumi」等)と、当該変数の型705(「int」、「float」)と、が含まれる場合を例示する。また、当該変数が構造体のメンバとして表される場合には、オフセット706(「offset=4」、「offset=28」等)がさらに変数情報として抽出され、変数情報群700に含まれる。オフセット706は、構造体の先頭からのオフセットであり、変数の値が記憶されているメモリのアドレスを特定するための情報である。
【0059】
これらの変数情報のうち、プログラムを実行する際に使用される変数情報は、変数名704、変数の型705、およびオフセット706である。一方、ファイル名701、行番号702、および列番号703は、C言語のソースプログラム500には表記されなくても良いものであり、プログラムを実行する際に使用される変数情報ではない。
本例においては、ステップS304が図2のステップS203に対応する。なお、抽象構文木から変数情報を抽出することは抽象構文木の記述内容に従って行えば良いので、ここでは、その詳細な説明を省略する。なお、抽象構文木から変数情報を抽出する際に、必要に応じてライブラリが使用される。
【0060】
例えば、トランスコンパイラ等を用いてFORTRANからC言語に言語変換を行うと、FORTRAN言語に比べ可読性が劣る場合がある。例えば、C言語では、FORTRAN言語におけるEQUIVALENCE文が、乗算の記号と同じ記号(「*」)を用いた記述に変換され、乗算と参照との区別がつきづらくなる。そこで、本例では、プログラマ自身が、C言語のソースプログラム400を構造体化する場合を例示する。
【0061】
この場合、ステップS305において、取得部110は、人手により構造体化されたC言語のソースプログラムを取得する。図8Aは、元のC言語のソースプログラム500から正しく構造体化されたC言語のソースプログラム810の一例を示す図である。図8Bは、元のC言語のソースプログラム500から誤って構造体化されたC言語のソースプログラム820の一例を示す図である。なお、正しく構造体化されたC言語のソースプログラム810のファイル名を「structed.c」とし、誤って構造体化されたC言語のソースプログラム820のファイル名を「error.c」とする。
【0062】
図8Bに示す誤って構造体化されたC言語のソースプログラム820においては、図8Aに示す正しく構造体化されたC言語のソースプログラム810に対し、変数haba(変数名が「haba」である変数)と、変数atsumi(変数名が「atsumi」である変数)と、の順番が入れ替えられている。なお、図8Bにおいて「←順番が異なる」の表記はこのことを示し、実際のソースプログラムで記述される情報ではない。また、図8Bに示す誤って構造体化されたC言語のソースプログラム820においては、変数hoge(変数名が「hoge」である変数)の型が整数型(「int」)ではなく実数型(「float」)になっている。なお、図8Bにおいて「←型が異なる」の表記はこのことを示し、実際のソースプログラムで記述される情報ではない。また、これらの誤りは、コンパイラにおいて機械語に変換される際にエラー(実行不能)とはならない誤りである。したがって、誤って構造体化されたC言語のソースプログラム820がエラーとはならずに実行される虞がある誤りである。
【0063】
本例においては、ステップS305が図2のステップS204に対応し、正しく構造体化されたC言語のソースプログラム810と、誤って構造体化されたC言語のソースプログラム820と、が変換後プログラムに対応する。なお、以下の説明では、正しく構造体化されたC言語のソースプログラムと、誤って構造体化されたC言語のソースプログラムと、を必要に応じて構造体化されたC言語のソースプログラムと略称する。
【0064】
次に、ステップS306において、変換後プログラム処理部130は、コンパイラを用いて、構造体化されたC言語のソースプログラム810、820の構文解析を行うことにより、変換後プログラムの抽象構文木を作成する。図9は、正しく構造体化されたC言語のソースプログラム810の抽象構文木900の一例を示す図である。ステップS303において前述したように、本例では、オープンソースとして提供されているClangを用いて抽象構文木が作成される場合を例示する。なお、図9では、表記の都合上、抽象構文木の一部を省略して示す。また、誤って構造体化されたC言語のソースプログラム820の抽象構文木も、正しく構造体化されたC言語のソースプログラム810の抽象構文木900と同様にして作成されるので、ここでは、誤って構造体化されたC言語のソースプログラム820の抽象構文木の図示を省略する。本例においては、ステップS306が図2のステップS205に対応する。
【0065】
次に、ステップS307において、変換後プログラム処理部130は、ステップS306で作成された抽象構文木900から変数情報を抽出する。図10は、正しく構造体化されたC言語のソースプログラム810の抽象構文木900から抽出された変数情報を含む変数情報群1000の一例を示す図である。また、図11は、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報を含む変数情報群1100の一例を示す図である。図10図11でも図7と同様に、変数情報として、構造体化されたC言語のソースプログラム810、820のファイル名1001、1101と、構造体化されたC言語のソースプログラム810、820において当該変数情報が使用される変数が記述されている実行文の行番号1002、1102および列番号1003、1103と、当該変数の変数名1004、1104と、当該変数の型1005、1105と、オフセット1006、1106と、が含まれる場合を例示する。
本例においては、ステップS307が図2のステップS206に対応する。
【0066】
次に、ステップS308において、比較部140は、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と、構造体化されたC言語のソースプログラム810、820の抽象構文木900から抽出された変数情報(変数情報群1000、1100に含まれる変数情報)と、を比較する。なお、前述したように、誤って構造体化されたC言語のソースプログラム820の抽象構文木の図示は省略する。
【0067】
図7図10、および図11では、ソースプログラムにおいて参照が行われる順番に上から各変数の変数情報を示す。したがって、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報を含む変数情報群700のn行目と、構造体化されたC言語のソースプログラム810、820の抽象構文木900から抽出された変数情報を含む変数情報群1000、1100のn行目と、を比較すれば良い(図7図10、および図11に示す例では、nは1以上9以下の整数)。本例では、変数情報のうち、プログラムを実行する際に使用されない変数情報を比較の対象としない場合を例示する。前述したようにファイル名701、1001、1101、行番号702、1002、1102、および列番号703、1003、1103は、プログラムを実行する際に使用される変数情報ではない。したがって、比較部140は、変数名704、変数の型705、およびオフセット706と、変数名1004、1104変数の型1005、1105およびオフセット1006、1106と、を比較する。
【0068】
比較部140は、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と、正しく構造体化されたC言語のソースプログラム810の抽象構文木900から抽出された変数情報(変数情報群1000に含まれる変数情報)と、は一致すると判定する。一方、比較部140は、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報(変数情報群1100に含まれる変数情報)と、には、図8Bを参照しながら説明したのと同様の以下の3つの相違点があると判定する。
【0069】
第1および第2の相違点は、変数atsumi、habaのオフセット706、1006、1106は、元のC言語のソースプログラム500の抽象構文木600では「4」、「8」であるのに対し、誤って構造体化されたC言語のソースプログラム820の抽象構文木ではそれぞれ「8」、「4」であるという点である。なお、図11において「←不一致(オフセット)」の表記はこれらのことを示し、実際に記述される情報ではない。
【0070】
第3の相違点は、変数hogeの型705、1105、1105は、元のC言語のソースプログラム500の抽象構文木600では「整数型(int)」であるのに対し、誤って構造体化されたC言語のソースプログラム820の抽象構文木では「実数型(float)であるという点である。なお、図11において「←不一致(型)」の表記はこのことを示し、実際に記述される情報ではない。
【0071】
本例においては、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報(変数情報群1100に含まれる変数情報)のうち、以上の第1~第3の相違点で示す情報(変数atsumi、habaのオフセットおよび変数hogeの型)が変換後相違変数情報に対応する。また、本例においては、ステップS308が図2のステップS207に対応する。
【0072】
以上のことから本例では、比較部140が、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と、正しく構造体化されたC言語のソースプログラム810の抽象構文木900から抽出された変数情報(変数情報群1000に含まれる変数情報)と、を比較した場合には、ステップS308でYESと判定され、ステップS309の処理が行われる。そして、ステップS309において、出力部150は、正しく構造体化されたC言語のソースプログラム810の抽象構文木900と、元のC言語のソースプログラム500の抽象構文木600と、が一致することを示す情報である変換前後相違なし情報を出力する。これにより、構造体化されたC言語のソースプログラムが完成するので、図3のフローチャートによる処理は終了する。
本例においては、ステップS309が図2のステップS208に対応する。
【0073】
一方、比較部140が、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報(変数情報群1100に含まれる変数情報)と、を比較した場合には、ステップS308でNOと判定され、ステップS310の処理が行われる。ステップS310において、出力部150は、変数情報の比較の結果に関する情報を含むレポートを作成する。前述したようにレポートには、例えば、比較結果情報が含まれる。比較結果情報は、変換後プログラムの変数情報のうち、変換前プログラムの変数情報と相違する情報の、当該相違に関する情報である。本例では、比較結果情報は、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報(変数情報群1100に含まれる変数情報)のうち、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(変数情報群700に含まれる変数情報)と相違する情報(変数hogeの型1105および変数atsumi、habaのオフセット1106)の、当該相違に関する情報である。本例では、相違に関する情報として、どの情報が相違するのかを特定するための情報と、当該相違の内容を特定するための情報と、が含まれる場合を例示する。
【0074】
図12は、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報と、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報と、の比較の結果に関する情報を含むレポート1200の一例を示す図である。図12に示すレポート1200では、誤って構造体化されたC言語のソースプログラム820において参照が行われる順番に、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された各変数の変数情報が並べられる。このようにして並べられた各変数の変数情報が示されている欄のうち、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報と相違する情報が示されている欄に、当該相違があることを示す情報(「不一致」)が比較結果情報として示される。また、同欄には、相違の内容を特定するための情報として、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報(「元:4」、「元:int」、「元:8」)と、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報(「現:8」、「現:float」、「現:4」)と、が示される。
本例においては、ステップS310が図2のステップS209に対応する。
【0075】
図3の説明に戻り、ステップS310の処理の後に、ステップS311の処理が行われる。ステップS311において、出力部150は、ステップS310で作成したレポート1200に基づいて、誤って構造体化されたC言語のソースプログラム820に、変換後相違変数情報についての比較結果情報を埋め込む。
【0076】
図13は、誤って構造体化されたC言語のソースプログラム820に、変換後相違変数情報についての比較結果情報が埋め込まれた情報1300の一例を示す図である。
ステップS308において第1~第3の相違点として説明したように、本例では、誤って構造体化されたC言語のソースプログラム820の抽象構文木から抽出された変数情報のうち、変数atsumi、habaのオフセットおよび変数hogeの型が変換後相違変数情報になる。そして、ステップS310において図12を参照しながら説明したように本例では、変換後相違変数情報(変数atsumi、habaのオフセットおよび変数hogeの型)についての比較結果情報には、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報との相違があることを示す情報(「不一致」)と、当該相違の内容を特定するための情報(「元:4」および「現:8」、「元:int」および「現:float」、「元:8」および「現:4」)と、が含まれる。
【0077】
そこで本例では、出力部150は、図13に示すように、図8Bに示す誤って構造体化されたC言語のソースプログラム820の実行文において変換後相違変数情報として抽出された変数atsumiのオフセットが使用される変数atsumiが記述されている位置に応じて定まる所定の位置に、当該変数atsumiのオフセットについての比較結果情報1301を埋め込む。具体的に、図8Bに示す誤って構造体化されたC言語のソースプログラム820において変換後相違変数情報として抽出された変数atsumiのオフセットが使用される変数atsumiが記述されている実行文821の次の行に、当該変数atsumiのオフセットについての比較結果情報1301(「atsumi」、「オフセット不一致」、「元:4」、および「現:8」)が埋め込まれる。
【0078】
また、出力部150は、図8Bに示す誤って構造体化されたC言語のソースプログラム820の実行文において変換後相違変数情報として抽出された変数hogeの型が使用される変数hogeが記述されている位置に応じて定まる所定の位置に、当該変数hogeの型についての比較結果情報1302を埋め込む。具体的に、図8Bに示す誤って構造体化されたC言語のソースプログラム820において変換後相違変数情報として抽出された変数hogeの型が使用される変数hogeが記述されている実行文821の次の行に、当該変数hogeの型についての比較結果情報1302(「hoge」、「型不一致」、「元:int」、および「現:float」)が埋め込まれる。
【0079】
また、出力部150は、図8Bに示す誤って構造体化されたC言語のソースプログラム820の実行文において変換後相違変数情報として抽出された変数habaのオフセットが使用される変数habaが記述されている位置に応じて定まる所定の位置に、当該変数habaのオフセットについての比較結果情報1303を埋め込む。具体的に、図8Bに示す誤って構造体化されたC言語のソースプログラム820において変換後相違変数情報として抽出された変数habaのオフセットが使用される変数habaが記述されている実行文822の次の行に、当該変数habaのオフセットについての比較結果情報1303(「hoge」、「型不一致」、「元:int」、および「現:float」)が埋め込まれる。
【0080】
以上のようにして図13に示すように、誤って構造体化されたC言語のソースプログラム820に比較結果情報が埋め込まれた情報1300が得られ、コンピュータディスプレイに表示される。以下の説明では、誤って構造体化されたC言語のソースプログラム820に比較結果情報が埋め込まれた情報を、必要に応じて修正ガイド付きの構造体化されたC言語のソースプログラムと称する。
本例においては、ステップS311が図2のステップS210に対応する。
【0081】
そして、ステップS312において、出力部150は、修正ガイド付きの構造体化されたC言語のソースプログラムの情報1300をコンピュータディスプレイに表示させる。
本例においては、ステップS312が図2のステップS211に対応する。
【0082】
プログラマは、修正ガイド付きの構造体化されたC言語のソースプログラム1300を参照することにより、変数atsumi、habaのオフセットおよび変数hogeの型に変換ミスがあることを把握することができる。プログラマは、このことを踏まえて元のC言語のソースプログラム500を人手により再変換して、構造体化されたC言語のソースプログラムを再作成する。そして、ステップS305において、取得部110は、このようにして再作成された、構造体化されたC言語のソースプログラムを取得する。そして、ステップS308において、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報と、構造体化されたC言語のソースプログラムの抽象構文木900から抽出された変数情報と、が一致すると判定される(ステップS308でYESと判定される)まで、ステップS305~S308、S310~S312の処理が繰り返し実行される。そして、ステップS308において、元のC言語のソースプログラム500の抽象構文木600から抽出された変数情報と、構造体化されたC言語のソースプログラムの抽象構文木900から抽出された変数情報と、が一致すると判定される(ステップS308でYESと判定される)と、ステップS309において、出力部150は、変換前後相違なし情報を出力する。これにより、構造体化されたC言語のソースプログラムが完成するので、図3のフローチャートによる処理は終了する。
【0083】
なお、(プログラム変換支援装置100の機能構成)の欄で説明したように、プログラミング言語の変換が人手により行われても良い。このようにする態様として、例えば、FORTRANのソースプログラム400を変換前プログラムとし、ステップS302の処理を行わずに、プログラマが、FORTRANのソースプログラム400をC言語のソースプログラムに人手により変換する態様が挙げられる。
【0084】
(まとめ)
以上のように本実施形態では、プログラム変換支援装置100は、元のC言語のソースプログラム500の構文解析を含む処理と、構造体化されたC言語のソースプログラム810、820の構文解析を含む処理と、を行い、元のC言語のソースプログラム500の構文解析の結果に基づく情報と、構造体化されたC言語のソースプログラム810、820の構文解析の結果に基づく情報と、を比較し、当該比較の結果に基づく情報である比較結果情報を出力する。したがって、人手によるプログラムの変換ミスの可能性があることを構造体化されたC言語のソースプログラム810、820を実行しなくても検出することができる。
【0085】
また、本実施形態では、プログラム変換支援装置100は、構造体化されたC言語のソースプログラム820の構文解析の結果に基づく情報のうち、元のC言語のソースプログラム500の構文解析の結果に基づく情報と相違する情報である変換後相違変数情報(変数atsumiのオフセット(=8)、変数hogeの型(=float)、変数habaのオフセット(=4))の、当該相違に関する情報を比較結果情報として出力する。したがって、元のC言語のソースプログラム500を人手により変換した際に、元のC言語のソースプログラム500との相違をプログラマに報知することができる。
【0086】
また、本実施形態では、プログラム変換支援装置100は、誤って構造体化されたC言語のソースプログラム820に、変換後相違変数情報に対する比較結果情報(『「atsumi」、「オフセット不一致」、「元:4」、「現:8」』、『「hoge」、「型不一致」、「元:int」、「現:float」』、および『「haba」、「オフセット不一致」、「元:8」、「現:4」』)を埋め込み、修正ガイド付きの構造体化されたC言語のソースプログラム1300をコンピュータディスプレイに表示させる。したがって、元のC言語のソースプログラム500を人手により変換した際に、元のC言語のソースプログラム500との相違をより分かりやすくプログラマに報知することができる。
【0087】
また、本実施形態では、構文解析の結果に基づく情報は、構文解析によって得られる変数情報(変数情報群700、1000、1100に含まれる変数情報)を含む。したがって、変換ミスが生じやすい変数情報の人手による変換ミスを、構造体化されたC言語のソースプログラム810、820を実行しなくても検出することができる。
【0088】
また、本実施形態では、第1のプログラミング言語の一例であるFORTRANを第2のプログラミング言語の一例であるC言語に言語変換することにより得られるC言語のソースプログラム500が、人手により変換される。したがって、プログラミング言語の変換が行った後のプログラムの人手による変換ミスの可能性があることを検出することができる。
【0089】
また、本実施形態では、プログラム変換支援装置100は、元のC言語のソースプログラム500の構文解析の結果に基づく情報と、構造体化されたC言語のソースプログラム820の構文解析の結果に基づく情報と、が相違するという比較結果が得られた場合、その後に新たに得られた構造体化されたC言語のソースプログラムの構文解析を含む処理を行い、のC言語のソースプログラム500の構文解析の結果に基づく情報と、新たに得られた構造体化されたC言語のソースプログラムの構文解析の結果に基づく情報と、を比較する。したがって、プログラマは、元のC言語のソースプログラム500との相違がなくなるまで、元のC言語のソースプログラム500の人手による変換を行うことができる。
【0090】
(その他の実施形態)
なお、以上説明した本発明の実施形態は、コンピュータがプログラムを実行することによって実現することができる。また、前記プログラムを記録したコンピュータ読み取り可能な記録媒体及び前記プログラム等のコンピュータプログラムプロダクトも本発明の実施形態として適用することができる。記録媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD-ROM、磁気テープ、不揮発性のメモリカード、ROM等を用いることができる。
また、以上説明した本発明の実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
【0091】
なお、以上の実施形態の開示は、例えば以下のようになる。
(開示1)
変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援装置であって、
前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理手段と、
前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理手段と、
前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較手段と、
前記比較手段による比較の結果に基づく情報である比較結果情報を出力する出力手段と、
を備える、プログラム変換支援装置。
(開示2)
前記出力手段は、
前記変換後プログラムの構文解析の結果に基づく情報のうち、前記変換前プログラムの構文解析の結果に基づく情報と相違する情報である変換後相違情報の、当該相違に関する情報を前記比較結果情報として出力する、開示1に記載のプログラム変換支援装置。
(開示3)
前記出力手段は、
前記変換後プログラムに前記比較結果情報を埋め込み、前記比較結果情報が埋め込まれた前記変換後プログラムのソースコードを示す情報を表示装置に表示させる、開示2に記載のプログラム変換支援装置。
(開示4)
前記構文解析の結果に基づく情報は、構文解析の結果に出現する変数に関する情報である変数情報を含む、開示1~3のいずれか1つに記載のプログラム変換支援装置。
(開示5)
前記変換前プログラムは、第1のプログラミング言語のプログラムを第2のプログラミング言語に変換することにより得られたプログラムである、開示1~4のいずれか1つに記載のプログラム変換支援装置。
(開示6)
前記変換後プログラム処理手段は、
前記比較手段により、前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、が相違するという比較結果が得られた場合、その後に新たに得られた前記変換後プログラムの構文解析を含む処理を行い、
前記比較手段は、
前記変換前プログラムの構文解析の結果に基づく情報と、前記新たに得られた前記変換後プログラムの構文解析の結果に基づく情報と、を比較する、開示1~5のいずれか1つに記載のプログラム変換支援装置。
(開示7)
変換対象のプログラムである変換前プログラムの少なくとも一部を、当該変換前プログラムと実行結果が変わらないように人手により変換して変換後プログラムとする際の当該変換を支援するための処理を行うプログラム変換支援方法であって、
前記変換前プログラムに対する処理として、前記変換前プログラムの構文解析を含む処理を行う変換前プログラム処理工程と、
前記変換後プログラムに対する処理として、前記変換後プログラムの構文解析を含む処理を行う変換後プログラム処理工程と、
前記変換前プログラムの構文解析の結果に基づく情報と、前記変換後プログラムの構文解析の結果に基づく情報と、を比較する比較工程と、
前記比較工程による比較の結果に基づく情報である比較結果情報を出力する出力工程と、
を備える、プログラム変換支援方法。
(開示8)
開示1~6のいずれか1つに記載のプログラム変換支援装置の各手段としてコンピュータを機能させるためのプログラム。
【符号の説明】
【0092】
100 プログラム変換支援装置
110 取得部
120 変換前プログラム処理部
130 変換後プログラム処理部
140 比較部
150 出力部
400 FORTRANのソースプログラム
500 元のC言語のソースプログラム
600 元のC言語のソースプログラムの抽象構文木
700 元のC言語のソースプログラムの抽象構文木から抽出された変数情報を含む変数情報群
701 元のC言語のソースプログラムのファイル名
702 行番号
703 列番号
704 変数名
705 変数の型
706 オフセット
810 元のC言語のソースプログラムから正しく構造体化されたC言語のソースプログラム
820 元のC言語のソースプログラムから誤って構造体化されたC言語のソースプログラム
821~822 誤って構造体化されたC言語のソースプログラムにおいて変換後相違変数情報が使用される実行文
900 正しく構造体化されたC言語のソースプログラムの抽象構文木
1000 正しく構造体化されたC言語のソースプログラムの抽象構文木から抽出された変数情報を含む変数情報群
1001 正しく構造体化されたC言語のソースプログラムのファイル名
1002 行番号
1003 列番号
1004 変数名
1005 変数の型
1006 オフセット
1100 誤って構造体化されたC言語のソースプログラムの抽象構文木から抽出された変数情報を含む変数情報群
1101 誤って構造体化されたC言語のソースプログラムのファイル名
1102 行番号
1103 列番号
1104 変数名
1105 変数の型
1106 オフセット
1200 レポート
1300 修正ガイド付きの構造体化されたC言語のソースプログラム
1301~1303 比較結果情報
図1
図2
図3
図4
図5
図6
図7
図8A
図8B
図9
図10
図11
図12
図13