【読書メモ】プログラムはなぜ動くのか

最近、エラー対処の際に、そもそもの仕組みが分かってないと問題の切り分けができないよな…ってことに気が付いたので初心に戻ってプログラムがうごく「仕組み」を理解したい

# 第1章　

## プログラム
- プログラムとは
    - コンピュータに実行させる処理の順番を示すもの
    - 「何かを行う順番を示すもの」という意味
- プログラムの中身
    - 命令とデータ

## プログラムの実行のイメージ
1. プログラマがプログラミング言語でプログラム（ソースコード）を記述する
1. プログラムをコンパイルしてマシン語のEXEファイルに変換する
    - コンパイルとは
      - プログラミング言語で書かれたコンピュータプログラム（ソースコード）を解析し、コンピュータが直接実行可能な形式のプログラム（オブジェクトコード）に変換すること
     - 作成したデータの保存場所
        - ハード・ディスクなどのディスク媒体
1. プログラムの起動時に、（ディスク媒体に保存された）EXEファイルのコピーが、メモリ上に作成される
1. CPUがプログラムの内容を解釈・実行する

 # 第5章

 ## コンピュータの５大装置
コンピュータの５大装置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524160/2af90f7d-726a-657c-bdd8-6315ca61c5b7.png)
引用元：[プログラミング入門者向け：コンピュータの５大装置を解説](https://daeudaeu.com/devices/)

## メモリーとディスク
- **メモリーとディスクは、お互いの利点を生かし合い、お互いの欠点を補い合いながら、強調して動作をしている**
- 共通点
    - 両方「記憶装置」にあたる
- 相違点

|  |メモリー  |ディスク  |
|---|---|---|
|記憶  |電気的  |時期的  |
|速度  |高速  |低速  |
|価格  |高価  |安価  |
|容量  |小容量  |大容量  |

## プログラム実行のイメージ

![zu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524160/3fa17ef9-c531-e463-e355-e3ff53ac12f6.png)

:hushed:ディスクに記憶されたプログラムを直接CPUが実行することはできないの:question:

:joy:できない
- CPUは内部にあるプログラム・カウンタでメモリーのアドレスを指定し、そこからプログラムを読みだす仕組みになっている
- もしCPUが直接ディスクにアクセスしてプログラムの実行ができたとしても、ディスクの読み出しは低速なので、プログラムの実行速度が低下してしまう

## 仮想記憶

ディスクの一部を仮想的にメモリーとして使うこと

:v:メリット
　メモリーが不足していても、プログラムが実行できる

:hushed:CPUはメモリーにロードされたプログラムしか実行できないはずなのに、仮想メモリーが実行できるのはなぜ:question:

:sunglasses:実際に実行されるプログラムの部分は、その時点で仮想的なメモリー（実体はディスク）から実際のメモリー（物理メモリー/実メモリー）上に移動させている！（部分的に置き換えている）

## SSD
- Solid State Drive
- フラッシュ・メモリーをハード・ディスクとして使うもの
    - フラッシュ・メモリーとは
        - 読み書きができて、かつ、電源を切っても内容が消去されないメモリー
- SSDの実体はメモリーだが、利用者からはハード・ディスクにみえる

:v:メリット
機械的な動作をするハード・ディスクと比べて、ここがいい！
- 高速
- 消費電力が少ない
- 音が静か
- 耐衝撃性に優れている
- 軽量

※ただし、ハード・ディスクと比べて、容量あたりの価格が高価なので大容量にできない

:hatching_chick:関連して調べたこと
- 主記憶装置
    - CPUが直接読み書きできる記憶装置
    - メモリ
        - RAM（Random Access Memory）
            - DRAM（Dynamic RAM）
            - SRAM（Static RAM）
- 補助記憶装置
    - 主記憶装置以外の記憶装置
    - ストレージ
        - フラッシュメモリ（SSD、USBメモリ、SDカードなど）
        - 光学ディスク（CD、DVD、ブルーレイディスクなど）
        - 磁気ディスク（ハードディスクなど）
        - 磁気テープ

## DLLファイル
- Dynamic Linking Library
- プログラムの実行時にライブラリ（関数やデータの集まり）が動的（Dynamic）に結合されるもの
- 複数のアプリケーションが同じDLLファイルを共有できる
- **メモリーを節約できる**

# 第7章

基礎知識：アプリケーションは特定のOS上で動作するように作られている

:hushed:動作環境が異なるとアプリケーションが動かないのはなぜ:question:

## 動作環境＝OS＋ハードウェア
- ハードウェアとは
    - プロセッサやメモリーなど

自分の言葉で書けるところまで落とし込めなかったので、他の方の要約をひっぱってきてしまった…
>【CPU】
・CPU固有のマシン語しか解釈できない
・CPUの種類が異なると、解釈できるマシン語の種類が異なる
・マシン語になっているプログラム：ネイティブ・コード
・プログラマが作るテキストファイル：ソースコード、どの環境でも表示/編集可能
・ソースコードをコンパイルすることでネイティブコードが得られる
【OS】
・OSごとにアプリケーションからOSへの命令の仕方が違う
・アプリケーションからOSへの命令の仕方を定めたもの：API(Application programming Interface)
・OSごとにAPIが異なるので同じアプリケーションを他のOS用に作り直す場合にはアプリケーションがAPIを利用している部分を書き換えなければならない
・APIはOSが同じならどのハードウェアでも基本的に同じ
・CPUの種類が違う場合は、それぞれのCPUに合わせてネイティブ・コードを生成するコンパイラを使ってソースコードをコンパイルし直す必要がある
引用元：[プログラムはなぜ動くのか memo](https://qiita.com/shunsukekyuwa/items/fe4a9376518d6e4106a4)

## CPU以外のハードウェアの違いを乗り越えたWindows
![zu.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524160/a25a9c85-0bc1-422f-6419-b2e40a547a22.png)

- MS-DOS（エムエス・ドス）
    - Windowsの前身となるOS
    - ハードウェアが変われば別のアプリケーションが必要になる（アプリケーションの機能の中にハードウェアを直接操作している部分があったから）
- WindowsOS
    - ハードウェアの違いを意識せずに、アプリケーションを使用できる

## 感想
動作環境って、OSだけによって決まるものだと思っていたけれど、そう思えていたのはWindowsOSがハードウェアの違いを吸収してくれていたからなんだなあと感動した。

# 参考
[プログラムはなぜ動くのか 第３版　知っておきたいプログラミングの基礎知識](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)