プログラムの動き方
Elementry前提知識
プログラムって何?
前の記事で、OS はハードウェアを管理してアプリを動かすと学んだ。でも、アプリって本当は何だろう?OS が動かしているのはいったい何なのか?
本質的には、プログラムとはコンピューターが順番に実行する命令のリストだ。レシピに例えるとわかりやすい。レシピはシェフに「まずこれをして、次にこれ、この条件を満たしたらこれ」と伝える。プログラムもまったく同じことをするが、相手はコンピューターだ。
Spotify もプログラム。TikTok もプログラム。スマホの電卓もプログラムだ。アプリのアイコンをタップするとき、OS に「この命令を実行してくれ」と告げていることになる。
面白いのはここからだ — すべてのプログラムが同じ見た目や動き方をするわけではない。プログラムには様々な形がある。その形を理解すると、コンピューターの動き方がずっとよく見えてくる。
タイプ 1: 見えてクリックできるアプリ — GUI アプリケーション
最も馴染みのあるプログラムは、見えるものだ。ウィンドウ、ボタン、テキストボックス、画像 — マウスやタッチスクリーンで見て操作できるものがある。これを GUI アプリケーション(GUI application)と呼ぶ。GUI(グーイーと発音する)は Graphical User Interface(グラフィカルユーザーインターフェイス)の略だ。
シンプルに言えば、ウィンドウが見えればそれは GUI アプリだ。
ほぼ確実に使ったことがある例:
- Chrome / Safari / Firefox — ウェブブラウザ
- Spotify / Apple Music — 音楽プレイヤー
- Discord / WhatsApp Desktop — メッセージングアプリ
- Minecraft / Roblox — ゲーム
- Microsoft Word / Google Docs — ドキュメントエディター
GUI アプリを開くと、OS がそれを読み込んで画面の一部を割り当てる。アプリはその空間にボタンやメニューや内容を自分で描く。ボタンをクリックすると、アプリはそのクリックを入力として受け取り、それに対応する。
この「入力 → 処理 → 出力」のループが、GUI アプリが開いている間ずっと動き続けている。何かをクリックし(入力)、アプリが何をすべきか考え(処理)、画面に変化が現れる(出力)。スクロールしているだけでも、それは入力として処理されている。
スマホのアプリも GUI アプリ
モバイルアプリも GUI アプリケーションだ — ただ、マウスではなくタッチでの操作になる。スワイプ、タップ、ピンチズーム — これらはすべてアプリへの入力で、アプリはそれに応じて画面を更新する。
タイプ 2: 見えない働き者 — バックグラウンドサービス
驚くかもしれないが、すべてのプログラムに見えるウィンドウがあるわけではない。実際、これを読んでいる今も、パソコンは目に見えない何十ものプログラムを静かに動かしている。
これをバックグラウンドサービス(background service)と呼ぶ。インターフェイスを一切表示せず、サイレントに仕事をする。パソコンの起動と同時に立ち上がり、シャットダウンまで動き続ける。
実際に何をしているか?いろんなことだ:
- ウイルス対策ソフトが開くファイルを静かにスキャンして脅威を確認している — 自分では何もしていないのに。
- iCloud、Google Drive、OneDrive などの同期サービスがフォルダを監視してリアルタイムでクラウドに変更をアップロードしている。
- システムアップデートサービスが定期的に新しいアップデートがないか確認している。
- オーディオサービスがスピーカーとマイクを常に管理して、どのアプリでもいつでも使えるようにしている。
- ネットワークサービスがインターネット接続を維持してバックグラウンドで Wi-Fi を管理している。
これらはすべて気づかないうちに動いている — 動かなくなるまでは。何もしていないのにウイルス対策が通知を出したことはないだろうか?それはバックグラウンドサービスが何かに気づいて、教えてくれた瞬間だ。
どうやって動いているか確認できる?
Windows なら タスクマネージャー(Ctrl+Shift+Esc)を開いて「プロセス」か「サービス」タブをクリックすると、自分では開いていないものの長いリストが見える。macOS ならアクティビティモニターで同じことができる。初めて見ると、正直かなり驚く。
バックグラウンドサービスは、起動直後のパソコンでも CPU とメモリがすでに少し使われている理由の一つだ。OS 自体もサービスの集まりであり、それらはパソコンが目覚めた瞬間に全部立ち上がる。
タイプ 3: ウィンドウのないプログラム — CLI
Linux について話したとき、ターミナル(terminal)について少し触れた。今度はちゃんと説明する。
グラフィカルなインターフェイスがまったくないプログラムがある — ボタンも、アイコンも、ウィンドウもない。その代わり、すべてをテキストでやりとりする。コマンドを入力して Enter を押すと、プログラムがテキストで応答する。これをコマンドラインインターフェイス(command-line interface)、略して CLI と呼ぶ。
実際どんな感じか。フォルダ内のファイル一覧を見たいとする。GUI なら、ファイルエクスプローラーや Finder を開いて目で探す。CLI では次のようにタイプする:
ls
…するとプログラムはファイル名をプレーンテキストでターミナルウィンドウに出力する。
時代遅れに聞こえるかもしれない — 確かに少しそうだ。CLI はグラフィカルインターフェイスが生まれる前から存在する。でもなくならなかったのは、慣れると極めて強力だからだ。
なぜ CLI が今も存在するか
いくつか理由がある:
- 速さ — 慣れた人にとって、コマンドを打つ方がメニューをクリックするより速いことが多い。
- 自動化 — コマンドのリストをファイル(スクリプト(script)と呼ぶ)に書いておくと、コンピューターが自動的に一つずつ実行してくれる。「毎朝8時に最新のニュースの見出しをダウンロードしてファイルに保存する」といったことも CLI でできる。
- リモートコントロール — エンジニアがサーバー(ウェブサイトを動かしている強力なコンピューター)を管理するとき、物理的に触ることができないことが多い。インターネット越しに接続して、CLI だけで完全に操作する。
- 精度 — GUI のないタスクもある。CLI はどんなボタンも作られていない操作を実現する。
どの OS にも CLI がある:
- Windows には コマンドプロンプト(Command Prompt)と PowerShell がある
- macOS には ターミナル(Terminal)がある
- Linux にはディストリビューションによってさまざまなターミナルアプリがある
普通のユーザーは CLI に触れる必要がない。でも技術の世界に入れば、毎日使うことになる — そして見た目ほど怖くない。
タイプ 4: プログラムの中のプログラム
ここが特に面白くなるところだ。
OS の上で直接動くのではなく、別のプログラムの中で動くプログラムがある。大きなホストプログラムがミニ環境を作り、その中で小さなプログラムが動く。
ブラウザの中のウェブサイト
最も一般的な例がウェブサイトだ。
ウェブサイトを開くと、ブラウザ(Chrome、Safari、Firefox)がインターネットからファイルの束をダウンロードする。その中には JavaScript(ジャバスクリプト)というプログラミング言語で書かれたファイルが含まれている。ブラウザはそのファイルを読んでコードを実行する。
ある意味、インタラクティブなウェブサイトは全部ブラウザの中で動くプログラムだ。ブラウザはホストで、ウェブサイトはその中で動くゲストのプログラムだ。
これが今日のウェブサイトがあれだけのことができる理由だ。Google Docs でドキュメントを編集できるし、Figma でデザインもできるし、ゲームもブラウザのタブで動く。これらは単純なテキストのページではなく、ブラウザの中にホストされた本格的なプログラムだ。
そしてブラウザがパソコンで最もリソースを食うアプリのひとつである理由もここにある。ページを表示しているだけでなく、タブごとに一つずつ、何十ものプログラムを同時に動かしている。
拡張機能とプラグイン
「プログラムの中のプログラム」のもう一つの形が拡張機能(extension)やプラグイン(plug-in)だ。
ブラウザの拡張機能(広告ブロッカーやパスワードマネージャーなど)は、ブラウザの中で読み込まれてその動作を変える小さなプログラムだ。ページの見た目を変えたり、ツールバーにボタンを追加したり、コンテンツをブロックしたり、訪問したサイトとやりとりしたりできる。
他のアプリも同じだ。動画編集ソフトには新しいエフェクトを追加するプラグインがある。音楽制作ソフトにはシンセサイザーやオーディオエフェクトのプラグインがある。Minecraft にはモッド(mod)がある。Google スプレッドシートはアドオンをインストールできる。
どの場合も、パターンは同じだ — ホストプログラムがサードパーティのプログラムを接続して動かせる場所を定義する。
なぜ全部 OS に直接インストールしないのか
ホストの中で動かすことには重要なメリットがある:
- サンドボックス化(sandboxing)— ホストがゲストプログラムに許可する操作を制御できる。ブラウザで動くウェブサイトは(許可しない限り)ファイルにアクセスできない。ブラウザが触れる範囲を制限しているからだ。セキュリティ上の大きな利点だ。
- ポータビリティ(portability)— ウェブサイトは Windows でも macOS でも Linux でもモバイルでも同じように動く。ブラウザが差異を吸収してくれるからだ。ウェブサイトは下の OS が何であるかを気にしなくていい。
- 簡単な配布 — ウェブサイトを「インストール」する必要はない。URL にアクセスするだけだ。
全部まとめると
「プログラム」と一口に言っても、それは一つの種類ではない。ファミリー全体だ:
| タイプ | 見えるウィンドウがある? | 誰が起動する? | 例 |
|---|---|---|---|
| GUI アプリケーション | あり | 自分 | Spotify、Chrome、Minecraft |
| バックグラウンドサービス | なし | OS(自動的に) | ウイルス対策、同期サービス、システムドライバー |
| CLI プログラム | なし(テキストのみ) | 自分(ターミナル経由) | ファイルツール、自動化スクリプト、サーバーソフトウェア |
| プログラムの中のプログラム | ホスト次第 | ホストプログラム | ウェブサイト、ブラウザ拡張機能、ゲームのモッド |
これらはすべて、コンピューターが実行する命令にすぎない。どこで動くか、どうやって入力を受け取るか、どうやって出力を表示するかが違うだけで、根本的には全部同じことをしている — 情報を受け取り、処理し、何かの結果を出す。
まとめ
- プログラムとはコンピューターが従う命令のセットだ。
- GUI アプリケーションは見えるウィンドウと対話的なインターフェイスを持つプログラム — 自分で開いて直接使うアプリだ。
- バックグラウンドサービスはウィンドウなしでサイレントに動くプログラム。裏で重要な仕事をしている。
- CLI はコマンドを打ってプログラムを動かすテキストベースの方法 — ウィンドウはなく、テキストの入出力だけだ。
- プログラムによっては他のプログラムの中で動くものがある — ウェブサイトはブラウザの中で、拡張機能はアプリの中で動く — セキュリティとポータビリティのためだ。
次にノートパソコンやスマホを開くとき、一つのプログラムを起動しているだけではない — 何十ものプログラムが各自の役割を果たして動くエコシステム全体に踏み込んでいる。そのほとんどは完全に目に見えない。