(57)【要約】【課題】再コンパイル時に変数のメモリアドレスの流用ができるコンパイラを提供する。【解決手段】ソースコード２１を、実行形式のオブジェクトコード２２に変換する計算機１００用のコンパイラ２０であって、コンパイル時に使用する複数の変数Ａ、Ｂが、ソースコード２１内において最初に使用された位置と、コンパイルの結果、変数に割り当てられたメモリアドレスとを記録する変数定義テーブル２５を有し、コンパイラ２０は、ソースコード２１が再編集された後の再コンパイル時に、各変数Ａ、Ｃの位置が、変数定義テーブル２５に記録された位置と同じか否かを比較し、同じ場合は、変数定義テーブル２５に記録されているメモリアドレスをそれぞれの変数Ａ、Ｃ用に割り当てるメモリアドレスとして流用する照合部２０Ａを有する。【選択図】図１
2020086734.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを、実行形式のオブジェクトコードに変換する計算機用のコンパイラであって、
コンパイル時に使用する複数の変数が、前記ソースコード内において最初に使用された位置と、コンパイルの結果、前記変数に割り当てられたメモリアドレスとを記録する変数定義テーブルを有し、
前記コンパイラは、前記ソースコードが再編集された後の再コンパイル時に、各前記変数が最初に登場する位置が、前記変数定義テーブルに記録された位置と同じか否かを比較し、同じ場合は、前記変数定義テーブルに記録されている前記メモリアドレスをそれぞれの前記変数用に割り当てるメモリアドレスとして流用する照合部を有するコンパイラ。
【請求項２】
前記照合部は、前記変数定義テーブルを、機種の異なる計算機によるソースコードの最初のコンパイル時に利用可能である請求項１に記載のコンパイラ。
【請求項３】
前記ソースコードは、テキスト言語又はグラフィック言語で記述されている請求項１又は請求項２に記載のコンパイラ。
【請求項４】
前記ソースコードは、テキスト言語で記述されており、前記位置は、前記ソースコードの行番号と、前記行の行頭からの文字位置で特定される請求項１又は請求項２に記載のコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、コンパイラに関する。
【背景技術】
【０００２】
従来、一度ソースコードをコンパイルした後、再コンパイルを実行する際、コンパイル対象のソースコードに変更が無い部分について、内部演算で使用されるメモリアドレスを流用することにより、メモリアドレスの自動割付を省略し、コンパイル時間を短縮する方法（例えば、特許文献１参照）、もしくはプログラムコードの入力、修正、再コンパイルを行うことなくシステム内部プログラムを修正する方法（例えば、特許文献２参照）が提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−２８４８１５号公報（第１６−３１頁、図１−図５）
【特許文献２】特開平１１−３１６６７５号公報（第１５−５７頁、図１−図１１）
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１では、プログラム修正時に前回のプログラムと変更が無い箇所を判定し、変更が無い箇所に対して前回コンパイル結果を流用する方法を適用することにより、コンパイル時間の短縮、及びプログラムの修正作業なく内部システムの書き換えを実現している。ところが、出力コード、または変数のメモリアドレスの流用可能箇所を判定する場合、判定用に前回のプログラムコードの一部及び、データ割り付け情報テーブルを保持しておく必要があるほか、判定のために別途時間を要する問題点があった。また、特許文献２のように、コンパイルを行うことなくプログラムコードの一部を差し替える手法においては、プログラム全体の再コンパイルを行いつつも使用されている変数のメモリアドレスのみを流用したい場合に適用出来ないという問題点があった。
【０００５】
従って、例えば、計装システムの内部演算にのみ使用される信号のメモリアドレスのみを流用しようとした場合、これらの問題点のため、メインシステムを停止させることなく再コンパイルを実施することが出来ない、或いは、余分なソースコード等のリソースを保持する必要がある、及びコンパイルに時間を要するという課題があった。
【０００６】
本願は、上記のような課題を解決するための技術を開示するものであり、プログラムのソースコード全体を再コンパイルしつつ、前回のオブジェクトコードから流用可能な箇所であることを高速に判定できるとともに、プログラムコードではなく変数のメモリアドレスのみを流用することにより高速に再コンパイルできるコンパイラを得ることを目的とする。
【課題を解決するための手段】
【０００７】
本願に開示されるコンパイラは、
ソースコードを、実行形式のオブジェクトコードに変換する計算機用のコンパイラであって、
コンパイル時に使用する複数の変数が、前記ソースコード内において最初に使用された位置と、コンパイルの結果、前記変数に割り当てられたメモリアドレスとを記録する変数定義テーブルを有し、
前記コンパイラは、前記ソースコードが再編集された後の再コンパイル時に、各前記変数が最初に登場する位置が、前記変数定義テーブルに記録された位置と同じか否かを比較し、同じ場合は、前記変数定義テーブルに記録されている前記メモリアドレスをそれぞれの前記変数用に割り当てるメモリアドレスとして流用する照合部を有するものである。
【発明の効果】
【０００８】
本願に開示されるコンパイラによれば、同じ変数が、ソースコードの同じ位置にあるかを判定し、当該変数用のメモリアドレスを新規に採番せずに流用して高速に再コンパイルできる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１に係るコンパイラを使用する計算機のハードウェアとソフトウェアの構成を示す図である。
【図２】実施の形態１に係る計算機により、外部の計装システム用の内部処理ロジックを作成する手順を示す図である。
【図３】実施の形態１に係る変数定義テーブルの構成を示す図である。
【図４】実施の形態１に係る初回のコンパイル時のコンパイラの具体的処理を示す概念図である。
【図５】実施の形態１に係る初回のコンパイル時のコンパイラの処理フローを示す図である。
【図６】実施の形態１に係る初回のコンパイル終了時の変数定義テーブルを示す図である。
【図７】実施の形態１に係る２回目のコンパイル時のコンパイラの具体的処理を示す概念図である。
【図８】実施の形態１に係る２回目のコンパイル時のコンパイラの処理フローを示す図である。
【図９】実施の形態１に係る２回目のコンパイル終了時の変数定義テーブルを示す図である。
【図１０】実施の形態１に係る計装システムのメモリマップを示す図である。
【図１１】実施の形態２に係る初回コンパイル時のソースコードを示す図である。
【図１２】実施の形態２に係る再編集後、再コンパイル時のソースコードを示す図である。
【図１３】実施の形態３に係る２種類の計装システムのそれぞれのメモリアドレスを示す図である。
【図１４】実施の形態４に係るグラフィック言語における変数の位置に基づく変数のメモリアドレスの流用の可否の判定方法を示す概念図である。
【発明を実施するための形態】
【００１０】
実施の形態１．
以下、実施の形態１に係るコンパイラを、図を用いて説明する。
図１は、コンパイラソフトウェア２０（以下、単にコンパイラ２０という）を使用する計算機１００のハードウェアとソフトウェアの構成を示す図である。計算機１００は、ハードウェア５０と、ハードウェア５０にインストールされたＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）５１と、ＯＳ５１に付加してインストールされたＪＲＥ（Ｊａｖａ（登録商標）  Ｒｕｎｔｉｍｅ  Ｅｎｖｉｒｏｎｍｅｎｔ）５２及びＪＶＭ（Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）５３と、コンパイラ２０とを有する。ハードウェア５０は、各種情報を格納するメモリ５０Ａを備える。
【００１１】
ハードウェア５０は、一般的なＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）である。ＯＳ５１としては、Ｗｉｎｄｏｗｓ（登録商標）、Ｌｉｎｕｘ（登録商標）等を用いる。
【００１２】
ＪＲＥ５２は、Ｊａｖａ（登録商標）で作られたアプリケーションを実行するために必要なランタイムソフトウェアである。また、ＪＶＭ５３は、Ｊａｖａ（登録商標）アプリケーションを、使用対象のＯＳで実行可能な形式のコードに変換する、仮想マシンプログラムである。そして、コンパイラ２０は、プログラム言語Ｊａｖａ（登録商標）で書かれたテキスト形式のソースコードを、実行形式のオブジェクトコードに変換する計算機１００用のソフトウェアである。コンパイラ２０は、詳細を後述する照合部２０Ａと変数定義テーブル２５とを備える。
【００１３】
図２は、計算機１００により、外部の計装システム６用の内部処理ロジックを作成する手順を示す図である。ユーザは、ＯＳ５１上で、Ｊａｖａ（登録商標）言語によってテキスト形式でソースコード２１をプログラミングする。ソースコード２１の作成には、エディタ２１Ａを用い、作成したソースコード２１は、コンパイラ２０により計装システム６において実行可能なオブジェクトコード２２に変換される。オブジェクトコード２２は、計装システム６に転送され、計装システム６の運用に利用される。
【００１４】
図３は、変数定義テーブル２５の構成を示す図である。変数定義テーブル２５は、ユーザがコンパイラ２０を起動してソースコード２１をコンパイルする都度、直近のデータで更新される。変数定義テーブル２５には、ソースコード２１で使用した変数名と、最初に当該変数が使用された行の行番号と、文字位置と、コンパイラ２０によって、当該変数用の領域として割り当てられたメモリアドレスとを記録する。
【００１５】
変数名は、変数に付した任意の名前である。行番号とは、テキストファイルとして作成されたソースコード２１における当該変数が使用されている最初の行番号である。文字位置とは、半角１文字分を１字として数えて、当該変数が最初に登場する同行中での行頭からの位置を文字数（文字位置）である。ソースコード２１内での各変数の位置は、行番号と当該行の行頭からの文字位置で特定される。
【００１６】
次に、図１に示すコンパイラ２０及びその照合部２０Ａの機能について説明する。ユーザがソースコード２１を再編集し、コンパイラ２０を用いて更新後のソースコード２１の再コンパイルを実行すると、照合部２０Ａは、同一変数が使用された場合であって、最初に使用された当該変数の行番号、文字位置が、変数定義テーブル２５の記録と同一行番号、同一の文字位置である場合は、前回のメモリアドレスが、今回、流用可能であると判定して流用する。同一変数が、最初に違う位置に存在する場合は、流用不可として新規にメモリアドレスを採番し、変数定義テーブル２５の行番号と同行の先頭からの文字位置を新たな位置を特定する値に変更する。また、新規な変数が検出された場合は、変数定義テーブル２５に新たな変数名、行番号、文字位置、メモリアドレスを追加する。
【００１７】
コンパイラ２０は、コンパイルを実行する度に、コンパイル結果を新たなオブジェクトコード２２として生成する。オブジェクトコード２２は、新たな変数のメモリアドレスを含む。新たなオブジェクトコード２２を計装システム６に転送することにより、計装システム６の内部処理ロジックを書き換えることが可能である。
【００１８】
次に、具体例を用いて、初回のコンパイル時のコンパイラ２０の動作について説明する。
図４は、初回のコンパイル時のコンパイラ２０の具体的処理を示す概念図である。
図５は、初回のコンパイル時のコンパイラ２０の処理フローを示す図である。
図６は、初回のコンパイル終了時の変数定義テーブル２５を示す図である。
【００１９】
図４に示すように、初回コンパイル時、コンパイル対象のソースコード２１は、”Ｃ  ：＝  Ａ；”であるとする。この場合、変数Ａの位置は、スペースを含み１行目の６文字目となる。プログラム言語では、式の計算に対応するため、全ての変数は一度中間信号（ここでは中間信号Ｍ１）に代入される。この処理は、図４中のデータフローＦ０１として表現される。
【００２０】
次に、コンパイル時の処理の詳細を、図５に示す処理フローに沿って説明する。
初回コンパイル時、まず、コンパイラ２０は、エディタ２１Ａにより作成されたソースコード２１を取得する（ステップＳ００１）。次に、ソースコード２１の一単語を読み取る（ステップＳ００２）。
【００２１】
読み取った単語が、変数であるか否かを判定する（ステップＳ００３）。変数であった場合は（ステップＳ００３−ＹＥＳ）、当該変数用のメモリアドレスを新規に採番し（ステップＳ００４）、変数定義テーブル２５に追加記録し（ステップＳ００５）、ステップＳ００６に進む。
【００２２】
ステップＳ００３において読み取った単語が、変数でない場合（ステップＳ００３−ＮＯ）は、ステップＳ００６に進む。ステップＳ００６では、読み取った単語でソースコード２１の末端に到達したか否かを判定する。末端であった場合は（ステップＳ００６−ＹＥＳ）、処理を終了する。末端でない場合は（ステップＳ００６−ＮＯ）、ステップＳ００２に戻って上に記した処理を繰り返す。処理が終了するとコンパイルが完了し、オブジェクトコード２２が生成される。この例では、図６に示すように変数定義テーブル２５に記録される。
【００２３】
次に、２回目のコンパイル時のコンパイラ２０の動作について説明する。
図７は、２回目のコンパイル時のコンパイラ２０の具体的処理を示す概念図である。
図８は、２回目のコンパイル時のコンパイラ２０の処理フローを示す図である。
図９は、２回目のコンパイル終了時の変数定義テーブル２５を示す図である。
【００２４】
図７に示すように、２回目コンパイル時、コンパイル対象のソースコード２１は、”Ｃ  ：＝  Ａ  ＋  Ｂ；”とする。プログラム言語では、式の計算に対応するため、全ての変数は一度中間信号Ｍ１、Ｍ２、Ｍ３に代入される。この処理は、図７中のデータフローＦ０２として表現される。この場合、変数Ａの位置である行番号と文字位置とは、スペースを含み１行目の６文字目であり、初回のコンパイル時と同じである。
【００２５】
次に、コンパイル時の処理の詳細を図８に示す処理フローに沿って説明する。
２回目のコンパイル時、まず、コンパイラ２０は、エディタ２１Ａにより作成されたソースコード２１を取得する（ステップＳ００１）。次に、ソースコードの一単語を読み取る（ステップＳ００２）。
【００２６】
読み取った単語が、変数であるか否かを判定する（ステップＳ００３）。変数であった場合は（ステップＳ００３−ＹＥＳ）、照合部２０Ａは、当該変数名が、変数定義テーブル２５において、同じ行番号、同じ文字位置として記録されているか否かを照合し（ステップＳ００３１）。同じ行番号、同じ文字位置として記録されている場合は（ステップＳ００３１−ＹＥＳ）、前回のメモリアドレスを流用可能と判定して流用し（ステップＳ００３２）、ステップＳ００６に進む。
【００２７】
ステップＳ００３１において当該変数が、変数定義テーブル２５に存在しない場合（Ｓ００３１−ＮＯ）は、ステップＳ００３３に進む。
【００２８】
ステップＳ００３３では、変数定義テーブル２５中に、同名変数が存在するが、違う行番号又は違う文字位置として記録されているかを判定する。違う行番号、又は違う文字位置に記録されている場合は、当該変数のレコードを削除し（ステップＳ００３４）、当該変数用のメモリアドレスを新規に採番し直し（ステップＳ００４）、変数定義テーブルに追加記録し（ステップＳ００５）、ステップＳ００６に進む。
【００２９】
ステップＳ００６では、読み取った単語でソースコード２１の末端に到達したか否かを判定する。末端であった場合は（ステップＳ００６−ＹＥＳ）、処理を終了する。末端でない場合は（ステップＳ００６−ＮＯ）、ステップＳ００２に戻って上に記した処理を繰り返す。処理を終了するとコンパイルが完了し、オブジェクトコード２２が生成される。
【００３０】
このように、最初のコンパイルで、１行だけのソースコード”Ｃ  ：＝  Ａ；”を”Ｃ  ：＝  Ａ  ＋  Ｂ；”と変更して再コンパイルする場合、変数Ａ、変数Ｃ用のメモリアドレスは、前回のコンパイル時のメモリアドレスが流用され、変数Ｂ用のメモリアドレスだけが新規に採番され、変数定義テーブル２５に追加される。
【００３１】
本実施の形態に係るコンパイラ２０によれば、同じ変数が、ソースコード２１の同じ行番号、同じ文字位置にあるかを判定し、当該変数用のメモリアドレスを新規に採番せずに流用してコンパイルできるので、ソースコード修正後の再コンパイルを高速に実施することができる。
【００３２】
図１０は、計装システム６のメモリマップを示す図である。稼働中システムの誤動作防止のため、一度採番された信号のメモリアドレスは、不使用状態となっても二度使用することは行わないものとすると更に良い。領域Ａ２８、Ａ２９、Ａ３０は、コンパイラ２０実行時に新規採番対象として一度割り当てられたメモリアドレスの領域を示す。再コンパイルにより領域Ａ２９のメモリアドレスが不使用状態となっても、次回採番時に本領域のメモリアドレスは使用せず、領域Ａ３１のみを新規採番対象のメモリアドレスとする。
【００３３】
使用済みメモリアドレスの初期化処理を実施することにより全てのメモリアドレスを使用可能状態に戻し、領域Ａ２８、Ａ２９、Ａ３０を新規採番対象にすることが可能であるが、これを実行するためには稼働中の計装システム６を停止する必要がある。
【００３４】
内部処理ロジックで使用するメモリアドレスを再利用しない場合、コンパイルを繰り返す度に使用可能なメモリアドレス領域が小さくなり、メモリアドレスが枯渇する。枯渇の解消のためには計装システム６の停止が必要であるため、計装システム６の連続稼働時間が低下する。
【００３５】
本実施の形態に係るコンパイラ２０によれば、再コンパイル時に同じ変数が、ソースコード２１の同じ行番号、同じ文字位置に最初に登場するかを判定し、当該変数用のメモリアドレスを新規に採番せずに流用してコンパイルできるので、高速に再コンパイルできる。また、メモリアドレスの枯渇を先延ばしでき、オブジェクトコードを利用する計装システム６の連続稼働時間を長くできる。
【００３６】
実施の形態２．
以下、実施の形態２に係るコンパイラを実施の形態１と異なる部分を中心に、図を用いて説明する。
実施の形態１では、変数定義テーブル２５に直近のコンパイル時に出現した変数の、ソースコード２１における行番号、文字位置を記録することにより、再コンパイル時に当該変数用のメモリアドレスを再利用し、再コンパイルを高速化することについて述べた。本実施の形態では、再コンパイルを更に高速化するソースコードの構成を説明する。
【００３７】
図１１は、初回コンパイル時のソースコード２１を示す図である。
図１２は、再編集後、再コンパイル時のソースコード２１を示す図である。
図１１と図１２とを比較すると分かるように、変数ＴＭＰ、変数ＩＮＰＵＴ＿ＶＡＲ、変数ＯＵＴＰＵＴ＿ＶＡＲを使用する行番号、文字位置を固定している。これにより、再コンパイル時に、プログラムの入出力に使用されるメモリアドレスを常に同一に保つことが可能となる。
【００３８】
このように、使用する変数を特定の行番号、文字位置に固定し、その他の制御ロジックのみを変更すれば、変数参照においてメモリアドレスの自動割り当ての頻度を減らすことが可能となるため、使用可能メモリアドレス領域の枯渇、及び流用可能判定の高速化を期待できる。
【００３９】
実施の形態３．
以下、実施の形態３に係るコンパイラを実施の形態１、２と異なる部分を中心に、図を用いて説明する。
本実施の形態では、別の計装システム用にプログラムを移植する際の変数定義テーブル２５の流用について説明する。
コンパイラ２０の照合部２０Ａは、計算機１００で作成した変数定義テーブル２５を、機種の異なる計算機によるソースコードの最初のコンパイル時に利用可能とする。
図１３は、計装システム６の機種６Ａと計装システム６１の機種６１Ａのメモリアドレスを示す図である。図に示すように、機種６Ａ及び機種６１Ａにて使用される変数のメモリ領域を同一にし、空き領域を等しくする。
【００４０】
計装システムのメモリ領域に対してプログラム領域が大きい場合は、空きメモリアドレスの枯渇が懸念される。しかし、本実施の形態によりプログラムの移植時にメモリアドレスが変更されることがないため、プログラムの移植性を担保することが出来る。また、最初のコンパイル時に変数定義テーブル２５が既に存在するので、１回目のコンパイルから、コンパイル時間を短縮できる。
【００４１】
実施の形態４．
以下、実施の形態４に係るコンパイラを実施の形態１と異なる部分を中心に、図を用いて説明する。実施の形態１では、テキスト言語のソースコード２１におけるそれぞれの変数が出現する最初の行番号、文字位置を用いてオブジェクトコード２２における当該変数のメモリアドレスの流用の可否を判定することについて述べた。本実施の形態では、グラフィック言語についても同様の手法を採用する。
【００４２】
図１４は、グラフィック言語における変数の位置に基づく変数のメモリアドレスの流用の可否の判定方法を示す概念図である。
【００４３】
例えば、変数Ａ、及び変数Ｂの位置を固定し、演算３９、及び出力先の変数Ｃを置き換えて再コンパイルした場合、変数Ａ、変数Ｂは、前回コンパイル時と同じ位置にあるため、前回のメモリアドレスを流用することが可能である。
【００４４】
本願は、様々な例示的な実施の形態及び実施例が記載されているが、１つ、または複数の実施の形態に記載された様々な特徴、態様、及び機能は特定の実施の形態の適用に限られるのではなく、単独で、または様々な組み合わせで実施の形態に適用可能である。
従って、例示されていない無数の変形例が、本願に開示される技術の範囲内において想定される。例えば、少なくとも１つの構成要素を変形する場合、追加する場合または省略する場合、さらには、少なくとも１つの構成要素を抽出し、他の実施の形態の構成要素と組み合わせる場合が含まれるものとする。
【符号の説明】
【００４５】
１００  計算機、２０  コンパイラ、２０Ａ  照合部、２１  ソースコード、
２１Ａ  エディタ、２２  オブジェクトコード、２５  変数定義テーブル、
５０  ハードウェア、５０Ａ  メモリ、５１  ＯＳ、５２  ＪＲＥ、５３  ＪＶＭ、
６，６１  計装システム、６Ａ，６１Ａ  機種、Ａ，Ｂ，Ｃ，ＴＭＰ  変数、
Ｍ１〜Ｍ３  中間信号、３９  演算。
【図１】
2020086734.tif 000003
【図２】
2020086734.tif 000004
【図３】
2020086734.tif 000005
【図４】
2020086734.tif 000006
【図５】
2020086734.tif 000007
【図６】
2020086734.tif 000008
【図７】
2020086734.tif 000009
【図８】
2020086734.tif 000010
【図９】
2020086734.tif 000011
【図１０】
2020086734.tif 000012
【図１１】
2020086734.tif 000013
【図１２】
2020086734.tif 000014
【図１３】
2020086734.tif 000015
【図１４】
2020086734.tif 000016