問題タブ [self-modifying]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - x86 命令キャッシュはどのように同期されますか?
私は例が好きなので、C言語で自己修正コードを少し書きました...
...明らかに動作します:
しかし、正直なところ、私はそれがうまくいくとはまったく予想していませんでした。への最初の呼び出しで を含む命令c[2] = 0
がキャッシュされることを期待していましたc
。その後、への連続したすべての呼び出しは、へc
の繰り返しの変更を無視しますc
(何らかの方法で明示的にキャッシュを無効にしない限り)。幸いなことに、私の CPU はそれよりも優れているようです。
CPUc
は、命令ポインタが(上記のmmapされたメモリへの呼び出しと同様に)大規模なジャンプを行うたびにRAM(RAMに存在すると仮定しても)を命令キャッシュと比較し、一致しない場合はキャッシュを無効にすると思います(すべて?)、しかし、私はそれについてより正確な情報を得ることを望んでいます. 特に、この動作が予測可能 (ハードウェアと OS の違いを除いて) であると見なされ、信頼できるかどうかを知りたいですか?
(おそらく Intel のマニュアルを参照する必要がありますが、それは何千ページにもわたる長さであり、迷子になりがちです...)
pic - PIC16: 自己修正コード
マイクロチップPIC16マイクロコントローラには、次のようなプログラムがあります。
私のコードの通信モジュール (表示されていません) で、プログラム コードを変更する可能性を実装したいと思います: "off" と "period" に割り当てられた値を変更します。
注: 変数の割り当て (リセット時に失われる) はしたくありませんが、デバイスに保存されているプログラムに永続的な変更を加えたいと考えています。
誰かが私を正しい方向に向けることができますか? 理想的には、これを C で実装したいと考えています。これを行う最も簡単な方法は何ですか? 簡単に実装するには、「オフ」と「期間」を変数、ポインター、または定数にする必要がありますか?
どうもありがとう!
linux - 自己変更コードでブレークポイントを切り替えるGdb
実行中に独自のコードを変更するプログラムがあります。コードにブレークポイントを設定しようとすると、コードを変更するとブレークポイントが何らかの形で削除されるため、ブレークポイントが壊れることはありません。
ハードウェアブレークポイントについて聞いたことがありますが、ハードウェアでサポートされていないことがgdbに記述されています。自己修正コードに割り込む他の方法はありますか?
assembly - x86 アセンブラーで教育目的の最小限の自己変更コードの例を見つけますか?
教育目的で x86 アセンブラーの自己変更コードを示す数行の長い例を探しています (何か意味のあることをする必要はありませんが、コード自体を読んだときにそれを実行する必要があります)。
Web を少しブラウジングしましたが、すべての例が複雑すぎるか、説明が不十分です。適切な場所を見逃している可能性があるため、お気軽にリンクまたはコードを提案してください。
optimization - 自己変更コードを生成する単純なプロセッサ上の高級言語用の最新のコンパイラはありますか?
キャッシュや分岐予測が登場する前の時代には、特定の種類の最適化のために自己変更コードを作成することが奨励されていない場合でも、比較的一般的でした。Amiga などの 8 ビットから初期の 32 ビットまでの時代に、アセンブラーで記述されたゲームやデモでおそらく最も一般的でした。
当時のコンパイラが自己修正アセンブラまたはマシンコードを発行したかどうかはわかりません。
私が疑問に思っているのは、それを行う現在/最新のコンパイラがあるかどうかです。明らかに、キャッシュを備えた強力なプロセッサでは役に立たないか、難しすぎます。
しかし、組み込みシステムで使用されるような非常に多くの単純なプロセッサについてはどうでしょうか? 自己変更コードは、単純な/8ビット/組み込みプロセッサ向けの最新のコンパイラによって実行可能な最適化戦略と見なされていますか?
「 Is there any self-improving compiler around? 」という同様のタイトルの質問がありますが 、同じ主題に関するものではないことに注意してください。
コンパイルするコードを改善するコンパイラではなく、それ自体を改善するコンパイラについて話していることに注意してください。
python - Pythonの関数のすべての行で操作を装飾/実行する方法はありますか?
次のように、すべての操作を実行する前に、値をチェックするなどの繰り返しを行う関数またはメソッドがあるとします。
これらのチェックは繰り返し行われ、多くの時間とキーボード スプリングを浪費することになります。
たとえば、操作関数を制御do_operation_N
できる場合は、ブール値をチェックするもので関数を装飾できます。
しかし、個々の操作を制御できない場合はどうでしょdo_operation_N
うか? 関数またはメソッドの各行に対して同じチェックを実行したい場合、各操作行に明示的に書き込まずに「挿入」する方法はありますか? たとえば、次のことができるデコレータ マジックはありますか?
これを実現する方法があれば、デコレータを使用するかどうかは気にしません。「関数/メソッドXのすべての行について、最初にYを実行してください」と言う方法が欲しいだけです。
上記のメソッドの「魔法の」例は、do_call
私が求めているものの省略形ですが、個々の行の順不同の実行で深刻な問題が発生します (たとえば、関数の最初の行が変数の割り当てであり、その2 番目はその変数の使用であり、順不同で実行すると問題が発生します)。
明確にするために:関数の実行の行ごとの順序を外部から制御する機能は、私が達成しようとしているものではありません。理想的には、自然な実行順序で操作を実行するものを実装するだけです毎回myfunc
何かをします。「何かをする」が「関数またはメソッドを呼び出す」(代入、if
チェックなどを除く)に限定される場合、それは問題ありません。
c++ - #include-file の内容を cpp-file のコンパイル時の定数にするにはどうすればよいですか?
私はファイルを持っていますmodule.hpp
とmain.cpp
プログラム
...?...
ヘッダー ファイルの内容をここに出力するには、何を入力すればよいですか?
基本的な考え方は
しかし、複数行の文字列は C++ 11 でのみ使用でき、複数行の文字列内で#include
は機能しません(これは良いことです)。
gcc の移植性のない方法があれば...それが始まりです。
明確化(更新): 置換はコンパイル時に行う必要があります。
expert-system - エキスパート システムの自己修正ルール
経験から学ぶことができるように、システム自体によってエキスパート システムのルールを変更する方法はありますか? -提案はいつでも大歓迎です.Thanks!
assembly - self-modifying code algorithm
some programs generates the executable code at run-time. i.e computer virus, packed binary. this makes static analysis very difficult.
aside from packing algorithms, is there any general algorithm for self-modifying code generation? or compiler support? where can I get related documentation or paper? and what is the difference between self-modifying code and polymorphic code?
I am curious.
thank you in advance.
ruby - Ruby の自己変更コード
Ruby での自己変更コードの記述について懸念があります。自己変更とは、コード ブロックを入力値として受け取り、これに基づいて別のコード ブロックを出力する関数を記述できることを意味します。(実行時にメソッドを再定義するなどの基本については質問していません。)
私がやりたいことは、たとえば、次のブロックを持つことです。
a
引数とd
が本体でまったく使用されていないことに気付くことができるので、たとえば関数が必要です。#strip
それらを削除するには、
次のように記述した場合と同じ結果が得られるはずです。
Lisp では、Lisp コードは簡単に操作できるデータであるため、これは簡単です。しかし、Ruby コードの操作方法がわかりません。私はそれを解析することができます。に
しかし、これに基づいて、変更されたブロックをどのように書くのでしょうか? 私がやりたいことの他の例は、例えばです。
これまでのところ、Ruby では、何かが不可能であることを認めなければならない状況に遭遇したことはありません。しかし今回は、直感的に、美しく構造化されたコードと、話す構文がほとんどないコード (Lisp など) の根本的な弱点に遭遇した可能性があることを教えてくれます。教えてください。