web-dev-qa-db-ja.com

C ++コードを生成する方法は? (おそらくWITH(FROMではない)Python)

科学シミュレーションの場合、C++でいくつかの計算を記述する必要があります。これが非常に退屈になったので、小さなコードジェネレーターを自分で作成しました。スクリプト言語(Python)では、割り当てと数学演算で構成される構文ツリーをまとめました。自己作成のコードジェネレーターがツリーをC++コードに変換します。 (ちなみに、訪問者パターンの良い例です。)それで問題ありません。

現在、プロジェクトは成長しており、より洗練されたコードの需要が高まっています。どのツールが役立つかを知るのはとても難しいです。 プログラムコードをプログラムで生成する必要がある場合、ユーザーは通常何をして何を使用しますか?(Python "generator language"または一般的に)

(申し訳ありませんが、この場合、Googleは本当に私の友達ではありません。残念ながら、Googleはタスクを検索結果に変換できません。)

4
Michael

だから、あなたは(あなたのもの) ドメイン固有の言語 (DSL)をC++のいくつかのフレーバーに翻訳したいと思います。私は GCC MELT の実装でもまったく同じことをしています。 [〜#〜] gcc [〜#〜] コンパイラをカスタマイズするためのLISP-yドメイン固有の言語です。少し詳細を示す this 回答、および関連参照を提供する this も参照してください。

ここにいくつかのアドバイスがあります。ドメイン固有の言語の目的がまったくわからないので、私はもっと具体的にすることはできません。 Turing-complete (おそらく 偶然 )ですか?多分そう!

  • 一度も勉強したことがない場合は、 コンパイラ の手法を検討してください( lexingparsing を含む)。彼らは非常に関連しています。

  • 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 [〜#〜]libjitasmjit 、...

  • おそらく SciLab[〜#〜] r [〜#〜]OctaveJulia はあなたの仕事(あなたが自分のDSLを始めるのを避けるかもしれないかもしれないので)

C++またはコンパイルされたコードを生成する必要がありますか? LLVMを利用して、スクリプトツールからコンパイルされた出力を生成できます。 clang中間言語は冗長ですが強力です-そのC++コード(またはその他のサポートされている言語)はコンパイル前に解析されます。または、Clangパーサーを活用するツールからC++を生成することもできます。そのため、テキストを操作する代わりに、パーサーが保持する内部ASTを操作します。

例として、 cmonster を見てください。これは、(基本)python clangのC++パーサーのラッパーです)。

1
gbjbaanb