コンパイラーが何をしているのか知りたくて調べたところ,OSとCPUとの関係,OSとコンパイラーの役割の違いについて知る必要があった.
そこで,調べた事を以下に纏めた.
要点
- OSは,GUIやCLIの指示(非バイナリ)をCPUが理解できるバイナリに変換して渡す
- しかし,OSはコンパイラーのように事前にバイナリを生成するわけではない
- OSはリアルタイムにユーザーの操作をバイナリの命令としてCPUに渡す「翻訳者」のような存在
- コンパイラーは,事前にソースコードをバイナリ化するため,リアルタイム性はない
このように,OSとコンパイラーは異なる役割を持ちつつも,どちらもCPUが理解できる形式に変換する重要な役割を担っている.
予備知識(事前知識)
この記事を理解するために必要な基本的な概念について説明する.
バイナリとは
バイナリ(binary)とは,0と1の二進数で表現されたデータのことである.コンピュータはすべての情報を0と1の組み合わせで処理しているため,プログラムの実行やファイルの保存も最終的にはバイナリデータとして扱われる.
バイナリファイルとは
バイナリファイル(binary file)とは,人間が直接読むことができないバイナリデータを含むファイルである.例えば,実行可能ファイル(.exe, .elf など),画像,音声,動画,圧縮ファイルなどがこれに該当する.これに対し,テキストファイル(.txt, .csv など)は人間が直接読み書きできる.
実行可能ファイルとは
実行可能ファイル(executable file)とは,OSが直接実行できる形式のバイナリファイルである.Windowsでは .exe
や .dll
,Linuxでは .elf
形式などがある.これらのファイルはCPUが直接解釈できる機械語(バイナリ命令)を含んでいる.
機械語とは
機械語(machine code)とは,CPUが直接解釈して実行できる命令の集合である.人間が記述するプログラム(C言語,Pythonなどの高水準言語)は,そのままではCPUが理解できないため,コンパイルやインタプリタによって機械語に変換される必要がある.
OSのカーネルとは
OSのカーネル(kernel)とは,OSの中核部分であり,ハードウェアとソフトウェアの橋渡しを行う役割を持つ.プロセス管理,メモリ管理,ファイルシステム管理,デバイス管理などを担当し,CPUに対する命令を適切に制御する.
OSとCPUの関係
コンピュータの処理は,大きく以下の流れで進む.
プログラム(ソースコード)
↓(コンパイル)
実行可能ファイル(バイナリ)
↓(OSが管理するプロセスとしてロード)
OS(カーネル)
↓(CPUへの命令スケジューリング)
CPU(機械語を実行)
ここで重要なのは,OSがCPUに対して直接命令を送るのではなく,実行可能なバイナリをロードし,プロセスを管理する役割を担っている点である.
ファイル操作におけるOSとCPUの役割
プログラムを実行しない単なるファイル操作(コピーや移動)についても,CPUは重要な役割を果たす.
例えば,ユーザーがマウスでファイルをドラッグ&ドロップして移動する場合,次のような流れになる.
- ユーザーの操作(GUI)がOSにイベントとして送信される
- OSはファイルシステムに対し,「このファイルを別のフォルダへ移動せよ」という命令を出す
- OSのカーネルがCPUにバイナリの命令を送る
- CPUはストレージコントローラとやり取りし,データを移動する
- OSが処理完了をGUIに通知する
この流れの中で,最終的にCPUが動作してストレージへデータを書き込む処理を行う.
OSはコンパイラーと同じなのか?
OSは,GUIやCLIの指示(非バイナリ)をCPUが理解できるバイナリに変換して渡す.これは,コンパイラーの動作と似ているが,厳密には異なる役割を果たす.
項目 | OS | コンパイラー |
---|---|---|
入力の種類 | ユーザーの操作(GUI, CLI)やプログラムのシステムコール | ソースコード(C, Python など) |
出力の形式 | CPU命令をリアルタイムでスケジューリングし,直接実行 | 機械語(バイナリ)に変換して,実行可能ファイルを生成 |
実行のタイミング | リアルタイムで動作 | 事前にバイナリを生成し,後で実行 |
役割 | CPUやハードウェアリソースの管理,プログラムの実行支援 | 高水準言語をCPUが理解できるバイナリに変換 |
OSは「リアルタイムな翻訳者」のような役割を果たし,コンパイラーは「事前にコードを機械語に変換するツール」という違いがある.
OSがリアルタイムに処理を翻訳する理由
もしOSがコンパイラーのようにすべての処理を事前にバイナリ化しておくと,以下のような問題が発生する.
- 事前にすべての可能な操作を準備するのは非現実的
- 動的な処理ができなくなる
OSはマウスのクリックやキーボードの入力をリアルタイムで処理する必要がある.そのため,OSはコンパイラーのように事前にバイナリ化するのではなく,リアルタイムに翻訳してCPUに指示を出す方式を採用している.
参考文献
- Andrew S. Tanenbaum, "Modern Operating Systems", Pearson
- Silberschatz et al., "Operating System Concepts", Wiley
- David A. Patterson, John L. Hennessy, "Computer Organization and Design", Morgan Kaufmann
- GNU Compiler Collection (GCC) Documentation: https://gcc.gnu.org/
- Linux Kernel Documentation: https://www.kernel.org/doc/html/latest/
- Intel 64 and IA-32 Architectures Software Developer's Manual: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html