JP2011141676A - 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト - Google Patents
言語処理装置、言語処理方法およびコンピュータプログラムプロダクト Download PDFInfo
- Publication number
- JP2011141676A JP2011141676A JP2010001424A JP2010001424A JP2011141676A JP 2011141676 A JP2011141676 A JP 2011141676A JP 2010001424 A JP2010001424 A JP 2010001424A JP 2010001424 A JP2010001424 A JP 2010001424A JP 2011141676 A JP2011141676 A JP 2011141676A
- Authority
- JP
- Japan
- Prior art keywords
- function
- code
- information
- register
- assembler
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
Abstract
【課題】レジスタ退避の実行回数を少なくする。
【解決手段】ソースファイルD1に含まれる変数をレジスタに割付け、関数毎にアセンブラコードを生成し、レジスタを使用している関数の出入り口にレジスタの退避コードを挿入し、第1アセンブラプログラムD2を生成する第1アセンブラファイル生成部と、関数内で使用されているレジスタが呼び出し関数で使用されていない場合、前記第1アセンブラファイルD2に記述されたレジスタの退避コードを前記呼び出し関数の出入り口に移動させ、第2アセンブラプログラムD3を生成する第2アセンブラファイル生成部とを備える。
【選択図】図3
【解決手段】ソースファイルD1に含まれる変数をレジスタに割付け、関数毎にアセンブラコードを生成し、レジスタを使用している関数の出入り口にレジスタの退避コードを挿入し、第1アセンブラプログラムD2を生成する第1アセンブラファイル生成部と、関数内で使用されているレジスタが呼び出し関数で使用されていない場合、前記第1アセンブラファイルD2に記述されたレジスタの退避コードを前記呼び出し関数の出入り口に移動させ、第2アセンブラプログラムD3を生成する第2アセンブラファイル生成部とを備える。
【選択図】図3
Description
本発明は、言語処理装置、言語処理方法およびコンピュータプログラムプロダクトに関する。
高級言語で記述されたソースプログラムからターゲットプロセッサ用のアセンブラコード(アセンブラプログラム)を生成するコンパイラは、ソースコードに記述された変数をレジスタに割付けて、アセンブリ言語で記述された命令のオペランドとする。コンパイラが変数に割付けるレジスタには、関数の呼び出しがあった場合に、関数の呼び出しを跨いで値が変わらないことが保証されるレジスタ(保証レジスタ)と、関数の呼び出しを跨いで値が変わる可能性があるレジスタと、の二種類がある。どのレジスタを保証レジスタとするかは、ターゲットプロセッサ毎にABI(Applications Binary Interface)によって規定されている。
コンパイラには、呼び出された側の関数内で保証レジスタが使用されている場合、関数の呼び出しを跨いでレジスタの値が変わらないことを保証するために、レジスタ内容を退避/復帰させるコード(以下、退避コード)をこの関数の出入り口に生成する機能を有するものがある。なお、関数を呼び出す側の関数を呼び出し関数といい、呼び出される側の関数を被呼び出し関数ということとする。
一方、ターゲットプロセッサにおいては、退避コードの実行はメモリアクセスを伴うため、退避コードの実行回数が少ないほど実行速度が速くなる。したがって、コンパイラには退避コードの実行回数が少なくするようにアセンブラコードを最適化することが望まれる。
退避コードを最適化する技術として、特許文献1には、被呼び出し関数内で保証レジスタの値が破壊されても対象とするプログラム全体の動作が変わらないと判断できる場合、この被呼び出し関数内から該当する退避コードを削除する技術が開示されている。
本発明は、レジスタ退避の実行回数を少なくしたアセンブラコードを作成する言語処理装置、言語処理方法およびコンピュータプログラムプロダクトを提供することを目的とする。
本願発明の一態様によれば、単一のファイルに記述されているソースプログラムに含まれる変数をレジスタに割り付け、関数毎にアセンブラコードを生成し、レジスタを使用している関数の出入り口にレジスタの退避コードを挿入し、第1アセンブラプログラムを生成する第1アセンブラファイル生成部と、関数内で使用されているレジスタが呼び出し関数で使用されていない場合、前記第1アセンブラファイルに記述されたレジスタの退避コードを前記呼び出し関数の出入り口に移動させ、第2アセンブラプログラムを生成する第2アセンブラファイル生成部と、を備えることを特徴とする言語処理装置が提供される。
また、本願発明の一態様によれば、単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行する字句・構文解析部と、前記字句・構文解析部による解析結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成する関数呼出抽出部と、前記字句・構文解析部による解析結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付けるレジスタ割付部と、前記レジスタ割付部による割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成する保証レジスタ抽出部と、前記レジスタ割付部による割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成する第1アセンブラコード生成部と、前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成する退避コード情報生成部と、前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する移動処理部と、を備えることを特徴とする言語処理装置が提供される。
また、本願発明の一態様によれば、単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行し、前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成し、前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付け、前記変数の割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成し、前記変数の割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成し、前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成し、前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する、ことを特徴とする言語処理方法が提供される。
また、本願発明の一態様によれば、コンピュータで実行可能な複数の命令を含むコンピュータプログラムプロダクトであって、前記複数の命令は、単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行し、前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成し、前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付け、前記変数の割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成し、前記変数の割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成し、前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成し、前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する、ことを前記コンピュータに実行させる、ことを特徴とするコンピュータプログラムプロダクトが提供される。
本発明によれば、レジスタ退避の実行回数を少なくしたアセンブラコードを作成することができるという効果を奏する。
以下に添付図面を参照して、本発明の実施の形態にかかる言語処理装置、言語処理方法およびコンピュータプログラムプロダクトを詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
(第1の実施の形態)
本発明の第1の実施の形態は、ソースプログラム(ソースコード)をファイル毎にアセンブリ言語へ変換してアセンブラコード(アセンブラプログラム)を生成するコンパイル装置(コンパイラ)に適用される。第1の実施の形態のコンパイル装置は、被呼び出し関数内で保証レジスタが使用されている場合、該保証レジスタの内容に対する退避コードをこの被呼び出し関数の出入り口に生成する機能(退避コード生成機能)を備えていることとする。まず、図1および図2を参照して、第1の実施の形態の特徴を説明する。
本発明の第1の実施の形態は、ソースプログラム(ソースコード)をファイル毎にアセンブリ言語へ変換してアセンブラコード(アセンブラプログラム)を生成するコンパイル装置(コンパイラ)に適用される。第1の実施の形態のコンパイル装置は、被呼び出し関数内で保証レジスタが使用されている場合、該保証レジスタの内容に対する退避コードをこの被呼び出し関数の出入り口に生成する機能(退避コード生成機能)を備えていることとする。まず、図1および図2を参照して、第1の実施の形態の特徴を説明する。
図1は、第1の実施の形態のコンパイル装置に入力されるソースコードの一例を示す図である。この例では、C言語で記述されたソースコード101中には、関数subおよび関数testが定義されている。関数testは、ループ処理を含んでおり、このループ処理内で関数subを呼び出すようになっている。
第1の実施の形態のコンパイラは、まず、退避コード生成機能を使用してソースコード101からアセンブラコード(第1アセンブラコード)を生成する。そして、コンパイラは、退避コードの実行回数が少なくなるように第1アセンブラコードを修正し、第1の実施の形態による最終的な生成物としてのアセンブラコード(第2アセンブラコード)を生成する。
図2は、ソースコード101から生成されるアセンブラコードの例を示す図である。なお、この例においては、ターゲットプロセッサに関するABIによって、レジスタ「$8」を保証レジスタとすることが決められていることとする。
アセンブラコード102は、ソースコード101から生成された第1アセンブラコードの一例である。なお、コンパイラは、関数sub内においては$8を使用し、関数test内においては$8を使用しないようにレジスタ割付を行ったこととする。アセンブラコード102に示すように、$8の使用によって内容が破壊されないように、関数subの入口に、$8の内容をスタックに退避させる命令「push $8」が記述され、関数subの出口に、退避させた内容を$8に復帰させる命令「pop $8」が記述されている。以降、このようなpush、popの対を退避コードと呼ぶこととする。関数testには、$8を使用していないので$8に関する退避コードは記述されていない。関数testに対応するブロックには、関数subを呼び出す命令「call _sub」が記述されている。
ソースコード101では、関数subは、関数testが備えるforループ内で呼び出される。つまり、「call _sub」および関数subはforループの条件を満たす回数分繰り返し実行される。アセンブラコード102では、ターゲットプロセッサは、関数subを呼び出す毎に$8の退避/復帰を行うことになる。
アセンブラコード103は、アセンブラコード102から生成された第2アセンブラコードの例である。図示するように、第1アセンブラコード102では関数subの出入り口に記述されていた退避コードが第2アセンブラコード103では関数subを呼び出す関数testの出入り口に移動している。
アセンブラコード103によれば、ターゲットプロセッサは、関数testにおいて入り口で$8を退避してから、ループを実行し、関数の出口で$8を復帰させることになる。この場合、アセンブラコード102の場合に比べて退避コードの実行回数が関数testのループの回数分から1回で済む。
このように、本発明の第1の実施の形態は、被呼び出し関数の出入り口に記述されている保証レジスタの退避コードを呼び出し関数の出入り口に移動させることによって、退避コードの実行回数を少なくしたアセンブラコードを生成できるようにしたことが主たる特徴となっている。なお、第1アセンブラコードに含まれている退避コードを移動させる処理を、退避コード移動処理ということとする。
図3は、第1の実施の形態のコンパイル装置の構成図である。コンパイル装置200には、ソースコードが記述されたファイルであるソースファイルD1が入力される。コンパイル装置200は、入力されたソースファイルD1に基づいて第1アセンブラコードが記述されたファイルである第1アセンブラファイルD2を生成する。そして、コンパイル装置200は、第1アセンブラコードに対して退避コード移動処理を施して、第2アセンブラコードが記述されたファイルである第2アセンブラファイルD3を出力する。コンパイル装置200は、1つのソースファイルD1から1つの第2アセンブラファイルD3を生成する。
コンパイル装置200は、第1アセンブラファイルD2を生成するための構成(第1アセンブラファイル生成部)として、字句・構文解析部201と、レジスタ割付部202と、アセンブラコード生成部203と、を備えている。
字句・構文解析部201、レジスタ割付部202、およびアセンブラコード生成部203の機能は、一般的に入手可能なコンパイル装置に備えられる各構成の機能と同じである。字句・構文解析部201の字句解析では、入力されたソースファイルD1に含まれる夫々の字句をRAMなどに展開する。そして、字句・構文解析部201の構文解析では、展開された夫々の字句の意味、字句の組み合わせにより生じるソースファイルD1に記述されたプログラム上の意味(関数、変数、代入文関係など)を認識する。
レジスタ割付部202は、字句・構文解析部201による解析結果に基づいて、ソースファイルD1に含まれる夫々の変数にレジスタを割付ける。アセンブラコード生成部203は、レジスタ割付部202によるレジスタ割付け結果に基づいてアセンブラコードを生成し、第1アセンブラファイルD2を作成する。ここで、アセンブラコード生成部203は、変数に対して保証レジスタを割り付けた場合に、この関数の出入り口にこの保証レジスタの退避コードを挿入する。
さらに、コンパイル装置200は、第1アセンブラファイルD2から第2アセンブラファイルD3を生成するための構成(第2アセンブラファイル生成部)として、関数呼出抽出部204と、保証レジスタ抽出部205と、退避コード情報生成部206と、退避コード移動処理部207と、を備えている。
関数呼出抽出部204は、字句・構文解析部201による解析結果に基づいて、ソースファイルD1に含まれる関数間の呼び出し関係の情報、各関数について他のファイルから呼び出される関数かの情報、動的呼出となっている可能性があるかの情報を抽出する。関数呼出抽出部204は、抽出した呼び出し関係を関数呼出情報D4として作成する。
保証レジスタ抽出部205は、レジスタ割付部202によるレジスタ割付け結果に基づいて、関数内で使用されている保証レジスタの関数毎のリストである保証レジスタ情報D5を作成する。
退避コード情報生成部206は、関数呼出情報D4と保証レジスタ情報D5とに基づいて、関数内で使用されている保証レジスタに対する退避コードが移動可能であるか否かを関数毎に判定する。より詳しくは、退避コード情報生成部206は、着目した関数が保証レジスタを使用し、かつこの関数を呼び出す呼び出し関数でこの保証レジスタを使用している関数がない場合、この保証レジスタに対する退避コードは移動可能であると判定する。さらに、退避コード情報生成部206は、退避コード移動処理前における退避コードの位置(すなわちアセンブラコード生成部203によって退避コードが挿入される位置)および退避コード移動処理後における退避コードの位置を記述した退避コード情報D6を生成する。
退避コード移動処理部207は、退避コード情報D6に基づいて第1アセンブラファイルD2に記述されている退避コードに対して退避コード移動処理を施し、第2アセンブラファイルD3を生成する。なお、第1アセンブラファイルD2は最終的なアセンブラコードではないので、ファイルとして出力せず、内部情報としてメモリ上に格納された状態でもよい。
図4は、コンパイル装置200のハードウェア構成図である。コンパイル装置200は、CPU(Central Processing Unit)1、ROM(Read Only Memory)2、RAM(Random Access Memory)3、入力部4、表示部5を備えるコンピュータ構成となっている。各々は、バスラインなどを介して夫々接続されている。
CPU1は、第1の実施の形態のコンパイル方法を実行するコンピュータプログラムプロダクトであるコンパイルプログラム6を実行する。表示部5は、液晶モニタなどの表示装置であり、CPU1からの指示に基づいて、操作画面などのユーザに対する出力情報を表示する。入力部4は、マウスやキーボードなどを備えて構成され、ユーザからの操作をコンパイル装置200へ入力する。入力部4から入力された操作情報は、CPU1へ送られて処理される。
コンパイルプログラム6は、字句・構文解析部201、レジスタ割付部202、アセンブラコード生成部203、関数呼出抽出部204、保証レジスタ抽出部205、退避コード情報生成部206、および退避コード移動処理部207を含むモジュール構成となっており、RAM3にロードされることによってRAM3にこれらの構成部が生成される。
コンパイルプログラム6は、ROM2内に格納されており、バスラインを介してRAM3へロードされる。図4は、コンパイルプログラム6がRAM3へロードされた状態を示している。CPU1はRAM3内にロードされたコンパイルプログラム6を実行する。CPU1は、外部記憶装置などから入力されたソースファイルD1に基づいて各種処理を実行し、この各種処理に際して生じる第1アセンブラファイルD2、関数呼出情報D4、保証レジスタ情報D5、退避コード情報D6などの中間データを、RAM3内に形成されるデータ格納領域に一時的に記憶させておく。CPU1は、データ格納領域に一時的に記憶させた前述のデータを使用して第2アセンブラファイルD3を作成し、RAM3内のプログラム格納領域あるいは外部記憶装置などに出力する。なお、コンパイルプログラム6は、DISKなどの記憶装置に格納しておいてもよいし、ロードしてもよい。
なお、コンパイルプログラム6を、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供または配布するように構成しても良い。また、コンパイルプログラム6を、ROM2等に予め組み込んでコンパイル装置200に提供するように構成してもよい。
次に、コンパイル装置200を用いて実現される本発明の第1の実施の形態のコンパイル方法について説明する。ここでは、レジスタ$8〜$11が保証レジスタであると定義されているプロセッサをターゲットプロセッサとする。図5(a)に示すソースコード(ソースファイルD1)が入力されたとする。図5(a)のソースコードによれば、関数sub、関数test、関数mainが記述されており、関数mainが関数testを呼び出し、関数testはループ処理内で関数subを呼び出すようになっている。第1アセンブラファイル生成部の処理によりソースコード(図5(a))から、第1アセンブラコード(図5(b))が記述された第1アセンブラファイルD2が得られる。また、図5(b)に示す第1アセンブラコードによれば、関数subの出入り口に$8の退避コードが生成され、関数testの出入り口に$9〜$11の退避コードが生成されている。この第1アセンブラコードによれば、$8の退避コードは、関数testがループ処理を実行する毎に実行されることになる。
図6は、第1の実施の形態のコンパイル方法を説明するフローチャートである。まず、字句・構文解析部201は、ソースファイルD1に記述されているソースファイルD1について解析を実行する(S1)。すると、関数呼出抽出部204は、字句・構文解析部201による解析結果に基づいて、関数間の呼び出し関係の情報、各関数について他のファイルから呼び出される関数かの情報、動的呼出となっている可能性があるかの情報を抽出し、関数呼出情報D4を作成する(S2)。
図7は、関数呼出情報D4の一例を示す図である。図示するように、関数呼出情報D4は、関数毎に、自身が呼び出す被呼び出し関数と自身を呼び出す呼び出し関数とが記述されるフィールドを含んでいる。例えば関数testは、関数subが被呼び出し関数、関数mainが呼び出し関数であることが示されている。
なお、字句・構文解析部201による解析は、静的な解析によって行われるものであるので、関数のポインタなどを使用した関数コールによって動的に飛び先が変わる呼出については解析することはできない。したがって、本発明の第1の実施の形態では、動的に呼び出される可能性のある関数が含む退避コードは、退避コード移動処理の対象外とする。また、入力されたソースファイルD1以外のファイルから呼び出される可能性のある関数が含む退避コードに対して退避コード移動処理を実行しようとすると、プログラムを構成するソースファイルをすべて解析する必要があるため、退避コード移動処理が可能であるか否かを判定する処理が複雑になり、コンパイル時間が長くなってしまう。したがって、本発明の第1の実施の形態では、他のファイルから呼び出される可能性のある関数が含む退避コードも、退避コード移動処理の対象外とする。
関数呼出情報D4は、関数毎に、入力されたソースファイルD1とは異なる他のファイルから呼び出される関数であるか否か、および自関数が動的呼び出しによって呼び出される可能性があるか否か、が記述されるフィールドを含んでいる。他のファイルから呼び出される関数であるか否かは、例えばC言語においては、static宣言された関数であるか否かによって判定することができる。また、C言語の場合、関数の動的呼び出しには、関数のポインタ型の変数に初期値または代入文によって該関数のアドレスが設定される必要がある。したがって、ソースファイルD1中に、被呼び出し関数について関数の呼び出し以外で、被呼び出し関数の参照がない場合には、そのソースファイルD1では被呼び出し関数についての動的な関数コールは発生しないと判断できる。図7の例では、例えば関数testは、static宣言されているので他のファイルから呼び出される関数ではなく、testは 関数mainでの呼び出し以外には参照されていないので動的呼び出しに呼び出される可能性がないことが示されている。
続いて、レジスタ割付部202は、字句・構文解析部201による解析結果に基づいて、ソースファイルD1に記述されている変数にレジスタを割付ける(S3)。図5(b)の例では、関数subは変数i、変数rに$4、$8が夫々割付けられ、関数testは変数c、変数i、変数sumに、$9、$10、$11が夫々割付けられている。関数mainは変数を使用していないので、レジスタ割付けの対象にはならない。
すると、保証レジスタ抽出部205は、レジスタ割付部202によるレジスタ割付け結果に基づいて保証レジスタ情報D5を生成する(S4)。図8は、保証レジスタ情報D5の一例を示す図である。保証レジスタ情報D5は、関数subでは、保証レジスタとして使用することが規定されているレジスタのうちの$8が使用され、関数testでは$9、$10、および$11が使用されていることを示している。
なお、ターゲットプロセッサがコアレジスタとコプロセッサレジスタのように複数の種類を持っており、それらのレジスタについてレジスタ割付がレジスタ割付部202によってなされている場合がある。保証レジスタ抽出部205は、レジスタの種類に関係なく全ての保証レジスタに関する保証レジスタ情報D5を生成する。
続いて、アセンブラコード生成部203は、レジスタ割付部202によるレジスタ割付け結果に基づいて第1アセンブラファイルD2を生成する(S5)。ここでは図5(b)に示した第1アセンブラファイルD2が生成される。
退避コード情報生成部206は、関数呼出情報D4および保証レジスタ情報D5に基づいて、退避コード情報D6を生成する(S6)。図9は、退避コード情報生成部206が退避コード情報D6を生成する動作を説明するフローチャートである。図10は、生成される退避コード情報D6の一例を示す図である。
図9に示すように、退避コード情報生成部206は、保証レジスタ情報D5に基づいて、一時情報としての退避コード情報D6を作成する(S11)。ここで、作成された直後の一時情報としての退避コード情報D6を初期状態の退避コード情報D6ということとする。
図10(a)は、S11において作成された初期状態の退避コード情報D6の例を示す図である。一時情報としての退避コード情報D6には、退避コード移動処理前の退避コード生成対象となる保証レジスタ名の関数毎の記述(移動前情報)と、退避コードの移動後の一時的な移動先を示すための保証レジスタ名の関数毎の記述(移動後情報)と、を備えている。保証レジスタ名の関数毎の記述は、該記述において保証レジスタが属する関数がその保証レジスタを退避させる退避コードの挿入位置であることを示している。初期状態の退避コード情報D6においては、移動後情報は移動前情報と等しい値であることとする。なお、移動前情報は保証レジスタ情報D5と等しいため、一時情報としての退避コード情報D6から移動前情報を省き、以降の処理においてはコンパイル装置200は移動前情報の代わりに保証レジスタ情報D5を使用するようにしてもよい。
S11の後、退避コード情報生成部206は、退避コード情報D6のうちから関数を1つ選択する(S12)。そして、退避コード情報生成部206は、関数呼出情報D4を参照して、選択した関数が、該関数を呼び出す呼び出し関数を全て把握できる関数であるか否かを判定する(S13)。ここで、全て把握できる関数とは、該関数を呼び出す呼び出し関数のすべてが他のファイルから呼び出される関数でなく、かつ動的呼び出しにより呼び出される可能性がない関数である。
すべての呼び出し関数が把握できる関数であった場合(S13、Yes)、退避コード情報生成部206は、退避コード情報D6のうちの移動後情報を参照し、選択した関数の移動後情報にレジスタ名が記述されているか否かを判定する(S14)。
選択した関数の移動後情報にレジスタ名が記述されていた場合(S14、Yes)、退避コード情報生成部206は、選択した関数の移動後情報に記述されていたレジスタのうち、選択した関数を呼び出す呼び出し関数のうちのどの呼び出し関数の移動前情報にも同一のレジスタ名が記述されていないレジスタがあるか否かを判定する(S15)。
どの呼び出し関数の移動前情報にも同一のレジスタ名が記述されていないレジスタがあった場合(S15、Yes)、退避コード情報生成部206は、そのレジスタに対する退避コードを移動対象であると判定(決定)し(S16)、一時情報としての退避コード情報D6を更新する(S17)。具体的には、退避コード情報生成部206は、選択した関数の移動後情報から移動対象であると判定されたレジスタ名を削除し、選択した関数を呼び出すすべての呼び出し関数の移動後情報に該レジスタ名を記入する。なお、退避コード情報生成部206は、記入先にすでに該当するレジスタ名が存在した場合、その記入先にはそのレジスタ名を記入しない。
選択した関数が呼び出し関数をすべて把握できる関数ではなかった場合(S13、No)、退避コード情報生成部206は、選択した関数には移動対象となる退避コードはない、と判定(決定)する(S18)。
同様に、移動後情報にレジスタ名称が記述されていなかった場合(S14、No)や、どの呼び出し関数の移動前情報にも同一のレジスタ名が記述されていないレジスタがなかった場合(S15、No)、S18へ移行する。
S17またはS18の後、退避コード情報生成部206は、すべての関数が選択済みであるか否かを判定もする(S19)。未選択の関数がある場合(S19、No)、S12へ移行し、未選択の関数がなくなるまでS12〜S18を繰り返す。
すべての関数が選択済みであった場合(S19、Yes)、退避コード情報生成部206は、S12〜S19の処理によって一時情報としての退避コード情報D6が更新されたか否か、を判定する(S20)。更新された場合(S20、Yes)、退避コード情報生成部206は、すべての関数を未選択とし(S21)、S12へ移行する。更新されなかった場合(S20、No)、これ以上新たに移動対象となる退避コードはないので、退避コード情報生成部206の動作がリターンとなる。なお、1回目のS20の判定処理においては、初期状態の退避コード情報D6から更新されたか否か、2回目以降のS20の判定処理においては、退避コード情報生成部206は、前回のS20の判定処理以降に一時情報としての退避コード情報D6が更新されたか否かを判定することとする。図10(b)は、S6の処理を経た後における退避コード情報D6である。
S6の後、退避コード移動処理部207は、生成された退避コード情報D6に基づいて、第1アセンブラファイルD2に対して退避コード移動処理を施し、第2アセンブラファイルD3を生成する(S7)。退避コード移動処理は、移動前情報に記述されており、かつ移動後情報に記述されていない保証レジスタを関数毎に抽出し、抽出した保証レジスタを保護するための関数毎の退避コードを移動前情報に記述されている関数の出入り口から削除するとともに、移動後情報に記述されており、かつ移動前情報に記述されていない保証レジスタを関数毎に抽出し、抽出した保証レジスタを保護するための退避コードを移動後情報に記述されている関数の出入り口に挿入することである。例えば、図10(b)の退避コード情報D6によれば、退避コード移動処理部207は、関数subから$8、関数testから$9〜$11に関する退避コードを削除し、関数mainに$8〜$11に関する退避コードを記入する。すなわち、$8に関する退避コードが関数subから関数mainへ移動し、$9〜$11に関する退避コードが関数testから関数mainへ移動することになる。なお、退避コード移動処理として、退避コード移動処理部207は、移動前情報に記述されている保証レジスタの退避コードを全て削除し、移動後情報に記述されている保証レジスタの退避コードを全て追加するようにしてもよい。
図11は、生成された第2アセンブラファイルD3に記述されている第2アセンブラコードの例である。図5(b)の第1アセンブラコードの例に記述されていた関数sub、関数testの退避コードが、図11の第2アセンブラコードでは関数mainに移動させられていることがわかる。この第2アセンブラコードでは、関数testがループ処理を実行する毎に実行される$8の退避コードが、関数mainすなわちこのループ処理外に移動しているので、第1アセンブラコードに比べて$8の退避コードの実行回数が減少する。
複数の被呼び出し関数から同一の保証レジスタに関する退避コードが同一の呼び出し関数に移動する場合について説明する。図12−1および図12−2は、この場合の具体例を説明するための図である。
図12−1(a)は、関数呼出情報D4の一例を示す図である。この関数呼出情報D4には、関数testは関数sub1および関数sub2を呼び出し、関数testは関数main(図示せず)から呼び出されることを示している。また、この関数呼出情報D4には、関数test、関数sub1、および関数sub2は、他のファイルから呼び出される関数ではなく、かつ動的呼出しによって呼出される可能性はないことが記述されている。
図12−1(b)は、初期状態の退避コード情報D6の一例を示す図である。
S12において関数sub1が選択されると、図12−1(b)の退避コード情報D6が更新され、退避コード情報D6は、関数sub1の移動後情報から$8が削除され、関数testの移動後情報に$8が追加された状態となる(図12−2(c))。そして、再度S12へ移行して関数sub2が選択されると、図12−2(c)の退避コード情報D6がさらに更新されて、退避コード情報D6は、関数sub2の移動後情報から$8が削除された状態となる(図12−2(d))。ここで、関数sub2の移動後情報から削除された$8が関数testの移動後情報に追加されていないのは、関数testの移動後情報には関数sub1から削除された$8がすでに追加されているためである。
S12において関数sub1が選択されると、図12−1(b)の退避コード情報D6が更新され、退避コード情報D6は、関数sub1の移動後情報から$8が削除され、関数testの移動後情報に$8が追加された状態となる(図12−2(c))。そして、再度S12へ移行して関数sub2が選択されると、図12−2(c)の退避コード情報D6がさらに更新されて、退避コード情報D6は、関数sub2の移動後情報から$8が削除された状態となる(図12−2(d))。ここで、関数sub2の移動後情報から削除された$8が関数testの移動後情報に追加されていないのは、関数testの移動後情報には関数sub1から削除された$8がすでに追加されているためである。
図13は、第1アセンブラコード(図12−1(b))と第2アセンブラコード(図12−2(d))とを比較した図である。第1アセンブラコード104では、関数sub1および関数sub2はともに出入り口に$8の退避コードを備えている。これに対して、第2アセンブラコード105では、関数testの出入り口に$8の退避コードを備えている。すなわち、第2アセンブラコード105は、第1アセンブラコード104に比べ、$8の退避コード1つ分が減少している。
このように、複数の被呼び出し関数から同一の保証レジスタに関する退避コードが同一の呼び出し関数に移動する場合、移動先で退避コードが重複しないようにしているので、アセンブラコードのコードサイズを減少させることができる。
なお、特許文献1によれば、退避コードを削除することによって退避コードの実行回数を減少させる。しかしながら、退避コードを削除するためには、その退避コードを削除してもプログラムの動作に支障がない必要がある。言い換えると、アプリケーションプログラムの最初の関数から退避コードを削除する関数の間に、そのレジスタが使用されていないことが退避コードを削除するための条件となる。これに対して、本発明の第1の実施の形態では退避コードを呼び出された関数から呼び出した関数に移動させるだけなので、呼び出した関数のさらに上位の関数から見ると、保証レジスタの値は保存されており、プログラムの動作には支障がない。すなわち、本発明の第1の実施の形態によれば、呼び出した関数でそのレジスタが使用されていないことだけが退避コードの移動の条件であるので、特許文献1の技術では退避コードが削除できない場合であっても退避コードを移動することで、特許文献1の技術よりも退避コードの実行回数をさらに少なくしたアセンブラコードを生成することができる。
なお、本発明の第1の実施の形態では、コアレジスタ、コプロセッサレジスタの区別なく全てのレジスタに対する保証レジスタ情報D5を作成するようにしている。コアレジスタとコプロセッサレジスタの区別があるプロセッサにおいては、ローカル関数ではコプロセッサレジスタを多用した処理を行い、それらを呼び出す上位の関数ではコプロセッサレジスタではなくコアレジスタを使用した処理を行う場合がある。このような場合においては、ローカル関数でのコプロセッサレジスタの退避コードを上位の関数に移動させることができるケースが多くなるので、退避コードの実行回数を大きく減らすことができる。
以上述べたように、本発明の第1の実施の形態によれば、ソースファイルD1から、保証レジスタを使用する関数の出入り口に前記使用される保証レジスタを保護するための退避コードを挿入した第1アセンブラファイルD2を生成し、第1アセンブラファイルD2の生成過程において出力される構文解析結果に基づいてソースファイルD1に含まれる関数間の呼び出し関係を記述した関数呼出情報を生成し、第1アセンブラファイルD2の生成過程において出力されるレジスタ割付け結果に基づいて、ソースコードに含まれる関数内で使用されている保証レジスタの関数毎のリストである保証レジスタ情報D5を生成し、関数呼出情報D4および保証レジスタ情報D5に基づいて、退避コードを該退避コードが挿入されている関数から該関数の呼び出し元の関数への移動が可能であるか否かを判定する判定処理を退避コード毎に実行して退避コードの移動後の挿入先の関数を退避コード毎に示す退避コード情報D6を生成し、退避コード情報に基づいて第1アセンブラファイルD2に記述されている退避コードに対して退避コード移動処理を実行して第2アセンブラコードD3を生成するように構成したので、被呼び出し関数の出入り口に挿入されている退避コードを呼び出し関数の出入り口に移動させることができるので、レジスタ退避の実行回数を少なくしたアセンブラコードを作成することができる。
また、一時的な移動先の関数を退避コード毎に示す一時情報としての退避コード情報D6を作成し、判定処理を実行する毎に一時情報としての退避コード情報D6を更新し、更新前後で一時情報としての退避コード情報D6が変化しなくなったとき、一時情報としての退避コード情報D6を退避コード移動処理を実行するための退避コード情報D6とするようにしたので、退避コードの実行回数を可及的に少なくしたアセンブラコードを作成することができる。
なお、以上の説明においては、スタック領域の確保・解放命令を伴ったpush、pop命令を退避コードとして説明したが、退避コードは、レジスタ内容を退避/復帰させるための命令であればどのような命令であってもよい。push、pop命令以外の退避コードとしては、たとえば、スタック領域の確保・解放命令を伴わないロード・ストア命令とスタックポインタの加減命令の組でも退避コードとして使用できる。また、ソースファイルD1の例としてC言語で記述されたプログラムを挙げたが、ソースファイルD1の記述言語はC言語以外の関数の概念があり、コンパイラによってアセンブラコードに変換される高級言語であっても構わない。
なお、最終的にターゲットプロセッサで動作する実行ファイルを得るためには、ユーザは、アセンブラプログラムを用いて第2アセンブラファイルD3をリロケータブルファイルに変換する。そして、ユーザは、リンクプログラムを用いて、ファイル毎に作成されたリロケータブルファイルをすべて結合するとともにアドレス解決を行い、実行ファイルを得る。
図14に示すように、第1の実施の形態のコンパイルプログラム6は、第2アセンブラファイルD3をリロケータブルファイルに変換するためのアセンブルプログラム7とともにパッケージ化されたプログラムパッケージ8の一部として提供されるようにしてもよい。また、図15に示すように、第1の実施の形態のコンパイルプログラム6は、アセンブルプログラム7、およびファイル毎に作成されたリロケータブルファイルをすべて結合するとともにアドレス解決を行うためのリンクプログラム9とともにパッケージ化されたプログラムパッケージ10のうちの一部として提供されるようにしてもよい。
(第2の実施の形態)
本発明の第2の実施の形態は、ソースコードをファイル毎にリロケータブルファイルに変換するコンパイル・アセンブル装置に適用される。
本発明の第2の実施の形態は、ソースコードをファイル毎にリロケータブルファイルに変換するコンパイル・アセンブル装置に適用される。
図16は、第2の実施の形態のコンパイル・アセンブル装置の構成図である。なお、第1の実施の形態と同様の機能を備える構成部については第1の実施の形態と同じ符号を付し、詳細な説明を省略する。
コンパイル・アセンブル装置300は、入力されたソースファイルD1から第1アセンブラファイルD2とともに関数呼出情報D4および保証レジスタ情報D5を生成するコンパイル部310と、第1アセンブラファイルD2、関数呼出情報D4および保証レジスタ情報D5に基づいて第2アセンブラファイルD3を生成し、生成した第2アセンブラファイルD3からリロケータブルファイルD7を生成するアセンブル部320と、を備えている。
コンパイル部310は、ソースファイルD1に対して字句・構文解析を実行する字句・構文解析部201と、字句・構文解析部201による解析結果に基づいて関数呼出情報D4を生成する関数呼出抽出部204と、字句・構文解析部201による解析結果に基づいて変数をレジスタに割付けるレジスタ割付部202と、レジスタ割付部202によるレジスタ割付結果に基づいて保証レジスタ情報D5を生成する保証レジスタ抽出部205と、レジスタ割付部202によるレジスタ割付け結果に基づいて第1アセンブラファイルD2を生成するアセンブラコード生成部203と、を備えている。
また、アセンブル部320は、関数呼出情報D4および保証レジスタ情報D5に基づいて退避コード情報D6を生成する退避コード情報生成部206と、退避コード情報D6に基づいて第1アセンブラファイルD2に対して退避コード移動処理を実行し、第2アセンブラファイルD3を生成する退避コード移動処理部207と、第2アセンブラファイルD3からリロケータブルファイルD7を生成するアセンブラファイル変換部321と、を備えている。
第2の実施の形態のコンパイル・アセンブル装置300は図14と等しいハードウェア構成により実現される。ただし、コンパイル・アセンブル装置300においては、関数呼出抽出部204、保証レジスタ抽出部205、退避コード情報生成部206、退避コード移動処理部207のうち、関数呼出抽出部204および保証レジスタ抽出部205がコンパイルプログラム6によって実現され、退避コード情報生成部206および退避コード移動処理部207がアセンブルプログラム7によって実現される点が第1の実施の形態と異なる。
このように、ソースファイルD1から第1アセンブラファイルD2を生成し、生成した第1アセンブラファイルD2に対して退避コード移動処理を施して退避コードの実行回数を少なくしたアセンブラファイルである第2アセンブラファイルD3を生成するので、結果として保証レジスタの退避/復帰の実行回数を低減したリロケータブルファイルD7を生成することができる。
1 CPU、2 ROM、3 RAM、4 入力部、5 表示部、6 コンパイルプログラム、7 アセンブルプログラム、8 パッケージプログラム、9 リンクプログラム、10 パッケージプログラム、200 コンパイル装置、201 字句・構文解析部、202 レジスタ割付部、203 アセンブラコード生成部、204 関数呼出抽出部、205 保証レジスタ抽出部、206 退避コード情報生成部、207 退避コード移動処理部、300 コンパイル・アセンブル装置、310 コンパイル部、320 アセンブル部、321 アセンブラファイル変換部。
Claims (5)
- 単一のファイルに記述されているソースプログラムに含まれる変数をレジスタに割り付け、関数毎にアセンブラコードを生成し、レジスタを使用している関数の出入り口にレジスタの退避コードを挿入し、第1アセンブラプログラムを生成する第1アセンブラファイル生成部と、
関数内で使用されているレジスタが呼び出し関数で使用されていない場合、前記第1アセンブラファイルに記述されたレジスタの退避コードを前記呼び出し関数の出入り口に移動させ、第2アセンブラプログラムを生成する第2アセンブラファイル生成部と、
を備えることを特徴とする言語処理装置。 - 単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行する字句・構文解析部と、
前記字句・構文解析部による解析結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成する関数呼出抽出部と、
前記字句・構文解析部による解析結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付けるレジスタ割付部と、
前記レジスタ割付部による割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成する保証レジスタ抽出部と、
前記レジスタ割付部による割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成する第1アセンブラコード生成部と、
前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成する退避コード情報生成部と、
前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する移動処理部と、
を備えることを特徴とする言語処理装置。 - 単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行し、
前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成し、
前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付け、
前記変数の割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成し、
前記変数の割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成し、
前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成し、
前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する、
ことを特徴とする言語処理方法。 - 前記退避コード情報を生成するは、
一時的な移動先の関数を退避コード毎に示す一時情報を生成し、
前記一時情報に基づいて判定し、前記判定の実行結果毎に前記一時情報に反映する単位処理を繰り返し実行し、
前記判定の実行結果毎の反映前後で前記一時情報が変化しなくなったとき、前記反映の前後で変化しなくなった一時情報を前記退避コード情報とする、
を含む、
ことを特徴とする請求項3に記載の言語処理方法。 - コンピュータで実行可能な複数の命令を含むコンピュータプログラムプロダクトであって、前記複数の命令は、
単一のファイルに記述されているソースプログラムに対して字句・構文解析を実行し、
前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる関数間の呼び出し関係を記述した関数呼出情報を生成し、
前記字句・構文解析の実行結果に基づいて前記ソースプログラムに含まれる変数にレジスタを割付け、
前記変数の割付け結果に基づいて、前記ソースプログラムに含まれる関数内で値が変わらない保証レジスタの関数毎の保証レジスタ情報を生成し、
前記変数の割付け結果に基づいて、前記ソースプログラムから、保証レジスタを使用している関数の出入り口に前記使用されている保証レジスタの内容を保護するための退避コードを挿入した第1アセンブラプログラムを生成し、
前記関数呼出情報および前記保証レジスタ情報に基づいて、退避コードを挿入されている関数から該関数の呼び出し元の関数に移動させることが可能であるか否かを判定し、退避コードの移動先の関数を示す退避コード情報を生成し、
前記保証レジスタ情報および前記退避コード情報に基づいて、前記第1アセンブラプログラムに記述されている退避コードを移動させ、第2アセンブラプログラムを生成する、
ことを前記コンピュータに実行させる、
ことを特徴とするコンピュータプログラムプロダクト。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010001424A JP2011141676A (ja) | 2010-01-06 | 2010-01-06 | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
US12/716,649 US20110167415A1 (en) | 2010-01-06 | 2010-03-03 | Language processing apparatus, language processing method, and computer program product |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010001424A JP2011141676A (ja) | 2010-01-06 | 2010-01-06 | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2011141676A true JP2011141676A (ja) | 2011-07-21 |
Family
ID=44225466
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010001424A Pending JP2011141676A (ja) | 2010-01-06 | 2010-01-06 | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト |
Country Status (2)
Country | Link |
---|---|
US (1) | US20110167415A1 (ja) |
JP (1) | JP2011141676A (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015056098A2 (en) * | 2013-10-18 | 2015-04-23 | Marvell World Trade Ltd. | Systems and methods for register allocation |
US9146715B1 (en) | 2014-09-05 | 2015-09-29 | International Business Machines Corporation | Suppression of table of contents save actions |
US9274769B1 (en) | 2014-09-05 | 2016-03-01 | International Business Machines Corporation | Table of contents pointer value save and restore placeholder positioning |
US9244663B1 (en) | 2014-12-22 | 2016-01-26 | International Business Machines Corporation | Managing table of contents pointer value saves |
US10366234B2 (en) * | 2016-09-16 | 2019-07-30 | Rapid7, Inc. | Identifying web shell applications through file analysis |
Family Cites Families (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4656582A (en) * | 1985-02-04 | 1987-04-07 | International Business Machines Corporation | Generating storage reference instructions in an optimizing compiler |
US5428793A (en) * | 1989-11-13 | 1995-06-27 | Hewlett-Packard Company | Method and apparatus for compiling computer programs with interproceduural register allocation |
US5249295A (en) * | 1990-06-20 | 1993-09-28 | Rice University | Digital computer register allocation and code spilling using interference graph coloring |
US5193180A (en) * | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
US5530866A (en) * | 1991-07-30 | 1996-06-25 | Tera Computer Company | Register allocation methods having upward pass for determining and propagating variable usage information and downward pass for binding; both passes utilizing interference graphs via coloring |
US6126329A (en) * | 1993-06-08 | 2000-10-03 | Rational Software Coporation | Method and apparatus for accurate profiling of computer programs |
US6151704A (en) * | 1997-04-01 | 2000-11-21 | Intel Corporation | Method for optimizing a loop in a computer program by speculatively removing loads from within the loop |
US6295640B1 (en) * | 1998-05-08 | 2001-09-25 | Apple Computer, Inc. | Method and apparatus for distinguishing reference values from non-reference values in a runtime environment |
US6408433B1 (en) * | 1999-04-23 | 2002-06-18 | Sun Microsystems, Inc. | Method and apparatus for building calling convention prolog and epilog code using a register allocator |
CA2279222C (en) * | 1999-07-30 | 2002-07-16 | Ibm Canada Limited-Ibm Canada Limitee | Direct call threaded code |
US6675374B2 (en) * | 1999-10-12 | 2004-01-06 | Hewlett-Packard Development Company, L.P. | Insertion of prefetch instructions into computer program code |
US6826681B2 (en) * | 2001-06-18 | 2004-11-30 | Mips Technologies, Inc. | Instruction specified register value saving in allocated caller stack or not yet allocated callee stack |
US7036118B1 (en) * | 2001-12-20 | 2006-04-25 | Mindspeed Technologies, Inc. | System for executing computer programs on a limited-memory computing machine |
JP3871312B2 (ja) * | 2002-02-27 | 2007-01-24 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラム変換方法、これを用いたデータ処理装置及びプログラム |
JP3956112B2 (ja) * | 2002-06-12 | 2007-08-08 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 |
JP3840149B2 (ja) * | 2002-06-28 | 2006-11-01 | 株式会社東芝 | コンパイラ、演算処理システム及び演算処理方法 |
JP3902147B2 (ja) * | 2003-03-04 | 2007-04-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ装置、コンパイル方法、コンパイラプログラム、及び記録媒体 |
US7207032B1 (en) * | 2003-03-28 | 2007-04-17 | Applied Micro Circuits Corporation | Expanding a software program by insertion of statements |
US7870544B2 (en) * | 2006-04-05 | 2011-01-11 | International Business Machines Corporation | Insuring maximum code motion of accesses to DMA buffers |
-
2010
- 2010-01-06 JP JP2010001424A patent/JP2011141676A/ja active Pending
- 2010-03-03 US US12/716,649 patent/US20110167415A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20110167415A1 (en) | 2011-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Lhoták et al. | Points-to analysis with efficient strong updates | |
CN102222023B (zh) | 异步工作流 | |
Tratt | Dynamically typed languages | |
Tanter et al. | A versatile kernel for multi-language AOP | |
JP5934094B2 (ja) | データ並列スレッドを有する処理論理の複数のプロセッサにわたるマッピング | |
US8893080B2 (en) | Parallelization of dataflow actors with local state | |
US8516452B2 (en) | Feedback-directed call graph expansion | |
US20090222827A1 (en) | Continuation based declarative definition and composition | |
US20150113512A1 (en) | Speculative object representation | |
US7877738B2 (en) | Speculative compilation | |
US20090328016A1 (en) | Generalized expression trees | |
JP2011065220A (ja) | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム | |
JP2011141676A (ja) | 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト | |
Prokopec et al. | Theory and practice of coroutines with snapshots | |
Muller et al. | Competitive parallelism: Getting your priorities right | |
US10496433B2 (en) | Modification of context saving functions | |
JP2005182562A (ja) | コンパイル方法および装置、ならびにコンパイラ | |
Hu et al. | A static timing analysis environment using Java architecture for safety critical real-time systems | |
US11435989B2 (en) | Thread-local return structure for asynchronous state machine | |
US11429358B2 (en) | Representing asynchronous state machine in intermediate code | |
Mogensen | RSSA: a reversible SSA form | |
Apinis et al. | Enhancing top-down solving with widening and narrowing | |
JP5399601B2 (ja) | 実装コード開発システム、及び実装コード開発プログラム | |
Brorsson et al. | REALTIMETALK AN OBJECT-ORIENTED LANGAUGE FOR HARD REAL-TIME SYSTEMS | |
Palanque et al. | Interactive cooperative objects: an object-oriented formalism based on petri nets for user interface design |