プログラムは単体ではタスクを完遂できないこともある。特にソフトウェアライブラリが必要な場合が多い。ライブラリは単独では機能せず、スタンドアローンのプログラムから使われるソフトウェアコンポーネントを集めたものである。従って、プログラムに他の多くのプログラムでも共通に使える標準的ルーチンがあれば、それらをライブラリとして抽出できる。ライブラリには、何らかのイベントによって起動されるスタンドアローン型プログラムが含まれていることもあるし、何らかの機能(コンピュータ内の様々な雑事)を実行して呼び出し元にはデータを返さないものもある。 ユーザーの見方はプログラマとは異なる。(組み込みシステム、アナログコンピュータ、スーパーコンピュータなどとは対照的な)一般のコンピュータのユーザーは、ソフトウェアを3つの階層(プラットフォームソフトウェア、アプリケーションソフトウェア、ユーザー作成ソフトウェア)として見ている。 プラットフォームソフトウェア プラットフォームには、ファームウェア、デバイスドライバ、オペレーティングシステム、GUIなどが含まれ、ユーザーがコンピュータや周辺機器とやり取りすることを可能にする。周辺機器やコンピュータ本体に同梱あるいはプリインストールされていることが多い。パーソナルコンピュータの場合、プラットフォームソフトウェアをユーザーが置換することも可能である。 アプリケーションソフトウェア エンドユーザーがソフトウェアと言ったときに想定しているのがアプリケーションソフトウェアである。典型例としてはオフィススイートやパソコンゲーム(パソコン上で稼動するゲームソフト)がある。一般にハードウェアとは別に購入される。コンピュータ本体に同梱・プリインストールされることもあるが、独立したアプリケーションとして機能するという事実に変わりはない。アプリケーションは一般にオペレーティングシステムとは独立したソフトウェアであるが、特定プラットフォーム向けに作られることも多い。データベースもコンパイラもその他の「システムソフトウェア」も、エンドユーザーの観点ではアプリケーションと見なされることが多い。 ユーザー作成ソフトウェア ユーザーが特定のニーズに合うように作成するソフトウェア。表計算ソフトのテンプレート、ワープロソフトのマクロ、科学技術シミュレーション、グラフィックスやアニメーションのためのスクリプトなどが含まれる。電子メールフィルタなども一種のユーザー作成ソフトウェアである。ユーザーは自身の作成したこれらのソフトウェアの重要性に気づいていないことが多い。ユーザー作成ソフトウェアが購入されたアプリケーションソフトウェアとうまく統合されていると、多くのユーザーはその区別ができない。 ソフトウェアは記憶装置(ハードディスクドライブ、RAMなど)に「ロード」されて初めて機能する(実行可能になる)。逆にコンピュータはプログラムを実行することで機能する。このとき、アプリケーションソフトウェア内の命令列がシステムソフトウェアを経由してハードウェア(CPU)に渡され、それを機械語として実行する。各命令はコンピュータに何らかの操作(データの移動、計算、制御フローなど)を実行させる。 データの移動は、一般にメモリ上のある位置から別の位置に行われる。メモリとレジスタ間の移動の場合もあり、CPUがより高速にデータにアクセスできるようにする。大きなデータの移動は時間がかかるため、ポインタを使って移動しない場合もある。計算には、データのインクリメントのような単純なものも含まれる。より複雑な計算には、複数の命令と複数のデータ要素が必要となる。 命令は、逐次的に実行される場合、条件つきで実行される場合、繰り返し実行される場合がある。逐次的命令列は、1つずつ順に演算が実行される。条件付き命令列は、何らかのデータの値によってそれが実行されるか否かが決定される。プログラミング言語によってはこれをif文という。繰り返し命令列は、繰り返し実行されるもので、場合によっては何らかのデータの値で繰り返すか否かが決定される。これをループと呼ぶこともある。命令列をひとまとめにしたものをサブルーチンと呼び、他のサブルーチンを「呼び出す」命令もある。プロセッサが複数あるシステムでは(マルチプロセッシング)、命令列は複数同時並行的に実行される。 例えば、メニューから "Copy" というエントリを選択したとき、ソフトウェアがどのように機能するか考えてみよう。この場合、条件付き命令列が実行され、メモリ上の「文書」領域にあるデータからテキストが、一般に「クリップボード」と呼ばれる中間的記憶領域にコピーされる。別のメニューエントリである "Paste" が選ばれると、ソフトウェアはクリップボードから特定の領域にテキストをコピーする命令列を実行する。 アプリケーションによっては、もっと複雑な処理が行われる。ソフトウェア工学は、そのようなソフトウェアの操作の複雑さを管理・制御しようとする学問分野である。特に大規模なコンピュータを運用するためのソフトウェアは複雑化する傾向がある。 現在では、ソフトウェアの応用範囲を制限しているのは、開発者/プログラマの発想力だけと言っても過言ではない。かつては無理だと思われていた活動(グランドマスターレベルのチェスをさすことなど)も、次々とソフトウェア化されている。芸術だけはソフトウェアによるシミュレーションでは創造できないと考えられている[要出典]。 ソフトウェア株 は、ソフトウェアの運用によって生じるエラーや障害によって測られる。詳しくは、ソフトウェア品質、ソフトウェアテスト、コンピュータセキュリティを参照されたい。 ソフトウェアライセンスは、ユーザーにそのソフトウェアを使用する権利を与えるものである。ライセンス形態で分類すると、以下のようになる。コピーガードについても参照されたい。 ソフトウェア特許に関しては、様々な議論がある。特許がソフトウェア開発の妨げになると主張する人々もいるし、ソフトウェア特許によってソフトウェアの進化が促進されると主張する人々もいる。 新しい概念であるため、ソフトウェアのユーザーが持つべき権利についての考え方は、まだ発展途上である。フリーソフトウェアコミュニティでは、ユーザーは使っているソフトウェアの修正や再配布を自由に行えるべきだと考えられている。そうすることで自分のコンピュータを制御でき、各人が協力できるようになり、場合によっては複数の人々が集まって、特定のソフトウェアを特定の方向に進化させることが可能になる。また、そうなるような権利が保証されるべきだと彼らは主張する。他の人々は、ソフトウェアの作者がユーザーにどのような権利を与えるかを制御できるようにすべきだと主張している。 前者の哲学は、1960年代に始まるハッカー文化にその源流の一部がある。 オペレーティングシステム (Operating System, OS) は、コンピュータにおいて、ハードウェアを抽象化したインターフェースをアプリケーションソフトウェアに提供するソフトウェアであり、基本ソフトウェアの一種である。なお、OSのGUIフロントエンドであるオペレーティング環境についてもここで扱う。 広義のOSには、ウィンドウシステムやデータベース管理システム (DBMS) などのミドルウェア、ファイル管理ソフトウェアやエディタや各種設定ツールなどのユーティリティ(これらはいずれも基本ソフトウェア)、基本的なアプリケーションソフトウェア(ウェブブラウザや時計などのアクセサリ)を含むことがある。一般的に「オペレーティングシステム」という場合はこちらを指すことが多い。 現在に至る統合環境とIPO なユーザインタフェースを意識する傾向は、Mac OSやMicrosoft Windowsの登場で鮮明となった。このため、Mac OS以降の近年のOSとMS-DOSなどの初期のOSは分けて扱われることが多い。 OSの中で、ハードウェアを直接管理操作するなどの最も中心的な機能の部分を、特にカーネルと呼んで分けることもある。この場合、カーネル以外の部分(シェルなど)はユーザーランドと呼ばれる。また、カーネルとユーザーランドではCPUモードやアドレス空間が異なっている。 ちなみにオペレーティングシステムは完全な一般名詞だが、“OS”は本来IBMの商標である。 OSの主な目的は3つある。すなわち、ハードウェアの抽象化、リソースの管理、そしてコンピュータ利用効率の向上である。 ハードウェアの抽象化 コンピュータごとに目的は同じでも製造元が異なるなどで、動作に微妙に差異があるハードウェアが搭載されていることが多い。そのようなハードウェアの統一的で単純化された利用方法を提供することで、アプリケーションソフトウェアの開発を容易にする。 リソースの管理 複数のアプリケーションソフトウェアを同時に利用する際に、互いに独立して動作できるように資源を管理する。プログラムからの資源要求に競合が起きた場合には、待たせる、エラーを返すなど、適切に対処する。 コンピュータの利用効率の向上 複数のタスクを同時に実行する際に、資源割り当ての順番や処理の割り当て時間を工夫することで、全体のスループットを向上させる。これはデスクトップ環境ではあまり恩恵を感じることはないが、ウェブサーバやデータベースなど大量のアクセスをこなす用途などでは重要になる。 OSはアプリケーションソフトウェアを外貨預金 させるのが第一の目的である。このためのインターフェースがAPI(アプリケーションプログラミング・インタフェース)とABI(アプリケーションバイナリ・インタフェース)である。カーネルはシステムコールによってアプリケーションにサービスを提供する。さらに基本ライブラリも含めた形でアプリケーションに対してAPI/ABIを提供する。アプリケーションによってはOS上のミドルウェアやアプリケーションフレームワークなどをAPIとして使用する場合もある。 APIはプログラミングのためのインターフェースであり、プログラムを作成する際の規則を構成する。例えば、C言語での関数やFORTRAN/Pascalなどのライブラリ呼び出しといったものがそれにあたる。 一方、ABIはコンパイルされた為替 がOSの機能を呼び出す際のインタフェースであり、プロセスが動作する際の規則を構成する。例えば、UNIX系のOSはAPIがほとんど共通だが、ABIはOSによって異なる[1]。従って、同じCPUを使ったシステムであっても、ABIが異なれば実行ファイルが異なる。ABIには、エンディアン、実行ファイルの形式、システムコールの具体的な方法、コールスタックの使い方などが含まれる。コンピュータ上の各動作はバックグラウンドであっても一般のアプリケーションであっても、内部的にはプロセスとして動作する。DOSのような古いOSは一度に1つのプロセスしか実行できない。最近のOSは一度に複数のプロセスを動作させることができる(マルチタスク)。プロセス管理は複数のプロセスを実行するためにOSが行う処理である。プロセッサを1つだけ持つ一般的なコンピュータでは、マルチタスクは高速にプロセスからプロセスへ切り替えを行うことで実現される。ユーザーがより多くのプロセスを実行すれば、個々のプロセスに割り当てられる時間は少なくなっていく。多くのシステムでは、これが音声の途切れやマウスカーソルの奇妙な動作などを引き起こす。一般的なプロセス管理は、プロセスごとに優先度を与え、それによって配分される時間を決めている。 パーキンソンの法則によると、「メモリを拡張するとプログラムはそれに伴って拡大する」という。プログラマーは無限の容量と無限の速度のメモリを理想としている。コンピュータのメモリは階層構造になっていて、最も高速なレジスタから、キャッシュメモリ、RAM、最も低速なディスク装置がある。OS内のメモリ管理部はこのようなメモリを管理するもので、利用可能な部分、割り当てと解放、主記憶と二次記憶との間でのスワップなどを制御する。 OSはその歴史や用途に応じて様々のファイルシステムを備えている。 現在主流のOSにおいては、ほとんど全てのファイルシステムはディレクトリによる階層構造を持つ。これは、Multicsを起源とするものであり、メインフレームのOSではディレクトリを持たないものもある。また、ディレクトリ名とファイル名の区切り記号、ファイルの命名規則などはシステムによって異なる。