[ruby-dev:48768] Rubyで静的型
From:
"Toshiyuki Sasaki" <tsasaki1@...>
Date:
2014-12-23 02:42:26 UTC
List:
ruby-dev #48768
すいません・・・。先ほどのメールはHTML形式で送ってしまいました。
テキスト形式で再度送り直させていただきます。
初めまして。
佐々木俊之というものです。
さっそく本題ですが、
掲題の通り、Rubyのような動的言語で、静的な型チェックを行う
方法についてアイデアを持っています。
これは私が知る限り(といっても大変狭い範囲ですが)まだ世に
出ていないようなのですが、これを使うとダックタイピングを含めた
すべての動的な型付けを、一切の型指定なく、静的に行うことが
できます。
その方法は次です。
1.関数の引数はすべてC++で言う型テンプレートとする。
2.型推論を行う。
3.ポリモーフィズムは「自動汎化」して行う。
自動汎化、これが私のアイデアなのですが、それはC++の仮想関数
テーブルを、クラスごとでなく
ポリモーフィックに振舞う変数についての一連の呼び出しと、その
変数に実際に入れられるオブジェクトごとに作り、実行時、変数がどの
オブジェクトの型なのかによって、仮想関数テーブルを選んで、それに
ついてオブジェクトのメンバーを呼び出すというものです。
これだと分かりにくいと思いますが、要は変数に入れられた、同じインター
フェースを部分的に持つオブジェクトの関数テーブルの、メモリーマッピング
の差異を吸収する仮想関数テーブルを、その変数のすべてのポリモーフィ
ックな呼び出しについて、作るという
ことです。この仮想関数テーブルを、C++のそれと区別するため、以下では
「キャップテーブル」と呼ぶことにします。
これでも分かりにくいので例を。
Xオブジェクトがメンバーa, b, c, dを、Yオブジェクトがメンバーb, c,
d, eを持ち、
if 動的な条件
var = X
else
var = Y
end
var.b
var.c
のコードがあるとき。
varはポリモーフィックに振舞います。その背後では、Xについてのメソッド
b, cの使用(使用だからdは含まない)についてのキャップテーブルが
存在し、それがvar = xのときvarに代入され、var.bでキャップテーブルの
メンバーbがXオブジェクトのメンバーbを参照して、Xのbを呼び出します。
var = yのときも同様です。varに入るX, Yのキャップテーブルのレイアウト
(b, cの順)はX, Y共に同じで、だからどちらの(実行時分からない)
キャップテーブルの呼び出しにも静的に束縛できます。
キャップテーブルはそれぞれ共通点の無いX, Yのメモリーレイアウト
(b, cについての)へのポインタをそのメンバーとして持ちます。
こうしてダックタイピングが静的型束縛をもってできるようになります。
以上が自動汎化の説明です。細かいことはまだありますが、大体は
こんな感じです。重要(と私が思っている)なのは、これが型宣言なく
静的型束縛するために必要な最後の要素と思われることです。
これでRubyでも何らコードを変更することなく静的型束縛が可能と
なります。Rubyも遅い言語から、頑張ればC並みに速い言語になれ
るかもしれません。そうなると今まで速度が重要な部分はCで書こう
ということはなくなり、逆に速度が重要だからここはRubyで書こうと
いうことにもなるかもしれません。
もっともコンパイルという手順が嫌われればそれまでですが。
以上、もしこんなの当たり前だよ、ということであれば申し訳ありません。
長文失礼しました。
**************************
佐々木俊之
tsasaki1@ab.auone-net.jp
**************************