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

# はじめに
こんにちは、製造業でデータエンジニアをやっているKatoと申します。今回はエンジニアおすすめの[技術書紹介記事](https://qiita.com/e99h2121/items/1b243efb1499527f0701)などでよく見かける[なぜプログラムは動くのか](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%93%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84-ebook/dp/B094J3CK1C/ref=sr_1_1?adgrpid=51361540737&gclid=CjwKCAjwtcCVBhA0EiwAT1fY717qyX_kSvHyAh1PE_ALxsPiIqKdrrqs66WamrWb8yW-ZyTkGRN5bRoC5UIQAvD_BwE&hvadid=338518033641&hvdev=c&hvlocphy=1009802&hvnetw=g&hvqmt=e&hvrand=15415006210521371012&hvtargid=kwd-334108908845&hydadcr=27265_11561133&jp-ad-ap=0&keywords=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B&qid=1655729976&sr=8-1)を読んだので、重要であると感じた項目とその感想をまとめていきます。本書のおすすめ記事です。この記事を読んで、理解が曖昧だなと感じ、「買ってみようかな」となればこの記事を書いた甲斐があります。~~そう思った方はぜひLGTMしてください！！~~
# 概要
エンジニア歴半年の私が「なぜプログラムは動くのか」を読んで、半人前ながらその内容からの発見と感想を記述していきます。章の始まりに必ずウォーミングアップという名の問がついており、この問に答えられなければその章はしっかりと読むようにしました。内容の理解度を確認させてくれるのはありがたいことです。私の場合、章の内容の理解が甘かったことがいくつかありました。気づきがあった章を例として挙げると以下のようなことがあります。
### 第1章　プログラマにとってCPUとはなにか
CPUに関する内容ではCPUの構造やCPUは何ができるのかなどの解説があり、抽象的だったイメージがより具体的なイメージになりました。
### 第9章　OSとアプリケーションに関係
OSとアプリケーションの関係ではOSの歴史からOSの内容（dllファイルやobjファイルなど）を解説によりOSの存在はなんとなく意識していましたが、内容を知ることによってOSとは何者かのかを具体的に理解することができました。    

# 背景
## 軽い自己紹介
私はエンジニア歴は半年。仕事の内容はデータ分析基盤の構築やSQLでのデータ集計やデータクレンジング作業の自動化などを担当しています。そのほか情報システムとしては他部署の~~IT介護~~ヘルプデスク対応や基幹システムの管理を担当しています。
## 本書を読もうと思った理由
私は情報系の学位や専門的な教育など受けていなかったため、基礎的な内容の理解のために基本情報技術者の試験に挑戦しています。試験対策の気持ち半分、基礎的な内容の理解を深めようという理由で本書を読み始めました。
# 要点
## 第1章　プログラマにとってCPUとはなにか
- CPU内部の構造  
    レジスタ・制御装置・演算装置・クロック
- CPUはレジスタの集合体
- 条件分岐と繰り返しの仕組み
- CPUにできることは、いたって簡単  
    データ転送命令・演算命令・ジャンプ命令・コール/リターン命令
## 第2章　データを2進数でイメージしよう
- ところで2進数とは？
- コンピュータ処理に都合のいい「2の補数」  
    2の補数の計算は暗記をしていたがなぜ反転して+1をするのが良いのかを例としての計算があり、納得できました。
- 論理演算をマスターするコツ
## 第3章　コンピュータが小数点の計算を間違える理由
- 0.1を100回加えても10にならない
- コンピューターが計算を間違う理由  
    本書で取り上げれらている例も分かりやすく、実際に計算をおこないどのような不具合が発生しているのかを実感することができます。
- 浮動小数点とは
- 2進数と16進数
## 第4章　四角メモリーを丸く使う
- メモリーの物理的な仕組みはシンプル  
    メモリーICのピンに電圧がかかって0, 1を表している簡単な仕組みですが、意外とこのようなハード的な説明が少ないと感じていたので、このような説明があると基本からの理解を確かめることができます。
- メモリーの論理的なイメージはビルディング
- スタックとキュー、さらにリング・バッファ
- 2分探索木は効率的にデータを探せる  
    メモリーの基本的なイメージから実際に使用されている構造の内容と利用方法を紹介してくれます。スタックやキューの考え方などを基本情報でもよく問われる内容なので復習に丁度良いと思います。
## 第5章　メモリーとディスクの親密な関係
- メモリーに読み出さないと実行できない  
    これ、恥ずかしながら私の理解が甘かった内容なのですが、ディスク内のプログラムはメモリーに読みださないと実行できないとのこと。ゲームなどのNow Loading...はディスクのデータをメモリーに読み込んでいたのですね...。
- ディスク・キャッシュと仮想記憶
- メモリーを節約するプログラミング手法
- ディスクの物理構造も見ておこう
## 第6章　自分でデータを圧縮してみよう
- ラングレス法の仕組み
- モールス符号にハフマン法の基礎を見た  
    トンツーですね。ハガレンを履修している人はみんな知っているあの信号です。
- ハフマン符号は木を用いて作る
- 可逆圧縮と非可逆圧縮
## 第7章　プログラムはどんな環境で動くのか
- 動作環境 = OS + ハードウェア
- CPU以外のハードウェアの違いを乗り越えたWindows
- BIOSとブート・ストラップ
## 第8章　ソース・ファイルから実行可能ファイルができるまで
- コンピュータはネイティブ・コードしか実行できない
- ソースコードを翻訳するのかコンパイラ  
    コンパイラの説明にて「ソースコードをネイティブ・コードの変換するのがコンパイラです」など書いてあることがあるが、その中身に関しての記述が少なく、なんとなくコンパイラというものを覚えていました。本書の説明において少し具体的な内容を理解することによってコンパイラに対するイメージがより具体的になりました。
- コンパイルだけでは実行可能ファイルが得られない
- 実行可能ファイルに実行に必要なことは？
## 第9章　OSとアプリケーションの関係
- 歴史に見るOSの機能  
    モニター・プログラムから初期のOSの誕生など試験勉強だけでは得られない知識でとても新鮮に感じました。
- OSの存在を意識しよう  
    この段落に金言があります。胸に刻みましょう。
    > OSのおかげでプログラマは楽ができます。ただし、楽をするだけではダメです。なぜ楽ができるのを知ってから、楽をしてください。
- OSと高水準言語がハードウェアを抽象化してくれる
- WindowsというOSの特徴
## 第10章　アセンブリ言語からプログラムの本当の姿を知る
- アセンブリ言語はネイティブ・コードと1対1に対応
- スタックへのデータの格納
- 関数を呼び出す仕組み
- グローバル変数とローカル変数の仕組み
- 繰り返し処理の仕組み
- 条件分岐の仕組み
- アセンブリ言語を経験する意義
## 第11章　ハードウェアを制御する方法
- ハードウェアと入出力をおこなうin命令とout命令
- 割り込みでリアルタイムな処理が実現する
- 大量のデータを短時間に転送できるDMA
- 文字やグラフィックスが表示される仕組み
## 第12章　コンピュータに「学習」をさせるには
- 機械学習とは？
- サポートベクトルマシン
- 機械学習で手書き文字の認識を行う
- クロスバリデーションをやってみる
# 結論
「なぜプログラムは動くのか」の重要と感じた内容とその内容に関する所感をつらつらと記述していきました。コンピュータの仕組みやプログラムの動作原理など曖昧な理解であった部分が本書のおかげで具体的にわかる部分が増えました。今回の内容で「この部分の理解が足りないな」と感じた方はぜひ本書を手に取ってみてはいかがでしょうか。基本情報技術者対策としては直接的な対策にはなりませんが、補助的な読書として読んでもいいかもしれません。今後も読書記録兼おすすめ記事として記事を書いていこうと思いますのでよろしくお願いいたします。