2012-01-03 19 views
4

Von Neumann architectureでは、プログラムとデータの両方がメモリに格納されているため、プログラム自体を修正することができます。これはプログラマーにとって便利ですか?いくつか例を挙げていただけますか?自己変更コードの使用例

+0

これはコンピュータアーキテクチャー上の問題であるため、簡単な例がありますか? TanenbaumによるStructured Computer Organizationの本を参照してください(第1章の問題とヒント:配列の算術について考えること) – gylns

+0

あなたの質問から、これを推測することはおそらく期待できません。また、私はその本を所有していません。 –

答えて

1

これは、同様の(非常によく書かれたと答えた)質問への答えをStackOverflow-Homoiconic and "unrestricted" self modifying code + Is lisp really self modifying?でも参照することによって、これに最もよく答えることができます。その答えは、 "コードはデータ"を次のレベルに引き上げるために知られているファミリー言語であるLispに焦点を当て、AIでその使用法を探求しています。私の心に来る

+0

LISPはAIに関するものではありません。 –

+1

Niklas、自然にLISPはAIよりはるかにですが、LISPの自己修正コードは、パフォーマンスがそれほど重要ではない(ただし、これらのareansは縮小しています) –

4

変成作用

ワン(疑わしい)ユースケースはmetamorphic computer virusesです。これらは、signature based detectionから自分自身のマシンコードを意味的に同等の表現に書き換えることによって、と見えるが異なると思われる悪意のあるソフトウェアです。

トランポリン

別の(より複雑でなく、より一般的には)ケースを使用し、ネストされた関数呼び出しと特定の問題を解決するために、動的コード生成に基づく技術trampoliningあります。

JITコンパイル

私は考えることができる動的なコード生成の最も一般的な使用法はJIT (just-in-time) compilationです。 .NETやJavaのような現代の言語は、ネイティブのマシンコードにコンパイルされるのではなく、ある種の中間言語(バイトコードと呼ばれます)にコンパイルされます。このバイトコードは、プログラムの実行時に(ターゲットアーキテクチャ用に記述された仮想マシンによって)解釈されます。同時に、バックグラウンドプロセスは、コードのどの部分が非常に頻繁に実行されるかをチェックします。これらの部分は、パフォーマンスを最大限に高めるために、ネイティブの機械語に動的にコンパイルされる可能性が高くなります。これはすべて、プログラムの実行中に発生します!

セキュリティへの影響

心に留めておくべき一つのことは、最新のハードウェアとオペレーティングシステムの傾向がであることが理由である、コードなどのデータを解釈する可能性がコンピュータソフトウェアのセキュリティホールを悪用するために有用であるということです可能であれば、コードとデータの分離を実行することもできます(NX bitDEPも参照してください)。

関連する問題