JP3641090B2 - プログラミング支援装置とその方法 - Google Patents
プログラミング支援装置とその方法 Download PDFInfo
- Publication number
- JP3641090B2 JP3641090B2 JP34705396A JP34705396A JP3641090B2 JP 3641090 B2 JP3641090 B2 JP 3641090B2 JP 34705396 A JP34705396 A JP 34705396A JP 34705396 A JP34705396 A JP 34705396A JP 3641090 B2 JP3641090 B2 JP 3641090B2
- Authority
- JP
- Japan
- Prior art keywords
- sections
- execution
- program
- concurrent program
- execution path
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Description
【発明の属する技術分野】
本発明は、プログラミングを支援するプログラミング支援装置及びプログラミング支援方法の改良に関するもので、特に、信頼性の高い並行プログラムを容易に開発するものに係る。
【0002】
【従来の技術】
近年、半導体集積回路技術の進歩により、複雑なプロセッサ及び大容量のメモリが小型かつ低価格で実現できるようになり、多数のプロセッサからなる並行処理システムや分散処理システムが実用化されている。このようなハードウエアに対しては、専用のプログラム、すなわち並列プログラムや分散処理プログラム等(以下「並行プログラム(Concurrent Program=CP) 」という)を用いなければならない。
【0003】
この並行プログラムは、複数のプロセスが同時並行的に動作するプログラムであって、その一類型は、複数のCPUを有する並列計算機上で、複数のプログラムが物理的に並行に動くプログラムである。また、単一のCPU上で物理的には逐次的に動作する場合でも、マルチタスクシステムのように複数のプロセスが論理的に並行に動作するプログラムは、並行プログラムに含まれる。なお、このように物理的または論理的な並行性を持つシステムを並行システムと呼び、並行システムでは一般に並行プログラムが動作する。このような並行プログラムをいかに効率よく開発するかは、優れたアルゴリズムを検討する場合と同様に重要な課題となっている。
【0004】
ところで、プログラム開発においては、プログラム中のバグを見付け修正すること(すなわち、テスト・デバッグ)と呼ばれる開発工程がプログラム開発の効率に大きく影響する。しかし、並行プログラムの開発においては、逐次プログラムの開発においては遭遇することのない、並行プログラム特有の問題を考慮する必要がある。この並行プログラム特有の問題とは、並行プログラムを構成する各プロセスは、各プロセス間における相互作用のタイミングによる様々な振る舞いをする可能性があるため、並行プログラム全体が正しく動作しないという問題である。この問題は、並行プログラムの性質に基づく問題であり、一般に「非決定性(nondeterminism)」と呼ばれる。
【0005】
非決定性は、よい非決定性、悪い非決定性、無害の非決定性に分けられる。このうち、よい非決定性は、(プログラムの)設計者の実現したい非決定性であり、この非決定性により、外部(環境)からの非決定的な刺激に適切に反応でき、プロセスの柔軟性、再利用性、拡張性を実現できる。
【0006】
一方、悪い非決定性は、設計者が予想ないし期待しない非決定性であり、しばしばプログラムの機能不全を生じさせる。すなわち、人間の一般的思考形態は逐次であり、設計者が逐次的に思考した場面が、並行プログラムの複数のプロセス間で実際に生じ得る場面のすべてを網羅することは困難である。このため、設計時には予想しなかったケースが、実際の並行プログラムの実行では多々発生する。
【0007】
無害の非決定性は、非決定的な選択子の選択が、実行効率には影響があっても、最終的に得られる結果には悪影響を与えない場合の非決定性である。
【0008】
以下、上記悪い非決定性について示す。例えば、図33に示す並行プログラムを考慮する。図33(a)において、プロセスP1は、共有メモリMの初期設定(init)を行うプロセス、プロセスP2は、共有メモリMから読み出し(read)を行うプロセス、プロセスP3は、共有メモリMに書込み(write)を行うプロセスを示す。これらのプロセスをそれぞれ異なるプロセッサで実行するような並行処理システム等で動作させた場合、図33(b)に示すように、全部で6通りの動作の組み合わせがあることになる。通常、システムは初期設定で処理を開始するため、今、プロセスP1(init)→P2(read)→P3(write)又はP1(init)→P3(write)→P2(read)の順番でプログラムが動作する場合に正しい結果が得られるものとすれば、残りの4通り(例えばP2→P3→P1)は、初期化が最初に行われないため、明らかに正しい結果が得られないことがわかる。
【0009】
上記のようにプロセスの振る舞いに関する非決定性は、並行プログラムを動作させる毎に、その時点におけるシステムの状況等によって結果が異なったものになる。従って、この非決定性に関する問題を解決しない限り、その並行プログラムは、テストにおいてたとえ正常に動作することがあっても、常に正常に動作するという保証はない。
【0010】
また、非決定性に関するバグは、一般に、逐次プログラムにおけるバグを見付ける場合よりも困難である。なぜなら、逐次プログラムにおいては、テスト・デバッグ時にプログラム中の全てのパスを実行することによって動作を確認することができるのに対し、並行プログラムにおいては、全ての組合せ的なパス(すなわわち、各プロセス中の全てのパスのみならず、プロセス相互間の振る舞い)を考慮してパスを実行しなければならないからである。上記の例のようにプロセスの数が少ない場合にあっては、各プロセス相互間の振る舞いを全て列挙することは比較的容易であるが、実際のプログラム開発では、その数は膨大になり、その組合わせも膨大なものとなるため、全ての振る舞いを把握することはもはや不可能なものとなる。
【0011】
【発明が解決しようとする課題】
ところで、一般に、プログラミングには、従来からプログラミング支援装置及びこのプログラミング支援装置上で実行されるプログラミング支援方法が用いられている。プログラミング支援装置及びプログラミング支援方法は、開発ツールと俗称され、一般的にエディタ、デバッガ、プリプロセッサ、オプティマイザ、解析ツール、シミュレータ、コンパイラ、リンカなどを含む。
【0012】
従来のプログラミング支援装置及びプログラミング支援方法におけるプログラミングの手順の典型例は、あり得る入出力をテストケースとして表し、テストケースによってプログラムをテスト実行し、バグを発見するとテストの結果を参照しながらソースコードの修正を行うことであった。また、従来技術では、解析ツールによってソースコードやデータの構造を解析し、コンパイラが、この解析結果を利用しながら実行効率やメモリ効率の優れた実行コードを生成するなども可能であった。
【0013】
しかしながら、並行プログラムは、プログラムを構成する複数のプロセスの実行のタイミングによって挙動が非決定的に変化するので、まず、あり得るテストケースの数が組合せ的な爆発を示すことが一般的である。また、タイミングに係わるバグには再現性が無く、テストケース自体の作成も困難であった。
【0014】
さらに、従来のプログラミング支援装置及びプログラミング支援方法では、解析やテスト実行の結果をプログラムに反映させるにあたって、このような並行プログラムの特徴は考慮されていなかった。このため、従来のプログラミング支援装置やプログラミング支援方法では、信頼性の高い並行プログラムを開発することが困難であった。
【0015】
なお、並行プログラムの開発(並行プログラミング)を改良したものとして、超逐次プログラミング(Hyper Sequential Programming)が知られている(参考文献:特開平8−16429号)。超逐次プログラミングは、並行プログラムを一旦逐次化して超逐次プログラムを生成し、この超逐次プログラムに対してプログラミング、テスト・デバッグを行う。これは、従来の逐次プログラミングと同じレベルの困難さであり、通常の並行プログラミングの困難さよりはるかに少ない。そして、テスト・デバッグが完了した時点で、テスト・デバッグ情報を用いて上記超逐次プログラムを並行性し、並行プログラムを復元する。
【0016】
このような超逐次プログラミングでは、悪い非決定性をもたらす要素間に、逐次実行を実現する制御を与えて悪い非決定性を抑制する一方で、無害の非決定性やよい非決定性を残し、並行プログラムの柔軟性という利点を享受することができる。
【0017】
しかしながら、並行プログラムを逐次化して一旦超逐次プログラムを生成し、それから再び並行プログラムを復元するという作業が必要であり、信頼性の高い並行プログラムを容易に作成することができなかった。また、無害の非決定性についての設計者の処理を省略すること等によってプログラミングを効率化したり、無害の非決定性を容易に取り込むこと等により、プログラミングの信頼性とプログラミングの効率とを向上させることは容易ではなかった。
【0018】
本発明は、上記のような従来技術の問題点を解決するためのもので、その目的は、プロセスの各セクションのあり得る実行順序を表す実行経路に基づいてプログラムを生成することにより、信頼性の高い並行プログラムを容易に開発するプログラミング支援装置及びプログラミング支援方法を提供することである。また、本発明の他の目的は、設計者の処理を省略したり、無害の非決定性を容易に取り込むことにより、プログラミングの効率を向上させるプログラミング支援装置及びプログラミング支援方法を提供することである。更に、本発明の他の目的は、実行経路に基づいて並行性を復元することにより効率よく並行プログラムを生成することができるプログラミング支援装置及びプログラミング支援方法を提供することである。
【0019】
また、本発明は、上述した超逐次プログラミングにおいて並行プログラムを逐次化する部分、及び並行プログラムを復元する部分のアルゴリズムを改善したものである。
【0020】
【課題を解決するための手段】
上記の目的を達成するため、請求項1記載の発明は、並行プログラムのプログラムエラーの除去を支援するためのプログラミング支援装置において、複数のプロセスからなる第1の並行プログラムの各プロセスを複数のセクションに区分する区分手段と、前記第1の並行プログラムにおける前記複数のセクションのあり得る実行順序の集合を表すネットワーク構造を、前記並行プログラムのある状態を表すノードからこの状態に後続し得るプロセスの各セクションがそれぞれ一つの分岐エッジとして次のノードに伸びるように表し、前記ネットワーク構造の一つの経路が一つのあり得る実行順序を示すように生成する生成手段と、前記ネットワーク構造の各分岐について前記エッジによって表されるセクションに関するユーザの選択結果として選択されたセクションを入力する入力手段と、前記第1の並行プログラムを、その第1の並行プログラムについて前記選択されたセクションを選択された実行順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴としている。
【0021】
請求項2記載の発明は、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、入力手段を備えたコンピュータとそれを制御するソフトウェアにより実現される区分手段、生成手段、変換手段を用いて、前記区分手段により、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分処理と、前記生成手段により、前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、前記入力手段により、前記生成された実行経路中の分岐についてユーザの選択結果として選択されたセクションを入力する入力処理と、前記変換手段により、前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理とを具備することを特徴としている。
【0022】
請求項3記載の発明は、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分手段と、前記各プロセスの前記セクションのあり得る実行順序について実行可能な全ての実行経路を、その実行経路の分岐が前記セクションの実行順序となるように生成する生成手段と、前記生成手段によって生成された前記実行可能な全ての実行経路中の分岐についてユーザの選択結果として選択されたセクションを入力する入力手段と、前記第1の並行プログラムを、前記選択されたセクションの分岐について選択されたセクションを有する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴としている。
【0023】
請求項1〜3記載の発明によれば、第1の並行プログラムの複数のプロセスが実行制御可能なセクションに区分され、各セクションのあり得る実行順序が実行経路(シナリオ)で表される。シナリオは、例えばネットワーク構造の状態遷移図で表すことができ、ある状態を表すノードからは、この状態に後続して実行可能な各セクションが、分岐エッジとして次の状態のノードに伸びる。このようなシナリオ上には、各セクションのあり得る実行順序に対応して、順序と同数の経路が存在する。このシナリオの各分岐について、先に実行すべきセクションのエッジを選択していくことにより、意図する実行順序の組み合わせからなるシナリオが生成される。このシナリオに基づいて、第1の並行プログラムを変換して生成された第2の並行プログラムは、悪い非決定性が存在しない。このように、請求項1記載の発明によれば、シナリオ上で実行順序を指定するだけで指定通りの挙動を示すプログラムを得ることができるため、信頼性の高い並行プログラムを容易に作成することができる。
【0024】
請求項4記載の発明は、請求項3記載のプログラミング支援装置において、前記生成手段は、前記各プロセスの前記各セクションの実行順序を、前記選択の結果が前記第2の並行プログラムによる実行結果に影響を与えるセクション間の分岐に限定して表す実行経路を生成するように構成されたことを特徴としている。
【0025】
請求項4記載の発明によれば、選択の結果が第2の並行プログラムによる実行結果に影響を与えない、すなわち、悪い非決定性を生じないセクション間の分岐が実行経路(シナリオ)に含まれないため、シナリオが単純化され理解容易となり、プログラミングが効率化される。
【0026】
請求項5記載の発明は、請求項4記載のプログラミング支援装置において、前記実行経路を、前記選択結果が前記第2の並行プログラムによる実行結果に影響を与えないセクション間の分岐を付加することによって拡張する拡張手段を具備することを特徴としている。
【0027】
請求項5記載の発明によれば、選択の結果が第2の並行プログラムによる実行結果に影響を与えない分岐、すなわち、無害な非決定性を生じる分岐が付加されるため、変換後の第2の並行プログラムの非決定性が増大し、プログラムの並列性が高まり性能と柔軟性が向上する。
【0028】
請求項6記載の発明は、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分手段と、前記各セクション間の依存関係を検出する検出手段と、前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成手段と、前記依存関係を有する分岐についてユーザの選択結果として選択されたセクションを入力する入力手段と、前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴としている。
【0029】
請求項15記載の発明は、請求項6記載の発明を方法の観点から把握したものであって、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、入力手段を備えたコンピュータとそれを制御するソフトウェアにより実現される区分手段、検出手段、生成手段、変換手段を用いて、前記区分手段により、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分処理と、前記検出手段により、前記各セクション間の依存関係を検出する検出処理と、前記生成手段により、前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、前記入力手段により、前記依存関係を有する分岐についてユーザの選択結果として選択されたセクションを入力する入力処理と、前記変換手段により、前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理とを具備することを特徴としている。
【0030】
請求項6、15記載の発明によれば、第1の並行プログラムの各プロセスが実行制御可能なセクションに区分され、各プロセスの各セクションのあり得る実行順序が実行経路(シナリオ)で表される。このシナリオの各分岐のうち、依存関係を有する分岐においてセクションが選択されることにより、例えば先に実行すべきセクションが選択されていく。これにより、意図する実行順序の組み合わせのみからなるシナリオが生成され得る。このシナリオに基づいて、第1の並行プログラムに実行タイミング制御の命令等を挿入して第2の並行プログラムとすることにより、悪い非決定性が存在しない第2の並行プログラムが生成され得る。このように、請求項6、15記載の発明では、シナリオ上でセクションを選択することにより実行順序を指定するだけで、指定通りの挙動を示すプログラムが得られる。そのため、信頼性の高い並行プログラムを容易に作成することができる。
【0031】
請求項7記載の発明は、請求項6記載のプログラミング支援装置において、前記生成手段は、前記各プロセスの前記各セクションの実行順序を、前記依存関係を有するセクション間の分岐に限定して表す実行経路を生成するように構成されたことを特徴としている。
【0032】
請求項7記載の発明によれば、依存関係のないセクション間の分岐が実行経路(シナリオ)に含まれないため、シナリオが単純化され理解容易となり、プログラミングが効率化される。この場合、依存関係を有しないセクション同士の実行順序は悪い非決定性を生じないため、シナリオに含まれない場合でもプログラムの信頼性は低下しない。
【0033】
請求項8記載の発明は、請求項7記載のプログラミング支援装置において、前記実行経路を、前記依存関係のないセクション間の分岐を付加することによって拡張する拡張手段を有することを特徴としている。
【0034】
請求項8記載の発明によれば、依存関係のないセクション間の分岐が実行経路(シナリオ)に付加されるが、このような分岐は無害な非決定性を生じる。このため、変換後の第2の並行プログラムの非決定性が増大し、プログラムの並列性が高まり性能と柔軟性が向上する。
【0035】
請求項9記載の発明は、請求項3または6記載のプログラミング支援装置において、前記第1の並行プログラムを、前記実行経路上のセクション間の実行順序に基づいて模擬実行する実行手段を具備することを特徴としている。
【0036】
請求項9記載の発明によれば、実行経路(シナリオ)上でセクションを選択する作業が行われる度に、その時点でのシナリオ通りに第1の並行プログラムを模擬実行することができる。このため、実行結果によって選択内容の妥当性を確認したり、プログラム中のバグを発見することによって、並行プログラムの信頼性とプログラミングの効率が向上する。
【0037】
請求項10記載の発明は、請求項3または6記載のプログラミング支援装置において、前記変換手段が、前記依存関係において実行が先とされた前記セクションの後に、プロセス間の同期を実現するための第1の命令を挿入し、当該依存関係において実行が後とされた前記セクションの前に、前記第1の命令に対応する第2の命令を挿入することによって、前記変換を行うように構成されたことを特徴としている。
【0038】
請求項10記載の発明によれば、セクション間の指定された先行制御が、プロセス間の同期信号によって容易かつ確実に実現される。
【0039】
請求項11記載の発明は、請求項5または8記載のプログラミング支援装置において、前記拡張手段が、前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、前記変換手段が、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成されたことを特徴としている。
【0040】
請求項11記載の発明によれば、実行経路(シナリオ)が各プロセスに対応して分解され、プロセス毎のシナリオが生成される。このプロセス毎のシナリオについて、冗長な部分が削除されることにより最適化され、最適化された各シナリオに基づいて第2の並行プログラムが生成される。このように、プロセス毎にシナリオを最適化することにより無害な非決定性を導入することができ、容易に第2の並行プログラムを生成することができる。
【0041】
請求項12記載の発明は、請求項5または8記載のプログラミング支援装置において、前記拡張手段が、前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、前記変換手段が、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成され、前記分解手段が、前記実行経路を分解する際に、前記各実行経路に対し該実行経路間の同期をとるための同期命令を付加するように構成され、前記削除手段が、前記同期命令のうち冗長な同期命令を除去するように構成されたことを特徴としている。
【0042】
請求項12記載の発明によれば、実行経路(シナリオ)が各プロセスに対応して分解され、プロセス毎のシナリオが生成される。このとき、分解された個々のシナリオの集合から最初のシナリオが再現できるように、各シナリオに対しシナリオ間の同期をとるための同期制約が付加される。また、このプロセス毎のシナリオについて、冗長な部分、すなわち冗長な同期制約が除去されることにより、最適化される。この最適化により、無害な非決定性が導入される。このように、プロセス毎にシナリオを最適化することにより無害な非決定性を導入することができ、容易に第2の並行プログラムを生成することができる。
【0043】
請求項13記載の発明は、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、複数のプロセスからなる第1の並行プログラムの各プロセスが、それぞれ複数のセクションからなる場合に、前記複数のセクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成手段と、前記第1の並行プログラムを、前記生成手段によって生成された前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段と、依存関係のないセクション間の分岐を付加することによって前記実行経路を拡張する拡張手段とを具備し、前記拡張手段は、前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、前記変換手段は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成されたことを特徴としている。
【0044】
請求項16記載の発明は、請求項13記載の発明を方法の観点から把握したものであって、並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、コンピュータとそれを制御するソフトウェアにより実現される生成手段、変換手段、拡張手段を用いて、前記生成手段により、複数のプロセスからなる第1の並行プログラムの各プロセスが、それぞれ複数のセクションからなる場合に、前記複数のセクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、前記変換手段により、前記第1の並行プログラムを、前記生成処理によって生成された前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理と、前記拡張手段により、依存関係のないセクション間の分岐を付加することによって前記実行経路を拡張する拡張処理とを具備し、前記拡張処理は、前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解処理と、前記プロセス毎の実行経路について、冗長な部分を削除する削除処理とを有し、前記変換処理は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成することを特徴としている。
【0045】
請求項13、16記載の発明によれば、プロセスが複数のセクションで表され、これら複数のセクションのあり得る実行順序がセクション間の分岐を用いて表された実行経路(シナリオ)が生成される。そして、このシナリオが各プロセスに対応して分解され、プロセス毎のシナリオが生成される。このプロセス毎のシナリオについて、冗長な部分が削除されることにより最適化され、最適化された各シナリオに基づいて第2の並行プログラムが生成される。このように、プロセス毎にシナリオを最適化することにより無害な非決定性を導入することができ、容易に第2の並行プログラムを生成することができる。
【0046】
請求項14記載の発明によるプログラミング支援装置は、請求項13記載の発明において、前記分解手段が、前記実行経路を分解する際に、前記各実行経路に対し該実行経路間の同期をとるための同期命令を付加するように構成され、前記削除手段が、前記同期命令のうち冗長な同期命令を除去するように構成されたことを特徴としている。
【0047】
請求項14記載の発明によれば、実行経路(シナリオ)が各プロセスに対応して分解され、プロセス毎のシナリオが生成される。このとき、分解された個々のシナリオの集合から最初のシナリオが再現できるように、各シナリオに対しシナリオ間の同期をとるための同期制約が付加される。また、このプロセス毎のシナリオについて、冗長な部分、すなわち冗長な同期制約が除去されることにより、最適化される。この最適化により、無害な非決定性が導入される。このように、プロセス毎にシナリオを最適化することにより無害な非決定性を導入することができ、容易に第2の並行プログラムを生成することができる。
【0048】
【発明の実施の形態】
次に、本発明の実施の形態の例について図面にしたがって具体的に説明する。なお、実施の形態の各機能は、所定のソフトウェアがコンピュータ及び周辺機器を制御することで実現される。すなわち、本明細書では、発明及び実施の形態を、各機能や各処理に対応する仮想的回路ブロック(「〜手段」や「〜部」など)を想定して説明している。このため、各ブロックに対して、各ハードウェア要素やソフトウェア要素は1対1には対応しない。
【0049】
ここで、本発明の実施の形態では、並行プログラムの開発にあたり、並行プログラムを実行するためのいわゆるターゲットマシンを、並行プログラムを開発するためのいわゆるホストマシンとして用いるものとする。
【0050】
また、本形態では、複数のCPUを用いるいわゆるマルチCPUシステムを用い、各プロセスは共有メモリにアクセスするものとする。図1は、本発明の実施の形態に用いるコンピュータの概念図を示す。すなわち、このコンピュータでは、各プロセッサC1,C2はそれぞれ、プログラムを構成するプロセスP1とP2を同時並行的に実行し、各プロセッサC1,C2は、プロセスP1,P2の内容に応じて、バス及び入出力制御回路Bを経由して、共有メモリMの他、入力装置I、出力装置O、外部記憶装置Sなどの周辺装置にアクセスする。
【0051】
このコンピュータにおいて、典型的には、入力装置Iはキーボードやマウスなどであり、各種コマンドやデータの入力を行う手段である。外部記憶装置Sは、ハードディスク装置、磁気ディスク又は光磁気ディスクなどからなり、ソースプログラムやデバッグ状況に関する情報を書込み又は読み出すことができるようになっている。出力装置Oは、CRT表示装置やプリンタ印字装置などであり、ソースプログラムやデバッグ状況に関する情報等をテキスト又はグラフィック表示等することによりユーザに提供する。ユーザは、これら入力装置I及び出力装置Oを用いて、対話的にコンピュータを操作することができる。但し、コンピュータの規模・構成やCPUの数・形式は自由で、例えば、コンピュータネットワーク、分散処理など各種の構成を自由に用い得る。
【0052】
すなわち、本発明における並行プログラムをターゲットマシンとして実行するコンピュータは、いわゆる並列計算機でもよく、この場合共有メモリの有無は問わない。また、分散ネットワーク計算機システムや単一のCPUにおけるマルチタスクシステムでもよい。なお、単一のCPUにおけるマルチタスクシステムの場合は、1つのCPUに複数のプロセスが存在しうる。
【0053】
また、本発明におけるホストマシンは、ターゲットマシンと異なってもよく(クロス開発環境)、プログラムのシミュレータを有すれば、単一のCPUのみを有するコンピュータでもよい。
【0054】
[1.構成]
本実施の形態は、請求項1〜16に記載のプログラミング支援装置とその方法に対応するものである。
【0055】
本実施の形態は、図1に示したコンピュータ上で実現されるが、態様の一例は、プロセッサC1又はC2上で、本実施の形態の各機能を実現するための単一のプロセスからなるプログラムを実行することである。
【0056】
図2は、本形態の構成を概念的に示す機能ブロック図である。この図に示すように、本装置は、エディタ1、区分手段2、検出手段3、生成手段4、表示手段5、選択手段6、実行手段7、拡張手段8、及び変換手段9を有する。
【0057】
エディタ1は、コンピュータ上で実行される複数のプロセスを含む第1のプログラムを作成・編集するための手段である。区分手段2は、第1のプログラムの各プロセスを実行制御可能なセクションに区分する。この区分は、例えば、第1のプログラムを構成する各プロセスに、割り込み可能なポイント(以下、「シナリオポイント」という)を設定することによって行う。
【0058】
検出手段3は、異なったプロセス間において、各セクション間の依存関係(先行制約)を検出する。検出は、例えば以下のように行う。すなわち、あるプロセスにある対象を変更する命令が検出された場合、他の全てのプロセスにおいて、上記命令と同一の対象の状態によって結果が影響される全ての命令を検出する。そして、上記変更する命令について、影響される全ての命令との間に、依存関係が存在するとみなす。
【0059】
このような場合の依存関係の典型例は、共有メモリの書き込み命令と読み出し命令である。依存関係の他の例は、プロセス間で共有されるフラグを変更する命令と、このフラグに応じて条件判断を行う命令である。逆に、メモリの読み出し命令相互間には依存関係は存在しない場合が一般的と考えられる。また、プロセッサ固有のローカルなメモリのみを処理対象とするサブルーチンは、依存関係検出の対象から除外してよい。
【0060】
生成手段4は、各プロセスの各セクションのありうる実行順序を、セクション間の分岐を用いて表す実行経路(シナリオ)を生成する。シナリオは、並行プログラムについて無限に存在するテストケースの中で、設計者が期待する挙動を表現した本質的なものであり、また、外部との入出力だけでなく、内部の挙動も表現している点で従来技術のテストケースと異なる。すなわち、並行プログラムにおいては、各命令の実行の先後関係に基づいて極めて多数の経路が存在する。そして、すべてのケースのテストは現実的に困難である一方、本質的に意味のある経路は全経路のごく一部である。なお、このシナリオの表現方法は、例えば文献"Structural Testing of Concurrent Programs "(Richard N. Taylor et al,IEEE TRANSACTIONS ON SOFTWARE ENGINEERING, VOL. 18, NO.3, MARCH 1992) に示されているような周知の方法が採用される。
【0061】
このようなシナリオは、例えばネットワーク構造の状態遷移図で表すことができる。状態遷移図では、ある状態を表すノードからは、この状態に後続し得るプロセスの各セクションが、分岐エッジとして次の状態のノードに伸びる。
【0062】
シナリオはツリー構造図で表すこともできるが、同じいくつかの命令が異なった順序で実行された後の経路は合流させても、命令の組み合わせからなる経路の数は減少しない。例えば、ツリー構造において、命令a,b,cにつき、a→b→cという順序で実行する枝とb→a→cという順序で実行する枝とに分れている場合に、それらを実行した後の経路を合流させたとしても、全体の経路の数は変わらない。このため、シナリオとしては、ネットワーク構造の方が理解が容易である。すなわち、これらシナリオ上には、各プロセスの各セクションのあり得る実行順序に対応して、順序と同数の経路が存在するためである。
【0063】
表示手段5は、第1のプログラム及びシナリオ等の各種データを表示する。すなわち、生成手段4によって生成されたシナリオがこの表示手段5に表示される。なお、各種情報を、プリンタなど所望の出力装置から必要に応じて出力するようにしてもよい。
【0064】
選択手段6は、生成手段4によって生成されたシナリオの各分岐のうち、上述した依存関係を有する分岐について上記セクションを選択するための手段であり、具体的には、図1に示すような入力装置1により実現される。すなわち、シナリオが上記表示装置5に表示され、設計者が上記分岐についてセクションを選択すると、選択手段6は、設計者の選択結果としてその選択されたセクションを入力する。
【0065】
実行手段7は、選択手段6によって選択されたセクション間の実行順序に基づいて、第1のプログラムを模擬実行する。この模擬実行の結果は、上記表示手段5に表示されるようになっている。
【0066】
拡張手段8は、上記依存関係に基づいて、上記シナリオと等価な挙動を導出し、それらの挙動が可能となるようにシナリオを拡張する。具体的には、上記シナリオについて、上記依存関係を有しないセクション同士の分岐を付加することによって拡張を行う。これら依存関係のない分岐の付加は、プログラムに、無害な非決定性をもたらす。
【0067】
変換手段9は、拡張手段8によって拡張された上記シナリオに基づき第1のプログラムを変換して第2のプログラムを生成する。すなわち、拡張された上記シナリオに基づいて、選択された順序で一連の各セクションを実行する第2のプログラムに変換する。この変換では、上記シナリオ以外の挙動をしないように抑制する。具体的には、ソースコードに同期命令を埋め込むことにより、挙動の抑制を行う。
【0068】
ここで、拡張手段8と変換手段9の具体的な構成例について示す。図3は、上記拡張手段8の具体的な構成及び拡張手段8と変換手段9との関係を概念的に示す機能ブロック図である。拡張手段8は、シナリオ分解手段11と、シナリオ最適化手段12とを有している。シナリオ分解手段11は、上記シナリオを第1のプログラムに対応させて分解し、プロセス毎のシナリオを生成する。また、シナリオ分解手段11は、単純にシナリオを分解するのではなく、分解した個々のシナリオの集合から最初のシナリオが再現できるように、シナリオ間の同期をとるための情報(同期命令)を付加する。
【0069】
ここで、シナリオが有向グラフで表されている場合のシナリオ分解手段11による分解について説明する。まず、図4及び図5に、シナリオ分解手段11による同期命令を挿入する手順を示す。これらの図において、各プロセスにおける命令の実行を矢印のエッジで表し、命令前後の状態を円形のノードで表している。また、図4は、プロセス間に共有して使用される変数である共有変数がない場合を示し、図5は、プロセス間に共有変数がある場合を示す。
【0070】
まず、図4(a)において、すべてのプロセスが共有変数をアクセスしない動作であるものとすると、同図(b)に示すように、有向グラフの全ての分岐に同期命令を挿入する。すなわち、この図に示すシナリオでは、2つ目のノードで分岐しているため、その分岐の後に同期命令s1,s2を挿入する。次に、図5(a)において、共有変数をアクセスする命令r,wをそれぞれ含むものとする。この場合、同図(b)に示すように、上記各命令r,wの前(または後)に同期命令s0,s3を、分岐の後に同期命令s1,s2を挿入する。
【0071】
以上のようにして同期命令を挿入したものに対して、シナリオ分解手段11は、各プロセス毎にプロセスがもとからもっていた命令と同期命令のみからなるグラフとして、プロセス毎のシナリオを生成する。
【0072】
シナリオ最適化手段12は、第1のプログラムを解析し、プロセス毎のシナリオに冗長な部分があればそれらを除去し、最適化されたシナリオ(最適化シナリオ)を生成する。すなわち、例えば上記同期命令の冗長なものを削除し、必要な同期命令のみを残す。この同期命令の削除は、グラフ縮約ルールを適用することによって行われる。図6及び図7に、このグラフ縮約ルールの一例を示す。図6は、プロセス間に共有変数がない場合を示し、図7は、プロセス間に共有変数がある場合を示す。なお、以下に示すルールを直接プログラムとして表すようにしてもよい。
【0073】
まず、図6において、プロセス間に共有変数がない場合について示す。同図(a)に示すように、命令a1の後に分岐した同期命令s1,s2が挿入されており、その行き先が同じであり、同期命令s1,s2以外に同期命令がない場合、同期命令s1,s2は削除される(rule1)。また、同図(b)に示すように、分岐がない状態で命令a1と命令a2の間に同期命令s1が挿入されており、この同期命令s1以外に同期命令がない場合、この同期命令は削除される(rule2)。更に、同図(c)に示すように、命令a1の後に分岐したループ状の同期命令s1が挿入されており、この同期命令s1以外に同期命令がない場合、この同期命令s1は削除される(rule3)。また、同期をとっている他のプロセス側の同期命令がすべて削除された場合は、対応する同期命令も削除される(rule4)。
【0074】
次に、図7において、プロセス間に共有変数がある場合について示す。同図(a)に示すように、命令a1の後に分岐した同期命令s1,s2が挿入されており、その行き先が同じであり、同期命令s1,s2以外に同期命令がなく、かつ、命令a2が共有変数をアクセスする命令ではない場合、同期命令s1,s2は削除される(rule1)。また、同図(b)に示すように、分岐がない状態で、命令a1と命令a2の間に同期命令s1,s2が挿入されており、これら同期命令s1,s2以外に同期命令がない場合、同期命令s1のみが削除され同期命令s2のみが残される(rule2)。更に、同図(c)に示すように、命令a1の後に分岐したループ状の同期命令s1が挿入されており、この同期命令s1以外に同期命令がない場合、この同期命令s1は削除される(rule3)。また、同期をとっている他のプロセス側の同期命令が削除された場合は、対応する同期命令も削除される(rule4)。
【0075】
上記変換手段9は、最適化シナリオから、シナリオと、そのシナリオから拡張される挙動とのみを再現する第2のプログラムを生成する。具体的には、例えば上記のようにして残した同期命令を第2のプログラムを示すソースプログラムに付加することによって行う。
【0076】
[2.作用及び効果]
上記のような構成を有する本実施の形態におけるプログラミングは、以下のような手順で行われる。ここで、図8は、本実施の形態におけるプログラミングの手順を示すフローチャートである。
【0077】
[プログラムの作成処理]
まず、設計者は、エディタ1を用いて第1のプログラムを作成・入力する(ステップ801)。プログラムの作成は、例えば、対象の並行システムに対し、並行性を用いた自然なモデル化を行い、モデルを構成する各プロセスの構造と挙動とをコーディングすることによって行うことができる。この時点では、この第1のプログラムには、エラーが潜在的に存在する可能性がある。
【0078】
次の表1は、本実施の形態において例として用いる並行プログラムを構成するプロセスP1,P2のソースコードの例である。
【0079】
【表1】
【0080】
この例では、プロセスP1とP2間に何ら制御関係が存在しないので、各プロセスの各命令の実行順序は予測不能な悪い非決定性を帯びている。また、図9は、この時点でのプロセスP1,P2が各プロセッサC1,C2に対応する状態を示す概念図である。
【0081】
[プロセスの区分処理]
このようにプログラムが作成されると、区分手段2が、第1のプログラムの前記各プロセスP1,P2を、実行制御可能なセクションに区分する(ステップ802)。すなわち、区分手段2は、第1のプログラムの各プロセスP1,P2に上述したシナリオポイントを設定することにより区分を行う。
【0082】
このような区分は、各プロセスP1,P2に、割り込み可能なポイントを表すポイント(以下「シナリオポイント」という)を設定することによって行うことができる。シナリオポイントは、例えば各命令の前後に設定すればよく、また、プロセス内部のみでのローカルな一連の処理が存在するときは、その処理の途中ではなく処理の前後にシナリオポイントを設定してもよい。
【0083】
すなわち、シナリオポイントで区切られた区間は割り込み禁止区間であるから、区間の途中で割り込むことはできず、したがって同期信号などによって実行制御を行うことができない。この結果、シナリオポイントで区切られた区間がセクションとなる。ここでは、各命令が1つのセクションを形成するようにシナリオポイントを指定するものとし、以下の説明では命令語そのものをセクション名として用いる。なお、プロセス中の同期命令は割り込みを明示的に発生させるので、自動的にシナリオポイントとなる。
【0084】
[依存関係の検出処理]
次に、検出手段3が、プロセスの各セクション間の依存関係を検出する(ステップ803)。検出された依存関係は所定のメモリ領域に保存する。すなわち、検出手段3は、あるプロセスにある対象を変更する命令を検出すると、他の全てのプロセスにおいて、その対象が変更されることによって結果に影響を受ける全ての命令を検出する。そして、その変更する命令と、上記影響を受ける全ての命令との間に、依存関係が存在するとみなす。
【0085】
例えば、共有メモリに対してあるデータを書き込む書き込み命令を検出した場合、他の全てのプロセスにおいて、そのデータを読み出す読み出し命令を検出する。そして、上記書き込み命令とその読み出し命令との間に依存関係が存在するとみなす。
【0086】
ここでは、共有メモリに関連して
の間に依存関係が検出されたものとする。
【0087】
[シナリオの生成処理]
続いて、生成手段4が、上述したシナリオを生成する(ステップ804)。図10はシナリオの一例であり、表1に例示したプログラムについて実行可能な全ての経路を状態遷移図で表現したシナリオの例である。シナリオを表すこのような状態遷移図をシナリオグラフと呼ぶ。この図では、各命令の実行を矢印のエッジで表し、命令前後の各状態を円形のノードで表している。なお、図10に示すシナリオグラフは、遷移可能な経路を全て表した場合の図であり、そのような経路が10通り存在することを示している。
【0088】
また、本実施の形態におけるシナリオの生成では、各プロセスの各セクションの挙動順序を、依存関係を有するセクション同士の分岐に限定して表す。このようなシナリオの生成では、依存関係を有しないセクション同士の分岐については、いずれかのセクションを生成しない。例えば、図10のノードn12におけるread1とread2の分岐は、read1とread2に依存関係が無いため、いずれが先でも結果は同じである。そのため、例えば、セクションread2のエッジは生成せず、read1のエッジのみ生成する。
【0089】
[分岐の選択処理]
次に、上記のように生成されたシナリオが、表示手段5によって表示される(ステップ805)。このとき、依存関係を有しないセクションについては、上記のようにいずれかの分岐のみが表示されるが、依存関係を有するセクション同士の分岐については、設計者が選択手段6を通じてセクションを選択する(ステップ806)。
【0090】
例えば、図10に示すノードn11においては、init1とread2との間に依存関係がある。その場合、図11に示すように、選択に係るノードn11とセクションinit1,read2のエッジが太線で強調表示されると共に、画面に選択のためのウインドウが表示される。
【0091】
ウインドウにはメッセージと共に選択肢を表すアイコンが表示されており、設計者はマウスのポインタでいずれかのアイコンをポイントし、マウスのボタンをクリックすることによって所望のセクションを選択することができる。ここでは、init1を先に実行するセクションとして選択し、read2を後に実行するセクションとして選択したものとする。すなわち、init1よりread2を先に実行すると初期化の前に読み込むことになり、バグとなるので選択しない。そして、選択されなかったエッジは削除される。図12は、ノードn11からのセクションread2が削除された後のシナリオグラフの状態を示す図である。
【0092】
また、エッジが削除される場合は、削除されたエッジのみを入力とするノードも遷移の可能性がなくなるため生成されない。すなわち、ノードn11においてセクションread2が選択された場合に生成されるはずであったノードn21,n31,n22,n32は生成されない。n12においては、read1とread2に依存関係がないので、そのような場合は、ノードn12における分岐においてread2は省略されread1のエッジのみが生成される。
【0093】
更に、セクション間に実質的に依存関係が存在しない場合や、セクションのいずれが先になる場合もそれぞれ意味のある動作を行う場合は、双方を選択してもよい。図11のウインドウ中のアイコン「双方あり」は、このような選択を入力するためのものである。ここで、図13は、ノードn13についてwrite1とread2から分岐を選択する場合の画面の表示例を示した図である。この状態で「双方あり」のアイコンを選択した場合は、エッジは削除されず、図13に示すような状態のままとなる。
【0094】
[模擬実行処理]
次に、上記のようにして選択を行った結果に基づき、設計者は、実行手段7を用いて第1のプログラムを模擬実行する(ステップ807)。すなわち、設計者は、セクションの選択を行うと、逐次第1のプログラムを模擬実行する。そして、その実行結果は、表示手段7に表示される(ステップ808)。その表示された実行結果により、設計者は第1のプログラム中にバグが存在するか否かを判断し(ステップ809)、バグが存在せず、結果が意図した通りであって、かつ、シナリオの生成処理が終了していない場合は(ステップ810)、設計者はシナリオの生成の処理を続行する(ステップ804)。一方、バグが存在し、結果が意図した通りでない場合は、設計者はエディタ1によって第1のプログラムのバグを修正する(ステップ801)。
【0095】
例えば、図14に示すように、分岐の選択処理(ステップ806)において、ノード13のセクションwrite1,read2の双方が選択されている場合、この時点でシナリオグラフに残っているシナリオは、次の2通りの経路のシナリオsn1,sn2を含む。
【0096】
【表3】
【0097】
【表4】
【0098】
従って、実行手段7は、これら2通りのシナリオsn1,sn2に従って模擬実行を行う。この結果、バグが存在せず、結果が意図した通りである場合、シナリオの生成処理(ステップ804)において、図15に示すようなシナリオが生成される。ここでは、図10に示すノードn23において、セクションwrite1とwrite2に依存関係があり、n11の場合と同様に、セクションwrite1のエッジが選択された場合を示す。
【0099】
このようにして、図15の状態に到達したとき、シナリオグラフに表現されているシナリオは、次の2通りの経路のシナリオsn1,sn2を含む。
【0100】
【表5】
【0101】
【表6】
【0102】
この状態のシナリオは、並行プログラムについて無限に存在するテストケースの中で、設計者が期待する挙動を表現した本質的なものである。
【0103】
[シナリオの拡張処理]
次に、拡張手段8が、上記シナリオについて、依存関係を有しないセクション同士の分岐を付加することによって拡張する(ステップ811)。すなわち、拡張手段8は、検出手段3が検出した依存関係に基づき、依存関係を有していないために生成手段4によって生成されなかったエッジと、そのエッジの遷移先のノードをシナリオグラフ中に復元する。
【0104】
例えば、図15に示すシナリオグラフを拡張した後の状態を図16に示す。この図において、設計者の選択に基づいて残された挙動のエッジを細い実践の矢印で示し、拡張された挙動のエッジを太い実線の矢印で示し、シナリオグラフから削除された結果抑制される挙動のエッジを破線の矢印で示す。すなわち、ノードn12から分岐しているセクションread2と、ノードn22と、そのノードn22から分岐しているセクションread1とが復元される。
【0105】
なお、生成手段4によって生成されなかったエッジ及びノードは、上記のように検出手段3が検出した依存関係に基づいて復元してもよいが、生成手段4がシナリオの原形の生成時にそれらのエッジ及びノードを記録しておき、この記録に基づいて復元するようにしてもよい。すなわち、図17に示すように、生成手段4が所定のメモリ領域に上記エッジを記憶させておき、拡張手段8は、その情報のみを用いて拡張を行う。
【0106】
また、その場合、図16において、削除されたエッジ及び削除されたエッジのみが経由するノードは参考に示したもので、実際にはこれらに関するデータはメモリ上から消去してかまわない。
【0107】
以上のように、依存関係のない分岐の付加により、プログラムに無害な非決定性がもたらされる。このため、変換後の第2のプログラムの非決定性が増大し、プログラムの並列性が向上する。
【0108】
[プログラムの変換処理]
次に、変換手段9が、このように得られたシナリオに基づいて、第1のプログラムを、前記選択に基づく順序で一連の前記各セクションを実行する第2のプログラムに変換する(ステップ812)。
【0109】
このような変換は、依存関係のあるセクション間で、全てのシナリオで実行が先とされたセクションの後に、プロセス間の同期信号の発信命令(送信セマフォア)を挿入し、全てのシナリオで実行が後とされたセクションの前に、上記同期信号の待ち受け命令(受信セマフォア)を挿入することによって行うことができる。これによって、セクション間の指定された先後関係が、プロセス間の同期信号によって容易かつ確実に実現される。
【0110】
図16のシナリオに基づいて得られる第2のプログラムを次に示す。
【表7】
【0111】
また、図18は、表7に示した第2のプログラムの各プロセスが、同期命令によるタイミングに基づいて実行される状態を示す概念図である。この図において、プロセスP2のread2は必ずプロセスP1のinit1の後で実行されるが、これは、図16のノードn11においてinit1が先、read2が後として選択されたことに対応する。
【0112】
また、図18において、プロセスP2のwrite2は必ずプロセスP1のwrite1の後で実行されるが、これは、図16のノードn23においてwrite1が先、write2が後として選択されたことに対応する。
【0113】
また、図18において、プロセスP2のread2について、プロセスP1の各セクションread1,write1のいずれとの間においても、先後関係が非決定的であるが、これは、図16において、read1,write1の前後の各ノードn12,n13,n14のうち、いずれのノードからもread2のエッジが存在することに対応する。これによって、並行プログラムのよい非決定性を含む無害な非決定性が維持される。
【0114】
ここで、拡張手段8及び変換手段9の具体的な処理について説明する。ここでは、図8におけるステップ801〜810において、図19に示すような第1のプログラムが生成されたものとする。すなわち、図19は、その第1のプログラムを構成するプロセスP1,P2のソースコードを示したものである。
【0115】
また、この第1のプログラムに基づいて、図20に示すようなシナリオグラフが生成されたものとする。ここで、命令w0,w1,rは、共有変数をアクセスする命令であるものとする。更に、図21は、拡張手段8及び変換手段9が第2のプログラムを生成する手順を示すフローチャートである。
【0116】
まず、シナリオ分解手段11が、生成されたシナリオに同期命令を挿入する(ステップ2101)。すなわち、図22に示すように、共有変数をアクセスする命令w0,w1,rの前とすべての分岐の後とに同期命令s0〜s3を挿入する。次に、シナリオ分解手段11は、同期命令の挿入されたシナリオを、プロセスP1とP2とに分解する(ステップ2102)。このとき、すべての状態で2つのプロセスP1,P2が同期を取るという強い同期制約の基にシナリオの分解を行う。図23に、分解したシナリオを示す。同図(a)はプロセスP1のシナリオを示し、同図(b)はプロセスP2のシナリオを示す。これら2つのプロセスP1,P2は、同じ名前の同期命令s0〜s3が与えられることにより、同期をとるようになる。
【0117】
次に、シナリオ最適化手段12が、上記シナリオを最適化する(ステップ2103)。すなわち、第1のプログラムを解析し、冗長な同期命令を削除する。具体的には、図23に示す同期命令s0〜s3には冗長性があるため、必要な同期命令のみ残して冗長な同期命令を除去する。このとき、上述した図6及び図7に示すグラフ縮約ルールを適用する。すなわち、図23(b)に示すプロセスP2のシナリオにおいて、図7(c)に示すrule2と図7(c)に示すrule3とに基づいて同期命令s2,s3が削除される。また、図7(b)に示すrule2に基づいて、同期命令s0が削除される。これに対応して、rule4に基づいて、プロセスP1のシナリオにおいて同期命令s0,s2,s3が削除される。
【0118】
以上のようにして最適化されたシナリオグラフの例を、図24に示す。同図において、(a)はプロセスP1の最適化されたシナリオグラフであり、(b)はプロセスP2の最適化されたシナリオグラフである。この場合、同期命令s1のみ残して他の同期命令はすべて削除されている。このような最適化は、すなわち、無害な非決定性の導入を行っていることに対応する。
【0119】
次に、変換手段9が、最終的な並行プログラムである第2のプログラムを生成する(ステップ2104)。このとき、上記シナリオの最適化において残された同期命令を、ソースコードに同期命令sync(<ID>)として埋め込む。すなわち、図24に示す上記同期命令s1を、同期命令sync(s1)として挿入する。図25は、第2のプログラムを示すソースコードである。
【0120】
このように、本実施の形態では、模擬実行によって妥当性を確認したシナリオおよびそれと等価な挙動しか示さないように、並行プログラムが抑制されるので、シナリオで与えた以外の非決定性は排除される。
【0121】
[効果]
以上説明したように、本形態ではプロセスが実行制御可能なセクションに区分され、各プロセスの各セクションのありうる挙動順序がシナリオで表される。このシナリオの各分岐について、先に実行すべきセクションのエッジを残し、他方のセクションの可能性を削除してゆくと、意図する実行順序の組み合わせのみがシナリオ上に残る。このようなシナリオに基づいて、第1のプログラムは、実行タイミング制御の命令の挿入によって第2のプログラムに変換され、第2のプログラムには悪い非決定性が存在しない。
【0122】
このように、本形態では、シナリオ上で実行順序を指定するだけで指定通りのプログラムが得られるので、信頼性の高い並行プログラムを容易に作成することができる。
【0123】
また、本実施の形態では、依存関係が存在しないために選択が不要な分岐については最初からシナリオに含まれないので、シナリオが単純化され理解容易となり、設計者が行う選択の回数も減少するので、プログラミングが効率化される。この場合、依存関係を有しないセクション同士の実行順序は悪い非決定性を生じないので、シナリオに含まれない場合でもプログラムの信頼性は低下しない。
【0124】
更に、本実施の形態では、シナリオを生成しつつシナリオ通りに第1のプログラムを模擬実行することができる。このため、実行結果によって選択内容の妥当性を確認したり、プログラム中のバグを発見することによって、プログラムの信頼性とプログラミングの効率が向上する。
【0125】
[3.他の実施の形態]
なお、本発明は上記実施の形態に限定されるものではなく、実施態様の変更は自由であるから、次に例示するような他の実施の形態をも包含するものである。例えば、プロセス(タスク)やCPUの数は2つには限定されず、自由に定めることができる。
【0126】
また、上述した実施の形態では、依存関係を有しないセクションについては自動的に一方のみが選択されるようにし、依存関係を有するセクションについてのみ設計者が逐次選択するようにしたが、これに限らない。例えば、依存関係を有しないセクションについても、同様に設計者が選択するようにしてもよい。すなわち、ノード毎に設計者が選択を行うようにしてもよい。この場合、分岐の選択の後の拡張処理を不要とすることもできる。
【0127】
または、一旦仮に図10に示すようなシナリオを生成してから、依存関係を有しないセクション同士の分岐について、いずれかのセクションを自動的に削除するようにしてもよい。例えば、上述したように、図10に示すノードn12におけるセクションread1とread2の分岐のように各セクションに依存関係がない場合、図26に示すように、生成手段4は一方のセクション(例えばread2)を削除する。
【0128】
また、依存関係を有する分岐については、例えば図27に示すように、表示手段5が表示画面にシナリオグラフを表示し、設計者がセクションの選択を行う。この場合、選択は、依存関係に係る各セクションに対応するエッジが分岐しているノードを指摘し、いずれかのセクションに係るエッジを設計者が選択することによって行うことができる。図27では、選択に係るノードn11とエッジinit1,read2が太線で強調表示されると共に、画面に選択のためのウインドウが現れている。図28は、ノードn11からのセクションread2が削除された後のシナリオグラフの状態を示す図である。この後、削除されたセクションread2のエッジのみを入力とするノードn21,n31,n22,n32が順次削除される。図29は、これらが順次削除された後のシナリオグラフの状態を示す図である。
【0129】
また、上述したように、設計者がウインドウ中のアイコン「双方あり」を選択した場合は、エッジは削除されない。図30は、ノードn13についてwrite1とread2からの分岐を選択する場合の画面の表示例を示した図である。この状態で「双方あり」のアイコンを選択した場合は、エッジは削除されず、図30の状態のままとなる。更に、設計者がノード23についてwrite2を後として選択し、図31のように削除すると、ノード33もこれにともなって削除される。このようにして、図15に示すようなシナリオグラフの状態となる。
【0130】
更に、このような場合、模擬実行は、設計者がその時点でシナリオグラフに残っている各経路について、エッジの登場順に、エッジに対応するプログラムのセクションの命令をインタプリタ形式で実行することによって実現できる。また、シナリオ上にいくつかの経路が存在するときは、マウスクリックによって模擬実行すべき経路上のエッジを選択するようにしてもよい。
【0131】
また、セクションの単位は命令単位には限定されず、ルーチンや関数など他の単位をセクションとしてもよい。また、シナリオにおいて一つのノードから発する分岐の数は2つには限定されず3つ以上でもよい。また、情報の表示や入力のための画面の表示形式も実施の形態に示したものには限定されず自由に定めることができる。
【0132】
図32は、シナリオの表示や分岐の選択などを行うための画面の他の表示例を示す図である。同図に示す表示画面において、「タスク1」及び「タスク2」のウインドウでは、プログラム中に「snp(1)」等のシナリオポイントが設定されている。また、「グローバル状態グラフ」では、生成されたシナリオのシナリオグラフが表示されている。ここでは、snp4においてsnp5とsnp6との分岐の選択が必要となっており、「分岐選択」のウインドウが表示されている。更に、複数のプロセス間における共通のデータは「共有データ」として表示されている。
【0133】
更に、第2のプログラムにおいて、プロセス間の実行順序を定める手法は、同期信号の発信命令や待ち受け命令には限定されず、特定の処理を実行するためのトークンの授受など、他の手法によって実現してもよい。
【0134】
【発明の効果】
以上説明したように本発明によれば、高信頼な並行プログラムを容易に開発することができる。
【図面の簡単な説明】
【図1】本発明の実施の形態を実現するコンピュータの構成を示す機能ブロック図。
【図2】同実施の形態の構成を概念的に示す機能ブロック図。
【図3】同実施の形態における変換手段9の具体的な構成を示す機能ブロック図。
【図4】同実施の形態におけるシナリオ分解手段11による同期命令の挿入を説明する図。
【図5】同実施の形態におけるシナリオ分解手段11による同期命令の挿入を説明する図。
【図6】同実施の形態におけるグラフ縮約ルールを説明する図。
【図7】同実施の形態におけるグラフ縮約ルールを説明する図。
【図8】同実施の形態におけるプログラミングの手順を示すフローチャート。
【図9】同実施の形態において、当初のプロセスP1,P2が各プロセッサC1,C2に対応する状態を示す概念図。
【図10】同実施の形態において、表1に例示したプログラムについてあり得る全ての経路を状態遷移図で表現したシナリオの例。
【図11】同実施の形態において、ノードn11についてinit1とread2から分岐を選択する場合の画面の表示例を示す図。
【図12】同実施の形態において、ノードn11についてinit1を先として選択したシナリオグラフの状態を示す図。
【図13】同実施の形態において、ノードn13についてwrite1とread2から分岐を選択する場合の画面の表示例を示す図。
【図14】同実施の形態において、ノードn13についてwrite1とread2の双方を選択した場合のシナリオグラフの状態を示す図。
【図15】同実施の形態において、設計者の期待する挙動を表現したシナリオを示す図。
【図16】同実施の形態において、図15のシナリオグラフを拡張した後の状態を示す図。
【図17】同実施の形態において、生成手段4がエッジを記憶させておく例を示す図。
【図18】同実施の形態において、表7に示した第2のプログラムの各プロセスが、同期命令によるタイミングに基づいて実行される状態を示す概念図。
【図19】同実施の形態において、第1のプログラムの例を示すソースコード。
【図20】同実施の形態において、図19に示す第1のプログラムに基づいて生成されたシナリオグラフの例を示す図。
【図21】同実施の形態における拡張手段8及び変換手段9の動作を説明するフローチャート。
【図22】同実施の形態において、同期命令の挿入されたシナリオグラフの例。
【図23】同実施の形態において、分解されたシナリオグラフの例。
【図24】同実施の形態において、最適化されたシナリオグラフの例。
【図25】同実施の形態における第2のプログラムの例を示すソースコード。
【図26】同実施の形態において、ノードn12からの依存関係がない分岐のうち、一方のread2を削除した状態のシナリオグラフを示す図。
【図27】同実施の形態において、表示画面にシナリオグラフを表示し、セクションの選択を行う場合の画面の表示例を示す図。
【図28】同実施の形態において、ノードn11からのセクションread2が削除された後のシナリオグラフの状態を示す図。
【図29】同実施の形態において、ノードn21,n31,n22,n32が順次削除された後のシナリオグラフの状態を示す図。
【図30】同実施の形態において、ノードn13についてwrite1とread2から分岐を選択する場合の画面の表示例を示した図。
【図31】同実施の形態において、ノードn23についてwrite2を後として選択し削除したシナリオグラフの状態を示す図。
【図32】同実施の形態において、シナリオの表示や分岐の選択などを行うための画面の他の表示例を示す図。
【図33】従来技術の問題点を説明するための図
【符号の説明】
C...プロセッサ
P...プロセス
B...バス及び入出力制御回路
I...入力装置
O...出力装置
M...共有メモリ
S...外部記憶装置
1...エディタ
2...区分手段
3...検出手段
4...生成手段
5...表示手段
6...選択手段
7...実行手段
8...拡張手段
9...変換手段
11...シナリオ分解手段
12...シナリオ最適化手段
Claims (16)
- 並行プログラムのプログラムエラーの除去を支援するためのプログラミング支援装置において、
複数のプロセスからなる第1の並行プログラムの各プロセスを複数のセクションに区分する区分手段と、
前記第1の並行プログラムにおける前記複数のセクションのあり得る実行順序の集合を表すネットワーク構造を、前記並行プログラムのある状態を表すノードからこの状態に後続し得るプロセスの各セクションがそれぞれ一つの分岐エッジとして次のノードに伸びるように表し、前記ネットワーク構造の一つの経路が一つのあり得る実行順序を示すように生成する生成手段と、
前記ネットワーク構造の各分岐について前記エッジによって表されるセクションに関するユーザの選択結果として選択されたセクションを入力する入力手段と、
前記第1の並行プログラムを、その第1の並行プログラムについて前記選択されたセクションを選択された実行順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴とするプログラミング支援装置。 - 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、
入力手段を備えたコンピュータとそれを制御するソフトウェアにより実現される区分手段、生成手段、変換手段を用いて、
前記区分手段により、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分処理と、
前記生成手段により、前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、
前記入力手段により、前記生成された実行経路中の分岐についてユーザの選択結果として選択されたセクションを入力する入力処理と、
前記変換手段により、前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理とを具備することを特徴とするプログラミング支援方法。 - 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、
複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分手段と、
前記各プロセスの前記セクションのあり得る実行順序について実行可能な全ての実行経路を、その実行経路の分岐が前記セクションの実行順序となるように生成する生成手段と、
前記生成手段によって生成された前記実行可能な全ての実行経路中の分岐についてユーザの選択結果として選択されたセクションを入力する入力手段と、
前記第1の並行プログラムを、前記選択されたセクションの分岐について選択されたセクションを有する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴とするプログラミング支援装置。 - 前記生成手段は、前記各プロセスの前記各セクションの実行順序を、前記選択の結果が前記第2の並行プログラムによる実行結果に影響を与えるセクション間の分岐に限定して表す実行経路を生成するように構成されたことを特徴とする請求項3記載のプログラミング支援装置。
- 前記実行経路を、前記選択結果が前記第2の並行プログラムによる実行結果に影響を与えないセクション間の分岐を付加することによって拡張する拡張手段を具備することを特徴とする請求項4記載のプログラミング支援装置。
- 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、
複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分手段と、
前記各セクション間の依存関係を検出する検出手段と、
前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成手段と、
前記依存関係を有する分岐についてユーザの選択結果として選択されたセクションを入力する入力手段と、
前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換手段とを具備することを特徴とするプログラミング支援装置。 - 前記生成手段は、前記各プロセスの前記各セクションの実行順序を、前記依存関係を有するセクション間の分岐に限定して表す実行経路を生成するように構成されたことを特徴とする請求項6記載のプログラミング支援装置。
- 前記実行経路を、前記依存関係のないセクション間の分岐を付加することによって拡張する拡張手段を有することを特徴とする請求項7記載のプログラミング支援装置。
- 前記第1の並行プログラムを、前記実行経路上のセクション間の実行順序に基づいて模擬実行する実行手段を具備することを特徴とする請求項3または6記載のプログラミング支援装置。
- 前記変換手段は、前記依存関係において実行が先とされた前記セクションの後に、プロセス間の同期を実現するための第1の命令を挿入し、当該依存関係において実行が後とされた前記セクションの前に、前記第1の命令に対応する第2の命令を挿入することによって、前記変換を行うように構成されたことを特徴とする請求項3または6記載のプログラミング支援装置。
- 前記拡張手段は、
前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、
前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、
前記変換手段は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成されたことを特徴とする請求項5または8記載のプログラミング支援装置。 - 前記拡張手段は、
前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、
前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、
前記変換手段は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成され、
前記分解手段は、前記実行経路を分解する際に、前記各実行経路に対し該実行経路間の同期をとるための同期命令を付加するように構成され、
前記削除手段は、前記同期命令のうち冗長な同期命令を除去するように構成されたことを特徴とする請求項5または8記載のプログラミング支援装置。 - 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援装置において、
複数のプロセスからなる第1の並行プログラムの各プロセスが、それぞれ複数のセクションからなる場合に、前記複数のセクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成手段と、
前記第1の並行プログラムを、前記生成手段によって生成された前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セ クション間に同期命令を挿入する変換手段と、
依存関係のないセクション間の分岐を付加することによって前記実行経路を拡張する拡張手段とを具備し、
前記拡張手段は、
前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解手段と、
前記プロセス毎の実行経路について、冗長な部分を削除する削除手段とを有し、
前記変換手段は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成するように構成されたことを特徴とするプログラミング支援装置。 - 前記分解手段は、前記実行経路を分解する際に、前記各実行経路に対し該実行経路間の同期をとるための同期命令を付加するように構成され、
前記削除手段は、前記同期命令のうち冗長な同期命令を除去するように構成されたことを特徴とする請求項13記載のプログラミング支援装置。 - 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、
入力手段を備えたコンピュータとそれを制御するソフトウェアにより実現される区分手段、検出手段、生成手段、変換手段を用いて、
前記区分手段により、複数のプロセスからなる第1の並行プログラムの各プロセスを複数の制御可能なセクションに区分する区分処理と、
前記検出手段により、前記各セクション間の依存関係を検出する検出処理と、
前記生成手段により、前記各プロセスの前記セクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、
前記入力手段により、前記依存関係を有する分岐についてユーザの選択結果として選択されたセクションを入力する入力処理と、
前記変換手段により、前記第1の並行プログラムを、前記選択されたセクションの分岐からなる前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理とを具備することを特徴とするプログラミング支援方法。 - 並行プログラムのプログラムエラーの検出を支援するためのプログラミング支援方法において、
コンピュータとそれを制御するソフトウェアにより実現される生成手段、変換手段、拡張手段を用いて、
前記生成手段により、複数のプロセスからなる第1の並行プログラムの各プロセスが、それぞれ複数のセクションからなる場合に、前記複数のセクションのあり得る実行順序の全てを、前記セクション間の分岐を用いて表す実行経路を生成する生成処理と、
前記変換手段により、前記第1の並行プログラムを、前記生成処理によって生成された前記実行経路に基づいて前記セクションを一定の順序で実行する第2の並行プログラムに変換するために、各セクション間に同期命令を挿入する変換処理と、
前記拡張手段により、依存関係のないセクション間の分岐を付加することによって前記実行経路を拡張する拡張処理とを具備し、
前記拡張処理は、
前記実行経路を前記各プロセスに対応させて分解し前記プロセス毎の実行経路を生成する分解処理と、
前記プロセス毎の実行経路について、冗長な部分を削除する削除処理とを有し、
前記変換処理は、前記冗長な部分が削除された各実行経路に基づいて、前記第2の並行プログラムを生成することを特徴とするプログラミング支援方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP34705396A JP3641090B2 (ja) | 1995-12-26 | 1996-12-26 | プログラミング支援装置とその方法 |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP33878395 | 1995-12-26 | ||
JP7-338783 | 1995-12-26 | ||
JP34705396A JP3641090B2 (ja) | 1995-12-26 | 1996-12-26 | プログラミング支援装置とその方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH09237191A JPH09237191A (ja) | 1997-09-09 |
JP3641090B2 true JP3641090B2 (ja) | 2005-04-20 |
Family
ID=26576208
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP34705396A Expired - Fee Related JP3641090B2 (ja) | 1995-12-26 | 1996-12-26 | プログラミング支援装置とその方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3641090B2 (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3675623B2 (ja) * | 1997-10-31 | 2005-07-27 | 株式会社東芝 | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 |
JPH11175369A (ja) * | 1997-12-10 | 1999-07-02 | Toshiba Corp | プログラム開発支援装置、プログラム開発支援方法及びプログラム開発支援プログラムを記録した媒体 |
JP2000242478A (ja) | 1999-02-15 | 2000-09-08 | Internatl Business Mach Corp <Ibm> | 実行可能性判定装置およびその方法 |
JP4414373B2 (ja) | 2005-06-30 | 2010-02-10 | 富士通株式会社 | プログラムの検証プログラム、プログラムの検証装置、プログラムの検証方法 |
US8176496B2 (en) * | 2007-10-02 | 2012-05-08 | Nec Laboratories America, Inc. | Partial order reduction using guarded independence relations |
-
1996
- 1996-12-26 JP JP34705396A patent/JP3641090B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH09237191A (ja) | 1997-09-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Abdulla et al. | Stateless model checking for TSO and PSO | |
US6067415A (en) | System for assisting a programmer find errors in concurrent programs | |
US5809283A (en) | Simulator for simulating systems including mixed triggers | |
JP2795244B2 (ja) | プログラムデバッグシステム | |
US7055065B2 (en) | Method, system, and computer program product for automated test generation for non-deterministic software using state transition rules | |
Ben-Ari | Principles of concurrent and distributed programming | |
US6598222B2 (en) | Programming method for concurrent programs and program supporting apparatus thereof | |
US5784593A (en) | Simulator including process levelization | |
JP2010134614A (ja) | 並列化処理方法、システム、及びプログラム | |
US5960182A (en) | Hardware-software co-simulation system, hardware-software co-simulation method, and computer-readable memory containing a hardware-software co-simulation program | |
US8701084B1 (en) | Preview of auto-fix changes to software code | |
JP4050339B2 (ja) | 並行プログラム作成支援装置及び並行プログラム作成方法並びに並行プログラム実行装置 | |
Huang et al. | A framework for reliability-aware embedded system design on multiprocessor platforms | |
JP3641090B2 (ja) | プログラミング支援装置とその方法 | |
JP3675623B2 (ja) | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 | |
US6581029B1 (en) | Method and system for optimizing execution of a collection of related module sequences by eliminating redundant modules | |
JP4370335B2 (ja) | Lsi解析プログラム、該プログラムを記録した記録媒体、lsi解析装置、およびlsi解析方法 | |
US5956511A (en) | Program development support apparatus, program development support method, and storage medium therefor | |
Melikov et al. | System of designing test programs and modeling of the memory microcircuits | |
JP3278588B2 (ja) | プログラム開発支援装置及びプログラム開発支援方法 | |
JP5001126B2 (ja) | ハードウェア検証用プログラミング記述生成装置、ハードウェア検証用プログラミング記述生成方法、制御プログラムおよび可読記録媒体 | |
JP5067705B2 (ja) | 異常系テスト支援装置、異常系テスト支援方法、及びプログラム | |
JP6692510B1 (ja) | 解析装置、方法、及びプログラム | |
JP4569284B2 (ja) | 集積回路のデバッグ方法、デバッグプログラム | |
JP6600888B2 (ja) | 並列化コンパイラ、並列化コンパイル装置、及び並列プログラムの生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040921 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20041122 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20050118 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050120 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080128 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090128 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100128 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110128 Year of fee payment: 6 |
|
LAPS | Cancellation because of no payment of annual fees |