学位論文 遅延評価に基づく関数型言語におけるメモリ割当量の削減

髙野, 保真  ,  タカノ, ヤスナオ  ,  Takano, Yasunao

pp.1 - 157 , 2015-09-30 , The University of Electro-Communications
内容記述
遅延評価は,値が実際に必要になるまで計算を遅らせる評価戦略である.必要になった値から計算するため,最終結果を求めるのに不要な計算を除去し,計算の最適化を目指すことができる.それと同時に,どの値が必要となるかという判断を処理系に任せることによって,プログラムに計算の進め方を記述する必要がなくなり,宣言的で簡潔なプログラムの記述につながる.たとえば,リストなどの再帰的データ構造を扱う際には,そのデータ構造を生成する処理と読み進める処理を分けて記述することができるため,遅延評価により得られる記述面での恩恵は大きい.記述面での利点が多い一方で,遅延評価を行う言語処理系を実装するには,計算の遅延に必要となるオブジェクト(遅延オブジェクト,以下サンクと呼ぶ)について,十分考慮して処理系を設計する必要がある.特に,サンクをメモリ上に割り当てる時間的・空間的コストが問題となり,遅延評価によって不要な計算を除去できるとしても,プログラムの実行時のオーバヘッドが大きくなってしまうという問題点がある.そのため,効率的な遅延評価機構の実現を目指して,サンクの生成を抑制する静的解析手法について今まで多くの研究がなされてきた.たとえば,正格性解析は,プログラムの最終結果を求めるために必要となる計算を,プログラムから静的に解析する.値が必要となる式は遅延させずに済ませることができるため,その式に対するサンクを生成しない効率的なコードを生成することができる.多くのプログラムにおいて,正格性解析によりサンクの生成を抑えられることは,すでに確認されているが,プログラムの文面から得られる静的な情報のみを用いるため,動的なふるまいを考慮すれば削減可能と判断できるようなサンクは,正格性解析による削減の対象ではない.たとえば,リストをどれだけの長さ読み進めるかというような実行時に決定する要素があると,リストの遅延に必要となるサンクの生成を正格性解析のみで抑制することは難しい.本論文は,サンクの削減という目的を達成するため,リストのような線形再帰的に定義される代数データ構造に注目し,既存のサンクを再利用する手法Thunk Recycling を提案する.Thunk Recycling は,すでに割り当てられているサンクを破壊的に更新して再利用し,新たなサンクの生成を抑える.たとえば,リストであれば,後続のリストの生成を遅延するサンクを再利用できる.本論文では,まず,Thunk Recycling の動作について述べ,その実現に必要となる機構についてまとめる.再利用を可能とするために,再利用が可能であるサンクを既存のサンクと区別して扱う.再利用機構は,破壊的な更新により矛盾が起こらないようにするコンパイル時の変換機構と,実行時に再利用を行う機構から構成される.プログラム変換の基本的な方針は,再利用可能なサンクへの参照を単一にすることである.また,実行時の再利用機構は,既存のサンクの生成・評価という仕組みの多くの部分を流用する.次に,Thunk Recycling の形式的な定義と,その正しさの証明について述べる.簡単な関数型言語を定義し,その言語に対するThunk Recycling のプログラム変換を定義した.さらに,サンクを再利用する操作的意味論を定義した.その意味論を用いて,Thunk Recycling の適用の有無により,プログラムのふるまいが変わらないことを証明した.次に,関数型プログラミング言語Haskell の処理系であるGlasgow Haskell Compiler(GHC)へのThunk Recycling の実装について述べる.GHC は,Haskell の標準的な処理系であり,多くの研究の基盤として用いられ,新しい言語概念など先進的な研究成果が取り入れられている.本論文では,Thunk Recycling の機構のGHC における実装について,考えうる各種の設計方針と,それぞれの設計方針を選択するに至った設計上の得失に関して論じる.GHC は,その大部分が関数型言語であるHaskell で記述されており,関数型言語による大規模で洗練されたシステムであるという面を持つ.そのため,Thunk Recycling の実装は,関数型言語による大規模なソフトウェアに対する開発事例の一例となっている.そこで,本論文では,関数型言語で書かれたプログラミング言語処理系に変更を加えるという観点から,遅延評価を行う関数型言語処理系の実装に関して得られた知見を論じる.最後に,GHC 上の実装について,ベンチマークプログラムを用いた実験について述べる.実行時間に関しては,適用するプログラムを選ぶものの,再利用によって総メモリ割当量を削減できた.
本文を読む

http://ir.lib.uec.ac.jp/infolib/user_contents/9000000811/9000000811.pdf

このアイテムのアクセス数:  回

その他の情報