ソフトウェア

  「オペレーティングシステム」( OS )は,コンピュータシステムのハードウェアとソフトウェアを管理してその利用効率を上げ,かつ,利用者にとって使いやすいコンピュータを実現するためのソフトウェアであり,コンピュータを動作させるために最低限必要なソフトウェアです.OS,特にパソコン用の OS としては,「Windows」,「UNIX」,「Linux」など,様々なものがありますが,その主な機能は以下に示すとおりです.

  1. プロセス管理: プロセスとは,コンピュータ内で行われる処理の基本単位です.一般に,コンピュータでは,複数のプロセス(プログラム)が動いています.少なくとも,外見上は,複数のプロセスが同時に実行されているように見えます.しかし,CPU が一つであれば,基本的に複数の処理を同時に実行することは不可能です.それでは,それをどのようにして実現しているのでしょうか.今,プロセス A,B,及び,C を同時に処理したいとします.このようなとき,CPU は,たとえば以下に示すように,短い時間間隔で処理の対象を切り替えながら処理を行います.このようにすることによって,外見上は,3 つのプロセスを同時に実行しているように見えることになります(もちろん,各プロセス単独で実行する場合より,各プロセスの実行時間は長くなります).

      また,プロセスによっては,他のプロセスと同期を取ったり,プロセス間の通信が必要な場合もあり,その制御は非常に複雑になります.

  2. 記憶管理: プログラムを実行するためには,そのプログラムをメインメモリに記憶する必要があります.一般に,複数のプログラムが実行されますので,それらを適切にメモリ内に記憶すると共に,あるプログラムが他のプログラムの記憶領域を犯さないような監視も必要になります.
      同時に実行するプログラムが多くなれば,それらすべてをメモリ内に記憶することは難しくなります.もちろん,一つのプログラムであっても,そのサイズが大きければ同じ問題が起こります.しかし,メモリ内に存在しなければならないのは,プログラムの現在実行している部分だけです.他の部分は,ハードディスクなどに記憶されていても構いません.必要になったとき,ハードディスクなどからメモリ内へ読み込んでくればよいからです(ページング,下図参照).記憶管理では,このような処理も担当します.

  3. 入出力管理: プリンタへの出力,ハードディスクとのデータ送受,他のコンピュータとの通信制御など,周辺装置との入出力を管理する機能です.

  4. ファイル管理: ファイルの登録,削除,検索,共有,保護などを実現するための機能です.ファイルには,同じ形式のデータが何らかの順番で記録されているだけですので,その中のデータに対する検索,追加,削除,修正等は,効率も悪く,面倒なものになります.様々なデータを,データの検索,追加,削除,修正等を考慮して,構造的に記録したものが「データベース」です.そのような意味で,ファイル管理と強い関係があり,OS の拡張部分として扱うことも可能です.

  ソフトウェアは,何らかのプログラミング言語を使用して記述されたプログラムとして実現されます.しかし,一般に,これらのプログラムをコンピュータは直接理解できません.「コンピュータの基礎」の箇所で述べたような機械語の命令に翻訳してやる必要があります.それを行うソフトウェアが,「コンパイラ」です.コンパイラに関する知識は,コンパイラを作成するときは勿論ですが,それ以外でも,その知識を利用することは多いと思います.

  「プログラミング」言語には,C/C++,Java のような汎用目的の言語,HTML,PHP のような特殊目的の言語など,数多く存在します.汎用目的の言語であれば,基本的にどのようなプログラムでも書くことができますが,どのような言語を使用するかによってその表現方法や作成の容易さはかなり異なってきます.

  プログラミング言語とはどのようなものか,又,言語による表現方法の違いなどを見てもらうために,以下に2つの例を示します.いずれのプログラムも,左側の2つの空白に数字を入れた後「=」ボタンをクリックすれば,右側の空白に加算結果が表示されるというものです.上のプログラムは,HTML と JavaScript,下のプログラムは,HTML と Java で記述されています.

 +     

  まず,次に示すのが,上のプログラムに対するソースプログラムです.ただし,HTML に関しては,主要な部分だけを表示しています.
	<INPUT TYPE="text" ID="a" STYLE="background: #EEFFEE"> + 
	<INPUT TYPE="text" ID="b" STYLE="background: #EEFFEE"> 
	<INPUT TYPE="button" onClick="add()" VALUE="="> 
	<INPUT TYPE="text" ID="c" STYLE="background: #EEFFEE"><BR>
	<SCRIPT TYPE="text/javascript">
		function add()
		{
			a1 = parseInt(document.getElementById("a").value);
			b1 = parseInt(document.getElementById("b").value);
			document.getElementById("c").value = a1 + b1;
		}
	</SCRIPT>
			
  次に示すのが,下のプログラムに対するソースプログラムです.この例では,このページに貼り付けるために HTML も使用していますが(最初の 3 行),Java 単独でも同様のプログラムを書くことが可能です.
	<object type="application/x-java-applet" width="550" height="40">
		<param name="code" value="Cal.class">
	</object>

	import java.awt.*;
	import java.awt.event.*;
	import java.applet.*;
	public class Cal extends Applet implements ActionListener {
	    Button bt;
	    TextField tx1, tx2, tx3;
	    /************/
	    /* 初期設定 */
	    /************/
	    public void init()
	    {
	                    // レイアウトの変更(フローレイアウト)
	        setLayout(new FlowLayout(FlowLayout.CENTER));
	                    // フォントの設定
	        Font f = new Font("MS 明朝", Font.PLAIN, 16);
	        setFont(f);
	        setBackground(Color.white);
	                    // テキストフィールドとボタンの追加
	                        // テキストフィールド
	        tx1 = new TextField(10);
	        tx1.setBackground(new Color(238, 255, 238));
	        add(tx1);
	                        // ラベル
	        Label lb = new Label(" + ");
	        add(lb);
	                        // テキストフィールド
	        tx2 = new TextField(10);
	        tx2.setBackground(new Color(238, 255, 238));
	        add(tx2);
	                        // ボタン
	        bt = new Button("=");
	        bt.addActionListener(this);   // リスナー
	        add(new Label(" "));
	        add(bt);
	        add(new Label(" "));
	                        // テキストフィールド
	        tx3 = new TextField(10);
	        tx3.setBackground(new Color(238, 255, 238));
	        add(tx3);
	    }
	    /******************************/
	    /* ボタンが押されたときの処理 */
	    /******************************/
	    public void actionPerformed(ActionEvent e)
	    {
	        int a, b;
	        if (e.getSource() == bt) {
	            a = Integer.parseInt(tx1.getText());
	            b = Integer.parseInt(tx2.getText());
	            tx3.setText(Integer.toString(a+b));
	        }
	    }
	}
			
  プログラムを書く際は,まず最初に,そのアルゴリズムについて検討する必要があります.その際,「アルゴリズムとデータ構造」のような知識だけではなく,プログラムが対象とする分野の知識(例えば,銀行のシステムを作る際には銀行業務に対する知識)と共に,場合によっては,与えられた問題を解くために必要な数学的知識,使いやすいソフトウェアを開発するために心理学などを通して学ぶ人間の知的行動に対する知識等,様々な知識が必要になります.

  アルゴリズムを決め,そのアルゴリズムをプログラミング言語を使って記述し,コンピュータに実行させるわけですが,人間に仕事を依頼するようなわけにはいきません.”コンピュータは何も知らない”という仮定の下で,その細部に至るまで指示してやる必要があるからです.ここでは,例として,二次方程式,

ax2 + bx + c = 0

を解く場合について考えてみます.その場合のアルゴリズムは,以下のようになります.菱形の部分では判断を行っていますが,4つの菱形に入る文を下に示した表から選択し,記号で答えてください.

A. a は正である  D. b は正である  G. c は正である  J. D は正である
B. a は0である  E. b は0である  H. c は0である  K. D は0である
C. a は負である  F. b は負である  I. c は負である  L. D は負である

  ちなみに,上のアルゴリズムに従ったプログラムは以下のようになります(C/C++).
	/***************************/
	/* 二次方程式を解く        */
	/*     coded by Y.Suganuma */
	/***************************/
	#include <stdio.h>
	#include <math.h>
	int main()
	{
		double a, b, c, D, x1, x2;
						// データの入力
		printf("a, b, c の値を入力してください ");
		scanf("%lf %lf %lf", &a, &b, &c);
						// 二次方程式ではない
		if (a == 0) {
			if (b == 0)
				printf("計算できません\n");
			else {
				x1 = -c / b;
				printf("x = %f\n", x1);
			}
		}
						// 二次方程式である
		else {
			D = b * b - 4.0 * a * c;
							// 虚根
			if (D < 0.0) {
				D  = sqrt(-D);
				x1 = -b / (2.0 * a);
				x2 = D / (2.0 * a);
				printf("%f ± i %f\n", x1, x2);
			}
			else {
				D  = sqrt(D);
							// 実根
				if (D > 0.0) {
					x1 = (-b + D) / (2.0 * a);
					x2 = (-b - D) / (2.0 * a);
					printf("%f %f\n", x1, x2);
				}
							// 重根
				else {
					x1 = -b / (2.0 * a);
					printf("重根 %f\n", x1);
				}
			}
		}
	
		return 0;
	}
			

目次