しゃある通信

#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個しかないので、微々たるもんですね。



マクロミルへ登録

© 2009 Kazuya 'Sharl' Masuda
(C)Willoo Entertainment Inc. (C)Konami Digital Entertainment 株式会社ウィローエンターテイメント及び株式会社コナミデジタルエンタテインメントの著作権を侵害する行為は禁止されています。 0.005114 cached