「プログラムはなぜ動くのか」を読んだのでメモ

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

ソフトウェアエンジニアに必要となる技術は日々めまぐるしく変わっています。 次々に出てくる新しい技術にエンジニアは常にキャッチアップしていく必要があったりして結構大変だったりします。でも、どんな新しい技術にしても、その根幹の技術はいつも変わらなかったりします。本書の内容は、タイトル通り、そういったソフトウェアエンジニアリングの根っこの部分を楽しく理解できるもの。ってことで読んでみました。

結論から。プログラムはなぜ動くのか。理解できた限り「プログラミングはコンピューターへの命令(機械語)に変換され、メモリにロードされ、CPUが命令を実行するから。」って感じ。そして、それを理解する一番わかりやすい方法はどうやらアセンブリ言語を理解することだってこと。

アセンブリ言語は、どのメモリのデータをどのCPUレジスタがどんな計算をするっていう命令がダーッと書いてある命令。プログラミングは機械語に変化されるが、我々は機械語は読めない。しかし、機械語アセンブリ言語にほぼ1対1で変換できる機械語に近いもの。なので、アセンブリ言語を読むと、なるほど、プログラミングはこんな意味を持って機械語に変換されるのか、というのがよく分かる。

おもしろいので気になるかたは読んでみてください。以下メモ。

CPU

  • レジスタの集合
  • 機械語レジスタをどう使うかが書かれている
  • CPUがやってること = マシン語ができること
    • 1.データ転送命令
    • 2.演算命令
    • 3.ジャンプ命令
      • 条件分岐、繰り返し
    • 4.コールリターン命令
      • 関数、呼び戻し

メモリ

  • アドレス信号のピンでどこに書き込む、読み込むかを命令する
  • データ信号ピンで何を書き込むかを指定できる

f:id:shogo807:20181115005745j:plain

  • 上の写真だとデータ信号ピンは8ピンあるので8ビット(1バイト)
  • 上の写真だとアドレス信号ピンは10ピンあるので1024通りの書き込み/読み込み場所がある
  • 一つの書き込みは1バイト
  • データ型で、何個使える決める

ディスク

  • 1セクタに書き込めるのは、512バイト

メモリロード

  • プログラミングをコンパイルしてマシン語
  • マシン語をロードしてメモリに乗せる
  • メモリには変数、関数、スタック、ヒープ領域を乗せる
  • ヒープ領域はプログラマーが管理
  • スタックは一時的にローカル変数と引数

ハードウェア(I/O)

  • インプットはポートで指定されたデータをレジストリに入れる
  • アウトプットはレジストリのデータをポート指定で出力
  • ポートは周辺機器の接続部にあるデータの港みたいなところ