トップ :: G 物理学 :: G06 計算;計数




【発明の名称】 言語処理装置及び言語処理プログラムを格納した記録媒体
【発明者】 【氏名】佐藤 弘明

【要約】 【課題】コンパイル済みのプログラムに対して変更や追加等を加える場合に、変更対象のプログラムのみをリコンパイルするだけで実行可能なオブジェクトを更新することができる言語処理装置を提供すること。

【解決手段】各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部を有し、前記ソースモジュールを再翻訳する際に、前記シンボル情報格納部から前回翻訳時に格納した当該モジュールのアドレスを取得し、この取得した前回の配置アドレスに今回翻訳した当該モジュールのオブジェクトを配置し、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルのアドレス解決を行うことによる。
【特許請求の範囲】
【請求項1】 ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理装置において、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部を有し、前記ソースファイルの少なくとも一部のソースモジュールを再翻訳する際に、前記シンボル情報格納部から前回翻訳時に格納した当該モジュールのアドレスを取得し、この取得した前回の配置アドレスに今回翻訳した当該モジュールのオブジェクトを配置し、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルのアドレス解決を行うことを特徴とする言語処理装置。
【請求項2】 前記ソースモジュールを再翻訳する際に、前記シンボル情報格納部から前回翻訳時の当該モジュールのサイズを取得し、取得したサイズより今回翻訳後の当該モジュールのオブジェクトモジュールのサイズの方が大きい場合、当該オブジェクトモジュールを前半部と後半部に分割し、前半部を当該モジュールの前回の配置アドレスに配置し、後半部をメモリ上の空き領域に配置し、前記前半部のサイズは前記シンボル情報格納部から取得した前回翻訳時の当該モジュールのサイズ以下であることを特徴とする請求項1に記載の言語処理装置。
【請求項3】 前記オブジェクトモジュールを分割する際に、当該オブジェクトモジュールの前半部の末尾に後半部へのジャンプ命令を挿入し、このジャンプ命令を含めた前半部のサイズは、前記シンボル情報格納部から取得した前回翻訳時の当該モジュールのサイズ以下であることを特徴とする請求項2に記載の言語処理装置。
【請求項4】 請求項1に記載の言語処理装置において、新たにソースモジュールを追加して翻訳する際に、メモリ上の空き領域に今回翻訳した当該モジュールのオブジェクトを配置し、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルの参照アドレスの解決を行うことを特徴とする言語処理装置。
【請求項5】 前記各ソースモジュールを翻訳する度に、前記シンボル情報格納部にメモリ上の空き領域のアドレスを格納し、前記メモリ上の空き領域にオブジェクトモジュールを配置する際には、前記シンボル情報格納部からメモリ上の空き領域のアドレスを取得し、この取得したアドレスに配置することを特徴とする請求項2ないし請求項4のいずれかに記載の言語処理装置。
【請求項6】 ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理装置において、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部と、生成したオブジェクトが参照する外部シンボルの配置アドレスの解決を行うリンカとを有し、前記ソースファイルの少なくとも一部のソースモジュールを翻訳する際に、当該モジュールが参照する外部シンボルの配置アドレスが未解決の状態でオブジェクトモジュールを生成し、生成したオブジェクトモジュールに、アドレス未解決の外部シンボルのシンボル名称と当該オブジェクトにおける参照位置とからなる未解決シンボル部を付加してメモリ上に配置し、前記リンカはオブジェクトファイルの実行時に、前記オブジェクトモジュールの未解決シンボル部からアドレスが未解決の外部シンボルを特定し、特定した未解決シンボルの配置アドレスを前記シンボル情報格納部から取得して、当該オブジェクトモジュールの前記参照位置に出現する前記未解決シンボルのアドレス解決を動的に行うことを特徴とする言語処理装置。
【請求項7】 前記シンボル情報格納部をメモリ上に配置することを特徴とする請求項6に記載の言語処理装置。
【請求項8】 前記未解決シンボル部を含むオブジェクトモジュールのメモリ上の配置位置を変更する場合、前記シンボル情報格納部に格納されている配置アドレスを変更後の配置位置に更新することを特徴とする請求項6ないし請求項7のいずれかに記載の言語処理装置。
【請求項9】 他のプログラム内で更新された前記未解決シンボル部を含むオブジェクトモジュールを取り込んでメモリ上に配置する場合、前記シンボル情報格納部に格納されている配置アドレスを変更後の配置位置に更新することを特徴とする請求項6ないし請求項8のいずれかに記載の言語処理装置。
【請求項10】 他のプログラム内で新規に生成された前記未解決シンボル部を含むオブジェクトモジュールを取り込んでメモリ上に配置する場合、前記シンボル情報格納部に当該オブジェクトモジュールの配置アドレスを追加することを特徴とする請求項6ないし請求項8のいずれかに記載の言語処理装置。
【請求項11】 ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理プログラムにおいて、前記ソースモジュールを再翻訳するステップと、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部から前回翻訳時に格納した当該モジュールのアドレスを取得するステップと、前記シンボル情報格納部から前回翻訳時の当該モジュールのサイズを取得するステップと、取得したサイズより今回翻訳後の当該モジュールのオブジェクトモジュールのサイズの方が大きい場合、当該オブジェクトモジュールを前半部と後半部に分割するステップと、分割した当該オブジェクトモジュールの前半部の末尾に後半部へのジャンプ命令を挿入するステップと、前半部を当該モジュールの前回の配置アドレスに配置するステップと、メモリ上の空き領域を探すステップと、分割した当該オブジェクトモジュールの後半部をメモリ上の空き領域に配置するステップと、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルのアドレス解決を行うステップとを有することを特徴とする言語処理プログラムを格納した記録媒体。
【請求項12】 ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理プログラムにおいて、新規のソースモジュールを追加して翻訳するステップと、メモリ上の空き領域を探すステップと、メモリ上の空き領域に今回翻訳した当該モジュールのオブジェクトを配置するステップと、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルのアドレス解決を行うステップとを有することを特徴とする言語処理プログラムを格納した記録媒体。
【請求項13】 ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理プログラムにおいて、前記ソースモジュールが参照する外部シンボルの配置アドレスを未解決の状態で翻訳してオブジェクトモジュールを生成するステップと、生成したオブジェクトモジュールに、アドレスが未解決の外部シンボルのシンボル名称と当該オブジェクトにおける参照位置とからなる未解決シンボル部を付加してメモリ上に配置するステップと、前記オブジェクトファイルの実行時に、前記オブジェクトモジュールの未解決シンボル部から未解決シンボルを特定し、特定した未解決シンボルの配置アドレスを、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部から取得して、当該オブジェクトモジュールにおける前記参照位置に出現する未解決シンボルのアドレス解決を行うステップとを有することを特徴とする言語処理プログラムを格納した記録媒体。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明はコンピュータ・プログラムの言語処理技術に係り、特に、プログラムの部分コンパイルやオブジェクトレベルでのプログラムの部品化等を可能にする言語処理装置及び言語処理プログラムを格納した記録媒体に関する。
【0002】
【従来の技術】一般に、プログラミング言語を翻訳する言語処理装置は、ソースプログラムを入力して、語彙解析、構文解析、中間コード生成、コード最適化、コード生成等の一連の翻訳処理を行い、オブジェクトプログラムとして出力する。
【0003】図18は、ソースプログラムを翻訳するための従来の典型的な言語処理装置を示した概略構成図であり、図19はその翻訳処理の一例を示すイメージ図である。ソースファイル102にはソースモジュールとして関数FuncA、関数FuncB、関数FuncCの3つの関数が格納されている。コンパイラ101はソースファイル102を入力して、このソースファイル102に格納されている各関数に対してそれぞれ順番に上記一連の翻訳処理を行い、実行可能オブジェクト103としてメモリ100上に配置出力する。
【0004】メモリ100上に配置された各オブジェクトモジュールFuncA〜FuncCは、それぞれ機械語の命令コード、データ、参照情報(reference)等を含んでいる。ここで、参照情報とは、関数内部の変数や大域変数Valを参照したり、他の関数やサブルーチンを呼び出したりするための参照先アドレス情報である。
【0005】従来のコンパイル方式では、一旦コンパイルしたプログラムに対して変更や追加等を加える場合には、例えそのプログラムの変更量が極めて微細であったとしても、必ずソースファイル単位でコンパイルを行っている。つまり、図19に示した例では、ソースファイル102に含まれている全ての関数FuncA〜FuncCについて、リコンパイルを行っているのである。
【0006】
【発明が解決しようとする課題】従って、例えば、ソースファイル102の中の関数FuncAだけを変更するようなケースでも、無条件にソースファイル102中の全ての関数FuncA〜FuncCについてコンパイルを行い、実行可能オブジェクト103の各関数FuncA〜FuncCを最新の状態に更新している。そのため、実質的な変更がない関数FuncB,FuncCについても、無駄な翻訳処理が行われているといった問題があった。
【0007】近年、コンピュータで利用されるプログラムは、複雑化、肥大化する傾向にあり、上記のような問題はますます深刻になってきている。
【0008】また、変更が生じた関数FuncAを他のユーザーに配布するような場合にも、関数FuncAのコンパイル後のオブジェクトだけを配布することは出来ず、オブジェクト103全体を配布するか、関数FuncAのソースプログラムを配布する必要がある。更に、関数FuncAのソースプログラムを受け取った側は、関数FuncAだけではなく、全ての関数FuncA〜FuncCについてリコンパイルを行って、オブジェクト103の各関数の参照先アドレス情報を最新の状態に更新する必要がある。
【0009】ネットワーク技術やパーソナルコンピュータの普及により、コンピュータプログラムの利用者は広範囲に拡大してきており、プログラムのバージョンアップ等で更新プログラムを配布する際には、その手間や経費は大きな負担となっている。
【0010】本発明はこのような課題を鑑みてなされたものであって、コンパイル済みのプログラムに対して変更や追加等を加える場合に、変更対象のプログラムのみをリコンパイルするだけで実行可能なオブジェクトを更新することができる言語処理装置及び言語処理プログラムを格納した記録媒体を提供することを目的とする。
【0011】また、オブジェクトの参照先アドレス情報の解決をコンパイル時ではなく実行時に行い、オブジェクトモジュールレベルで変更モジュールの配布や移植、部品化等を容易に行うことができる言語処理装置及び言語処理プログラムを格納した記録媒体を提供することを第2の目的とする。
【0012】
【課題を解決するための手段】上記課題を解決するために、本発明は、ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理装置において、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部を有し、前記ソースファイルの少なくとも一部のソースモジュールを再翻訳する際に、前記シンボル情報格納部から前回翻訳時に格納した当該モジュールのアドレスを取得し、この取得した前回の配置アドレスに今回翻訳した当該モジュールのオブジェクトを配置し、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルのアドレス解決を行うことを特徴とする。
【0013】本発明によれば、一旦コンパイルしたプログラムに対して変更等が生じた場合に、その変更のあるソースモジュールのみをリコンパイルするだけで、作成しておいたシンボル情報格納部のモジュールや変数等のシンボルのアドレス情報をもとに、当該モジュールを前回と同じアドレスに配置することができ、他の変更のないモジュールとの整合性が保てる。つまり、部分コンパイルが可能になる。更に、当該モジュールにおける外部シンボルのアドレス解決を行うことができ、他の変更のないモジュールや大域変数へのアクセスが可能となる。
【0014】また、本発明は、前記ソースモジュールを再翻訳する際に、前記シンボル情報格納部から前回翻訳時の当該モジュールのサイズを取得し、取得したサイズより今回翻訳後の当該モジュールのオブジェクトモジュールのサイズの方が大きい場合、当該オブジェクトモジュールを前半部と後半部に分割し、前半部を当該モジュールの前回の配置アドレスに配置し、後半部をメモリ上の空き領域に配置し、この前半部のサイズは前記シンボル情報格納部から取得した前回翻訳時の当該モジュールのサイズ以下であることを特徴とする。
【0015】これにより、変更されたモジュールのサイズが変更前よりも大きくなった場合でも、分割して配置することで整合性を保つことができる。
【0016】また、本発明は、前記オブジェクトモジュールを分割する際に、当該オブジェクトモジュールの前半部の末尾に後半部へのジャンプ命令を挿入し、このジャンプ命令を含めた前半部のサイズは、前記シンボル情報格納部から取得した前回翻訳時の当該モジュールのサイズ以下であることを特徴とする。
【0017】これにより、分割したモジュールの前半部から後半部への接続を容易にすることができる。
【0018】また、本発明は、新たにソースモジュールを追加して翻訳する際には、メモリ上の空き領域に今回翻訳した当該モジュールのオブジェクトを配置し、前記シンボル情報格納部から当該オブジェクトモジュールが参照する外部シンボルの配置アドレスを取得して、当該オブジェクトモジュールにおける外部シンボルの参照アドレスの解決を行うことを特徴とする。
【0019】これにより、新たなソースモジュールを追加する場合にもこのモジュールのみをコンパイルするだけで、他モジュールとの整合性を保ちつつ、メモリ上の空き領域に配置することができる。
【0020】また、本発明は、ソースファイルを構成する各ソースモジュールを翻訳して実行可能なオブジェクトファイルを生成する言語処理装置において、前記各ソースモジュールを翻訳する度にシンボルの配置アドレスとサイズとからなるシンボル情報を格納するシンボル情報格納部と、生成したオブジェクトが参照する外部シンボルの配置アドレスの解決を行うリンカとを有し、前記ソースファイルの少なくとも一部のソースモジュールを翻訳する際に、当該モジュールが参照する外部シンボルの配置アドレスが未解決の状態でオブジェクトモジュールを生成し、生成したオブジェクトモジュールに、アドレス未解決の外部シンボルのシンボル名称と当該オブジェクトにおける参照位置とからなる未解決シンボル部を付加してメモリ上に配置し、前記リンカはオブジェクトファイルの実行時に、前記オブジェクトモジュールの未解決シンボル部からアドレスが未解決の外部シンボルを特定し、特定した未解決シンボルの配置アドレスを前記シンボル情報格納部から取得して、当該オブジェクトモジュールの前記参照位置に出現する前記未解決シンボルのアドレス解決を動的に行うことを第2の特徴とする。この際、好ましくは、前記シンボル情報格納部をメモリ上に配置する。
【0021】本発明によれば、シンボル解決をプログラムの実行時に行うことができるため、モジュールを追加/変更する場合などでも、他のモジュールとの整合性を保ちながら極めて容易に組み込むすることができる。
【0022】また、本発明は、前記未解決シンボル部を含むオブジェクトモジュールのメモリ上の配置位置を変更する場合、前記シンボル情報格納部に格納されている配置アドレスを変更後の配置位置に更新することを特徴とする。
【0023】これにより、プログラムの実行時にモジュールのコードやデータなどを移動しても、他のモジュールとの整合性を容易に保つことができる。
【0024】また、本発明は、他のプログラム内で更新された前記未解決シンボル部を含むオブジェクトモジュールを取り込んでメモリ上に配置する場合、前記シンボル情報格納部に格納されている配置アドレスを変更後の配置位置に更新する。また、他のプログラム内で新規に生成された前記未解決シンボル部を含むオブジェクトモジュールを取り込んでメモリ上に配置する場合、前記シンボル情報格納部に当該オブジェクトモジュールの配置アドレスを追加することを特徴とする。
【0025】これにより、互いに独立するプログラム同士で、オブジェクトモジュールレベルで変更モジュールのみの配布や移植、部品化等を、他のモジュールとの整合性を保ちながら極めて容易に行うことができる。
【0026】
【発明の実施の形態】以下、図面に基づいて、本発明の実施形態について説明する。
【0027】(第1の実施形態)図1は本発明の第1の特徴に係る言語処理装置の一実施形態を示す概略構成図である。この言語処理装置は、ソースモジュールが格納されているソースファイル2、ソースファイル2を入力して所定の翻訳処理を行うコンパイラ1、翻訳結果としてコンパイラ1が出力する実行可能なオブジェクトファイル3などから構成され、更に、コンパイラ1は、シンボル情報格納部であるシンボル情報テーブル4を参照/更新する。
【0028】尚、コンパイラ1の行う一連の処理手続きは、言語処理装置である計算機に実行させることができる言語処理プログラムとして各種記録メディアに格納し、また通信メディアにより伝送して頒布することが可能である。本言語処理装置を実現する計算機は、記録媒体に記録された上記言語処理プログラムにより動作制御され、所定の処理手続きによる各処理を実行する。
【0029】図2はシンボル情報テーブル4の構成例を示すイメージ図である。このシンボル情報テーブル4は、シンボル名、シンボルの配置アドレス、シンボルのサイズなどからなり、シンボル毎に1つレコードで構成される。ここで、シンボルとは、プログラミングの際にモジュール(関数)やデータ(変数)などに付加した参照名である。例えば、関数「FuncA」はアドレス「0x8000_0000」番地に配置されていて、そのサイズは「0x0300」バイトであり、大域変数「val」はアドレス「0x8000_3000」番地に配置されていて、そのサイズは「0x0004」バイトである。
【0030】シンボル名が「0x00」のレコードはテーブルの終端を表す。また、シンボル名「0xff」のレコードはメモリ10上の空き領域(未使用領域)を表しており、図2の例では、アドレス「0x8000_2000」番地から「0x1000」バイトの空き領域が存在することを示している。
【0031】尚、このシンボル情報テーブル4は、ファイルとして構成される。
【0032】[第1実施例]本実施例では、一旦コンパイルしたプログラムに対して変更等が生じた場合などに行うコンパイル処理の動作について説明する。従来はソースファイル2に含まれる全てのモジュールについてリコンパイルする必要があったが、本発明においてはリコンパイルするのは変更が生じたモジュールのみで良く、そのために以下の処理を行う。
【0033】(1)リコンパイルしたモジュールのオブジェクトは、リコンパイル前にそのオブジェクトモジュールが配置されていたアドレスと同一のアドレスに配置する。
【0034】(2)リコンパイルしたモジュールに係る外部モジュールや外部変数などのシンボルのアドレス解決を行う。
【0035】これによって、更新モジュールを前回と同じアドレスに配置することができ、他の変更のないモジュールとの整合性が保て、更に、当該モジュールにおける外部シンボルのアドレス解決を行うことができ、他のモジュールや大域変数へのアクセスが可能となる。
【0036】上記処理の詳細な説明を以下に示す。
【0037】図3は初回のコンパイル処理の動作状況を示すイメージ図である。コンパイラ1はソースファイル2に格納されている関数FuncA、FuncB、FuncCについて順番に翻訳し、翻訳したオブジェクトモジュールをメモリ10上に出力する。例えば、オブジェクトモジュールFuncAはメモリ10の「0x8000_0000」番地に配置され、大域変数「val」は「0x8000_3000」番地に配置されている。また、それぞれの翻訳処理を行う際に、翻訳したプログラムの中に出現したシンボルのシンボル名、アドレス、サイズ等を、図2に示したように、シンボル情報テーブル4に出力する。
【0038】図4は2回目以降のコンパイル処理、つまり一旦コンパイルしたプログラムに対して変更等が生じた場合などに行うコンパイル処理の動作状況を示すイメージ図であり、図6はその処理の流れを表したフローチャートである。ここでは、関数FuncAに対して変更を加え、その結果、関数FuncA2に変更される例を示す。
【0039】はじめに、変更が生じた関数FuncA2についてコンパイル処理を行う(Step01)。この段階では、関数FuncA2のシンボルのアドレス解決は行われていない。
【0040】次に、シンボル情報テーブル4から、前回コンパイル時の関数FuncAの配置アドレスを取得する(Step02)。取得したアドレスは、今回のコンパイル後のオブジェクトFuncA2を再配置するために使用する。
【0041】次に、シンボル情報テーブル4から、前回コンパイル時の関数FuncAのモジュールサイズを取得して(Step03)、前回の関数FuncAのモジュールサイズと今回のコンパイル後の関数FuncA2のモジュールサイズとを比較する(Step04)。
【0042】比較した結果、今回更新後のモジュールサイズが前回のモジュールサイズより小さいかあるいは等しい場合、Step01でコンパイルした関数FuncA2のオブジェクトモジュールを関数FuncAが配置されていたアドレスに再配置する(Step09)。
【0043】Step04で比較した結果、逆に、今回更新後のモジュールサイズの方が前回のモジュールサイズより大きい場合、翻訳したオブジェクトFuncA2を前半部と後半部に分割する(Step05)。
【0044】次に、図5に示すように、分割したオブジェクトFuncA2の前半部の末尾に、後半部の先頭へジャンプするジャンプ命令を付加した上で、この前半部を関数FuncAが配置されていたアドレスに配置する(Step06)。この際、ジャンプ命令を含む前半部のサイズは、Step03で取得した関数FuncAのモジュールサイズと等しいか、それより小さい値になるようにする。これにより、関数FuncA2は他の関数に重なることなく配置される。
【0045】次に、シンボル情報テーブル4から、メモリ10上の空き領域の先頭アドレスを取得して(Step07)、取得した空き領域の先頭アドレスに関数FuncA2の後半部を配置する(Step08)。
【0046】次に、関数FuncA2で使用しているローカル変数などの内部シンボルのアドレスを解決する(Step10)。
【0047】更に、シンボル情報テーブル4を参照して、関数FuncA2に係る外部モジュールや外部変数などのシンボルのアドレス解決を行う(Step11)。尚、この時、シンボル情報テーブルに該当するシンボルの情報が存在しない場合には、エラーとしてコンパイル処理を終了する。
【0048】以上の処理の結果、図4に示すように、関数FuncA2は前半部と後半部とに分割され、前半部は「0x8000_0000」番地に配置され、後半部は「0x8000_2000」番地に配置される。従って、更新モジュールである関数FuncA2のみの部分コンパイルで、オブジェクトファイル3の更新を行うことができる。尚、今回の関数FuncA2をコンパイルしたことによるシンボル情報の変更内容は、シンボル情報テーブル4に反映される。
【0049】[第2実施例]本実施例では、一旦コンパイルしたプログラムに対して、新たに追加するモジュールが発生した場合などに行うコンパイル処理の動作について説明する。従来はソースファイル2に含まれる全てのモジュールについてリコンパイルする必要があったが、本発明においてはコンパイルするのは追加するモジュールのみで良く、そのために以下の処理を行う。
【0050】(1)追加するモジュールのオブジェクトは、メモリ上の空き領域に配置する。
【0051】(2)追加するモジュールに係る外部モジュールや外部変数などのシンボルのアドレス解決を行う。
【0052】これによって、追加モジュールを他のモジュールに影響しないアドレスに配置することができ、他の変更のないモジュールとの整合性が保て、更に、当該モジュールにおける外部シンボルのアドレス解決を行うことができ、他のモジュールや大域変数へのアクセスが可能となる。
【0053】上記処理の詳細な説明を以下に示す。
【0054】図7は2回目以降のコンパイル処理、つまり一旦コンパイルしたプログラムに対して、新たに追加するモジュールが発生した場合などに行うコンパイル処理の動作状況を示すイメージ図であり、図8はその処理の流れを表したフローチャートである。ここでは、関数FuncDを新たに追加する例を示す。
【0055】はじめに、追加する関数FuncDについてコンパイル処理を行う(Step21)。この段階では、シンボルのアドレス解決は行われていない。
【0056】次に、シンボル情報テーブル4から、メモリ10上の空き領域の先頭アドレスを取得して(Step22)、取得した空き領域の先頭アドレスに関数FuncDのオブジェクトを配置する(Step23)。
【0057】次に、関数FuncDで使用しているローカル変数などの内部シンボルのアドレスを解決する(Step24)。
【0058】更に、シンボル情報テーブル4を参照して、関数FuncDに係る外部モジュールや外部変数などのシンボルのアドレス解決を行う(Step25)。尚、この時、シンボル情報テーブルに該当するシンボルの情報が存在しない場合には、エラーとしてコンパイル処理を終了する。
【0059】以上の処理の結果、図7に示すように、関数FuncDは「0x8000_2000」番地に配置され、追加モジュールのみの部分コンパイルで、オブジェクトファイル3の更新を行うことができる。尚、今回の関数FuncDを追加コンパイルしたことによるシンボル情報の変更内容は、シンボル情報テーブル4に反映される。
【0060】(第2の実施形態)図9は本発明の第2の特徴に係る言語処理装置の一実施形態を示す概略構成図である。この言語処理装置は、ソースモジュールが格納されているソースファイル2、ソースファイル2を入力して所定の翻訳処理を行うコンパイラ1、翻訳結果としてコンパイラ1が出力するアドレス未解決のオブジェクト3aなどから構成され、更に、コンパイラ1は、シンボル情報格納部であるシンボル情報テーブル4を参照/更新し、アドレス未解決のモジュール情報を格納する未解決関数テーブル5を出力する。また、シンボル情報テーブル4と未解決関数テーブル5の情報をもとに、アドレス未解決オブジェクト3aのアドレス解決を動的に行う動的リンカ6を備えている。アドレス未解決オブジェクト3aに係る未解決シンボルは、実行時に動的リンカ6によってアドレスを解決される。
【0061】図10はアドレス未解決オブジェクト3aの構成例を示すイメージ図である。アドレス未解決オブジェクト3aとは、通常のコンパイラが出力するオブジェクトとは異なり、シンボル解決をされていないオブジェクト(関数)である。コンパイラ1は、図10(a)に示すように、オブジェクトコード本体30(関数本体)に未解決シンボル部20を付加してこのアドレス未解決オブジェクト3aを出力する。
【0062】未解決シンボル部20は、先頭にこの未解決シンボル部20のサイズ21を有し、続いて当該オブジェクトコード本体30が参照するシンボルのシンボル名221とそのオフセット(出現位置)231が複数個格納される。尚、同図(b)は、未解決シンボル部20のデータの格納例である。
【0063】図11はメモリ10上にシンボル情報テーブル4と未解決関数テーブル5が配置されている様子を示すイメージ図である。シンボル情報テーブル4と未解決関数テーブル5はファイルではなく、このようにメモリ10上に配置され、シンボル情報テーブル4の先頭アドレスを指し示すシンボル情報レジスタ41と、未解決関数テーブル5の先頭アドレスを指し示す未解決関数レジスタ51を用意する。コンパイラ1やリンカ6は、これらのシンボル情報レジスタ41や未解決関数レジスタ51を用いることによって、シンボル情報テーブル4や未解決関数テーブル5にアクセスすることができる。
【0064】図12(a)はメモリ10上にシンボル情報テーブル4が配置された詳細のイメージを示し、同図(b)はシンボル情報テーブル4のデータの格納例を示したイメージ図である。このシンボル情報テーブル4にはオブジェクトに含まれる外部シンボルのシンボル名、配置アドレス、サイズが格納される。尚、第1〜第2実施例で説明したシンボル情報テーブルのようにメモリ10上の空き領域を示す情報を格納するようにしても良い。
【0065】図13(a)はメモリ10上に未解決関数テーブル5が配置された詳細のイメージを示し、同図(b)は未解決関数テーブル5のデータの格納例を示したイメージ図である。この未解決関数テーブル5にはオブジェクトを構成する関数のうちアドレスが未解決の状態の関数の関数名、配置アドレス、サイズが格納される。同図の例では関数FuncAと関数FuncCがアドレスが未解決の状態であるので、未解決関数テーブル5にはこの2つの関数の情報が格納されている。尚、全ての関数FuncA〜FuncCのアドレスが未解決であるような場合には、この未解決関数テーブル5は必ずしも必要ない。
【0066】図14(a)はリンカ6の実行タイミング例を示すイメージ図であり、同図(b)はそのプログラム例である。このように、リンカ6の実行を関数を呼び出す処理の直前に行うようにすれば、リンカ6は呼び出される度に未解決関数テーブル5に登録されている関数内部のシンボル解決を行う。尚、リンカ6の実行タイミングはこれに限定されるものではなく、リンカ6の実行は未解決関数が実行されるときまでに行われれば良い。
【0067】図15はリンカ6の処理の流れを例示するフローチャートである。
【0068】はじめに、未解決関数レジスタ51を用いて未解決関数テーブル5を参照する(Step31)。
【0069】未解決関数テーブル5に未解決の関数があれば以下に続く処理を行うが、未解決関数テーブル5に未解決の関数がなければ処理を終了する(Step32)。
【0070】未解決関数テーブル5に未解決の関数があった場合、次に、未解決関数3aの未解決シンボル部20を参照し、その未解決関数3aに出現する未解決シンボル名221を取得する(Step33)。
【0071】次に、シンボル情報レジスタ41を用いてシンボル情報テーブル4を参照し、Step33で取得した未解決シンボル名221の配置アドレスを取得する(Step34)。
【0072】次に、未解決関数3aの関数本体30の先頭アドレスを次式により算出する(Step35)。
【0073】関数本体30の先頭アドレス =未解決関数3aの先頭アドレス +未解決シンボル部20のサイズ21例えば、図10に示した例によると、関数FuncAの本体20の先頭アドレスは、関数FuncAの先頭アドレス「0x8000_0000」番地に未解決シンボル部20のサイズ「001e」バイトを加えた値「0x8000_001e」番地となる。
【0074】次に、未解決関数3aの関数本体30に出現する未解決シンボルのアドレスを解決する(Step36)。関数本体30における未解決シンボルの出現位置は次式により算出する。
【0075】未解決シンボルの出現位置 =関数本体30の先頭アドレス +未解決シンボルのオフセット例えば、図10に示した例によると、関数FuncAの本体20に出現する外部シンボルFuncBの出現位置は、関数FuncA本体20の先頭アドレス「0x8000_001e」番地に未解決シンボルのオフセット「001c」バイトを加えた値「0x8000_003a」番地となる。この未解決シンボルの出現位置にStep34で取得したシンボルのアドレスを埋め込むことで、アドレスが解決される。
【0076】以上説明した実行時に動的にシンボル解決を行う機能を利用すると、様々な用途に適用することができる。以下にその実施例について説明する。
【0077】(実行時シンボル解決機能を利用した関数の追加)既存の実行可能なオブジェクトに対して新たにモジュール(関数)を追加する場合、コンパイラ1は追加するモジュールの内部参照で解決できるシンボルのみ解決し、内部参照では解決できない外部シンボルなどは、先に説明したようにオブジェクトコード本体30(関数本体)に未解決シンボル部20を付加したアドレス未解決オブジェクト3aを出力する。
【0078】例えば、関数FuncDを新たに追加するには、以下の手順は手順で行う。
【0079】(1)追加するソースモジュールFuncDをコンパイルして、メモリ10上の空き領域に配置する。尚、この際、外部シンボルのアドレスを解決していない未解決オブジェクト3aとして配置する。
【0080】(2)未解決関数テーブル5に、未解決オブジェクトであるFuncDの情報を追加する。
【0081】(3)動的リンカ6を利用して、未解決オブジェクトFuncD内に出現する外部シンボルのアドレスを解決する(図15、Step31〜Step36)。この処理は、関数FuncDの追加時に行っても良いし、あるいは既存の関数の呼び出し時に実行されるリンカ6に委ねても良い。
【0082】(実行時シンボル解決機能を利用した位置独立)実行可能なオブジェクトを形成する全ての関数を未解決関数にしておくと、各関数は呼び出される度にリンカ6によってシンボル解決をされることになる。これを利用して、実行時に関数や大域変数の配置位置を自由に変更することができる。これを本明細書では「位置独立」という。つまり、外部シンボルを未解決な状態にしておくことで、「位置」に依存することなく「位置」から独立することができるのである。
【0083】図16は位置独立機能を利用して関数FuncAのオブジェクトモジュールを移動したときのメモリ10の状態を示すイメージ図であり、同図(a)が移動前の状態、同図(b)は移動後の状態を示しており、図17はその処理の流れを示したフローチャートである。
【0084】オブジェクトモジュールを移動する場合、そのオブジェクトモジュールの先頭アドレスとサイズの情報が必要になるが、それはシンボル情報テーブル4に格納されている情報から入手することができる。
【0085】まず、シンボル情報テーブル4から、移動するオブジェクトモジュールの先頭アドレス及びサイズを入手し、更に、メモリ10の空き領域のアドレスを取得する(Step41)。
【0086】次に、オブジェクトモジュールFuncAを空き領域に移動し(Step42)、移動後のFuncAの情報をシンボル情報テーブル4反映する(Step43)。
【0087】次に、動的リンカ6を呼び出してオブジェクトモジュールFuncAのシンボル解決を行って(Step44)、オブジェクトを実行する(Step45)。
【0088】(実行時シンボル解決機能を利用した関数の受け渡し)位置独立機能を利用することにより、互いに独立するプログラム間で、あるいは言語処理装置間でオブジェクトモジュールレベルで変更モジュールの配布や移植、部品化等を行うことができる。
【0089】受け取り側は、受け取ったモジュールを自分の環境内に組み込んで、動的リンカによって自分の環境に応じてシンボル解決を行えば良い。従って、多くのユーザーに配布する場合や、ネットワークなどを介して広範囲に配布する場合などでも、変更モジュールのみの配布を行うことができる上、受け取り側も極めて容易に変更モジュールの組み込みを行うことができる。
【0090】以上、第1の実施形態を用いて説明したように、一旦コンパイルしたプログラムに対して変更等が生じた場合に、その変更のあるソースモジュールのみをリコンパイルするだけで、作成しておいたシンボル情報格納部のモジュールや変数等のシンボルのアドレス情報をもとに、当該モジュールを前回と同じアドレスに配置する部分コンパイルが可能となり、他の変更のないモジュールとの整合性が保てる。更に、当該モジュールにおける外部シンボルのアドレス解決を行うことができ、他のモジュールや大域変数へのアクセスが可能となる。
【0091】また、変更されたモジュールのサイズが変更前よりも大きくなった場合でも、分割して配置することで整合性を保つことができ、分割したモジュールの前半部から後半部への接続を容易にすることができる。
【0092】新たにソースモジュールを追加して翻訳する際にもこのモジュールのみをコンパイルするだけで、他モジュールとの整合性を保ちつつ、メモリ上の空き領域に配置することができる。
【0093】また、第2の実施形態を用いて説明したように、シンボル解決をプログラムの実行時に行うことができるため、モジュールを追加/変更する場合などでも、他のモジュールとの整合性を保ちながら極めて容易に組み込むすることができる。
【0094】また、プログラムの実行時にモジュールのコードやデータなどを移動しても、他のモジュールとの整合性を容易に保つことができる。
【0095】また、互いに独立するプログラム同士で、あるいは言語処理装置間でオブジェクトモジュールレベルで変更モジュールのみの配布や移植、部品化等を極めて容易に行うことができる。
【0096】以上、本発明について、詳細に説明したが、本発明は本実施例に限定されず、本発明の主旨を逸脱しない範囲において、種々の改良や変更を成し得るであろう。
【0097】
【発明の効果】本発明によれば、一旦コンパイルしたプログラムに対して変更等が生じた場合に、その変更のあるソースモジュールのみをリコンパイルするだけで、作成しておいたシンボル情報格納部のモジュールや変数等のシンボルのアドレス情報をもとに、当該モジュールを前回と同じアドレスに配置することができる部分コンパイルが可能になる。他の変更のないモジュールとの整合性が保てる上、当該モジュールにおける外部シンボルのアドレス解決を行うことができ、他のモジュールや大域変数へのアクセスが可能となる。
【0098】従って、従来のように実質的な変更がないモジュールについても、無駄な翻訳処理が行われているといった問題が解決される。
【0099】また、新たにソースモジュールを追加して翻訳する際にもこのモジュールのみをコンパイルするだけで、他モジュールとの整合性を保ちつつ、メモリ上の空き領域に配置することができる。
【0100】また、本発明の第2の特徴によれば、シンボル解決をプログラムの実行時に行うことができるため、モジュールを追加/変更する場合などでも、他のモジュールとの整合性を保ちながら極めて容易に組み込むすることができる。
【0101】また、位置に依存した形態から開放され、プログラムの実行時にモジュールのコードやデータなどを移動しても、他のモジュールとの整合性を容易に保つことができる。
【0102】また、互いに独立するプログラム同士で、あるいは言語処理装置間でオブジェクトモジュールレベルで変更モジュールのみの配布や移植、部品化等を、他のモジュールとの整合性を保ちながら極めて容易に行うことができる。
【出願人】 【識別番号】000003078
【氏名又は名称】株式会社東芝
【出願日】 平成12年9月26日(2000.9.26)
【代理人】 【識別番号】100083806
【弁理士】
【氏名又は名称】三好 秀和 (外7名)
【公開番号】 特開2002−108625(P2002−108625A)
【公開日】 平成14年4月12日(2002.4.12)
【出願番号】 特願2000−292737(P2000−292737)