(57)【要約】【課題】プログラマブルコントローラのソフトウェア開発で、コーディング・コンパイル・転送・デバッグの一連の作業を繰り返す過程において、ソースコードの変更量に見合った機械語オブジェクトの転送を実施することにより作業者の待ち時間を短縮させ、デバッグ効率を向上させる。【解決手段】フロントエンドコンパイラはソースコードと中間コードの対応情報である第１の対応表を、バックエンドコンパイラは中間コードと機械語オブジェクトの対応情報である第２の対応表を作成し、ソースコードの部分的な変更が生じた場合は第１、第２の対応表に基づいて該当部分の機械語オブジェクトを生成する。【選択図】図1
2007188366.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードの局部的な変更を処理することが大部分であるコンパイル装置おいて、
ソースコードから中間コード、及びソースコードと該中間コードの対応情報である第１の対応表を生成するフロントエンドコンパイラと、
該中間コードから実行形式である第１の機械語オブジェクト、及び該中間コードと該第１の機械語オブジェクトの対応情報である第２の対応表を生成するバックエンドコンパイラとを備え、
前記フロントエンドコンパイラは前記ソースコードの部分的な変更を実施したときに前記第１の対応表に基づいて変更箇所、或は変更箇所を含む所定の範囲のみを更新した前記中間コードを生成し、
前記バックエンドコンパイラは前記中間コードの部分的な変更が生成されたときに前記第２の対応表に基づいて変更箇所、或は変更箇所を含む所定の範囲のみを更新した第２の機械語オブジェクトを生成する、
ことを特徴とするコンパイル装置。
【請求項２】
請求項１に記載のコンパイル装置おいて、
前記第１の機械語オブジェクトをオブジェクトの実行部であるターゲットに通信する手段と、
前記第２の機械語オブジェクトをオブジェクトの実行部であるターゲットに通信する手段を備え、
前記ソースコードの局部的な変更により生じた前記第１の機械語オブジェクトの変更部分を前記第２の機械語オブジェクトに置き換える、
ことを特徴とするコンパイル装置。
【請求項３】
請求項１または請求項２に記載のコンパイル装置おいて、
前記バックエンドコンパイラは前記第１の機械語オブジェクトと前記第１の対応表と前記第２の機械語オブジェクトを前記ターゲット上に直接生成すること、
を特徴とするコンパイル装置。
【請求項４】
請求項１乃至請求項３のいずれかに記載のコンパイル装置において、
前記中間コードは演算子とオペランドを一組で構成すること、
を特徴とするコンパイル装置。
【請求項５】
請求項１乃至請求項４のいずれかに記載のコンパイル装置において、
前記機械語オブジェクトは演算子と等価の処理をする処理部と、オペランドとしてアドレス或は数字という情報を所有するデータ部と、該データ部の実行をとばし次の処理部を実行させるJUMP命令部で構成すること、
を特徴とするコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラのソフトウェア開発におけるソースコードのコンパイル方法に関り、ターゲットへの転送情報を制御することによりコンパイルや転送待ち時間を低減させて、デバッグ効率を向上させるコンパイル装置に関する。
【背景技術】
【０００２】
プログラマブルコントローラのソフトウェア開発では、コーディング・コンパイル・転送・デバッグを繰り返し実施する。デバッグ作業中に、ソースコード上に不具合があった場合は、ソースコードを修正（コーディング）した後にコンパイル・転送・デバッグを実施する。大概の不具合は部分的な修正で対応可能であるが、部分的な変更であっても、ある程度纏まった単位（１つのソースファイル）で、コンパイル・転送する必要がある。そのためコンパイルや転送に時間が掛かる。また転送するためにはデバッグを途中で止める必要があるので、デバッグ作業を効率良く実施できない。
【０００３】
コンパイル装置としては、例えば特許文献１に記載されたものが知られている。特許文献１に記載されたコンパイル装置のコンパイラは、オブジェクトファイルの他に定数情報ファイルを生成する。この定数情報ファイルはリソース位置・配置先アドレス・データ型・定数データを保持する。ソースコード（ソースファイル）における定数変更の際には、定数情報ファイルの定数データを変更することによりオブジェクトファイルの該当箇所を更新可能とし、ソースコードを全てコンパイルしてからオブジェクトファイルを生成する必要がないのでコンパイルや転送時間の短縮を可能としている。
【特許文献１】特開２００３−３３０７２９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
上記特許文献１は、図１０に示すようなコンパイラ装置のブロック構成図になっている。定義ファイル３Ａはコンパイラ装置１１Ａ内の定義ファイルであり、オブジェクトファイル１Ａ及びソースファイル２Ａのそれぞれの構造および両者の関係を定義している。コンパイラ４Ａは、ソースファイル２Ａを変換してオブジェクトファイル１Ａと定数情報ファイル６Ａとを自動生成するようになっている。すなわち、コンパイラ４Ａは、ソースファイル２Ａを変換してオブジェクトファイル１Ａを生成する際に、ソースファイル２Ａから定数データを自動的に定数情報ファイル６Ａとしてオブジェクトファイル１Ａから分離して生成する。その後、通信手段５Ａは、コンパイラ４Ａにより生成されたオブジェクトファイル１Ａおよび定数情報ファイル６Ａをターゲットマシン１２Ａ上に転送する。定数情報ファイル６Ａは、通信手段５Ａによって、ターゲットマシン１２Ａ上に定数データ７として展開される。
【０００５】
このように従来の技術においては、ソースファイルをコンパイルする際に、定数情報を分離生成することにより、定数情報ファイルのみの変更を可能にしたが、定数変更の処理に限定されており、他の変更部分に言及した従来技術はない。
【０００６】
本発明は上記を鑑み、ユーザがソースコードを修正したときの対応を、定数データに限定せずに対応できるコンパイル装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記の課題を解決する手段として、本発明は以下のように構成する。
【０００８】
第１に、ソースコードの局部的な変更を処理することが大部分であるコンパイル装置は、ソースコードから中間コード、及びソースコードと該中間コードの対応情報である第１の対応表を生成するフロントエンドコンパイラと、該中間コードから実行形式である第１の機械語オブジェクト、及び該中間コードと該第１の機械語オブジェクトの対応情報である第２の対応表を生成するバックエンドコンパイラとを備え、前記フロントエンドコンパイラは前記ソースコードの部分的な変更を実施したときに前記第１の対応表に基づいて変更箇所、或は変更箇所を含む所定の範囲のみを更新した前記中間コードを生成し、前記バックエンドコンパイラは前記中間コードの部分的な変更が生成されたときに前記第２の対応表に基づいて変更箇所、或は変更箇所を含む所定の範囲のみを更新した第２の機械語オブジェクトを生成するように構成する。
【０００９】
第２に、コンパイル装置は、前記第１の機械語オブジェクトをオブジェクトの実行部であるターゲットに通信する手段と、前記第２の機械語オブジェクトをオブジェクトの実行部であるターゲットに通信する手段を備え、前記ソースコードの局部的な変更により生じた前記第１の機械語オブジェクトの変更部分を前記第２の機械語オブジェクトに置き換えるように構成する。
【００１０】
第３に、コンパイル装置は、前記バックエンドコンパイラは前記第１の機械語オブジェクトと前記第１の対応表と前記第２の機械語オブジェクトを前記ターゲット上に直接生成するように構成する。
【００１１】
第４に、コンパイル装置で、前記中間コードは演算子とオペランドを一組で構成する。
【００１２】
第５に、コンパイル装置で、前記機械語オブジェクトは演算子と等価の処理をする処理部と、オペランドとしてアドレス或は数字という情報を所有するデータ部と、該データ部の実行をとばし次の処理部を実行させるJUMP命令部で構成する。
【発明の効果】
【００１３】
本発明により、ソースコードの変更部分を対応表を用いることにより、定数データに限らず安易に分離可能とし、その結果、コンパイルや転送待ち時間を低減させて、デバッグ効率を向上が図られる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明を実施するための最良の形態について、図面を参照しながら説明する。
【００１５】
まず図1、２及び図３〜５を用いて、動作の概略を説明する。その後、図６〜９を用いて具体的な変更動作を説明する。
【００１６】
始めにソースコードを完全コンパイルする場合を説明する。図１に示す通り、基本構成はソースコード１から機械語オブジェクト４を生成するコンパイル装置１００と、コンパイルされた機械語オブジェクト４を実行するターゲット２００からなる。
【００１７】
まずフロントエンドコンパイラ１０１がソースコード１から中間コード２と対応表（ソース−中間コード）３を生成する。対応表（ソース−中間コード）３とは、ソースコード１と中間コード２の対応情報である。続いてバックエンドコンパイラ１０２は、中間コード２から機械語オブジェクト４と対応表（中間コード−機械語オブジェクト）５を生成する。対応表（中間コード−機械語オブジェクト）５とは、中間コード２と機械語オブジェクト４の対応情報である。生成後、通信手段１０３は、機械語オブジェクト４をターゲット２００に送り、ターゲット２００は内臓するスイッチなどのトリガー、或いは図示しない外部から命令されると機械語オブジェクト４を実行する。外部とは、例えば、デバッグ開発環境であったり、ネットワークに接続されている端末であったりする。
【００１８】
図１の中間コード２の一例は、例えば、図３の中間コード４００であり、演算子４０１とオペランド４０２を一組としたニーモニック言語で構成する。演算子４０１は演算の処理命令であり、オペランド４０２はアドレスや数値等の情報である。機械語オブジェクト４の一例は、図４の機械語オブジェクト５００であり、処理部５０１とJUMP命令部５０２とデータ部５０３を一組としたデータの羅列で構成される。処理部５０１は演算子４０１、データ部５０３はオペランド４０２と対応する。機械語オブジェクト５００は、内部処理の流れＥＸで示すように矢印方向に逐次実行されるが、データ部５０３は実行内容を保持しないのでJUMP命令部５０２により次の処理部の実行に遷移する。例えば、JUMP命令部５０２は遷移先の情報（Ｌ１バイト）を保持しており、JUMP命令部５０２が実行されるとＬ１バイト目の処理部５１１の処理の先頭に遷移する。このようにして、処理部５０１、JUMP命令部５０２、処理部５１１、JUMP命令部５１２、処理部５２１、JUMP命令部５２２の順に実行される。
【００１９】
対応表（中間コード−機械語オブジェクト）５の一例は、例えば、図５の対応表（中間コード−機械語オブジェクト）６００であり、行レベルで構成する。「Ｍ  Ｌ  Ｌ１  ・・・」の行は、中間コード４００のＭ行目が機械語オブジェクト５００のＬバイト目から始まり、JUMP命令部に至ったら次の処理はＬ１バイト目から実行するという情報を少なくとも含む対応表である。
次に上記の状態でソースコードを部分的に変更する場合を説明する。図２において、ソースコード（変更）１Ｎとはユーザにより部分変更されたソースコード１を指す。フロントエンドコンパイラ１０１がソースコード（変更）１Ｎと対応表（ソース−中間コード）３から中間コード（変更）２Ｎと対応表（変更）（ソース−中間コード）３Ｎを生成する。フロントエンドコンパイラ１０１は、対応表（ソース−中間コード）３とソースコード（変更）１Ｎを比較し対応部分の無い箇所が変更されたと判別する。続いてバックエンドコンパイラ１０２は、中間コード（変更）２Ｎと対応表（中間コード−機械語オブジェクト）５から機械語オブジェクト（差分）６と対応表（変更）（中間コード−機械語オブジェクト）５Ｎを生成する。バックエンドコンパイラ１０２は、対応表（中間コード−機械語オブジェクト）５と中間コード（変更）２Ｎを比較し対応部分の無い箇所が変更されたと判別する。ここで機械語オブジェクト（差分）６は、変更されたと判別された箇所だけの機械語オブジェクトであると共に、機械語オブジェクト４を変更する箇所の位置情報も具備する。生成後、通信手段１０３は、機械語オブジェクト（差分）６をターゲット２００に送り、ターゲット管理部２０１は機械語オブジェクト４に対して機械語オブジェクト（差分）６の変更する箇所の位置情報に従って、対応する機械語オブジェクトを更新し、機械語オブジェクト（変更）4Ｎを生成する。ターゲット２００は外部から命令されると機械語オブジェクト（変更）４Ｎを実行する。
【００２０】
便宜上Ｎを付けて区別した、対応表（変更）（ソース−中間コード）３Ｎ、対応表（変更）（中間コード−機械語オブジェクト）５Ｎ、機械語オブジェクト（変更）４Ｎは、次回の部分的な変更処理のフェーズでは、それぞれ対応表（ソース−中間コード）３、対応表（中間コード−機械語オブジェクト）５、機械語オブジェクト４となり、新たなソースコード（変更）１Ｎに対して処理を行う。
【００２１】
また、ここではバックエンドコンパイラ１０２は、機械語オブジェクト（差分）６と対応表（変更）（中間コード−機械語オブジェクト）５Ｎをコンパイル装置１００内に生成しているが、これは発明を限定するものではなく、例えば、バックエンドコンパイラ１０２は通信手段１０３を具備しており、直接ターゲット２００上にファイルを生成しても構わない。
以上において動作の概略を説明したが、更に具体的な変更動作を説明する。
【００２２】
図６は、バックエンドコンパイラ１０２が機械語オブジェクトと対応表（中間コード−機械語オブジェクト）を生成する手順を説明している。
【００２３】
ステップＳ１では、新規に機械語オブジェクトを生成するため、機械語オブジェクトを書き出すファイルの内容を消去する。対応表（中間コード−機械語オブジェクト）の作成に必要な機械語オブジェクトの書き出し先インデックスを初期化する。
【００２４】
ステップＳ２では、中間コードファイルを開く。また、対応表（中間コード−機械語オブジェクト）の作成に必要な中間コードの行インデックスを初期化する。
【００２５】
ステップＳ３では、開いた中間コードを一行単位で読み込む。行インデックスを任意の規則に従って更新する。例えば、行インデックスを1増加させる。
【００２６】
ステップＳ４では、読み込んだ中間コードから、演算子とオペランドを解釈する。演算子とオペランドからそれと等価な複数の機械語命令（処理部とデータ部）を生成する。生成したデータ部の機械語オブジェクトの大きさからJUMP先アドレスを算出し、機械語命令（JUMP命令部）を生成する。
【００２７】
ステップＳ５では、生成した機械語命令（処理部、JUMP命令部、データ部）を機械語オブジェクトファイルに書き出す。
【００２８】
ステップＳ６では、書き出し先インデックスと行インデックスとJUMP命令の位置を、対応表（中間コード−機械語オブジェクト）に記述する。
【００２９】
ステップＳ７は、機械語オブジェクトの大きさ分、書き出し先インデックスを増加し、更新する。
【００３０】
ステップＳ８は、中間コードがまだファイル内に存在するか判断し、まだ中間コードファイル内に中間コードが存在する場合は、ステップＳ３から処理を継続する。機械語オブジェクトに変換する中間コードが中間コードファイル内に存在しない場合は、処理を終了する。
【００３１】
次に部分的変更が行われた場合のステップ３〜ステップ４の処理をより詳細に説明する。動作の概略で説明した通り、中間コード（変更）２Ｎと対応表（中間コード−機械語オブジェクト）５から機械語オブジェクト（差分）６と対応表（変更）（中間コード−機械語オブジェクト）５Ｎを生成する。この際に中間コード２から中間コード（変更）２Ｎに変更されたコード内容によって以下の３つの処理に大別される。
【００３２】
処理１）オペランドだけの変更
処理２）演算子の変更
処理３）それ以外の変更
それぞれについて以下に説明する。
処理１）オペランドは、機械語オブジェクトのデータ部に対応する。オペランドだけの変更のときは、図７に示すように、対応するデータ部を変更することにより機械語オブジェクトの変更可能である。オペランド変更の一例は、中間コードで「ADD  10」を「ADD  100」に変更した場合等である。この変更はソースコード上では定数の変更に相当し、デバッグ作業中ではパラメータの調整等を含め変更の可能性が多い部分である。
【００３３】
ところで、機械語オブジェクト（差分）６の具備する変更する箇所の位置情報とは、これは機械語オブジェクト（差分）６の内容がそれぞれ機械語オブジェクト４の何処に対応するかの情報である。例えば、「ADD  10」を「ADD  100」に変更するときは、「10」の位置情報を始点のアドレスと終点のアドレス、或いは始点のアドレスとアドレス長さのように、変更箇所を特定できる情報を少なくとも保持しているものとする。
【００３４】
またターゲット２００で機械語オブジェクト４を更新するタイミングは、書き換え対象の機械語オブジェクトが実行中で無ければ更新可とする。
処理２）演算子は、機械語オブジェクトの処理部に対応する。単純に演算子だけの変更のときは、図８に示すように、対応する処理部を変更することにより機械語オブジェクトの変更可能である。演算子の変更の一例は、中間コードで「ADD  10」を「SUB  10」に変更した場合等である。あとは処理１）と同様に、機械語オブジェクト（差分）６の変更する箇所の位置情報に従って更新する。更新のタイミングも同様である。
処理３）処理１と処理２で対応できない場合、処理３を実施する。処理３は、複数の中間コードにまたがって変更された場合の処理である。図９は、例えば、中間コードM行からM+ｎ−１行までのｎ個の中間コードが、新しくｋ個の中間コードに変更された場合を示したものである。図９（ａ）は機械語オブジェクト４、図９（ｃ）は機械語オブジェクト（差分）６、図９（ｂ）及び（ｃ）は機械語オブジェクト４Ｎで、図９（ｄ）は図９（ｂ）（ｃ）を整理した機械語オブジェクト４Ｎに相当する。図９において、内部処理の流れＥＸ１、ＥＸ２、ＥＸ３は、機械語オブジェクトにおける処理は、矢印方向に逐次実行されることを示している。
機械語オブジェクト（差分）６の変更する箇所の位置情報として、例えば始点アドレスにＬバイト、終点アドレスにＬｎバイトが格納されているときに、以下の動作により機械語オブジェクト４から機械語オブジェクト４Ｎに更新される。
（１）機械語オブジェクト４Ｎを新規作成し、機械語オブジェクト４と機械語オブジェクト（差分）６を任意のメモリ上に取り込む。ここでは一例として、機械語オブジェクト４は図９（ａ）のアドレス通りであり、機械語オブジェクト（差分）６は図９（ｃ）のアドレス通りである、始点アドレスがＭバイト、終点アドレスがＭｋバイトで取り込んだものとする。
（２）機械語オブジェクト（差分）６の変更する箇所の位置情報の始点アドレスがＬバイトなので、Ｌバイト目の直前のJUMP命令部、ここでは中間コードのＭ−１行目に相当する機械語オブジェクトのJUMP命令部の情報を更新する（図９（ａ）参照）。JUMP命令部の情報をＬバイトからＭバイトに更新する。
（３）機械語オブジェクト（差分）６の終点アドレスがＭｋバイトなので、Ｍｋバイト目の直前のJUMP命令部、ここでは中間コード（変更）のＡ＋ｋ−１行目に相当する機械語オブジェクトのJUMP命令部の情報を更新する（図９（ｃ）参照）。
JUMP命令部の情報をＭｋバイトからＬｎバイトに更新する。
（４）以上（１）〜（３）の動作で、機械語オブジェクト４Ｎが生成されるが（図９（ｂ）、（ｃ）参照）、必要に応じてバイト情報を更新する。例えば、Ｌバイト目からＬｎバイト目は未使用の領域となるので削除しても構わない。この場合は、JUMP命令部からのJUMP先が全て順方向になるように整理すると、図９（ｄ）のようになる。
【００３５】
なお上記図７〜９は命令実行のイメージであり、実際のメモリにおける機械語オブジェクトの配置状況を説明しているものではない。よって実際のメモリ上での配置を制限するものではなく、内部処理の流れ通りに実施されれば構わない。
【００３６】
以上、本発明により定数データに限らずソースコードの変更部分を対応表を用いることにより安易に分離可能とし、その結果、部分変更においては機械語オブジェクトの差分だけのコンパイルで済み、また通信時も機械語オブジェクトだけを送信すれば良いから待ち時間を低減させて、デバッグ効率を向上が図られる。
【図面の簡単な説明】
【００３７】
【図１】本発明におけるブロック構成を示す説明図
【図２】本発明における変更処理時のブロック構成を示す説明図
【図３】中間コードの一例を示す説明図
【図４】機械語オブジェクトの一例を示す説明図
【図５】対応表（中間−機械語オブジェクト）の一例を示す説明図
【図６】機械語オブジェクトと対応表（中間コード−機械語オブジェクト）の生成チャートの説明図
【図７】データ部を変更した場合の機械語オブジェクトの変更部分の説明図
【図８】処理部を変更した場合の機械語オブジェクトの変更部分の説明図
【図９】任意の箇所を変更した場合の機械語オブジェクトの変更部分の説明図
【図１０】従来の発明におけるブロック構成を示す説明図
【符号の説明】
【００３８】
１…ソースコード
１Ｎ…ソースコード（変更）
２…中間コード
２Ｎ…中間コード（変更）
３…対応表（ソース−中間コード）
３Ｎ…対応表（変更）（ソース−中間コード）
４…機械語オブジェクト
４Ｎ…機械語オブジェクト（変更）
５…対応表（中間コード−機械語オブジェクト）
６…機械語オブジェクト（差分）
１００…コンパイル装置
１０１…フロントエンドコンパイラ
１０２…バックエンドコンパイラ
１０３…通信手段
２００…ターゲット
４００…中間コード
４０１…演算子
４０２…オペランド
５００…機械語オブジェクト
５０１、５１１、５２１…処理部
５０２、５１２、５２２…JUMP命令部
５０３、５１３、５２３…データ部
ＥＸ、ＥＸ１、ＥＸ２、ＥＸ３…内部処理の流れ
６００…対応表（中間コード−機械語オブジェクト）
１１Ａ…コンパイラ装置
１２Ａ…ターゲットマシン
１Ａ…オブジェクトファイル
２Ａ…ソースファイル
３Ａ…定義ファイル
４Ａ…コンパイラ
５Ａ…通信手段
６Ａ…定数情報ファイル
７Ａ…定数データ
【図１】
2007188366.tif 000003
【図２】
2007188366.tif 000004
【図３】
2007188366.tif 000005
【図４】
2007188366.tif 000006
【図５】
2007188366.tif 000007
【図６】
2007188366.tif 000008
【図７】
2007188366.tif 000009
【図８】
2007188366.tif 000010
【図９】
2007188366.tif 000011
【図１０】
2007188366.tif 000012