フォン ノイマン アーキテクチャでは、プログラムとデータの両方がメモリに保存されるため、プログラムはそれ自体を変更できます。これはプログラマにとって有用ですか?いくつか例を挙げていただけますか?
2 に答える
変成作用
私の頭に浮かぶ (疑わしい) 使用例の 1 つは、メタモルフィック コンピューター ウイルスです。これらは、独自のマシン コードを別の意味で同等の表現に書き換えることで、シグネチャ ベースの検出から身を隠す悪意のあるソフトウェアです。
トランポリン
もう 1 つの (より複雑ですが、より一般的な) 使用例はトランポリンです。これは、ネストされた関数呼び出しに関する特定の問題を解決するための動的コード生成に基づく手法です。
JITコンパイル
私が考えることができる動的コード生成の最も一般的な使用法は、JIT (ジャストインタイム) コンパイルです。.NET や Java などの最新の言語は、ネイティブ マシン コードにコンパイルされるのではなく、ある種の中間言語 (バイトコードと呼ばれます) にコンパイルされます。このバイトコードは、プログラムの実行時に (ターゲット アーキテクチャ用に作成された仮想マシンによって) 解釈されます。同時に、バックグラウンド プロセスは、コードのどの部分が頻繁に実行されるかをチェックします。これらのパーツは、最大のパフォーマンスを得るために、ネイティブのマシン言語に動的にコンパイルされる可能性が高くなります。これはすべて、プログラムの実行時に発生します。
セキュリティへの影響
覚えておくべきことの 1 つは、データをコードとして解釈できる可能性は、コンピューター ソフトウェアのセキュリティ ホールを悪用するのに役立つということです。これが、最新のハードウェアとオペレーティング システムの傾向として、コードの分離を有効にし、可能であれば強制することさえある理由です。およびデータ ( NX ビットおよびDEPも参照)。
同様の(非常によく書かれ、回答された)質問への回答を参照することで、これに最もよく答えることができます.StackOverflow-ホモイコニックで「無制限の」自己修正コード+ Lispは本当に自己修正ですか? . 答えは、「コードはデータ」を次のレベルに引き上げることで知られるファミリー言語である Lisp に焦点を当て、AI での使用を探ります。