タグ付けされた質問 「meta-programming」

22
自動プログラミング:コードを書くコードを書く[終了]
The Pragmatic Programmerの本を読んだ後、私が最もおもしろいと思った議論の1つは、「コードを書くコードを書く」ことでした。 ネット上でそれ以上の説明や記事を探してみましたが、このテーマに関するいくつかの良い記事を見つけましたが、特定のコード実装や良い例はまだ見つかりませんでした。 それはまだあまり一般的な議論ではなく、ドキュメントが欠けているか、多くの人々に受け入れられていないように感じます。それについてもっと知りたいです。 このテーマについてどう思いますか?生産性を本当に向上させるものですか?本、ブログ、スライドショーなどのテーマに関する良いリソースは何ですか? いくつかのコード例は、その実装をよりよく理解できるようにするために大いに評価されるでしょう。 メタプログラミング、生成的プログラミング、コード生成など、関連するさまざまなプログラミングテクニックに関するwikiページを次に示します。

10
私の同僚全員がメタプログラミングを理解していなくても、メタプログラミングを使用しても大丈夫ですか?
反復的なタスクを避け、より安全に使用できる抽象化を構築するために、多くのメタプログラミングを採用しています。 私は最近、より大きなチームで働いている新しい仕事に移りました。これは私の同僚の何人かを心配します。彼らはそれを理解していないからです。 私は常に言語の可能性をフルに活用しようとしますが、同僚の一部(すべてではない)がそれをリスクとして認識しています(一部はアプローチを歓迎します)。 チームの他の誰も理解できないコードを書くことは問題だと思います。一方、私たちはすべてプロのC ++開発者であり、クラスでCを書くよりも高い標準を目指すべきだと思います。 私の質問は、誰が正しいのか、私は何をすべきですか? 明確化: 言語の可能性を最大限に活用しようとしても、すべての問題にTMPを投げるわけではありません。C ++はツールボックスであり、私にとってC ++の習熟度とは、ボックスのすべてのツールを使用できることと、特定のジョブに適したツールを選択することです。

3
コードを書くとき、コンパイルされたマシンコードについて考える必要がありますか?
たとえば、次のコードがあります。 auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; そして、後でこれを数回呼び出します。asmコードでは、ラムダを使用した外部呼び出しが表示されます。メタプログラミングで勝つかもしれませんが、asmのデバッグとパフォーマンスで負けるのですか?パフォーマンスとデバッグの単純さを確実にするために、最新の言語機能、マクロ、およびその他のメタプログラミングの側面を避ける必要がありますか?

4
単純なプロパティでAggressiveInliningを使用することには欠点がありますか?
C#/ JITがどのように動作するかを分析するためのツールについてもっと知っていれば、私は自分自身に答えることができるに違いないが、そうではないので、私に尋ねてください。 私はこのような簡単なコードを持っています: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } ご覧のとおり、AggressiveInliningをインライン化する必要があると感じたため、AggressiveInliningを配置しました。 おもう。それ以外の場合、JITがインライン化する保証はありません。私が間違っている? この種のことを行うと、パフォーマンス/安定性/何かが損なわれる可能性がありますか?

5
monkeypatchingは優れたプログラミング手法と見なされていますか?
私は、モンキーパッチングは、標準的な優れたプログラミング慣行というよりも、迅速で汚れたハックのカテゴリーに属するという印象を受けていました。サードパーティのライブラリのマイナーな問題を修正するために時々使用していましたが、一時的な修正と考え、サードパーティのプロジェクトに適切なパッチを提出しました。 ただし、主流プロジェクト、たとえばGeventのgevent.monkeyモジュールでこの手法が「通常の方法」として使用されているのを見てきました。 モンキーパッチは、主流であり、通常の、受け入れ可能なプログラミングプラクティスになりましたか? 参照:ジェフ・アトウッドによる「人間のためのモンキーパッチング」

1
Clojureに衛生的なマクロがないことから生じる実際的な問題は何ですか?
Clojureマクロは簡単に記述できますが、ラケットの衛生的なマクロほど信頼性が低いと聞きました。私の質問には2つの部分があります。 gensym衛生マクロとどう違うのですか? ラケットマクロは、Clojureにはないものを何を提供しますか?(安全性、構成可能性など)

2
コンパイル時IOC
誰かがコンパイル時にIOCを実行するプロジェクトを開始しましたか(おそらくRoslynまたはLinq MethodInfoを使用して)。 IOCコンテナーでの私の経験はこれまでのところ素晴らしく、いくつかの小さな問題がありませんでした 多くのIOCコンテナは、ここで解決ロジックの多くが発生するため、起動が遅くなります コンパイルがコンストラクターの呼び出しを保証しないため、解決が可能かどうかを確認するのは難しい場合がよくあります。 多くの場合、IOCコンテナーはランタイムに小さなオーバーヘッドを追加します(一部は小さくもなく、多くの場合、すぐに起動するものはゆっくり実行されます) 理想的な解決策は、IOCの代わりにFactoryクラスを追加するコンパイル手順をビルドチェーンに追加することだと思われます。 誰もこれをやったことがありますか?そうでない場合は、なぜですか?

4
メタプログラミングはどのくらい一般的ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 6年前休業。 どのくらいの頻度で、またはメタプログラミングがプロジェクトで使用されていると思いますか?uniでは、これが適用されるのを見たことがありませんが、以前の仕事でこれを見たことがあります(それを目にしたとき、それがいかに効果的であるかがわからなくなってしまいました)。 しかし、それはどれほど一般的ですか?それはいつも使用されていますか、それともたまにしか使用されていませんか?

3
C ++:C ++機能ではなくコンパイラAPIを使用したメタプログラミング
これはSOの質問として始まりましたが、それはかなり型破りであり、Webサイト上の実際の説明に基づくと、質問には多くの概念的な重みがあるため、programmers.seに適している可能性があることに気付きました。 私はclang LibToolingを学習してきましたが、これは非常に強力なツールであり、コードの「ぎこちない」全体をフレンドリーな方法で、つまりセマンティックな方法で、推測することなく公開できます。clangがコードをコンパイルできる場合、clangはそのコード内のすべての単一文字のセマンティクスについて確実です。 ここで、少し前に戻ります。 C ++テンプレートのメタプログラミングに従事する場合(特に、恐ろしいマクロではあるが、テンプレートを超えて賢い領域に冒険する場合)には、多くの実用的な問題が発生します。正直なところ、私も含めて多くのプログラマーにとって、テンプレートの通常の使用法の多くは、やや恐ろしいものです。 良い例は、コンパイル時の文字列だと思います。これは、1年以上前の質問ですが、現時点でのC ++では、これが単なる人間にとって容易ではないことは明らかです。これらのオプションを見るだけでは吐き気を誘発するのに十分ではありませんが、それでも、私が自分のソフトウェアで使用している空想のアプリケーションに適合する魔法の、最大限に効率的なマシンコードを生成できるかどうか自信がありません。 正直言って、皆さん、文字列はかなりシンプルで基本的なものです。私たちの中には、特定の文字列が単純な方法でコーディングする場合よりも大幅に「組み込まれた」マシンコードを生成する便利な方法を求めているだけです。私たちのC ++コードで。 clangとLibToolingを入力します。これにより、ソースコードの抽象構文ツリー(AST)が公開され、シンプルなカスタムC ++アプリケーションRewriterが、ASTのすべての豊富なセマンティックオブジェクト指向モデルと一緒に、生のソースコードを(確実に)正しく正確に操作できるようになります。それは多くのものを扱います。マクロ展開について知っているので、それらのチェーンをたどることができます。はい、私はソースからソースへのコード変換または変換について話しています。 ここでの私の基本的な論点は、clangにより、C ++ソフトウェアの理想的なカスタムプリプロセッサステージとして機能する実行可能ファイルを作成できるようになり、これらのメタプログラミングステージをC ++で実装できるということです。このステージは、有効なC ++コードである入力を受け取り、より有効なC ++コードを出力として生成する必要があるという事実に制約されます。さらに、ビルドシステムが適用するその他の制約。 結局のところ、clangはコンパイラのフロントエンドであり、APIを使って独創的であるため、入力は少なくとも有効なC ++コードに非常に近い必要があります。使用する新しい構文を定義できるようにする準備があるかどうかはわかりませんが、これを正しく解析してclangプロジェクトに追加する方法を開発する必要があることは明らかです。これ以上期待することは、clangプロジェクトに範囲外の何かを含めることです。 問題ない。一部の何もしないマクロ関数がこのタスクを処理できると思います。 私が説明していることを確認する別の方法は、言語自体で利用できるより限定されたツールを使用して実装する代わりに、ソースコードのAST(clangとそのAPIのおかげ)を操作することにより、ランタイムC ++を使用してメタプログラミング構成を実装することです。これには、明らかなコンパイルパフォーマンスの利点もあります(テンプレートが多いヘッダーでは、使用頻度に比例してコンパイルが遅くなります。コンパイルされたものの多くは、慎重に照合され、リンカーによって破棄されます)。 ただし、これには、ビルドプロセスに追加の手順を1つまたは2つ追加するコストと、ツールの一部として(確かに)多少冗長なソフトウェア(ただし、少なくとも単純なランタイムC ++)を記述する必要があります。 。 それは全体像ではありません。コア言語の機能では非常に困難または不可能であるコードを生成することで、はるかに大きな機能空間を確保できると確信しています。C ++ではテンプレート、マクロ、またはその両方のクレイジーな組み合わせを記述できますが、clangツールでは、セマンティックコンテンツへのフルアクセスを持ちながら、実行時に C ++で実現できる方法でクラスと関数を変更できます。テンプレートとマクロ、その他すべてに加えて。 それで、なぜ誰もがまだこれをしていないのかと思っています。clangのこの機能は非常に新しく、clangのASTの巨大なクラス階層に誰も精通していないのでしょうか?それはそれではありえない。 おそらく、私はこれの難しさを少し過小評価しているだけですが、clangツールを使用して「コンパイル時の文字列操作」を行うことは、犯罪的にほぼ単純です。冗長ですが、非常に単純です。必要なのは、実際の実際のstd::string操作にマップする一連のno-opマクロ関数だけです。clangプラグインは、関連するすべてのno-opマクロ呼び出しをフェッチしてこれを実装し、文字列を使用して操作を実行します。このツールは、ビルドプロセスの一部として挿入されます。ビルド中に、これらのno-opマクロ関数呼び出しは自動的にその結果に評価され、プログラム内の単純な古いコンパイル時文字列として挿入されます。その後、プログラムは通常どおりコンパイルできます。実際、結果として得られるこのプログラムは、結果としてはるかに移植性が高くなり、C ++ 11をサポートする豪華な新しいコンパイラーを必要としません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.