プログラムが動く仕組み|起動から実行・終了まで

30秒でわかる答え

起動するとOSや実行環境が準備し、メモリを使いながらCPUが命令を処理して結果を返します。 保存されたプログラムと、作業中の状態を含むプロセスは区別します。実行方法は言語や環境によって異なります。

電卓アプリは、インストールしただけでは計算を始めません。アイコンを押すと画面が開き、数字を入れると答えが出ます。この「保存されている」「起動している」「入力に反応する」の間では、何が変わっているのでしょうか。

プログラムが動く仕組みは、保存・起動・実行に分けて考える

プログラムは、コンピューターに行わせる処理を記述したものです。起動するとOSや実行環境が必要な準備を行い、メモリを使いながらCPUで命令を処理し、画面やファイルなどへ結果を返します。 保存することと、実行することは別です。

ここでは一般的なパソコンやスマホで、電卓アプリを起動して足し算する場面を追います。プログラミング言語ごとの書き方より先に、何がどの段階で働くかを見ていきましょう。

ユイ

プログラムを保存するのと、動かすのは別なんですね。起動すると何が増えるんですか?

マコト

作業中の状態だね。同じ手順書が棚にあっても、作業を始めると、使う場所や途中の値が必要になるんだ

起動すると、プログラムを動かす場所と状態が用意される

ストレージにあるプログラムは、手順書を保存棚に置いた状態に似ています。アイコンを押したり、実行の指示を出したりすると、OSや実行環境が、命令やデータを利用できるように準備します。

このとき必要になるのが、作業中のメモリや、どこまで処理したかという情報です。OSが管理する、実行中のプログラムとそのための資源をまとめた単位をプロセスと呼びます。保存されたファイルだけを指す「プログラム」と、動いている状態を含む「プロセス」を区別すると、起動の意味が見えてきます。

見るもの保存されているとき実行中のとき
プログラムストレージなどにコードがあるそのコードを使って処理を進める
作業中の値今回の計算の状態はまだない入力した数字や途中の結果がある
OSによる管理ファイルとして保存先などを管理するメモリや実行する時間なども管理する

起動しても、元の保存ファイルがなくなるわけではありません。また、すべての内容を最初にまとめてメモリへ読み込むとは限りません。必要になった部分を後から読み込む仕組みもあります。

保存先と作業場所の違いはメモリとストレージの違い、資源を管理する土台はOSとはで詳しく説明しています。

電卓で3+2を計算するときの、入力・処理・出力

作業する場所は用意できました。ただ、画面を開いただけでは、まだ何を計算するかは決まっていません。電卓へ「3」「+」「2」を入力して、答えが出るまでを追ってみます。

起動の準備
OSや実行環境が、コードと作業場所を用意

  1. 入力3 + 2押したキーを受け取る
  2. 処理足し算CPUが命令を実行する
  3. 出力5結果を画面へ表示する

次の入力を待つ → 新しい計算へ
または、終了して作業場所を解放

起動は作業の準備。起動後には、入力・処理・出力を繰り返せます。実装の全工程を表す回路図ではありません。

入力では、キーやタッチの情報がOSなどを通してアプリへ届きます。アプリは受け取った操作から「二つの数を足す」という処理を選び、数字を作業中のデータとして扱います。

処理では、CPUが命令を実行して値を計算します。実際には、入力を判別したり、使う値を読み出したりする命令も必要です。「3+2」という画面の表記を、一つの人間の言葉としてCPUが理解するのではありません。

出力では、計算結果の5を表示するための処理を行います。画面に文字を描く仕組みやOSの機能なども使うため、「足し算が終わる」と「画面に答えが見える」の間にも仕事があります。

CPU内部の「命令を取り出す・解読する・実行する」という工程は、コンピューターの命令処理で詳しく追えます。こうした小さな処理がつながり、画面に5が表示されます。では、人が書いたコードは、どこでCPUが実行できる命令になるのでしょうか。

ソースコードは、そのままCPUに読まれる?

人がプログラミング言語で書いたコードを、ソースコードといいます。CPUが直接実行するのは、そのCPUに対応した機械語の命令です。ソースコードから実際の処理につなぐ方法は、言語や実行環境によって異なります。

たとえば、実行前に別の形式へ変換するコンパイルがあります。Cなどを扱うGCCでは、前処理・コンパイル・アセンブル・リンクという段階を経て、実行に使うファイルを作れます。これは一つの代表例で、すべての言語が同じ手順を通るという意味ではありません。

別の方法として、コードを読み取って処理を進める実行用ソフトを使うこともあります。その実行用ソフト自身も、CPUで動くプログラムです。実行中にコードを機械語へ変換するJITコンパイルを組み合わせる環境もあります。

したがって、「コンパイルする言語」「一行ずつ読む言語」という二択だけでは、実際の動きは説明しきれません。今は、書いたコードとCPUの間には、変換や実行を担う仕組みがあると捉えてください。

ブラウザで動くコードの身近な例はJavaScriptとはで試せます。

何も操作していない間も、ずっと計算している?

コードから処理へつながる道筋は分かりました。電卓へ戻ると、5を表示した後も画面は開いたままです。だからといって、同じ足し算を全速力で繰り返しているわけではありません。多くのアプリは、次のクリックやキー入力などの合図を待ち、必要なときに処理を進めます。

OSは、処理を進められる仕事へCPUの時間を割り当てます。入力や通信の完了を待つ間には、その仕事を待機させ、ほかの仕事を動かせます。より細かく見ると、CPUで実行する流れには「スレッド」という単位がありますが、まずは「開いている」と「今この瞬間にCPUを使っている」を分けて考えましょう。

音楽の再生や時刻の更新など、操作していなくても続く処理もあります。何をきっかけに動くかは、そのプログラムの仕事によります。「次の入力を待つ」と「処理を終える」でも、作業中の状態の扱いは変わります。

終了すると、作業中の値はどうなる?

プロセスが終了すると、OSはそのプロセスが使っていたメモリなどの資源を回収します。一方、ストレージに保存済みのプログラムやファイルは、通常そのまま残ります。

途中の計算結果や編集内容を次回も使えるかは、アプリが保存したかどうかによります。メモリ上にしかなかった状態まで、自動でファイルになるとは限りません。アプリによっては状態を保存し、次の起動で復元します。

また、ウィンドウを閉じても、関連する処理が裏で動き続ける場合があります。「画面を閉じた」「処理がすべて終了した」「アプリを削除した」は、それぞれ別の操作や状態です。

ユイ

保存した手順、動いている作業、残した結果。分けると、閉じても残るものが分かりますね

マコト

そう。次は自分がよく使うアプリで、何を受け取り、何を変え、何を返すかを追ってみよう

よくある疑問と、身近なアプリでの確認

Q1. 一つのアプリには、一つのプロセスだけがありますか?

そうとは限りません。一つのアプリが複数のプロセスを使う場合も、すでに動いているプロセスの中で新しいコードを実行する場合もあります。アイコンやウィンドウの数だけでは、プロセス数は決まりません。

Q2. プログラムを動かすには、インターネット接続が必要ですか?

端末の中だけで処理するプログラムは、接続がなくても動きます。検索やオンライン保存など、外部との通信が必要な仕事には接続が必要です。起動できることと、すべての機能を使えることは分けて考えます。

最後に、写真アプリで明るさを変える操作を三つに分けてみましょう。スライダーの操作が入力、画像の値を変える仕事が処理、変化した写真の表示が出力です。そこに「保存」を加えると、作業中の結果を次回も使える形で残す仕事が続きます。

身近な一操作をこの順で追えると、プログラムが動く仕組みを、部品の名前の暗記から実際の動きへつなげられます。

動くまでの流れが分かると、今度は、その中で実行する手順が気になります。同じ数字を見つける仕事でも、最初から一枚ずつ探すのと、途中から候補を絞るのとでは、調べる枚数はどう変わるでしょうか。アルゴリズムとはで、同じ番号カードから答えを探す二つの方法を試してみましょう。

この記事について

LAB WHITEBOARD

自分の言葉で説明してみよう

「保存と実行を分け、起動から結果までをOS・メモリ・CPUの役割と結び付けられる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。