2016-05-01-01-CLにおける包括的コンパイル時解決を妄想する
>> Site top >> weblog >> 月別アーカイブ >> 2016年05月のlog >> 2016-05-01-01-CLにおける包括的コンパイル時解決を妄想する
最終更新日付:2016/05/01 01:00:00
CLにおける包括的コンパイル時解決を妄想する
2016 年 05 月 01 日
先日の個人的反省会の最後で書いた、コンパイル時解決の話。あの時は以下の3点が揃っている必要があると書いた。あ、違う4点だった。
- テンプレート
- inner type とそのコンパイル時アクセス
- シンボルや式からの型導出と型伝播
- 上記3点を前提としたコンパイル時解決
で、具体的にやりたいことはどんなことなのか、ちょっと妄想がてら整理してみた。
まず、現状がどうなっているかから。stl:vector のインスタンスを作成し、(明示されていないが)値を追加し、そして stl:sort でソートしている。
(let ((vec (new stl:vector))) ;; adding values to vec... (stl:sort (begin vec) (end vec)) vec)
ポイントは以下の通りだ。
- vec は『どんな型でも入る』コンテナだ。
- 総称関数 stl:sort には配列ベースのコンテナに最適化されたメソッド実装があるが、そこへのディスパッチは総称関数の仕組みによって実施される。すなわち実行時。
で、これをどうしたいか。
- コンテナに『要素の型』を指定可能とし、内部実装を最適化したい。つまりテンプレート化。
- 最低限の型宣言などによって、総称関数のディスパッチをコンパイル時点で済ませてしまいたい。
ここからは妄想コードなので動作しないと断り書きをした上で、先程を以下のように変えて何が起きる(というか起きて欲しい)かを書いてみよう。
(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-2021 project-enigma.
Generated by CL-PREFAB.