科学シミュレーションの場合、C++でいくつかの計算を記述する必要があります。これが非常に退屈になったので、小さなコードジェネレーターを自分で作成しました。スクリプト言語(Python)では、割り当てと数学演算で構成される構文ツリーをまとめました。自己作成のコードジェネレーターがツリーをC++コードに変換します。 (ちなみに、訪問者パターンの良い例です。)それで問題ありません。
現在、プロジェクトは成長しており、より洗練されたコードの需要が高まっています。どのツールが役立つかを知るのはとても難しいです。 プログラムコードをプログラムで生成する必要がある場合、ユーザーは通常何をして何を使用しますか?(Python "generator language"または一般的に)
(申し訳ありませんが、この場合、Googleは本当に私の友達ではありません。残念ながら、Googleはタスクを検索結果に変換できません。)
だから、あなたは(あなたのもの) ドメイン固有の言語 (DSL)をC++のいくつかのフレーバーに翻訳したいと思います。私は GCC MELT の実装でもまったく同じことをしています。 [〜#〜] gcc [〜#〜] コンパイラをカスタマイズするためのLISP-yドメイン固有の言語です。少し詳細を示す this 回答、および関連参照を提供する this も参照してください。
ここにいくつかのアドバイスがあります。ドメイン固有の言語の目的がまったくわからないので、私はもっと具体的にすることはできません。 Turing-complete (おそらく 偶然 )ですか?多分そう!
一度も勉強したことがない場合は、 コンパイラ の手法を検討してください( lexing & parsing を含む)。彼らは非常に関連しています。
scottの本 Programming Language Pragmatics を読んでください(少なくともインスピレーションを得るために)。
(独自のDSLを開発する代わりに)いくつかの既存インタープリターを埋め込むことを検討してください、おそらく Guile または Lua 。それはかなり簡単かもしれません。
(おそらくC++に)コンパイルされたパス可能なDSLの設計と実装は、ロットの作業(年!)であることに注意してください。 神話の男の月 、 ホフスタッターの法則 などを読んでください bootstrap 言語の実装にしたい(またはしたくない)かもしれません...
dSLが何らかの形で有用である場合(たとえば、スクリプトを書いているのがあなただけではない場合)、最終的にはクレイジーなユーザーが大きなスクリプト(数千行)をコーディングすることに注意してください。言語を真剣に設計してください!
最初に、 抽象構文ツリー の明確に定義された(頭の中で!)表現が必要です(これは tree ではないかもしれませんが、 graph =)生成されたC++コードの場合、対応するC++コードを発行する前に、ASTを(メモリ内に)ビルドする必要があります。
あなたは#line
ディレクティブ(DSLスクリプト内の位置を参照)。これは(デバッグには)非常に便利ですが、それらを出力するのは非常に困難です。
dSLソースと生成されたC++コードの間にいくつかのother内部表現が必要になる場合があり、C++コードジェネレーター(実際には特殊なコンパイラー)がいくつかを変換しています別の表現、そして最後にC++コードとして出力されるAST=への表現。
あなたはメモリモデルを気にする必要があります。 ガベージコレクション のテクニック(少なくとも用語と概念について)について読んでください。 GCハンドブック を参照してください。おそらく、愚かなユーザースクリプトがコンピューターやプロセスをクラッシュさせたくないでしょう。したがって、メモリを処理する必要があります(& メモリリーク )。
c ++コードを生成する代わりに、 JITコンパイル テクニックを使用することを検討するかもしれません: [〜#〜] gccjit [〜#〜] 、 [〜# 〜] llvm [〜#〜] 、 libjit 、 asmjit 、...
おそらく SciLab 、 [〜#〜] r [〜#〜] 、 Octave 、 Julia はあなたの仕事(あなたが自分のDSLを始めるのを避けるかもしれないかもしれないので)
C++またはコンパイルされたコードを生成する必要がありますか? LLVMを利用して、スクリプトツールからコンパイルされた出力を生成できます。 clang中間言語は冗長ですが強力です-そのC++コード(またはその他のサポートされている言語)はコンパイル前に解析されます。または、Clangパーサーを活用するツールからC++を生成することもできます。そのため、テキストを操作する代わりに、パーサーが保持する内部ASTを操作します。
例として、 cmonster を見てください。これは、(基本)python clangのC++パーサーのラッパーです)。