2011-01-02 34 views
2

コンパイラの作成、特に最適化に関する知識とスキルを広げたいと思います。私は最適化が文字列型の大文字小文字のcase文のために利用できるか知りたいです。 Object Pascalの中に例えば:case文のコンパイラの最適化

ReadLn(s); 
case s of 
    'abc','def': ...; 
    'xyz'  : ...; 
    otherwise ...; 
end; 

は、Free Pascalの中で、これはAnsiCompareTextの後続の呼び出しに変換されます。他の言語の実装はどうですか?私は少なくともPHPを知っています、NimrodとOctaveはこれをサポートしています。

答えて

0

アプリケーション開発者としては、まず比較の数を制限するために実行される可能性が最も高いケースを挙げたいと思います。残念ながら、コンパイラの観点からは、実行時までそれを知りません。

自分自身のコンパイラを作成していて、上記のようなcase文が発生した場合、おそらく比較をソートしてバイナリ検索を行い、どのパスを取るべきかを判断します。これはうまくいけば、ワーストケースのシナリオを少し改善するでしょう。 Cにおいて

+0

私は実際にサフィックスの統合について考えています。結果のコードにツリーを '入れます。これによって、実際の接尾辞ツリーは構築されませんが、命令シーケンスは接尾辞ツリー内の検索のように機能します。この最適化は非常に最適です(おそらく死んだパスの削除でより多くの場合)。コストはO(n)です。ここでnは変数の文字列の長さです。 – LeleDumbo

+0

@LeleDumboこれは実際に私が考えていたものですが、実行時にデータセット全体を知っていることを考慮すると、非常に効率的な検索アルゴリズムを作成できない理由はありません。 – Sparafusile

0

コンパイラが一連としてこれをコンパイルすることができる

#define FIVE_CHARS(c1,c2,c3,c4,c5) (((((((((c5)<<7)|(c4))<<6)|(c3))<<6)|(c2))<<6)|(c1)) 

while (argc-->0){ 
    switch (FIVE_CHARS(argv[argc][0],argv[argc][1],argv[argc][2],argv[argc][3],argv[argc][4])){ 
    case FIVE_CHARS('-','h','e','l','p') : 
    case FIVE_CHARS('-','-','h','e','l') : 
    case FIVE_CHARS('-','h','\0','\0','\0') : 
    case FIVE_CHARS('-','?','\0','\0','\0') : 
     usage(); 
    break; 
    case FIVE_CHARS('-','a','r','g','1') : 
     setflag1(); 
    break; 
    default: 
     assert("Argument not supported"); 
    } 
} 

マクロとスイッチケースシフトがない「場合は、」(文字列)文字列の等価ではないが、それはビットを使用してある程度達成することができます小さい数の比較を持つifまたは大きい数のジャンプテーブルを使用します。これは、ビットシフトの大部分(ケースステートメント内のもの)が実行時ではなくコンパイル時に行われ、残りのビットシフト操作(スイッチ内のもの)が比較的安価であるため、コードサイズと速度の両方が大幅に向上します。 (最も一般的なパスを最初に置く必要がなくなります)... 5文字が一致する場合、珍しい文字/文字に対して余分なスイッチケースを追加するか、単にstrcmp()を使用することができます。 strcmp(){} else if if strcmp(){} else if ...

関連する問題