JP2006139413A - プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置 - Google Patents

プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置 Download PDF

Info

Publication number
JP2006139413A
JP2006139413A JP2004326878A JP2004326878A JP2006139413A JP 2006139413 A JP2006139413 A JP 2006139413A JP 2004326878 A JP2004326878 A JP 2004326878A JP 2004326878 A JP2004326878 A JP 2004326878A JP 2006139413 A JP2006139413 A JP 2006139413A
Authority
JP
Japan
Prior art keywords
routine
program code
procedure
copy
calling
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.)
Withdrawn
Application number
JP2004326878A
Other languages
English (en)
Inventor
志泰 ▲高▼畠
Yukiyasu Takahata
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2004326878A priority Critical patent/JP2006139413A/ja
Priority to US11/268,567 priority patent/US20060107258A1/en
Publication of JP2006139413A publication Critical patent/JP2006139413A/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】プログラムコードの一部分において手続きにまたがる最適化を行なうことを可能とする。
【解決手段】複数のルーチンを含んで構成されるプログラムコードを記憶する情報処理装置に、前記プログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成する手順と、前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える手順と、前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える手順と、を実行させるためのプログラムに関する。
【選択図】 図3

Description

本発明は、プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置に関する。
コンピュータに情報処理を実行させるためには、コンピュータに実行させる命令語の集合であるプログラムコードを作成しなければならない。このプログラムコードは、通常C言語やFORTRAN等のいわゆる高級言語を用いてソースコードとして作成される。そしてその後ソースコードは、コンパイラによりコンピュータが実行可能なオブジェクトコードに変換される。またさらに、コンパイラによって生成される複数のオブジェクトコードをリンカにより一つにまとめて、コンピュータによる実行が可能なプログラムコードに変換される場合もある。この場合、リンカにより生成されるコンピュータ実行可能なプログラムコードを、コンパイラにより生成されるオブジェクトコードと区別して実行コードと呼ぶ場合もある。
またコンパイラやリンカによりプログラムコードの変換が行われる際に、いわゆる最適化と呼ばれる処理が行われる場合がある。最適化とは、プログラムコードにより実現される情報処理がより合理的にコンピュータに実行されるようにプログラムコードを書き換えることをいう。例えば、CPU(Central Processing Unit)からメインメモリへのデータの読み書きの頻度を減らすために、CPUにメインメモリへのデータの読み書きを行わせるロード命令やストア命令を減らすようにプログラムコードを書き変えたり、CPUにより分岐命令が実行される頻度を減らすために、ループ処理部分を展開するループアンローリングを行ったりする。プログラムコードを最適化することにより、情報処理をより短時間に実行することが可能となったり、情報処理を実行するために必要なメモリの使用量を減らすことができたりする。
さらに、プログラムコードが複数のルーチン(例えば手続きや関数)を含んで構成されている場合には、最適化は各ルーチンの内部においてそれぞれ行われるのみならず、他のルーチンとの関連においても行われる場合がある(例えば非特許文献1、及び非特許文献2参照)。
例えば非特許文献1には、複数のルーチンにまたがる最適化(以降、手続き間最適化とも記す)を静的に行なう場合に、プログラムコード全体を構成する手続き(または関数)全てに対して手続き間最適化を適用する技術が開示されている(以降、手続きや関数等のルーチンを手続きとも記す)。
また非特許文献2には、JAVA(登録商標)で記述されたプログラムコードを動的にコンパイルするJITコンパイラにおいて、実行時に手続きの呼び出し関係を解析し手続き間最適化を行ない、その呼び出し関係が続く間は同じ実行コード実行するが、呼び出し関係が変わる時に再コンパイルを行ない、手続き間最適化を再び行なう技術が開示されている。
Mary W. Hall, Brian R. Murphy, Saman P. Amarasinghe, Shih-Wei Liao, Monica S. Lam, "Interprocedural Analysis for Parallelizaion", Proceedings of the 8th Internatioanl Workshop on Languages and Compilers for Parallel Computing(LCPC95), 1995. Vugranam C. Sreedhar, Michael Burke, Jong-Deok Choi, " A framework for interprocedural optimization in the presence of dynamic class loading", Conference on Programming Language Design and Implementation, pp.196-207, 2000.
従来の手続き間最適化はプログラムコード全体に対して行なわれるため、プログラムコードが大規模な場合、コンパイルに長時間を要し、またコンパイルに必要なメモリ量も膨大になる。
ところが、プログラムコードの一部分(以降、部分プログラムコードと呼ぶ)のみに対して手続き間最適化を行おうとしても、手続き間最適化を行おうとする部分プログラムコードに含まれる手続きが、手続き間最適化を行わない部分プログラムコードに含まれる手続きから呼び出される場合には、部分プログラムコードに対する手続き間最適化を行うことはできない。手続き間最適化を行うことによって、部分プログラムコードは書きかえられてしまうからである。
また、部分プログラムコードだけで手続き間最適化を行なおうとすると、手続きの呼び出し関係が不正確になり、ある手続きは、その手続きがどの手続きから呼び出されるかが不明確になってしまう。すなわち、呼び出し元の手続きの情報が不正確になる。この場合、手続き間最適化が適用できなくなる。
本発明は上記課題を鑑みてなされたものであり、部分プログラムコードに対する手続き間最適化を可能とするプログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置を提供することを主たる目的とする。
上記課題を解決するために、本発明は、複数のルーチンを含んで構成されるプログラムコードを記憶する情報処理装置に、前記プログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成する手順と、前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える手順と、前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える手順と、を実行させるためのプログラムに関する。
その他、本願が開示する課題、及びその解決方法は、発明を実施するための最良の形態の欄、及び図面により明らかにされる。
部分プログラムコードに対する手続き間最適化が可能になり、プログラムコード全体に対して手続き間最適化を行なう場合と比べて、コンパイル時間や使用メモリ量を減らすことができる。
===情報処理装置の構成===
本実施の形態に係る情報処理装置200を図1に示す。情報処理装置200は、CPU210、主記憶装置220、ポート230、記録媒体読取装置240、入力装置250、出力装置260、外部記憶装置280を備えて構成される。
CPU210は情報処理装置200の全体の制御を司るもので、外部記憶装置280に記憶される本実施の形態に係る各種の動作を行うためのコードから構成されるコード変換プログラム800をオペレーティングシステム810による制御の下で実行することにより、本実施の形態に係る情報処理装置200としての各種機能を実現する。例えばCPU210によりコード変換プログラム820やオペレーティングシステム810が実行され、主記憶装置220やポート230、記録媒体読取装置240、入力装置250、出力装置260、外部記憶装置280等のハードウェア機器と協働することにより、プログラムコード記憶部や複製ルーチン生成部、呼び出し命令変更部、最適化実行部が実現される。
主記憶装置220は例えば半導体記憶装置により構成することができる。主記憶装置220は、CPU210によりワークエリアとして用いられる他、コールグラフ700、中間語710、手続間解析情報720、呼出し手続きリスト730を記憶する。これらの詳細については後述する。
記録媒体読取装置240は、記録媒体270に記録されているプログラムやデータを読み取るための装置である。読み取られたプログラムやデータは主記憶装置220や外部記憶装置280に格納される。従って、例えば記録媒体240に記録されたコード変換プログラム800を上記記録媒体240から読み取って、主記憶装置220や外部記憶装置280に記憶するようにすることができる。
記録媒体240としてはフレキシブルディスクや磁気テープ、コンパクトディスク等を用いることができる。記録媒体読取装置240は情報処理装置200に内蔵されている形態とすることもできるし、外付されている形態とすることもできる。
外部記憶装置280は、例えばハードディスク装置や半導体記憶装置等とすることができる。外部記憶装置280には、コード変換プログラム800、オペレーティングシステム810、ソースコード900、オブジェクトコード910、実行コード920、ヘッダファイル930、オブジェクトコードライブラリ940が記憶される。
入力装置250は情報処理装置200へのデータ入力等のために用いられる装置でありユーザインタフェースとして機能する。入力装置250としては例えばキーボードやマウス等を用いることができる。
出力装置260は情報を外部に出力するための装置でありユーザインタフェースとして機能する。出力装置260としては例えばディスプレイやプリンタ等を用いることができる。
ポート230は通信を行うための装置である。例えばネットワークを介して他の情報処理装置と通信を行うことができる。そしてこの場合例えば、コード変換プログラム800を、ポート230を通じて他の情報処理装置からネットワークを介して受信して、主記憶装置220や外部記憶装置280に記憶するようにすることもできる。
ソースコード900は、C言語やFORTRAN等の高級言語で記述されたプログラムコードである。オブジェクトコード910は、コード変換プログラム800によりソースコード900から生成される、情報処理装置200が実行可能なプログラムコードである。この場合コード変換プログラム800はコンパイラとして機能する。実行コード920は、複数のオブジェクトコード910からコード変換プログラム800により生成される、情報処理装置200が実行可能なプログラムコードである。この場合コード変換プログラム800はリンカとして機能する。
オブジェクトコードライブラリ940は、いくつかの手続きを集合させ、オブジェクトコード910として構成したものである。オブジェクトコードライブラリ940に含まれる手続きを使用する他のオブジェクトコード910とオブジェクトコードライブラリ940とをリンクさせて実行コード920を生成するようにすることにより、オブジェクトコードライブラリ940に含まれる手続きの作成の手間を省くことが出来るので、プログラムコードの開発効率を向上させることができる。
ヘッダファイル930は、オブジェクトコードライブラリ940に含まれる手続きのうち、他のオブジェクトコード910から呼び出される手続きを示す情報を記載したプログラムコードである。
図2にコンパイル及びリンクの手順を示す。まずコンパイラ801(つまりコード変換プログラム800)にソースコード900が入力されるとオブジェクトコード910が生成される。そしてリンカ802(つまりコード変換プログラム800)にオブジェクトコード910が入力されると実行コード920が生成される。
オブジェクトコード910には、中間コードなどの各種手続き間最適化用の情報が含まれている。また、そのためにコンパイラ801は手続き間最適化用の情報を含んだオブジェクトコード910を生成する。コンパイラ801は、複数のソースコード900を入力とすることができるが、makeコマンドなどのツールを利用する場合は、1つのソースコード900を入力し、1つのオブジェクトコード910を生成する。
リンカ802は、プログラムコードを構成する全てのオブジェクトコード910を入力とするため、リンカ802では、プログラムコードを構成する全ての手続きがそろう。従来の手続き間最適化は、このリンカ802で実施されている。本実施の形態では、部分的に手続き間最適化を行なうことができるので、コンパイラ801、または、リンカ802のいずれにおいても手続き間最適化を実施することができる。
===コンパイラ、リンカの構成===
まず、手続き間最適化を行なうコンパイラ801の構成図を図3に示す。
図3に示すように、手続き間最適化を行なうコンパイラ801は、入力されたソースコード900に基づいてオブジェクトコード910を生成する。オブジェクトコード910を生成する際には、適宜、中間語710やコールグラフ700、手続き間解析情報720を主記憶装置220に出力し、またそれらを利用しながら処理を進めてゆく。
コンパイラ801は、中間語生成部、コールグラフ作成部、手続き間最適化用コールグラフ処理部、手続き内解析部、手続き内解析情報の手続き間伝播部、手続き間最適化部、手続き内最適化部を備える。
中間語生成部は、ソースコード900を入力とし中間語710を生成する。
コールグラフ作成部は、中間語710を入力とし、手続きの呼び出し関係をコールグラフ700として作成する。コールグラフ700とは、プログラムコードに含まれる各手続きをノードとして各ノード間を有向矢印で結合したものである。矢印は、他の手続きを呼ぶ手続きを示すノードから、その手続きに呼ばれる手続きを示すノードに向かう向きで表される。
手続き間最適化用コールグラフ処理部は、中間語710とコールグラフ700を入力とし、手続きをクローニングし、コールグラフ700を更新する。ここでクローニングとは、手続きの複製を生成することを言う。詳細は後述する。
手続き内解析部は、中間語710を入力とし、手続き内における手続き間最適化に必要な情報を解析し、手続き間解析情報720を出力する。手続き間解析情報720は、手続き間最適化に必要な情報が記憶されたテーブルである。例えば手続き内解析部においては、他の手続きを呼び出す場合の実引数の値が手続き間解析情報720に出力される。
手続き内解析情報の手続き間伝播部は、コールグラフ700と手続き間解析情報720を入力とし、コールグラフ700のエッジをたどりながら手続き間解析情報720を更新していく。例えば、手続きを呼び出す時の実引数の値を呼び出される手続の仮引数の値として手続き間解析情報720に記憶してゆく。
手続き間最適化部は、手続き間解析情報720とコールグラフ700を入力とし、手続き間最適化を行ない、中間語710を更新する。つまり、クローニングにより生成された各手続きの複製に含まれる各命令語を、各複製を呼び出す手続き又はその複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える。
手続き内最適化部は、手続き間で最適化された中間語710を入力とし、手続き内の解析を行ない、手続き内の最適化を実施し、中間語710を更新する。そしてオブジェクトコード910を出力する。
ここで、中間語生成部、コールグラフ作成部、手続き内解析部、手続き内情報の手続き間伝播部、手続き間最適化部、手続き内最適化部は、従来の手続き間最適化コンパイラと同様である。本実施の形態においては、手続き間最適化用コールグラフ処理部により、部分プログラムコードに対しても手続き間解析が行なえるように処理を行なう。
なお、手続き間最適化を行わずにソースコード900をコンパイルすることも可能である。その場合は、中間語生成部の処理を行った後、手続き内最適化部による処理を行って、オブジェクトコード910を生成する。手続き間最適化を行うか行わないかの指定は、例えば情報処理装置200のオペレータが入力装置250からコンパイル実行コマンドを入力する際に行うことができる。
ここで、手続き間最適化を実施する場合の例を、図4乃至図7を参照しながら説明する。手続き間最適化として手続き間定数伝播の例を示す。
まず図4(a)において、ソースコード900では、手続きSUB0は3行目で手続きSUB1を呼び出している。このとき、実引数に5が使われている。呼び出し先の手続きSUB1では、5行目で仮引数としてIが使われている。このソースコード900に手続き間定数伝播を適用すると、図4(b)の6行目のように、SUB1において、Iの値を5に変換することができる。そして、SUB1に手続き内の最適化を適用することにより、図4(b)の6行目のIF文の条件式“5<20”が常に真になるので、このIF文を削除することができる。そして図4(c)のようにソースコード900を最適化することができる。この場合のコールグラフ700を図5に示す。
手続きSUB0とSUB1がソースコード900の全体であれば、上記のような最適化は有効である。ところが、手続きSUB0とSUB1が部分プログラムコードであり、手続き間最適化を適用しない他の部分プログラムコードに手続きSUB2があるとすれば、手続きSUB2が手続きSUB1を呼び出す可能性がある。また、手続きSUB2が手続きSUB1を呼び出すときに、Iの値が5以外である可能性もある。しかし、手続きSUB2は手続き間最適化対象外なので、手続きSUB1を呼び出すか否かは不明である。もし呼び出すと仮定してもIの値は解析できない。このまま、手続きSUB0とSUB1の間で手続き間最適化を適用し、手続きSUB1がI=5で最適化されると、SUB2がI=5以外の値でSUB1を呼び出した場合には、プログラムコード作成者の意に反する動作をする可能性がある。この様子を示すコールグラフ700を図6に示す。
このように、部分プログラムコードに手続き間最適化を行なおうとしても、手続き間最適化対象外の手続きが手続き間最適化対象の手続きを呼び出すか否かが不明なため、手続き間最適化はできない。
そこで本実施の形態においては、図7に示すように手続きのクローニングを行う。プログラムコード全体を構成する手続きはSUB0、SUB1、SUB2の3つであり、このうち部分プログラムコードを構成する手続きSUB0及びSUB1に対して手続き間最適化を適用する場合を示す。本実施の形態では、手続きSUB1に対して手続きのクローニングを行ない、手続きSUB1’を生成する。そして、手続きSUB0は手続きSUB1ではなく手続きSUB1’を呼び出すようにする。このようにすると、手続きSUB1’は手続きSUB2からは呼び出される可能性がなくなる。すなわち、不明な呼び出し元手続きがなくなるので、手続きSUB0と手続きSUB1’の間でI=5の手続き間定数伝播を適用することができるようになる。そして手続きSUB2は、何らの変更なく手続きSUB1を呼び出せば良いのである。
次に手続き間最適化を行なうリンカ802の構成図を図8に示す。
図8に示すように、手続き間最適化を行なうリンカ802は、入力されたオブジェクトコード910に基づいて実行コード920を生成する。実行コード920を生成する際には、適宜、中間語710やコールグラフ700、手続き間解析情報720を主記憶装置220に出力し、またそれらを利用しながら処理を進めてゆく。このことはコンパイラ801の場合と同様である。
リンカ802は、コンパイラ801と同様に、中間語生成部、コールグラフ作成部、手続き間最適化用コールグラフ処理部、手続き内解析部、手続き内解析情報の手続き間伝播部、手続き間最適化部、手続き内最適化部を備える。そしてリンカ802はさらにリンク部を備える。リンク部は、複数のオブジェクトコード910を結合させて一つの実行コード920を生成する処理を行う。
<実施例1>
実施例1では、コンパイラ801、あるいはリンカ802における手続き間最適化方法について述べる。ここではコンパイラ801の場合を例に説明する。
まず図3の手続き間最適化用コールグラフ処理の、実施例1におけるアルゴリズムを図9に示す。
まず、STARTから始まり、S1000においてコールグラフ700に含まれる全ての手続きに対象に、それぞれの手続きに対して、S1010以降の処理を行なうようにする。ここでは、S1010から一連の処理を行なう対象の手続きをfとする。
S1010では、現在処理中の手続きfがMAIN関数か否かを調べる。MAIN関数であれば他の手続きから呼び出されることはないため、クローニングする必要はない。そのため、S1000へ戻り次の手続きに対する処理を行う。一方、MAIN関数でない場合にはクローニングする必要がある可能性が有るためS1020へ進む。ここでMAIN関数とは、プログラムコードを構成する各ルーチンの中で、他のどの関数からも呼び出されることのない関数をいう。MAIN関数はメインルーチンと呼ばれることもある。
S1020では、手続きfに呼び出し元手続きがあるか、つまり、手続きfが他の手続きから呼び出されることがあるか否かを調べる。呼び出し元の有無は、コールグラフ700を調べることでわかる。すなわち、コールグラフ700で手続きfに入力エッジがあれば、手続きfに対して呼び出し元が存在する。呼び出し元があればS1030へ進み、なければS1000へ戻る。
S1030では、手続きfに対してクローニングを行ない、新しく手続きf’を生成する。そして、手続きfの呼び出し元の手続きは、手続きf’を呼び出すように変更する。これは、手続きfの呼び出し元の手続きに含まれる、手続きfを呼び出す命令語を、手続きf'を呼び出す命令語に書き変えることにより行うことができる。そして、S1000へ戻る。S1000で処理する手続きがなくなった場合は、ENDへ進む。
図10はプログラムコードの例であり、プログラムコード全体は、手続きA,B,C,D,Xからなる。そして、手続きA,B,C,Dを含む部分プログラムコードへ手続き間最適化を適用し、手続きXを含む部分プログラムコードへは手続き間最適化を適用しない場合を示す。手続き間最適化対象となる手続きA,B,C,Dは、図11に示すようなコールグラフ700になる。また手続きXは、手続き間最適化対象外なので、コールグラフ700には含まれない。
図10に示したプログラムコードに対して図9に示したアルゴリズムを適用した場合について具体的に説明する。
まず、図9のS1000で手続きAを処理の対象とすると、S1010で手続きAはMAIN関数でないのでS1020へ進み、S1020では呼び出し元手続きがないのでS1000へ戻り、手続きAについては、なにもしないで終了する。
次に、手続きBがS1000で処理の対象となり、S1010で手続きBはMAIN関数でないのでS1020へ進み、S1020では呼び出し元手続きに手続きAがあるのでS1030へ進む。S1030では手続きBに対してクローニングを適用し、新たに手続きB’を生成する。そして、手続きAは手続きB’を呼び出すように変更する。
手続きC、Dに対しても、手続きBと同様に処理され(S1000〜S1030)、それぞれ手続きC’、D’が生成される。
この結果、コールグラフ700は図12に示すように変更される。手続きB’,C’,D’はクローニングにより生成された手続きである。手続きB,C,Dは、手続きXから呼び出されるか否かが不明であるため、呼び出し元との手続き間最適化は行なえない。しかし、手続きB’,C’,D’は、呼び出し元に不明なものはないので、手続き間最適化が行なえる。具体的には、手続きAとB’、AとC’、B’とD’、C’とD’、BとD’,CとD’の間でそれぞれ手続き間最適化を行なうことができるようになる。
<実施例2>
次に実施例2について説明する。実施例2においては、手続き間最適化対象のプログラムコード(第1のプログラムコード)に含まれる、他の手続きから呼び出される各手続きのうち、手続き間最適化対象外のプログラムコード(第2のプログラムコード)に含まれる手続きからも呼び出される手続きに対して、クローニングを行う。
図13にリンク時における部分的なプログラムコードの手続き間最適化方法の実施例を示す。図8に示したリンカ802を図13に示すように拡張し手続き間最適化を行なう。
リンカ802には、手続き間最適化を適用するオブジェクトコード910と、手続き間最適化を適用しないオブジェクトコード910とが入力される。各オブジェクトコード910の区別は、オブジェクトコード910内の手続き間最適化用情報の有無で判別する。
リンカ802は、手続き間最適化を適用しないオブジェクトコード910に対して、そのオブジェクトコード910内に参照(手続きの呼出し命令)はあるが定義のない手続きを調べ、その手続き名を呼び出し手続きリスト730へ出力する。つまり、そのプログラムコード910を構成する各手続きに含まれる各命令語のうち、そのプログラムコード910を構成しない手続きを呼び出す命令語にそれぞれ含まれる、そのプログラムコード910を構成しない手続きを示す情報(例えば手続き名)を、手続きリスト730へ出力する。この処理は、呼び出し手続き名の出力処理部により行われる。
そして手続き間最適化用コールグラフ処理部は、手続き間最適化を適用するオブジェクトコード910に含まれる各手続きのうち、手続き呼び出しリスト730に記載された情報により示される各手続きをクローニングする。
以下に、図13に示したリンカ802を用いて、図10に示したプログラムコードに対して手続き間最適化を行った場合について説明する。ここでは、図10のプログラムコードで手続きXが手続きCを呼び出すと仮定する。その場合のプログラムコードを図15に示す。
呼び出し手続き名の出力処理部では、手続き間最適化を適用しないオブジェクトコード910に対して、例えばUNIX(登録商標)のnmコマンド等を用いて未定義の手続きを検出することができる。そしてこの手続き名を、呼び出し手続きリスト730に出力する。図10のプログラムコードでは、オブジェクトコード910中の手続きXからCを呼び出しているため、手続きCの参照が存在するが、手続きCの定義は存在しないので、未定義の手続きCが検出され、呼び出し手続きリスト730へ手続き名“C”が出力される。
手続き間最適化用コールグラフ処理部は、コールグラフ700の情報と、呼び出し手続きリスト730の情報を利用して、手続きのクローニングを行う。
そして最後にオブジェクトコード910をリンクでリンクし、実行コード920を出力する。
図14にリンク時における部分的な手続き間最適化方法のアルゴリズムを示す。
S2000では、コールグラフ700に含まれる全ての手続きを対象に、それぞれの手続きに対してS2010からの処理を行なうようにする。S2010からの一連の処理を行なうときの手続きをfとする。
S2010では、処理中の手続きfがMAIN関数か否かを調べ、MAIN関数ならS2000へ戻る。MAIN関数でなければS2020へ進む。
S2020では、手続きfが手続き間最適化対象プログラムコード内に呼び出し元手続きがあるかを調べ、なければS2000へ戻る。あればS2030へ進む。
S2030では、図13で調べた呼び出し手続きリスト730があるか否かを調べ、あればS2050へ進み、なければS2040へ進む。
S2050では、呼出し手続きリスト730内に手続きfの手続き名があるか否かを調べ、あれば、S2040へ進み、なければS2000へ戻る。
S2040では、手続きfに対してクローニングを行ない、新しく手続きf’を生成する。そして、手続きfの呼び出し元の手続きは、手続きf’を呼び出すように変更する。これは、手続きfの呼び出し元の手続きに含まれる、手続きfを呼び出す命令語を、手続きf'を呼び出す命令語に書き変えることにより行うことができる。そして、S2000へ戻る。S2000で処理する手続きがなくなった場合は、ENDへ進む。
なおS2030において、呼び出し手続きリスト730がない場合にS2040に進むのは、呼出し手続きリスト730がなければ、手続き間最適化対象外のプログラムコードからその手続きが呼び出されるか否かの判別が出来ないからである。このためS2040に進んで、その手続きのクローニングを行うようにしている。
以下に図10、図15のプログラムへ図14のアルゴリズムを適用した場合を示す。
まず、図14のS2000で手続きAを処理の対象とすると、S2010で手続きAはMAIN関数でないのでS2020へ進み、S2020では呼び出し元手続きがないのでS2000へ戻り、手続きAについては、なにもしないで終了する。
手続きBは、S2010ではMAIN関数でなく、S2020では呼び出し元手続きとして手続きAがあり、S2030では呼び出し元手続きリスト730があるので、S2050へ進む。S2050では呼び出し手続きリスト730に手続きBは無いのでS2000へ戻る。
手続きCに対しては、S2010でMAIN関数でなく、S2020では呼び出し元手続きとして手続きAがあり、S2030では呼び出し手続きリスト730があるので、S2050へ進む。S2050では呼び出し手続きリスト730に手続き名“C”があるので、S2040へ進み、クローニングの処理を行なう。
手続きDに関しては、S2010ではMAIN関数でなく、S2020では呼び出し元手続きとして手続きB及びCがあり、S2030では呼び出し元手続きリスト730があるので、S2050へ進む。S2050では呼び出し手続きリスト730に手続きDは無いのでS2000へ戻る。
この結果、コールグラフ700は図16のようになる。手続きB,Dには手続き間最適化対象外からの呼び出しがないので、不明な呼び出し元がなく、そのため手続きのクローニングが適用されない。手続きCには手続き間最適化対象外からの呼び出しがあるのでクローニングが適用されている。このように呼び出し元を調べることにより、実施例1の場合と比べて、手続きB,Dのクローニングがなくなり、無駄なクローニングを行なわないようにすることができる。
<実施例3>
次に、コンパイル実行時あるいはリンク実行時にオペレータにより入力されるオプションを用いて、部分プログラムコードに対して手続き間最適化を行なう場合について説明する。
図17には、手続き間最適化対象外からの呼び出しがあるというオプション(プログラムコードを構成する各手続きのうち、複製を生成する手続きを指定する情報)、および、手続き間最適化対象外からの呼び出しがないというオプション(プログラムコードを構成する各手続きのうち、複製を生成しない手続きを指定する情報)の具体例をそれぞれ示す。
図17に示す、手続き間最適化対象外からの呼び出しがあるというオプションは、手続き間最適化対象外からの呼び出しがある手続きとしてCを指定するものである。図17に示す、手続き間最適化対象外からの呼び出しがないというオプション。手続き間最適化対象外からの呼び出しがない手続きとしてB,Dを指定するものである。
図18にこれらのオプションを用いて部分プログラムコードに対する手続き間最適化を行なう場合のアルゴリズムを示す。
S3000では、コールグラフ700に含まれる全ての手続きを対象に、それぞれの手続きに対してS3010からの処理を行なうようにする。S3010からの一連の処理を行なうときの手続きをfとする。
S3010では、処理中の手続きfがMAIN関数か否かを調べ、MAIN関数ならS3000へ戻る。MAIN関数でなければS3020へ進む。
S3020では、手続き間最適化対象プログラムコードに含まれる手続きの中で、手続きfを呼び出している呼び出し元関数があるかを調べ、なければS3000へ戻る。あればS3030へ進む。
S3030では、手続き間最適化対象外からの呼び出しなしオプションがあるか否かを調べ、あればS3060へ進み、なければS3040へ進む。
S3060では、手続きfが手続き間最適化対象外からの呼び出しなしオプションの中にあるか否かを調べ、あればS3000へ戻り、なければS3050へ進む。
S3040では、手続き間最適化対象外からの呼び出しありオプションがあるか否かを調べ、あればS3070へ進み、なければS3050へ進む。
S3070では、手続きfが手続き間最適化対象外からの呼び出しありオプションの中にあるか否かを調べ、あればS3050へ進み、なければS3000へ戻る。
S3050では、手続きfに対してクローニングを行ない、新しく手続きf’を生成する。そして、手続きfの呼び出し元の手続きは、手続きf’を呼び出すように変更する。これは、手続きfの呼び出し元の手続きに含まれる、手続きfを呼び出す命令語を、手続きf'を呼び出す命令語に書き変えることにより行うことができる。そして、S3000へ戻る。S3000で処理する手続きがなくなった場合は、ENDへ進む。
なおS3030及びS3040において、いずれも”NO”の場合、すなわちオプションの入力がない場合にS3050に進むのは、オプションの入力がなければ、手続き間最適化対象外のプログラムコードからその手続きが呼び出されるか否かの判別が出来ないからである。このためS3050に進んで、その手続きのクローニングを行うようにしている。
以下に図10、図15のプログラムに対して図17のコンパイルオプションの「-called_by_noipo:C」(手続き間最適化対象外からの呼び出しありオプション)を指定し、図18のアルゴリズムを適用した場合について説明する。
まず、図18のS3000で手続きAを処理の対象とすると、S3010で手続きAはMAIN関数でないのでS3020へ進み、S3020では呼び出し元手続きがないのでS3000へ戻り、手続きAについては、なにもしないで終了する。
手続きBは、S3010ではMAIN関数でなく、S3020では呼び出し元手続きとして手続きAがあり、S3030では手続き間最適化対象外からの手続きなしオプションはないのでS3040へ進む。S3040では、手続き間最適化対象外からの呼び出しありオプションがあるのでS3070へ進む。S3070では、手続き間最適化対象外からの呼び出しありオプションに手続きBがないのでS3000へ戻る。
手続きCは、S3010ではMAIN関数でなく、S3020では呼び出し元手続きとして手続きAがあり、S3030では手続き間最適化対象外からの手続きなしオプションはないのでS3040へ進む。S3040では、手続き間最適化対象外からの呼び出しありオプションがあるのでS3070へ進む。S3070では、手続き間最適化対象外からの呼び出しありオプションに手続きCが含まれているので、S3050へ進む。S3050では、クローニングなどの処理が行なわれる。
手続きDは、S3010ではMAIN関数でなく、S3020では呼び出し元手続きとして手続きB,Cがあり、S3030では手続き間最適化対象外からの手続きなしオプションはないのでS3040へ進む。S3040では、手続き間最適化対象外からの呼び出しありオプションがあるのでS3070へ進む。S3070では、手続き間最適化対象外からの呼び出しありオプションに手続きDがないのでS3000へ戻る。
この結果、図16のようなコールグラフ700になり、実施例2と同じような手続き間最適化ができる。つまり、手続きB,Dには手続き間最適化対象外からの呼び出しがないので、不明な呼び出し元がなく、そのため手続きのクローニングが適用されない。手続きCには手続き間最適化対象外からの呼び出しがあるのでクローニングが適用されている。このように呼び出し元を調べることにより、実施例1の場合と比べて、手続きB,Dのクローニングがなくなり、無駄なクローニングを行なわないようにすることができる。
<実施例4>
次に、ソースコード900の中にコンパイラ指示文を記述することにより、コンパイル時、又はリンク時に部分プログラムコードに対して手続き間最適化を行なう場合の例を説明する。
ソースコード900中にコンパイラ指示文を記述することにより、手続き間最適化対象外のプログラムコードに含まれる手続きから手続きの呼び出しがなされていることを示す例を図19に示す。図19中の9行目の「!$called_by_noipo」がコンパイラ指示文である。コンパイラ801は、このコンパイラ指示文により、図19の10行目から12行目に定義されている手続きCが、手続き間最適化対象外のプログラムコードに含まれる手続きから呼び出されることを検知することができる。
図20に、コンパイラ指示文を用いた部分プログラムコードに対する手続き間最適化を行なう場合のアルゴリズムを示す。
まずS4000では、コールグラフ700に含まれる全ての手続きを対象に、それぞれの手続きに対してS4010からの処理を行なうようにする。S4010からの一連の処理を行なうときの手続きをfとする。
S4010では、処理中の手続きfがMAIN関数か否かを調べ、MAIN関数ならS4000へ戻る。MAIN関数でなければS4020へ進む。
S4020では、手続き間最適化対象プログラムコードに含まれる手続きのうち、手続きfを呼び出す関数があるかを調べ、なければS4000へ戻る。あればS4030へ進む。
S4030では、手続きfに対して手続き間最適化対象外からの呼び出しのコンパイラ指示文があるかを調べ、コンパイラ指示文があればS4040へ進み、指示文がなければS4000へ戻る。
S4040では、手続きfに対してクローニングを行ない、新しく手続きf’を生成する。そして、手続きfの呼び出し元の手続きは、手続きf’を呼び出すように変更する。これは、手続きfの呼び出し元の手続きに含まれる、手続きfを呼び出す命令語を、手続きf'を呼び出す命令語に書き変えることにより行うことができる。そして、S4000へ戻る。S4000で処理する手続きがなくなった場合は、ENDへ進む。
以下に図19のプログラムコードに対して図20のアルゴリズムを適用した場合の例を示す。
まず、図20のS4000で手続きAを処理の対象とすると、S4010で手続きAはMAIN関数でないのでS4020へ進み、S4020では呼び出し元手続きがないのでS4000へ戻り、手続きAについては、なにもしないで終了する。
手続きBは、S4010ではMAIN関数でなく、S4020では呼び出し元手続きとして手続きAがあり、S4030では、コンパイラ指示文により手続きBに対しては手続き間最適化対象外からの呼び出しがないのでS4000へ戻る。
手続きCは、S4010ではMAIN関数でなく、S4020では呼び出し元手続きとして手続きAがあり、S4030では、コンパイラ指示文により手続きCに対しては手続き間最適化対象外からの呼び出しがあるのでS4040進む。S4040では、クローニングなどの処理が行なわれる。
手続きDは、S4010ではMAIN関数でなく、S4020では呼び出し元手続きとして手続きB,Cがあり、S4030では、コンパイラ指示文により手続きDに対しては手続き間最適化対象外からの呼び出しがないのでS4000へ戻る。
この結果、図16のようなコールグラフ700になり、実施例2と同じような手続き間最適化ができる。つまり、手続きB,Dには手続き間最適化対象外からの呼び出しがないので、不明な呼び出し元がなく、そのため手続きのクローニングが適用されない。手続きCには手続き間最適化対象外からの呼び出しがあるのでクローニングが適用されている。このように呼び出し元を調べることにより、実施例1の場合と比べて、手続きB,Dのクローニングがなくなり、無駄なクローニングを行なわないようにすることができる。
<実施例5>
次に、ライブラリ(オブジェクトコードライブラリ940、第1のプログラムコード)をコンパイルするときの手続き間最適化の適用例を以下に示す。つまりライブラリ940に対して手続き間最適化を適用する場合の例を示す。
図10の手続きA,B,C,Dを含むプログラムコードがライブラリ940を構成するプログラムコード(第1のプログラムコード)であり、手続きXを含むプログラムコードがライブラリ940を使用するプログラムコード(第2のプログラムコード)であると仮定する。そして図10において、手続きXが手続きAとCを呼び出していると仮定する。この様子を図21に示す。
通常、ライブラリ940を使用するときは、そのライブラリ940を使用するプログラムコード内にヘッダファイル930をインクルードする。ヘッダファイル930には、ライブラリ940を構成する各手続きのうち、ライブラリ940を使用するプログラムコードを構成する手続きから呼び出される手続きを示す情報(例えば手続き名)が含まれている。そのため、ライブラリ940を構成するプログラムコードの中に含まれる手続きがヘッダファイル930内に記載されていない場合には、その手続きに対する手続き間解析対象外からの呼び出しはないものとして処理することができる。またライブラリ940を構成するプログラムコードの中に含まれる手続きがヘッダファイル930内に記載されている場合には、その手続きに対する手続き間解析対象外からの呼び出しがあるものとして処理することができる。
ここでは、図21に示すように、手続きAとCがヘッダファイルで宣言されていると仮定する。
図22にライブラリ940に対して手続き間最適化を適用する場合のアルゴリズムを示す。
S5000では、コールグラフ700に含まれる全ての手続きを対象に、それぞれの手続きに対してS5010からの処理を行なうようにする。S5010からの一連の処理を行なうときの手続きをfとする。
S5010では、処理中の手続きfがMAIN関数か否かを調べ、MAIN関数ならS5000へ戻る。MAIN関数でなければS5020へ進む。
S5020では、手続き間最適化対象プログラムコードに含まれる手続きのうち、手続きfを呼び出す関数があるかを調べ、なければS5000へ戻る。あればS5030へ進む。
S5030では、ヘッダファイル930があるか否かを調べ、ヘッダファイル930があればS5050へ進み、ヘッダファイル930がなければS5040へ進む。
S5050では、手続きfがヘッダファイル930内で宣言されているか否かを調べ、宣言されていればS5040へ進み、宣言されていなければS5000へ戻る。
S5040では、手続きfに対してクローニングを行ない、新しく手続きf’を生成する。そして、手続きfの呼び出し元の手続きは、手続きf’を呼び出すように変更する。これは、手続きfの呼び出し元の手続きに含まれる、手続きfを呼び出す命令語を、手続きf'を呼び出す命令語に書き変えることにより行うことができる。そして、S5000へ戻る。S5000で処理する手続きがなくなった場合は、ENDへ進む。
なおS5030において、ヘッダファイル930がない場合にS5040に進むのは、ヘッダファイル930がなければ、手続き間最適化対象外のプログラムコードからその手続きが呼び出されるか否かの判別が出来ないからである。このためS5040に進んで、その手続きのクローニングを行うようにしている。
図22のアルゴリズムの適用例を以下に示す。
まず、図22のS5000で手続きAを処理の対象とすると、S5010で手続きAはMAIN関数でないのでS5020へ進み、S5020では呼び出し元手続きがないのでS5000へ戻り、手続きAについては、なにもしないで終了する。
手続きBは、S5010でMAIN関数でないのでS5020へ進み、S5020では呼び出し元手続きとして手続きAがあるのでS5030へ進み、S5030ではヘッダファイル930があるので、S5050へ進む。S5050ではヘッダファイル930に手続きBの宣言がないのでS5000へ戻る。
手続きCは、S5010でMAIN関数でないのでS5020へ進み、S5020では呼び出し元手続きとして手続きAがあるのでS5030へ進み、S5030ではヘッダファイル930があるので、S5050へ進む。S5050ではヘッダファイル930に手続きCの宣言があるのでS5040へ進む。S5040では、クローニングの処理などを行なう。
手続きDは、S5010でMAIN関数でないのでS5020へ進み、S5020では呼び出し元手続きとして手続きB,CがあるのでS5030へ進み、S5030ではヘッダファイル930があるので、S5050へ進む。S5050ではヘッダファイル930に手続きDの宣言がないのでS5000へ戻る。
この結果、図23のようなコールグラフ700になり、実施例2と同様な手続き間最適化ができる。つまり、手続きB,Dには手続き間最適化対象外からの呼び出しがないので、不明な呼び出し元がなく、そのため手続きのクローニングが適用されない。手続きCには手続き間最適化対象外からの呼び出しがあるのでクローニングが適用されている。このように呼び出し元を調べることにより、実施例1の場合と比べて、手続きB,Dのクローニングがなくなり、無駄なクローニングを行なわないようにすることが可能となる。
以上本実施の形態について説明したが、本実施の形態によれば、部分的なプログラムコードに対して手続き間最適化を行なうことができるようになる。これにより、コンパイルを行なう計算機の資源が少ない場合でも手続き間最適化が行なえるようになる。
また、ライブラリのプログラムコードのみに対して手続き間最適化が行なえるようになる。これにより、ライブラリを使うプログラムコードには変更を加えずに、プログラムコードの最適化をおこなうことができるようになる。さらに、オブジェクトコードのみが提供され、ソースコードが提供されない場合においては、そのオブジェクトコードを使用しても、他のソースコード内にある手続き間だけで手続き間最適化が行なえるようになる。
また実施例2乃至実施例5において説明したように、最適化を行なう手続きに対して呼び出し元の手続きの有無を指定したり、調べたりすることにより、不要な手続きの複製を行わないようにすることも可能になる。
例えば実施例2で説明したように、リンク時に手続き間最適化を行なう場合で、手続き間最適化を適用するオブジェクトコードと手続き間最適化を適用しないオブジェクトコードが混在するときは、手続き間最適化を適用しないオブジェクトコード内にある手続きの参照情報を調べることにより、不明な呼び出し関係の有無を調べる。すなわち、手続き間最適化非適用のオブジェクトコードの中から、手続き間最適化適用オブジェクトコードの中の手続きへの参照の有無を調べることで、不明な呼び出し関係の有無を調べる。これにより、上記のクローニングを適用する手続きの数を減らすことができる。
また実施例3や実施例4で説明したように、ソースプログラムコード中のコンパイラ指示文やコンパイルオプションにより不明な呼び出し関係がない手続きを指定することにより、上記のクローニングを適用する手続きの数を減らすようにすることもできる。
また実施例5で説明したように、ライブラリに対して手続き間最適化を行なう場合は、ライブラリのヘッダファイルにある手続きの宣言を調べることにより、ライブラリを使用するプログラムコードからの呼び出しの有無を調べて、不明な呼び出し関係の有無を調べる。このようにしても上記のクローニングを適用する手続きの数を減らすことができる。
以上発明を実施するための最良の形態について説明したが、上記実施の形態は本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明はその趣旨を逸脱することなく変更、改良され得ると共に、本発明にはその等価物も含まれる。
本実施の形態に係る情報処理装置の構成を示すブロック図である。 本実施の形態に係るコンパイラとリンカを示す図である。 本実施の形態に係るコンパイラを示す図である。 本実施の形態に係るプログラムコードの手続き間最適化を示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るリンカを示す図である。 本実施の形態に係る手続き間最適化の処理の流れを示すフローチャートである。 本実施の形態に係るプログラムコードを示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るリンカを示す図である。 本実施の形態に係る手続き間最適化の処理の流れを示すフローチャートである。 本実施の形態に係るオブジェクトコードを示す図である。 本実施の形態に係るコールグラフを示す図である。 本実施の形態に係るコンパイラオプションを示す図である。 本実施の形態に係る手続き間最適化の処理の流れを示すフローチャートである。 本実施の形態に係るプログラムコードを示す図である。 本実施の形態に係る手続き間最適化の処理の流れを示すフローチャートである。 本実施の形態に係るプログラムコードを示す図である。 本実施の形態に係る手続き間最適化の処理の流れを示すフローチャートである。 本実施の形態に係るコールグラフを示す図である。
符号の説明
200 情報処理装置
700 コールグラフ
800 コード変換プログラム
801 コンパイラ
802 リンカ
810 オペレーティングシステム
900 ソースコード
910 オブジェクトコード
920 実行コード
930 ヘッダファイル
940 オブジェクトコードライブラリ

Claims (10)

  1. 複数のルーチンを含んで構成されるプログラムコードを記憶する情報処理装置に、
    前記プログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成する手順と、
    前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える手順と、
    前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える手順と、
    を実行させるためのプログラム。
  2. 前記情報処理装置に、前記プログラムコードを構成する各ルーチンのうち、複製を生成するルーチンを指定する情報の入力をユーザインタフェースから受ける手順と、を実行させ、
    前記複製を生成する手順においては、前記情報により指定される各ルーチンについて、それぞれの複製を生成し、
    前記他のルーチンの複製を呼び出す命令語に書き換える手順においては、前記他のルーチンの複製が生成されている場合には、前記他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える
    ことを特徴とする請求項1に記載のプログラム。
  3. 前記情報処理装置に、前記プログラムコードを構成する各ルーチンのうち、複製を生成しないルーチンを指定する情報の入力をユーザインタフェースから受ける手順と、を実行させ、
    前記複製を生成する手順においては、前記プログラムコードを構成する各ルーチンのうち、前記情報により指定されるルーチン以外の各ルーチンについて、それぞれの複製を生成し、
    前記他のルーチンの複製を呼び出す命令語に書き換える手順においては、前記他のルーチンの複製が生成されている場合には、前記他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える
    ことを特徴とする請求項1に記載のプログラム。
  4. 前記プログラムコードには、複製を生成するルーチンを指定する情報が含まれ、
    前記複製を生成する手順においては、前記情報により指定される各ルーチンについて、それぞれの複製を生成し、
    前記他のルーチンの複製を呼び出す命令語に書き換える手順においては、前記他のルーチンの複製が生成されている場合には、前記他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える
    ことを特徴とする請求項1に記載のプログラム。
  5. 複数のルーチンを含んで構成される第1のプログラムコード及び第2のプログラムコードを記憶する情報処理装置に、
    前記第2のプログラムコードを構成する各ルーチンに含まれる各命令語のうち、前記第2のプログラムコードを構成しないルーチンを呼び出す命令語にそれぞれ含まれる、前記第2のプログラムコードを構成しない前記ルーチンを示す情報を記憶する手順と、
    前記第1のプログラムコードを構成する各ルーチンのうち、前記情報により示される各ルーチンについて、それぞれの複製を生成する手順と、
    前記第1のプログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語のうち、前記他のルーチンの複製が生成されている場合には、前記他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える手順と、
    前記第1のプログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える手順と、
    を実行させるためのプログラム。
  6. 複数のルーチンを含んで構成される第1のプログラムコード及び第2のプログラムコードと、前記第1のプログラムコードを構成する各ルーチンのうち、前記第2のプログラムコードを構成するルーチンから呼び出されるルーチンを示す情報を含んで構成される第3のプログラムコードと、を記憶する情報処理装置に、
    前記第1のプログラムコードを構成する各ルーチンのうち、前記第3のプログラムコードに含まれる前記情報により示される各ルーチンについて、それぞれの複製を生成する手順と、
    前記第1のプログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語のうち、前記他のルーチンの複製が生成されている場合には、前記他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える手順と、
    前記第1のプログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える手順と、
    を実行させるためのプログラム。
  7. 複数のルーチンを含んで構成されるプログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成し、
    前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換え、
    前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える
    ことを特徴とするプログラムコードの合理化方法。
  8. 複数のルーチンを含んで構成されるプログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成し、
    前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換え、
    前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える
    ことによりプログラムコードを生成する方法。
  9. 複数のルーチンを含んで構成されるプログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成し、
    前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換え、
    前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える
    ことにより生成されるプログラムコード。
  10. 複数のルーチンを含んで構成されるプログラムコードを記憶するプログラムコード記憶部と、
    前記プログラムコードを構成する各ルーチンのうち、他のルーチンから呼び出される各ルーチンについて、それぞれの複製を生成する複製ルーチン生成部と、
    前記プログラムコードを構成する各ルーチン及び各複製に含まれる、他のルーチンを呼び出す命令語を、それぞれ前記他のルーチンの複製を呼び出す命令語に書き換える呼び出し命令変更部と、
    前記プログラムコードを構成する各複製に含まれる各命令語を、前記各複製を呼び出すルーチン又は複製によりそれぞれ実現される情報処理を合理化するようにそれぞれ書き換える最適化実行部と、
    を備えることを特徴とする情報処理装置。
JP2004326878A 2004-11-10 2004-11-10 プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置 Withdrawn JP2006139413A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2004326878A JP2006139413A (ja) 2004-11-10 2004-11-10 プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置
US11/268,567 US20060107258A1 (en) 2004-11-10 2005-11-08 Program, program code optimization method, program code compile method, program code, and information processing system

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004326878A JP2006139413A (ja) 2004-11-10 2004-11-10 プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置

Publications (1)

Publication Number Publication Date
JP2006139413A true JP2006139413A (ja) 2006-06-01

Family

ID=36387963

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004326878A Withdrawn JP2006139413A (ja) 2004-11-10 2004-11-10 プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置

Country Status (2)

Country Link
US (1) US20060107258A1 (ja)
JP (1) JP2006139413A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103034486A (zh) * 2012-11-28 2013-04-10 清华大学 移动终端操作系统基于全系统扩展调用图的自动优化方法

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8789032B1 (en) * 2009-02-27 2014-07-22 Google Inc. Feedback-directed inter-procedural optimization
US9996325B2 (en) 2013-03-06 2018-06-12 Qualcomm Incorporated Dynamic reconfigurable compiler
US9027007B2 (en) * 2013-03-06 2015-05-05 Qualcomm Incorporated Reducing excessive compilation times
US9286039B2 (en) * 2013-03-14 2016-03-15 Microsoft Technology Licensing, Llc Operating system support for contracts
CN108614702B (zh) * 2016-12-28 2022-02-11 阿里巴巴集团控股有限公司 字节码优化方法及装置

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5778212A (en) * 1996-06-03 1998-07-07 Silicon Graphics, Inc. Interprocedural analysis user interface
US5812855A (en) * 1996-06-03 1998-09-22 Silicon Graphics, Inc. System and method for constaint propagation cloning for unknown edges in IPA
US7058561B1 (en) * 2000-11-02 2006-06-06 International Business Machines Corporation System, method and program product for optimising computer software by procedure cloning
US7036116B2 (en) * 2001-03-23 2006-04-25 International Business Machines Corporation Percolating hot function store/restores to colder calling functions
US6895580B2 (en) * 2001-09-20 2005-05-17 International Business Machines Corporation Expression reduction during compilation through routine cloning
US7293264B2 (en) * 2003-09-17 2007-11-06 Nokia Corporation Method and a device for abstracting instruction sequences with tail merging

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103034486A (zh) * 2012-11-28 2013-04-10 清华大学 移动终端操作系统基于全系统扩展调用图的自动优化方法

Also Published As

Publication number Publication date
US20060107258A1 (en) 2006-05-18

Similar Documents

Publication Publication Date Title
Ansel et al. Pytorch 2: Faster machine learning through dynamic python bytecode transformation and graph compilation
US6072951A (en) Profile driven optimization of frequently executed paths with inlining of code fragment (one or more lines of code from a child procedure to a parent procedure)
WO2010013370A1 (ja) プログラム変換装置及びプログラム変換方法
Bertolli et al. Integrating GPU support for OpenMP offloading directives into Clang
US9672133B2 (en) Systems and methods for debugging applications using dual code generation
Ginsbach et al. Automatic matching of legacy code to heterogeneous APIs: An idiomatic approach
JP4041248B2 (ja) コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
JP4833206B2 (ja) 最適化されたプログラムのためのアンワインド情報の生成
US10409559B2 (en) Single-source-base compilation for multiple target environments
Schardl et al. Tapir: Embedding recursive fork-join parallelism into llvm’s intermediate representation
US8387020B1 (en) Verifying that a method has been implemented for a program written in a dynamic programming language
Prokopec et al. Making collection operations optimal with aggressive JIT compilation
Bračevac et al. Graph IRS for impure higher-order languages: making aggressive optimizations affordable with precise effect dependencies
JP2006139413A (ja) プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置
Barua et al. OMPSan: static verification of OpenMP’s data mapping constructs
Le Meur et al. Specialization scenarios: A pragmatic approach to declaring program specialization
JP5447774B2 (ja) プリフェッチ命令生成方法、コンパイラ、及びプログラム
US20170206068A1 (en) Program optimization based on directives for intermediate code
US6721945B1 (en) Optimization of calls in programming languages using pointers for passing reference parameters
Doerfert et al. Polyhedral expression propagation
JP2017091070A (ja) 実行可能コード生成プログラムおよび実行可能コード生成装置
Merrill Parsing Non‐LR (k) grammars with yacc
JP2010529540A (ja) トランザクション・メモリ・システムにおけるトランザクション・コード・ブロックを効果的に検索する方法
von Dincklage et al. Integrating program analyses with programmer productivity tools
JP4228602B2 (ja) 仮引数重複違反検出機能を備えたコンパイラプログラム、その記録媒体、およびコンパイラ装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20061116

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20081218

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20091005