#08-02 [hack]rubyのkeywordsを見てみる
現時点で最新の安定版のruby 1.9.1p243をゲット。
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.bz2 $ tar xjf ruby-1.9.1-p243.tar.bz2 $ cp ruby-1.9.1-p243/defs/keywords . $ grep -e -k ruby-1.9.1-p243/lex.c /* Command-line: gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' keywords */オリジナルは1,3,$か。
$ gperf -C -p -j1 -i1 -g -o -t -N rb_reserver_word keywords | grep -e -k /* Computed positions: -k'1-3' */自動計算によると1-3になったな。
で、rubyソースに含まれているlex.cのハッシュ計算部分はこうだ。
すごい簡潔。対して自動で生成されたコードは以下。
register int hval = len;
switch (hval)
{
default:
hval += asso_values[(unsigned char)str[2]];
/*FALLTHROUGH*/
case 2:
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval + asso_values[(unsigned char)str[len - 1]];
演算量はいい勝負になってる気がする…自動計算恐るべし。
register int hval = len;
switch (hval)
{
default:
hval += asso_values[(unsigned char)str[2]+1];
/*FALLTHROUGH*/
case 2:
hval += asso_values[(unsigned char)str[1]];
/*FALLTHROUGH*/
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval;
rubyの予約語(?)は41個しかないので、微々たるもんですね。