私はこの機能をお気に入りの言語 OCaml に統合しました。これが D の魅力的な機能であることは知っていますが、いくつかの最適化を除いて、コンパイル時の評価の使用例は何ですか? 多ければ多いほど、オタクは良いです:-)
4 に答える
もちろん、最適化は大きなユースケースです。ctRegexのようなものは、実行時にコンパイルされた同等の正規表現よりもパフォーマンスが優れています (一般的に)。パーサー ジェネレーターも興味深いものであり ( Peggedを参照)、ますます注目を集めそうです。人々は、何ができるかを利用し始めたばかりです。
任意の C ヘッダーの D インターフェース ファイルを解析してビルドするようなこともできますmixin(import_c("header.h"))
(もちろん、これを行うには D で C 用のパーサーを作成する必要があります)。
"%0.2f"
通常、フォーマット文字列 ( など) はコンパイル時に認識されるため、非常に高速な文字列フォーマットを実行できます。フォーマット文字列を読み取って、フォーマットに必要なコードのみを生成し、あらゆる種類の不要なセクションを取り除くことができます。
実際、 vibe.dはコンパイル時のテンプレートをサポートしています。テンプレート ファイル (Jade/HAML ベース) には、D コードを含めることができます。それを読み取り、D コードのカスタム ブロックを生成します ("" ~ title ~ "..." のように考えてください)。著者がベンチマークを行ったとは思えませんが、信じられないほど高速であるはずです。
高レベルを維持しながら、本質的に、手動で最適化された特殊なコードの利点を得ることができます。何に使われるか分からないので、あなたの質問に答えるのは難しいです。C++ テンプレートを思い起こさせます。それらの設計者は、それが可能にする高度なメタプログラミング技術を予期していませんでした。
いくつかの提案:
- コンパイル時に PEG 文法を解析し、PEG パーサーをアセンブルし、そのパーサーを使用するのはどうですか? これがPeggedプロジェクトです。
- 大規模な静的ルックアップ テーブルの構築。
- 正規表現の最適なネイティブ コードの生成: std.regex.StaticRegex
- 定義ファイルからの protobufs の実装。
- 多くの関数は、それらの入力がコンパイル時にわかっている場合、関数の実装を変更することなく、実行時ではなく評価できます。
と一緒に使用するとmixin
、非常に柔軟性があります。
次の例を考えてみましょう。
template StructFromFile(string fileName){
string makeStructMembersCode(string[] s){
if(0==s.length){
return null;
}
string memberName=s[0].strip;
return q{
string }~memberName~q{;
}~makeStructMembersCode(s[1..$]);
}
struct StructFromFile{
mixin(makeStructMembersCode(import(fileName).splitLines));
}
}
これにより、そのメンバーがテキストファイルの行であるという構造体が作成されます。ここで、データベースにテーブルがあり、そのテーブルの行を格納するD構造体を作成するとします。そのテーブルのスキーマを読み取り、それをファイルに書き込むシェルスクリプトを記述してから、を使用StructFromFile
して、そのテーブルの行を保持できる構造体を自動的に作成できます。スキーマを変更した場合、構造体のコードを変更する必要はありません。ただし、古いスキーマに依存するコードは変更する必要がありますが、実行時のバグがコンパイルエラーに変わるため、これは良いことです。
もちろん、このメソッドを使用して、getter + setterプロパティを追加したり、XMLDTDやWebサービスに使用したりすることもできます。
これが私が考えることができるコンパイル時評価の最もオタクなアプリケーションです:あなたのプログラミング言語のstring f(string code)
ソースコードを引数として取り、Dコードを吐き出す関数の形であなた自身のプログラミング言語のためのコンパイラを書いてください。次に、次のようなものを書きます
mixin( f( import("my_code_file") ) );
あなたのmain.d
ファイルに。このようにして、Dコンパイラとそのバックエンドを悪用して実行可能ファイルを生成できます。必要に応じて、main.d
ファイルを作成し、その上でDコンパイラを実行するシェルスクリプト(またはそのようなもの)を作成できます。このようにして、あなたの言語用のコンパイラの半分を手に入れることができます。少なくとも、バックエンドについて気にする必要はありません。;)
それから、私はDのコンパイル時レイトレーサーについて読みました。