タグ付けされた質問 「code-generation」

27
ソースコード生成はアンチパターンですか?
何かを生成できる場合、それはコードではなくデータです。 それを考えると、ソースコード生成のこの考え全体は誤解ではないでしょうか?つまり、何かのコードジェネレーターがある場合、そのパラメーターを、必要なパラメーターを受け取り、「生成される」コードが実行するはずの正しいアクションを実行できる適切な関数にしてみませんか。 パフォーマンス上の理由で行われている場合、それはコンパイラの欠点のように聞こえます。 2つの言語を橋渡しするために行われている場合、それはインターフェースライブラリの欠如のように聞こえます。 ここに何かが足りませんか? コードもデータであることを知っています。私が理解していないのは、なぜソースコードを生成するのですか?なぜそれをパラメーターを受け入れ、それらに作用することができる関数にしませんか?

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

6
ネストされた関数呼び出しをインライン化できる場合、プログラムはなぜ呼び出しスタックを使用するのですか?
コンパイラに次のようなプログラムを取らせてはいけません。 function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; それを次のようなプログラムに変換します。 function c(b) { return b^2 + 5 }; これにより、コンピュータがc(b)の返信先アドレスを覚える必要がなくなりますか? プログラムを格納し、コンパイルをサポートするために必要なハードディスク領域とRAMの増加が(それぞれ)呼び出しスタックを使用する理由だと思います。あれは正しいですか?

4
アセンブリからマシンコードへの移行方法(コード生成)
コードを機械コードにアセンブルするステップを視覚化する簡単な方法はありますか? たとえば、メモ帳でバイナリファイルを開くと、マシンコードのテキスト形式の表現が表示されます。私はあなたが見る各バイト(シンボル)がそのバイナリ値に対応するASCII文字であると仮定しますか? しかし、アセンブリからバイナリにどのように移行するのでしょうか。舞台裏で何が起こっているのでしょうか??

2
設計上の決定-</ p>なしで<p>を生成する理由
tl; dr htmlを生成する広く使用されているいくつかのプログラムは、ブラウザーが適切に段落を閉じると仮定して、閉じているタグではなく、開く段落タグのみを生成します。 一見すると、ブラウザが段落を適切に閉じるという仮定は正しくないと思われます。私の解釈は正しいですか?より一般的には、この種の決定にはどのようなトレードオフが関係していますか? moinmoinソースコードを参照すると、次のコード行が目を引きました。 # We only open those tags and let the browser auto-close them: _auto_closing_tags = set(['p']) (ソース) 実装の残りの部分を読んだ後、確かに、moinmoinがそのページの1つに対してhtmlコードを生成するとき、適切な場合は段落開始タグを正しく生成すると同時に、段落終了タグ(簡単に実行できるにもかかわらず)。 私の特定の、かなり珍しいユースケースでは、この動作は正しくありません。バグレポートを送信したり、動作を変更したりしたいと思います。ただし、この設計上の決定は思慮深く行われたようです。私はこれが一般的に正しい動作であるかどうかを知ることができるほど、HTML標準またはさまざまなブラウザ実装の複雑さに精通していないため、この動作を修正/変更する本能は見当違い。 このコードは、ブラウザの実装について有効な仮定を立てていますか?生成されたhtmlは有効ですか?より一般的には、ここで見落としているトレードオフは何ですか?

4
自動コードジェネレーター[終了]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 私の同僚の1人は、自動コードジェネレーターを使用するのが好きです。自動コードジェネレーターは、文書化が不十分で保守が非常に難しい大量のコードを作成します。 コードジェネレーターを使用するコストは、作成までの時間を短縮するために、メンテナンスの手間をかける価値がありますか?

2
言語開発フレームワークの使用はどれくらい簡単ですか?
これは、フレームワークの形式で言語設計で使用される概念を抽象化することを目的とする抽象化プロジェクトと呼ばれるプロジェクトに焦点を当てた一連の質問の一部です。 構造タイピングに関連する別のページは、ここで表示できます。フレームワークに関する質問と投稿する適切な場所に関連するメタトピックは、ここにあります。 言語開発フレームワークを使用するのはどれくらい簡単ですか? 大規模なコード生成フレームワークを作成しました。このフレームワークには、言語固有のコンパイラーに結果を送信する機能も含まれています。使いやすさのトピックは、そのようなフレームワークの例の1つです。CodeDOM、またはCode Document Object Modelです。 マイクロソフトによって書かれたフレームワークであり、一般的なコード構造を記述しますが、一般に多くのことを省き(式強制)、特定の構成体の表現では少し抽象的である傾向がありました。 CodeDOM は、使用されるタイプが汎用インターフェイスである場合、PrivateImplementationTypeonの発行を適切に処理しませんCodeMemberMethodでした。CodeDOMは、最初のコードジェネレーターを作成した最初の理由でした。 フレームワークを簡素化するために私がやろうとしていることの1つは、何かをするために必要な作業量を減らし、アクションとそれらのアクションを構成する特定のタイプに焦点を当てることです。 ここに、私が書いているフレームワークがどのように機能するかを並べて比較します。 //Truncated... /* * * From a project that generates a lexer, this is the * state-&gt;state transition character range selection logic. * */ var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference())); //... char start = rangeElement.B.Value.Start; char end = rangeElement.B.Value.End; …

5
コンパイル時の値パラメーターを使用したJavaクラスの生成
クラスが同じ基本的な動作、メソッドなどを実装しているが、そのクラスの複数の異なるバージョンが異なる用途に存在する可能性がある状況を考えてみましょう。私の特定のケースでは、ベクトル(リストではなく幾何学的ベクトル)があり、そのベクトルは任意のN次元ユークリッド空間(1次元、2次元など)に適用できます。このクラス/タイプはどのように定義できますか? これは、クラステンプレートがパラメーターとして実際の値を持つことができるC ++では簡単ですが、Javaにはそのような贅沢はありません。 この問題を解決するために私が考えることができる2つのアプローチは次のとおりです。 コンパイル時に可能な各ケースの実装を持つ。 public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 …

3
コンパイラの作成コンパイラ-使用方法と機能に関する洞察
これは、言語設計で使用される概念をフレームワークの形で抽象化することを目的とした抽象化プロジェクトへの姉妹プロジェクトに焦点を当てた一連の質問の一部です。姉妹プロジェクトはOILexerと呼ばれ、一致時にコードインジェクションを使用せずに、文法ファイルからパーサーを構築することを目的としています。 構造タイピングに関連するこれらの質問に関連する他のいくつかのページは、ここに表示され、使いやすさはここにあります。フレームワークに関する問い合わせに関連するメタトピックと投稿する適切な場所は、こちらにあります。 特定の文法から解析ツリーの抽出を開始するところまで来ています。その後、DFAを使用して順方向パスを識別する再帰的降下パーサーが続きます(ANTLR 4のLL(*)と同様)。私はそれを開いて洞察を得るだろうと考えました。 パーサーコンパイラでは、どのような機能が理想的ですか? これまでのところ、実装されているものの簡単な概要です: テンプレート 特定の時点で何が有効であるかを把握しながら、予測を先読みします。 ルール内のリテラルを取得し、それらがどのトークンからのものであるかを解決するルール「非文字化」。 非決定的オートマトン 確定的オートマトン トークン認識のためのシンプルな字句状態マシン トークンの自動化方法: スキャン-コメントに役立ちます:Comment:= "/ *" Scan( "* /"); 減算-識別子に便利です:識別子:= Subtract(IdentifierBody、Keywords); 識別子がキーワードを受け入れないようにします。 エンコード-ベースN遷移のシリーズXカウントとしてオートメーションをエンコードします。 UnicodeEscape:= "\\ u" BaseEncode(IdentifierCharNoEscape、16、4); 16進数の4遷移を使用して、Unicodeを16進数でエスケープします。これとの違い:[0-9A-Fa-f] {4}は、Encodeを使用した結果の自動化で、許可される16進値のセットをIdentifierCharNoEscapeのスコープに制限します。したがって、\ u005cを指定すると、エンコードバージョンは値を受け入れません。このようなことには重大な注意事項があります。控えめに使用してください。結果として生じる自動化は非常に複雑になる可能性があります。 実装されていないのはCST生成です。これを機能させるには、適切なコンテキストを引き継ぐように決定論的自動化を調整する必要があります。 興味のある方のために、T *y♯プロジェクトの元のフォームをかなり印刷したものをアップロードしました。各ファイルは他のすべてのファイルにリンクする必要があります。それらに従うために個別のルールでリンクを開始しましたが、時間がかかりすぎました(自動化の方が簡単だったでしょう)。 さらにコンテキストが必要な場合は、それに応じて投稿してください。 編集5-14-2013:特定の言語でステートマシンのGraphVizグラフを作成するコードを書きました。 これがAssemblyPartのGraphVizダイグラフです。言語の説明でリンクされているメンバーは、そのルールのダイグラフを含む相対フォルダーにrulename.txtを持っている必要があります。例を投稿してから一部の言語の説明が変更されました。これは、文法に関することを簡略化するためです。これが興味深いgraphviz画像です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.