JPH0566949A - 関数定義コンパイルドコード呼出し方式 - Google Patents

関数定義コンパイルドコード呼出し方式

Info

Publication number
JPH0566949A
JPH0566949A JP25703991A JP25703991A JPH0566949A JP H0566949 A JPH0566949 A JP H0566949A JP 25703991 A JP25703991 A JP 25703991A JP 25703991 A JP25703991 A JP 25703991A JP H0566949 A JPH0566949 A JP H0566949A
Authority
JP
Japan
Prior art keywords
function
code
compiled code
definition
address
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
JP25703991A
Other languages
English (en)
Inventor
Yukiko Hashimoto
ユキ子 橋本
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.)
NEC Corp
Original Assignee
NEC 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 NEC Corp filed Critical NEC Corp
Priority to JP25703991A priority Critical patent/JPH0566949A/ja
Publication of JPH0566949A publication Critical patent/JPH0566949A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【目的】 呼出し側の関数定義コンパイルドコードから
関数識別セルを経由せずに被呼出し側の関数定義コンパ
イルドコードを直接呼び出せるようにする。 【構成】 直接ブランチコード生成手段21はソースプ
ログラム5のコンパイル時にリンク関数指示11に基づ
いて被呼出し側の関数Bの関数定義コンパイルドコード
9に直接ブランチするような関数Bの関数呼出し命令1
0を生成し、直接ブランチコード確定手段31は関数A
の関数定義コンパイルドコード8のロード時に関数アド
レステーブル7を管理する参照関数名テーブル6を設定
あるいは参照して関数Bの関数呼出し命令10を確定
し、関数アドレステーブル生成手段32は関数Bの関数
定義コンパイルドコード9のロード完了後に関数Bの関
数定義コンパイルドコード9のアドレスを格納する関数
アドレステーブル7を生成する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明はLisp言語などのよう
なソースプログラム形式の関数でもコンパイルされた関
数でも動的に関数定義して呼び出すことができる言語処
理システムに関し、特にコンパイルされた関数オブジェ
クト(以下、関数定義コンパイルドコードという)を呼
び出す関数定義コンパイルドコード呼出し方式に関す
る。
【0002】
【従来の技術】プログラムを解釈実行しながら動作する
インタプリタを基本とし、実行速度を向上させるために
ソースプログラムをコンパイルするコンパイラを備える
言語処理システムでは、プログラミング上の意味的な一
かたまりを形成している単位である関数を定義したり、
すでに定義されている関数を修正したりすることがイン
タプリタ上で動的に行える。
【0003】従来の関数呼出し方式では、実際に関数を
呼び出す前であれば、呼び出そうとしている関数定義が
変更されても正しく最新の関数定義が呼び出せるよう
に、関数識別セルを経由して呼び出すような命令列を生
成していた。このとき、通常、関数識別セルに関数定義
コンパイルドコードへのアドレスが格納されているか、
ソースプログラム形式の関数定義へのアドレスが格納さ
れているかを判定し、関数呼出しの方法を切り換えて呼
び出すような処理を行う必要がある。
【0004】このため、ある関数からの他の関数を呼び
出すようなソースプログラムをコンパイルする際、被呼
出し側の関数定義が実行前に変更された場合でも、変更
された新しい関数定義が参照できるようにするために、
必ず関数識別セルを経由して関数識別セルの関数定義エ
ントリに格納されている関数定義へのアドレスに制御を
渡し、関数呼出しを行うような構成になっている。
【0005】例えば、図4に示すように、関数Aから関
数Bを呼び出す場合、各関数AおよびBは関数名などの
情報をもつ関数識別セル41および49をもち、その関
数識別セル41および49中の関数定義エントリ43お
よび51から関数定義コンパイルドコード44および5
2をポイントしている。関数定義コンパイルドコード4
4および52は、その関数定義から参照している関数識
別セル49や文字列などの他のオブジェクトのアドレス
を解決するためのリテラルテーブル46および54を備
えている。一般に、関数識別セルや文字列などのオブジ
ェクト、また関数定義コンパイルドコードは、関数のコ
ンパイル時にはその記憶域上のアドレスを決定すること
ができないため、関数Bの関数定義コンパイルドコード
52のロード時に関数Aの関数定義コンパイルドコード
44のリテラルテーブル46に関数Bの関数識別セル4
9のアドレス48を書き込み、コンパイル時にリテラル
テーブル46のエントリを参照して目的とする関数Bの
関数定義コンパイルドコード52をアクセスするような
コードを生成する。これにより、関数定義コンパイルド
コード44および52を記憶域上にロードした後でも、
関数定義を変更した場合、関数識別セル49の関数定義
エントリ51を更新すれば新しい関数定義コンパイルド
コード52を呼び出すことができる。
【0006】
【発明が解決しようとする課題】上述した従来の関数呼
出し方式では、関数識別セルの関数定義エントリを必ず
参照して関数定義コンパイルドコードを呼び出すように
なっているので、一旦生成してしまえば二度と更新する
必要のない関数定義コンパイルドコードに対しても、関
数識別セルへのアクセスのための処理が入り、関数定義
コンパイルドコードを直接呼び出す場合に比べて呼出し
時間が遅くなるという欠点がある。
【0007】本発明の目的は、上述の点に鑑み、関数呼
出しの実行速度を向上させるために、呼出し側の関数の
関数定義コンパイルドコードから関数識別セルを経由せ
ずに被呼出し側の関数の関数定義コンパイルドコードに
直接制御を渡して呼び出すことができるようにした関数
定義コンパイルドコード呼出し方式を提供することにあ
る。
【0008】
【課題を解決するための手段】本発明の関数定義コンパ
イルドコード呼出し方式は、プログラムを解釈実行しな
がら動作するインタプリタを基本とし、実行速度を向上
させるためにソースプログラムをコンパイルするコンパ
イラを備える言語処理システムにおいて、関数の関数定
義コンパイルドコードのアドレスを格納する関数アドレ
ステーブルと、この関数アドレステーブルを管理する参
照関数名テーブルと、ソースプログラムのコンパイル時
にリンク関数指示に基づいて被呼出し側の関数の関数定
義コンパイルドコードに直接ブランチするようなコード
を生成する直接ブランチコード生成手段と、関数の関数
定義コンパイルドコードのロード時に前記参照関数名テ
ーブルを設定あるいは参照し前記直接ブランチコード生
成手段により生成された被呼出し側の関数の関数定義コ
ンパイルドコードに直接ブランチするようなコードを確
定する直接ブランチコード確定手段と、関数の関数定義
コンパイルドコードのロード完了後に前記関数アドレス
テーブルを生成する関数アドレステーブル生成手段とを
有する。
【0009】
【作用】本発明の関数定義コンパイルドコード呼出し方
式では、関数アドレステーブルが関数の関数定義コンパ
イルドコードのアドレスを格納し、参照関数名テーブル
が関数アドレステーブルを管理し、直接ブランチコード
生成手段がソースプログラムのコンパイル時にリンク関
数指示に基づいて被呼出し側の関数の関数定義コンパイ
ルドコードに直接ブランチするようなコードを生成し、
直接ブランチコード確定手段が関数の関数定義コンパイ
ルドコードのロード時に参照関数名テーブルを設定ある
いは参照し直接ブランチコード生成手段により生成され
た被呼出し側の関数の関数定義コンパイルドコードに直
接ブランチするようなコードを確定し、関数アドレステ
ーブル生成手段が関数の関数定義コンパイルドコードの
ロード完了後に関数アドレステーブルを生成する。
【0010】
【実施例】次に、本発明について図面を参照して詳細に
説明する。
【0011】図1は、本発明の一実施例に係る関数定義
コンパイルドコード呼出し方式の構成を示すブロック図
である。本実施例の関数定義コンパイルドコード呼出し
方式は、直接ブランチコード確定手段31および関数ア
ドレステーブル生成手段32を含むローダ3を備えるイ
ンタプリタ1と、直接ブランチコード生成手段21を含
むコンパイラ2と、参照関数名テーブル6と、関数アド
レステーブル7と、被呼出し側の関数Bの関数呼出し命
令10を含む呼出し側の関数Aの関数定義コンパイルド
コード8と、被呼出し側の関数Bの関数定義コンパイル
ドコード9と、リンク関数指示11を含むソースプログ
ラム5とから構成されている。なお、図1中、符号4は
記憶域を示す。
【0012】リンク関数指示11は、関数アドレステー
ブル7を参照して他の関数に直接ブランチするようなコ
ードを生成することをコンパイラ2に指示する。
【0013】直接ブランチコード生成手段21は、ソー
スプログラム5のコンパイル時にリンク関数指示11に
基づいて関数アドレステーブル7に格納されているアド
レスを使用して被呼出し側の関数Bの関数定義コンパイ
ルドコード9に直接ブランチするコードである関数Bの
関数呼出し命令10を呼出し側の関数Aの関数定義コン
パイルドコード8に生成する。
【0014】直接ブランチコード確定手段31は、呼出
し側の関数Aの関数定義コンパイルドコード8のロード
時に参照関数名テーブル6を設定あるいは参照すること
によって被呼出し側の関数Bの関数定義コンパイルドコ
ード9に直接ブランチするコードである関数Bの関数呼
出し命令10を確定する。
【0015】関数アドレステーブル生成手段32は、関
数定義コンパイルドコードのロード完了後に、関数アド
レステーブル7を生成する。
【0016】図2を参照すると、参照関数名テーブル6
は、関数アドレステーブル7に関数定義コンパイルドコ
ードのアドレスを格納する関数名と、関数アドレステー
ブル7の先頭からの相対位置を表すオフセット値とから
構成されており、関数アドレステーブル7を管理してい
る。
【0017】同じく図2を参照すると、関数アドレステ
ーブル7は、関数定義コンパイルドコードのアドレスを
格納する。なお、関数の関数定義コンパイルドコードの
アドレスが格納される関数アドレステーブル7内の位置
(何番目のエントリかということ)と、同一の関数の関
数名が登録される参照関数テーブル6内の位置(何番目
のエントリかということ)とは対応する。
【0018】次に、このように構成された本実施例の関
数定義コンパイルドコード呼出し方式の動作について説
明する。
【0019】関数Aの関数定義コンパイルドコード8か
ら関数Bの関数定義コンパイルドコード9を呼び出す場
合、ソースプログラム5中にリンク関数指示11によっ
て、関数Bを関数識別セルを経由せずに直接呼び出すこ
とを指定する。
【0020】コンパイラ2は、関数Aの定義をコンパイ
ルする際、関数Aの定義中で呼び出す関数Bについては
直接呼び出すリンク関数指示11があるので、直接ブラ
ンチコード生成手段21により関数Bの関数定義コンパ
イルドコード9のアドレスに直接ブランチするコードで
ある関数Bの関数呼出し命令10を関数Aの関数定義コ
ンパイルドコード8に生成する。
【0021】具体的には、図3に示すように、関数アド
レステーブル7の先頭をレジスタR21が指すようにし
ておき、そのレジスタR21の指す何番目かのエントリ
内のアドレスに直接ブランチするブランチ命令[b x
(R)]を関数Bの関数呼出し命令10として生成す
る。このとき、関数アドレステーブル7の第何番目のエ
ントリに関数Bの関数定義コンパイルドコード9のアド
レスが格納されるかということは未決定である(関数A
の関数定義コンパイルドコード8をロードするときに決
定する)ので、オフセット値xには確定値を入れずに、
関数Bの関数呼出し命令10に関数Bの関数定義コンパ
イルドコード9に直接ブランチするブランチ命令[b
x(R)]であることがわかるような印を付けておく。
【0022】インタプリタ1のローダ3は、関数Aの関
数定義コンパイルドコード8を記憶域4上にロードする
際、直接ブランチコード確定手段31により、直接呼び
出すリンク指示11がある関数Bの関数定義コンパイル
ドコード9に対しては、参照関数名テーブル6を検索し
て関数名Bが登録されているかどうかを調べる。
【0023】参照関数名テーブル6に関数名Bが登録さ
れていなければ、直接ブランチコード確定手段31は、
参照関数名テーブル6に関数名Bを登録し、登録エント
リの位置に相当する関数アドレステーブル7のオフセッ
ト値を格納する。例えば、アドレスデータの大きさを4
バイトとし、関数名Bを関数参照テーブル6の第2エン
トリに登録したとすると、オフセット値xとして4を格
納する。そして、直接ブランチコード確定手段31は、
このオフセット値4を使ってブランチ命令[b4
(R)]を関数Bの関数呼出し命令10として関数Aの
関数定義コンパイルドコード8に埋め込む。
【0024】参照関数名テーブル6に関数名Bがすでに
登録されていれば、直接ブランチコード確定手段31
は、その対となっているオフセット値、例えば4を使っ
てブランチ命令[b 4(R)]を関数Bの関数呼出し
命令10として関数Aの関数定義コンパイルドコード8
に埋め込む。
【0025】関数アドレステーブル生成手段32は、各
関数の関数定義コンパイルドコードのアドレスは関数の
関数定義コンパイルドコードをすべて記憶域4上にロー
ドしてしまった後でないと決定されないので、すべての
関数の関数定義コンパイルドコードを記憶域4上にロー
ドした後で関数アドレステーブル7の生成を行う。その
方法としては、関数アドレステーブル7の生成を行う関
数を用意しておきソースプログラム5をコンパイルした
コンパイルドコードファイル(図示せず)をロードし終
わった時点で毎回関数を起動して生成する方法や、プロ
グラマがコンパイルドコードファイルのロード処理が全
て終わった段階でその関数を呼び出して生成を行う方法
などが考えられる。
【0026】関数アドレステーブル7を最初に生成した
ときは、関数アドレステーブル生成手段32は、各エン
トリの初期値を未定義関数が実行されたときに呼び出さ
れるルーチンのアドレスとしておく。そうすることによ
って、呼び出すべき関数の関数定義コンパイルドコード
がロードされなかった場合、その関数の関数呼出し命令
が実行されれば未定義エラーとなる。
【0027】次に、関数アドレステーブル生成手段32
は、参照関数名テーブル6の関数名を順に参照しなが
ら、関数の関数定義コンパイルドコードのアドレスを取
得し、関数アドレステーブル7に順に格納していく。
【0028】このようにして、関数アドレステーブル生
成手段32は、関数アドレステーブル7を生成する。
【0029】プログラムの実行時に、関数Aの関数定義
コンパイルドコード8において関数Bの関数呼出し命令
10であるブランチ命令[b 4(R)]が実行される
と、関数アドレステーブル7の第2エントリのアドレス
を用いて関数Bの関数定義コンパイルドコード9が直接
呼び出される。
【0030】
【発明の効果】以上説明したように本発明は、コンパイ
ラに直接ブランチコード生成手段を、インタプリタのロ
ーダに直接ブランチコード確定手段および関数アドレス
テーブル生成手段を設け、被呼出し側の関数の関数定義
コンパイルドコードを関数アドレステーブルを介して直
接呼び出すようなコードを呼出し側の関数の関数定義コ
ンパイルドコード中に生成することにより、関数識別セ
ルを経由することなしに、関数の関数定義コンパイルド
コードの呼出しを高速に行うことができるという効果が
ある。
【図面の簡単な説明】
【図1】本発明の一実施例に係る関数定義コンパイルド
コード呼出し方式の全体構成を示すブロック図である。
【図2】図1中の参照関数名テーブルおよび関数アドレ
ステーブルの内容を示す図である。
【図3】本実施例の関数定義コンパイルドコード呼出し
方式における関数定義コンパイルドコードに直接ブラン
チする様子を示す図である。
【図4】従来の関数呼出し方式を示すブロック図であ
る。
【符号の説明】
1 インタプリタ 2 コンパイラ 3 ローダ 4 記憶域 5 ソースプログラム 6 参照関数名テーブル 7 関数アドレステーブル 8 関数Aの関数定義コンパイルドコード 9 関数Bの関数定義コンパイルドコード 10 関数Bの関数呼出し命令 11 リンク関数指示 21 直接ブランチコード生成手段 31 直接ブランチコード確定手段 32 関数アドレステーブル生成手段

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】 プログラムを解釈実行しながら動作する
    インタプリタを基本とし、実行速度を向上させるために
    ソースプログラムをコンパイルするコンパイラを備える
    言語処理システムにおいて、 関数の関数定義コンパイルドコードのアドレスを格納す
    る関数アドレステーブルと、 この関数アドレステーブルを管理する参照関数名テーブ
    ルと、 ソースプログラムのコンパイル時にリンク関数指示に基
    づいて被呼出し側の関数の関数定義コンパイルドコード
    に直接ブランチするようなコードを生成する直接ブラン
    チコード生成手段と、 関数の関数定義コンパイルドコードのロード時に前記参
    照関数名テーブルを設定あるいは参照し前記直接ブラン
    チコード生成手段により生成された被呼出し側の関数の
    関数定義コンパイルドコードに直接ブランチするような
    コードを確定する直接ブランチコード確定手段と、 関数の関数定義コンパイルドコードのロード完了後に前
    記関数アドレステーブルを生成する関数アドレステーブ
    ル生成手段とを有することを特徴とする関数定義コンパ
    イルドコード呼出し方式。
JP25703991A 1991-09-09 1991-09-09 関数定義コンパイルドコード呼出し方式 Pending JPH0566949A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP25703991A JPH0566949A (ja) 1991-09-09 1991-09-09 関数定義コンパイルドコード呼出し方式

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP25703991A JPH0566949A (ja) 1991-09-09 1991-09-09 関数定義コンパイルドコード呼出し方式

Publications (1)

Publication Number Publication Date
JPH0566949A true JPH0566949A (ja) 1993-03-19

Family

ID=17300896

Family Applications (1)

Application Number Title Priority Date Filing Date
JP25703991A Pending JPH0566949A (ja) 1991-09-09 1991-09-09 関数定義コンパイルドコード呼出し方式

Country Status (1)

Country Link
JP (1) JPH0566949A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2002006957A1 (fr) * 2000-07-19 2002-01-24 Center For Advanced Science And Technology Incubation, Ltd. Procede et systeme d'execution de fonctions, moyens d'execution et d'enregistrement compris dans le systeme d'execution de fonctions, programme informatique permettant d'executer des fonctions, et support enregistre

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2002006957A1 (fr) * 2000-07-19 2002-01-24 Center For Advanced Science And Technology Incubation, Ltd. Procede et systeme d'execution de fonctions, moyens d'execution et d'enregistrement compris dans le systeme d'execution de fonctions, programme informatique permettant d'executer des fonctions, et support enregistre

Similar Documents

Publication Publication Date Title
US7516441B2 (en) Method and system for program editing and debugging in a common language runtime environment
JP2811990B2 (ja) プログラム処理装置及びプログラム処理方法
EP0905617B1 (en) Method for generating a java bytecode data flow graph
US6112025A (en) System and method for dynamic program linking
JPH0836488A (ja) ダイナミック・パッチングを使用するランタイム・エラー・チェック方法と装置
JPH09325901A (ja) デバッギングを実施する方法
JP2000181725A (ja) 実行可能なコ―ドを改変し、追加機能を付与するための方法およびシステム
US7386843B2 (en) Method and system for register allocation
JP2000222220A (ja) 動的コンパイル時期決定方法、バイトコード実行モード選択方法、及びコンピュータ
US6625807B1 (en) Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation
US7228527B1 (en) Method and system for structuring a procedure
CN113220326B (zh) 智能合约升级方法及区块链系统
US20010042241A1 (en) Apparatus and method for executing program using just-in time-compiler system
JP2919302B2 (ja) Cpuシミュレーション方法
US5150474A (en) Method for transferring arguments between object programs by switching address modes according to mode identifying flag
JPH0566949A (ja) 関数定義コンパイルドコード呼出し方式
US20020038454A1 (en) Method of compiling code in an object oriented programming language
CN113220327A (zh) 智能合约升级方法及区块链系统
US20070245328A1 (en) Method of calling a method in virtual machine environment and system including a virtual machine processing the method
CN114866451B (zh) iOS端路由通信改进方法、装置、存储介质和设备
CN113535230B (zh) 一种工程源码动态自适应不同硬件资源的方法及系统
JP3889227B2 (ja) プログラム実行装置、プログラム実行方法、記録媒体、及び制御プログラム
JP2003076558A (ja) プログラム実行制御方法及びプログラム実行制御プログラム
JPH11212807A (ja) プログラム実行方法
JP3596570B2 (ja) クラスの主記憶装置への配置方法