あなたに次の選択肢を用意するサイト
Thoth Coworker
~ プログラミングの次++ ~
For
新社会人 / 新学生 / 新院生 / 新研究者
カテゴリ
プログラムの動きを簡単に知る
Facebookシェア Twitterツイート LINEで送る
P
ポイント
プログラムの動きを簡単に知る
プログラムの実行をマクロな視点からミクロな視点までの全体の流れを学ぶための記事
  • Point 1
    プログラムの実行とは
    プログラムが実行されるとCPUであらかじめ決められた命令に従って処理が進みます.結局は数字(データ)に対して足し算引き算、比較と読み込み、書き込みなどしか行っていませんが、様々なデバイスと連携することで複雑な動きができるように見せています
  • Point 2
    プログラムはどう動いているのか
    プログラムはOSにCPUを割り与えられている間、メモリにロードしたプログラムを命令を一つずつ実行しています.次にどの命令を実行するかも特別なメモリで管理しています.最も細かい単位ではCPUやそれに含まれる算術論理装置ALUなどで一つずつ命令を実行していきます.
P
ステップ概要
プログラムの動きを簡単に知る
プログラムが実際に行なっている処理についてまず概要を解説します
OSが管理するレベルではプログラムがどのように動くかを簡単に解説します
ソースコードの粒度で見た時にプログラムが動くか解説します.
一番細かい一命令あたりではどのようにプログラムが動いているのかを解説します
Step
1
プログラムが実際にしていること
プログラムが行なっているのは「データの操作」です.データを足したり、読み込んだり、保存したり、渡したりのような操作を行います.それなのになぜ音が表現できたり、 画像が見れたり、Webサイトが見れるのか、まずはそのイメージを解説できたらと思います.

プログラムはデータ(数字)の操作をするだけ

プログラムはCPUという部品の上で動いています. 実は、プログラムが動いているCPUは以下のように数字の列を他の画面やマウス、キーボードとやりとりしています.全部データ(数字)のやり取りを行なっているだけです.

例えば、キーボードが押されるといろいろな数字が渡されてきます.この値はそれぞれどんな意味があるのかあらかじめ決められていて、この数字なら"A"を表す、この数字なら"スペース"を表すといった感じになっています. プログラムはあらかじめどの値が何を表すか知っているため、Aが押されたと把握できます.

画像を表示する場合、プログラムからディスプレイにお願いしなくてはなりませんが、どう数字をどのように並べたら画面が表示されるかもプログラムが知っているため、思い通りに表示できるのです.

このようにプログラムが動くとき、プログラムに渡されるものもプログラムから渡すものも全て数字になっています.もちろんプログラムの中でいろいろな操作をするときも全て数字で行っています.言葉も全て数字で扱っています.文字を表示する時にこの数字はこの形を画面に出すと決めておいているだけなのです.

画像 : キーボードから"A"を入力されて画面に表示する流れ

上図のようにプログラムは61が渡されたら"A"の形を表示しているだけで、一度も文字として何も処理していません.音楽を流す時もその音量をあげるときもスピーカーに渡す数字を少し変えることで実現しています.

上記のように、プログラムは常に数字を渡されたり読み込んだり数字の処理をしてそれを出力するということを繰り返し行っています.
一番細かく処理を分解すると、プログラムがやっていることは以下のようなことだけです.
画像 : プログラムの一番細かい操作

この「読み込み/書き込み」「足し算引き算」「比較」操作を行うことで、写真表示、スライド作成、微分積分、面積の計算、物理シミュレーション、Webサイトの表示、ゲームも全て行うことができます. プログラムはCPUの上で実行されます.
Step
2
OSが管理するレベルのプログラムの動き
スマートフォンでもパソコンでもOSが搭載されている環境では、CPUで動くプログラムはOSが全て管理し、どのプログラムをCPUで動かすかもOSが決めています.
しかしCPUの数は限られているのに、大体の場合、音楽を聴きながら通知を確認しながらWebサイトを見るように複数のことを同時に行わなくてはなりません. そこでOSはCPUを使える時間を区切って、各プログラムにCPUを割り当てていきます.プログラムはCPUに割り当てられた間だけ実行することができます.


画像 : OSで見れるCPUとプログラムの動き

割り当てられたプログラムは実行されたあと、決めらた時間が立つと切り替えられ、OSによって次のCPUを使うプログラムが決められます.
プログラムは自身で終了するかOSによって終了を言われるまで動き続けます.
Step
3
ソースコードの対応で見るプログラムの動き
それでは、次はOSに割り当てられている間に注目して、 ソースコードとの対応を見ながらどのようにプログラムが動いて見えるか確認していきます.

画像 : ソースコードとプログラムの動き

プログラムでは必ず「そのプログラムを作る際に書いたソースコード」の初めに呼ばれる関数(C言語ならmain関数)から一行ずつ上から実行され、関数から関数が呼び出され処理されていきます.関数は元の関数に戻る必要があるため、 どの関数から呼ばれたかはメモリ上に記録されています.

もう少しハードウェアに寄り添った点で確認します
プログラムは実行される前に必ずメモリにロードされます.CPUはロードしたそのメモリを読みにいき、 次の命令が何かを取りに行きます.

メモリにはメモリの中の位置、場所を表す"アドレス"があります.各アドレスにはプログラムの命令が置かれています.
プログラムが実行されている間、特別な場所で次に実行するべき行のアドレスを管理しています.ここの値を書き換えることで 次にどんな処理をするかを変えていくことができます.

ソースコードはコンパイルなどを通して、さらに細かいCPUへの命令の集まりになります.
わかりやすさのためにソースコードで記載しましたが、実際はコンパイルされた実行ファイルが本来ロードされ実行されます.
Step
4
最も細かいレベルのプログラムの動き
いよいよ最も細かいレベルでの動きについてみてみましょう.ここではCPUに一つずつ命令をする最も小さい実行の単位です.
最も細かいレベルでは、足し算、引き算、比較、読み込みや書き込みしかやらないという話でした.
画像 : プログラムの一番細かい操作

足し算や引き算を行うALU(演算装置)に命令が渡され、それと処理される数字も渡されます.そして、計算後その結果が再度入れるべきところに返されていきます. 命令と引数が一緒に渡され、足し算、引き算、比較、読み込み、書き込みが行われています.基本的にCPUが一回動作する単位で1命令実行されます.

この最も細かい処理が最終的にプログラムの全ての動きを作り出しているのです.
Done