(57)【要約】【課題】ターゲット上で高速に実行される機械語オブジェクトを生成するコンパイル装置を提供する。【解決手段】コンパイル時に、フロントエンドコンパイラ１０はソースコード２から変数使用状況表６を生成する。この変数使用状況表６には、行番号・データアクセウす・変数・階層・階層種別の情報が格納される。バックエンドコンパイラ３０は、中間コード４から機械語オブジェクト８を生成する際に、ターゲット上で使用されるアドレスの割り付けを変数使用状況表６の情報を用いて時間効率が改善されるように決定する。【選択図】図１
2009064207.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードから中間コードを生成するフロントエンドコンパイラと、該中間コードから機械語オブジェクトを生成するバックエンドコンパイラとで構成されるコンパイル装置において、
前記フロントエンドコンパイラは、前記ソースコードから前記中間コードを生成するときに、前記ソースコードにおける変数の使用状況として、変数名と該変数のアクセスタイプ（ＲＥＡＤ／ＷＲＩＴＥ）と該変数の実行される階層と該階層の種別との関係を抽出して変数使用状況表を生成し、
前記バックエンドコンパイラは、前記中間コードから前記機械語オブジェクトを生成するときに、変数が連続して読み込まれる際のアドレス割り付けを前記変数使用状況表より判断する、
ことを特徴とするコンパイル装置。
【請求項２】
請求項１に記載のコンパイル装置において、
前記バックエンドコンパイラで、前記変数使用状況表の第１の変数の後続に第２の変数の読み込みがあるときと、該第１の変数の後続に第３の変数の読み込みがあるときは、前記階層と該階層の種別とにより重み付けを行いアドレス割り付けの優先順位を決定することを特徴とするコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラのソフトウェア開発におけるソースコードのコンパイル方法に関り、特にコンパイル時にソースコードの変数のアドレス割り付けを指定し、コンパイル後のオブジェクトファイルのメモリアクセス効率を向上させるコンパイル装置に関する。
【背景技術】
【０００２】
プログラマブルコントローラのソフトウェア開発では、コーディング・コンパイル・転送（送信）・デバッグを繰り返し実施する。通常、支援装置（或いはローダと呼称される）とターゲット（ここでは主にプログラマブルコントローラを指す）との構成（ここでは、プログラマブルコントローラシステムと呼ぶ）、及び制御機器・測定対象機器等（実機を繋がずダミー機器や、シミュレーターの場合もある）を含んだ環境で開発が行われる。ユーザは支援装置上で、ラダー図、リスト、ＳＦＣ（Ｓｅｑｕｅｎｃｉａｌ Ｆｕｎｃｔｉｏｎ Ｃｈａｒｔ）、テキスト記述言語などで代表される言語命令でソースコードを作成する。これらの言語は国際規格ＩＥＣ−６１１３１−３で規程されている。テキスト記述言語としてはＳＴ（Ｓｔｒｕｃｔｕｒｅｄ Ｔｅｘｔ）言語が示されており、この言語は高級構造型のテキスト言語でＣ言語と極めて記述方式が近く、プログラマブルコントローラのソフトウェア開発に不慣れなユーザでもソースコードが作成し易い。ユーザはこれらの言語を用いて作成したソースコードはコンパイル後に、ターゲットに送信し実行される。実行中に不具合があった場合、デバッグ作業となり、該当箇所を特定しソースコードを修正する。再度コンパイル後、ターゲットに送信し実行する。この繰り返し作業により品質の向上に努める。
【０００３】
図７は、支援装置からコンパイルに関する箇所を抜粋した従来のコンパイル装置の概略構成に関して説明するものであり、プログラマブルコントローラシステムの構成を示している。ここでは図示しないが、コンパイル装置１０１にあるソースコード２は、支援装置の入力機能・編集機能を用いてユーザが作成したものである。このソースコード２は、
フロントエンドコンパイラ１１により解釈され、その後、中間コード４として出力される。次に、中間コード４は、バックエンドコンパイラ２１により解釈され、その後、機械語オブジェクト９として出力される。機械語オブジェクト９は通信手段３０により、動作対象のターゲット２００に送信される。ターゲット２００の実行手段４０は、受信した機械語オブジェクト９を実行する。なお、中間コード４を生成せずにソースコード２から直接機械語オブジェクト９を出力するコンパイル装置の構成でもよく、この場合フロントエンドコンパイラ１１・バックエンドコンパイラ２１の区分けは無く、単一のコンパイラとなる。
図８は、ソースコードの一例を示し、図９は、変数宣言の一例を示す。ユーザはこれらを別々に記述するが、通常これらを合わせてソースコードと呼ぶ。図７のソースコード２も、この両方を含む。
【０００４】
図１０は、機械語ニーモニックの一例を示す図である。これは図７の中間コード４の一例であり、図７のフロントエンドコンパイラ１１が、図８のソースコード及び図９の変数宣言を解釈し、字句解析や文字列の置き換え、構文解析などを経て生成する。この中間コード４をバックエンドコンパイラ２１が解釈し機械語オブジェクト９を生成するが、この中で記憶装置のアドレス（レジスタ）の割り当てが行われる。この場合、中間コード４における変数の出現順序にアドレスが割り当てられる場合が多い。また、フロントエンドコンパイラ１１・バックエンドコンパイラ２１と分けずにコンパイルするときは、図９の変数宣言の順番にアドレスが割り当てられる場合が多い。
ところで、図８の例では上述のＳＴ言語を用いたものであり、ソースコードはＣ言語に近い記述となっている。近年、汎用プロセッサを利用したプログラマブルコントローラが増えており、支援装置においても、ＳＴ言語を用いたソースコードの記載が増えている。
メモリ管理に基づいたプログラム実行の高速化方法としては、例えば特許文献１、２に記載されたものが知られている。特許文献１に記載された制御装置では、連続するアドレスが付された制御プログラムを、連続して実行される処理命令が並列に読み出し可能になるように分散して記憶するメモリとその制御方法が示されており、これにより高速化を可能としている。特許文献２に記載されたプログラマブルコントローラでは、ワードアドレスの内容を前回実行時と比較し、一致する場合は内部のデータバッファから読み出すことにより高速化を可能としている。
【特許文献１】特開２００５−３３２３７０号公報
【特許文献２】特開平１１−３９１６０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
従来からプログラム実行の高速化方法としてアドレス割り付けによる効率化等が考えられてきた。例えば、上述のようにコンパイラをフロントエンドコンパイラ・バックエンドコンパイラに分け、中間コードを経由することにより、実際のプログラム実行上に変数が出現した順番でアドレス割り付けが可能である。一方で、単純なコンパイラでは、ソースコードでの変数が出現の順序、或いは変数宣言の順番で変数をアドレスに割り付けるので、キャッシュ利用時やバースト転送における効率が良くなかった。
上記特許文献１は、制御プログラムの連続した命令に着目し、これらの命令を順番に複数の制御プログラムメモリに並列に読み込むことにより実行時の処理命令を高速化している。ここでは、ソースコードとしてＳＦＣ（Sequential Function Chart）やＬＤ（Ladder Diagram）等の命令順に従い上から下に逐次処理していく言語を主な対象とし、この為、命令の出現順序に従いアドレス割り当てている。ところがＳＴ言語等のようにネストが多用される場合、ネスト内の順番を重視した方が読み込み効率が高い場合が多い。また、この方式ではメモリを並列に扱う制御回路が必要になり、既存のプログラマブルコントローラ自体の改造が必要になる。
上記特許文献２は、データの局所性に着目し、プログラマブルコントローラ内におけるキャッシュ効率の向上により高速化を実現している。然しながら、前回の読み込みとの関係についての処理であるため、ＳＴ言語等のようにネストが多用される場合については必ずしも有効では無い。
【０００６】
このように従来の技術においては、ソースコードがＳＴ言語等のような高級構造型の場合の効率化を十分に考慮しておらず、プログラマブルコントローラ本体側のハード構成の変更による創意工夫に留まっている。
本発明は上記を鑑み、ソースコードにおける記述内容とアドレス割り付けを重視した機械語オブジェクト（実行コード）を出力することによりプログラマブルコントローラを高速に実行可能にするコンパイル装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記の課題を解決する手段として、本発明は以下のように構成する。
第１に、ソースコードから中間コードを生成するフロントエンドコンパイラと、該中間コードから機械語オブジェクトを生成するバックエンドコンパイラとで構成されるコンパイル装置において、前記フロントエンドコンパイラは、前記ソースコードから前記中間コードを生成するときに、前記ソースコードにおける変数の使用状況として、変数名と該変数のアクセスタイプ（ＲＥＡＤ／ＷＲＩＴＥ）と該変数の実行される階層と該階層の種別との関係を抽出して変数使用状況表を生成し、前記バックエンドコンパイラは、前記中間コードから前記機械語オブジェクトを生成するときに、変数が連続して読み込まれる際のアドレス割り付けを前記変数使用状況表より判断するように構成する。
第２に、前記バックエンドコンパイラで、前記変数使用状況表の第１の変数の後続に第２の変数の読み込みがあるときと、該第１の変数の後続に第３の変数の読み込みがあるときは、前記階層と該階層の種別とにより重み付けを行いアドレス割り付けの優先順位を決定するように構成する。
【発明の効果】
【０００８】
本発明により、ＳＴ言語のような高級言語構造（ネストの複雑な場合）でも、コンパイル段階でソースコードに適した解析を実行するので、ターゲットにおけるアドレスの割り付けが的確に行われる。結果、機械語オブジェクト（実行コード）の読み出しキャッシュ利用時やバースト転送における効率が良くなり、プログラマブルコントローラの動作速度も向上すると言う効果を奏する。
【発明を実施するための最良の形態】
【０００９】
以下、本発明を実施するための最良の形態について、図面を参照しながら説明する。なお、上記図７及び以下の図において同様な部分については同様の符号を付して説明を省略する。
図１は、本発明のプログラマブルコントローラシステムの構成の一例を示す図である。図７との相違点は、以下の２つの機能を有する点にある。
１つ目は、フロントエンドコンパイラ１０がソースコード２を解釈する際に変数を一覧展開し、中間コード４の他に、変数使用状況表６を生成する機能。
２つ目は、バックエンドコンパイラ２０は機械語オブジェクト８を生成する際に、中間コード４の他に、先に作成した変数使用状況表６を参照し判断する機能。
上記、２つの機能について説明していく前に、変数使用状況表がどのようなものかを説明する。
図２は、変数使用状況表の一例を示したものであり、図１のフロントエンドコンパイラ１０が図８のソースコードから生成したものである。図２において、行番号とは、ソースコードにおける行番号を指す。データアクセスとは変数がアドレスに対するアクセスタイプ（ＲＥＡＤ／ＷＲＩＴＥ）で読み込み（ＲＥＡＤ）／書き込み（ＷＲＩＴＥ）のいずれかを指す。変数は、使用されている変数名を指す。階層とは、ソースコード上のネストの深さを指す。階層種別とはネストの種類を指し、例えばルート上だと先頭（或いは、root）、繰り返しループ内だとfor等で表記する。以上の変数使用状況表では、ソースコードにおける変数の使用状況を示すものであり、同じ変数であっても何回も扱う（図２の変数ｂ、変数CNTを参照）。
【００１０】
次に１つ目の機能の実現方法を説明する。従来のフロントエンドコンパイラ１１と同様に、図１のフロントコンパイラ１０は、ソースコード２を解釈し中間コード４を生成する。この中間コード４を解釈する際に、中間コード４の各行に対して、ソースコード２の各行の情報を関連付けた情報を一時的に生成する。図３は、生成情報付き機械語ニーモニックの一例を示すものである。生成用情報３００として、従来の中間コードの情報の他に、左側から順に、行番号、階層、階層種別の情報を付加する。図４は、図３の情報を用いて変数使用状況表６を生成するフローチャートである。始めに、生成情報付きの中間コードを１行読み込む（ステップＳ４００）。次に、該当行の処理が変数に関わるか判断する（ステップＳ４０２）。変数に関わる場合、生成用情報３００より行番号・階層・階層種別の情報を、中間コードの部分から変数名と命令を抽出する。また、命令の内容より、変数のデータアクセスタイプを特定する。例えば、LD(ロード命令)の場合はＲＥＡＤ、ST（ストア命令）の場合はＷＲＩＴＥとなる（ステップＳ４０４）。これらの情報より、変数使用状況表の１行を出力する（ステップＳ４０６）。その後、或いは、ステップＳ４０２の分岐がNOの場合は、現在の行が最終行か確認し、最終行なら処理を終了し、後続の行がある場合はステップＳ４００以降の処理を繰り返す（ステップＳ４０８）。
【００１１】
最後に２つ目の機能の実現方法を説明する。従来のフロントエンドコンパイラ２１と同様に、図１のバックエンドコンパイラ２０は、中間コード４を解釈し機械語オブジェクト８を生成する。この際に、変数をターゲット固有のアドレスに割り付けるが、この割り付けを変数使用状況表６を用いて最適化する。このアドレスの割り付け方法の違いが、従来の機械語オブジェクト９と図１の機械語オブジェクト８の相違点になる。図５は、変数使用状況表６を利用して最適なアドレスを割り付けるフローチャートである。始めに、変数使用状況表６を１行読み込む（ステップＳ５００）。次に、該当行の変数のデータアクセスがＲＥＡＤか判断する（ステップＳ５０２）。ＲＥＡＤ（YES）の場合、対象の変数が既に登録されているか判断する（ステップＳ５０４）。登録済みでない（NO）の場合は、前の変数を割り付けた直後のアドレスに登録する。ここで前の変数とは、後述のステップＳ５１０で設定する情報であり、処理の当初においては前の変数が存在しないので、任意のアドレスに登録する（ステップＳ５０６）。また、前の変数との関係情報として、階層・階層種別を記憶する。但し、前の変数が無い場合や、前の変数と階層が異なる場合は記憶しない（ステップＳ５０８）。続いて、現在処理している変数を、前の変数として記憶する。この際、階層・階層種別も記憶する（ステップＳ５１０）。その後、現在の行が最終行か確認し、後続の行があり（NO）の場合はステップＳ５００以降の処理を繰り返す（ステップＳ５１２）。最終行（YES）の場合、以上の処理で登録された変数において、同一の変数に複数の変数が登録されていないか判断する（ステップＳ５１４）。複数の変数が登録されていない（NO）場合は処理を終了し、複数の変数が登録されている（YES）場合は階層・階層種別から優先順位を決める。ここで階層・階層種別は、ソースコードにおけるブロック（ここではネストと同じ意味）であり、繰り返し命令（for、while等）や条件文（if等）の処理で囲まれた範囲を指す。同一ブロック内の変数は、短時間に読み書きが繰り返し処理される場合が多く、アドレス上で連続に配置すると、キャッシュやバースト転送の面からも速度向上の一助となる。なお、forやwhile、if等の命令や引数に対して順位付けをし、更に優先度を決めても構わないが、細かいチューニング作業となるので、ここでは同一ブロック内における変数では、より階層の深いブロックにおける変数を優先するものとする。優先順の低い変数は、優先順位の高い変数の直後に登録し直す（ステップＳ５１６）。以上で処理を終了するが、ステップＳ５０２においてＲＥＡＤでない（NO）場合は、ステップＳ５１２に、ステップＳ５０４において変数が登録済み（YES）の場合はステップＳ５１０の処理に遷移する。
【００１２】
図６は、変数使用状況表６を利用して図５の変数のアドレスを割り付ける方法の一例を模式的に示したものである。変数使用状況表６が読み込まれると、始めに変数ｂが登録され（ステップＳ５０６）、前の変数として記憶される（ステップＳ５０８）。この状態は図６（１）になる。次の１行において変数ｃが読み込まれ、登録される（ステップＳ５０６）。また、前の変数ｃとの関係として変数ｃの情報である階層：１、階層種別root（先頭）が登録される（ステップＳ５０８）。この状態は図６（２）になる。次の１行おいて変数ａが読み込まれるが、データアクセスがＲＥＡＤで無いので次の処理に進む（ステップＳ５０２）。同様に次行の変数CNTもＲＥＡＤで無いので次の処理に進む（ステップＳ５０２）。その次の行の変数CNTはＲＥＡＤなので、変数CNTは登録されるが（ステップＳ５０６）、前の変数cの階層：1に対し、階層：２なので階層・階層種別は登録されない（ステップＳ５０８）。この状態は図６（３）になる。次に再度、変数CNTが読み込まれデータアクセスがＲＥＡＤだが、変数CNTは登録済みなのでステップＳ５１０に進み、前の変数として記憶される。同様に、次行の変数CNT、次々行の変数bが処理される。その次の行において変数eが読み込まれ、変数eが登録される（ステップＳ５０６）。、また、前の変数bとの関係として変数eの情報である階層：２、階層種別forが登録される（ステップＳ５０８）。この状態は図６（４）になる。最終行まで処理されると、ステップＳ５１４、ステップＳ５１６によりアドレス割り付けの順番決定がなされるが、ここでは、変数bに、変数cと変数eとが後続している。ここでは、階層：２、階層種別：forの変数eの方が変数cよりも階層が深いので変数bと結びつくと判断し、結果、図６（５）の状態でアドレスが割り付けられる。
【００１３】
なお、図５のステップＳ５０２では、データアクセスをＲＥＡＤを対象としているのは、読み込み変数の効率的なアドレスの割り付けを対象としているためで、同箇所をＷＲＩＴＥとすれば書き込み変数の効率的なアドレスの割り付けになる。
また、図５、図６における各ステップ（処理）においては登録・記憶として記述しているが、最終的にアドレス割り付けの順番が決まった際に機械語オブジェクト８に反映（生成）すればよく、過程においてはメモリ上や一時記憶装置上のどのような箇所で処理しても構わない。
以上から明らかなように、コンパイルの際に変数使用状況表を利用する事により、効率的なアドレス割り付けが可能になる。
【図面の簡単な説明】
【００１４】
【図１】本発明のプログラマブルコントローラシステムの構成の一例を示す説明図
【図２】変数使用状況表の一例を示す説明図
【図３】生成情報付き機械語ニーモニックの一例を示す説明図
【図４】変数使用状況表生成方法のフローチャート
【図５】変数使用状況表利用方法のフローチャート
【図６】変数をアドレスに割り付ける方法の一例を示す説明図
【図７】従来のプログラマブルコントローラシステムの構成の一例を示す説明図
【図８】ソースコードの一例を示す説明図
【図９】変数宣言の一例を示す説明図
【図１０】機械語ニーモニックの一例を示す説明図
【符号の説明】
【００１５】
２…ソースコード
４…中間コード
６…変数使用状況表
８、９…機械語オブジェクト
１０、１１…フロントエンドコンパイラ
２０、２１…バックエンドコンパイラ
３０…通信手段
４０…実行手段
１００、１０１…コンパイル装置
２００…ターゲット
３００…生成用情報
Ｓ４００〜Ｓ４０８、Ｓ５００〜Ｓ５１６…ステップ
【図１】
2009064207.tif 000003
【図２】
2009064207.tif 000004
【図３】
2009064207.tif 000005
【図４】
2009064207.tif 000006
【図５】
2009064207.tif 000007
【図６】
2009064207.tif 000008
【図７】
2009064207.tif 000009
【図８】
2009064207.tif 000010
【図９】
2009064207.tif 000011
【図１０】
2009064207.tif 000012