不定期ウィークリィFYI:いくらバイト列を眺めてもCPUの働きは見えてこない

いまどきは、ソースプログラムだけを眺めて処理の流れをおいかけるわけですが。

アセンブラ世代は無意識に、プログラム、データ、レジスタとフラグをフラットに眺めます。

レジスタとフラグはCPU内にあり、プログラムとデータは主記憶上にある場合が多いですね。

(主記憶上の決まったアドレスをレジスタやフラグとして用いる計算機もありうるわけですが、バスが競合して性能的に不利なので、分けることが多いでしょう)

同じプログラムでも、レジスタやフラグの状態が異なれば、実行結果は異なります。

実行結果には、データの変化だけではなく、レジスタやフラグの変化が含まれます。

マクロアセンブラや、いわゆる高級言語を使うと、サブルーチンや関数の入り口出口で、レジスタやフラグの変化を退避/復帰するのが簡単になります。

そうすると、レジスタやフラグの変化はサブルーチンや関数内部だけで考えればよくなります。

これはただの構造化であって、サブルーチンや関数内部では相変わらずレジスタやフラグの変化はプログラムの実行のされ方(これを動作と呼ぶ)に影響します。

LLなんかでスクリプトを書いていると、この低レイヤー側の「都合」がうまく隠蔽されるので、すっかりわすれそうになります。

この本質についてもう少し考えた方が良い気がします。

さて、この「今、CPU or スレッド or コンテキストの状態はどうなってんの?」という問題について、関数型なら考えなくてよいとか、プログラムとデータ(どっちも本質的には同じバイト列)から静的に解析できるとか、もうちょっと深く考えた方が良い気がします。