法政大学国際文化学部

情報システム概論

担当 重定 如彦

2004118

 

第8回 ソフトウェア(その1)

1.      前回の課題の答え

                                START

                                LEA        GR10                ;GR1に0を代入

                                LEA        GR24                ;GR2に4を代入

                  LOOP     CPA        GR1, A, GR2         GR1(A+GR2) 番地を比較

                                JPZ         LABEL                  GR1>(A+GR2)の場合LABEL

                                LD          GR1, A, GR2         GR1(A+GR2)番地の内容を代入

                  LABEL    LEA        GR2-1GR2     ;GR2から1を引く

                                JPZ         LOOP                   ;演算結果が負でなければLOOP

                                ST          GR1B                ;GR1の内容をB番地に格納

10                            EXIT                                  ;プログラム終了

11              A            DC         5                          ;A番地に1を代入

12                            DC         7                          ;A+1番地に2を代入

13                            DC         3                          ;A+2番地に3を代入

14                            DC         6                          ;A+3番地に4を代入

15                            DC         2                          ;A+4番地に5を代入

16              B            DS          1                          ;結果を格納するB番地を用意する

17                            END

 

先週のプリントの4Pの方針でプログラムを作ることにします。4Pのプログラムでは 4行目で繰返しのたびにGR1番地に(A+GR2)番地の内容を足していましたが、この課題の場合は、繰り返しのたびに、GR1番地と(A+GR2)番地の内容と比較し、GR1≦(A+GR2)の場合のみ、GR1(A+GR2)番地の内容を代入するという動作を行います(4〜6行目の網掛けの部分)。GR1≦(A+GR2)の場合のみ、何かを実行するというプログラムは、GR1≦(A+GR2)でない場合は何かを実行しないということなので、5行目でGR1≦(A+GR2)でない場合、すなわちGR1>(A+GR2)の場合は6行目を飛ばして7行目へ飛ぶというプログラムを記述します。その際に7行目にLABELという名前のラベルを設定しています。

2.      CPUの制御方式

CPUが機械語命令を実行するためには、メモリやレジスタに対して特定の制御信号を順番に送る必要があります。例えばLD命令の場合、「メモリのアドレス選択部に読み出すメモリの番地を表す信号を送る」、「メモリの制御部のR/W信号部に読み込み信号を送る」、「レジスタにメモリからデータバスを通って送られてきたデータを書き込むための信号を送る」などといった信号を順番にそれぞれのハードウェア回路に送る必要があります。このような機械語の命令に対応する制御信号を送る装置の事を制御回路と呼びます。 

CPUを制御するための方式には「配線制御(ハードワイヤード)方式」と、「マイクロプログラム方式」の2種類の方法があります。配線制御方式ではCPUの機械語の命令一つ一つに対して制御回路をAND、OR、NOTなどの論理素子(論理回路)を使って作成します。これらの設計作業を昔は人間が手作業で行っていましたが、CPUの機能が複雑化するにつれ、制御回路に必要な論理素子が何百万という膨大な数になってきたため、配線制御方式でCPUの制御回路を設計するのが非常に困難になってきました。

 そこで登場したのが「マイクロプログラム方式」です。マイクロプログラム方式では制御信号を操作するための専用の回路を新しく用意し、機械語命令を実行するために送る信号の順番をマイクロプログラムと呼ばれるプログラム言語で表現してその回路で実行するという方法で制御回路を設計しようという方式です。別の言葉で言うと、マイクロプログラム言語は「機械語命令を設計するためのプログラミング言語」といえるでしょう。マイクロプログラム方式は配線制御方式と比べて「CPUの設計の手間および期間の削減」、「設計したCPUの制御回路の故障箇所の診断が容易になる」、「異なった性能、価格のCPUに対して同じ機械語命令を提供することが容易になる」などの利点が得られます。マイクロプログラム方式はIBM社の360シリーズから本格的に使用がはじまり、小型機から大型機までのCPUの制御部を統一的な方法で作ることが可能になりました。

 CPUは機械語の命令を順番に実行すると述べましたが、ある命令を実行した後次の命令がいつ実行されるかは、クロックと呼ばれる装置によって制御されます。クロックは文字通り時計の役割を果たす装置で、一定の間隔でCPUやメモリに対して制御信号を送ります。CPUやメモリはクロックから信号を受け取ると処理を実行するという設計がされているので、クロックが信号を発生させる間隔が短ければ短いほどCPUの処理速度は高速になります。従って、CPUの性能はCPUの種類と、この周波数の2種類の要素によって決まります。コンピュータの性能をよく、このコンピュータはペンティアム4の1GHz(ギガヘルツ)のように表しますが、この場合「ペンティアム4」がCPUの種類、「1GHz」がクロックの周波数(一秒間に何回クロックが信号を発生させるか。1GHzの場合1秒間に10億回)を表しています。

 

3.      ソフトウェア

コンピュータのハードウェアはこれまでに述べたような仕組みで動作しますが、ハードウェアはプログラムがなければ何もできません。ハードウェアに対して特定の仕事をさせるためのプログラムのことをソフトウェアと呼びます。ハードウェアの性能がいくらすぐれていてもそれを動かすためのソフトウェアが優れていなければコンピュータの性能を発揮することはできません。

ソフトウェアには、その目的と用途に応じて「基本ソフトウェア」と「応用ソフトウェア」の2種類に分類されます。基本ソフトウェアはコンピュータの基本的な動作を司るオペレーティングシステム、プログラムを生成するための言語処理ソフトウェア、プログラムの作成、実行のサポートを行うためのサービスソフトウェアがあります。基本ソフトウェアの中でもオペレーティングシステムは、コンピュータを起動すると必ず最初に実行され、コンピュータが動作している間は常に実行されています。

一方、応用ソフトウェアは業務処理など、特定の目的のために作られたソフトウェアのことで、ワープロ、表計算、ウェブブラウザ、ゲームソフトなどがあります。応用ソフトはコンピュータにインストールし、必要に応じて実行されるのが一般的です。

4.      基本ソフトウェアその1〜オペレーティングシステム〜

オペレーティングシステム(以下OS)はコンピュータの基本的な動作を司るプログラムのことで、OSの目的はコンピュータの基本的な機能の効率を上げ(生産性の向上)、人間にとって使いやすい環境を提供すること(使いやすさの向上)です。

·          生産性の向上の例

Ø         スループット(単位時間当たりの処理能力)の向上。例:同時に複数のプログラムの実行をしようとした時などに、無駄なく仕事をCPUに割り当てる。

Ø         ターンアラウンドタイム(応答時間、すなわちユーザが操作してから反応が返ってくるまでの時間のこと)の向上。

Ø         RASISReliability Availability Serviceability Integrity Security)の向上。RASISとは、コンピュータシステムの信頼性を評価するときチェックする項目のことで、「信頼性」「可用性」「保守性」「保全性」「機密性」の頭文字を集めたもの。

·          使いやすさの向上の例

Ø         操作性の向上。ユーザが使いやすい操作環境の提供。

Ø         拡張性の向上。メモリ、ハードディスク、プリンタなど、様々なハードウェアを拡張可能な環境の提供。

Ø         汎用性の向上。他のコンピュータと接続したり、他のコンピュータで作られたプログラムやデータを汎用的に使える環境の提供。例:CPUやハードウェアの種類が異なっていてもWindows用ソフトがWindowsOSのパソコン上で動作する。

〜OSがなかった頃のコンピュータ〜

 コンピュータが開発された当時のコンピュータにはOSは存在せず、コンピュータにプログラムを実行させるためには以下のような非常に手間のかかる操作が必要でした。

·           プログラムの準備:当時のコンピュータには現在のようなフロッピーディスクやハードディスクのような高性能な記憶装置はなく、紙テープに穴をあけたものを記憶装置として使っていました。プログラムを実行させるためにはこの紙テープを機械にセットし読み込ませる必要がありましたが、これには大変な時間がかかりました。

·           データの準備:プログラムが処理するデータも紙テープに書かれており、それを準備し機械に読み込ませる必要があり、これにも時間がかかりました。

·           プログラムの実行:読み込んだプログラムとデータを実行します。この作業はプログラムの内容にもよりますが、プログラムの準備やデータの準備と比べて瞬時に行うことができ、めんどうな手作業は必要ありませんでした。

·           あとかたづけ:プログラムの実行後は、機械にセットした膨大なプログラムやデータの紙テープをあとかたづける必要があり、これも大変手間と時間のかかる作業でした。

 一つのプログラムを実行するたびに上記の4種類の作業を行わなければならなかったのですが、作業の内容をみていただければわかるとおり実際にプログラムを実行している時間(CPUが働いているいる時間)はほんの一瞬で、残りのほとんどの時間はプログラムの準備や読み込みなどの処理時間に費やされていました。そこで、こうした一連の作業をソフトウェアを使って自動化しようという発想が生まれ、それがOSの誕生へとつながっていったのです。実際に現在のOSが入ったコンピュータでは、プログラムやデータはコンピュータのハードディスクに格納されており、例えば文章を編集するには文章ファイルのアイコンをクリックするだけで実行することができます。OSの入っていないコンピュータの生産性が如何に劣っているかこの例からも一目瞭然でしょう。

5.      オペレーティングシステムの構成

 OSは制御ソフトウェアとも呼ばれ、コンピュータの主記憶装置に常駐し他のソフトウェアの実行の制御・監視を行ういくつかのプログラムから構成されています。これらのプログラムがお互いに密接に情報を交換しあうことでOSは動いています。

·          ジョブ管理プログラム

 コンピュータ上で処理される仕事の単位をジョブ(job)と呼び、通常一つのプログラムが一つのジョブに対応しています。ジョブ管理プログラムは、それぞれのジョブに対して、コンピュータの資源(CPU、主記憶装置(メモリ)、入出力装置などのこと)を割り当てながらジョブの実行を制御、監視します。資源の割り当ての例としては、例えばプログラムを実行するためにはプログラムを補助記憶装置(ハードディスクなど)からメモリに読み込む必要がありますが、ジョブ管理プログラムはその際にメモリの未使用領域を調べ、メモリのどの部分にプログラムを読み込むかを割り当てます。

·          タスク管理プログラム

 CPUで行われる仕事の単位を「タスク」と呼びます。一つのジョブは複数のタスクに分割することができ、それぞれのタスクが順番にCPUで処理されます。タスク管理プログラムは、複数のジョブのタスクを切り替えながら処理をおこなうことで、コンピュータ上で擬似的に同時に複数のプログラムを実行させるという、多重プログラミング(マルチプログラミング)の機能を実現しています。多重プログラミングには「同時に複数のプログラムを一つのCPUで実行させる」と「プログラムの実行中のCPUが使われていない時間を有効に利用する」という2つの目的があります。

Ø        同時に複数のプログラムを一つのCPUで実行させる

CPUは基本的に同時に一つの作業しか行うことができないため、昔のOSがなかった頃のコンピュータは一度に一つのプログラムしか実行できませんでした。従って現在のコンピュータのように、例えばCDプレーヤーのアプリケーションを実行して音楽を流しながら、ワープロで文章を作成するといった、同時に複数のアプリケーションを実行することは不可能でした。これでは何かと不便なので同時に複数のプログラムを実行できるように考え出されたのが多重プログラミングです。多重プログラミングの原理はジョブを複数のタスクに分割し、複数のジョブが同時に実行されていた場合にそれぞれのジョブのタスクを交互に割り当てていくというものです。下に多重プログラミングを使って3つのジョブを実行した場合の処理の例を図で挙げます。下の図のように3つのジョブを多重プログラミングで実行した場合、それぞれのジョブの処理速度は1/3になりますが、ユーザの目からはあたかも一つのCPUで3つのジョブが同時に実行されているように見えるようになります。なお、多重プログラミングの原理は第一回目の授業で説明した「タイムシェアリング処理」と同じです。

  多重プログラミングを使わなかった場合。

ジョブA

ジョブB

ジョブC

→時間の経過

 

 

 

  多重プログラミングを使った場合

A

B

C

A

B

C

A

B

C

A

B

C

A

B

C

...

→時間の経過

 

Ø        プログラムの実行中のCPUが使われていない時間を有効に利用する

先ほどの例でも挙げましたが、コンピュータでプログラムを実行する際には、「実際にCPUが動作している時間」と「データの入出力などのCPUが動作していない時間」の2種類の時間が存在しており後者の作業をしている間はCPUが遊んでいることになります。これは昔のコンピュータに限ったことではなく、現在のコンピュータにもあてはまります。例えば、ATMを使ってお金をおろす時のことを思い出してください。お金をおろすには、「カードを入れる」、「暗証番号を入力する」、「金額を入力する」、「現金とカードを受け取る」という4回の入出力動作があり、この間ではCPUはほとんど動作していません。多重プログラミングの技術を使うことでこのCPUが動作していない時間を有効に使うことができるようになります。下の図では入出力処理のある3つのジョブの処理時間を表しています。CPUと書かれている部分がCPUを使って処理をしている時間、灰色の入出力と書かれている部分が入出力などの操作のためにCPUを使用してない入出力処理を表します。それぞれの下にある数字はその処理に必要な時間を表しています。

もし多重プログラミングを使わずにジョブA、B、Cを順番に実行した場合、

(10+40+10) + (15+30+15) + (20+40+20) = 200 の時間が必要となります。このうち、CPUが働いていない入出力の時間は 40+30+40=110 なので、実に50%以上の時間でCPUが使われていないことになります。

一方多重プログラミングを使った場合、CPUを使っていない入出力の時間を他のジョブのタスクの処理に割り当てることで、以下のように処理を行うことができます。

 この場合、3つのジョブの処理に必要な時間は (10+15+20) + 5 + (10 +15+20) = 95 となり多重プログラミングを使わなかった場合の半分以下の時間で実行することが可能になります。また、入出力処理に必要な時間は 5 となるので、CPUは処理に必要な時間95%以上で使われていることになります。このように多重プログラミングを使うことでジョブの中でCPUを実際使用していない時間を他のジョブに割り当てることが可能になり、CPUを効率よく使ことでコンピュータのスループットを向上させることが可能になります。

·          データ管理プログラム

 プログラムやデータは普段は記憶容量の大きい補助記憶装置に保存されており、実行の際に主記憶装置に読み込まれて実行されます。主記憶装置は補助記憶装置に比べて記憶容量が小さいので、プログラムのサイズが大きい場合はプログラムをすべて主記憶装置へ持っていくのではなく一部だけを持っていき、必要に応じて主記憶装置の中のプログラムを実行に必要な部分と入れ替えるという作業を行います。データ管理プログラムはこうして主記憶装置に読み込まれたデータの管理と、補助記憶装置に格納されているプログラムやデータの管理を行います。補助記憶装置に格納されているプログラムやデータはファイルという形で格納され、データ管理プログラムはファイルの読み書きや制御を行います。

 先ほども一度述べましたが、データとプログラムをファイルという形で補助記憶装置に格納して管理することができるようになったおかげで、4ページの例であげたような欠点を解消することができるようになりました。OSのデータ管理プログラムのおかげでプログラムやデータを一旦補助記憶装置へファイルという形で格納しておけば、ファイルを表すアイコンをダブルクリックするだけで、自動的にプログラムとデータが補助記憶装置から読み込まれ実行することができるようになったのです。

·          資源管理プログラム

 キーボード、マウス、ディスプレイなどの入出力装置や、補助記憶装置の管理を行うプログラムです。これらの入出力装置は、ほとんどのすべてのアプリケーションが使用するものであるため、それらの制御や管理を個々のプログラムの中で行うと非常に効率が悪くなってしまいます。そこで、資源管理プログラムが入出力装置などのコンピュータの資源の管理を一括して行い、通常のアプリケーションは資源管理プログラムを利用することで様々な装置の制御を行います。また、新しいハードウェアをコンピュータに接続して使うことができるようになるのも、資源管理プログラムが新しいハードウェアを認識してすべてのアプリケーションから使えるように管理を行っているからです。

·          OSの種類

OSは、メインフレーム、ワークステーション、パソコン等、コンピュータの種類によって様々なものが開発されています。メインフレーム用のOSとしてはIBM社が開発したMVS、ワークステーション用のOSとしてはアメリカのAT&T社が開発したUNIX,パソコン用のOSとしてはApple社が開発したMacintosh、マイクロソフト社が開発したWindows、国産のパソコン用OSであるBTRONなどがあります。

6.      基本ソフトウェアその2 〜言語処理ソフトウェア〜

 初期のコンピュータではプログラムは配線ケーブルをつなぎかえることでコンピュータのハードウェア回路を人間が手で変更するという方法で行っていましたが、プログラム内蔵方式のコンピュータの出現によってソフトウェアによって作成するようになりました。

 

 初期のプログラミングでは機械語と呼ばれる2進数の数字の羅列を人間が直接記述していましたが、機械語は人間にとっては非常に扱いにくい言語であるため、複雑で巨大なプログラムを作成するためには大変な労力が必要でした。そこで、機械語の命令を人間がわかりやすいアルファベットの記号に置き換えたアセンブラ言語が登場しました。アセンブラ言語は、機械語で直接プログラムを記述するよりもはるかに効率の良い言語でしたが、それでも複雑なプログラムを作成しようとすると大変な労力が必要です。例えば、前々回の授業でアセンブラ言語で掛け算を行うプログラム例を挙げましたが、たかが掛け算を記述するだけで十数行ものプログラムが必要となってしまいます。そこで、アセンブラ言語よりもさらに人間の言葉に近い表現力を持つ高級言語と呼ばれる言語が開発されました。

例えばC言語という高級言語で、7*5を計算し、メモリに格納するには、

 

   int  A;

   A = 7 * 5;

 

というたった2行のプログラムを記述するだけで良いのです。

注:一行目は整数(integer)を格納する領域をメモリに確保してそのメモリにaという名前をつけろという意味です。アセンブラ言語で言うと   

           DS       1       に相当します。

 高級言語は、作成するプログラムの用途に応じて下図のようにこれまで様々な言語が開発されてきました。以下に代表的な高級言語を紹介します。

·          COBOL(コボル)

 事務計算用の高級言語としてアメリカ国防省を中心に開発された言語で、英語に近い表現になっています。現在でも最も広く使用されている高級言語の一つです。

 

·          FORTRAN(フォートラン)

 科学技術用言語としてIBM社によって開発された言語で、複雑な数式をそのまま表現することができるのが特徴です。

·          BASIC(ベーシック)

 アメリカのダートマス大学で開発された高級言語で、初心者向きの会話型の言語です。かつては技術計算、事務計算、ゲームなどパソコンで広く使用されていました。

·          Visual BASIC

 BASIC言語を基本にして、Windows用のソフトウェアを開発するために作られた言語です。ビジュアルなエディタを使ってアプリケーションを開発できるのが特徴です。

·          C(シー)、C++(シープラスプラス、又はシープラプラ)

 アメリカのベル研究所で開発された高級言語で、OSなどのシステムを記述する為の言語として広く利用されています。1983年にC言語のオブジェクト指向という概念を取り入れたC++という言語が開発されています。

·          Visual C++

 C++言語を基本にして、Windowsのアプリケーションをビジュアルなエディタを使って効率よく作成できるように開発された言語です。

·          LISP(リスプ)

 アメリカのMITで開発されたリスト処理用言語で、人工知能の研究で使用されています。

·          Java(ジャバ)

 アメリカのサン・マイクロシステム社が開発した言語で、C++言語に似たオブジェクト指向型のプログラミング言語です。あらゆるプラットフォーム上で動くことを目的の一つとして開発された言語で、Javaに対応したウェブブラウザ上で動作させることで動きのあるホームページを作成することが可能です。

7.      コンパイラとインタープリタ

 アセンブラ言語の場合、アセンブラ言語で記述されたプログラムを機械語命令に翻訳すためのアセンブルという作業を行いました。高級言語はコンパイラ(compiler)言語とインタープリタ(interpreter)言語の2種類があり、記述したプログラムを実行する方法が異なります。

·          コンパイラ言語

 コンパイラ言語はアセンブラ言語と同様に、記述したプログラムを機械語のプログラムに一旦翻訳し、翻訳されたプログラムを実行します。この翻訳作業のことをコンパイルと呼び、コンパイルを行うプログラムのことをコンパイラと呼びます。アセンブラ言語の命令と機械語の命令に1対1に対応していましたが、高級言語の場合はそうではなく、高級言語で記述された命令をその命令に相当する機械語の羅列に変換します。例えば機械語の命令に掛け算を行う命令はありませんので、例えばC言語で7*5を計算するプログラムを8Pのプログラムのように記述した場合、実際には前々回の授業で7*5を計算する機械語のプログラムに翻訳されます。CPUの種類によって用意されている機械語の命令の種類は異なっていますので、コンパイラは、CPUの種類毎に別のものを用意する必要があります。実際にはOSがある程度のCPUの違いを吸収してくれるので、OSの種類毎に別のコンパイラを用意する必要があるといったほうが現状にあっていると言えるでしょう。

·          インタープリタ言語

 インタープリタ言語は、記述したプログラムを直接解釈して実行するインタープリタと呼ばれるプログラムを使ってプログラムを実行します。コンパイラ言語と異なり、記述したプログラムを「機械語のプログラムに翻訳する(=コンパイル)」という作業を行う必要がないので、プログラムを試作したり、プログラムの一部を変更した場合でもすぐに実行できるという利点があります。インタープリタ言語は、実行するたびに毎回インタープリタがプログラムを解釈しながら実行するために、実行速度がコンパイラ言語で作成されたプログラムより処理速度が遅くなるという欠点があります。例えていうならば、元々英語で書かれた文章を読むときに、それを一旦日本語に翻訳し翻訳された本を読むのがコンパイラ、毎回通訳を用意して読みたい部分を通訳してもらいながら読むのがインタープリタです。高級言語の中では、BASICLISPJavaなどがインタープリタ言語です。

8.      基本ソフトウェアその3 〜サービスソフトウェア〜

 サービスソフトウェアは、プログラムの作成や実行のサポートを行うソフトウェアです。

·          リンケージエディタ

 プログラムでは、小さな部品(プログラム)を組み合わせて全体として大きな動作を行うプログラムを作るという手法がよくとられます。リンケージエディタはアセンブラやコンパイラで作成された複数の機械語のプログラムを組み合わせて(=小さな部品のプログラムの集まり)一つの大きなプログラムに結合させるという動作を行うソフトウェアです。

·          デバッガ

 プログラムにはエラーはつきものです。どんなに熟練したプログラマでも大きなプログラムをエラーなしにいきなり完成させることは不可能といっても過言ではありません。デバッガはプログラムのエラーの検査(この検査のことをデバッグdebug)と呼びます)を行う為のプログラムで、プログラムを順番に実行させてレジスタやメモリの中身を調べたり、プログラムの特定の場所で実行を止めるといった機能を持っています。アセンブラの実行の際に使用したCOMETもデバッガの機能を持っています。

·          ローダ

コンパイラやリンケージエディタが作成した機械語のプログラムを実行する為にメモリに読み込ませるためのプログラムです。

出席、課題のメールはta04k026@edu.i.hosei.ac.jpにお願いします。

質問のメールなどは、sigesada@edu.i.hosei.ac.jpまでお願いします。

授業の資料の最新版はhttp://www.edu.i.hosei.ac.jp/~sigesada/にあります。