プログラムが読み込まれる流れについてまとめてみました。
自分が書いたソースコードがどのように読み込まれ実行されるのか、ざっくりとした図でまとめています。
本記事はあくまで、ざっくりと大きな流れをイメージすることが目的ですので、レジスタの種類やメモリの細かい動作までは記述していません。
図解
流れ
1.コンパイル
コンパイルとは人が書いたコード(ソースコード)をPCが読める言語(ネイティブコード)に変換することです。
普段私たちが書いているプログラミング言語は人間が扱い易いように人間用に用意された言語です。人間には理解できますがPCには理解できません。
反対にPCが読める言語、つまりネイティブコードは二進数で表現されているため、異次元の天才エンジニア以外には基本的に理解できないです。
この隔たりを解消するのがコンパイラです。
まずはこのコンパイラを通してコンパイルを行いソースコードをネイティブコードへ変換することが始まりです。
ちなみにコンパイラは言語、CPU、OSごとに専用のコンパイラが必要になります。
2.メモリで各アドレスに命令・データを格納
メモリとはコードに書かれている命令やデータを一時的に格納しておくものです。
私たちが書いているプログラムは結局、PCに対しての命令ですが、それがネイティブコードに変換され、メモリに格納されます。
アドレス
メモリに格納された命令・データの場所を示すものです。CPUはこのアドレスを指定して命令・データの読み書きをします。
アドレスの実態は素子(0か1かだけを表現できるピンのようなものだとイメージすれば良い)で、素子1つで1bitです(0か1かだけを表現するため)。
これらが8つ集まり(つまり8bitで)1つのアドレスを表現します。
3.CPUがメモリから命令・データを読み出す
具体的にはCPUの制御装置部分がメモリから命令・データを読み出します。メモリはただ命令・データを格納しておく場所であり、命令の処理(要は演算)はCPUが行います。
4.レジスタが制御装置から命令・データを読み出し
レジスタはCPUの中にある記憶領域です。レジスタには色々と種類があり、それぞれ役割が異なるのですが、ざっくりとした流れだけ理解できれば良いのでここでは解説しません。
レジスタは制御装置からデータを読み出し、プログラムの流れを管理するため、実行中のプログラムの情報を記録したり、直前の実行結果を保管したり、演算に使う値を格納したりします。
5.演算装置で演算をする
CPUというとこのイメージが強いと思いますが、演算装置はレジスタに保管された値を参照しつつ、演算を行います。
CPUが頭使っているんだ!とイメージしておけば良いと思います。
6.出力
演算結果に応じて、制御装置が出力を行います。
これでやっと、私たちが書いたコードが意味のある形に出力されるということです。
終わりに
ざっくりですが、自分が書いたコードがどのような流れで動いているか?をイメージすることは重要だと思ったのでまとめさせていただきました。