case文(switch文)の実装case文(switch文)の実装Pascalでいうcase文、すなわちC/C++などでいうswitch文には、高速なコードを生成して欲しいという願いがこめられているように思う。仮想マシンのインタプリタを作るときなど長大なcase文が現れるが、これに対してcmp命令の羅列のコードが生成されたりすると、なんだこのタコ、と思わず叫びそうになる。Cabezonの場合も、他のコードはともかく、case文だけは入念に最適化されたコードを生成するようにしている。Cabezonのcase文コードは、何種類かのパターンを用意しておいて、コストベースで最適なパターンを選ぶというアプローチをとっている。初期のCabezonは、以下の三種類のコードの中から、メモリ使用量が最も少ないコードを生成するようになっていた。CMP命令の羅列(リニアサーチ)STRING命令による検索テーブルジャンプ具体的には以下のような感じになる。_80ところが、最近のCabezonでは、コードの種類は二種類になった。これはNIFTYのFPLでsuto氏から教わった方法で、「バイナリサーチのコードをインライン展開する」というものである。具体的なコードで見てみよう。*)end上記のように値の幅が大きいときには、テーブルジャンプではメモリ使用量が多くなってしまう。そのため、以下のようなコードを生成する。=16上記のように、小さいものから順に比較するのではなく、バイナリサーチの順番、すなわち中央値から比較して、順に範囲を絞っていくようなコードを生成している。これは巧妙であり、STRING命令よりも効率が良いため、現在ではバイナリサーチのコードか、テーブルジャンプのコードのどちらかを生成するようになっている。'2000年05月31。