MTASC 3

http://d.hatena.ne.jp/Nabetani/20050809#p1

ActionScript知らない人どうしが話していてもなかなか進まないので大変ありがたいです。

今問題にしているのは、コンパイル時の型検査の話です。例えば、例として挙げてくださった

function typetest()
{
  for( var i=0 ; i<6 ; ++i ){
    var a = [ 10, "foo", [1,2], true, function(){}, _root ];
    var s:Number = a[i];
    m_textfield.text += typeof(s)+"{"+s+"}, ";
  }
}

というプログラムであれば、a[i]Number型の変数に代入されていることから、aの中身は全てNumberでなくてはならないということが(人間は見て)わかります。つまり、本当ならコンパイル時にエラーになってほしい。*1

MTASCはほんとに型推論(Type Inference)やってるの?スライドにはなんかいろいろ書いてあったけど…」という疑問は、ここからわいてきたものです。型推論というのはActionScriptのように「いちいち式の型を宣言しなくても良い言語」の式にプログラムのソースコードを解析して型を与えよう、という技術です。

オブジェクト指向言語型推論は凶悪に難しい問題として知られていますので、MTASCがどのように型推論をしているかということに興味を持ってました(ます)。*2

コンパイルして最適化という話はMTASCの場合は関係が無いと思います。通常のActionScriptと同様にFlashVMバイトコードコンパイルするようですし、FlashVMは見たところ特に型付けして最適化できるような仕様ではないようです。ActionScriptが本来型無しの言語であることからも、自然な仕様だと思います。

ついでに、型エラーのメッセージはちょっと不自然にも見えますが慣れればそんなもんですし、型推論アルゴリズムからすれば自然なメッセージです*3。確かにもうちょっとわかりやすいメッセージにできるとは思いますが。

*1:でもこのプログラムは実行時にもエラーになって欲しいですね

*2:開発者のNicolas Cannasseは論文書くのが仕事の人ではないみたいなので、ソース読むしかないみたいです

*3:x:Numberから左辺の型がNumberであることがわかり、"foo"が文字列リテラルであることから右辺の型がStringであることがわかります。代入文なので両辺の型が等しくなくてはなりません。そこでNumber = Stringという等式を生成します。その後この等式が本当になりたつのかを確認するわけですが、あきらかに成り立ちませんよね。そこでNumber != Stringというエラーになります。そうすると「NumberはStringじゃないよ」というエラーメッセージが生成されるわけです。