ソフトウェアとは

ソフトウェアとは、コンピュータシステム上で何らかの作業を行うプログラム群、プロシージャ群、それらに関する文書を指す用語です。物理的装置であるハードウェアと対比させて言うときに使います。プログラムとほぼ同義ですが範囲は更に広いです。日本では一般に略して「ソフト」とも呼ばれています。ソフトウェアには、ワープロソフトのように生産的な仕事を行うためのアプリケーションソフトウェア、アプリケーションソフトウェアに必要なサービスを提供するハードウェアとのインタフェースとなるオペレーティングシステムのようなシステムソフトウェア、分散システムを制御・管理するミドルウェアなどがあります。

コンピュータハードウェアとの関係

ソフトウェアは、物理的なハードウェアと対比した言葉であり、LSIなどの電子回路そのものは、コンピュータに処理をさせる手順を記述していても、物理的な物であるのでソフトウェアとは呼ばないです。ハードウェアでありソフトウェアでもある中間的な存在として、ファームウェアがあります。コンピュータにおいて、ソフトウェアはRAMにロードされ、CPUで実行されます。最も低いレベルでは、ソフトウェアは特定のプロセッサに固有の機械語で構成されています。機械語はプロセッサへの命令となる2進数の値から構成されていて、それによってコンピュータの状態を次々と変化させます。従ってソフトウェアは、コンピュータハードウェアの状態を変化させる命令列です。通常、機械語よりも人間が使いやすい高級言語で書かれます。高級言語はコンパイラかインタプリタによって機械語のコードに変換されます。他にも機械語とほぼ一対一に対応したアセンブリ言語があり、アセンブリ言語で書かれたソフトウェアはアセンブラによって機械語に変換されます。ほとんどのコンピュータは、オペレーティングシステム(OS)と呼ばれる特別なソフトウェアプログラムでリアルタイムに機械(ハードウェア)が制御されます。ソフトウェアの他の形態にはプログラム言語のアセンブラおよびコンパイラ、企業および家庭向けアプリケーションソフトウェアがあります。1957年にJohn W. Tukeyがこの意味で「ソフトウェア」という用語を最初に使用しました。情報工学およびソフトウェア工学では、ソフトウェアはコンピュータシステム、プログラム、データにより処理される情報全般やあらゆる「機械装置以外のもの」を示します。記憶装置に異なる命令群を読み込んで計算を制御する概念は階差機関の一部としてチャールズ・バベッジが考案しました。これがほとんどの近代ソフトウェアの基礎となる理論はアラン・チューリングの1935年の論文 Computable numbers with an application to the Entscheidungsproblem で初めて提唱されました。

ソフトウェアの分類

一般のコンピュータシステムでは、ソフトウェアを3つの階層、システムソフトウェア、プログラミングツール、アプリケーションソフトウェアに分けますが、その境界はあいまいです。
システムソフトウェア
ハードウェアやシステムが動作するのを助けます。システムソフトウェアは、システムに使われているハードウェアの詳細(メモリ、通信、プリンタ、リーダー、ディスプレイ、キーボードなど)を抽象化し、アプリケーションが詳細に煩わされないようにすることを目的としています。
具体的には以下のようなものがある。
■ファームウェア - Basic Input/Output System (BIOS) など。
■基本ソフトウェア - オペレーティングシステム(OS)、デバイスドライバ、ウィンドウシステム、ユーティリティソフトウェア、各種サーバ
■ミドルウェア
プログラミングツール
プログラマがプログラムを書くのを補助するツール群。統合開発環境 (IDE) はそのようなツールを統合したソフトウェアです。
■テキストエディタ
■コンパイラ、インタプリタ、リンケージエディタ、デバッガ
アプリケーションソフトウェア
特定のタスク(群)を実施するためのソフトウェア。企業活動での利用が大きな部分を占めますが、およそ人間のあらゆる活動には、それに対応したアプリケーションソフトウェアが存在します。
■ファクトリーオートメーション
■ビジネスソフトウェア
■教育ソフトウェア
■医療ソフトウェア
■データベース
■パソコンゲーム(ゲーム機のゲームソフトも含む)

プログラムとライブラリ

プログラムは単体ではタスクを完遂できないこともあります。特にソフトウェアライブラリが必要な場合が多いです。ライブラリは単独では機能せず、スタンドアローンのプログラムから使われるソフトウェアコンポーネントを集めたものです。従って、プログラムに他の多くのプログラムでも共通に使える標準的ルーチンがあれば、それらをライブラリとして抽出できます。ライブラリには、何らかのイベントによって起動されるスタンドアローン型プログラムが含まれていることもあるし、何らかの機能(コンピュータ内の様々な雑事)を実行して呼び出し元にはデータを返さないものもあります。

ソフトウェアの階層

ユーザーの見方はプログラマとは異なります。(組み込みシステム、アナログコンピュータ、スーパーコンピュータなどとは対照的な)一般のコンピュータのユーザーは、ソフトウェアを3つの階層(プラットフォームソフトウェア、アプリケーションソフトウェア、ユーザー作成ソフトウェア)として見ています。
プラットフォームソフトウェア
プラットフォームには、ファームウェア、デバイスドライバ、オペレーティングシステム、GUIなどが含まれ、ユーザーがコンピュータや周辺機器とやり取りすることを可能にします。周辺機器やコンピュータ本体に同梱あるいはプリインストールされていることが多いです。パーソナルコンピュータの場合、プラットフォームソフトウェアをユーザーが置換することも可能です。
アプリケーションソフトウェア
エンドユーザーがソフトウェアと言ったときに想定しているのがアプリケーションソフトウェアです。典型例としてはオフィススイートやパソコンゲーム(パソコン上で稼動するゲームソフト)があります。一般にハードウェアとは別に購入されます。コンピュータ本体に同梱・プリインストールされることもありますが、独立したアプリケーションとして機能するという事実に変わりはありません。アプリケーションは一般にオペレーティングシステムとは独立したソフトウェアですが、特定プラットフォーム向けに作られることも多いです。データベースもコンパイラもその他の「システムソフトウェア」も、エンドユーザーの観点ではアプリケーションと見なされることが多いです。
ユーザー作成ソフトウェア
ユーザーが特定のニーズに合うように作成するソフトウェア。大は銀行の預貯金口座を管理する勘定系システムやJRの「みどりの窓口」で使われるマルスなどの大規模なオンラインシステムを始め、販売や営業、生産などの各種業務管理システムなどの個別開発のソフト群(各企業内でのコンピュータシステム(情報システム)の一部を形成する)から、小は表計算ソフトのテンプレート、ワープロソフトのマクロ、科学技術シミュレーション、グラフィックスやアニメーションのためのスクリプトなどが含まれます。電子メールフィルタなども一種のユーザー作成ソフトウェアです。ユーザーは自身の作成したこれらのソフトウェアの重要性に気づいていないことが多いです。ユーザー作成ソフトウェアが購入されたアプリケーションソフトウェアとうまく統合されていると、多くのユーザーはその区別ができません。

ソフトウェアの操作(演算)

ソフトウェアは記憶装置(ハードディスクドライブ、RAMなど)に「ロード」されて初めて機能します(実行可能になる)。逆にコンピュータはプログラムを実行することで機能します。このとき、アプリケーションソフトウェア内の命令列がシステムソフトウェアを経由してハードウェア(CPU)に渡され、それを機械語として実行します。各命令はコンピュータに何らかの操作(データの移動、計算、制御フローなど)を実行させます。データの移動は、一般にメモリ上のある位置から別の位置に行われます。メモリとレジスタ間の移動の場合もあり、CPUがより高速にデータにアクセスできるようにします。大きなデータの移動は時間がかかるため、ポインタを使って移動しない場合もあります。計算には、データのインクリメントのような単純なものも含まれます。より複雑な計算には、複数の命令と複数のデータ要素が必要となります。命令は、逐次的に実行される場合、条件つきで実行される場合、繰り返し実行される場合があります。逐次的命令列は、1つずつ順に演算が実行されます。条件付き命令列は、何らかのデータの値によってそれが実行されるか否かが決定されます。プログラミング言語によってはこれをif文といいます。繰り返し命令列は、繰り返し実行されるもので、場合によっては何らかのデータの値で繰り返すか否かが決定されます。これをループと呼ぶこともあります。命令列をひとまとめにしたものをサブルーチンと呼び、他のサブルーチンを「呼び出す」命令もあります。プロセッサが複数あるシステムでは(マルチプロセッシング)、命令列は複数同時並行的に実行されます。例えば、メニューから "Copy" というエントリを選択したとき、ソフトウェアがどのように機能するか考えてみましょう。この場合、条件付き命令列が実行され、メモリ上の「文書」領域にあるデータからテキストが、一般に「クリップボード」と呼ばれる中間的記憶領域にコピーされます。別のメニューエントリである "Paste" が選ばれると、ソフトウェアはクリップボードから特定の領域にテキストをコピーする命令列を実行します。アプリケーションによっては、もっと複雑な処理が行われます。ソフトウェア工学は、そのようなソフトウェアの操作の複雑さを管理・制御しようとする学問分野です。特に大規模なコンピュータを運用するためのソフトウェアは複雑化する傾向があります。現在では、ソフトウェアの応用範囲を制限しているのは、開発者/プログラマの発想力だけと言っても過言ではありません。かつては無理だと思われていた活動(グランドマスターレベルのチェスをさすことなど)も、次々とソフトウェア化されています。芸術だけはソフトウェアによるシミュレーションでは創造できないと考えられています。