コラム・特集

1.3 コンピュータ・ システムのソフトウエア

IEハンドブック
第12部 コンピュータと情報処理システム

第1章 コンピュータに関する基礎知識

1.3 コンピュータ・ システムのソフトウエア

コンピュータのプログラムとプログラミング言語コンピュータ・プログラムは,まさにコンピュータの仕事の詳細記述である。もしプログラムが機械語 (あるいは機械語に近い形式)で書かれているならば,それは低いレベルで書かれているという通常,システム側で用意している「アセンブラ」と呼ばれる言語があり,これを用いて,ユーザーは機械語を便利な形で書くことができる。しかしながら,低いレベルでプログラムを書くことは,非常に退屈で,ミスを犯しやすいものであるから,プログラムを書く別の方法が開発されている。

これらの方法は,高級プログラミング言語,例えば,FORTRAN,COBOL,PL/1,Pascalなどを用いることである。プログラミング言語は,言葉であると同時に,コンピュータ・プログラムを書くのに使われる言語処理プログラム〔「コンパイラ」 (翻訳ルーチン)と呼ばれる〕でもある。そのような言語は,人間が習い,理解するのにやさしい言葉で,各種の計算手続きを表現できるように設計されている。コンパイラは,システムが用意しているプログラムであり,言語で書かれた表現をコンピュータ の命令に翻訳する。人間に便利なプログラミング言語を持つことと,その言語で書かれたプログラムをコンピュータの命令の列にコンピュータが自動翻訳すること,この2段階からなるアプローチは,プログラムを作る上で最も良い方法であることが知られている。もし人間が,プログラムをコンピュータ向きの言葉で,直接書かねばならないならば,プログラムを作る仕事は,高価な雑用となる。

FORTRAN( Formular Translator)は,広く使われている言語の1つである 図表12.1.2に ,あるリストの数値から,その平均と分散を求めるFORTRANプログラムを示した。

図表12.1.3は ,Pascalプログラミング言語で書かれたプログラムであり,同じ計算,すなわち,あるリストの数値から平均と分散を計算するものである。これらの2つの例を示した目的は,FORTRANや Pascalを教えることではなく,むしろこれらのプログラム言語の特色を示すためである。

ここで示したプログラムは,少ない数 (例えば3個) の数値に対してその統計量を計算するのでは,実際に何の価値もない。しかし,3,000個の数値に対してならば,大いに価値があるであろう。また,これは非常に簡単なプログラムであることも,指摘しておかねばならない。生産現場で使われるプログラムは,しばしば非常に複雑で,長いものとなる。多分,ステートメントの行数が,1,000から10,000,あるいはそれ以上のオーダーとなる。事実,学生にプログラミングを教えようとするとき,このことが問題となる。なぜなら,プログラミングの練習問題は,一般に短く簡単である。一方,産業や研究の分野では,はるかに大きなサイズで,複雑なプログラムとなる。簡単な問題を解くのに,誰もコンピュータ・プロ グラムを書いたりはしない。それはあまりにも対価が大 き過ぎるからである。

今日,多くのプログラミング言語が使われている。図表12.1.4はそれらのリストである。

図に示した言語すべてが,どのコンピュータ・システムでも利用できるわけではない。しかし,多分最も普及しているFORTRANを始め,幾つかの言語は,多くの異なるシステムで利用可能である。最も広く使われている言語はCOBOLであろう。

プログラムをインプリメント (プログラムを作成し,実際にコンピュータに組み込んで,稼働するようにすること)する仕事が容易であることは別にして,通常,これらの言語の1つを用いることは,ほんのちょっとした努力を追加することで,あるシステム用に書かれたプログラムを,別のシステムに移植できることを意味する。

しかしながら,プログラムが特定のシステムの特殊な性質,例えば1ワードのビット数などを幾つか用いている。ならば,プログラムを他のシステムに移植することは, 広範囲にわたる変更を必要とし,不可能な場合すら起こり得る。

アセンプリ言語
アセンプリ言語とは,各ステートメントがコンピュータの1つの命令に,直接に翻訳されるような言語のクラスである。この翻訳プログラムがアセンブラである 。この種の言語クラスに属するものは,コンピュータの特定の種類に依存している。すなわち,類似したコンピュータ同士の系列ごとに,異なるアセンブリ言語がある。これは,あるコンピュータ向けに,アセンブリ言語で書かれたプログラムは,命令語のレベルで元のシステムと互換性のあるものでない限り,他の種類のコンピュータに移植できないことを意味している。

アセンプリ言語は,主に時間あるいはメモリ容量の点で,厳しい要求のあるプログラムを書くときに使われる。そのようなことはだんだん少なくなってきているが,時時,高級言語が使えないシステムがある。プログラマーは,機械語命令を書くことにより,システムを直接に利用できるので,その結果は,コンパイラによって作成されるものより,しばしば小さく,実行時間の点でも速いプログラムとなる。また,プログラマーは,特殊命令のようなシステムの特性を,すべて使用することができる。これらの特性の幾つかは,(オペレーティング・システムやコンパイラなどを構成するソフトウエア要素のような) 高度に利用されるプログラムをアセンプリ言語でインプ リメントすることを,可能にするかもしれない。

アセンブリ言語を使用するときの主な問題は,それに付随するコストとプログラミング時のエラー率が,高い傾向にあることである。その理由は,アセンプリ言語で書かれたプログラムは,例え簡単なプログラムでも,プログラマーがたくさんのステートメントを書かねばならないことと,言語のステートメントが,人間向きよりも, 機械向きに作られていることである。高級言語で書かれた等価なプログラムは,少ないステートメント (しかし,それはより多くの機械語命令に置き換えられるのだが)からなり,広範なエラー・チェックがコンパイラによって行われ ,ステートメントは理解しやすくなるといった傾向があるハードウエアがより高速に,より廉価になる。

一方で,プログラミング・コストが上昇するので,プログラムをアセンブリ言語で書くことの正当性が,減ってきている。今日,多くのオペレーティング・システムやコンパイラですら,高級言語で書かれるようになりつつある。

サブルーチン,ライプラリー,ロ―ダー
プログラムを書くとき, しばしば,プログラムの中に同じステートメントのグループを繰り返し使うことがある。そのようなステートメントのグループを一度だけ書き,もしそれが必要になったとき,それを「呼び出す」ようにできれば,プログラマーにとって時間の節約になる。すべてのプログラミング言語は,そのようなステートメントのグループを定義し,必要なとき,それに制御を渡す機能を持っている。そのようなステートメントのグループは,ある種の言語では「サブルーチン」とか「関数」と,また別の言語では「手続き」と呼ばれている 図表12.1.5は ,「サブルーチン」と呼ばれるFORTRANプログラムの1例で,それが呼び出されるたびに,テキストの1行が印刷される。

多くのシステムには,システム側で用意している「リンキング・ローダー」(あるいは「リンケージ・エディタ ー」 )と 呼ばれるプログラムがあり ,それは,あるプログラムと幾つかのサブルーチンをまとめて, 1つのロード・モジュールあるいは実行形式のプログラムに結合するのである。そのようなシステムでは,利用できる言語のコンパイラ やアセンブラが,ローダーの要求する形式に合わせて,機械語命令からなる「オブジェクト・コード」あるいはオブジェクト・モジュールを作成する。特にプログラムは,そのプログラマーが作ったものばかりではなく,システムのサブルーチン・ライブラリーの中にあるサブルーチンを呼び出して,利用することもできる。ローダーは,これらの呼び出しを検出し,コンパイラで作られたオブジェクト・コードと一諸に,これらの呼び出されたサブルーチンを,ライブラリーからロードすることができる。呼び出されたサブルーチンに引数を受け渡し,その値を呼び出したプログラムに戻すための画一的な技法が,このプロセスにとって本質的である。

このように,コンパイル済みのサブルーチンのライブラリー化が可能なことは,プログラムを書く人々に大きな恵みとなる。多くのシステムは,そのようなサブルーチン・ライブラリーを幾つか持っている。例えば,連立方程式の解法,ある区間の上での関数の積分,線形計画問題の解法など,共通に使われる数理機能を持つサブルーチンである。これ以外の例では,あるデータの集まりに対して統計的検定を行うサブルーチンや,データをデジタル・プロッタに出力するサブルーチンがあるまた,システムが用意している多くの機能 ,例えば,書式が決まっている出力行の印刷や,入力行の読込みなどが,ライブラリー内にサブルーチンとして,インプリメントされている。

この結果,時間が節約され,プログラミング・エラー も減少する。ある種の機能を遂行する効率的な手続きを集めた,サブルーチン・ライブラリーを売り出す企業すら出てきた。仕事の内容が明確な計算業務を遂行するのに,前に書かれたサブルーチンを利用できるこの種のアプローチは,非常に重要である。なぜならば プログラマーに,そ の場しのぎの思いつきをさせずに,先人の知 恵の利用を許すからである。

ファイル
ファイルとは,名前の付いたデータの並びであるファイルには,その名前,位置,構造などの属性がある。ファイルを「データ・セット」と呼ぶシステムもある。大多数の大規模システムは,ファイル・ベースのシステムとか,ファイル中 ,いのシステムと呼ばれるものである。そのようなシステムでは,プログラムとデータが,ファイルの形で,通常は回転型の大容量記憶装置に蓄えられているシステムの中に大量のファイルを覚えておくために,システムはファイルのディレクトリー(台帳)を持っているディレクトリーとは,ファイルの目録であり,また時々,他のディレクトリー(サブディレクトリー)の目録のこともある。ディレクトリーは,ファイルがアクセスされるとき,利用される。それゆえ,ディレクトリーヘの記入事項には,ファイルの位置決めに必要な,ファイルの属性が記入されるディレクトリーやフ ァイルの集まりは,「ファイル・システム」と呼ばれている。

大多数のシステムでは ,ファイ ルの幾つかは,時が経っても変わらないという意味で,永久ファイルといわれる。 他のファイルは一時ファイルといわれ,そのファイルを 作成したジョブが終了すると消去される。リモート端末から利用できるシステムは,幾つかの永久ファイルを記憶しておく機能が必要である。この種のシステムでは, ある ユーザーがシステムヘのアク セス権を得たとき ,その ユーザーはファイル・システムヘのアクセス権も得たことになる。これらのファイルI/O信頼性の高い記憶装置か,この種のシステムを生産的に利用する上で本質的である。 多くのシステムは,フ ァイルが偶然の事故で失われるような不幸な出来事に対処するため,永久ファイルのコピーを残しておく設備を有している。もしそのような損失が起こったならば,システムのユーザーは手痛い打撃を受けるであろう。

ファイル・ベースのシステムでは,ファイルの幾つかは,システムが用意したプログラム,すなわち,コンパイラやローダーなどで占められるファイルの幾つかは,ユーザーが持ち込んだ実行待ちのジョブで占められる。他のファイルには,プログラムで作られたプリンターヘの出力待ちの出力や,ジョブのあるプログラムからの中間出力で,そのジョプの次のプログラムで使われる予定のものなどかある。上記の利用目的のファイルは,すべてそのシステムのユーザーによって作成され,保存されているプログラム,データ,あるいはテキストなどのファイルに追加される 。要は,ファイル・システムが,システム運用の核心であることだ。

ユーティリティ・プログラムとエディター
共通に使われる機能の多くは,システム・プログラム・ライブラリーに含まれる 一部のプログラム 群によって満たされている。前に述べたコンパイラやローダーが,そのようなプログラムの例である。他にも多くのプログ ラムがある。通常,それらは個々にある1つの機能を果たし,ユーティリティ・プログラムとして分類されている。

ユーティリティ・プログラムの例としては,1つのファイルの内容を別のファイルにコピーするプログラム,テキストの印刷書式を決めるプログラム,ファイルを磁気テープに保存するプログラム,サブルーチン・ライブラリ ーの保守用プログラムなどがあり,幾つかのものには名前も付いている。完備したユーティリティ・プログラム群は,シ ステムを利用しやすくする。

リモート端末のユーザーにとって,本質的なプログラムの1つが,対話型エディター(編集プログラム)である対話型エディターは,端末からコマンドやテキストを受け入れて,その応答として,ファイルの作成や修正を行う端末ユーザーにとって,このエディターは,システムと会話し,システムを利用するための基本的手段の1つである。これらのユーザーは,プログラム,データ・ファイル,テキスト・ファイルなどの作成や修正に多くの時間を費やす。その結果,ユーザーにとってエディターは,システム・ソフトウエアの中でも重要なものの1つとなる。

オペレーティング・システム
システムを,ハードウエア資源の集まりと見なすことができる。これらの資源を利用し,それらをシステムのユーザーに割り振るのに必要なソフトウエア(プログラム)が,オペレーティング・システムである。例えば,主メモリと周辺装置との間で,実際にデータを転送する命令(「 デバィス・ドライバー」と呼ばれる )は,オペレーティング・システムの一部になるであろう。ほとんどすべてのシステムが,ある種のデバイス・ドライバーを備えているから,システムは少なくとも1つの基本オペレーティング・システムを持っていることになるシステムが大きく,より複雑になるにつれて,オペレーティング・システムもまた大きくなる。

大多数のシステムは,マルチ・プログラミングの環境を備えている。すなわち,幾つものユーザー・プログラムが,システムの資源(CPUやI/Oプロセッサなど) を,互いに競い合って利用しながら,同 時に主メモリに駐留できる。この種のシステムでは,オペレーティング・システムの資源割当て機能が,単に資源の正しい利用を保証するだけでなく,その公平な利用を保証するために,非常に重要となる あるユーザー・プログラムが資源の利用権を独占し,他のプログラムに極端な不利益を与えることは許されるべきでない。また,何人ものユー ザーのファイルが,個々にディスク装置に蓄えら れているであろうから,あるユーザーの個人所有ファイルに,他のユーザーか不当にアクセスするのを禁止する機能が,オペレーティング・システムに要求される。このように,オペレ ーティング・システムは,多くの異なる機能を満たさねばならない。

コンピュータが初めて作られた頃は,I/O装置は同期式で動作し,その利用は簡単なもの,すなわち,各ユーザー・プログラムが自ら所有するI/O命令を実行するものであった。プログラムの実行時間を短縮するために,I/Oプロセッサが別に導入され,非同期式(時間か重複)のI/O処理が可能になった。これらは,プログラムの実行時間を短縮するけれども, I/Oプログラムを書く上でより複雑になった。この負担を少なくする。

ために,オペレーティング・システムか導入された。マ ルチ・プログラミングは,システム資源の一層の効率的運用を図るため付け加えられたもので,そのアイデアは 「もし,あるプログラムかI/O処理の完了待ちで,CPUを使用していないならば,多分,別のプログラムがCPUを利用できるであろう」というものである。

非同期処理とマルチ・プログラミングは,1つの大きな問題を,すなわち,不確実性の根源をオペレーティング・システムに持ち込んだ。プログラムが注意深く作られていなければ,あるプログラムが,うっかりと他のプログラムに影響を与えてしまう可能性かある。2つのプログラムか,同じ資源に,例えば,メモリ中のあるワードとかあるファイルとかに,かち合ってアクセスしたとき,各プログラムの処理の順序次第で,すなわち,ここで望ましくない不確性かプログラムの実行状態に紛れ込むのだか,その順序次第で,各プログラムの結果に誤差か生じることになる。これを改善するために,共有資源 へのアクセスは,オペレーティング・システムの管理の下で行われる。このための機構を「インターロック」と呼ぶ。インターロック機構は,システムの希少な共有資源へのアクセス権か,同時には1つのプログラムだけに渡ることを保証するものである。インターロック機構は, 別の問題,すなわち「デッドロック」をもたらすプログラムAか資源Xを 占有(他のプログラムがアクセスできないように,資源Xをインターロック)し,その上資源Yを必要としている。同時刻に,プログラムBか資源Yを占有し,資源Xを必要としているならば,デッドロックか生じている。なぜなら,どちらのプログラムも先に進めない。デッドロック問題は解決可能だが,その解決策か,さらに大きな複雑さをシステムに持ち込むことになる。

ユーザーは2つの方法で,オペレーティング・システムと対話できる。1つは,ユーザー・プログラム内からのシステム・コール(例えば,ディスクに退避してあるファイルからデータを読み出すために,プログラムによってなされる要求)であり,もう1つは,システム・コマンド言語(「コントロール・カード 」か,リモート端末からのコマンド入力かのどちらか)である。コマン言 語のステートメントの例としては,多くの可能性あ中で2つを上げると,プログラムの実行要求と,ファイルペのアクセス要求かある。オペレーティング・システムが備えているユーザー・インターフェイスのタイプは,システムのユーザーの生産性に強い影響力を持つコマンド言語に一貫性かなく,混乱しているならば,ユーザーは,潜在的なエラーの新たな根源を持つことになり,自分たちの計算業務を解決するであろう別の手続きを捜さねばならない。一方,コマンド言語が一貫していて, 使いやすければ,ユーザーにとってそのシステムを使うことは,生産的であり,楽しみですらある。今日,ユー ザー・インターフェイス(エディター,ファイル・システム,コマンド 言語など)の質は,ハードウエア資源の動作速度よりも,しばしばシステムの有効性を左右する大きな要因である。

まとめとして,オペレーティング・システムは,システム資源の管理と,ユーザーが作ったアプリ ケーション・プログラムを動かす環境設定,この2つを目的としたプ ログラムの集合であるオペレーティング・システムは, 以下のものを含む多くの機能を満たしている。

1.プログラムとファイル間でデータを転送すること。
2.(ューザーやシステムが用意した)プログラムの実行を始めること。
3.蓄えられた情報への不当なアクセスを禁止すること。
4.プログラムの実行か正しく,間断なく行われるのを保証すること。
5.公平かつ効率的な方法で,資源へのアクセスを認可すること。

オペレーティング・システムがシステムの資源を全面的に管理しているので,通常,システム全体の性能は,オペレーティング・システムの性能に依存する。今日,すべてのシステムは,オペレーティング・システムを援助する特殊なハードウエア機構を備えている。メモリ保護機構,CPUの管理者モードとユーザー・モード (例えば,すべてのI/O命令は管理者モードでのみ動作可能)が,それらの例であり,またその他(プログラム間でCPUを瞬時に切り替えることをオペレーティング・システムに許す)特殊な制御切替命令,(プログラムの最大CPU占有時間間隔を保証する)タイマーと時間割込み 機構などがある。今日,システムを使うとは,実際は,オペレーティング・システムによって定義されたシステムを使うことである。

 本コラムは絶版となっている「IEハンドブック(サルベンティ編・日本能率協会訳・1986)」をアーカイブとして掲載するものです。このハンドブックの各章は多くの事例と理論を通して生産性向上に対するアイデアを提供するべく専門家によって執筆されています。基盤をなしているIEの考え方・原則はインダストリアル・エンジニアリングにかかわるすべてのひとに有用でしょう。

関連記事一覧

2019ものづくり公開セミナーガイド

B2Bデジタルマーケティングセミナー

ものづくり人材育成ソリューション

マーケティング分野オンラインセミナー