何かを生成できる場合、それはコードではなくデータです。
後でそのコードがデータであると規定しているので、命題は「何かを生成できるなら、そのことはコードではない」に帰着します。では、Cコンパイラによって生成されたアセンブリコードはコードではないと言いますか?手作業で書いたアセンブリコードと正確に一致した場合はどうなりますか?お望みならそこへ行くことはできますが、私はあなたと一緒にはいません。
代わりに、「コード」の定義から始めましょう。技術的になりすぎることなく、この説明の目的のためのかなり良い定義は、「計算を実行するための機械で実行可能な命令」です。
それを考えると、ソースコード生成のこの考え全体は誤解ではないでしょうか?
はい、あなたの最初の命題はコードを生成できないことですが、私はその命題を拒否します。「コード」の私の定義を受け入れれば、一般的なコード生成に概念的な問題はないはずです。
つまり、何かのコードジェネレーターがある場合、そのパラメーターを、必要なパラメーターを受け取り、「生成される」コードが実行するはずの正しいアクションを実行できる適切な関数にしてみませんか。
まあ、それはその性質ではなく、コード生成を採用する理由についてのまったく異なる質問です。コードジェネレータを作成または使用する代わりに、結果を直接計算する関数を作成するという代替案を提案しています。しかし、どの言語で?誰もがマシンコードで直接書く時代は過ぎ去り、他の言語でコードを書く場合、実際に実行するプログラムを生成するためにコンパイラーやアセンブラーの形のコードジェネレーターに依存します。
では、なぜJava、C、Lisp、その他何でも書くのが好きですか?アセンブラーですか?これらの言語は、実行したい計算の詳細を簡単に表現できるデータと操作の抽象化を提供するため、少なくとも部分的にはそうだと断言します。
同じことは、ほとんどの高レベルのコードジェネレーターにも当てはまります。プロトタイプの場合は、おそらくのようなスキャナとパーサジェネレータですlex
とyacc
。はい、スキャナーまたはパーサーをCまたは選択した他のプログラミング言語(未加工のマシンコードでさえ)で直接書くことができます。ただし、非常に複雑な問題の場合、lexやyaccなどの高レベルの専用言語を使用すると、手書きコードの記述、読み取り、および保守が容易になります。通常、はるかに小さくなります。
また、「コードジェネレータ」が何を意味するのかを正確に考慮する必要があります。Cの前処理とC ++テンプレートのインスタンス化は、コード生成の演習であると考えています。これらに反対しますか?そうでない場合は、メンタル体操をいくつか実行して、それらを受け入れるがコード生成の他のフレーバーを拒否することを合理化する必要があると思います。
パフォーマンス上の理由で行われている場合、それはコンパイラの欠点のように聞こえます。
どうして?基本的には、ユーザーがデータをフィードするユニバーサルプログラムが必要であり、一部は「命令」に、その他は「入力」に分類され、計算を実行して「出力」と呼ばれるデータをさらに出力します。(特定の観点から、そのような汎用プログラムを「オペレーティングシステム」と呼ぶかもしれません。)プログラム?2つのプログラムには、異なる特性と異なる機能があります。
2つの言語を橋渡しするために行われている場合、それはインターフェースライブラリの欠如のように聞こえます。
普遍的なものからある程度のインターフェースライブラリを持っていることは、必然的に良いことだと言います。おそらくそうなりますが、多くの場合、そのようなライブラリは大きくて記述や保守が難しく、さらには遅くなることさえあります。そして、実際にそのような獣が手元の特定の問題に対処するために存在しない場合、コード生成アプローチが問題をはるかに迅速かつ簡単に解決できる場合、誰が作成することを主張しますか?
ここに何かが足りませんか?
いくつかのことを考えます。
コードもデータであることを知っています。私が理解していないのは、なぜソースコードを生成するのですか?なぜそれをパラメーターを受け入れ、それらに作用することができる関数にしてみませんか?
コードジェネレーターは、ある言語で記述されたコードを、通常は低レベルの別の言語のコードに変換します。それでは、なぜ人々が複数の言語を使用してプログラムを作成したいのか、特に主観的に異なるレベルの言語を混在させたいのではないかと尋ねています。
しかし、私はすでにそれに触れました。特定のタスクの明快さと表現力に一部基づいて、特定のタスクの言語を選択します。コードが小さいほど平均してバグが少なく、保守が容易であるため、少なくとも大規模な作業では、高レベルの言語へのバイアスもあります。しかし、複雑なプログラムには多くのタスクが関係しており、多くの場合、ある言語でより効果的に対処できるものもあれば、別の言語でより効果的または簡潔に対処できるものもあります。ジョブに適切なツールを使用することは、コード生成を使用することを意味する場合があります。