第二章 ソフトウェアの基礎

2.1 ソフトウェアの重要性
□コンピュータの特徴
ハードウェアはいわゆる「金物」であり、機械そのものである。
あくまで機械であるハードウェアに対して、人間の知識や機械の制御のための命令を集めたものが、ソフトウェアだといえる。
人間の頭脳と同様、ソフトウェアはコンピュータにとってたいへん重要であり、存在価値が高いものである。

□ソフトウェアの体系と種類
ソフトウェアはいくつかの種類に分類できる。
厳密に定義づけられてはいないが、おおよそ図2−1のようなものが一般的である。
◇ミドルウェア
2つの意味がある。
1つは、OSなどの基本ソフトウェアとアプリケーションなどの中間的なソフトウェア。
もう1つは、多用な利用分野に共通する基本的機能を実現するソフトウェア。

システムソフトウェア 基本ソフトウェア
(広義のOS)
制御プログラム(狭義のOS:基本通信制御ふくむ)
汎用言語プロセッサ
サービスプログラム(ユーティリティ)
ミドルウェア DBMS
通信管理システム(LAN制御ふくむ)
ソフトウェア開発支援ツール(CASEふくむ)
第4世代言語
EUCツール
GUI制御
ワードプロセッサ
グラフィック処理
運用管理ツール
応用ソフトウェア 共通応用ソフトウェア CAD
CAIオーサリングシステム
エキスパートシステムシェル
機械翻訳
OR、統計処理(LP、シミュレーション、多変量解析など)
科学技術計算ライブラリ
特殊問題向き言語
個別応用ソフトウェア 各種業務固有のアプリケーション

◇ファームウェア
ハードウェアとソフトウェアの中間に位置するソフトウェア。
OS(制御プログラム)の一部をマイクロプログラムで直接実行し、高速化する。
マイクロプログラムとは、機械語命令の解読・実行を基本動作(マイクロ動作)の組み合わせで表したものである。
◇共通応用ソフトウェア
応用ソフトウェアの中で、多種多様な業種・業務に共通するソフトウェアのこと。

個別応用ソフトウェア
(各種業務固有のアプリケーション)
共通応用ソフトウェア
・交通管制システム ・CAD
・プロセス制御システム ・CAIオーサリングシステム
・組立工場生産管理システム ・エキスパートシステムシェル
・販売管理システム ・機械翻訳
・財務管理システム ・OR、統計処理(LP、シミュレーション、多変量解析など)
・座席予約システム ・科学技術計算ライブラリ
・特許情報検索システム ・特殊問題向き言語
・気象情報処理システム
・病院情報処理システム
・全銀為替交換システム
・TSSサービス


□サブルーチン
ユーザが、ミドルウェアや応用ソフトウェアを必要に応じて使用するのと同じように、個々のプログラムも、必要に応じてほかのプログラムを使用することができる。
サブルーチンとは、プログラム中で頻繁に行われる処理等を1つのまとまりとして独立させたものである。
◇再入可能(リエントラント)サブルーチン
複数のプログラムが、同一のサブルーチンを同時に呼び出すことが可能である。
それぞれのプログラム用のデータは、それぞれ別の領域に確保される。
◇再帰的(リカーシブル)サブルーチン
サブルーチンが、それ自身を繰り返し呼び出して使用するものを再帰的サブルーチンとよぶ。

2.2 オペレーティングシステム
□オぺレーティングシステムとは
ハードウェアのいろいろな機能を効率よく使うことや、ユーザにできる限り使いやすい環境を提供することを目的とした、基本的なプログラム群のことをいう。
通常、OSとよばれる。
OSは、さまざまなアプリケーションプログラムを実行させるために、ハードウェアに対して指示を与えて制御し、環境を整えている。

OS ジョブ管理
タスク管理
入出力制御
データ管理(ファイル管理)
運用管理
障害管理

◇OSの目的
・スループットの向上
コンピュータシステム全体の処理能力を向上させる。
スループットとは、単位時間あたりの仕事の量をいう。
・ターンアラウンドタイム、レスポンスタイムの短縮
何か処理をする指示をコンピュータに与えて、すべての結果が出てくるまでの時間を、ターンアラウンドタイムという。
レスポンスタイム(応答時間)は、コンピュータに要求を与えてはじめに反応するまでの時間のことである。
OSは、これらの時間をできるだけ短縮させる。
・使用環境を整える
処理の途中で障害があったとき、エラーメッセージを出力して使用者に知らせたり、簡単にソフトウェアが破壊されないように保護したり、できるだけ安定してソフトウェアが動作できるようにする。
◇OSの特徴
一般的にいって、パソコンやワークステーションなどのOSは、操作性の向上を重視して、汎用機(メインフレーム)のOSは、システムの資源の有効活用を重視して作られている。
これは、前者が個人ユースとしての機能性がまず求められるのに対し、後者は、膨大なデータ量をかかえる大型コンピュータで、たくさんの人が使用する、という背景があることに起因する。
実際には、通常は特にOSを意識することなく、さまざまなプログラムを実行することができるが、その裏で、必ずOSは働いている。

□OSの基礎
◇広義のOS
広義のOSは、基本ソフトウェア一般をさす。
具体的には、制御プログラム言語処理プログラム(言語プロセッサ)、サービスプログラム(ユーティリティ)の3つである。
言語処理プログラムとは、人間の言葉に近いプログラム言語を機械語に翻訳するものをいう。
サービスプログラムは、ユーザを支援するプログラムのこと。
多くの場合、OSに付属してくるプログラムのことを示す。
◇狭義のOS(=制御プログラム)
制御プログラムは、コンピュータで動作する多種多様なソフトウェアが、効率よく動くことができる環境をつくっている。
狭義のOSといわれる。
以降は、狭義のOS(制御プログラム)について重点的に整理する。
◇ジョブ管理
人間から見たコンピュータの仕事の単位をジョブという。
「利用者があるデータをコンピュータに与えて、いくつかの処理を実行し、欲しい結果が得られる」といった場合の、処理のかたまりのことをいう。
ジョブはいくつかのプログラムを連続して実行していくわけだが、この1つひとつの処理をジョブステップという。
OSは、ジョブ管理によって、プログラムを連続実行させ、効率的に利用できるようにしている。(図2−4
・ジョブスケジューラ
ジョブ実行のスケジューリングを行うもの。
あらかじめ、処理の連続実行に必要な情報を与えておけば、ジョブスケジューラが自動的に実行を行ってくれる。
・マスタスケジューラ
ジョブの実行に際し、さまざまな命令のやりとりや、メッセージの受け渡しを行うもの。
・ジョブ制御言語
JCL(Job Contorol Language)ともいう。
ジョブの実行に必要となるさまざまな命令を記述する言語。
・ジョブストリーム
実行するジョブステップ(ジョブを構成する1つひとつの処理)を順に並べたもの。
・プライオリティ
優先順位。
ジョブスケジューラは、プライオリティの高い順番にジョブを実行する。
◇スプーリング
低速な入出力動作と、高速なCPU動作の差から発生する無駄をはぶくため、ジョブの登録や実行結果の出力などの際、スプールとよばれる一時バッファを利用する。
このスプールを使用した入出力をスプーリングという。
◇タスク管理
実際にプログラムを実行するコンピュータから見た処理の単位をタスクという。
タスクは、生成されてから、「実行可能状態」「実行状態」「事象待ち状態」の3つの状態を繰り返しながら実行される。
複数のタスクがあるとき(マルチタスクという)に、どのタスクを処理したらよいのかを制御するのが、タスク管理である。
処理するタスクを選ぶということは、すなわち、どのタスクにCPUタイムを割り当てるかを決める、ということ。
タイムシェアリングシステムや、マルチプログラミング下で実行するような場合、必要となる機能である。
マルチプログラミングとは、OSの働きによって、複数のプログラムを見かけ上同時に実行させることをいう。
CPUのアイドルタイムを有効に使うために行う。
◇データ管理
データの入出力や、ファイルの管理のこと。
メインフレームの世界では、データ管理とよぶが、パソコンやワークステーションのOS世界では、ファイル管理とよばれるのが普通である。

□その他OSに関する機能
◇記憶管理
OSは、通常次の処理を繰り返しながら、プログラムを実行する。
@あるプログラムを実行するのに必要なプログラム、データを補助記憶から読み出す
A読み出したプログラムを主記憶上にロードする
B必要のなくなったプログラムを追い出し、新たなプログラムと置き換える
これらを効率よく処理できる(主記憶を無駄なく使い、CPUを遊ばせない)ように、記憶管理機能が備わっている。
・再配置
すでに主記憶上に割り付けられているプログラムを、別の領域に割り付け直すことを再配置という。
また主記憶上のどこの領域に割り付けられても実行できるプログラムを再配置可能プログラムとよぶ。
さらに、プログラムの実行中にも再配置可能であるものを、動的再配置可能プログラムとよぶ。
・スワッピング
スワッピングとは、主記憶の内容と補助記憶の内容を入れ換えることである。
CPUの利用効率を上げるため、アイドル状態のプログラムを補助記憶上にいったん退避させ(スワップアウト)、その空いた領域をほかのプログラムの実行のために使用する。
補助記憶へ退避させられていたプログラムを、再び主記憶上へロードし直すことをスワップインという。
・オーバレイ
プログラム全体を主記憶にロードするのではなく、いくつかのセグメントに分け、必要なときに必要なものだけをロードし、実行する方式。
セグメント分割、主記憶への割り付けは、ユーザが指示できる。
オーバレイは「上書き」であるので、各セグメントは予約された領域に「上書き」してロードされる。
◇仮想記憶
実際にある記憶容量よりも大きな論理アドレス空間を使用する仕組み。
これを行うには、OSに仮想記憶管理プログラムが用意されている必要がある。
セグメント方式、ページング方式などといった方法がある。
・セグメント方式
プログラムを意味のあるかたまりに分割し、必要なかたまりを主記憶装置において実行する方式。
このかたまりをセグメントという。
たとえば、メインプログラム、サブルーチン、データなどは1つの意味のある単位といえる。
各セグメントがどこに記憶されているのかという情報は、セグメントテーブルで管理している。
必要なセグメントが主記憶上にない場合は、不要なセグメントを補助記憶領域にロールアウトし、対象セグメントを主記憶にロールインする。
・ページング方式
補助記憶上のプログラムを物理的な一定の大きさに分割して主記憶に記憶するという方式。
この一定の大きさのものをページという。
必要とするページが主記憶上にないと、ページフォルトが起こる。
主記憶上の空きページが不足してくると、ページフォルトが頻発して起こるようになる。
このことをスラッシングとよぶ。
スラッシングが起こると、ページング処理に時間がかかり、CPUの利用効率が低くなる。
また、必要なページを主記憶におくことをページインといい、不要なページを補助記憶装置にもどすことをページアウトという。
このページイン、ページアウトを行う手順には、FIFOLRUがある。
FIFOは、最も主記憶に長い間あるページを先に追い出し、LRUは、参照されてからの時間がもっとも長く経過したページから追い出す。
・DAT(Dynamic Address Translation)
動的アドレス変換機構
必要なデータが主記憶のどこにあるかを知り、割込みによってそのデータにアクセスしたい旨をOSに告げる機能。
仮想記憶を行うハードウェアには必要である。
◇割込み
割込みには、大まかにはOSの外からくる外部割込みと、OSのシステムないで起こる内部割込みの2種類がある。
・外部割込み
入出力割込み、タイマ割込み等のこと。
・内部割込み
スーパバイザコール、プログラム割込み等のこと。
◇スーパバイザコール(SVC割込み)
処理プログラムがOSの機能を利用したいときには、その知らせをまずOSに対して行わなければならないが、これをスーパバイザコール(システムコール)という。
OSへの処理の依頼のようなものである。

□OSの具体例
◇UNIX
UNIXはAT&Tベル研究所で開発されたOSである。
UNIXは、複数の人間が同時に複数の処理を実行させることができるマルチユーザ、マルチタスクを特徴としている。
移植性がよく、仕様もオープンであるため、企業内でも急速に普及し続けている。
ただし、System V系とBSD系の2系統が存在し、これまではそのことが重大な課題となっていたが、現在は統合の方向に向かっている。
◇Windows
米マイクロソフト社が開発したOSである。
現在、WindowsCE、Windows95、WindowsNTの3種類がある。
Windous95とWindowsNTは、
・ユーザインタフェース
・エクスプローラ等のユーティリティプログラム
・ユーザプロファイル、ハードウェアプロファイル等
の機能において共通であるが、以下の点においてそれぞれ違った特徴をもつ。
(1)Windows95は、容易に利用できるよう、WindowsNTよりもハードウェアの必要条件が少なく、広範囲のアプリケーションやデバイスと互換性があり、インストールが簡単である。
(2)WindowsNTは、ビジネス環境での利用を意識したOSで、Windows95より高性能、高信頼性、高セキュリティ性をもつ。
(3)WindowsCEは、携帯情報端末用に開発されたOSで、プロセッサに依存しない設計になっている。

2.3 プログラム言語と言語プロセッサ
□プログラム言語の分類
◇言語の発展
初期のコンピュータは、プログラムをハードウェアでつくっていた(これをワイヤードロジックという)。
そのため、プログラムを変えるということは、すなわちハードウェアの配線を変えるということであった。
その後、プログラム内蔵方式(あらかじめ計算の論理をプログラムやデータとして、コンピュータ内部の記憶装置におき、そこから逐次引き出して、演算装置で処理を行う方法)のコンピュータになったが、依然として記述は2進数の0と1で表す機械語だった。
そこから、人間が見てもわかりやすいように、機械語を記号化したアセンブラ言語が生まれ、これがソフトウェアの抽象化の始まりとなって、コンパイラ言語が数多く生み出されるようになったのである。
現在は、より人間の言葉に近い、わかりやすく使いやすい言語が開発されている(4GL:第4世代言語とよばれる)。
◇プログラム言語
・FORTRAN
FORmula TRANslatorの略。
1956年に開発された、科学技術計算向きの言語。
・ALGOL
ALGOrithmic Languageの略。
1960年にヨーロッパで開発された言語。
言語の規則を厳密にしかも簡潔に表現しているという点が評価された。
・COBOL
COmmon Business Oriented Languageの略。
1960年にCODASYL委員会(COnference on DAta SYstems Language)から生まれた。
米国政府主導で普及した事務処理向き言語。
英語に近い表現で、プログラム自体にドキュメントがふくまれていることから、事務処理には非常に適した言語といわれている。
・C
1972年にベル研究所のD.M.リッチーによって設計された。
UNIX OSを記述する際に使用されたシステム記述言語で、アセンブラに近い処理も可能である。
パソコン上でも稼動できる。
・C++
Cにオブジェクト指向を加えた言語。
・Java
Sun Microsystems社が開発した、プラットフォームに依存しないオブジェクト指向言語。
言語としてはC++によく似ている。
・PL/I
1963年にIBM社とユーザ団体SHAREで開発された。
事務処理と科学技術計算のどちらにも向いている汎用言語を目指してつくられたが、コンパイラが巨大であるため、大型汎用機でしか稼動できなかった。
・PASCAL
1970年にALGOLの流れから生まれる。
プログラミング教育用に開発された。
構造化プログラミングにたいへん適した言語であるといわれている。
・BASIC
Beginners All-purpose Symbolic Instruction Codeの略。
1964年米国で開発され、パソコンの主流言語となった。
・LISP
1958年にMIT大学にて開発されたリスト処理用の言語。
人工知能用として使用されている。
・Smalltalk
米国XEROX社パソコンAltoのためにアラン・ケイが開発したオブジェクト指向型言語。
マウス操作で記述が可能。
・Prolog
人工知能用ソフトウェア開発言語。
推論機能をもつ論理型言語である。

□言語プロセッサの種類と機能
◇ソースプログラム
プログラム言語を使って人間が記述したプログラムのこと。
このままではハードウェアに与えてデータ処理を実行できない。
ソースプログラム原始プログラム)を翻訳して、ハードウェアに理解できるようにするOSの処理プログラムが必要である。
これを、言語プロセッサ、または言語処理プログラムとよんでいる。
◇アセンブラ
アセンブラ言語で記述されたものを機械語に翻訳することをアセンブルといい、この言語プロセッサをアセンブラとよぶ。
アセンブラ言語の命令は、基本的に機械語命令と1対1で対応している。
◇コンパイラ
処理の順番を考えて論理を組み立て(これをアルゴリズムという)、その論理に基づいてプログラムの記述をするのに適した言語を、手続き向き手続き型言語という。
このような手続き向き言語で記述されているソースプログラムを機械語に翻訳することをコンパイルといい、言語プロセッサをコンパイラという。
・オブジェクトモジュール
コンパイルしたものをオブジェクトモジュール、または目的プログラムという。
オブジェクトモジュールは、機械語になってはいるが、このままでは実行できない。
プログラムのアドレスが未定義のままだからである。
リンカ連係編集プログラムともよばれる。
・ロードモジュール
リンクしたものをロードモジュールまたは実行プログラムという。
ここでプログラムの実行が可能になる。
・ローダ
実行可能プログラムを補助記憶装置から主記憶装置にロードするプログラムをローダという。
プログラムはロードされ、はじめて実行される。
・最適化
コンパイラが、ソースプログラムを解析して、オブジェクトモジュールをなるべく小さく、作成すること。
また、最適化によって、実行速度を速くすることもできる。
このようなコンパイラは、最適化コンパイラという。
・コンパイラコンパイラ
コンパイラを生成するためのコンパイラ。
・クロスコンパイラ
あるコンピュータ上で、別のコンピュータのための目的プログラムを生成するコンパイラ。
◇インタプリタ(解釈実行プログラム)
手続き向き言語で記述されたプログラムを、1命令ずつ翻訳して、すぐに実行する言語プロセッサをいう。
これを前提としたプログラム言語を、インタプリタ言語とよんでいる。
インタプリタは、機械語のプログラムを新たにつくりだすことはせず、直接、命令を実行する。
◇ジェネレータ(生成プログラム)
空欄を埋めていくように、あるパラメタを与えることによって、実行のための情報が整えられるような言語プロセッサをいう。
あらかじめ決められている処理の基本パターンに、パラメタを利用して変更を加え、機械語を生成するもの。
いわば、レディメード的なものである。
これを前提としたプログラム言語をジェネレータ言語といい、非手続き型非手続き言語ともよばれる。


TOPへ  第三章へ