特許第6454706号(P6454706)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

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

▶ アビニシオ テクノロジー エルエルシーの特許一覧

<>
  • 特許6454706-ソースコード変換 図000002
  • 特許6454706-ソースコード変換 図000003
  • 特許6454706-ソースコード変換 図000004
  • 特許6454706-ソースコード変換 図000005
  • 特許6454706-ソースコード変換 図000006
  • 特許6454706-ソースコード変換 図000007
  • 特許6454706-ソースコード変換 図000008
  • 特許6454706-ソースコード変換 図000009
  • 特許6454706-ソースコード変換 図000010
  • 特許6454706-ソースコード変換 図000011
  • 特許6454706-ソースコード変換 図000012
  • 特許6454706-ソースコード変換 図000013
  • 特許6454706-ソースコード変換 図000014
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6454706
(24)【登録日】2018年12月21日
(45)【発行日】2019年1月16日
(54)【発明の名称】ソースコード変換
(51)【国際特許分類】
   G06F 8/76 20180101AFI20190107BHJP
   G06F 8/51 20180101ALI20190107BHJP
【FI】
   G06F8/76
   G06F8/51
【請求項の数】21
【全頁数】27
(21)【出願番号】特願2016-533594(P2016-533594)
(86)(22)【出願日】2014年12月8日
(65)【公表番号】特表2017-502385(P2017-502385A)
(43)【公表日】2017年1月19日
(86)【国際出願番号】US2014069027
(87)【国際公開番号】WO2015085291
(87)【国際公開日】20150611
【審査請求日】2017年10月24日
(31)【優先権主張番号】61/912,594
(32)【優先日】2013年12月6日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】509123208
【氏名又は名称】アビニシオ テクノロジー エルエルシー
(74)【代理人】
【識別番号】100107984
【弁理士】
【氏名又は名称】廣田 雅紀
(74)【代理人】
【識別番号】100102255
【弁理士】
【氏名又は名称】小澤 誠次
(74)【代理人】
【識別番号】100096482
【弁理士】
【氏名又は名称】東海 裕作
(74)【代理人】
【識別番号】100188352
【弁理士】
【氏名又は名称】松田 一弘
(74)【代理人】
【識別番号】100131093
【弁理士】
【氏名又は名称】堀内 真
(74)【代理人】
【識別番号】100150902
【弁理士】
【氏名又は名称】山内 正子
(74)【代理人】
【識別番号】100141391
【弁理士】
【氏名又は名称】園元 修一
(74)【代理人】
【識別番号】100198074
【弁理士】
【氏名又は名称】山村 昭裕
(74)【代理人】
【識別番号】100145920
【弁理士】
【氏名又は名称】森川 聡
(72)【発明者】
【氏名】ベイト−アハロン ジョナサン
【審査官】 坂庭 剛史
(56)【参考文献】
【文献】 特開平11−327884(JP,A)
【文献】 特開2003−067186(JP,A)
【文献】 梶尾義規、魚田勝臣、永田守男,一括処理のレガシープログラムからオブジェクト指向プログラムへの変換法,電子情報通信学会技術研究報告,日本,社団法人電子情報通信学会,2002年12月12日,Vol.102,No.503,p.13−18(KBSE2002-15),ISSN 0913-5685
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/76
G06F 8/51
(57)【特許請求の範囲】
【請求項1】
ソフトウェア仕様変換の方法であって、
第1のプログラミング言語で指定された第1のソフトウェア仕様を受け取るステップと、
第2のプログラミング言語で指定された第2のソフトウェア仕様を受け取るステップと、
前記第1及び第2のプログラミング言語とは異なる第3のプログラミング言語で指定された第3のソフトウェア仕様を受け取るステップであって、前記第3のソフトウェア仕様が前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義する、ステップと、
前記第1のソフトウェア仕様の表現を、前記第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語で形成するステップと、
前記第2のソフトウェア仕様の表現を前記第4のプログラミング言語で形成するステップと、
前記第3のソフトウェア仕様を分析して前記1又は2以上のデータ関係を識別するステップと、
前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との結合された表現を前記第4のプログラミング言語で形成するステップであって、前記識別された1又は2以上のデータ関係に従って、前記第4のプログラミング言語による前記第1のソフトウェア仕様の前記表現と、前記第4のプログラミング言語による前記第2のソフトウェア仕様の前記表現との間の接続を、前記第4のプログラミング言語で形成することを含むステップと、を含む方法。
【請求項2】
第1のプログラミング言語が手続き型プログラミング言語である、請求項1に記載の方法。
【請求項3】
第4のプログラミング言語が、ソフトウェア仕様の異なる部分間の並列性を可能にする、請求項2に記載の方法。
【請求項4】
第4のプログラミング言語が複数のタイプの並列性を可能にし、前記複数のタイプの並列性が、
ソフトウェア仕様のある部分の複数のインスタンスが入力データストリームの異なる複数の部分に作用するのを可能にする、第1のタイプの並列性と、
ソフトウェア仕様の異なる複数の部分が前記入力データストリームの異なる複数の部分に対して同時に実行されるのを可能にする、第2のタイプの並列性とを含む、請求項3に記載の方法。
【請求項5】
第2のプログラミング言語が手続き型プログラミング言語である、請求項2に記載の方法。
【請求項6】
第2のプログラミング言語が第1のプログラミング言語と同じである、請求項2に記載の方法。
【請求項7】
第1のソフトウェア仕様と第2のソフトウェア仕様との間の1又は2以上のデータ関係が、前記第1のソフトウェア仕様が第1のデータセットからデータを受け取り、前記第2のソフトウェア仕様が前記第1のデータセットにデータを提供することに対応する少なくとも1つのデータ関係を含む、請求項1に記載の方法。
【請求項8】
第4のプログラミング言語がデータフローグラフベースのプログラミング言語である、請求項1に記載の方法。
【請求項9】
第4のプログラミング言語による接続が、データのフローを表す有向リンクに対応する、請求項8に記載の方法。
【請求項10】
第1のソフトウェア仕様が、1又は2以上のデータセットと対話するように構成され、各データセットが、前記第1のソフトウェア仕様において複数のデータセットタイプのうちの関連するデータセットタイプを有し、第2のソフトウェア仕様が、1又は2以上のデータセットと対話するように構成され、各データセットが、前記第2のソフトウェア仕様において前記複数のデータセットタイプのうちの関連するタイプを有し、方法がさらに、
前記第1のソフトウェア仕様を処理するステップを含み、前記処理するステップが、
前記第1のソフトウェア仕様の前記1又は2以上のデータセットを識別し、前記識別された1又は2以上のデータセットのそれぞれにつき、前記第1のソフトウェア仕様における前記データセットの前記関連するタイプを決定するステップと、
前記第1のソフトウェア仕様の表現を第4のプログラミング言語で形成するステップであって、前記識別された1又は2以上のデータセットのそれぞれにつき、前記データセットの仕様を前記第4のプログラミング言語で形成するステップを含み、前記第4のプログラミング言語による前記データセットの前記仕様が、第1のプログラミング言語による前記データセットの前記関連するタイプに対応するタイプを有する、ステップとを含み、
前記第4のプログラミング言語による前記1又は2以上のデータセットの前記仕様の少なくとも1つが、入力データセットタイプ又は出力データセットタイプを有し、前記方法がさらに、
前記第2のソフトウェア仕様を処理するステップを含み、前記処理するステップが、
前記第2のソフトウェア仕様の前記1又は2以上のデータセットを識別し、前記識別された1又は2以上のデータセットのそれぞれにつき、前記第2のソフトウェア仕様における前記データセットの前記関連するタイプを決定するステップと、
前記第2のソフトウェア仕様の表現を前記第4のプログラミング言語で形成するステップであって、前記識別された1又は2以上のデータセットのそれぞれにつき、前記データセットの仕様を前記第4のプログラミング言語で形成するステップを含み、前記第4のプログラミング言語による前記データセットの前記仕様が、前記第1のプログラミング言語による前記データセットの前記関連するタイプに対応するタイプを有する、ステップとを含み、
前記第4のプログラミング言語による前記1又は2以上のデータセットの前記仕様の少なくとも1つが、入力機能又は出力機能を可能にする、請求項1に記載の方法。
【請求項11】
結合された表現を形成するステップが、
入力機能を可能にする第4のプログラミング言語による第2のソフトウェア仕様の1又は2以上のデータセットの仕様と、前記第4のプログラミング言語による前記第2のソフトウェア仕様の表現との間の接続を、前記第4のプログラミング言語による第1のソフトウェア仕様の表現と、前記第4のプログラミング言語による前記第2のソフトウェア仕様の前記表現との間の接続で置き換えるために、1又は2以上の接続を形成するステップと、
入力機能を可能にする前記第4のプログラミング言語による前記第1のソフトウェア仕様の1又は2以上のデータセットの仕様と、前記第4のプログラミング言語による前記第1のソフトウェア仕様の前記表現との間の接続を、前記第4のプログラミング言語による前記第2のソフトウェア仕様の前記表現と、前記第4のプログラミング言語による前記第1のソフトウェア仕様の前記表現との間の接続で置き換えるために、1又は2以上の接続を形成するステップと、のうちの少なくとも一方を含む、請求項10に記載の方法。
【請求項12】
第4のプログラミング言語による第1のソフトウェア仕様の表現中で出力機能を可能にする、前記第4のプログラミング言語による前記第1のソフトウェア仕様の1若しくは2以上のデータセットを保存するステップ、又は、
前記第4のプログラミング言語による第2のソフトウェア仕様の表現中で出力機能を可能にする、前記第4のプログラミング言語による前記第2のソフトウェア仕様の1若しくは2以上のデータセットを保存するステップをさらに含む、請求項11に記載の方法。
【請求項13】
第1のソフトウェア仕様が1又は2以上のデータ変形操作を含み、前記第1のソフトウェア仕様を分析するステップが、前記1又は2以上のデータ変形操作のうちの少なくともいくつかを識別して、前記識別されたデータ変形操作を、第4のプログラミング言語の対応するデータ変形タイプに分類するステップを含み、
前記第1のソフトウェア仕様の表現を前記第4のプログラミング言語で形成するステップが、前記識別されたデータ変形操作のそれぞれにつき、前記データ変形操作の仕様を前記第4のプログラミング言語で形成するステップを含み、前記第4のプログラミング言語による前記データ変形操作の前記仕様が、第1のプログラミング言語による前記識別されたデータ変形操作の前記データ変形タイプに対応するデータ変形操作を可能にする、請求項10に記載の方法。
【請求項14】
第4のプログラミング言語による1又は2以上のデータセットの仕様の少なくとも1つが、読取専用ランダムアクセスデータセットタイプを有する、請求項10に記載の方法。
【請求項15】
第1のソフトウェア仕様におけるデータセットの関連するタイプを決定するステップが、データセット定義と前記データセットにアクセスするコマンドとのパラメータを分析するステップを含む、請求項10に記載の方法。
【請求項16】
パラメータが、データセットに関連するファイル編成、前記データセットに関連するアクセスモード、前記データセットを開くのに使用されるモード、及び入出力操作、のうちの1又は2以上を含む、請求項15に記載の方法。
【請求項17】
第1のソフトウェア仕様と第2のソフトウェア仕様との結合された表現をストレージ媒体に記憶するステップをさらに含む、請求項1に記載の方法。
【請求項18】
第1のソフトウェア仕様が、1又は2以上のデータセットと対話する1又は2以上のデータ処理操作を定義し、第2のソフトウェア仕様が、1又は2以上のデータセットと対話する1又は2以上のデータ処理操作を定義する、請求項1に記載の方法。
【請求項19】
第3のソフトウェア仕様が、第1のソフトウェア仕様の1又は2以上のデータセットと、第2のソフトウェア仕様の1又は2以上のデータセットとの間の、1又は2以上のデータ関係を定義する、請求項18に記載の方法。
【請求項20】
ソフトウェア仕様変換のための、コンピュータ可読媒体に非一時的な形で記憶されたソフトウェアであって、
第1のプログラミング言語で指定された第1のソフトウェア仕様を受け取ること、
第2のプログラミング言語で指定された第2のソフトウェア仕様を受け取ること、
前記第1及び第2のプログラミング言語とは異なる第3のプログラミング言語で指定された第3のソフトウェア仕様を受け取ることであって、前記第3のソフトウェア仕様が、前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義する、受け取ること、
前記第1のソフトウェア仕様の表現を、前記第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語で形成すること、
前記第2のソフトウェア仕様の表現を前記第4のプログラミング言語で形成すること、
前記第3のソフトウェア仕様を分析して前記1又は2以上のデータ関係を識別すること、並びに、
前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との結合された表現を前記第4のプログラミング言語で形成することであって、前記識別された1又は2以上のデータ関係に従って、前記第4のプログラミング言語による前記第1のソフトウェア仕様の前記表現と、前記第4のプログラミング言語による前記第2のソフトウェア仕様の前記表現との間の接続を、前記第4のプログラミング言語で形成することを含む、形成すること、をコンピューティングシステムに行わせるための命令を含むソフトウェア。
【請求項21】
ソフトウェア仕様変換のためのコンピューティングシステムであって、
ソフトウェア仕様を受け取るように構成された入力デバイス又はポートを備え、前記ソフトウェア仕様が、
第1のプログラミング言語で指定された第1のソフトウェア仕様と、
第2のプログラミング言語で指定された第2のソフトウェア仕様と、
前記第1及び第2のプログラミング言語とは異なる第3のプログラミング言語で指定された第3のソフトウェア仕様とを含み、前記第3のソフトウェア仕様が、前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義し、前記コンピューティングシステムが、
前記受け取られたソフトウェア仕様を処理するように構成された少なくとも1つのプロセッサを備え、前記処理することが、
前記第1のソフトウェア仕様の表現を、前記第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語で形成すること、
前記第2のソフトウェア仕様の表現を前記第4のプログラミング言語で形成すること、
前記第3のソフトウェア仕様を分析して前記1又は2以上のデータ関係を識別すること、並びに、
前記第1のソフトウェア仕様と前記第2のソフトウェア仕様との結合された表現を前記第4のプログラミング言語で形成することであって、前記識別された1又は2以上のデータ関係に従って、前記第4のプログラミング言語による前記第1のソフトウェア仕様の前記表現と、前記第4のプログラミング言語による前記第2のソフトウェア仕様の前記表現との間の接続を、前記第4のプログラミング言語で形成することを含む、形成すること、を含む、コンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
本出願は、2013年12月6日に出願された米国特許出願第61/912,594号明細書に対する優先権を主張するものである。
【0002】
本記述は、ソースコード変換に関し、詳細には、1又は2以上の元のソフトウェアプログラミング言語で指定されたソースコードを、1又は2以上の他の異なるソフトウェアプログラミング言語に変換することに関する。
【背景技術】
【0003】
ソフトウェア開発の分野では、ソフトウェア技術者は、いくつかの異なるプログラミング言語のうちの1又は2以上でソフトウェアを開発することを選ぶことができる。本記述の執筆時点で、開発者によって従来使用されている現代のプログラミング言語のいくつかの例は、Java、C#、及びC++である。一般に、各プログラミング言語にはその利点と欠点があり、所与のアプリケーションのための適切なプログラミング言語を選ぶときにこれらの利点と欠点を考慮に入れることは、ソフトウェア技術者の仕事である。
【0004】
長年にわたり、プログラミング言語の最新技術は進歩してきており、それにより、いくつかの初期のプログラミング言語は、より使用されなくなり、もはやサポートされなくなり、及び/又は時代遅れになった。このような初期のプログラミング言語のいくつかの例は、Basic及びFortranである。それでもなお、「レガシー」コードとしばしば呼ばれるこれらの初期のプログラミング言語で書かれたソースコードは、その十分な性能により、何年も生産され続けることが一般的にある。しかし、このようなレガシーコードが十分に機能しなくなり、コードへの変更が必要になったとき、レガシーコードを更新するための必要なスキルを有するソフトウェア技術者を見つけるのが困難である可能性がある。
【0005】
この理由で、ソース間(source-to-source)コンパイラが開発された。ソース間コンパイラは、第1のプログラミング言語で指定された第1のソフトウェア仕様を入力として受け取り、第2の異なるプログラミング言語で指定された第2のソフトウェア仕様を出力として生成する。このようなソース間コンパイラを使用して、レガシーコードは現代のプログラミング言語に変換され、これらの現代のプログラミング言語は、現代のプログラミング言語の使用に熟練したソフトウェア技術者によってより容易に編集される。
【発明の概要】
【発明が解決しようとする課題】
【0006】
解決される技術的問題は、手続き型言語によるソースコードを含むソフトウェア仕様と、手続き型プログラミング構成体に制限される言語ではなく異なるモダリティを使用して動作する言語によるソースコードを含むソフトウェア仕様と、の間で変換することに関係する。例えば、言語は、異なる手続き間で明示的に行われる制御のみによって実行が駆動されるのではなく、データが単独で又は明示的な制御フローとの組合せで異なるプログラミングエンティティ間を流れて実行を駆動することを伴うモダリティで動作する場合がある。このような根本的な違いを有する言語間でソースコードを変換することは、異なるスタイルの言語間での単なる文字変換以上のものを必要とする。複数の言語によるソースコードを伴うシステムの場合、解決される別の技術的問題は、これらの複数の言語の特徴を異なる言語に組み込んだ、新しいシステムのためのソースコードを提供することに関係する。
【課題を解決するための手段】
【0007】
一態様では、一般に、ソフトウェア仕様変換の方法は:第1のプログラミング言語(例えばCOBOL)で指定された第1のソフトウェア仕様を受け取るステップと;第2のプログラミング言語(例えばCOBOL)で指定された第2のソフトウェア仕様を受け取るステップと;第3のプログラミング言語(いくつかの実施形態では、第3のプログラミング言語は、第1及び第2のプログラミング言語とは異なり、例えばJCLである)で指定された第3のソフトウェア仕様を受け取るステップであって、第3のソフトウェア仕様が第1のソフトウェア仕様と第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義する、ステップと;第1のソフトウェア仕様の表現を、第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語(例えばデータフローグラフ)で形成するステップと;第2のソフトウェア仕様の表現を第4のプログラミング言語で形成するステップと;第3のソフトウェア仕様を分析して1又は2以上のデータ関係を識別するステップと;第1のソフトウェア仕様と第2のソフトウェア仕様との結合された表現を第4のプログラミング言語で形成するステップであって、識別された1又は2以上のデータ関係に従って、第4のプログラミング言語による第1のソフトウェア仕様の表現と、第4のプログラミング言語による第2のソフトウェア仕様の表現との間の接続を、第4のプログラミング言語で形成することを含むステップと、を含む。
【0008】
態様は、以下の特徴のうちの1又は2以上を含むことができる。
【0009】
第1のプログラミング言語は、手続き型プログラミング言語である。
【0010】
第4のプログラミング言語は、ソフトウェア仕様の異なる部分間の並列性を可能にする。
【0011】
第4のプログラミング言語は、複数のタイプの並列性を可能にする。これらの複数のタイプの並列性は:ソフトウェア仕様のある部分の複数のインスタンスが入力データストリームの異なる複数の部分に作用するのを可能にする、第1のタイプの並列性と;ソフトウェア仕様の異なる複数の部分が入力データストリームの異なる複数の部分に対して同時に実行されるのを可能にする、第2のタイプの並列性と、を含む。
【0012】
第2のプログラミング言語は、手続き型プログラミング言語である。
【0013】
第2のプログラミング言語は、第1のプログラミング言語と同じである。
【0014】
第1のソフトウェア仕様と第2のソフトウェア仕様との間の1又は2以上のデータ関係は、第1のソフトウェア仕様が第1のデータセットからデータを受け取り、第2のソフトウェア仕様が第1のデータセットにデータを提供することに対応する、少なくとも1つのデータ関係を含む。
【0015】
第4のプログラミング言語は、データフローグラフベースのプログラミング言語である。
【0016】
第4のプログラミング言語による接続は、データのフローを表す有向リンクに対応する。
【0017】
第1のソフトウェア仕様は、1又は2以上のデータセットと対話するように構成され、各データセットは、第1のソフトウェア仕様において複数のデータセットタイプのうちの関連するデータセットタイプを有する。第2のソフトウェア仕様は、1又は2以上のデータセットと対話するように構成され、各データセットは、第2のソフトウェア仕様において複数のデータセットタイプのうちの関連するタイプを有する。この方法はさらに、第1のソフトウェア仕様を処理するステップを含み、処理するステップは:第1のソフトウェア仕様の1又は2以上のデータセットを識別し、識別された1又は2以上のデータセットのそれぞれにつき、第1のソフトウェア仕様におけるデータセットの関連するタイプを決定するステップと;第1のソフトウェア仕様の表現を第4のプログラミング言語で形成するステップであって、識別された1又は2以上のデータセットのそれぞれにつき、データセットの仕様を第4のプログラミング言語で形成することを含み、第4のプログラミング言語によるデータセットの仕様が、第1のプログラミング言語によるデータセットの関連するタイプに対応するタイプを有する、ステップとを含み、第4のプログラミング言語による1又は2以上のデータセットの仕様の少なくとも1つは、入力データセットタイプ又は出力データセットタイプを有する。この方法はさらに、第2のソフトウェア仕様を処理するステップを含み、処理するステップは:第2のソフトウェア仕様の1又は2以上のデータセットを識別し、識別された1又は2以上のデータセットのそれぞれにつき、第2のソフトウェア仕様におけるデータセットの関連するタイプを決定するステップと;第2のソフトウェア仕様の表現を第4のプログラミング言語で形成するステップであって、識別された1又は2以上のデータセットのそれぞれにつき、データセットの仕様を第4のプログラミング言語で形成することを含み、第4のプログラミング言語によるデータセットの仕様が、第1のプログラミング言語によるデータセットの関連するタイプに対応するタイプを有する、ステップとを含み、第4のプログラミング言語による1又は2以上のデータセットの仕様の少なくとも1つは、入力機能又は出力機能を可能にする。
【0018】
結合された表現を形成するステップは:入力機能を可能にする第4のプログラミング言語による第2のソフトウェア仕様の1又は2以上のデータセットの仕様と、第4のプログラミング言語による第2のソフトウェア仕様の表現との間の接続を、第4のプログラミング言語による第1のソフトウェア仕様の表現と、第4のプログラミング言語による第2のソフトウェア仕様の表現との間の接続で置き換えるために、1又は2以上の接続を形成するステップと;入力機能を可能にする第4のプログラミング言語による第1のソフトウェア仕様の1又は2以上のデータセットの仕様と、第4のプログラミング言語による第1のソフトウェア仕様の表現との間の接続を、第4のプログラミング言語による第2のソフトウェア仕様の表現と、第4のプログラミング言語による第1のソフトウェア仕様の表現との間の接続で置き換えるために、1又は2以上の接続を形成するステップと、のうちの少なくとも一方を含む。
【0019】
この方法はさらに:第4のプログラミング言語による第1のソフトウェア仕様の表現中で出力機能を可能にする、第4のプログラミング言語による第1のソフトウェア仕様の1若しくは2以上のデータセットを保存するステップ;又は、第4のプログラミング言語による第2のソフトウェア仕様の表現中で出力機能を可能にする、第4のプログラミング言語による第2のソフトウェア仕様の1若しくは2以上のデータセットを保存するステップを含む。
【0020】
第1のソフトウェア仕様は1又は2以上のデータ変形操作を含み、第1のソフトウェア仕様を分析するステップは、1又は2以上のデータ変形操作のうちの少なくともいくつかを識別して、識別されたデータ変形操作を、第4のプログラミング言語の対応するデータ変形タイプに分類するステップを含む。第1のソフトウェア仕様の表現を第4のプログラミング言語で形成するステップは、識別されたデータ変形操作のそれぞれにつき、データ変形操作の仕様を第4のプログラミング言語で形成するステップを含み、第4のプログラミング言語によるデータ変形操作の仕様は、第1のプログラミング言語による識別されたデータ変形操作のデータ変形タイプに対応するデータ変形操作を可能にする。
【0021】
第4のプログラミング言語による1又は2以上のデータセットの仕様の少なくとも1つは、読取専用ランダムアクセスデータセットタイプを有する。
【0022】
第1のソフトウェア仕様におけるデータセットの関連するタイプを決定するステップは、データセット定義とデータセットにアクセスするコマンドとのパラメータを分析するステップを含む。
【0023】
パラメータは、データセットに関連するファイル編成、データセットに関連するアクセスモード、データセットを開くのに使用されるモード、及び入出力操作、のうちの1又は2以上を含む。
【0024】
この方法はさらに、第1のソフトウェア仕様と第2のソフトウェア仕様との結合された表現をストレージ媒体に記憶するステップを含む。
【0025】
第1のソフトウェア仕様は、1又は2以上のデータセットと対話する1又は2以上のデータ処理操作を定義し、第2のソフトウェア仕様は、1又は2以上のデータセットと対話する1又は2以上のデータ処理操作を定義する。
【0026】
第3のソフトウェア仕様は、第1のソフトウェア仕様の1又は2以上のデータセットと、第2のソフトウェアの1又は2以上のデータセットとの間の、1又は2以上のデータ関係を定義する。
【0027】
別の態様では、一般に、ソフトウェア仕様変換のために、ソフトウェアがコンピュータ可読媒体に非一時的な形で記憶される。このソフトウェアは:第1のプログラミング言語で指定された第1のソフトウェア仕様を受け取ること;第2のプログラミング言語で指定された第2のソフトウェア仕様を受け取ること;第1及び第2のプログラミング言語とは異なる第3のプログラミング言語で指定された第3のソフトウェア仕様を受け取ることであって、第3のソフトウェア仕様が、第1のソフトウェア仕様と第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義する、受け取ること;第1のソフトウェア仕様の表現を、第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語で形成すること;第2のソフトウェア仕様の表現を第4のプログラミング言語で形成すること;第3のソフトウェア仕様を分析して1又は2以上のデータ関係を識別すること;並びに、第1のソフトウェア仕様と第2のソフトウェア仕様との結合された表現を第4のプログラミング言語で形成することであって、識別された1又は2以上のデータ関係に従って、第4のプログラミング言語による第1のソフトウェア仕様の表現と、第4のプログラミング言語による第2のソフトウェア仕様の表現との間の接続を、第4のプログラミング言語で形成することを含む、形成すること、をコンピューティングシステムに行わせるための命令を含む。
【0028】
別の態様では、一般に、ソフトウェア仕様変換のためのコンピューティングシステムは、ソフトウェア仕様を受け取るように構成された入力デバイス又はポートを備え、ソフトウェア仕様は:第1のプログラミング言語で指定された第1のソフトウェア仕様と;第2のプログラミング言語で指定された第2のソフトウェア仕様と;第1及び第2のプログラミング言語とは異なる第3のプログラミング言語で指定された第3のソフトウェア仕様とを含み、第3のソフトウェア仕様は、第1のソフトウェア仕様と第2のソフトウェア仕様との間の1又は2以上のデータ関係を定義する。コンピューティングシステムはまた、受け取られたソフトウェア仕様を処理するように構成された少なくとも1つのプロセッサを備え、処理することは:第1のソフトウェア仕様の表現を、第1、第2、及び第3のプログラミング言語とは異なる第4のプログラミング言語で形成すること;第2のソフトウェア仕様の表現を第4のプログラミング言語で形成すること;第3のソフトウェア仕様を分析して1又は2以上のデータ関係を識別すること;並びに、第1のソフトウェア仕様と第2のソフトウェア仕様との結合された表現を第4のプログラミング言語で形成することであって、識別された1又は2以上のデータ関係に従って、第4のプログラミング言語による第1のソフトウェア仕様の表現と、第4のプログラミング言語による第2のソフトウェア仕様の表現との間の接続を、第4のプログラミング言語で形成することを含む、形成すること、を含む。
【発明の効果】
【0029】
態様は、以下の利点のうちの1又は2以上を含むことができる。
【0030】
異なるプログラム仕様間のいくつかのデータ関係を識別することに基づいてプログラムを変換することで、データ処理システム中などの様々なコンテキストでより効率的に実行され得る結合された仕様の形成が可能になる。例えば、1又は2以上の手続き型プログラミング言語で書かれたプログラムをデータフローグラフ表現に変換することによって、コンポーネント並列性、データ並列性、及びパイプライン並列性が可能になる。コンポーネント並列性については、データフローグラフは、コンポーネント間のデータのフロー(又は「データフロー」)を表す有向リンクによって相互接続された複数のコンポーネントを含み、データフローグラフの異なる複数の部分におけるコンポーネントが、別々のデータフロー上で同時に稼働することができる。データ並列性については、データフローグラフは、セグメント(又は「パーティション」)に分割されたデータを処理し、コンポーネントの複数のインスタンスが、各セグメント上で同時に動作することができる。パイプライン並列性については、データフローリンクによって接続されたデータフローグラフ中のコンポーネントは、上流コンポーネントがそのデータフロー上にデータを追加し下流コンポーネントがそのデータフローからデータを受け取るのに伴って、同時に稼働することができる。
【0031】
手続き型プログラミング言語で書かれたプログラム(又は、プログラムの少なくともいくつかの部分の仕様)を、プログラムのデータフローグラフ表現に変換することで、データフローグラフ表現の異なるコンポーネントを異なるサーバ上で実行するのを可能にすることができる。
【0032】
手続き型プログラミング言語で書かれたプログラムによって必要とされる(その非並列性質のせいで)場合のある中間データセットを、データフローグラフから除去することができる。これは、プログラムのデータフローグラフ表現に変換し、中間データセットをデータのフローで置き換えることによって行うことができる。いくつかの例では、中間データセットは、データフローグラフの中を流れるデータのパスから外に出され、保存されて、それにより、データセットを使用する他のどのようなプログラムも、データセットに含まれるデータに引き続きアクセスできることが保証される。いくつかの例では、中間データセットを除去することで、ストレージ及びI−Oトラフィックの要件を低減することができる。
【0033】
1又は2以上の手続き型プログラミング言語で書かれたプログラムをデータフローグラフ表現に変換することで、プログラムを通したデータ系統の視覚化が可能になる。
【0034】
データフロープログラミング言語は、データベースタイプにとらわれない。したがって、手続き型プログラミング言語で書かれたプログラムをプログラムのデータフローグラフ表現に変換することで、手続き型プログラミング言語で書かれたプログラムによって元々サポートされていなかったタイプのデータベースを用いてプログラムを使用することを可能にすることができる。すなわち、手法は、コード(例えばJCL/COBOLコード)中の入力及び出力を、多くの異なるタイプのソース及びシンク(例えば、キュー、データベーステーブル、ファイルなど)に接続され得るフローに抽象化することができる。
【0035】
手続き型プログラミング言語で書かれたプログラムをプログラムのデータフローグラフ表現に変換することで、再使用可能なユーザ定義データタイプの使用を可能にすることができる。これは、データタイプ(すなわちメタデータ)とストレージ割振りとの間を明確に区別せず、その代りにこの2つをデータ部において結合する、COBOLなどのいくつかの手続き型プログラミング言語と比較したときに有利である。本明細書に記載の手法は、COBOLソースコードからメタデータを抽出し、再使用可能なデータタイプ(例えばDMLデータタイプ)及びタイプ定義ファイルを作成する。再使用可能なデータタイプ及びタイプ定義ファイルは、手続き型変形の最初におけるストレージ割振りに使用することができ、また、ポート及びルックアップファイルレコード定義に使用することができる。いくつかの例では、抽出されたデータタイプ(例えば、COBOLからのデータタイプメタデータ)を、抽出されたデータセット(例えば、JCLからのデータセットメタデータ)と共に使用して、同じデータセットにアクセスする複数のプログラムからのデータの部分的な記述(すなわち部分的なメタデータ)を、データの包括的な記述に統合することもできる。
【0036】
1又は2以上の手続き型プログラミング言語で書かれたプログラムをデータフローグラフ表現に変換することで、データフローグラフベースのグラフィカル開発環境を通した単純化されたプログラム編集が可能になる。
【0037】
本発明の他の特徴及び利点は、後続の記述及び特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【0038】
図1】ソフトウェア変換モジュールを含むシステムのブロック図である。
図2】ソフトウェア仕様の概略的な例を示す図である。
図3】最上レベルのソフトウェア変換モジュールのブロック図である。
図4】ソフトウェア変換モジュールのブロック図である。
図5】データセット機能と、それらに関連するデータセット編成タイプ、アクセスモード、及びオープンモードの組合せとのテーブルを示す図である。
図6】第1の手続き型変形を示す図である。
図7】第2の手続き型変形を示す図である。
図8】第3の手続き型変形を示す図である。
図9】プログラムのデータフローグラフ表現を示す図である。
図10】複合データフローグラフの作成を示す図である。
図11図3の最上レベルのソフトウェア変換モジュールの動作例を示す図である。
図12図4のソフトウェア変換モジュールの動作例を示す図である。
図13】複合データフローグラフを示す図である。
【発明を実施するための形態】
【0039】
図1に、本明細書に記載のソースコード変換技法を使用してプログラムが変換され得る、データ処理システム100の例を示す。変換されたプログラムを実行して、データ処理システム100のデータソース102からのデータを処理することができる。変換モジュール120が、1又は2以上の手続き型プログラミング言語による第1のソフトウェア仕様122を入力として受け入れ、ソフトウェア仕様122を処理して、第1のソフトウェア仕様122の複合データフローグラフ表現332を、データフローベースのプログラミング言語で生成する。第1のソフトウェア仕様122のデータフローグラフ表現332はデータストレージシステム116に記憶され、データストレージシステム116から、開発環境118内で視覚的に提示されることが可能である。開発者120が、開発環境118を使用して、第1のソフトウェア仕様122のデータフローグラフ表現332を検証及び/又は修正することができる。
【0040】
システム100は、データソース102を含む。データソース102は、ストレージデバイスや、オンラインデータストリームへの接続など、データの1又は2以上のソースを含むことがあり、これらの各ソースは、様々なフォーマット(例えば、データベーステーブル、表計算ファイル、フラットテキストファイル、又は、メインフレームによって使用されるネイティブフォーマット)のいずれかで、データを記憶又は提供することができる。実行環境104が、ローディングモジュール106及び実行モジュール112を含む。実行環境104は、例えば、UNIXオペレーティングシステムのバージョンなど適切なオペレーティングシステムの制御下にある1又は2以上の汎用コンピュータ上でホストされてよい。例えば、実行環境104は、複数の中央処理装置(CPU,central processing unit)又はプロセッサコアを使用するコンピュータシステムの構成を含めた、複数ノード並列コンピューティング環境を含むことができ、この構成は、ローカル(例えば、対称型マルチプロセッシング(SMP,symmetric multi-processing)コンピュータなどのマルチプロセッサシステム)又はローカル分散型(例えば、クラスタとして結合された複数のプロセッサ、若しくは超並列処理(MPP,massively parallel processing)システムであるか、或いは、リモート又はリモート分散型(例えば、ローカルエリアネットワーク(LAN,local area network)及び/又はワイドエリアネットワーク(WAN,wide-area network)を介して結合された複数のプロセッサ)であるか、或いはこれらの任意の組合せであってよい。
【0041】
ローディングモジュール106は、データフローグラフ表現332を実行モジュール112にロードし、実行モジュール112から、データフローグラフ表現332は、データソース102からのデータを処理するために実行される。データソース102を提供するストレージデバイスは、実行環境104に対してローカルである場合があり、例えば、実行環境104をホストするコンピュータに接続されたストレージ媒体(例えばハードディスクドライブ108)に記憶され、又は、実行環境104に対してリモートである場合があり、例えば、実行環境104をホストするコンピュータとリモート接続(例えばクラウドコンピューティングインフラストラクチャによって提供される)を介して通信するリモートシステム(例えばメインフレーム110)上でホストされる。実行モジュール104によって実行されているデータフローグラフ表現332は、異なる複数の形のデータベースシステムを含めた、データソース102を具現化できる様々なタイプのシステムから、データを受け取ることができる。データは、それぞれのフィールド(「属性」又は「列」とも呼ばれる)についての値を有するレコード(「行」とも呼ばれる)として編成されたものであってよく、値はヌル値を含む可能性もある。データソースからのデータを最初に読み取るとき、データフローグラフ表現332は通常、このデータソース中のレコードに関する何らかの初期フォーマット情報から開始する。状況によっては、データソースのレコード構造は、最初はわかっておらず、その代り、データソース又はデータの分析後に決定されることがある。レコードに関する初期情報は、例えば、別個の値を表すビットの数、レコード内のフィールドの順序、及び、ビットによって表される値のタイプ(例えば、文字列、符号付き/符号なし整数)を含むことができる。
【0042】
データフローグラフ表現332は、出力データを生成するように構成されてよく、この出力データは、データソース102に再び記憶されるか、若しくは実行環境104からアクセス可能なデータストレージシステム116に記憶されるか、又は他の方法で使用される場合がある。データストレージシステム116はまた、開発環境118からもアクセス可能である。開発環境118は、いくつかの実装形態では、頂点(データ処理コンポーネント又はデータセットを表す)間の有向リンク(「フロー」とも呼ばれ、作業要素すなわちデータの流れを表す)によって接続された頂点を含むデータフローグラフとして、アプリケーションを開発するためのシステムである。例えば、このような環境は、参照により本明細書に組み込まれる「Managing Parameters for Graph-Based Applications」という名称の米国特許出願公開第2007/0011668号明細書に、より詳細に記載されている。このようなグラフベースの計算を実行するためのシステムが、参照により本明細書に組み込まれる「EXECUTING COMPUTATIONS EXPRESSED AS GRAPHS」という名称の米国特許第5,966,072号明細書に記載されている。このシステムに従って作成されたデータフローグラフは、グラフコンポーネントによって表される個々のプロセスに対して情報を出し入れする方法、プロセス間で情報を移動させる方法、及びプロセスの実行順序を定義する方法を提供する。このシステムは、任意の利用可能な方法からプロセス間通信方法を選ぶアルゴリズムを含む(例えば、グラフのリンクに従った通信パスが、TCP/IP若しくはUNIXドメインソケットを使用するか、又は共有メモリを使用して、プロセス間でデータを渡すことができる)。
【0043】
1 ソフトウェア仕様
いくつかの例では、第1のソフトウェア仕様122は、C、C++、Java、C#、IBMのジョブ制御言語(JCL,Job Control Language)、COBOL、Fortran、アセンブリなど、1又は2以上の手続き型テキストベースプログラミング言語を使用して指定される。以下の例のいくつかでは、ソフトウェア仕様122は、JCLスクリプティング言語を使用して書かれたバッチ処理スクリプトと、COBOLプログラミング言語を使用して書かれたいくつかのプログラムとを含む。JCLスクリプトは、COBOLプログラムを参照し、決定ベースの制御される実行フローを課す。第1のソフトウェア仕様122は、JCLプログラミング言語とCOBOLプログラミング言語との組合せに限定されず、このプログラミング言語の組合せは、単に変換モジュール120の例示的な一実施形態を説明するのに使用されるに過ぎないことを理解されたい。
【0044】
図2を参照すると、図1のソフトウェア仕様122の一例の概略図が、JCLスクリプト226を含む。JCLスクリプト226はいくつかのステップ230を含み、これらのステップのいくつかはCOBOLプログラム228を実行する。JCLスクリプト226の、可能性のある他のステップは、この記述を簡単にするために省略されている。COBOLプログラムを実行するJCLスクリプト中の各ステップは、COBOLプログラムの名前(例えばCOBOL1)と、COBOLプログラムが作用するデータセットとを指定する。例えば、JCLスクリプトのステップ3は、「COBOL1」と呼ばれるCOBOLプログラムを、「DS1.data」及び「DS2.data」データセットに対して実行する。JCLスクリプト226中では、所与のCOBOLプログラムに関連する各データセットに、ファイルハンドル(「DD名」とも呼ばれる)が割り当てられる。例えば、図2では、「DS1.data」にはファイルハンドル「A」が割り当てられ、「DS2.data」にはファイルハンドル「B」が割り当てられる。各COBOLプログラム228は、JCLスクリプト226によって指定されたデータセットに作用するためのソースコード(COBOLプログラミング言語で書かれた)を含む。所与のデータセットのファイルハンドル(すなわちDD名)は、データセットを識別するためにJCLスクリプト226とCOBOLプログラムのコードとの両方によって使用される識別子である。
【0045】
動作時、IBMメインフレームコンピュータ上で例えば稼働する従来のジョブスケジューラは、JCLスクリプト226にアクセスし、JCLスクリプト226によって定義された制御フローに従ってスクリプトのステップ230を逐次的に(すなわち1つずつ)実行する。一般に、入力又は出力データセットにアクセスするCOBOLプログラムはどれも、データセットを記憶したストレージ媒体(例えば、ハードディスクドライブなど、データソース102又はデータストレージシステム116のストレージ媒体。単に「ディスク」と呼ぶ)に対して読取り又は書込みを行うことによって、そのようにアクセスする。一般に、JCLスクリプト226によって実行される各COBOLプログラムは、そのすべての入力データをディスクから読み取り、そのすべての出力データをディスクに書き込んだ後で、制御をJCLスクリプト226に返す。したがって、入力データに対して前のステップの出力に依拠するどのようなステップも、一般に、入力データをディスクから読み取らなければならない。
【0046】
2 変換モジュール
図3を参照すると、図1の変換モジュール120の一例が、JCLスクリプト226と、JCLスクリプト226によって参照されるCOBOLプログラム228とを含むソフトウェア仕様122を入力として受け取り、ソフトウェア仕様122を処理して複合データフローグラフ332を生成する。複合データフローグラフ332は、第1のソフトウェア仕様122と同じ機能を実装し、図1の実行環境104によって使用可能である。変換モジュール120は、COBOL−データフローグラフ変換器334、及び複合グラフ合成器336を備える。
【0047】
ごく一般には、COBOL−データフローグラフ変換器334は、COBOLプログラム228を入力として受け取り、各COBOLプログラムを、COBOLプログラムの別個のデータフローグラフ表現338に変換する。後でより詳細に述べるように、COBOLプログラムの各データフローグラフ表現338は、「手続き型変形」コンポーネントと呼ばれるデータフローグラフコンポーネントと、0又は1以上のデータセット及び/又は他のデータフローグラフコンポーネントとを含む。手続き型変形コンポーネントは、手続き型変形コンポーネントをCOBOLプログラムのデータフローグラフ表現338のデータセット及び他のコンポーネントに接続するための、入力ポート及び出力ポートなどのポートを含み、COBOLプログラムの機能のいくつか又はすべてを実施する。いくつかの例では、COBOLプログラムのデータフローグラフ表現は、COBOLプログラム中に存在するコマンドに似たデータフローグラフコンポーネントを含む。いくつかの例では、COBOLプログラムのデータフローグラフ表現338は、「サブグラフ」として実装されてよく、これらのサブグラフは、COBOLプログラムのデータフローグラフ表現338インスタンスと、他のデータフローグラフコンポーネント(例えば、図3の複合データフローグラフ332の、他のデータフローグラフコンポーネント)との間のフローを形成するための、入力ポート及び出力ポートを有する。
【0048】
JCLスクリプト226、及びCOBOLプログラムのデータフローグラフ表現338は、複合グラフ合成器336に提供され、複合グラフ合成器336は、JCLスクリプト226を分析して、COBOLプログラムと、他の任意のコンポーネントとの間のデータフロー相互接続を決定する。次いで、複合グラフ合成器336は、決定されたデータフロー相互接続に従ったフローを使用してCOBOLプログラムのデータフローグラフ表現338の入力/出力ポートを連結することによって、複合データフローグラフ332を合成する。複合グラフ合成器336は、JCLのより前のステップによって書き込まれ、JCLのより後のステップによって読み取られる「中間」データセットを識別することによって、COBOLプログラム間のデータフロー相互接続を決定する。いくつかの例では、中間データセットは、除去されて、複合データフローグラフ332中のコンポーネント間のデータフローで置き換えられてよい。パイプライン並列性により、ディスクに書き込んでディスクから読み取る中間ステップを実施せずにデータがコンポーネント間を直接に流れることができるようにすることによって著しい性能改善を達成することができる。上で使用された「除去される」という用語は、必ずしも中間データセットが削除されることを意味するとは限らないことに留意されたい。いくつかの例では、中間データセットは、データフローグラフの中を流れるデータのパスから外に出されるが、依然としてディスクに書き込まれており、それにより、中間データセットに依存する他のプログラム(例えば、他のJCLスクリプトから実行されるプログラム)が引き続きそのデータにアクセスできることが保証される。中間ファイルを完全に削除できる(JCLがそれらを使用後に削除するので)場合、データフローグラフ表現はまた、ストレージ容量要件を下げることになる。
【0049】
いくつかの例では、JCLコード中のいくつかのステップの遂次的な性質を無視することができ、複合データフローグラフ332中のコンポーネント並列性がもたらされる。他の例では、あるステップの出力が別のステップへの入力として提供されるようなステップの場合、ステップの逐次的な性質は、フローを使用してステップのそれぞれのコンポーネントを接続することによって保存され、その結果、パイプライン並列性がもたらされる。
【0050】
2.1 COBOL−データフローグラフ変換器
図4を参照すると、COBOL−データフローグラフ変換器334の一実装形態の詳細なブロック図が、いくつかのCOBOLプログラム228を入力として受け取り、COBOLプログラム228を処理して、COBOLプログラムのいくつかのデータフローグラフ表現338を生成する。COBOL−データフローグラフ変換器334は、COBOLパーサ440、内部コンポーネントアナライザ444、データセット機能アナライザ442、メタデータアナライザ441、SQLアナライザ443、手続き部変換器445、及びサブグラフ合成器446を備える。
【0051】
各COBOLプログラム228は、最初にCOBOLパーサ440に提供され、COBOLパーサ440は、COBOLプログラム228を解析して解析木を生成する。COBOLパーサ440によって生成された解析木は、次いで、内部コンポーネントアナライザ444、データセット機能アナライザ442、メタデータアナライザ441、及びSQLアナライザ443に渡される。
【0052】
内部コンポーネントアナライザ444は、解析木を分析して、データフローグラフプログラミング言語による類似するデータフローグラフコンポーネント(例えば内部ソート)を有するプログラムプロセスを識別する。データフローグラフコンポーネントに変換できるCOBOL操作のいくつかの例は、「内部ソート」及び「内部再循環」(一時記憶)操作である。内部ソート操作は、後でより詳細に述べるように、ソートされていないデータのフローを受け取る入力ポートと、ソートされたデータのフローを提供する出力ポートとを有するコンポーネントに対応し、入力ポート及び出力ポートは主コンポーネントにリンクされる。内部再循環操作は、COBOLプログラム内で最初に全体が逐次的に書き込まれ、次いで全体が読み取られる、中間ファイルに対応する。データセット機能アナライザ444の出力は、識別された操作とそれらに対応するCOBOL解析木内での場所とのリストを含む、内部コンポーネント結果448である。
【0053】
上記は、ステートメント、又はステートメント及び/又は操作のシーケンスが識別され得る任意の手続き型言語であって、これらのステートメント及び/又は操作がフロー中の一連のレコードに対して特定の変形を実施し、この変形が、入力ポートにおいてフローを受け取り、出力ポートから変形済みレコードを提供するコンポーネント又はサブグラフに対応する、任意の手続き型言語に適用可能である。
【0054】
データセット機能アナライザ442は、解析木を分析して、COBOLプログラム228によってアクセスされる(例えば、開かれる、作成される、書き込まれる、又は読み取られる)すべてのデータソース及びシンク(例えばデータセット)を識別し、COBOLプログラムに対するデータセットに関連するタイプを決定する。こうするために、データセット機能アナライザ442は、データセットにアクセスするCOBOLステートメント(例えば、OPEN、READ、WRITE、DELETEなど)を識別し分析する。いくつかの例では、データセットに関連し得る可能なタイプは、INPUT、OUTPUT、LOOKUP、及びUPDATABLE LOOKUPを含む。COBOL定義が、データセットへのハンドル若しくはデータセットのパス、データセットのファイル編成、及びデータセットに対するアクセスモードを指定し、この場合、Input−Outputステートメントから決定されるファイルオープンモードなどの追加情報を伴う。
【0055】
可能なデータセットファイル編成は、SEQUENTIAL、INDEXED、及びRELATIVEを含む。SEQUENTIAL編成のデータセットは、逐次的に(すなわち、データセットに元々書き込まれた順序で)のみアクセスできるレコードを含む。INDEXED編成のデータセットは、1又は2以上の索引付きキーにそれぞれが関連付けられたレコードを含む。INDEXEDデータセットのレコードには、キーを使用してランダムに、又はファイル内のいずれか所与の位置から逐次的に、アクセスすることができる。RELATIVE編成のデータセットは、正の整数で番号が付けられたレコードスロットを有し、各スロットは、空としてマークされるかレコードを含むかのいずれかである。RELATIVE編成のファイルが逐次的に読み取られるとき、空のスロットはスキップされる。RELATIVEファイルのレコードには、スロット番号をキーとして使用して直接にアクセスすることができる。「ファイル位置」という概念は、この3つのファイル編成に共通である。
【0056】
可能なアクセスモードは、SEQUENTIAL、RANDOM、及びDYNAMICを含む。SEQUENTIALアクセスモードは、データセット中のレコードが、入力順、昇順、又は降順のキー順序で、逐次的にアクセスされることを示す。RANDOMアクセスモードは、データセット中のレコードが、レコード識別キーを使用してアクセスされることを示す。DYNAMICアクセスモードは、データセット中のレコードが、レコード識別キーを使用して直接に、又は任意の選択されたファイル位置から逐次的に、アクセスされ得ることを示す。
【0057】
可能なオープンモードは、INPUT、OUTPUT、EXTEND、及びI−Oを含む。INPUTオープンモードは、データセットが入力データセットとして開かれることを示す。OUTPUTオープンモードは、空のデータセットが出力データセットとして開かれることを示す。EXTENDオープンモードは、既存のレコードを含むデータセットが、新しいレコードが付加される対象である出力データセットとして開かれることを示す。I−Oオープンモードは、データセットオープンモードが、入力データセット操作と出力データセット操作の両方をサポートすることを示す(そのような操作がプログラム中に存在するかどうかにかかわらず)。
【0058】
データセット機能アナライザ442は、以下の規則セットをCOBOLデータセットアクセスコマンドのファイル編成、アクセスモード、及びオープンモードに適用して、COBOLプログラムに対するデータセットに関連する機能を決定する。
・ OUTPUTデータセットは、SEQUENTIAL、INDEXED、又はRELATIVE編成、SEQUENTIAL、RANDOM、又はDYNAMICアクセスモード、及びOUTPUT又はEXTENDオープンモードのデータセットである。
・ INPUTデータセットは、INDEXED、RELATIVE、又はSEQUENTIAL編成、SEQUENTIALアクセスモード、及びINPUTオープンモードのデータセットである。
・ LOOKUPデータセットは、INDEXED又はRELATIVE編成、RANDOM又はDYNAMICアクセスモード、及びINPUTオープンモードのデータセットである。
・ UPDATEABLE LOOKUPデータセットは、INDEXED又はRELATIVE編成、RANDOM又はDYNAMICアクセスモード、及びI−Oオープンモードのデータセットである。
【0059】
いくつかの例では、ファイルに対する実際の入出力操作をカウントすることによって、ファイルの「効果的なオープンモード」が決定されてよい。例えば、ファイルがI−Oモードで開かれるが、WRITE操作のみを有し、READ操作もSTART操作も有しない場合、「効果的なオープンモード」はEXTENDに縮小されてよい。
【0060】
図5を参照すると、テーブル501が、データセット編成とアクセスモードとオープンモードとの異なる複数の組合せを、各組合せに関連するデータセット機能と共にリストしている。
【0061】
再び図4を参照すると、データセット機能アナライザ442の出力は、COBOLプログラムによってアクセスされるすべてのデータセットを、COBOLプログラム中でのそれらに関連する機能と共に挙げたリストを含む、データセット機能結果450である。
【0062】
メタデータアナライザ441は、解析木を分析して、メタデータを抽出し、再使用可能なデータタイプ(例えばDMLデータタイプ)及びタイプ定義ファイルを作成する。再使用可能なデータタイプは、COBOLプログラム中のストレージ割振りとは別個である。メタデータアナライザ441の出力は、データタイプ結果447である。
【0063】
SQLアナライザ443は、解析木を分析して、COBOLプログラム中の埋め込まれた構造化照会言語(SQL,structured query language)コード(又は単に「埋め込みSQL」)を識別する。識別されたどのような埋め込みSQLも、処理されてデータベースインタフェース情報449にされる。データベースにアクセスするためのデータベースアプリケーションプログラミングインタフェース(API,database application programming interface)が、データベースインタフェース情報449内で使用できるプリミティブを提供することができる。いくつかの例では、これらのプリミティブを含めることで、埋め込みSQLの一部を(例えばバイナリ操作を使用して作用されるバイナリ形式に)コンパイルするために特定のスキーマを使用して特定のデータベースにアクセスする必要が回避される。その代り、このようなコンパイルによって提供されるであろう効率のいくらかは、データベースインタフェース情報449内に配置された適切なAPIプリミティブを使用して、場合によっては異なるデータベース及び/又はスキーマを必要に応じて使用して、埋め込みSQLを実行時に解釈できるフレキシビリティと、トレードオフされることが可能である。
【0064】
次いで、COBOLプログラムの解析木は、内部コンポーネント結果448、データセット機能結果450、データタイプ結果447、及びデータベースインタフェース情報結果449と共に、手続き部変換器445に提供される。手続き部変換器445は、解析木を分析して、COBOLロジックを「手続き型変形」データフローグラフコンポーネント452に変換する。一般に、手続き型変形データフローグラフコンポーネント452は、COBOLプログラムに関連するCOBOLロジックのいくらか又はすべてを含むと共に、入力データの受け入れ及びコンポーネントからの出力データの提供をそれぞれ行うための入力ポート及び出力ポートを有する、コンテナタイプのコンポーネントである。COBOLコードが、異なるプログラミング言語からのコードを含む(例えば、SQLコードがSQLアナライザ443によって識別されてデータベースインタフェース情報結果449中で提供される)場合、手続き部変換器445は、データベースインタフェース情報結果449を使用して、この埋め込みコードの適切な表現を手続き型変形データフローグラフコンポーネント452内で生成する。いくつかの例では、手続き部変換器445は、データベースAPIを使用して、埋め込みコードの適切な表現を生成する。他の例では、埋め込みSQLのTable及びCursorが、Input Tableコンポーネントで置き換えられ、それにより、FETCH操作が、ファイルに対して行われるようなread_record(port_number)への呼出しで置き換えられる。
【0065】
いくつかの例では、手続き部変換器445は、COBOLプログラムの手続き型ロジックを表すデータ操作言語(DML,Data Manipulation Language)コードを含むファイルを生成するだけである。サブグラフ合成器446が、手続き部変換器445によって生成されたファイルを使用する手続き型変形データフローコンポーネントを生成する。
【0066】
図4及び上の記述は、内部コンポーネントアナライザ444、データセット機能アナライザ442、メタデータアナライザ441、及びSQLアナライザ443の、可能な1つの動作順序に関係することに留意されたい。しかし、アナライザの動作順序は、前述の順序に限定されず、アナライザの他の動作順序も可能である。
【0067】
図6を参照すると、「COBOL2」のタイトルが付いた手続き型変形コンポーネントの単純な一例554(すなわち、図2のJCLスクリプト226のステップ5で実行されるCOBOLプログラムを変換した結果)が、「in0」のラベルが付いた入力ポート556と、「out0」のラベルが付いた出力ポート560と、「lu0」のラベルが付いたルックアップポート562とを有する。ルックアップデータセットは、必ずしもコンポーネント上のポートを介してアクセスされるとは限らず、その代りにルックアップデータセットAPIを使用してアクセスされる場合もあることに留意されたい。しかし、記述を簡単にするために、ルックアップデータセットはルックアップポートを介してアクセスされるものとして述べる。
【0068】
各ポートは、フローを介してそれぞれのデータセット(JCLスクリプト226によって識別される)に接続されるように構成される。いくつかの例では、開発者は、手続き型変形コンポーネント554の基礎をなすCOBOLコードのDML変換を閲覧及び編集することができ、これは例えば、コンポーネントをシフトダブルクリックすることによって、又は、情報バブルが現れるまでコンポーネントの上でホバーして情報バブル中の「変形」リンクをクリックすることによって、行うことができる。
【0069】
図7を参照すると、手続き型変形コンポーネントの別の例664は、「COBOL1」のタイトルが付いたCOBOLプログラム(すなわち、図2のJCLスクリプト226のステップ3で実行されるCOBOLプログラム)が、そのコード中にソートコマンドを含む状況を示す。この状況では、内部コンポーネントアナライザ448は、ソートコマンドを識別し、ソートコマンドに関係する情報を手続き部変換器445に渡す。手続き部変換器445は、内部コンポーネントアナライザ448からの情報を使用して、手続き型変形664に関連するコード中のソートコマンドを、特化された内部ソートサブグラフへのインタフェースで置き換える。サブグラフ合成器446は、448によって作成されたソート情報を使用し、ソートされるべきデータを内部ソートデータフローサブグラフコンポーネント666に提供するための手続き型変形664からの出力ポートout1と、ソートされたデータを内部ソートデータフローサブグラフコンポーネント666から受け取るための入力in1とを作成する。
【0070】
図8を参照すると、ソートコマンドを含む手続き型変形の別の類似例が示されている。この例では、ソートされるべきデータを提供するための出力とソートされたデータを受け取るための入力とを有する単一の手続き型変形を作成するのではなく、2つの手続き型変形が作成される。2つの手続き型変形のうちの第1の手続き型変形768は、ソートされるべきデータを提供するための出力を有し、2つの手続き型変形のうちの第2の手続き型変形770は、ソートされたデータを受け取るための入力を有する。図示のように、いくつかの例では、ソートデータフローコンポーネント766が、サブグラフ合成器446によって、2つの手続き型変形768、770間で自動的に接続されてよい。他の例では、ソートデータフローコンポーネント766は、2つの手続き型変形768、770間で、手作業で接続されてもよい。
【0071】
2.2 サブグラフ合成器
再び図4を参照すると、COBOLプログラムの手続き型変形452は、内部コンポーネント結果448、データセット機能結果450、データタイプ結果447、及びデータベースインタフェース情報結果449と共に、サブグラフ合成器446に渡される。サブグラフ合成器446は、入力を使用して、COBOLプログラム228に対するデータフローグラフ表現338を生成する。ごく一般には、各COBOLプログラム228につき、サブグラフ合成器446は、COBOLプログラム228の手続き型変形と、COBOLプログラム228に関連するデータセットと、内部コンポーネントアナライザ444によって識別された内部コンポーネントがあればそれらと、を含むデータフローグラフを作成する。次いで、サブグラフ合成器446は、内部コンポーネント結果448及びデータセット機能結果450を使用して、データセット、内部コンポーネント、及び手続き型変形452の間のフローを適切に接続する。サブグラフ合成器446は、データタイプ結果447を使用して、コンポーネントポートの中を流れるデータを記述する。図9を参照すると、COBOL1のタイトルが付いた例示的なCOBOLプログラムに対するデータフローグラフ表現の一例838が、手続き型変形864を含み、手続き型変形864は、データセットDS1.dataに関連するファイルハンドル「A」を有する入力ファイルにフローによって接続されたin0のラベルが付いた入力ポートと、データセットDS2.dataに関連するファイルハンドル「B」を有する出力ファイルにフローによって接続されたout0のラベルが付いた出力ポートと、内部ソートコンポーネント866にフローによって接続された出力ポート及び入力ポートout1及びin1と、を有する。
【0072】
2.3 複合グラフ合成器
図3に戻って参照すると、次いで、COBOLプログラムのデータフローグラフ表現338は、JCLスクリプト226と共に、複合グラフ合成器336に渡される。COBOLプログラムに関連するデータセットの機能と共に、JCLスクリプト226中のCOBOLプログラムの実行の順序を分析することによって、複合グラフ合成器336は、COBOLコードのデータフローグラフ表現を接続して単一の複合データフローグラフ332にする。
【0073】
例えば、図10を参照すると、COBOL2のタイトルが付いたCOBOLプログラムのデータフローグラフ表現は、in0のラベルが付いた入力ポートにおけるデータセットDS2.dataに関連する入力ファイル「C」から読み取り、ルックアップポートlu0におけるDS3.dataに関連するルックアップファイル「D」にアクセスすることによってデータを充実化し、out0のラベルが付いた出力ポートにおけるデータセットDS4.dataに関連する出力ファイル「E」に書き込む。COBOL3のタイトルが付いたCOBOLプログラムのデータフローグラフ表現は、2つの入力データセット、すなわち、in0のラベルが付いた入力ポートにおけるDS4.dataに関連する「F」と、in1のラベルが付いた入力ポートにおけるDS5.dataに関連する「G」とから読み取り、out0のラベルが付いた出力ポートにおけるDS6.dataに関連する出力データセット「H」に書き込む。複合グラフ合成器336は、JCLスクリプト226情報を、COBOLプログラムの変換によって導出された情報と併合して、COBOL2がCOBOL3の前に実行されること、及びDS4.dataがCOBOL2によって出力されてCOBOL3によって入力されることを決定し、したがって、COBOL2のout0のラベルが付いた出力ポートは、フローによってCOBOL3のin0のラベルが付いた入力ポートに接続されることが可能であり、それにより、COBOL3がデータセットDS4.dataをディスクから読み取る必要をなくすことができる。図10に例示的な複合データフローグラフ932を示すが、この複合データフローグラフ932は、out0のラベルが付いたCOBOL2の出力ポートと、in0のラベルが付いたCOBOL3の入力ポートとを、複製コンポーネント933を介して接続するフローを含む。複製コンポーネント933は、ディスク上のDS4.dataにデータを書き込むが、フローを介して、in0のラベルが付いたCOBOL3の入力ポートにもデータを直接渡す。このようにして、COBOL3は、データセットDS4.dataがディスクに書き込まれるのを待機する必要なしに、COBOL2から流れるデータを読み取ることができ、JCLスクリプト226によって削除されないDS4.dataに記憶されたデータは、他のプロセスによって利用可能である。
【0074】
いくつかの例では、中間データセット(例えばファイル)が作成された後でJCL手続きがそれを削除しない場合、このデータセットは、実行環境で稼働している他の何らかのプロセスによって使用される可能性がある。これが当てはまる例では、中間データセットは、JCL手続きのデータフローグラフ表現中で保存される(例えば、前述のように複製コンポーネントを使用して)。いくつかの例では、中間データセットが作成された後でJCL手続きがそれを削除する場合、中間データセットは、JCL手続きのデータフローグラフ表現中で完全に除去され、それに対する複製コンポーネントは必要ない。
【0075】
いくつかの例では、COBOL2及びCOBOL3データフローグラフについて上述したようにフローによって接続されるポートのメタデータが、同一ではない場合があり、これは、第1のソフトウェア仕様が、同じデータセットについて代替定義を使用したからである。この場合、複合グラフ合成器336は、接続フロー上でRedefine Formatコンポーネントを挿入することができる。このようなRedefine Formatコンポーネントの存在を後で使用して、データセットメタデータを統合することができる。メタデータ情報は、各データフローグラフ338についてメタデータアナライザ441によって導出される。
【0076】
3 例示的な動作
図11を参照すると、変換モジュール120の単純な動作例が、JCLスクリプト226と、図2の4つのCOBOLプログラム228とを入力として受け取り、入力を処理して複合データフローグラフ332を生成する。
【0077】
変換プロセスの第1の段階では、COBOLプログラム228がCOBOL−データフローグラフ変換器334に提供され、COBOL−データフローグラフ変換器334は、各COBOLプログラムを処理して、COBOLプログラムのデータフローグラフ表現338a〜dを生成する。第2の段階では、JCLスクリプト226と、COBOLプログラムのデータフローグラフ表現338a〜dとが、複合グラフ合成器336に提供され、複合グラフ合成器336は、JCLスクリプト226と、COBOLプログラムのデータフローグラフ表現338a〜dとを処理して、複合データフローグラフ332を生成する。
【0078】
図12を参照すると、COBOL−データフローグラフ変換器334は、COBOLパーサ440、内部コンポーネントアナライザ444、データセット機能アナライザ442、メタデータアナライザ441、及びSQLアナライザ443を使用して、各COBOLプログラム228を処理する。COBOLパーサ440、内部コンポーネントアナライザ444、データセット機能アナライザ442、メタデータアナライザ441、及びSQLアナライザ443によって生成された出力は、手続き部変換器445に提供され、その出力と共にサブグラフ合成器446に提供され、サブグラフ合成器446は、各COBOLプログラムに対するデータフローグラフ表現338a〜dを生成する。
【0079】
JCLスクリプト226のステップ3で実行されるCOBOL1プログラムについては、内部コンポーネントアナライザ444は、プログラムが内部ソートコンポーネントを含むことを識別した。データセット機能アナライザ442は、COBOL1プログラムが1つの入力データセット「A」及び1つの出力データセット「B」にアクセスすることを識別した。識別された内部ソートコンポーネントと、データセットと、COBOL1プログラムの手続き型変形に対するそれらの関係とは、COBOL1プログラムのデータフローグラフ表現338aに反映される。
【0080】
JCLスクリプト226のステップ5で実行されるCOBOL2プログラムについては、内部コンポーネントアナライザ444はどのような内部コンポーネントも識別せず、SQLアナライザ443はどのような埋め込みSQLコードも識別しなかった。データセット機能アナライザ442は、COBOL2プログラムが、入力データセットとしての1つのデータセット「C」と、出力データセットとしての別のデータセット「E」と、ルックアップデータセットとしての別のデータセット「D」とにアクセスすることを識別した。識別されたデータセットと、COBOL2プログラムの手続き型変形に対するそれらの関係とは、COBOL2プログラムのデータフローグラフ表現338bに反映される。
【0081】
JCLスクリプト226のステップ6で実行されるCOBOL3プログラムについては、内部コンポーネントアナライザ444はどのような内部コンポーネントも識別せず、SQLアナライザ443はどのような埋め込みSQLコードも識別しなかった。データセット機能アナライザ442は、COBOL3プログラムが、入力データセットとしての2つのデータセット「F」及び「G」と、出力データセットとしての1つのデータセット及び「H」とにアクセスすることを識別した。識別されたデータセットと、COBOL3プログラムの手続き型変形に対するそれらの関係とは、COBOL3プログラムのデータフローグラフ表現338cに反映される。
【0082】
JCLスクリプト226のステップ10で実行されるCOBOL4プログラムについては、内部コンポーネントアナライザ444はどのような内部コンポーネントも識別せず、SQLアナライザ443はどのような埋め込みSQLコードも識別しなかった。データセット機能アナライザ442は、COBOL4プログラムが、入力データセットとしての1つのデータセット「I」と、出力データセットとしての別のデータセット「J」とにアクセスすることを識別した。識別されたデータセットと、COBOL4プログラムの手続き型変形に対するそれらの関係とは、COBOL4プログラムのデータフローグラフ表現338dに反映される。
【0083】
再び図11を参照すると、JCLスクリプト226と、4つのCOBOLプログラムのデータフローグラフ表現338a〜dとは、複合グラフ合成器336に提供され、複合グラフ合成器336は、JCLスクリプト226及びデータフローグラフ表現338a〜dを分析して、データフローグラフ表現338a〜dを接続して単一の複合グラフ332にする。図13を参照すると、JCLスクリプト226と図2の4つのCOBOLプログラム228との複合グラフは、フローによって相互接続された4つの手続き型変形COBOL1 452a、COBOL2 452b、COBOL3 452c、及びCOBOL4 452dを含む。複製コンポーネント933を使用して、複合データフローグラフ332中のいくつかの中間データセット(すなわちDS2.data、DS4.data、及びDS5.data)が取り置かれ(すなわち出力データセットとして書き込まれ)、フローを使用してコンポーネントが直接に接続される。
【0084】
4 代替形態
上の記述では、手続き型プログラミング言語で書かれたプログラムの、限られた数の操作及び要素のみがデータフローグラフコンポーネントに変換されることについて述べているが、いくつかの例では、元のプログラム(例えばCOBOLプログラム)のソースコードのすべてがデータフローグラフ表現に変換される。
【0085】
前述のシステムを使用して、1又は2以上の手続き型プログラミング言語の任意の組合せを含むソフトウェア仕様を、ソフトウェア仕様のデータフローグラフ表現に変換することができる。
【0086】
いくつかの例では、前述の変換モジュールは、変換モジュールが処理する準備ができていない変換タスクに遭遇することがある。このような例では、変換モジュールは不完全な変換タスクのリストを出力し、開発者は、このリストを読み使用して、変換を手作業で修復することができる。
【0087】
上の記述では、COBOL−データフローグラフ変換器334のいくつかのモジュールが並列で稼働するものとして述べているが、これは必ずしも当てはまるとは限らない。いくつかの例では、まずメタデータアナライザ441が解析木をCOBOLパーサ440から受け取る。メタデータアナライザ441は、解析木を充実化及び/又は単純化し、これをデータセット機能アナライザ442に提供する。データセット機能アナライザ442は、解析木を充実化及び/又は単純化し、これをSQLアナライザ443に提供する。SQLアナライザ443は、解析木を充実化及び/又は単純化し、これを内部コンポーネントアナライザ444に提供する。内部コンポーネントアナライザ444は、解析木を充実化及び/又は単純化し、これを手続き部変換器445に提供する。すなわち、これらのコンポーネントは直列で解析木に作用する。
【0088】
5 実装形態
前述のソースコード変換手法は、例えば、適切なソフトウェア命令を実行するプログラム可能なコンピューティングシステムを使用して実装されてもよく、又は、フィールドプログラマブルゲートアレイ(FPGA,field-programmable gate array)などの適切なハードウェアにおいて、若しくは何らかのハイブリッド形式で実装されてもよい。例えば、プログラムされる手法では、ソフトウェアは、1又は2以上のプログラムされた又はプログラム可能なコンピューティングシステム(分散型、クライアント/サーバ、又はグリッドなど、様々なアーキテクチャのものであり得る)上で実行される1又は2以上のコンピュータプログラム中のプロシージャを含むことができ、各コンピューティングシステムは、少なくとも1つのプロセッサと、少なくとも1つのデータストレージシステム(揮発性及び/又は不揮発性の、メモリ及び/又はストレージ要素を含む)と、少なくとも1つのユーザインタフェース(少なくとも1つの入力デバイス又はポートを使用して入力を受け取るため、及び少なくとも1つの出力デバイス又はポートを使用して出力を提供するための)とを備える。ソフトウェアは、データフローグラフの設計、構成、及び実行に関係するサービスを例えば提供するより大きいプログラムの、1又は2以上のモジュールを含むことができる。プログラムのモジュール(例えば、データフローグラフの要素)は、データリポジトリに記憶されたデータモデルに従う、データ構造又は他の編成されたデータとして実装されてよい。
【0089】
ソフトウェアは、CD−ROM又は他のコンピュータ可読媒体(例えば、汎用若しくは専用のコンピューティングシステム若しくはデバイスによって読取り可能な)など、有形の非一時的な媒体上で提供されてもよく、或いは、ネットワークの通信媒体を介してコンピューティングシステムの有形の非一時的な媒体に送達されて(例えば、伝搬信号中で符号化されて)、コンピューティングシステムにおいて実行されてもよい。処理のいくらか又はすべては、専用コンピュータ上で実施されてもよく、又は、コプロセッサ若しくはフィールドプログラマブルゲートアレイ(FPGA)若しくは専用の特定用途向け集積回路(ASIC,application-specific integrated circuit)など、専用ハードウェアを使用して実施されてもよい。処理は、分散方式で実装されてもよく、その場合、ソフトウェアによって指定される計算の異なる部分が、異なるコンピューティング要素によって実施される。このような各コンピュータプログラムは、ストレージデバイス媒体がコンピュータによって読み取られたときにコンピュータを構成及び操作して本明細書に記載の処理を実施するために、汎用又は専用のプログラム可能コンピュータによってアクセス可能なストレージデバイスのコンピュータ可読ストレージ媒体(例えば、固体メモリ若しくは媒体、又は磁気若しくは光学媒体)に記憶されるか又はダウンロードされることが好ましい。本発明のシステムはまた、コンピュータプログラムで構成された有形の非一時的な媒体として実装されるものと考えることもでき、その場合、そのように構成された媒体は、特定の事前定義された方式でコンピュータを動作させて、本明細書に記載の処理ステップの1又は2以上を実施させる。
【0090】
本発明のいくつかの実施形態について述べた。しかし、以上の記述は、本発明の範囲を例示するものとし、限定するものとはしないことを理解されたい。本発明の範囲は、後続の特許請求の範囲によって定義される。したがって、他の実施形態もまた、後続の特許請求の範囲内である。例えば、本発明の範囲を逸脱することなく、様々な修正を加えることができる。加えて、前述のステップのいくつかは、順序に依存しない場合もあり、したがって、述べた順序とは異なる順序で実施されてもよい。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13