JP2011123719A - 言語処理システム、言語処理方法、及び言語処理用プログラム - Google Patents

言語処理システム、言語処理方法、及び言語処理用プログラム Download PDF

Info

Publication number
JP2011123719A
JP2011123719A JP2009281554A JP2009281554A JP2011123719A JP 2011123719 A JP2011123719 A JP 2011123719A JP 2009281554 A JP2009281554 A JP 2009281554A JP 2009281554 A JP2009281554 A JP 2009281554A JP 2011123719 A JP2011123719 A JP 2011123719A
Authority
JP
Japan
Prior art keywords
segment
data
information
compiler
object code
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.)
Pending
Application number
JP2009281554A
Other languages
English (en)
Inventor
Akira Egashira
朗 江頭
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.)
Renesas Electronics Corp
Original Assignee
Renesas Electronics 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 Renesas Electronics Corp filed Critical Renesas Electronics Corp
Priority to JP2009281554A priority Critical patent/JP2011123719A/ja
Publication of JP2011123719A publication Critical patent/JP2011123719A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】セグメントレジスタへの設定コードを最小限に抑えて、オブジェクトのコードサイズを削減する。
【解決手段】1回目のコンパイルで従来のコンパイラと同様にオブジェクトコードを生成する。この場合は、セグメントレジスタに値を設定するコードを生成する。このコードを受け取ったリンカが「変数がどのセグメント番号に割り当たるか」という情報(この情報の集合体を「セグメント情報」と呼ぶ)を出力し、その情報を利用して再度コンパイルする。2回目以降のコンパイル時にはセグメント情報から変数のセグメント番号が分かっているので、セグメントレジスタの書き換えが必要かどうか分かる。セグメントレジスタの書き換えが不要だと分かればセグメントレジスタの設定コードを削減することができる。
【選択図】図4

Description

本発明は、ソース入力手段、構文解析手段、オブジェクトコード生成手段を有する言語処理プログラムに関する。
16ビットのマイクロプロセッサは、通常、16ビットで表現できる64キロバイトのアドレス空間を持つ。近年の市場では、64キロバイトを超えるメモリを必要とする場合が増えてきている。しかし、64キロバイトを超えるアドレス空間を扱える24ビットマイクロプロセッサや32ビットマイクロプロセッサは価格が高く、安価な16ビットマイクロプロセッサで64キロバイトを超えるメモリをアクセスできるプロセッサが市場で求められている。
この市場のニーズ(要求)に答えて、16ビットのマイクロプロセッサで64キロバイトを超えるアドレス空間をアクセス可能とする手法として、セグメントアドレス方式のマイクロプロセッサが存在する。セグメントアドレス方式の16ビットマイクロプロセッサは、16ビットよりも上位のビットを含む上位アドレスを格納するセグメントレジスタを備えることにより、データのビット幅が16ビットでありながら、64キロバイトを超えるアドレス空間を扱うことができる。つまり、アドレス空間を64キロバイトごとに区切り、番号を付けて管理するのがセグメントレジスタであると考えると良い。以降、アドレスを16ビットで区切った上位アドレスを「セグメント番号」と呼ぶ。
セグメントアドレス方式では、64キロバイトに収まらないデータにアクセスする場合、データのセグメント番号をセグメントレジスタに設定してからデータにアクセスすることになる。このため、オブジェクトコード生成において、オブジェクトコードのサイズが増大してしまうという問題がある。
関連する技術として、特許文献1(特開平06−337791号公報)に、セグメントアドレス方式に関する説明がある。また、特許文献2(特開平07−121380号公報)では、コードの削減手法として、不要なセグメントレジスタの設定コードを省略することが記載されている。しかし、セグメントレジスタの設定が省略可能かどうかの判断基準となるセグメントレジスタの設定値の取得方法については、記載されていない。
図1は、ユーザが記述したソースプログラムファイル1から最終的な出力であるロードモジュールファイル2を生成するコンパイル方式(言語処理方式)を示す。ロードモジュールファイルとは、関数や変数など全てのデータのメモリ配置が確定したオブジェクトコードを意味する。
<従来方式の構成>
図1で示す通り、従来のコンパイル方式は、コンパイラ(compiler)10と、リンカ(linker)20を備える。
コンパイラ10は、構文解析部11と、コード生成部13と、オブジェクト出力部14を備える。
構文解析部11は、ソースプログラムファイル1に記述されたプログラミング言語のソースコードを構文解析する。なお、一般的に、構文解析(parser)の前に字句解析(lexer)が行われる。字句解析については記載を省略する。例えば、構文解析部11は、字句解析によってソースプログラムファイル1のプログラム中のトークン(命令語やリテラル)を切り出した後の段階において、そのトークンの属性と文法に記述された構文規則に基づいて、構文木を導出する。
コード生成部13は、構文木からオブジェクトコードを生成する。
オブジェクト出力部14は、コンパイラ10からオブジェクトコードを出力し、リンカ20に入力する。コンパイラ10からリンカ20に渡すデータは、メモリ配置が決定していないオブジェクトコードであるが、当該データの受け渡し方法については、外部ファイルを介した受け渡しでも、メモリ内での受け渡しでも良い。
リンカ20は、オブジェクトコードに必要なライブラリ等を付け加えて実行可能ファイルを生成し、ロードモジュールファイル2として出力する機能を備える。ロードモジュールファイル2は、メインメモリにロードできる実行ファイル形式のモジュールである。
<従来方式のデータアクセス処理>
図2を参照して、図1のコード生成部13内部の処理について説明する。
ここで、「データ」とは、ソースコード中の変数、並びにプロセッサ内での変数の領域を意味する。変数には、マイクロプロセッサのメモリ(ROM、RAM等)上に静的に配置されるものや、ソースコードにおける自動変数のように、RAMのスタック領域に必要に応じて自動的に確保されるものがある。「データアクセス」とは、変数に対してマイクロプロセッサがRead/Write(読み込み/書き込み)することを意味する。
また、「farデータ」とは、従来の64キロバイトのアドレス空間に収まらないデータを意味する。また、従来の64キロバイトのアドレス空間に収まるデータは「nearデータ」と呼んで区別する。個々のデータをnearデータとするかfarデータとするかは、ユーザが決める。なお、nearデータかfarデータかを指定することで意味があるのは、一般的には静的に配置される変数である。
(1)ステップS101
コード生成部13は、データアクセスの際に、アクセス対象のデータ(ソースプログラムファイル1の変数)がfarデータかどうか確認する。ここでは、farデータではない場合、nearデータであるものとする。従来方式において、変数がfarデータかどうかの判定方法については、ソースコード中の変数に対して「_near」や「_far」という修飾子をつけることで、コンパイラ10の構文解析部11が判定する。修飾子を省略した変数をnearデータとするかfarデータとするかは、コンパイラ10の最適化を指示することで、コンパイラ10の構文解析部11が、全てnearデータとして処理するか、全てfarデータとして処理する。なお、「_near」や「_far」という修飾子は、便宜上のものであり、実際には、この例に限定されない。
(2)ステップS102
コード生成部13は、farデータではない(nearデータである)場合、セグメントレジスタ設定コードは不要とする。例えば、コード生成部13は、nearデータは従来の64キロバイトのアドレス空間に収まるため、セグメントレジスタにセグメント番号を設定することなくデータにアクセスし、オブジェクトコードを生成する。
(3)ステップS103
コード生成部13は、farデータである場合、セグメントレジスタ設定コードを出力する。例えば、コード生成部13は、farデータは64キロバイトのアドレス空間に収まらないため、セグメント番号として16ビットよりも上位のビットを含む上位アドレスをセグメントレジスタに設定してからデータにアクセスし、オブジェクトコードを生成する。
図3は、ユーザが記述したソースプログラムファイルと、生成されたオブジェクトコード(コンパイラの出力)の例である。
図3では、ソースプログラムファイル(101)は、C言語で書かれている。「_far」は、farデータを意味する修飾子である。また、「_near」は、nearデータを意味する修飾子である。
図3のオブジェクトコードについて、先頭が「;」から始まる文字列は、ユーザが記述したソースプログラムをコメントで表示したものであり、プロセッサの動作とは関係がない。「mov」は、データを転送する命令であり、カンマで区切られた右側に記述したものから左側に記述したものにデータを設定することを意味する。DSは、セグメントレジスタを意味する。「#」は、定数であることを意味し、「#1」は、定数1であることを意味する。「high_addr(a)」は、変数aの上位アドレスを意味するが、この値は、コード生成時では、確定しておらず、リンカ(linker)で変数のメモリ配置が行われた時点で確定する。「!_」は、変数の中身であることを意味する。「DS:」は、セグメントレジスタに設定された上位アドレスを付加して64キロバイトを超えるアドレス空間をアクセスすることを意味する。
以上を踏まえてソースプログラムとオブジェクトコードを比較すると、farデータである変数aに1を設定する場合、最初に変数aの上位アドレスをセグメントレジスタに設定してから、改めて変数aに1を設定するコードを生成することになる。
このとき、コンパイラ(compiler)は、ユーザが記述したソースプログラムを解析してオブジェクトコードを生成するが、最終的に「メモリのどこにデータを配置するか」を決定するのはリンカである。つまり、コンパイラがオブジェクトコードを生成する時点では、farデータにアクセスする際にセグメント番号の値は分からない。
例えば、図3のソースプログラムでは、farデータの変数aをアクセスした後にfarデータの変数bをアクセスしている。変数aと変数bのセグメント番号が全く同じである場合、セグメントレジスタの値を再設定する必要はない。しかし、コンパイラがコードを生成する時点では、最終的に変数aと変数bのセグメント番号が同じになるかどうかは判断できない。そのため、コンパイラは、毎回セグメントレジスタに値を設定するコードを生成する必要がある。
このセグメントレジスタへの設定コードを最小限に抑えることができれば、オブジェクトコードのサイズを削減することができると考えられる。
特開平06−337791号公報 特開平07−121380号公報
本発明の目的は、コンパイラが毎回セグメントレジスタに値を設定するために生成するコードのサイズを最小限に抑えることである。
本発明では、1回目のコンパイルで従来のコンパイラと同様にオブジェクトコードを生成する。この場合は、セグメントレジスタに値を設定するコードを生成する。このコードを受け取ったリンカが「変数がどのセグメント番号に割り当たるか」という情報(以降、この情報の集合体を「セグメント情報」と呼ぶ)を出力し、その情報を利用して再度コンパイルする。2回目以降のコンパイル時には、セグメント情報から変数のセグメント番号が分かっているので、セグメントレジスタの書き換えが必要かどうか分かる。セグメントレジスタの書き換えが不要だと判明する。
本発明の言語処理システムは、コンパイラと、リンカとを含む。コンパイラは、ソースプログラムファイルを読み込み、ソースプログラムファイルに基づいて、オブジェクトコードを生成する。リンカは、オブジェクトコードを読み込み、オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成する。更に、コンパイラは、セグメント情報を読み込むセグメント情報設定部と、セグメント情報が存在しない場合、セグメントレジスタに値を設定するオブジェクトコードを生成するコード生成部とを具備する。
本発明の言語処理方法では、コンパイラにより、ソースプログラムファイルを読み込み、ソースプログラムファイルに基づいて、オブジェクトコードを生成する。また、リンカにより、オブジェクトコードを読み込み、オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成することと、コンパイラにより、セグメント情報を読み込む。また、セグメント情報が存在しない場合、コンパイラにより、セグメントレジスタに値を設定するオブジェクトコードを生成する。
本発明の言語処理用プログラムは、コンパイラとして、ソースプログラムファイルを読み込み、ソースプログラムファイルに基づいて、オブジェクトコードを生成するステップと、リンカとして、オブジェクトコードを読み込み、オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成するステップと、コンパイラとして、セグメント情報を読み込むステップと、セグメント情報が存在しない場合、コンパイラとして、セグメントレジスタに値を設定するオブジェクトコードを生成するステップとを計算機に実行させるためのプログラムである。なお、本発明の言語処理用プログラムは、記憶装置や記憶媒体に格納することが可能である。
セグメントレジスタの設定コードを削減することで、オブジェクトコードのサイズを削減することができる。
従来のコンパイル方式の構成例を示すブロック図である。 従来のコンパイル方式のデータアクセス処理のフローチャートである。 従来のコンパイル方式における、データアクセス処理を行うC言語とアセンブラ出力である。 本発明の言語処理システムの構成例を示すブロック図である。 本発明の言語処理システムのデータアクセス処理のフローチャートである。 本発明の言語処理システムにおける、データアクセス処理を行うC言語とアセンブラ出力である。
<基本構成>
以下に、本発明の実施形態について添付図面を参照して説明する。
図4で示す通り、本発明の言語処理システムは、コンパイラ(compiler)10と、リンカ(linker)20を備える。
コンパイラ10は、構文解析部11と、セグメント情報設定部12と、コード生成部13と、オブジェクト出力部14を備える。
構文解析部11は、ソースプログラムファイル1に記述されたプログラミング言語のソースコードを構文解析する。なお、一般的に、構文解析(parser)の前に字句解析(lexer)が行われる。字句解析については記載を省略する。例えば、構文解析部11は、字句解析によってソースプログラムファイル1のプログラム中のトークン(命令語やリテラル)を切り出した後の段階において、そのトークンの属性と文法に記述された構文規則に基づいて、構文木を導出する。
セグメント情報設定部12は、セグメント情報3を読み込む。セグメント情報3は、「変数がどのセグメント番号に割り当たるか」を示す情報の集合体である。セグメント情報3は、各変数のシンボル情報(変数名)と、nearデータかfarデータか(near/far)を示す情報を持ち、更に、farデータである場合は、セグメント番号を情報として保持する。ここでは、セグメント情報設定部12は、リンカ20からセグメント情報を受け取る。セグメント情報3の受け渡し方法については、外部ファイルを介した受け渡しでも、メモリ内での受け渡しでも良い。
コード生成部13は、構文木からオブジェクトコードを生成する。
オブジェクト出力部14は、コンパイラ10からオブジェクトコードを出力し、リンカ20に入力する。コンパイラ10からリンカ20に渡すデータは、メモリ配置が決定していないオブジェクトコードであるが、当該データの受け渡し方法については、外部ファイルを介した受け渡しでも、メモリ内での受け渡しでも良い。
リンカ20は、ロードモジュールファイル2と、セグメント情報3を出力する機能を備える。ここでは、リンカ20は、セグメント情報3をセグメント情報設定部12に提供する。
本発明の言語処理システムの例として、PC(パソコン)、シンクライアント端末/サーバ、ワークステーション、メインフレーム、スーパーコンピュータ等の計算機を想定している。コンパイラ10とリンカ20は、同一の計算機上に限らず、それぞれ異なる計算機上に存在していても良い。但し、実際には、これらの例に限定されない。
構文解析部11、セグメント情報設定部12、コード生成部13、及びオブジェクト出力部14は、プログラムで駆動される処理装置等のハードウェアと、そのハードウェアを駆動して所望の処理を実行させるプログラム等のソフトウェアと、そのソフトウェアや各種データを格納する記憶装置によって実現される。処理装置の例として、CPU(Central Processing Unit)、マイクロプロセッサ(microprocessor)、マイクロコントローラ、或いは、同様の機能を有する半導体集積回路(Integrated Circuit(IC))等が考えられる。記憶装置の例として、RAM(Random Access Memory)、ROM(Read Only Memory)、EEPROM(Electrically Erasable and Programmable Read Only Memory)や、フラッシュメモリ等の半導体記憶装置、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の補助記憶装置、又は、DVD(Digital Versatile Disk)やメモリカード等の記憶媒体(メディア)が考えられる。また、オブジェクト出力部14は、ネットワークを介して通信する必要がある場合、ネットワークインタフェースを含むものとする。ネットワークインタフェースの例として、NIC(Network Interface Card)等のネットワークアダプタや、アンテナ等の通信装置、接続口(コネクタ)等の通信ポート等が考えられる。また、ネットワークの例として、インターネット、LAN(Local Area Network)、無線LAN(Wireless LAN)、WAN(Wide Area Network)、バックボーン(Backbone)、ケーブルテレビ(CATV)回線、固定電話網、携帯電話網、WiMAX(IEEE 802.16a)、3G(3rd Generation)、専用線(lease line)、IrDA(Infrared Data Association)、Bluetooth(登録商標)、シリアル通信回線、データバス等が考えられる。但し、実際には、これらの例に限定されない。
<データアクセス処理>
図5を参照して、図4のコード生成部13内部の処理について説明する。
(1)ステップS201
コード生成部13は、データアクセスの際に、アクセス対象のデータ(ソースプログラムファイル1の変数)がfarデータかどうか確認する。ここでは、farデータではない場合、nearデータであるものとする。本発明において、変数がfarデータかどうかの判定方法については、図4のセグメント情報3を基に、セグメント情報設定部12が判定する。この場合、ソースコード中の「_near」や「_far」という修飾子による変数の領域配置指定と、セグメント情報3とが競合することになる。セグメント情報設定部12は、セグメント情報3を優先しても良いし、「_near」や「_far」という修飾子を優先しても良い。セグメント情報3を優先すると、コードサイズが削減される。「_near」や「_far」という修飾子を優先すると、ユーザの意図が反映される。
(2)ステップS202
コード生成部13は、farデータではない(nearデータである)場合、セグメントレジスタ設定コードは不要とする。例えば、コード生成部13は、セグメントレジスタにセグメント番号を設定することなくデータにアクセスし、オブジェクトコードを生成する。
(3)ステップS203
コード生成部13は、farデータである場合、セグメントレジスタの値と変数のセグメント番号を比較する。
(4)ステップS204
コード生成部13は、セグメントレジスタの値が変更されたか否か判定する。
(5)ステップS205
コード生成部13は、セグメントレジスタの値が変更された場合、もしくは判定不能の場合、セグメントレジスタ設定コードを出力する。例えば、コード生成部13は、セグメント番号をセグメントレジスタに設定してからデータにアクセスし、オブジェクトコードを生成する。
(6)ステップS206
コード生成部13は、セグメントレジスタの値が変更されていない場合、セグメントレジスタ設定コードは不要とする。例えば、コード生成部13は、セグメントレジスタにセグメント番号を設定することなくデータにアクセスし、オブジェクトコードを生成する。
図6は、図3と同じソースプログラムを、本発明の言語処理システムに入力して得られたオブジェクトコードである。
<全体動作>
[1回目のコンパイル]
コンパイラ10は、1回目のコンパイルでは、従来と同様に、オブジェクトコードを生成する。このとき、セグメント情報3はまだ作られていないため、セグメント情報設定部12は何も行わない。コード生成部13は、データアクセスの際にfarデータかどうかを判定し、farデータの場合は、直前のセグメントと変数のセグメントを比較するが、セグメント情報が設定されていないため、判定不能としてセグメントレジスタに値を設定する(ための)オブジェクトコードを生成する。ここでは、コード生成部13は、farデータの場合は、セグメント情報の参照を試みることでセグメント情報の有無を確認し、セグメント情報が存在していれば、直前のセグメントと変数のセグメントを比較し、セグメント情報が存在していなければ、判定不能としてセグメントレジスタに値を設定するオブジェクトコードを生成する。但し、実際には、この例に限定されない。
[セグメント情報出力]
リンカ20は、コンパイラ10が生成したオブジェクトコードを基にメモリ配置を決定する。この際、各変数のアドレスが確定するので、リンカ20は、セグメント情報3を出力する。
[2回目以降のコンパイル]
コンパイラ10は、セグメント情報3を利用して、2回目以降のコンパイルを行う。セグメント情報設定部12は、セグメント情報を読み込み、コンパイラ10内部で変数のセグメント番号を情報として持つ。コード生成部13は、farデータにアクセスするコードを生成する際、セグメントレジスタの値と変数のセグメント番号を比較する。ここでは、1回目のコンパイルの際と同様に、コード生成部13は、farデータかどうかを判定し、farデータの場合は、セグメント情報の参照を試みることでセグメント情報の有無を確認し、セグメント情報が存在していれば、直前のセグメントと変数のセグメントを比較する。コード生成部13は、比較した両者(セグメントレジスタの値と変数のセグメント番号)が同じであれば、セグメントレジスタを設定するオブジェクトコードを生成しない。図6では、セグメント情報3において変数a,b,cのセグメント番号が同じであったために、コード生成部13は、変数bと変数cをアクセスする際に、セグメントレジスタに値を設定するオブジェクトコードを出力していない。
なお、ここでは、同一の計算機上で1回目のコンパイルと2回目以降のコンパイルを実施する事例を想定して説明しているが、実際には、この例に限定されない。例えば、同じソースプログラムファイルを複数の計算機上でコンパイルする場合について、最初の1台目でのコンパイルを、1回目のコンパイルとみなし、このときにリンカが生成したセグメント情報を複数の計算機で共有するようにすれば、他の計算機でのコンパイルを、2回目以降のコンパイルとみなすことができる。複数の計算機上で複数回コンパイルする場合についても、最初の1台目での1回目のコンパイル以外は、全て2回目以降のコンパイルとみなすことができる。
farデータにアクセスする際に、セグメントレジスタの値とこれからセグメントレジスタに設定しようとするセグメント番号が同じであるなら、セグメントレジスタを設定するコードを生成する必要はない。しかし、従来の技術では、コンパイル時に変数のメモリ配置が確定しないため、「セグメントレジスタの値とこれからセグメントレジスタに設定しようとするセグメント番号が同じであるかどうか」が判断できない。そのため、セグメントレジスタの設定コードが不要な場合でも、設定コードを出力していた。
本発明では、リンカが生成するセグメント情報を利用して再度コンパイルすることで、変数のセグメント番号が分かるため、必要のないセグメントレジスタ設定コードを削減できる。
具体的には、1回目のコンパイルで従来のコンパイラと同様にオブジェクトコードを生成する。この場合は、セグメントレジスタに値を設定するコードを生成する。このコードを受け取ったリンカが「変数がどのセグメント番号に割り当たるか」という情報を出力し、その情報を利用して再度コンパイルする。この情報の集合体を「セグメント情報」と呼ぶ。2回目以降のコンパイル時には、セグメント情報から変数のセグメント番号が分かっているので、セグメントレジスタの書き換えが必要かどうか分かる。セグメントレジスタの書き換えが不要だと分かればセグメントレジスタの設定コードを削減することができる。
以上、本発明の実施形態を詳述してきたが、実際には、上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
1… ソースプログラムファイル
2… ロードモジュールファイル
3… セグメント情報
10… コンパイラ(compiler)
11… 構文解析部
12… セグメント情報設定部
13… コード生成部
14… オブジェクト出力部
20… リンカ(linker)

Claims (15)

  1. ソースプログラムファイルを読み込み、前記ソースプログラムファイルに基づいて、オブジェクトコードを生成するコンパイラと、
    前記オブジェクトコードを読み込み、前記オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成するリンカと
    を含み、
    前記コンパイラは、
    前記セグメント情報を読み込むセグメント情報設定部と、
    前記セグメント情報が存在しない場合、セグメントレジスタに値を設定するオブジェクトコードを生成するコード生成部と
    を具備する
    言語処理システム。
  2. 請求項1に記載の言語処理システムであって、
    前記セグメント情報は、
    変数のシンボル情報と、
    所定のサイズのアドレス空間に収まるnearデータか、前記所定のサイズのアドレス空間に収まらないfarデータかを示す情報と、
    farデータであればセグメント番号と
    を有する
    言語処理システム。
  3. 請求項2に記載の言語処理システムであって、
    前記コード生成部は、データアクセスの際にfarデータかどうかを判定し、farデータである場合、前記セグメントレジスタの値が変更されたか否か判定し、前記セグメントレジスタの値が変更された場合、もしくは前記セグメント情報が存在せず判定不能の場合、セグメント番号を前記セグメントレジスタに設定してからオブジェクトコードを生成する
    言語処理システム。
  4. 請求項2に記載の言語処理システムであって、
    前記コード生成部は、データアクセスの際にfarデータかどうかを判定し、farデータではない場合、もしくはfarデータであっても、前記セグメントレジスタの値が変更されたか否か判定した際に、前記セグメントレジスタの値が変更されていない場合、セグメント番号を前記セグメントレジスタに設定するオブジェクトコードを不要とする
    言語処理システム。
  5. 請求項2乃至4のいずれか一項に記載の言語処理システムであって、
    前記コンパイラによる1回目のコンパイルの際、前記コード生成部は、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在しない場合、判定不能として前記セグメントレジスタに値を設定するオブジェクトコードを生成し、
    前記リンカは、前記コード生成部が生成したオブジェクトコードを基にメモリ配置を決定し、各変数のアドレスが確定した後、前記セグメント情報を生成し、
    前記コンパイラによる2回目以降のコンパイルの際、前記セグメント情報設定部は、前記セグメント情報を読み込み、前記コンパイラ内部で変数のセグメント番号を情報として保持し、
    前記コード生成部は、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在する場合、前記セグメントレジスタの値と変数のセグメント番号とを比較し、前記セグメントレジスタの値と変数のセグメント番号とが同じであれば、前記セグメントレジスタを設定するオブジェクトコードを生成せず、前記セグメントレジスタの値と変数のセグメント番号とが同じでなければ、前記セグメントレジスタを設定するオブジェクトコードを生成する
    言語処理システム。
  6. コンパイラにより、ソースプログラムファイルを読み込み、前記ソースプログラムファイルに基づいて、オブジェクトコードを生成することと、
    リンカにより、前記オブジェクトコードを読み込み、前記オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成することと、
    前記コンパイラにより、前記セグメント情報を読み込むことと、
    前記セグメント情報が存在しない場合、前記コンパイラにより、セグメントレジスタに値を設定するオブジェクトコードを生成することと
    を含む
    言語処理方法。
  7. 請求項6に記載の言語処理方法であって、
    前記セグメント情報は、
    変数のシンボル情報と、
    所定のサイズのアドレス空間に収まるnearデータか、前記所定のサイズのアドレス空間に収まらないfarデータかを示す情報と、
    farデータであればセグメント番号と
    を有する
    言語処理方法。
  8. 請求項7に記載の言語処理方法であって、
    前記コンパイラにより、データアクセスの際にfarデータかどうかを判定することと、
    farデータである場合、前記セグメントレジスタの値が変更されたか否か判定することと、
    前記セグメントレジスタの値が変更された場合、もしくは前記セグメント情報が存在せず判定不能の場合、セグメント番号を前記セグメントレジスタに設定してからオブジェクトコードを生成することと
    を更に含む
    言語処理方法。
  9. 請求項7に記載の言語処理方法であって、
    前記コンパイラにより、データアクセスの際にfarデータかどうかを判定することと、
    farデータではない場合、もしくはfarデータであっても、前記セグメントレジスタの値が変更されたか否か判定した際に、前記セグメントレジスタの値が変更されていない場合、セグメント番号を前記セグメントレジスタに設定するオブジェクトコードを不要とすることと
    を更に含む
    言語処理方法。
  10. 請求項7乃至9のいずれか一項に記載の言語処理方法であって、
    前記コンパイラによる1回目のコンパイルの際、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在しない場合、判定不能として前記セグメントレジスタに値を設定するオブジェクトコードを生成することと、
    前記リンカにより、前記コンパイラが生成したオブジェクトコードを基にメモリ配置を決定し、各変数のアドレスが確定した後、前記セグメント情報を生成することと、
    前記コンパイラによる2回目以降のコンパイルの際、前記セグメント情報を読み込み、前記コンパイラ内部で変数のセグメント番号を情報として保持することと、
    前記コンパイラにより、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在する場合、前記セグメントレジスタの値と変数のセグメント番号とを比較し、前記セグメントレジスタの値と変数のセグメント番号とが同じであれば、前記セグメントレジスタを設定するオブジェクトコードを生成せず、前記セグメントレジスタの値と変数のセグメント番号とが同じでなければ、前記セグメントレジスタを設定するオブジェクトコードを生成することと
    を更に含む
    言語処理方法。
  11. コンパイラとして、ソースプログラムファイルを読み込み、前記ソースプログラムファイルに基づいて、オブジェクトコードを生成するステップと、
    リンカとして、前記オブジェクトコードを読み込み、前記オブジェクトコードに基づいて、関数及び変数のメモリ配置が確定したロードモジュールファイルと、変数がどのセグメント番号に割り当たるかを示す情報の集合体であるセグメント情報とを生成するステップと、
    前記コンパイラとして、前記セグメント情報を読み込むステップと、
    前記セグメント情報が存在しない場合、前記コンパイラとして、セグメントレジスタに値を設定するオブジェクトコードを生成するステップと
    を計算機に実行させるための
    言語処理用プログラム。
  12. 請求項11に記載の言語処理用プログラムであって、
    前記セグメント情報は、
    変数のシンボル情報と、
    所定のサイズのアドレス空間に収まるnearデータか、前記所定のサイズのアドレス空間に収まらないfarデータかを示す情報と、
    farデータであればセグメント番号と
    を有する
    言語処理用プログラム。
  13. 請求項12に記載の言語処理用プログラムであって、
    前記コンパイラとして、データアクセスの際にfarデータかどうかを判定するステップと、
    farデータである場合、前記セグメントレジスタの値が変更されたか否か判定するステップと、
    前記セグメントレジスタの値が変更された場合、もしくは前記セグメント情報が存在せず判定不能の場合、セグメント番号を前記セグメントレジスタに設定してからオブジェクトコードを生成するステップと
    を更に計算機に実行させるための
    言語処理用プログラム。
  14. 請求項12に記載の言語処理用プログラムであって、
    前記コンパイラとして、データアクセスの際にfarデータかどうかを判定するステップと、
    farデータではない場合、もしくはfarデータであっても、前記セグメントレジスタの値が変更されたか否か判定した際に、前記セグメントレジスタの値が変更されていない場合、セグメント番号を前記セグメントレジスタに設定するオブジェクトコードを不要とするステップと
    を更に計算機に実行させるための
    言語処理用プログラム。
  15. 請求項12乃至14のいずれか一項に記載の言語処理用プログラムであって、
    前記コンパイラとして実施する1回目のコンパイルの際、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在しない場合、判定不能として前記セグメントレジスタに値を設定するオブジェクトコードを生成するステップと、
    前記リンカとして、前記コンパイラが生成したオブジェクトコードを基にメモリ配置を決定し、各変数のアドレスが確定した後、前記セグメント情報を生成するステップと、
    前記コンパイラとして実施する2回目以降のコンパイルの際、前記セグメント情報を読み込み、前記コンパイラ内部で変数のセグメント番号を情報として保持するステップと、
    前記コンパイラとして、データアクセスの際にfarデータかどうかを判定し、farデータの場合、前記セグメント情報の参照を試み、前記セグメント情報が存在する場合、前記セグメントレジスタの値と変数のセグメント番号とを比較し、前記セグメントレジスタの値と変数のセグメント番号とが同じであれば、前記セグメントレジスタを設定するオブジェクトコードを生成せず、前記セグメントレジスタの値と変数のセグメント番号とが同じでなければ、前記セグメントレジスタを設定するオブジェクトコードを生成するステップと
    を更に計算機に実行させるための
    言語処理用プログラム。
JP2009281554A 2009-12-11 2009-12-11 言語処理システム、言語処理方法、及び言語処理用プログラム Pending JP2011123719A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009281554A JP2011123719A (ja) 2009-12-11 2009-12-11 言語処理システム、言語処理方法、及び言語処理用プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009281554A JP2011123719A (ja) 2009-12-11 2009-12-11 言語処理システム、言語処理方法、及び言語処理用プログラム

Publications (1)

Publication Number Publication Date
JP2011123719A true JP2011123719A (ja) 2011-06-23

Family

ID=44287540

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009281554A Pending JP2011123719A (ja) 2009-12-11 2009-12-11 言語処理システム、言語処理方法、及び言語処理用プログラム

Country Status (1)

Country Link
JP (1) JP2011123719A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102012203928A1 (de) 2011-06-01 2012-12-06 Mitsubishi Electric Corporation Verfahren zur Herstellung einer Halbleitervorrichtung
CN113360142A (zh) * 2021-06-24 2021-09-07 广东工贸职业技术学院 一种数控内嵌plc中间文件的设计与编译方法
CN113656004A (zh) * 2021-06-21 2021-11-16 广东赛昉科技有限公司 自动生成寄存器配置的代码生成方法及可读存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01310437A (ja) * 1988-06-08 1989-12-14 Nec Corp ロードモジュール生成方式
JPH07105014A (ja) * 1993-10-04 1995-04-21 Nec Corp 言語処理システムのシンボル処理方式
JPH07121380A (ja) * 1993-10-28 1995-05-12 Fujitsu Ltd コンパイル装置
JPH10124325A (ja) * 1996-10-25 1998-05-15 Toshiba Corp 変数の最適配置方法、変数の最適配置装置及び変数の最適配置プログラムを格納したコンピュータ読み取り可能な記録媒体
JPH10320211A (ja) * 1997-05-15 1998-12-04 Fujitsu Ltd コンパイラ及びそのプログラムを記録した記録媒体
JP2000010764A (ja) * 1998-06-17 2000-01-14 Nec Ic Microcomput Syst Ltd 言語処理システム及びその言語処理方法
JP2005301415A (ja) * 2004-04-07 2005-10-27 Ricoh Co Ltd コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01310437A (ja) * 1988-06-08 1989-12-14 Nec Corp ロードモジュール生成方式
JPH07105014A (ja) * 1993-10-04 1995-04-21 Nec Corp 言語処理システムのシンボル処理方式
JPH07121380A (ja) * 1993-10-28 1995-05-12 Fujitsu Ltd コンパイル装置
JPH10124325A (ja) * 1996-10-25 1998-05-15 Toshiba Corp 変数の最適配置方法、変数の最適配置装置及び変数の最適配置プログラムを格納したコンピュータ読み取り可能な記録媒体
JPH10320211A (ja) * 1997-05-15 1998-12-04 Fujitsu Ltd コンパイラ及びそのプログラムを記録した記録媒体
JP2000010764A (ja) * 1998-06-17 2000-01-14 Nec Ic Microcomput Syst Ltd 言語処理システム及びその言語処理方法
JP2005301415A (ja) * 2004-04-07 2005-10-27 Ricoh Co Ltd コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102012203928A1 (de) 2011-06-01 2012-12-06 Mitsubishi Electric Corporation Verfahren zur Herstellung einer Halbleitervorrichtung
CN113656004A (zh) * 2021-06-21 2021-11-16 广东赛昉科技有限公司 自动生成寄存器配置的代码生成方法及可读存储介质
CN113360142A (zh) * 2021-06-24 2021-09-07 广东工贸职业技术学院 一种数控内嵌plc中间文件的设计与编译方法

Similar Documents

Publication Publication Date Title
CN110162296B (zh) 应用程序编程接口文档的生成方法、装置及终端设备
CN102232216B (zh) 用于管理装置的字节序模式的系统及方法
US11080029B2 (en) Configuration management through information and code injection at compile time
US20180136914A1 (en) Programming Language with Extensions using a Strict Meta-Model
US8997040B2 (en) Variable closure
CN112527316A (zh) 代码编译方法、装置、电子设备及存储介质
JP5118745B2 (ja) メモリアクセス命令のベクトル化
CN113391826B (zh) 一种定制镜像中软件包依赖的解决方法
US9460306B1 (en) System and method for controlling access of machine code to operating system resources
CN103164249A (zh) 用于脚本语言编译器的扩展机制
CN113204385B (zh) 一种插件加载方法、装置、计算设备及可读存储介质
CN115328493B (zh) 用于带掩码的向量指令的编译方法、电子设备和介质
CN112558984A (zh) 代码编译的方法、装置、电子设备以及服务器
CN113703779A (zh) 一种跨平台的多语言编译方法和超轻量物联网虚拟机
US20090106744A1 (en) Compiling and translating method and apparatus
CN114879978A (zh) 软件包依赖关系的处理方法、计算设备及可读存储介质
US20130275688A1 (en) Data processing device and method
CN116360788A (zh) 结构化文本编程语言的编译方法、编译器及电子设备
CN101311901A (zh) 程序重写装置
JP2011123719A (ja) 言語処理システム、言語処理方法、及び言語処理用プログラム
CN117806607A (zh) 基于数组映射内存地址的plc程序编译方法及装置
JP4768984B2 (ja) コンパイル方法、コンパイルプログラムおよびコンパイル装置
US9229698B2 (en) Method and apparatus for compiler processing for a function marked with multiple execution spaces
CN101782860B (zh) 一种程序链接方法及装置
WO2026056340A1 (zh) 基于编译器进行代码自动升级的方法、装置以及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20120726

A977 Report on retrieval

Effective date: 20130416

Free format text: JAPANESE INTERMEDIATE CODE: A971007

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130513

A02 Decision of refusal

Effective date: 20130917

Free format text: JAPANESE INTERMEDIATE CODE: A02

A521 Written amendment

Effective date: 20131204

Free format text: JAPANESE INTERMEDIATE CODE: A523