(57)【要約】【課題】共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止する。【解決手段】コンパイル装置（１２）は、第１ユーザプログラムの識別子を取得する識別子取得部（１２１ａ）と、共有変数の変数名と、前記識別子とを含む共有変数名を生成する共有変数名生成部（１２１ｂ）と、前記第１ユーザプログラムを機械語に変換する変換部（１２１ｃ）と、前記共有変数のアドレスを決定するアドレス決定部（１２２ａ）と、を備え、アドレス決定部（１２２ａ）は、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第１ユーザプログラムに埋め込む。【選択図】図１
2020008942.tif 000002
【特許請求の範囲】
【請求項１】
第１ユーザプログラムのソースコードにおいて、前記第１ユーザプログラムおよび第２ユーザプログラムの両方から参照可能な共有変数が定義されており、
前記第１ユーザプログラムの識別子を取得する識別子取得部と、
前記第１ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する共有変数名生成部と、
前記第１ユーザプログラムを機械語に変換する変換部と、
前記共有変数のアドレスを決定するアドレス決定部と、を備え、
前記アドレス決定部は、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第１ユーザプログラムに埋め込むことを特徴とするコンパイル装置。
【請求項２】
前記アドレス決定部は、機械語に変換された前記第１ユーザプログラムにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする命令に置き換えることを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記識別子取得部は、設定ファイルから、前記識別子を取得することを特徴とする請求項１または２に記載のコンパイル装置。
【請求項４】
前記識別子取得部は、前記第１ユーザプログラムの前記ソースコードから前記識別子を取得することを特徴とする請求項１または２に記載のコンパイル装置。
【請求項５】
前記識別子取得部は、コンパイル実行時にユーザによって指定された引数を前記識別子として用いることを特徴とする請求項１または２に記載のコンパイル装置。
【請求項６】
前記識別子は、前記第１ユーザプログラムが配置される予定のパスを含むことを特徴とする請求項１から５のいずれか一項に記載のコンパイル装置。
【請求項７】
前記識別子は、前記第１ユーザプログラムのファイル名を含むことを特徴とする請求項１から５のいずれか一項に記載のコンパイル装置。
【請求項８】
第１ユーザプログラムのソースコードにおいて、前記第１ユーザプログラムおよび第２ユーザプログラムの両方から参照可能な共有変数が定義されており、
前記第１ユーザプログラムの識別子を取得し、
前記第１ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成し、
前記第１ユーザプログラムを機械語に変換し、
前記共有変数のアドレスを決定し、
前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第１ユーザプログラムに埋め込むことを特徴とするコンパイル方法。
【請求項９】
第２ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定部と、
前記第２ユーザプログラムを機械語に変換する変換部と、
アドレス決定部とを備え、
前記変数が共有変数ではない場合、前記アドレス決定部は、前記変数にアクセスする命令を、ＡＰＩ（application program interface）を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、
前記変数が共有変数である場合、前記変換部は、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記変数にアクセスする機械語命令に置き換えることを特徴とするコンパイル装置。
【請求項１０】
第２ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定工程と、
前記第２ユーザプログラムを機械語に変換する変換工程とを含み、
前記変換工程では、
前記変数が共有変数ではない場合、前記変数にアクセスする命令を、ＡＰＩ（application program interface）を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、
前記変数が共有変数である場合、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記変数にアクセスする機械語命令に置き換えることを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザプログラム間で共有するデータの意図せずに上書きすることを防止するためのコンパイル装置およびコンパイル方法に関する。
【背景技術】
【０００２】
従来では、以下のようなコントロール制御装置が知られている（特許文献１を参照）。すなわち、ユーザプログラムが複数あるとき、それらの間のデータのやり取りはデータ記憶部を介して行う。プログラム間でデータのやり取りを行うにあたっては、データに変数名を与え、その変数名をキーにして各ユーザプログラムがデータ記憶部からデータの書き込みや読み取りを行う。
【０００３】
また、従来では、異なるアプリケーションフレームワーク間のデータサービスのためのプラットフレームが知られている（特許文献２を参照）。
【０００４】
また、従来では、仕様記述もしくは言語記述を処理する言語処理システムにおける入力／出力仕様記述中もしくは入力ソースプログラム／出力オブジェクトプログラム中の名標を管理する言語管理システムの名標管理方式が知られている（特許文献３を参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−１３２２０８号公報
【特許文献２】特開２００６−２４４４８８号公報
【特許文献３】特開平４−２６０１３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記の何れの技術も、プログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きしてしまうことを防止する技術ではない。
【０００７】
本発明の一態様は、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することを目的とする。
【課題を解決するための手段】
【０００８】
上記の課題を解決するために、本発明の一態様に係るコンパイル装置は、第１ユーザプログラムのソースコードにおいて、前記第１ユーザプログラムおよび第２ユーザプログラムの両方から参照可能な共有変数が定義されており、前記第１ユーザプログラムの識別子を取得する識別子取得部と、前記第１ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する共有変数名生成部と、前記第１ユーザプログラムを機械語に変換する変換部と、前記共有変数のアドレスを決定するアドレス決定部と、を備え、前記アドレス決定部は、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第１ユーザプログラムに埋め込む。
【０００９】
上記の態様によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
【００１０】
本発明の一態様では、前記アドレス決定部は、機械語に変換された前記第１ユーザプログラムにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする命令に置き換えてもよい。
【００１１】
上記の態様によれば、前記変換部は、前記共有変数にアクセスする命令を前記共有変数の前記アドレスにアクセスする機械語命令に置き換えることができる。共有変数を定義したプログラムにおいては、アドレスを利用して共有変数にアクセスすることで、高速にアクセスすることができる。
【００１２】
本発明の一態様では、前記識別子取得部は、設定ファイルから、前記識別子を取得することを特徴とする。
【００１３】
上記の態様によれば、前記識別子取得部は、設定ファイルから、前記識別子を取得することができる。
【００１４】
本発明の一態様では、前記識別子取得部は、前記第１ユーザプログラムの前記ソースコードから前記識別子を取得することを特徴とする。
【００１５】
上記の態様によれば、前記識別子取得部は、前記第１ユーザプログラムの前記ソースコードから前記識別子を取得することができる。
【００１６】
本発明の一態様では、前記識別子取得部は、コンパイル実行時にユーザによって指定された引数を前記識別子として用いることを特徴とする。
【００１７】
上記の態様によれば、前記識別子取得部は、前記引数を前記識別子として用いることができる。
【００１８】
本発明の一態様では、前記識別子は、前記第１ユーザプログラムが配置される予定のパスを含むことを特徴とする。
【００１９】
上記の態様によれば、前記識別子は、前記第１ユーザプログラムが配置される予定のパスを含むことができる。
【００２０】
本発明の一態様では、前記識別子は、前記第１ユーザプログラムのファイル名を含むことを特徴とする。
【００２１】
上記の態様によれば、前記識別子は、前記第１ユーザプログラムのファイル名を含むことができる。
【００２２】
上記の課題を解決するために、本発明の一態様に係るコンパイル方法では、第１ユーザプログラムのソースコードにおいて、前記第１ユーザプログラムおよび第２ユーザプログラムの両方から参照可能な共有変数が定義されており、前記第１ユーザプログラムの識別子を取得し、前記第１ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成し、前記第１ユーザプログラムを機械語に変換し、前記共有変数のアドレスを決定し、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第１ユーザプログラムに埋め込むことを特徴とする。
【００２３】
上記の課題を解決するために、本発明の一態様に係るコンパイル装置は、第２ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定部と、前記第２ユーザプログラムを機械語に変換する変換部と、アドレス決定部とを備え、前記変数が共有変数ではない場合、前記アドレス決定部は、前記変数にアクセスする命令を、ＡＰＩ（application program interface）を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、前記変数が共有変数である場合、前記変換部は、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記変数にアクセスする機械語命令に置き換えることを特徴とする。
【００２４】
上記の態様によれば、他の第１ユーザプログラムが定義した共有変数に第２ユーザプログラムがアクセス可能なように、第２ユーザプログラムをコンパイルおよびリンクすることができる。
【００２５】
上記の課題を解決するために、本発明の一態様に係るコンパイル方法では、第２ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定工程と、前記第２ユーザプログラムを機械語に変換する変換工程とを含み、前記変換工程では、前記変数が共有変数ではない場合、前記変数にアクセスする命令を、ＡＰＩ（application program interface）を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、前記変数が共有変数である場合、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記変数にアクセスする機械語命令に置き換えることを特徴とする。
【発明の効果】
【００２６】
本発明の一態様によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
【図面の簡単な説明】
【００２７】
【図１】一実施形態に係るコンパイル装置を備えた第１情報処理装置の構成の一例を模式的に示すブロック図である。
【図２】一実施形態に係る第２情報処理装置の構成の一例を模式的に示すブロック図である。
【図３】共有変数シンボルテーブルの詳細を例示する図である。
【図４】一実施形態に係るコンパイル装置がプログラムのコンパイルおよびリンクを実行する工程のフロチャートの一例を示す図である。
【図５】一実施形態に係るコンパイル装置がプログラムのコンパイルおよびリンクを実行する工程のフロチャートの一例を示す図である。
【発明を実施するための形態】
【００２８】
§１  適用例
図１を用いて、本実施形態に係るコンパイル装置の適用場面の一例について説明する。図１は、本実施形態に係るコンパイル装置１２を備えた第１情報処理装置１の構成の一例を模式的に示すブロック図である。本実施形態に係るコンパイル装置１２は、共有変数を定義するユーザプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止するための装置である。
【００２９】
コンパイル装置１２は、第１ユーザプログラムのソースコードに含まれる共有変数の変数名と、識別子とを含む共有変数名を生成する。識別子は複数のユーザプログラムを互いに区別可能にする識別子である。コンパイル装置１２は、共有変数名と共有変数のアドレスとを対応付けて、機械語に変換された第１ユーザプログラムに埋め込む。複数のユーザプログラムのソースコードにおいて、複数の共有変数に対して同じ変数名が意図せず付与されていたとしても、共有変数にアクセスする第２ユーザプログラムは、識別子を含む共有変数名でそれぞれの共有変数を区別することができる。
【００３０】
§２  構成例
（第１情報処理装置の構成）
図１に示すように、第１情報処理装置１は、記憶装置１１と、コンパイル装置１２とを備える。記憶装置１１は、第１ユーザプログラム（以下プログラムＡと称する）のソース１１ａと、第２ユーザプログラム（以下プログラムＢと称する）のソース１１ｂとを記憶している。コンパイル装置１２は、コンパイラ１２１と、リンカ１２２とを備える。コンパイラ１２１は、識別子取得部１２１ａと、共有変数名生成部１２１ｂと、変換部１２１ｃと、判定部１２１ｄとを備える。リンカ１２２は、アドレス決定部１２２ａを備える。
【００３１】
プログラムＡのソース１１ａは、その中で共有変数を定義している。即ちプログラムＡのソース１１ａには、共有変数を生成し該共有変数に値を書き込む命令が記述されている。プログラムＢのソース１１ｂは、その中で前記共有変数を参照する。即ちプログラムＢのソース１１ｂには、前記共有変数を読み出す命令が記述されている。
【００３２】
また、記憶装置１１は、例えば、不揮発性のメモリ、またはハードディスク等であるが、これに限らない。記憶装置１１を備えることにより、データ消失を確実に防止することができる。
【００３３】
コンパイル装置１２は、記憶装置１１のプログラムＡのソース１１ａ（例えば、ユーザによってプログラムコードが記述されたテキストファイル）をコンパイルし、リンクする。プログラムＡのソース１１ａがコンパイルされかつリンクされると実行形式のプログラムになる。なお、本明細書では、コンパイルおよびリンクの処理を合わせて、「コンパイルする」と表現することがある。
【００３４】
具体的には、プログラムＡのソースコードにおいて、前記プログラムＡおよび前記プログラムＢの両方から参照可能な共有変数が定義されている。識別子取得部１２１ａは、前記プログラムＡの識別子を取得する。判定部１２１ｄは、前記プログラムＡの前記ソースコードに記述されている変数が、共有変数か非共有変数かを判定する。例えば、ソースコードにおいて、所定の宣言をすることにより、変数が共有変数であるか非共有変数であるかが定義されていてもよい。共有変数名生成部１２１ｂは、前記プログラムＡの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。変換部１２１ｃは、前記プログラムＡの前記ソースコードを機械語に変換する。例えば、コンパイラ１２１は、プログラムＡのソースコードから複数のオブジェクトコードを生成する。オブジェクトコードは機械語コードおよびリロケーション情報等を含む。共有変数名生成部１２１ｂは、共有変数の変数名を生成した共有変数名に置き換える。オブジェクトコードにおいて、共有変数へのアクセス命令は、シンボリックな参照（共有変数名を用いた参照）によって記述されている。
【００３５】
リンカ１２２は、リンケージエディタとも呼ばれる。リンカ１２２は、コンパイラ１２１により変換された複数のオブジェクトコードを結合する。アドレス決定部１２２ａは、前記共有変数のアドレスを決定する。アドレス決定部１２２ａは、オブジェクトコードにおけるシンボリックな参照を用いた共有変数へのアクセス（書き込み／参照）命令を、前記アドレスを用いた共有変数へのアクセス命令に置き換える。即ち、アドレス決定部１２２ａは、機械語に変換されたプログラムＡにおける、共有変数へアクセスする命令を、共有変数のアドレスにアクセスする命令に置き換える。また、アドレス決定部１２２ａは、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換されたプログラムＡに埋め込む。例えば、共有変数名とアドレスとは、シンボルテーブルとしてプログラムＡに埋め込まれる。
【００３６】
機械語の（実行形式に変換された）プログラムＡは記憶装置１１に記憶される。第１情報処理装置１は機械語のプログラムＡを第２情報処理装置２に送信する。
【００３７】
（第２情報処理装置の構成）
図２は、本実施形態に係る第２情報処理装置２の構成の一例を模式的に示すブロック図である。第２情報処理装置２は、例えばＰＬＣ（プログラマブルロジックコントローラ）等の各種の機器の動作を制御する制御装置であってもよい。第２情報処理装置２は、プログラム管理部２１と、補助記憶装置２２と、メモリ２３とを備える。
【００３８】
プログラム管理部２１は、プログラムＡ管理部２１ａと、プログラムＢ管理部２１ｂとを含む。プログラムＡ管理部２１ａは、機械語のプログラムＡを実行する。プログラムＢ管理部２１ｂは、機械語のプログラムＢを実行する。
【００３９】
補助記憶装置２２は、第１情報処理装置１から受け取ったプログラムＡおよびプログラムＢを格納する。メモリ２３は、プログラムＡおよびプログラムＢを一時的に記憶する。補助記憶装置２２は、例えば、不揮発性のメモリ、またはハードディスク等であるが、これに限らない。
【００４０】
メモリ２３は、プログラムＡおよびプログラムＢを一時的に記憶する。メモリ２３は、例えば揮発性のメモリ等であるが、これに限らない。メモリ２３は、データ記憶部２３ａと、共有変数シンボルテーブル２３ｂとを備える。データ記憶部２３ａは、プログラムＡおよびプログラムＢの両方から参照可能な共有変数のデータを記憶している。
【００４１】
ここでいう共有変数とは、複数のユーザプログラムから参照可能な変数のことを指す。共有変数シンボルテーブル２３ｂは、データ記憶部２３ａに記憶されている前記共有変数の記憶場所（アドレス）を記憶している。
【００４２】
（プログラムＡの実行）
図３は、共有変数シンボルテーブル２３ｂの詳細を例示する図である。プログラムＡ管理部２１ａは、ユーザからプログラムＡを実行する指示を受けると、補助記憶装置２２からプログラムＡをロードし、メモリ２３にプログラムＡを記憶させる。補助記憶装置２２に格納されたプログラムＡは、機械語に変換された（コンパイルおよびリンクされた）プログラムである。機械語に変換されたプログラムＡは、共有変数名と該共有変数のアドレスとの対応関係を示すシンボルテーブルを含む。非共有変数は、プログラムＡの中だけで使用され、プログラムＡのみが参照可能な変数である。コンパイルされたプログラムＡにおいて、非共有変数のアドレスが規定されている。コンパイルされたプログラムＡにおいて、非共有変数の変数名の情報は残っていなくてもよい。ただし、プログラムＡは、コンパイルされた後でも、共有変数の共有変数名の情報とアドレスの情報とを含む。
【００４３】
プログラムＡ管理部２１ａは、共有変数名の情報、および対応するアドレスの情報を取得する。プログラムＡ管理部２１ａは、前記共有変数名と、前記共有変数の前記アドレスとを対応付けて、共有変数シンボルテーブル２３ｂに記録する。また、プログラムＡ管理部２１ａは、データ記憶部２３ａの前記アドレスに、前記共有変数のデータを書き込む。
【００４４】
（識別子）
ユーザプログラムの識別子は、該ユーザプログラムに固有の文字列または数値である。複数のユーザプログラムの識別子は、互いに重複しないように設定される。例えば、ユーザプログラムのプログラム名、ユーザプログラムの配置先ディレクトリのパス、ユーザが任意に設定する文字列、ＵＵＩＤ（universally unique identifier）、またはドメイン名を、該ユーザプログラムの識別子としてもよい。
【００４５】
図３の例示では、プログラムＡの識別子が「Ｐｒｅｓｓ」である。変数名「ｓｔａｔｕｓ」は、プログラムＡのソースコードで定義された共有変数の変数名である。共有変数名生成部１２１ｂは、識別子「Ｐｒｅｓｓ」と元々の変数名「ｓｔａｔｕｓ」を組み合わせることで、該共有変数の共有変数名「Ｐｒｅｓｓ.ｓｔａｔｕｓ」を生成する。共有変数名「Ｐｒｅｓｓ.ｓｔａｔｕｓ」は、他のプログラムＢから該共有変数を参照するときにキーとして使用される変数名である。ここでは、識別子と変数名との間に「．」を加えているが、代わりに任意の文字または文字列を用いてもよい。また、識別子と変数名との間の文字はなくてもよい。識別子と変数名との順番も任意である。例えば、図３に例示する「Ｃｕｔｔｅｒ．ｓｔａｔｕｓ」は、プログラムＢで定義される共有変数の、共有変数名である。プログラムＢの識別子が「Ｃｕｔｔｅｒ」である。プログラムＢで定義されている共有変数の変数名は「ｓｔａｔｕｓ」である。共有変数名生成部１２１ｂは、所定の規則に沿って識別子と変数名とを含む共有変数名を生成する。これにより、複数のユーザプログラムにおいて、変数名「ｓｔａｔｕｓ」が同じ複数の共有変数が定義されていても、共有変数名の衝突を回避することができる。共有変数名はたとえばＰｒｅｓｓ.ｓｔａｔｕｓ、Ｃｕｔｔｅｒ.ｓｔａｔｕｓを挙げ、これらの共有変数名に対応するアドレスはそれぞれ０Ｘ００００００００、０Ｘ０００００００１を挙げたが、これは本実施形態を限定するものではない。
【００４６】
（プログラムＢのコンパイルおよびリンク）
プログラムＢはプログラムＡが定義した（生成した）共有変数を参照（読み出し）する。第１情報処理装置１のコンパイル装置１２は、プログラムＢのソース１１ｂのコンパイルおよびリンクを行う。
【００４７】
具体的には、プログラムＢのソースコードにおいて、他のプログラムＡで定義された共有変数を参照する命令が記述されている。なお、ユーザは、参照する共有変数の共有変数名「Ｐｒｅｓｓ.ｓｔａｔｕｓ」を知っているものとする。例えば、ユーザは、プログラムＢを作る際に、共有変数の変数名として共有変数名「Ｐｒｅｓｓ.ｓｔａｔｕｓ」を使用してソースコードを記述する。
【００４８】
判定部１２１ｄは、前記プログラムＢの前記ソースコードに記述されている変数が、共有変数か非共有変数かを判定する。また、判定部１２１ｄは、前記プログラムＢの前記ソースコードに記述されている共有変数が、プログラムＢの中で生成（定義）された共有変数か、他のプログラムの中で生成（定義）された共有変数かを判定する。例えば、ソースコードにおいて、所定の宣言をすることにより、変数が自プログラムで生成された共有変数であるか、他のプログラムで生成された共有変数であるか、非共有変数であるかが定義されていてもよい。また、例えば、判定部１２１ｄは、変数の変数名に所定の識別子（他のプログラムの識別子）が含まれる場合、該変数を他のプログラムの中で生成された共有変数であると判定してもよい。
【００４９】
変換部１２１ｃは、前記プログラムＢの前記ソースコードを機械語に変換する。変数が自プログラムで生成された共有変数である場合、コンパイルおよびリンクの方法はプログラムＡに関して説明した通りである。
【００５０】
変数が他のプログラム（例えばプログラムＡ）で生成された共有変数である場合について説明する。変数が他のプログラム（例えばプログラムＡ）で生成された共有変数である場合、変換部１２１ｃは、前記プログラムＢの前記ソースコードにおける共有変数にアクセス（参照）する命令を、ＡＰＩ（application program interface）を介して前記共有変数にアクセスする機械語命令に置き換える。このＡＰＩは、共有変数のアドレスを知っているプログラム管理部２１が提供するＡＰＩである。プログラム管理部２１は、共有変数名をキーにして、共有変数シンボルテーブル２３ｂから共有変数のアドレスを取得することができる。
【００５１】
例えば、プログラム管理部２１（プログラムＡ管理部２１ａおよびプログラムＢ管理部２１ｂ）は、共有変数名をキーにして共有変数の値（データ）を返す第１ＡＰＩ、または、共有変数名をキーにして共有変数のアドレス返す第２ＡＰＩおよびアドレスをキーにして変数（共有変数）の値を返す第３ＡＰＩを提供する。変換部１２１ｃは、前記プログラムＢの前記ソースコードにおける共有変数にアクセス（参照）する命令を、第１ＡＰＩを介して共有変数を参照する機械語命令に置き換えてもよい。変換部１２１ｃは、前記プログラムＢの前記ソースコードにおける共有変数にアクセス（参照）する命令を、第２ＡＰＩを介してアドレスを取得する機械語命令と、第３ＡＰＩを介して共有変数を参照する機械語命令とに置き換えてもよい。
【００５２】
リンカ１２２は、コンパイラ１２１により変換された複数のオブジェクトコードを結合する。他のプログラムで生成された共有変数に対しては、アドレスは決定されない。変数が非共有変数である場合（共有変数ではない場合）、アドレス決定部１２２ａは、機械語に変換されたプログラムＢにおける（シンボリックな参照を用いた）前記変数にアクセスする命令を、ＡＰＩを利用せずに前記変数のアドレスにアクセスする機械語命令に置き換える。
【００５３】
機械語の（実行形式に変換された）プログラムＢは記憶装置１１に記憶される。第１情報処理装置１は機械語のプログラムＢを第２情報処理装置２に送信する。なお、プログラムＡとプログラムＢとは、互いに異なる情報処理装置においてコンパイルおよびリンクされてもよい。
【００５４】
（プログラムＢの実行）
第２情報処理装置２において、プログラムＡは先に実行され、プログラムＡで定義された共有変数の共有変数名およびアドレスは、共有変数シンボルテーブル２３ｂに記録されている。プログラムＢ管理部２１ｂは、ユーザからプログラムＢを実行する指示を受けると、補助記憶装置２２からプログラムＡをロードし、メモリ２３にプログラムＡを記憶させる。補助記憶装置２２に格納されたプログラムＢは、機械語に変換された（コンパイルおよびリンクされた）プログラムである。機械語に変換されたプログラムＢは、共有変数名をキーとして共有変数を参照するＡＰＩ（第１ＡＰＩ、第２ＡＰＩまたは第３ＡＰＩ）を呼び出す命令を含む。コンパイルされたプログラムＢにおいて、非共有変数のアドレスが規定されている。コンパイルされたプログラムＢにおいて、非共有変数の変数名の情報は残っていなくてもよい。ただし、プログラムＢは、コンパイルされた後でも、共有変数の共有変数名の情報を含む。
【００５５】
プログラムＢは、キーとして共有変数の共有変数名「Ｐｒｅｓｓ．ｓｔａｔｕｓ」をＡＰＩ関数を介してプログラムＢ管理部２１ｂに渡す。プログラムＢ管理部２１ｂは、共有変数シンボルテーブル２３ｂから該共有変数名に対応するアドレスを取得する。プログラムＢ管理部２１ｂは、アドレスをキーにしてデータ記憶部２３ａから共有変数のデータを取得する。プログラムＢ管理部２１ｂは、共有変数のデータをプログラムＢに返す。このように、プログラムＢ管理部２１ｂは、共有変数シンボルテーブル２３ｂを参照して、共有変数のアドレスを知ることができる。
【００５６】
通常、コンパイラ型のユーザプログラムは、機械語に変換されている。そのため、ソースファイルで規定した変数名は、アドレスに変換されており、残っていない。上記の態様によれば、共有変数を参照するＡＰＩを用いることで、コンパイルおよびリンクされたプログラムＢの中の共有変数名はキーとして残る。
【００５７】
前記プログラムＡと、前記プログラムＢとは、互いに異なるプログラミング言語で構成されたものであってもよい。上記の態様によれば、互いに異なるプログラミング言語で構成されたプログラムＡとプログラムＢとの間で、変数を共有することができる。例えば、プログラムＡと、プログラムＢとは、同じプログラミング言語で構成されたものであってもよい。
【００５８】
ここで、プログラムＡまたはプログラムＢとして、ラダー言語またはＣ言語等を用いたプログラムが挙げられるが、これは本実施形態を限定するものではない。ラダー言語は、第２情報処理装置２が工作機械または生産装置等の動作制御を行う場合に適したプログラミング言語である。例えば、Ｃ言語の場合、ソースはテキストファイルである。例えば、ラダー言語の場合、ソースはラダー図を表現するテキストファイルまたはバイナリファイルであり得る。
【００５９】
本実施形態に係るコンパイル装置１２によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
【００６０】
なお、コンパイル装置１２は、プログラムＢだけでなく、共有変数を定義したプログラムＡにおいても、共有変数にアクセスする命令を、ＡＰＩを介して共有変数にアクセスする機械語命令に置き換えてもよい。この場合、プログラムＡを実行するプログラムＡ管理部２１ａは、共有変数シンボルテーブル２３ｂに前記共有変数名が記録されていない場合、前記共有変数に割り当てる前記アドレスを決定する。プログラムＡ管理部２１ａは、決定した前記アドレスと前記共有変数名とを対応付けて共有変数シンボルテーブル２３ｂに記録する。
【００６１】
（識別子の構成例１）
以下、本実施形態１に係る識別子の構成例１について説明する。識別子の構成例１として、例えばコンパイル実行時にユーザによって指定された引数であってもよい。そして、識別子取得部１２１ａは、この引数を前記識別子として用いる。
【００６２】
（識別子の構成例２）
以下、本実施形態１に係る識別子の他の構成例について説明する。識別子は、前記引数に限定されない。例えば、識別子は、前記プログラムＡが配置される予定のパスを含んでいてもよい。ユーザは、プログラムＡを作成する際に、プログラムＡを配置する予定であるディレクトリのパスをプログラムＡ内で規定しておく。または、プログラムＡ自身が、プログラムＡのパスを取得してもよい。第１情報処理装置１と第２情報処理装置２とは、分かれておらず同じ情報処理装置であってもよい。
【００６３】
（識別子の構成例３）
以下、本実施形態１に係る識別子の更に他の構成例について説明する。識別子は、前記引数および前記パスに限定されない。例えば、識別子は、前記プログラムＡのファイル名を含んでいてもよい。パスと同様に、ファイル名はプログラムＡ内で規定されていてもよいし、プログラムＡ自身がプログラムＡのファイル名を取得してもよい。
【００６４】
（識別子の取得例１）
以下、本実施形態１に係る識別子の取得例について説明する。上述したように、識別子取得部１２１ａは、プログラムＡの識別子を取得する。具体的には、識別子取得部１２１ａは、設定ファイルから、前記識別子を取得する。プログラムＡの識別子を規定する設定ファイルは、所定のディレクトリに格納されている。
【００６５】
（識別子の取得例２）
以下、本実施形態１に係る識別子の他の取得例について説明する。識別子の取得先は、前記設定ファイルに限定されない。例えば、識別子取得部１２１ａは、前記プログラムＡの前記ソースコードから前記識別子を取得してもよい。この場合、前記ソースコードにおいて、前記プログラムＡおよび前記プログラムＢの両方から参照可能な共有変数が定義されている。
【００６６】
（共有変数名生成部の構成）
上述したように、共有変数名生成部１２１ｂは、前記プログラムＡの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。例示として、共有変数名はたとえばＰｒｅｓｓ.ｓｔａｔｕｓ、Ｃｕｔｔｅｒ.ｓｔａｔｕｓ等が挙げられる。
【００６７】
（変換部の構成）
上述したように、変換部１２１ｃは、前記プログラムＡ、Ｂを機械語に変換する。具体的には、変換部１２１ｃは、前記プログラムＡの前記ソースコードにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする機械語命令に置き換える。
【００６８】
変換部１２１ｃは、前記共有変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記共有変数にアクセスする機械語命令に置き換える。
【００６９】
（コンパイル方法）
図４は、本実施形態に係るコンパイル装置１２がプログラムＡのコンパイルおよびリンクを実行する工程のフロチャートである。ステップＳ１において、識別子取得部１２１ａは、プログラムＡ（第１ユーザプログラム）の識別子を取得する。続いて、ステップＳ２において、共有変数名生成部１２１ｂは、プログラムＡの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。続いて、ステップＳ３において、変換部１２１ｃは、プログラムＡを機械語に変換する。続いて、ステップＳ４において、アドレス決定部１２２ａは、前記共有変数のアドレスを決定する。最後に、ステップＳ５において、アドレス決定部１２２ａは、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換されたプログラムＡに埋め込む。
【００７０】
図５は、本実施形態に係るコンパイル装置１２がプログラムＢのコンパイルおよびリンクを実行する工程のフロチャートである。ステップＳ６において、判定部１２１ｄは、プログラムＢのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する。変換部１２１ｃは、プログラムＢを機械語に変換する。このとき、変数が共有変数である場合（Ｓ６でＹｅｓ）、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するＡＰＩを介して前記変数にアクセスする機械語命令に置き換える（Ｓ８）。変数が共有変数ではない場合（Ｓ６でＮｏ）、リンクの段階でアドレス決定部１２２ａは、前記変数にアクセスする命令を、ＡＰＩを利用せずに前記変数のアドレスにアクセスする機械語命令に置き換える（Ｓ７）。ここでは、コンパイルおよびリンクの工程を、合わせて変換工程と称する。
【００７１】
上記の態様によれば、他のプログラムＡが生成した共有変数のアドレスをプログラムＢおよび第１情報処理装置１が知らなくても、プログラムＢが該共有変数にアクセス可能なように、コンパイル装置１２は、プログラムＢをコンパイルおよびリンクすることができる。
【００７２】
このように、変換部１２１ｃが、プログラムＢのソース１１ｂにおける共有変数へのアクセス（書き込み／参照）命令を、ＡＰＩを利用した命令に置き換える。機械語に変換されたプログラムＢにおいて、共有変数のアドレスは決定されない。
【００７３】
なお、非共有変数は、アドレス決定部１２２ａによってアドレスが決定され、機械語のプログラムＢの中の非共有変数の変数名はアドレスに置き換えられる。
【００７４】
〔ソフトウェアによる実現例〕
コンパイル装置１２およびプログラム管理部２１の制御ブロック（特に識別子取得部１２１ａ、共有変数名生成部１２１ｂ、変換部１２１ｃ、判定部１２１ｄ、アドレス決定部１２２ａ、プログラムＡ管理部２１ａ、およびプログラムＢ管理部２１ｂ）は、集積回路（ＩＣチップ）等に形成された論理回路（ハードウェア）によって実現してもよいし、ソフトウェアによって実現してもよい。
【００７５】
後者の場合、コンパイル装置１２およびプログラム管理部２１は、各機能を実現するソフトウェアであるプログラムの命令を実行するコンピュータを備えている。このコンピュータは、例えば１つ以上のプロセッサを備えていると共に、上記プログラムを記憶したコンピュータ読み取り可能な記録媒体を備えている。そして、上記コンピュータにおいて、上記プロセッサが上記プログラムを上記記録媒体から読み取って実行することにより、本発明の目的が達成される。上記プロセッサとしては、例えばＣＰＵ（Central Processing Unit）を用いることができる。上記記録媒体としては、「一時的でない有形の媒体」、例えば、ＲＯＭ（Read Only Memory）等の他、テープ、ディスク、カード、半導体メモリ、プログラマブルな論理回路などを用いることができる。また、上記プログラムを展開するＲＡＭ（Random Access Memory）などをさらに備えていてもよい。また、上記プログラムは、該プログラムを伝送可能な任意の伝送媒体（通信ネットワークや放送波等）を介して上記コンピュータに供給されてもよい。なお、本発明の一態様は、上記プログラムが電子的な伝送によって具現化された、搬送波に埋め込まれたデータ信号の形態でも実現され得る。
【００７６】
本発明は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【符号の説明】
【００７７】
１  第１情報処理装置
２  第２情報処理装置
１１  記憶装置
１２  コンパイル装置
２１  プログラム管理部
２１ａ  プログラムＡ管理部
２１ｂ  プログラムＢ管理部
１２１  コンパイラ
１２１ａ  識別子取得部
１２１ｂ  共有変数名生成部
１２１ｃ  変換部
１２１ｄ  判定部
１２２  リンカ
１２２ａ  アドレス決定部
【図１】
2020008942.tif 000003
【図２】
2020008942.tif 000004
【図３】
2020008942.tif 000005
【図４】
2020008942.tif 000006
【図５】
2020008942.tif 000007