1.1. コンピューターの構成#

1.1.1. ハードウェアとソフトウェア#

コンピューターには、キーボードやマウス、モニター、プリンターといった入出力装置のほか、データを保存するハードディスクやメモリ、計算処理を担う CPU など、さまざまな物理的な部品が組み込まれています。このように、実際に手で触れることのできる物理的な構成要素のことを、ハードウェアhardware)あるいはデバイスdevice)と呼びます。コンピューターでデータを処理したり作業を行ったりするためには、これらのハードウェアが互いに連携し、適切に動作する必要があります。その連携を可能にするのが、ソフトウェアsoftware)やプログラムprogram)と呼ばれる仕組みです。これらは、ユーザーからの指示を受け取り、ハードウェアを制御しながら目的の処理を実行します。

ソフトウェアは大きく分けて二つの種類があります(Fig. 1.1)。ひとつは、特定の目的や作業を実行するための応用ソフトウェアapplication software[1]です。もうひとつは、ハードウェアの管理や、応用ソフトウェアとの連携を担うシステムソフトウェアsystem software)です。応用ソフトウェアには、文書作成ソフトや表計算ソフト、ウェブブラウザ、ゲームなど、ユーザーが直接操作するソフトウェアが含まれます。一方、システムソフトウェアはコンピューターの基盤として動作しており、アプリケーションがハードウェアを安全かつ効率的に利用できるように調整する役割を果たしています。Windows や macOS、Linux などが代表的なシステムソフトウェアの一例です。

../_images/software_layers_desc.jpg

Fig. 1.1 システムソフトウェアは、ハードウェアと応用ソフトウェアの橋渡しとして機能し、アプリケーションがハードウェアを安全かつ効率的に利用できるように調整する役割を果たします。#

応用ソフトウェアとシステムソフトウェアの関係を、具体的な場面で見てみましょう。たとえば、ウェブブラウザを使ってウェブサイトにアクセスする場面を考えてみます。ユーザーがブラウザのアドレスバーに URL を入力すると、そのキーボード入力はシステムソフトウェアによって検知され、ブラウザに伝えられます。ブラウザはその入力を受け取り、文字を画面上に表示します。次に、ユーザーが「Enter」キーを押すと、この操作もシステムソフトウェアを介してブラウザに通知され、ブラウザはその指示に基づいてウェブサイトへのアクセスを開始します。この一連の処理の中で、システムソフトウェアは、ブラウザがメモリや CPU、ネットワークといったリソースを使用できるように管理し、必要な情報がインターネットから届いた際には、そのデータを最初に処理してからブラウザに渡します。

このように、私たちが目にする操作の裏側では、システムソフトウェアがハードウェアと応用ソフトウェアの間に立ち、両者の円滑な連携を支えています。

1.1.2. ソフトウェアの階層構造#

ソフトウェアは大きくシステムソフトウェアと応用ソフトウェアに分類されますが、より詳しく見ると、作用対象や役割に応じて複数の階層構造を形成しています。おおまかに、ハードウェアに近い側から順にファームウェア、システムソフトウェア、応用ソフトウェア の層に分けられます(Fig. 1.2)。

../_images/software_layers.png

Fig. 1.2 ソフトウェアは複数の階層から構成され、各層が連携しながら、ハードウェアとデータ処理を制御しています。#

最もハードウェアに近い層がファームウェアfirmware)です。これは、ハードウェアを直接制御するソフトウェアで、通常はハードウェア本体に組み込まれています。たとえば、冷蔵庫や電子レンジなどの家電製品は、電源を入れるだけで動作しますが、これは内部にファームウェアがあらかじめ搭載されているためです。コンピューターの場合、起動時に動作する BIOS(Basic Input/Output System)や UEFI(Unified Extensible Firmware Interface)がファームウェアにあたります。これらは OS よりも前に動作し、システムの初期化やハードウェアの検出を行います。

ファームウェアの上にあるのがシステムソフトウェアです。この層はさらに、基本ソフトウェアまたはオペレーティングシステムoperating system; OS)と、ミドルウェアに分けられます。OS は、アプリケーションとハードウェアの間を取り持つ中核的なソフトウェアで、CPU やメモリ、ストレージなどのハードウェア資源を適切に制御・管理します。アプリケーションが安全かつ効率的に動作できるよう、共通のインターフェースを提供する役割を担っています。代表的な OS には、Windows、macOS、Linux などがあります。

ミドルウェアmiddleware)は、OS と応用ソフトウェアの中間に位置するソフトウェア群で、必須ではありませんが、特定の処理を補助する目的で導入されます。たとえば、データベース管理システム、通信ライブラリ、仮想マシンはミドルウェアの代表例です。これらは複数のアプリケーションに共通の機能を提供し、開発や実行を支援します。

そして最上位に位置するのが、ユーザーが直接操作する応用ソフトウェアです。文書作成、データ解析、ウェブ閲覧、ゲームプレイなど、私たちが日常的に利用しているソフトウェアの多くはこの層に属しています。

ユーザーが操作しているのはこの応用ソフトウェアだけであっても、その背後では、ファームウェアからシステムソフトウェア、ミドルウェアに至るまで、複数の層が密接に連携しながら、ハードウェアを動かし、目的の処理を実現しているのです。

1.1.3. オペレーティングシステム#

OS は、応用ソフトウェアとハードウェアの間に位置し、両者のやり取りを仲介する役割を担っています。コンピューターの OS には、Windows、macOS、Linux などが広く利用されています。また、スマートフォンやタブレットでは、Android や iOS が主流です。

応用ソフトウェアとハードウェアの間に OS が介在することで、両者が直接やり取りする必要がなくなり、開発や運用の負担が大幅に軽減されます。もしアプリケーションが直接ハードウェアを制御する必要があると、機器ごとの命令や仕様に対応するため、多大な労力やコストが発生します。新しいデバイスや規格が登場するたびに、すべてのアプリケーションを更新するのは現実的ではありません。OS は、こうしたハードウェアごとの違いを吸収し、統一された仕様をアプリケーションに提供しています。これにより、開発者は個々のハードウェアを意識せずに、OS が用意した仕様に基づいてアプリケーションを開発できます。たとえ新しいデバイスが追加されても、OS 側が対応すればアプリケーションはそのまま動作可能です。

OS は、キーボードやマウスのような一般的なハードウェアを標準でサポートしており、接続するだけで利用できます。一方、特殊なハードウェアには、製造元が提供するドライバーdriver)と呼ばれるソフトウェアを OS に追加することで対応可能です。ドライバーは OS とハードウェアの橋渡しを担い、OS がその機器を制御できるようにしています。このように、OS とドライバーによってハードウェアとのやり取りが統一されることで、ハードウェアメーカーとアプリケーション開発者は互いに独立して開発を進めることができ、ソフトウェアの互換性や開発効率が大きく向上します。

言ってみれば、開発者はガス配管や電気工事といった厨房の裏方作業から解放されたシェフで、料理づくりに集中できるようになったのです。ただ、オーブンがうんともすんとも言わないときは、だいたい配電工事されていない……つまり、ドライバーがまだインストールされていないだけだったりします。高機能な調理器具を買うときは、配線工事もセットでついてくるか、よく確認しておきましょう。

OS も、いくつかの層から構成されています(Fig. 1.3)。ハードウェアに最も近い層はカーネルkernel)で、CPU、メモリ、ストレージなどのハードウェア資源の管理や、ソフトウェアとのやりとりを仲介する中核的なプログラム群です。その上の層には、シェルshell)と呼ばれるソフトウェアがあります。シェルはユーザーからの入力を受け取り、それを解釈してカーネルに処理を依頼する役割を果たします。さらにその上には、ユーティリティutilities)と呼ばれる、小規模で特定の機能を果たすプログラム群が存在します。たとえば、フォルダ内のファイルを一覧表示する、ファイルをコピーする、テキストを検索するといった処理を実行するのがユーティリティです。これらのユーティリティは、シェルを通じて実行されるため、一般にはコマンドcommand)と呼ばれることもあります。ただし厳密には、ユーティリティはプログラムそのものを、コマンドはそれを実行するための命令や操作を指します。

../_images/linux_systemsoftware_layers.png

Fig. 1.3 Linux の OS はユーティリティ、シェル、カーネルなどの層から構成されています。#

Linux 上で応用ソフトウェアを実行する際、操作は通常、ユーティリティやシェルを通じてカーネルに伝えられ、最終的にハードウェアにアクセスして処理が行われます。Linux には、ターミナルterminal)と呼ばれる応用ソフトウェアが標準で備わっており、ユーザーはユーティリティやシェルを直接操作することも可能です。これらの機能を直接操作できることで、プログラム開発やビッグデータ解析の効率が向上します。そのため、Linux はこれらの分野で高く評価されています。また、Linux と同様の歴史的背景をもつ macOS も、同じ理由から、プログラム開発やビッグデータ解析の分野で多くの開発者に利用されています。

このように、ソフトウェアの仕組みは、層の上にさらに層、その中にもまた層。とにかく階層だらけの構造です。各層はそれぞれ独立していて、自分の役割だけをきっちりこなすよう設計されています。そのおかげで、開発は効率的に進められるわけです。でも、どこかの層が動かなくなると、全体が止まってしまうこともあります。「それ、うちの担当じゃないんで」や「その件については把握しておりません」は、何も役所だけのセリフではありません。システムも同じなんです。

Note

Linux は、ハードウェア間の通信など基本的な機能を提供するカーネルと呼ばれるソフトウェアです。実際に OS として機能させるためには、このカーネルに加え、さまざまな補助的なソフトウェア(シェル、ユーティリティ、インターフェース、パッケージ管理システムなど)を組み合わせる必要があります。このようにして構成された OS を、正確には Linux ディストリビューション と呼びます。 ただし、現在では「Linux」と言う場合、多くの文脈でこの Linux ディストリビューション全体を指すことが一般的です。代表的な Linux ディストリビューションには、Debian、Ubuntu、Fedora などがあります。