2016-05-01-01-CLにおける包括的コンパイル時解決を妄想する - project-enigma

2016-05-01-01-CLにおける包括的コンパイル時解決を妄想する

>> Site top >> weblog >> 月別アーカイブ >> 2016年05月のlog >> 2016-05-01-01-CLにおける包括的コンパイル時解決を妄想する

最終更新日付:2016/05/01 23:55:53


CLにおける包括的コンパイル時解決を妄想する

2016 年 05 月 01 日

先日の個人的反省会の最後で書いた、コンパイル時解決の話。あの時は以下の3点が揃っている必要があると書いた。あ、違う4点だった。

で、具体的にやりたいことはどんなことなのか、ちょっと妄想がてら整理してみた。

まず、現状がどうなっているかから。stl:vector のインスタンスを作成し、(明示されていないが)値を追加し、そして stl:sort でソートしている。

(let ((vec (new stl:vector)))
  ;; adding values to vec...
  (stl:sort (begin vec) (end vec))
  vec)

 

ポイントは以下の通りだ。

 

で、これをどうしたいか。

 

ここからは妄想コードなので動作しないと断り書きをした上で、先程を以下のように変えて何が起きる(というか起きて欲しい)かを書いてみよう。

(let ((vec (new stl:vector<fixnum>)))
  (declare (type stl:vector<fixnum> vec))
  ;; adding values to vec...
  (stl:sort (begin vec) (end vec))
  vec)

 

まず、(new stl:vector<fixnum>) とすることで fixnum に最適化された内部バッファ配列を持つベクタクラスのインスタンスができる。初っ端から無理臭い話だがそれはさておき、問題は次の sort だ。こいつはなんとかして総称関数のディスパッチをコンパイル時点で完了させたい。そのためには少なくともマクロでなければならず、さらに (begin vec) やら (end vec) の式が評価された結果の型をコンパイル時点で検出できなければならない。ここでは、これらの型が stl:vector_iterator<fixnum> であることを検出する。つまり型推論まがいのことをやる必要がある。ノーヒントでは流石に無理なので、そのために vec の型を宣言している。実際には、stl:vector テンプレートがインスタンス化された時点で『こいつは begin に対して vector_iterator を返しますぜ』みたいな情報を登録する感じになるだろう。

まだある。ソートアルゴリズムは(要素数や条件によるが)内部でテンポラリのバッファを使ったりするし、別の内部実装関数を呼び出したりする。これらが全部テンプレートになるのだ。そしておそらく、stl:sort はインスタンス化において、適切な型宣言を付加してそれらの内部実装を利用する。これによってライブラリの奥深くまでユーザコードで宣言された型(とその推移型)が伝播していく。

まるで夢のような話だ(まぁ夢というか妄想なんだけど)。しかし、無理そうな部分がいくつもある。まずはテンプレートのインスタンス化だ。さっきはさらっと (new stl:vector<fixnum>) と書いたが、これによって fixnum に特化したベクタクラスのコードが生成されなければならない。どこに? どこだろう。きっとdefclass を書いても良いどこかだ。では複数の個所でこれをやったらどうなるだろう? ユーザコードに関してはどこかで明示的にインスタンス化させる仕様にすれば良いかもしれないが、それで問題は解決しない。ライブラリ内部に隠れてい(て推移的にインスタンス化され)るテンプレートはどうすれば良いのだろう?

 

まぁ、妄想だな。もう少し現実的になって、何ができるかを今後も考えてみるとしようか。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : STLとその移植

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.