JPH03212738A - 関数呼び出し方式 - Google Patents
関数呼び出し方式Info
- Publication number
- JPH03212738A JPH03212738A JP2008998A JP899890A JPH03212738A JP H03212738 A JPH03212738 A JP H03212738A JP 2008998 A JP2008998 A JP 2008998A JP 899890 A JP899890 A JP 899890A JP H03212738 A JPH03212738 A JP H03212738A
- Authority
- JP
- Japan
- Prior art keywords
- function
- definition
- entry
- compiled code
- referenced
- 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
Links
- 230000006870 function Effects 0.000 claims description 385
- 238000000034 method Methods 0.000 claims description 26
- 238000010586 diagram Methods 0.000 description 4
- COCAUCFPFHUGAA-MGNBDDOMSA-N n-[3-[(1s,7s)-5-amino-4-thia-6-azabicyclo[5.1.0]oct-5-en-7-yl]-4-fluorophenyl]-5-chloropyridine-2-carboxamide Chemical compound C=1C=C(F)C([C@@]23N=C(SCC[C@@H]2C3)N)=CC=1NC(=O)C1=CC=C(Cl)C=N1 COCAUCFPFHUGAA-MGNBDDOMSA-N 0.000 description 1
Landscapes
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】本公報は電子出願前の出願データであるた
め要約のデータは記録されません。
め要約のデータは記録されません。
Description
【発明の詳細な説明】
〔産業上の利用分野〕
本発明は関数呼び出し方式に関し、特にインタプリタを
基本とするシステムにおけるコンパイルされた関数の呼
び出し方式に関する。
基本とするシステムにおけるコンパイルされた関数の呼
び出し方式に関する。
[従来の技術〕
ソースプログラムを解釈、実行しながら動作することを
基本とする言語処理システムに対し、ソースプログラム
をコンパイルするコンパイラを設け、ソースプログラム
以外にコンパイルされて得られたオブジェクトをも実行
可能とすることにより実行速度の向上を図った言語処理
システムがある。このような言語処理システムでは、プ
ログラミング上意味的な−かたまりを形成している単位
(これを関数という)を定義したり、既に定義されてい
る関数を再定義したりすることも、インクブリタ上で動
的に行えるようになっており、このとき、成る関数から
他の関数を実際に呼び出す前であれば、呼び出そうとし
ている関数の定義が変更されても正しく最新の関数定義
が呼び出せるようにすることが重要である。これは従来
、第5図に示すような構成で実現している。
基本とする言語処理システムに対し、ソースプログラム
をコンパイルするコンパイラを設け、ソースプログラム
以外にコンパイルされて得られたオブジェクトをも実行
可能とすることにより実行速度の向上を図った言語処理
システムがある。このような言語処理システムでは、プ
ログラミング上意味的な−かたまりを形成している単位
(これを関数という)を定義したり、既に定義されてい
る関数を再定義したりすることも、インクブリタ上で動
的に行えるようになっており、このとき、成る関数から
他の関数を実際に呼び出す前であれば、呼び出そうとし
ている関数の定義が変更されても正しく最新の関数定義
が呼び出せるようにすることが重要である。これは従来
、第5図に示すような構成で実現している。
第5図に示すように、各関数A、Bには、関数名エント
リ101.301や関数定義エントリ102.302な
どのエントリを持つ関数識別セル100.300が割り
当てられ、その関数定義エントリ102.302から、
コンパイルされた関数定義コンパイルドコード(ソース
プログラム形式の関数定義をコンパイルしたもの)20
0.4OOをポイントしている。関数定義コンパイルド
コード200,400は、機械語命令列201゜401
を有すると共に、その関数定義から参照している文字列
、リスト、他の関数定義など他のオブジェクトのアドレ
スを解決するためのリテラルテーブル202,402を
備えている。一般に文字列やリストまた関数定義などの
オブジェクトは、関数のコンパイル時にはその記憶域上
のアドレスを決定することができないため、コンパイル
時にはリテラルテーブル202,402中の該当エント
リを参照して目的のオブジェクトをアクセスするような
命令を機械語命令列201.401中に生成し、関数定
義コンパイルドコード200,400の記憶域へのロー
ド時に、それらオブジェクトのアドレスをリテラルテー
ブル202,402中の該当エントリに書き込むように
している。即ち、たとえば関数Aから関数Bを呼び出す
関数B呼び出し命令2010は、それ用のエントリ20
20を参照して関数Bをアクセスするような命令とされ
、関数Aの関数定義コンパイルドコード200の記憶域
へのロード時に、呼び出し先の関数Bの関数定義コンパ
イルドコード400にかかる関数B用の関数識別セル3
00のアドレスを該当するエントリ2020に書き込む
ものである。
リ101.301や関数定義エントリ102.302な
どのエントリを持つ関数識別セル100.300が割り
当てられ、その関数定義エントリ102.302から、
コンパイルされた関数定義コンパイルドコード(ソース
プログラム形式の関数定義をコンパイルしたもの)20
0.4OOをポイントしている。関数定義コンパイルド
コード200,400は、機械語命令列201゜401
を有すると共に、その関数定義から参照している文字列
、リスト、他の関数定義など他のオブジェクトのアドレ
スを解決するためのリテラルテーブル202,402を
備えている。一般に文字列やリストまた関数定義などの
オブジェクトは、関数のコンパイル時にはその記憶域上
のアドレスを決定することができないため、コンパイル
時にはリテラルテーブル202,402中の該当エント
リを参照して目的のオブジェクトをアクセスするような
命令を機械語命令列201.401中に生成し、関数定
義コンパイルドコード200,400の記憶域へのロー
ド時に、それらオブジェクトのアドレスをリテラルテー
ブル202,402中の該当エントリに書き込むように
している。即ち、たとえば関数Aから関数Bを呼び出す
関数B呼び出し命令2010は、それ用のエントリ20
20を参照して関数Bをアクセスするような命令とされ
、関数Aの関数定義コンパイルドコード200の記憶域
へのロード時に、呼び出し先の関数Bの関数定義コンパ
イルドコード400にかかる関数B用の関数識別セル3
00のアドレスを該当するエントリ2020に書き込む
ものである。
以上のように構成することにより、例えば関数Bの関数
定義コンパイルドコード400を記憶域上にロードした
後に関数Bの定義を変更し、それ用の新たな関数定義コ
ンパイルドコードを記憶域にロードした場合、それに合
わせて関数B用の関数識別セル300の関数定義エント
リ302の内容を変更すれば、関数Aから常に最新の関
数定義を呼び出すことができる。
定義コンパイルドコード400を記憶域上にロードした
後に関数Bの定義を変更し、それ用の新たな関数定義コ
ンパイルドコードを記憶域にロードした場合、それに合
わせて関数B用の関数識別セル300の関数定義エント
リ302の内容を変更すれば、関数Aから常に最新の関
数定義を呼び出すことができる。
上述した従来の関数呼び出し方式によっても常に最新の
関数定義を呼び出すことは可能であるが、必ず関数識別
セルの関数定義エントリを参照して関数を呼び出すため
、関数識別セルをアクセスするための処理が必要となり
、他のコンパイラ型言語に比べると関数呼び出しにかか
る時間が遅くなるという問題点があった。
関数定義を呼び出すことは可能であるが、必ず関数識別
セルの関数定義エントリを参照して関数を呼び出すため
、関数識別セルをアクセスするための処理が必要となり
、他のコンパイラ型言語に比べると関数呼び出しにかか
る時間が遅くなるという問題点があった。
本発明はこのような従来の問題点を解決したもので、そ
の目的は、関数識別セルを経由することなく成る関数か
ら別の関数の最新定義を呼び出すことができる関数呼び
出し方式を提供することにある。
の目的は、関数識別セルを経由することなく成る関数か
ら別の関数の最新定義を呼び出すことができる関数呼び
出し方式を提供することにある。
本発明の関数呼び出し方式は上記の目的を達成するため
に、 関数にかかる関数定義コンパイルドコード中の関数呼び
出し命令をリテラルテーブル中の該当エントリに格納さ
れたアドレス先へ関数識別セルを経由せずに制御を移行
せしめる命令にすると共に、その関数から呼び出される
呼び出し元関数の関数名および該呼び出し元関数に割り
当てたリテラルテーブル中の前記エントリの位置情報と
を保持する[参照している関数テーブル」と、その関数
を呼び出す呼び出し元関数の関数名を保持する「参照さ
れている関数テーブル」とを設け、関数にかかる関数定
義コンパイルドコードを記憶域ヘロードした際に、 該ロートした関数にかかる「参照している関数テーブル
」に設定された各関数名の呼び出し元関数にかかる[参
照されている関数テーブルJに前記ロードした関数の関
数名を格納すると共にその呼び出し元関数にかかる関数
定義コンパイルドコードの記憶域上のアドレスが確定し
ているときはそのアドレスをリテラルテーブル中のその
呼び出し元関数に対応するエントリに格納し、且つ、前
記ロードした関数にかかる「参照されている関数テーブ
ル」に設定された各関数名の呼び出し元関数にかかる関
数定義コンパイルドコードのリテラルテーブル中の該当
エントリに前記ロードした関数にかかる関数定義コンパ
イルトコートの記憶域上のアドレスを格納するようにし
ている。
に、 関数にかかる関数定義コンパイルドコード中の関数呼び
出し命令をリテラルテーブル中の該当エントリに格納さ
れたアドレス先へ関数識別セルを経由せずに制御を移行
せしめる命令にすると共に、その関数から呼び出される
呼び出し元関数の関数名および該呼び出し元関数に割り
当てたリテラルテーブル中の前記エントリの位置情報と
を保持する[参照している関数テーブル」と、その関数
を呼び出す呼び出し元関数の関数名を保持する「参照さ
れている関数テーブル」とを設け、関数にかかる関数定
義コンパイルドコードを記憶域ヘロードした際に、 該ロートした関数にかかる「参照している関数テーブル
」に設定された各関数名の呼び出し元関数にかかる[参
照されている関数テーブルJに前記ロードした関数の関
数名を格納すると共にその呼び出し元関数にかかる関数
定義コンパイルドコードの記憶域上のアドレスが確定し
ているときはそのアドレスをリテラルテーブル中のその
呼び出し元関数に対応するエントリに格納し、且つ、前
記ロードした関数にかかる「参照されている関数テーブ
ル」に設定された各関数名の呼び出し元関数にかかる関
数定義コンパイルドコードのリテラルテーブル中の該当
エントリに前記ロードした関数にかかる関数定義コンパ
イルトコートの記憶域上のアドレスを格納するようにし
ている。
本発明の関数呼び出し方式の作用を、理解を容易にする
為に関数Aから関数Bを呼び出す場合を例にして説明す
ると、先ず、関数への関数定義コンパイルドコード中の
関数Bを呼び出す命令はリテラルテーブル中の該当エン
トリに格納されたアドレス先へ関数B用の関数識別セル
を経由せずに制御を移行せしめる命令にされる。そして
、関数Aの関数定義コンパイルトコートを記憶域へロー
ドした際に、関数A用の「参照している関数テブル」に
設定された関数Bの関数名を転りに関数B用の「参照さ
れている関数テーブル」が特定され、そこに前記ロード
した関数Aの関数名が格納される。また、このとき呼び
出し元関数Bにかかる関数定義コンパイルドコードの記
憶域上のアドレスが確定している場合には、そのアドレ
スが関数Aの関数定義コンパイルトコートにおけるリテ
ラルテーブル中の関数Bに対応するエントリに格納され
る。これにより、関数Aの関数定義コンパイルドコード
における関数Bを呼び出す命令が実行されると、リテラ
ルテーブル中の該当エントリに格納されたアドレス先、
つまり関数Bの関数定義コンパイルドコードへ関数B用
の関数識別セルを経由することなく速やかに制御が移行
せしめられる。
為に関数Aから関数Bを呼び出す場合を例にして説明す
ると、先ず、関数への関数定義コンパイルドコード中の
関数Bを呼び出す命令はリテラルテーブル中の該当エン
トリに格納されたアドレス先へ関数B用の関数識別セル
を経由せずに制御を移行せしめる命令にされる。そして
、関数Aの関数定義コンパイルトコートを記憶域へロー
ドした際に、関数A用の「参照している関数テブル」に
設定された関数Bの関数名を転りに関数B用の「参照さ
れている関数テーブル」が特定され、そこに前記ロード
した関数Aの関数名が格納される。また、このとき呼び
出し元関数Bにかかる関数定義コンパイルドコードの記
憶域上のアドレスが確定している場合には、そのアドレ
スが関数Aの関数定義コンパイルトコートにおけるリテ
ラルテーブル中の関数Bに対応するエントリに格納され
る。これにより、関数Aの関数定義コンパイルドコード
における関数Bを呼び出す命令が実行されると、リテラ
ルテーブル中の該当エントリに格納されたアドレス先、
つまり関数Bの関数定義コンパイルドコードへ関数B用
の関数識別セルを経由することなく速やかに制御が移行
せしめられる。
他方、関数Aの関数定義コンパイルドコードの記憶域上
へのロード時に、関数Bの関数定義コンパイルドコード
のアドレスが確定していないときは、その時点では関数
B用のエントリにはアドレスは格納されない。このアド
レスの格納は関数Bの関数定義コンパイルドコードが記
憶域上へロードされた時点で格納される。即ち、関数B
の関数定義コンパイルドコードを記憶域ヘロードした際
には、関数B用の「参照されている関数テーブル」の情
報によって関数Bが関数Aから呼ばれていることが判明
し、関数Aにかかる関数定義コンパイルドコードのリテ
ラルテーブルが検索され、関数B用のエントリに関数B
の関数定義コンパイルドコードの記憶域上のアドレスが
格納される。これによって、関数Aの関数定義コンパイ
ルドコードにおける関数Bを呼び出す命令の実行が可能
となる。
へのロード時に、関数Bの関数定義コンパイルドコード
のアドレスが確定していないときは、その時点では関数
B用のエントリにはアドレスは格納されない。このアド
レスの格納は関数Bの関数定義コンパイルドコードが記
憶域上へロードされた時点で格納される。即ち、関数B
の関数定義コンパイルドコードを記憶域ヘロードした際
には、関数B用の「参照されている関数テーブル」の情
報によって関数Bが関数Aから呼ばれていることが判明
し、関数Aにかかる関数定義コンパイルドコードのリテ
ラルテーブルが検索され、関数B用のエントリに関数B
の関数定義コンパイルドコードの記憶域上のアドレスが
格納される。これによって、関数Aの関数定義コンパイ
ルドコードにおける関数Bを呼び出す命令の実行が可能
となる。
このように本発明では呼び出し先の関数Bの関数定義コ
ンパイルドコードが記憶域ヘロートされる時点でそのア
ドレスが呼び出し元の関数Aの関数定義コンパイルドコ
ードに設定されるので、関数Bの定義が変更され、関数
B用の新たな関数定義コンパイルドコードがロートされ
たときには、呼び出し元の関数Aの関数定義コンパイル
トコートにおける関数B対応のエントリのアドレスに関
数Bの最新の関数定義コンパイルドコードのアドレスが
保持されることになり、関数Aから常に最新の関数Bの
関数定義を呼び出すことができる。
ンパイルドコードが記憶域ヘロートされる時点でそのア
ドレスが呼び出し元の関数Aの関数定義コンパイルドコ
ードに設定されるので、関数Bの定義が変更され、関数
B用の新たな関数定義コンパイルドコードがロートされ
たときには、呼び出し元の関数Aの関数定義コンパイル
トコートにおける関数B対応のエントリのアドレスに関
数Bの最新の関数定義コンパイルドコードのアドレスが
保持されることになり、関数Aから常に最新の関数Bの
関数定義を呼び出すことができる。
(実施例]
次に、本発明の実施例について図面を参照して詳細に説
明する。
明する。
第1図は本発明の一実施例の構成図であり、関数Aから
関数B、関数Cを本発明の方式で呼び出す場合にコンパ
イラによって記憶域上にロード作成された内容例を示し
ている。同図に示すように記憶域上には、関数Aにかか
るものとして、関数識別セル1.関数定義コンパイルド
コード2および「参照されている関数テーブル」14が
作成され、関数Bにかかるものとして、関数識別セル3
、関数定義コンパイルドコード4および「参照されてい
る関数テーブルJ34が作成され、関数Cにかかるもの
として、関数識別セル5.関数定義コンパイルトコ−ド
ロおよび「参照されている関数テーブル」54が作成さ
れている。
関数B、関数Cを本発明の方式で呼び出す場合にコンパ
イラによって記憶域上にロード作成された内容例を示し
ている。同図に示すように記憶域上には、関数Aにかか
るものとして、関数識別セル1.関数定義コンパイルド
コード2および「参照されている関数テーブル」14が
作成され、関数Bにかかるものとして、関数識別セル3
、関数定義コンパイルドコード4および「参照されてい
る関数テーブルJ34が作成され、関数Cにかかるもの
として、関数識別セル5.関数定義コンパイルトコ−ド
ロおよび「参照されている関数テーブル」54が作成さ
れている。
関数への関数定義コンパイルドコード2は、機械語命令
列21とリテラルテーブル22と「参照している関数テ
ーブル」23とを含み、機械語命令列21中に関数B呼
び出し命令211と関数C呼び出し命令212とが存在
する。また、リテラルテーブル22には関数B用エント
リ221と関数C用エントリ222とがあり、関数B用
エンドIJ 221には関数Bの関数定義コンパイルド
コード4のアドレスが格納され、関数C用エントリ22
2には間数Cの関数定義コンパイルトコ−ドロのアドレ
スが格納されている。「参照している関数テーブル」2
3には図示は省略しているが、関数名Bとそれ用のエン
トリ221の位置情報とを格納するエントリと、関数名
Cとそれ用のエントリ222の位置情報とを格納するエ
ントリとが設けられている。関数B呼び出し命令211
は、関数B用エントリ221に格納されたアドレスヘジ
ヤンプするようなコードであり、関数C呼び出し命令2
12は、関数C用エントリ222に格納されたアドレス
ヘジャンプするようなコードである。
列21とリテラルテーブル22と「参照している関数テ
ーブル」23とを含み、機械語命令列21中に関数B呼
び出し命令211と関数C呼び出し命令212とが存在
する。また、リテラルテーブル22には関数B用エント
リ221と関数C用エントリ222とがあり、関数B用
エンドIJ 221には関数Bの関数定義コンパイルド
コード4のアドレスが格納され、関数C用エントリ22
2には間数Cの関数定義コンパイルトコ−ドロのアドレ
スが格納されている。「参照している関数テーブル」2
3には図示は省略しているが、関数名Bとそれ用のエン
トリ221の位置情報とを格納するエントリと、関数名
Cとそれ用のエントリ222の位置情報とを格納するエ
ントリとが設けられている。関数B呼び出し命令211
は、関数B用エントリ221に格納されたアドレスヘジ
ヤンプするようなコードであり、関数C呼び出し命令2
12は、関数C用エントリ222に格納されたアドレス
ヘジャンプするようなコードである。
関数A用の識別セルlは、関数名エントリ11゜関数定
義エントリ12.「参照されている関数テーブルエント
リ」13等で構成され、関数定義エントリ12に関数へ
の関数定義コンパイルドコード2のアドレスが格納され
ている。また「参照されている関数テーブルエントリJ
13には、「参照されている関数テーブル」14のアド
レスが格納されている。この[参照されている関数テー
ブル」14には関数Aを呼び出している関数が存在する
場合には、その関数名が格納される。
義エントリ12.「参照されている関数テーブルエント
リ」13等で構成され、関数定義エントリ12に関数へ
の関数定義コンパイルドコード2のアドレスが格納され
ている。また「参照されている関数テーブルエントリJ
13には、「参照されている関数テーブル」14のアド
レスが格納されている。この[参照されている関数テー
ブル」14には関数Aを呼び出している関数が存在する
場合には、その関数名が格納される。
関数B用の識別セル3.関数C用の識別セル5も、関数
A用の識別セル1と同様に、関数名エントリ31,51
.関数定義エントリ32,52゜参照されている関数テ
ーブルエントリ33.53等で構成され、関数定義エン
トリ32.52に関数Bの関数定義コンパイシドコード
4.関数Cの関数定義コンパイルトコ−ドロのアドレス
が格納されている。また、参照されている関数テーブル
エントリ33.53には関数B用の「参照されている関
数テーブル」34.関数C用の「参照されている関数テ
ーブル」54のアドレスが格納されている。そして、こ
の場合、[参照されている関数テーブルJ34,54中
には関数Bを呼び出している関数Aの関数名がそれぞれ
格納されている。
A用の識別セル1と同様に、関数名エントリ31,51
.関数定義エントリ32,52゜参照されている関数テ
ーブルエントリ33.53等で構成され、関数定義エン
トリ32.52に関数Bの関数定義コンパイシドコード
4.関数Cの関数定義コンパイルトコ−ドロのアドレス
が格納されている。また、参照されている関数テーブル
エントリ33.53には関数B用の「参照されている関
数テーブル」34.関数C用の「参照されている関数テ
ーブル」54のアドレスが格納されている。そして、こ
の場合、[参照されている関数テーブルJ34,54中
には関数Bを呼び出している関数Aの関数名がそれぞれ
格納されている。
関数B、Cの関数定義コンパイルドコード4.6の内部
構造は図示を省略しているが、その構造は関数Aの関数
定義コンパイルドコード2と同様である。
構造は図示を省略しているが、その構造は関数Aの関数
定義コンパイルドコード2と同様である。
以上のような構成を有するため、関数Aの関数定義コン
パイルドコード2における関数B呼び出し命令211が
実行されると、関数B用エントリ221に格納されたア
ドレスに従って、関数B用の識別セル3を経由すること
なく、関数Bの関数定義コンパイルドコード4に直ちに
制御が渡される。同様に、関数C呼び出し命令212が
実行されると、関数C用エントリ222に格納されたア
ドレスに従って関数Cの関数定義コンパイルトコ−トロ
に直ちに制御が渡されることになる。そして後述するよ
うに、関数B、 C等の定義が変更され、新たな関数
定義コンパイルドコードが記憶域にロードされた場合に
は、それに応して関数Aの関数定義コンパイルドコード
2のリテラルテーブル22における関数B用エントリ2
21.関数C用エントリ222の内容が変更せしめられ
ることにより、常に最新の関数定義に制御が渡るように
なっている。
パイルドコード2における関数B呼び出し命令211が
実行されると、関数B用エントリ221に格納されたア
ドレスに従って、関数B用の識別セル3を経由すること
なく、関数Bの関数定義コンパイルドコード4に直ちに
制御が渡される。同様に、関数C呼び出し命令212が
実行されると、関数C用エントリ222に格納されたア
ドレスに従って関数Cの関数定義コンパイルトコ−トロ
に直ちに制御が渡されることになる。そして後述するよ
うに、関数B、 C等の定義が変更され、新たな関数
定義コンパイルドコードが記憶域にロードされた場合に
は、それに応して関数Aの関数定義コンパイルドコード
2のリテラルテーブル22における関数B用エントリ2
21.関数C用エントリ222の内容が変更せしめられ
ることにより、常に最新の関数定義に制御が渡るように
なっている。
次に、関数定義コンパイルドコード2.4.6を記憶域
ヘロードする際にコンパイラが行う処理について、第1
図中から関数Cにかかる部分を省略して簡略化した第2
図およびコンパイラの処理例の流れを示す第3図を参照
して説明する。
ヘロードする際にコンパイラが行う処理について、第1
図中から関数Cにかかる部分を省略して簡略化した第2
図およびコンパイラの処理例の流れを示す第3図を参照
して説明する。
コンパイラは、関数Aの関数定義コンパイルドコード2
を記憶域上ヘロードする際、第3図の処理Slにおいて
、その間数Aが呼び出している関数Bの関数名231と
その関数Bに割り当てたリテラルテーブル22中の関数
B用エントリ221の位置情報(例えば第2図に示す如
きリテラルテ−プル22の先頭からの相対位置)232
との紐230を持つ「参照している関数テーブル」23
を作成する。
を記憶域上ヘロードする際、第3図の処理Slにおいて
、その間数Aが呼び出している関数Bの関数名231と
その関数Bに割り当てたリテラルテーブル22中の関数
B用エントリ221の位置情報(例えば第2図に示す如
きリテラルテ−プル22の先頭からの相対位置)232
との紐230を持つ「参照している関数テーブル」23
を作成する。
次に、処理S2において、関数A用の関数識別セル1お
よび「参照されている関数テーブル」14について、既
に作成されていればそれを使い、未作成であれば作成し
た後、関数A用の関数識別セル1中の関数定義エントリ
12tこ関数への関数定義コンパイルドコード2のアド
レスを格納する。
よび「参照されている関数テーブル」14について、既
に作成されていればそれを使い、未作成であれば作成し
た後、関数A用の関数識別セル1中の関数定義エントリ
12tこ関数への関数定義コンパイルドコード2のアド
レスを格納する。
次に、「参照している関数テーブル」23に格納されて
いる全ての関数名に対し、以下の処理を行う (53〜
S9)。
いる全ての関数名に対し、以下の処理を行う (53〜
S9)。
先ず、「参照している関数テーブル」23がら関数名を
1つ取り出し、関数名が終わりであれば処理33〜S9
の処理を終えて処理SIOへ進む。
1つ取り出し、関数名が終わりであれば処理33〜S9
の処理を終えて処理SIOへ進む。
終わりでなシナれば、取り出した関数名の関数が既に存
在するか否かを判定しくS5)、存在していれば処理S
7へ進み、存在しなければその関数名の関数識別セルお
よび「参照されている関数テフルjを作成して処理s7
へ進む。次に処理s7において、その関数名の「参照さ
れている関数テーブル」に前記ロートした関数Aの関数
名を格納する。そして、処理S8でその関数名の関数識
別セル中の関数定義エンド丁Jにアドレスが格納されて
いるか否かを判定し、格納されていなければ処理S3に
戻り、格納されていればそのアドレスを前記ロードした
関数Aの関数定義コンパイルドコード2のリテラルチー
フル221こおけるその関数名に対応するエントリに格
納する(S9)。そして、処理S3に戻る。
在するか否かを判定しくS5)、存在していれば処理S
7へ進み、存在しなければその関数名の関数識別セルお
よび「参照されている関数テフルjを作成して処理s7
へ進む。次に処理s7において、その関数名の「参照さ
れている関数テーブル」に前記ロートした関数Aの関数
名を格納する。そして、処理S8でその関数名の関数識
別セル中の関数定義エンド丁Jにアドレスが格納されて
いるか否かを判定し、格納されていなければ処理S3に
戻り、格納されていればそのアドレスを前記ロードした
関数Aの関数定義コンパイルドコード2のリテラルチー
フル221こおけるその関数名に対応するエントリに格
納する(S9)。そして、処理S3に戻る。
以上の53〜S9の処理が関数Bの関数名に対し実行さ
れることにより、関数B用の関数識別セル3にリンクさ
れた「参照されている関数チーフル」34に関数Aの関
数名が登録され、且つ、関数Bが既に存在する場合には
即ち関数Bの関数定義コンパイルドコード4が記憶域に
ロートされている場合には、関数定義エントリ32に格
納されているアドレスが関数Aの関数定義コンパイルト
コ−12のリテラルテーブル22における関数B用エン
トリ221に格納されるごとになる。
れることにより、関数B用の関数識別セル3にリンクさ
れた「参照されている関数チーフル」34に関数Aの関
数名が登録され、且つ、関数Bが既に存在する場合には
即ち関数Bの関数定義コンパイルドコード4が記憶域に
ロートされている場合には、関数定義エントリ32に格
納されているアドレスが関数Aの関数定義コンパイルト
コ−12のリテラルテーブル22における関数B用エン
トリ221に格納されるごとになる。
次に、処理SlO〜S12においては、「参照されてい
る関数テーブルj14Lこ格納された全ての関数名に対
し、次のような処理が行われる。即ち、′参照されてい
る関数テーブル」14に関数名が登録されている場合、
その関数名の関数定義コンパイルドコードの「参照して
いる関数テーブル」中を呼び出し先の関数名(今回ロー
ドした関数の関数名)でサーチし、見つけた同一関数名
に対応する位置情報の指し示すリテラルテーブル22中
のエントリに、前記ロートした関数Aの関数定義コンパ
イルドコード2のアドレスを格納する。
る関数テーブルj14Lこ格納された全ての関数名に対
し、次のような処理が行われる。即ち、′参照されてい
る関数テーブル」14に関数名が登録されている場合、
その関数名の関数定義コンパイルドコードの「参照して
いる関数テーブル」中を呼び出し先の関数名(今回ロー
ドした関数の関数名)でサーチし、見つけた同一関数名
に対応する位置情報の指し示すリテラルテーブル22中
のエントリに、前記ロートした関数Aの関数定義コンパ
イルドコード2のアドレスを格納する。
以上のような処理は関数Bの関数定義コンパイルトコー
ト4を記憶域ヘロートする際にも行われる。この結果、
関数Aの関数定義コンパイルドコト2のロート時に関数
Bが未だ存在していなかった場合、関数Bの関数定義コ
ンパビルドコート40ロート時に実行される処理5IO
−312の処理において「参照されている関数テーブル
」34中の関数Aの関数名が処理され、その関数への関
数定義コンパイルドコード2のリテラルチーフル22が
関数名Bでサーチされ、同一関数名(231)に対応す
る位1情91(232)の指し示すリテラルチーフル2
2のエントリ221に、[IBの関数定義コンパイルド
コード4のアドレスが格納されることになる。
ト4を記憶域ヘロートする際にも行われる。この結果、
関数Aの関数定義コンパイルドコト2のロート時に関数
Bが未だ存在していなかった場合、関数Bの関数定義コ
ンパビルドコート40ロート時に実行される処理5IO
−312の処理において「参照されている関数テーブル
」34中の関数Aの関数名が処理され、その関数への関
数定義コンパイルドコード2のリテラルチーフル22が
関数名Bでサーチされ、同一関数名(231)に対応す
る位1情91(232)の指し示すリテラルチーフル2
2のエントリ221に、[IBの関数定義コンパイルド
コード4のアドレスが格納されることになる。
また、関iBの定義が変更された場合、その変更後の関
数Bの関数定義コンパイルトコ−+”4が記憶域ヘロー
トされる場合にも第3図の処理が実行される。よって、
呼び出し元の関数への関数定義コンパイルトコート2に
おける関数B用エンドIJ 221の内容を関数Bの最
新の関数定義コンパイルドコード4のアドレスに一致さ
せることができる。
数Bの関数定義コンパイルトコ−+”4が記憶域ヘロー
トされる場合にも第3図の処理が実行される。よって、
呼び出し元の関数への関数定義コンパイルトコート2に
おける関数B用エンドIJ 221の内容を関数Bの最
新の関数定義コンパイルドコード4のアドレスに一致さ
せることができる。
なお、関数定義がコンパイルされておらずL ISP言
語などのようなソースプログラムのままのリスト形式の
ときは、その定義のリスト形式を解釈部のエハリュエー
タに渡して実行させなければなろない。よって、この場
合はコンパイラは、従来と同様に関数識別セルを経由し
た呼び出し方式が行われるように制御する。即ち、第4
図に示すように、間数Aがソースプログラム形式の関数
りを呼び出す場合、関数りにかかるソースプログラム形
式の関数定義8のアドレスを関数定義エントリ72に保
持する関数り用の関数識別セルフを、関数り用エントリ
223が保持するようにし、関数り呼び出し命令213
はシステムのエハリュエータ9に制御を移すコードとす
るものである。
語などのようなソースプログラムのままのリスト形式の
ときは、その定義のリスト形式を解釈部のエハリュエー
タに渡して実行させなければなろない。よって、この場
合はコンパイラは、従来と同様に関数識別セルを経由し
た呼び出し方式が行われるように制御する。即ち、第4
図に示すように、間数Aがソースプログラム形式の関数
りを呼び出す場合、関数りにかかるソースプログラム形
式の関数定義8のアドレスを関数定義エントリ72に保
持する関数り用の関数識別セルフを、関数り用エントリ
223が保持するようにし、関数り呼び出し命令213
はシステムのエハリュエータ9に制御を移すコードとす
るものである。
以上説明したように、本発明の関数呼び出し方式によれ
ば、関数識別セルを経由することなく成るコンパイルさ
れた関数から別のコンパイルサした関数の最新定義を呼
び出すことが可能となり、関数呼び出しの高速化が実現
できる。
ば、関数識別セルを経由することなく成るコンパイルさ
れた関数から別のコンパイルサした関数の最新定義を呼
び出すことが可能となり、関数呼び出しの高速化が実現
できる。
第1図は本発明の一実施例の構成図、
第2図は第1図を簡略化した図、
第3図はコンパイラの処理例の流れ図、第4図はソース
プログラム形式の関数定義を呼び出す場合の構成例を示
す図および、 第5図は従来方式の説明図である。 図において、 1.3,5.7・・・関数識別セル 2.4.6・・・関数定義コンパイルドコード8・・・
ソースプログラム形式の関数定義9・・・システムのエ
バリュエータ 11.31.51・・・関数名エントリ12.32,5
2.72・・・関数定義エントリ13.33.53・・
・参照されている関数テーブルエントリ 14.34.54・・・参照されている関数テーブル2
1・・・機械語命令列 22・・・リテラルテーブル 23・・・参照している関数テーブル 211・・・関数B呼び出し命令 212・・・関数C呼び出し命令 221・・・関数B用エントリ 222・・・関数C用エントリ
プログラム形式の関数定義を呼び出す場合の構成例を示
す図および、 第5図は従来方式の説明図である。 図において、 1.3,5.7・・・関数識別セル 2.4.6・・・関数定義コンパイルドコード8・・・
ソースプログラム形式の関数定義9・・・システムのエ
バリュエータ 11.31.51・・・関数名エントリ12.32,5
2.72・・・関数定義エントリ13.33.53・・
・参照されている関数テーブルエントリ 14.34.54・・・参照されている関数テーブル2
1・・・機械語命令列 22・・・リテラルテーブル 23・・・参照している関数テーブル 211・・・関数B呼び出し命令 212・・・関数C呼び出し命令 221・・・関数B用エントリ 222・・・関数C用エントリ
Claims (1)
- 【特許請求の範囲】 関数にかかる関数定義コンパイルドコード中の関数呼び
出し命令をリテラルテーブル中の該当エントリに格納さ
れたアドレス先へ関数識別セルを経由せずに制御を移行
せしめる命令にすると共に、その関数から呼び出される
呼び出し先関数の関数名および該呼び出し先関数に割り
当てたリテラルテーブル中の前記エントリの位置情報と
を保持する「参照している関数テーブル」と、その関数
を呼び出す呼び出し元関数の関数名を保持する「参照さ
れている関数テーブル」とを設け、 関数にかかる関数定義コンパイルドコードを記憶域へロ
ードした際に、 該ロードした関数にかかる「参照している関数テーブル
」に設定された各関数名の呼び出し先関数にかかる「参
照されている関数テーブル」に前記ロードした関数の関
数名を格納すると共にその呼び出し先関数にかかる関数
定義コンパイルドコードの記憶域上のアドレスが確定し
ているときはそのアドレスをリテラルテーブル中のその
呼び出し先関数に対応するエントリに格納し、且つ、前
記ロードした関数にかかる「参照されている関数テーブ
ル」に設定された各関数名の呼び出し元関数にかかる関
数定義コンパイルドコードのリテラルテーブル中の該当
エントリに前記ロードした関数にかかる関数定義コンパ
イルドコードの記憶域上のアドレスを格納するようにし
たことを特徴とする関数呼び出し方式。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2008998A JPH03212738A (ja) | 1990-01-18 | 1990-01-18 | 関数呼び出し方式 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2008998A JPH03212738A (ja) | 1990-01-18 | 1990-01-18 | 関数呼び出し方式 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH03212738A true JPH03212738A (ja) | 1991-09-18 |
Family
ID=11708357
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2008998A Pending JPH03212738A (ja) | 1990-01-18 | 1990-01-18 | 関数呼び出し方式 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH03212738A (ja) |
-
1990
- 1990-01-18 JP JP2008998A patent/JPH03212738A/ja active Pending
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US5748963A (en) | Adaptive binding | |
| JP2986042B2 (ja) | オブジェクト指向プログラミング環境を変更するための方法及び装置 | |
| US4712189A (en) | Table driven translator | |
| EP0620522A2 (en) | High performance dynamic linking through caching | |
| JPH01306923A (ja) | 異種言語間連絡方式 | |
| JP2752094B2 (ja) | 論理型言語におけるバックトラック処理方式 | |
| JPH03212738A (ja) | 関数呼び出し方式 | |
| JPH01277934A (ja) | パラメータリスト参照方法の切換え方式 | |
| JP2003076558A (ja) | プログラム実行制御方法及びプログラム実行制御プログラム | |
| JPH09282174A (ja) | プログラム実行方法 | |
| JPH07244601A (ja) | 関係データベースのアクセス方法および装置 | |
| JPS62293434A (ja) | 分岐先予測制御方式 | |
| JPH0695868A (ja) | ソフトウェア管理方式 | |
| JPS63626A (ja) | プログラム管理装置 | |
| JPH0784797A (ja) | ロードモジュールへのソースコード行番号登録方法および装置 | |
| JPH0619721A (ja) | 機械語翻訳最適化方式 | |
| JPH0566949A (ja) | 関数定義コンパイルドコード呼出し方式 | |
| HK40120198A (zh) | 基於ai、rpa和ai agent的代码生成方法、装置和设备 | |
| JPH01207824A (ja) | モジュール結合制御方式 | |
| JPS62254237A (ja) | インタプリタ方式の分岐命令実行方式 | |
| Felgentreu et al. | Optimiizing Static Scope Lisp by Repetitive Interpretation of Recursive Function Calls | |
| JP2607975B2 (ja) | デバック方式 | |
| JPS6227822A (ja) | バツクトラツク制御方式 | |
| JPS6375837A (ja) | プログラミング言語の予約語追加に対する互換性維持の為の予約語管理方式 | |
| JPH0439734A (ja) | プログラム言語翻訳処理方式 |