スクリプト言語

スクリプト言語というのは,見た目*1と実装のセマンティクスの乖離が少ないな,と思い始めた.古き良き時代のlispλ計算みたいな感覚で話を進められて,楽である.

例えば,C++において,

class Class1 {
  public:
  void hoge();
  void huga();
}

class Class2 : public Class1 {
  ...
}

class Class3 {
  public:
  void hoge();
  void huga();
}

という三つのクラスがあったとき,Class2をClass1として扱うことは可能だが,Class1をClass2として扱うことは−例えhogeとhugaしか利用しなかったとしても−不可能であるし,Class1とClass3を同じように扱うことも不可能である.ソースコードの見た目で言えば,Class1とClass3はまったく同じインタフェースを備えているにも関わらず,だ.

これは,多分プライベートな変数の割り当てとか,あるいはhogeとhugaのアドレスとか,そういうのが問題になって,コンパイルできない(するのがすごく大変)ということなんだと思う.

一方,rubyでは,

class Class1
  def hoge; end
  def hoge; end
end

class Class2
  def hoge; end
  def huga; end
end

としたとき,(通常のオブジェクト指向言語プログラムの型の範疇では)Class1とClass2は同一視することが可能である.これは,rubyが純然たるインタプリタで実行される言語であることによるものである(と見ることができるかもしれない).

この辺の性質の違いというのは,なかなかに面白いものである.


ちなみに,C++のテンプレートみたいなgenericsの実装が流行っていたら,先に述べたような研究はもっと広く行われていたかもしれないとも思った*2 *3.らっきい.

*1:言語レベル

*2:とりあえずC#Genericsを念頭に置いての発言

*3:C#Genericsクロージャと組み合わせれば,十分強力だと思うけど