JP6950635B2 - コンパイル装置およびコンパイル方法 - Google Patents

コンパイル装置およびコンパイル方法 Download PDF

Info

Publication number
JP6950635B2
JP6950635B2 JP2018126935A JP2018126935A JP6950635B2 JP 6950635 B2 JP6950635 B2 JP 6950635B2 JP 2018126935 A JP2018126935 A JP 2018126935A JP 2018126935 A JP2018126935 A JP 2018126935A JP 6950635 B2 JP6950635 B2 JP 6950635B2
Authority
JP
Japan
Prior art keywords
variable
program
shared variable
shared
user program
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.)
Active
Application number
JP2018126935A
Other languages
English (en)
Other versions
JP2020008942A (ja
Inventor
航 荒井
航 荒井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Omron Corp
Original Assignee
Omron Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Omron Corp filed Critical Omron Corp
Priority to JP2018126935A priority Critical patent/JP6950635B2/ja
Priority to CN201980039733.7A priority patent/CN112334873A/zh
Priority to PCT/JP2019/023996 priority patent/WO2020008855A1/ja
Priority to EP19830528.6A priority patent/EP3819756A4/en
Priority to US17/251,182 priority patent/US11226814B2/en
Publication of JP2020008942A publication Critical patent/JP2020008942A/ja
Application granted granted Critical
Publication of JP6950635B2 publication Critical patent/JP6950635B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3893Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled in tandem, e.g. multiplier-accumulator
    • G06F9/3895Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled in tandem, e.g. multiplier-accumulator for complex operations, e.g. multidimensional or interleaved address generators, macros
    • G06F9/3897Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled in tandem, e.g. multiplier-accumulator for complex operations, e.g. multidimensional or interleaved address generators, macros with adaptable data path
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Artificial Intelligence (AREA)
  • Evolutionary Computation (AREA)
  • Medical Informatics (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Programmable Controllers (AREA)

Description

本発明は、ユーザプログラム間で共有するデータの意図せずに上書きすることを防止するためのコンパイル装置およびコンパイル方法に関する。
従来では、以下のようなコントロール制御装置が知られている(特許文献1を参照)。すなわち、ユーザプログラムが複数あるとき、それらの間のデータのやり取りはデータ記憶部を介して行う。プログラム間でデータのやり取りを行うにあたっては、データに変数名を与え、その変数名をキーにして各ユーザプログラムがデータ記憶部からデータの書き込みや読み取りを行う。
また、従来では、異なるアプリケーションフレームワーク間のデータサービスのためのプラットフレームが知られている(特許文献2を参照)。
また、従来では、仕様記述もしくは言語記述を処理する言語処理システムにおける入力/出力仕様記述中もしくは入力ソースプログラム/出力オブジェクトプログラム中の名標を管理する言語管理システムの名標管理方式が知られている(特許文献3を参照)。
特開2000−132208号公報 特開2006−244488号公報 特開平4−260134号公報
しかしながら、上記の何れの技術も、プログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きしてしまうことを防止する技術ではない。
本発明の一態様は、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することを目的とする。
上記の課題を解決するために、本発明の一態様に係るコンパイル装置は、第1ユーザプログラムのソースコードにおいて、前記第1ユーザプログラムおよび第2ユーザプログラムの両方から参照可能な共有変数が定義されており、前記第1ユーザプログラムの識別子を取得する識別子取得部と、前記第1ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する共有変数名生成部と、前記第1ユーザプログラムを機械語に変換する変換部と、前記共有変数のアドレスを決定するアドレス決定部と、を備え、前記アドレス決定部は、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第1ユーザプログラムに埋め込む。
上記の態様によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
本発明の一態様では、前記アドレス決定部は、機械語に変換された前記第1ユーザプログラムにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする命令に置き換えてもよい。
上記の態様によれば、前記変換部は、前記共有変数にアクセスする命令を前記共有変数の前記アドレスにアクセスする機械語命令に置き換えることができる。共有変数を定義したプログラムにおいては、アドレスを利用して共有変数にアクセスすることで、高速にアクセスすることができる。
本発明の一態様では、前記識別子取得部は、設定ファイルから、前記識別子を取得することを特徴とする。
上記の態様によれば、前記識別子取得部は、設定ファイルから、前記識別子を取得することができる。
本発明の一態様では、前記識別子取得部は、前記第1ユーザプログラムの前記ソースコードから前記識別子を取得することを特徴とする。
上記の態様によれば、前記識別子取得部は、前記第1ユーザプログラムの前記ソースコードから前記識別子を取得することができる。
本発明の一態様では、前記識別子取得部は、コンパイル実行時にユーザによって指定された引数を前記識別子として用いることを特徴とする。
上記の態様によれば、前記識別子取得部は、前記引数を前記識別子として用いることができる。
本発明の一態様では、前記識別子は、前記第1ユーザプログラムが配置される予定のパスを含むことを特徴とする。
上記の態様によれば、前記識別子は、前記第1ユーザプログラムが配置される予定のパスを含むことができる。
本発明の一態様では、前記識別子は、前記第1ユーザプログラムのファイル名を含むことを特徴とする。
上記の態様によれば、前記識別子は、前記第1ユーザプログラムのファイル名を含むことができる。
上記の課題を解決するために、本発明の一態様に係るコンパイル方法では、第1ユーザプログラムのソースコードにおいて、前記第1ユーザプログラムおよび第2ユーザプログラムの両方から参照可能な共有変数が定義されており、前記第1ユーザプログラムの識別子を取得し、前記第1ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成し、前記第1ユーザプログラムを機械語に変換し、前記共有変数のアドレスを決定し、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第1ユーザプログラムに埋め込むことを特徴とする。
上記の課題を解決するために、本発明の一態様に係るコンパイル装置は、第2ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定部と、前記第2ユーザプログラムを機械語に変換する変換部と、アドレス決定部とを備え、前記変数が共有変数ではない場合、前記アドレス決定部は、前記変数にアクセスする命令を、API(application program interface)を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、前記変数が共有変数である場合、前記変換部は、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記変数にアクセスする機械語命令に置き換えることを特徴とする。
上記の態様によれば、他の第1ユーザプログラムが定義した共有変数に第2ユーザプログラムがアクセス可能なように、第2ユーザプログラムをコンパイルおよびリンクすることができる。
上記の課題を解決するために、本発明の一態様に係るコンパイル方法では、第2ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定工程と、前記第2ユーザプログラムを機械語に変換する変換工程とを含み、前記変換工程では、前記変数が共有変数ではない場合、前記変数にアクセスする命令を、API(application program interface)を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、前記変数が共有変数である場合、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記変数にアクセスする機械語命令に置き換えることを特徴とする。
本発明の一態様によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
一実施形態に係るコンパイル装置を備えた第1情報処理装置の構成の一例を模式的に示すブロック図である。 一実施形態に係る第2情報処理装置の構成の一例を模式的に示すブロック図である。 共有変数シンボルテーブルの詳細を例示する図である。 一実施形態に係るコンパイル装置がプログラムのコンパイルおよびリンクを実行する工程のフロチャートの一例を示す図である。 一実施形態に係るコンパイル装置がプログラムのコンパイルおよびリンクを実行する工程のフロチャートの一例を示す図である。
§1 適用例
図1を用いて、本実施形態に係るコンパイル装置の適用場面の一例について説明する。図1は、本実施形態に係るコンパイル装置12を備えた第1情報処理装置1の構成の一例を模式的に示すブロック図である。本実施形態に係るコンパイル装置12は、共有変数を定義するユーザプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止するための装置である。
コンパイル装置12は、第1ユーザプログラムのソースコードに含まれる共有変数の変数名と、識別子とを含む共有変数名を生成する。識別子は複数のユーザプログラムを互いに区別可能にする識別子である。コンパイル装置12は、共有変数名と共有変数のアドレスとを対応付けて、機械語に変換された第1ユーザプログラムに埋め込む。複数のユーザプログラムのソースコードにおいて、複数の共有変数に対して同じ変数名が意図せず付与されていたとしても、共有変数にアクセスする第2ユーザプログラムは、識別子を含む共有変数名でそれぞれの共有変数を区別することができる。
§2 構成例
(第1情報処理装置の構成)
図1に示すように、第1情報処理装置1は、記憶装置11と、コンパイル装置12とを備える。記憶装置11は、第1ユーザプログラム(以下プログラムAと称する)のソース11aと、第2ユーザプログラム(以下プログラムBと称する)のソース11bとを記憶している。コンパイル装置12は、コンパイラ121と、リンカ122とを備える。コンパイラ121は、識別子取得部121aと、共有変数名生成部121bと、変換部121cと、判定部121dとを備える。リンカ122は、アドレス決定部122aを備える。
プログラムAのソース11aは、その中で共有変数を定義している。即ちプログラムAのソース11aには、共有変数を生成し該共有変数に値を書き込む命令が記述されている。プログラムBのソース11bは、その中で前記共有変数を参照する。即ちプログラムBのソース11bには、前記共有変数を読み出す命令が記述されている。
また、記憶装置11は、例えば、不揮発性のメモリ、またはハードディスク等であるが、これに限らない。記憶装置11を備えることにより、データ消失を確実に防止することができる。
コンパイル装置12は、記憶装置11のプログラムAのソース11a(例えば、ユーザによってプログラムコードが記述されたテキストファイル)をコンパイルし、リンクする。プログラムAのソース11aがコンパイルされかつリンクされると実行形式のプログラムになる。なお、本明細書では、コンパイルおよびリンクの処理を合わせて、「コンパイルする」と表現することがある。
具体的には、プログラムAのソースコードにおいて、前記プログラムAおよび前記プログラムBの両方から参照可能な共有変数が定義されている。識別子取得部121aは、前記プログラムAの識別子を取得する。判定部121dは、前記プログラムAの前記ソースコードに記述されている変数が、共有変数か非共有変数かを判定する。例えば、ソースコードにおいて、所定の宣言をすることにより、変数が共有変数であるか非共有変数であるかが定義されていてもよい。共有変数名生成部121bは、前記プログラムAの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。変換部121cは、前記プログラムAの前記ソースコードを機械語に変換する。例えば、コンパイラ121は、プログラムAのソースコードから複数のオブジェクトコードを生成する。オブジェクトコードは機械語コードおよびリロケーション情報等を含む。共有変数名生成部121bは、共有変数の変数名を生成した共有変数名に置き換える。オブジェクトコードにおいて、共有変数へのアクセス命令は、シンボリックな参照(共有変数名を用いた参照)によって記述されている。
リンカ122は、リンケージエディタとも呼ばれる。リンカ122は、コンパイラ121により変換された複数のオブジェクトコードを結合する。アドレス決定部122aは、前記共有変数のアドレスを決定する。アドレス決定部122aは、オブジェクトコードにおけるシンボリックな参照を用いた共有変数へのアクセス(書き込み/参照)命令を、前記アドレスを用いた共有変数へのアクセス命令に置き換える。即ち、アドレス決定部122aは、機械語に変換されたプログラムAにおける、共有変数へアクセスする命令を、共有変数のアドレスにアクセスする命令に置き換える。また、アドレス決定部122aは、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換されたプログラムAに埋め込む。例えば、共有変数名とアドレスとは、シンボルテーブルとしてプログラムAに埋め込まれる。
機械語の(実行形式に変換された)プログラムAは記憶装置11に記憶される。第1情報処理装置1は機械語のプログラムAを第2情報処理装置2に送信する。
(第2情報処理装置の構成)
図2は、本実施形態に係る第2情報処理装置2の構成の一例を模式的に示すブロック図である。第2情報処理装置2は、例えばPLC(プログラマブルロジックコントローラ)等の各種の機器の動作を制御する制御装置であってもよい。第2情報処理装置2は、プログラム管理部21と、補助記憶装置22と、メモリ23とを備える。
プログラム管理部21は、プログラムA管理部21aと、プログラムB管理部21bとを含む。プログラムA管理部21aは、機械語のプログラムAを実行する。プログラムB管理部21bは、機械語のプログラムBを実行する。
補助記憶装置22は、第1情報処理装置1から受け取ったプログラムAおよびプログラムBを格納する。メモリ23は、プログラムAおよびプログラムBを一時的に記憶する。補助記憶装置22は、例えば、不揮発性のメモリ、またはハードディスク等であるが、これに限らない。
メモリ23は、プログラムAおよびプログラムBを一時的に記憶する。メモリ23は、例えば揮発性のメモリ等であるが、これに限らない。メモリ23は、データ記憶部23aと、共有変数シンボルテーブル23bとを備える。データ記憶部23aは、プログラムAおよびプログラムBの両方から参照可能な共有変数のデータを記憶している。
ここでいう共有変数とは、複数のユーザプログラムから参照可能な変数のことを指す。共有変数シンボルテーブル23bは、データ記憶部23aに記憶されている前記共有変数の記憶場所(アドレス)を記憶している。
(プログラムAの実行)
図3は、共有変数シンボルテーブル23bの詳細を例示する図である。プログラムA管理部21aは、ユーザからプログラムAを実行する指示を受けると、補助記憶装置22からプログラムAをロードし、メモリ23にプログラムAを記憶させる。補助記憶装置22に格納されたプログラムAは、機械語に変換された(コンパイルおよびリンクされた)プログラムである。機械語に変換されたプログラムAは、共有変数名と該共有変数のアドレスとの対応関係を示すシンボルテーブルを含む。非共有変数は、プログラムAの中だけで使用され、プログラムAのみが参照可能な変数である。コンパイルされたプログラムAにおいて、非共有変数のアドレスが規定されている。コンパイルされたプログラムAにおいて、非共有変数の変数名の情報は残っていなくてもよい。ただし、プログラムAは、コンパイルされた後でも、共有変数の共有変数名の情報とアドレスの情報とを含む。
プログラムA管理部21aは、共有変数名の情報、および対応するアドレスの情報を取得する。プログラムA管理部21aは、前記共有変数名と、前記共有変数の前記アドレスとを対応付けて、共有変数シンボルテーブル23bに記録する。また、プログラムA管理部21aは、データ記憶部23aの前記アドレスに、前記共有変数のデータを書き込む。
(識別子)
ユーザプログラムの識別子は、該ユーザプログラムに固有の文字列または数値である。複数のユーザプログラムの識別子は、互いに重複しないように設定される。例えば、ユーザプログラムのプログラム名、ユーザプログラムの配置先ディレクトリのパス、ユーザが任意に設定する文字列、UUID(universally unique identifier)、またはドメイン名を、該ユーザプログラムの識別子としてもよい。
図3の例示では、プログラムAの識別子が「Press」である。変数名「status」は、プログラムAのソースコードで定義された共有変数の変数名である。共有変数名生成部121bは、識別子「Press」と元々の変数名「status」を組み合わせることで、該共有変数の共有変数名「Press.status」を生成する。共有変数名「Press.status」は、他のプログラムBから該共有変数を参照するときにキーとして使用される変数名である。ここでは、識別子と変数名との間に「.」を加えているが、代わりに任意の文字または文字列を用いてもよい。また、識別子と変数名との間の文字はなくてもよい。識別子と変数名との順番も任意である。例えば、図3に例示する「Cutter.status」は、プログラムBで定義される共有変数の、共有変数名である。プログラムBの識別子が「Cutter」である。プログラムBで定義されている共有変数の変数名は「status」である。共有変数名生成部121bは、所定の規則に沿って識別子と変数名とを含む共有変数名を生成する。これにより、複数のユーザプログラムにおいて、変数名「status」が同じ複数の共有変数が定義されていても、共有変数名の衝突を回避することができる。共有変数名はたとえばPress.status、Cutter.statusを挙げ、これらの共有変数名に対応するアドレスはそれぞれ0X00000000、0X00000001を挙げたが、これは本実施形態を限定するものではない。
(プログラムBのコンパイルおよびリンク)
プログラムBはプログラムAが定義した(生成した)共有変数を参照(読み出し)する。第1情報処理装置1のコンパイル装置12は、プログラムBのソース11bのコンパイルおよびリンクを行う。
具体的には、プログラムBのソースコードにおいて、他のプログラムAで定義された共有変数を参照する命令が記述されている。なお、ユーザは、参照する共有変数の共有変数名「Press.status」を知っているものとする。例えば、ユーザは、プログラムBを作る際に、共有変数の変数名として共有変数名「Press.status」を使用してソースコードを記述する。
判定部121dは、前記プログラムBの前記ソースコードに記述されている変数が、共有変数か非共有変数かを判定する。また、判定部121dは、前記プログラムBの前記ソースコードに記述されている共有変数が、プログラムBの中で生成(定義)された共有変数か、他のプログラムの中で生成(定義)された共有変数かを判定する。例えば、ソースコードにおいて、所定の宣言をすることにより、変数が自プログラムで生成された共有変数であるか、他のプログラムで生成された共有変数であるか、非共有変数であるかが定義されていてもよい。また、例えば、判定部121dは、変数の変数名に所定の識別子(他のプログラムの識別子)が含まれる場合、該変数を他のプログラムの中で生成された共有変数であると判定してもよい。
変換部121cは、前記プログラムBの前記ソースコードを機械語に変換する。変数が自プログラムで生成された共有変数である場合、コンパイルおよびリンクの方法はプログラムAに関して説明した通りである。
変数が他のプログラム(例えばプログラムA)で生成された共有変数である場合について説明する。変数が他のプログラム(例えばプログラムA)で生成された共有変数である場合、変換部121cは、前記プログラムBの前記ソースコードにおける共有変数にアクセス(参照)する命令を、API(application program interface)を介して前記共有変数にアクセスする機械語命令に置き換える。このAPIは、共有変数のアドレスを知っているプログラム管理部21が提供するAPIである。プログラム管理部21は、共有変数名をキーにして、共有変数シンボルテーブル23bから共有変数のアドレスを取得することができる。
例えば、プログラム管理部21(プログラムA管理部21aおよびプログラムB管理部21b)は、共有変数名をキーにして共有変数の値(データ)を返す第1API、または、共有変数名をキーにして共有変数のアドレス返す第2APIおよびアドレスをキーにして変数(共有変数)の値を返す第3APIを提供する。変換部121cは、前記プログラムBの前記ソースコードにおける共有変数にアクセス(参照)する命令を、第1APIを介して共有変数を参照する機械語命令に置き換えてもよい。変換部121cは、前記プログラムBの前記ソースコードにおける共有変数にアクセス(参照)する命令を、第2APIを介してアドレスを取得する機械語命令と、第3APIを介して共有変数を参照する機械語命令とに置き換えてもよい。
リンカ122は、コンパイラ121により変換された複数のオブジェクトコードを結合する。他のプログラムで生成された共有変数に対しては、アドレスは決定されない。変数が非共有変数である場合(共有変数ではない場合)、アドレス決定部122aは、機械語に変換されたプログラムBにおける(シンボリックな参照を用いた)前記変数にアクセスする命令を、APIを利用せずに前記変数のアドレスにアクセスする機械語命令に置き換える。
機械語の(実行形式に変換された)プログラムBは記憶装置11に記憶される。第1情報処理装置1は機械語のプログラムBを第2情報処理装置2に送信する。なお、プログラムAとプログラムBとは、互いに異なる情報処理装置においてコンパイルおよびリンクされてもよい。
(プログラムBの実行)
第2情報処理装置2において、プログラムAは先に実行され、プログラムAで定義された共有変数の共有変数名およびアドレスは、共有変数シンボルテーブル23bに記録されている。プログラムB管理部21bは、ユーザからプログラムBを実行する指示を受けると、補助記憶装置22からプログラムAをロードし、メモリ23にプログラムAを記憶させる。補助記憶装置22に格納されたプログラムBは、機械語に変換された(コンパイルおよびリンクされた)プログラムである。機械語に変換されたプログラムBは、共有変数名をキーとして共有変数を参照するAPI(第1API、第2APIまたは第3API)を呼び出す命令を含む。コンパイルされたプログラムBにおいて、非共有変数のアドレスが規定されている。コンパイルされたプログラムBにおいて、非共有変数の変数名の情報は残っていなくてもよい。ただし、プログラムBは、コンパイルされた後でも、共有変数の共有変数名の情報を含む。
プログラムBは、キーとして共有変数の共有変数名「Press.status」をAPI関数を介してプログラムB管理部21bに渡す。プログラムB管理部21bは、共有変数シンボルテーブル23bから該共有変数名に対応するアドレスを取得する。プログラムB管理部21bは、アドレスをキーにしてデータ記憶部23aから共有変数のデータを取得する。プログラムB管理部21bは、共有変数のデータをプログラムBに返す。このように、プログラムB管理部21bは、共有変数シンボルテーブル23bを参照して、共有変数のアドレスを知ることができる。
通常、コンパイラ型のユーザプログラムは、機械語に変換されている。そのため、ソースファイルで規定した変数名は、アドレスに変換されており、残っていない。上記の態様によれば、共有変数を参照するAPIを用いることで、コンパイルおよびリンクされたプログラムBの中の共有変数名はキーとして残る。
前記プログラムAと、前記プログラムBとは、互いに異なるプログラミング言語で構成されたものであってもよい。上記の態様によれば、互いに異なるプログラミング言語で構成されたプログラムAとプログラムBとの間で、変数を共有することができる。例えば、プログラムAと、プログラムBとは、同じプログラミング言語で構成されたものであってもよい。
ここで、プログラムAまたはプログラムBとして、ラダー言語またはC言語等を用いたプログラムが挙げられるが、これは本実施形態を限定するものではない。ラダー言語は、第2情報処理装置2が工作機械または生産装置等の動作制御を行う場合に適したプログラミング言語である。例えば、C言語の場合、ソースはテキストファイルである。例えば、ラダー言語の場合、ソースはラダー図を表現するテキストファイルまたはバイナリファイルであり得る。
本実施形態に係るコンパイル装置12によれば、共有変数を定義するプログラムが複数存在する場合、変数名が衝突し意図せずにデータを上書きすることを防止することができる。
なお、コンパイル装置12は、プログラムBだけでなく、共有変数を定義したプログラムAにおいても、共有変数にアクセスする命令を、APIを介して共有変数にアクセスする機械語命令に置き換えてもよい。この場合、プログラムAを実行するプログラムA管理部21aは、共有変数シンボルテーブル23bに前記共有変数名が記録されていない場合、前記共有変数に割り当てる前記アドレスを決定する。プログラムA管理部21aは、決定した前記アドレスと前記共有変数名とを対応付けて共有変数シンボルテーブル23bに記録する。
(識別子の構成例1)
以下、本実施形態1に係る識別子の構成例1について説明する。識別子の構成例1として、例えばコンパイル実行時にユーザによって指定された引数であってもよい。そして、識別子取得部121aは、この引数を前記識別子として用いる。
(識別子の構成例2)
以下、本実施形態1に係る識別子の他の構成例について説明する。識別子は、前記引数に限定されない。例えば、識別子は、前記プログラムAが配置される予定のパスを含んでいてもよい。ユーザは、プログラムAを作成する際に、プログラムAを配置する予定であるディレクトリのパスをプログラムA内で規定しておく。または、プログラムA自身が、プログラムAのパスを取得してもよい。第1情報処理装置1と第2情報処理装置2とは、分かれておらず同じ情報処理装置であってもよい。
(識別子の構成例3)
以下、本実施形態1に係る識別子の更に他の構成例について説明する。識別子は、前記引数および前記パスに限定されない。例えば、識別子は、前記プログラムAのファイル名を含んでいてもよい。パスと同様に、ファイル名はプログラムA内で規定されていてもよいし、プログラムA自身がプログラムAのファイル名を取得してもよい。
(識別子の取得例1)
以下、本実施形態1に係る識別子の取得例について説明する。上述したように、識別子取得部121aは、プログラムAの識別子を取得する。具体的には、識別子取得部121aは、設定ファイルから、前記識別子を取得する。プログラムAの識別子を規定する設定ファイルは、所定のディレクトリに格納されている。
(識別子の取得例2)
以下、本実施形態1に係る識別子の他の取得例について説明する。識別子の取得先は、前記設定ファイルに限定されない。例えば、識別子取得部121aは、前記プログラムAの前記ソースコードから前記識別子を取得してもよい。この場合、前記ソースコードにおいて、前記プログラムAおよび前記プログラムBの両方から参照可能な共有変数が定義されている。
(共有変数名生成部の構成)
上述したように、共有変数名生成部121bは、前記プログラムAの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。例示として、共有変数名はたとえばPress.status、Cutter.status等が挙げられる。
(変換部の構成)
上述したように、変換部121cは、前記プログラムA、Bを機械語に変換する。具体的には、変換部121cは、前記プログラムAの前記ソースコードにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする機械語命令に置き換える。
変換部121cは、前記共有変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記共有変数にアクセスする機械語命令に置き換える。
(コンパイル方法)
図4は、本実施形態に係るコンパイル装置12がプログラムAのコンパイルおよびリンクを実行する工程のフロチャートである。ステップS1において、識別子取得部121aは、プログラムA(第1ユーザプログラム)の識別子を取得する。続いて、ステップS2において、共有変数名生成部121bは、プログラムAの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する。続いて、ステップS3において、変換部121cは、プログラムAを機械語に変換する。続いて、ステップS4において、アドレス決定部122aは、前記共有変数のアドレスを決定する。最後に、ステップS5において、アドレス決定部122aは、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換されたプログラムAに埋め込む。
図5は、本実施形態に係るコンパイル装置12がプログラムBのコンパイルおよびリンクを実行する工程のフロチャートである。ステップS6において、判定部121dは、プログラムBのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する。変換部121cは、プログラムBを機械語に変換する。このとき、変数が共有変数である場合(S6でYes)、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記変数にアクセスする機械語命令に置き換える(S8)。変数が共有変数ではない場合(S6でNo)、リンクの段階でアドレス決定部122aは、前記変数にアクセスする命令を、APIを利用せずに前記変数のアドレスにアクセスする機械語命令に置き換える(S7)。ここでは、コンパイルおよびリンクの工程を、合わせて変換工程と称する。
上記の態様によれば、他のプログラムAが生成した共有変数のアドレスをプログラムBおよび第1情報処理装置1が知らなくても、プログラムBが該共有変数にアクセス可能なように、コンパイル装置12は、プログラムBをコンパイルおよびリンクすることができる。
このように、変換部121cが、プログラムBのソース11bにおける共有変数へのアクセス(書き込み/参照)命令を、APIを利用した命令に置き換える。機械語に変換されたプログラムBにおいて、共有変数のアドレスは決定されない。
なお、非共有変数は、アドレス決定部122aによってアドレスが決定され、機械語のプログラムBの中の非共有変数の変数名はアドレスに置き換えられる。
〔ソフトウェアによる実現例〕
コンパイル装置12およびプログラム管理部21の制御ブロック(特に識別子取得部121a、共有変数名生成部121b、変換部121c、判定部121d、アドレス決定部122a、プログラムA管理部21a、およびプログラムB管理部21b)は、集積回路(ICチップ)等に形成された論理回路(ハードウェア)によって実現してもよいし、ソフトウェアによって実現してもよい。
後者の場合、コンパイル装置12およびプログラム管理部21は、各機能を実現するソフトウェアであるプログラムの命令を実行するコンピュータを備えている。このコンピュータは、例えば1つ以上のプロセッサを備えていると共に、上記プログラムを記憶したコンピュータ読み取り可能な記録媒体を備えている。そして、上記コンピュータにおいて、上記プロセッサが上記プログラムを上記記録媒体から読み取って実行することにより、本発明の目的が達成される。上記プロセッサとしては、例えばCPU(Central Processing Unit)を用いることができる。上記記録媒体としては、「一時的でない有形の媒体」、例えば、ROM(Read Only Memory)等の他、テープ、ディスク、カード、半導体メモリ、プログラマブルな論理回路などを用いることができる。また、上記プログラムを展開するRAM(Random Access Memory)などをさらに備えていてもよい。また、上記プログラムは、該プログラムを伝送可能な任意の伝送媒体(通信ネットワークや放送波等)を介して上記コンピュータに供給されてもよい。なお、本発明の一態様は、上記プログラムが電子的な伝送によって具現化された、搬送波に埋め込まれたデータ信号の形態でも実現され得る。
本発明は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
1 第1情報処理装置
2 第2情報処理装置
11 記憶装置
12 コンパイル装置
21 プログラム管理部
21a プログラムA管理部
21b プログラムB管理部
121 コンパイラ
121a 識別子取得部
121b 共有変数名生成部
121c 変換部
121d 判定部
122 リンカ
122a アドレス決定部

Claims (10)

  1. 第1ユーザプログラムのソースコードにおいて、前記第1ユーザプログラムおよび第2ユーザプログラムの両方から参照可能な共有変数が定義されており、
    前記第1ユーザプログラムの識別子を取得する識別子取得部と、
    前記第1ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成する共有変数名生成部と、
    前記第1ユーザプログラムを機械語に変換する変換部と、
    前記共有変数のアドレスを決定するアドレス決定部と、を備え、
    前記アドレス決定部は、前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第1ユーザプログラムに埋め込むことを特徴とするコンパイル装置。
  2. 前記アドレス決定部は、機械語に変換された前記第1ユーザプログラムにおける前記共有変数にアクセスする命令を、前記共有変数の前記アドレスにアクセスする命令に置き換えることを特徴とする請求項1に記載のコンパイル装置。
  3. 前記識別子取得部は、設定ファイルから、前記識別子を取得することを特徴とする請求項1または2に記載のコンパイル装置。
  4. 前記識別子取得部は、前記第1ユーザプログラムの前記ソースコードから前記識別子を取得することを特徴とする請求項1または2に記載のコンパイル装置。
  5. 前記識別子取得部は、コンパイル実行時にユーザによって指定された引数を前記識別子として用いることを特徴とする請求項1または2に記載のコンパイル装置。
  6. 前記識別子は、前記第1ユーザプログラムが配置される予定のパスを含むことを特徴とする請求項1から5のいずれか一項に記載のコンパイル装置。
  7. 前記識別子は、前記第1ユーザプログラムのファイル名を含むことを特徴とする請求項1から5のいずれか一項に記載のコンパイル装置。
  8. 第1ユーザプログラムのソースコードにおいて、前記第1ユーザプログラムおよび第2ユーザプログラムの両方から参照可能な共有変数が定義されており、
    前記第1ユーザプログラムの識別子を取得し、
    前記第1ユーザプログラムの前記ソースコードにおける前記共有変数の変数名と、前記識別子とを含む共有変数名を生成し、
    前記第1ユーザプログラムを機械語に変換し、
    前記共有変数のアドレスを決定し、
    前記共有変数名と前記共有変数の前記アドレスとを対応付けて、機械語に変換された前記第1ユーザプログラムに埋め込むことを特徴とするコンパイル方法。
  9. 第2ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定部と、
    前記第2ユーザプログラムを機械語に変換する変換部と、
    アドレス決定部とを備え、
    前記変数が共有変数ではない場合、前記アドレス決定部は、前記変数にアクセスする命令を、API(application program interface)を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、
    前記変数が共有変数である場合、前記変換部は、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記変数にアクセスする機械語命令に置き換えることを特徴とするコンパイル装置。
  10. 第2ユーザプログラムのソースコードにおいて参照されている変数が、共有変数であるか否かを判定する判定工程と、
    前記第2ユーザプログラムを機械語に変換する変換工程とを含み、
    前記変換工程では、
    前記変数が共有変数ではない場合、前記変数にアクセスする命令を、API(application program interface)を利用せずに前記変数のアドレスにアクセスする機械語命令に置き換え、
    前記変数が共有変数である場合、前記変数にアクセスする命令を、前記共有変数のアドレスを知っているプログラム管理部が提供するAPIを介して前記変数にアクセスする機械語命令に置き換えることを特徴とするコンパイル方法。
JP2018126935A 2018-07-03 2018-07-03 コンパイル装置およびコンパイル方法 Active JP6950635B2 (ja)

Priority Applications (5)

Application Number Priority Date Filing Date Title
JP2018126935A JP6950635B2 (ja) 2018-07-03 2018-07-03 コンパイル装置およびコンパイル方法
CN201980039733.7A CN112334873A (zh) 2018-07-03 2019-06-18 编译装置以及编译方法
PCT/JP2019/023996 WO2020008855A1 (ja) 2018-07-03 2019-06-18 コンパイル装置およびコンパイル方法
EP19830528.6A EP3819756A4 (en) 2018-07-03 2019-06-18 COMPILERS AND COMPILATION METHODS
US17/251,182 US11226814B2 (en) 2018-07-03 2019-06-18 Compiler device and compiling method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018126935A JP6950635B2 (ja) 2018-07-03 2018-07-03 コンパイル装置およびコンパイル方法

Publications (2)

Publication Number Publication Date
JP2020008942A JP2020008942A (ja) 2020-01-16
JP6950635B2 true JP6950635B2 (ja) 2021-10-13

Family

ID=69059557

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018126935A Active JP6950635B2 (ja) 2018-07-03 2018-07-03 コンパイル装置およびコンパイル方法

Country Status (5)

Country Link
US (1) US11226814B2 (ja)
EP (1) EP3819756A4 (ja)
JP (1) JP6950635B2 (ja)
CN (1) CN112334873A (ja)
WO (1) WO2020008855A1 (ja)

Family Cites Families (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04260134A (ja) 1991-02-15 1992-09-16 Nec Corp 言語処理システムの名標管理方式
US6067413A (en) * 1996-06-13 2000-05-23 Instantations, Inc. Data representation for mixed-language program development
JP3266097B2 (ja) * 1998-03-20 2002-03-18 日本電気株式会社 非リエントラントプログラムの自動リエントラント化方法及びシステム
US20020032901A1 (en) * 1998-05-29 2002-03-14 Sun Microsystems Inc Unitary data structure systems, methods, and computer program products, for global conflict determination
JP3548777B2 (ja) 1998-10-28 2004-07-28 オムロン株式会社 コントロール制御装置
JP2001109632A (ja) * 1999-10-13 2001-04-20 Nec Ic Microcomput Syst Ltd プログラム翻訳システム及びプログラム翻訳方法
JP2001282864A (ja) * 2000-03-29 2001-10-12 Matsushita Electric Ind Co Ltd 機能ブロック修正方法
JP3901530B2 (ja) * 2001-01-31 2007-04-04 株式会社東芝 ソフトウェア・ハードウェア言語モデル変換装置及びプログラム
JP4500040B2 (ja) * 2003-01-06 2010-07-14 パナソニック株式会社 コンパイラプログラム、コンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体、コンパイル方法及びコンパイル装置
CN100388200C (zh) * 2003-01-06 2008-05-14 松下电器产业株式会社 编译方法、编译单元,目标程序执行方法及单元
US7712080B2 (en) * 2003-05-21 2010-05-04 The Regents Of The University Of California Systems and methods for parallel distributed programming
US7380086B2 (en) * 2003-12-12 2008-05-27 International Business Machines Corporation Scalable runtime system for global address space languages on shared and distributed memory machines
JP2005228047A (ja) * 2004-02-13 2005-08-25 Toshiba Corp 言語処理装置及び言語処理プログラム
US7366956B2 (en) * 2004-06-16 2008-04-29 Hewlett-Packard Development Company, L.P. Detecting data races in multithreaded computer programs
US7757237B2 (en) * 2004-06-16 2010-07-13 Hewlett-Packard Development Company, L.P. Synchronization of threads in a multithreaded computer program
US7555748B2 (en) * 2004-08-30 2009-06-30 International Business Machines Corporation Method and apparatus for improving data cache performance using inter-procedural strength reduction of global objects
JP2006099639A (ja) * 2004-09-30 2006-04-13 Denso Wave Inc プログラム作成装置,制御装置及びコンピュータプログラム
CN1790268A (zh) * 2004-12-14 2006-06-21 艾克斯麦提克方案私人有限公司 通过散列技术的编译时间链接
US7853961B2 (en) 2005-02-28 2010-12-14 Microsoft Corporation Platform for data services across disparate application frameworks
US8161464B2 (en) * 2006-04-11 2012-04-17 International Business Machines Corporation Compiling source code
US7725881B2 (en) * 2006-06-09 2010-05-25 Microsoft Corporation Automatically extracting coupling metrics from compiled code
US20080005728A1 (en) * 2006-06-30 2008-01-03 Robert Paul Morris Methods, systems, and computer program products for enabling cross language access to an addressable entity in an execution environment
US20080005727A1 (en) * 2006-06-30 2008-01-03 Robert Paul Morris Methods, systems, and computer program products for enabling cross language access to an addressable entity
CN101782860B (zh) * 2009-01-21 2013-10-09 华为技术有限公司 一种程序链接方法及装置
US8549468B2 (en) * 2010-02-08 2013-10-01 National Tsing Hua University Method, system and computer readable storage device for generating software transaction-level modeling (TLM) model
US20120233410A1 (en) * 2011-03-13 2012-09-13 National Tsing Hua University Shared-Variable-Based (SVB) Synchronization Approach for Multi-Core Simulation
KR101219535B1 (ko) * 2011-04-28 2013-01-10 슈어소프트테크주식회사 코드 컨버팅 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
US8898648B2 (en) * 2012-11-30 2014-11-25 International Business Machines Corporation Methodology for fast detection of false sharing in threaded scientific codes
US10261889B2 (en) * 2014-06-25 2019-04-16 Microsoft Technology Licensing, Llc Techniques for edit-and-continue and enhanced optimized debugging on optimized code
US9940267B2 (en) * 2016-05-17 2018-04-10 Nxp Usa, Inc. Compiler global memory access optimization in code regions using most appropriate base pointer registers
CN106407111B (zh) * 2016-09-07 2019-05-17 努比亚技术有限公司 终端测试装置、终端测试设备及变量维护方法
JP6821497B2 (ja) * 2017-04-27 2021-01-27 株式会社日立産機システム 産業用コントローラのプログラム開発システム及び産業用コントローラのプログラム開発システムにおけるデータ共有方法
JP2019144762A (ja) * 2018-02-19 2019-08-29 株式会社東芝 プログラマブルコントローラ

Also Published As

Publication number Publication date
JP2020008942A (ja) 2020-01-16
US20210216309A1 (en) 2021-07-15
WO2020008855A1 (ja) 2020-01-09
CN112334873A (zh) 2021-02-05
EP3819756A1 (en) 2021-05-12
US11226814B2 (en) 2022-01-18
EP3819756A4 (en) 2022-03-23

Similar Documents

Publication Publication Date Title
JP3689368B2 (ja) データ処理リソースを備えたマルチアプリケーション組込システムにアプリケーションをローディングする方法、対応するシステムおよび実行方法
JP4638484B2 (ja) データ処理装置におけるデータ整合性
CN112685030A (zh) 一种生成业务代码的方法、装置、存储介质及电子设备
CN101208690A (zh) 计算环境中翻译表达式
CN116521181B (zh) 基于游戏系统的脚本数据处理方法、装置、设备及介质
JP6950635B2 (ja) コンパイル装置およびコンパイル方法
JP6950634B2 (ja) 制御装置および制御方法
CN112416612A (zh) 服务调用方法、装置、计算机设备和可读存储介质
JP6720993B2 (ja) サポート装置およびサポートプログラム
CN115658140A (zh) 一种sdk的打包方法、装置、终端以及存储介质
US20160283291A1 (en) Facilitating communication between software components that use middleware
JP6455096B2 (ja) コントロールシステム、その支援装置、プログラマブルコントロール装置
JP5141095B2 (ja) プラントコントローラシステム
CN106547519B (zh) 信息处理方法及系统
JP2014228990A (ja) 制御プログラム作成装置および制御プログラム作成方法
CN114816418A (zh) 一种嵌入式操作系统的搭建方法、装置、设备和介质
CN112988225A (zh) 注解配置方法、装置、设备及存储介质
JP2007213392A (ja) Sqlトレース取得システム及び方法
CN111061538A (zh) 一种多Lua虚拟机内存优化方法及其系统
JP2019179383A (ja) Api処理方法、端末、api処理プログラム
JP2016062311A (ja) 更新装置及び情報処理方法
JP2009098963A (ja) モジュール自動生成システム
JP2006113935A (ja) ダイナミックリンクライブラリ呼び出しコード生成方法、プログラム、および、装置
KR101598819B1 (ko) 타겟 독립적인 디버깅 정보를 이용한 코드 변환 방법과 그를 위한 장치 및 컴퓨터로 읽을 수 있는 기록매체
JP4120879B2 (ja) プログラム生成システム及び方法とそのプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20201215

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: 20210824

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210906

R150 Certificate of patent or registration of utility model

Ref document number: 6950635

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150