『なぜプログラムは動くのか』を読んだ

公開日: 

目次

  • プログラマにとって CPU とは何か
  • データを 2 進数でイメージしよう
  • コンピュータが少数点数の計算を間違える理由
  • 四角いメモリーを丸く使う
  • メモリーとディスクの親密な関係
  • 自分でデータを圧縮してみよう
  • プログラムはどんな環境で動くのか
  • ソースファイルから実行可能ファイルができるまで
  • OS とアプリケーションの関係
  • アセンブリ言語からプログラムの本当の姿を知る
  • ハードウェアを制御する方法
  • コンピュータに『学習』させるには

感想

基礎的だけど、詳細すぎない粒度

  • CPU とかメモリっていうのは結局のところたくさんのトランジスタから構成された IC やで
  • メモリに値を CPU がレジスタに移動させて計算して、結果をメモリに戻すような処理を繰り返してるんやで
  • わかりにくいからアセンブリ言語で見ていこか

こんくらいのノリです。別にアセンブリ言語を全く知らなくても、解説が載っているのでなんとなくメモリやレジスタの関係や処理の流れがイメージしやすいようになっています。 実際自分はこの本でアセンブリ言語のコードを初めてみました。それでも余裕で『へぇ〜』ってなります。

例えば、本のなかのコードを引用すると

mov1 -4(%ebp), %eax    ---メモリーの値をeaxに読み出す
add1 -8(%ebp), %eax    ---メモリーの値をeaxに加算する
mov1 %eax, -12(%ebp)   ---eaxの値(加算結果)をメモリーに格納する

アセンブリ言語知らなくてもイメージできるのはわかるかと思います。

普段のプログラミングとの関係

自分は普段業務では JavaScript を用いて開発していますが、JavaScript はいわゆる高水準言語と呼ばれるものでコンピュータへの命令が大幅に抽象化されています。 言い換えれば、メモリや OS のことはあまり考えなくてもそれなりの開発はできるということです。 せっかく高水準言語を使ってるんだからそこまで深いところは知る必要はないという意見もありそうですが、深いところを知ることでイメージしやすくなったり高水準言語を用いた開発にも役に立つことはあると思うので学んでおいて損はなさそうです。(クソ雑魚感想)

読みやすすぎわろた

以前にもこの『なぜ』シリーズと呼ばれる本を読みましたが、総じて言えるのはとても読みやすい。 図が多かったり、コラム的な要素が多いのが理由かもしれませんが、別にしんどくなくスラスラと読めてしまいます。 自分の場合は分厚い技術書とかだと集中力がきれて数日かけないと読めないので、この『なぜ』シリーズはかなりおすすめです。

学んだこと雑吐き出し:coffee:

CPU の構成要素は以下の 4 つである

  • 制御装置
  • 演算装置
  • クロック
  • レジスタ

レジスタには複数の種類がある

  • eax はアキュムレータで演算に使う値を格納するレジスタ
  • ebp はベースレジスタでメモリーのアドレスを格納するレジスタ

CPU でできる命令は意外と限られてる

  • データ転送命令
    • レジスタとメモリー、メモリーとメモリー、レジスタと周辺装置の間でデータを読み書きする
  • 演算命令
    • アキュムレーターで算術演算、論理演算、比較演算、シフト演算を行う
  • ジャンプ命令
    • 条件分岐、繰り返し、無条件のジャンプを行う
  • コール/リターン命令
    • 関数を呼び出す/呼び出しもとに戻る

これだけ!?:scream_cat:

メモリとは

  • アドレスとデータを格納できる領域がセットになったもの
  • 1 アドレス当たり、1 バイトのデータを格納できる
  • 1 アドレスを 1 階として、各フロアに 1 バイトのデータが格納できるビルディングと考えると分かりやすい

システムコールとは

前 linux の本読んでもシステムコールは全然ピンと来なかったから自分なりに理解できたのが嬉しい

ハードウェアは OS によって抽象化されているため、プログラマはハードウェアのことを意識せずに効率的にコーディングができている

OS は内部的にハードウェアを操作する関数を持っている、C 言語などの高水準言語の printf()などはコンパイルされた結果内部的にこのような OS の関数を呼び出している。この OS の関数を呼び出す行為をシステムコールという。コンパイルされた結果、システムコールを行うので、C 言語などの高水準言語は OS に依存しない。専用のコンパイラを通すことで、特定の OS のシステムコールを行う。

最後に

普段 JavaScript で開発しているので実際どのようにコンピューターがプログラムを実行しているかをあまり意識しないですが、この本を通して若干自分の頭の中には刻まれたと思うので総じてよかったです。

では

Bye