lパソコン CPUのノート '96. 7. 2  
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.CPU_  CPUが使う文字  CPUのノート  Basicを使う  OS 

 これはCPUがノートを見ながらどんなことをしているのかという話です。
 Basicを参考例に使います。

アドレス, 変数と変数名, タスク, ルーチン,  サブルーチンコール, 引数, 返り値, 関数と関数名 の意味


コンピュータは順番にノートを見いてるだけ。
 コンピュータはメモリと呼ばれるノートを持っていて、そこに書かれていることを順番に行っています。
 コンピュータが今読んでいるノートの位置を記録している部分を、プログラムカウンタと言います。
 CPUは、プログラムカウンタに書かれている行数の部分を読んで順番に処理します。
 プログラムカウンタは、CPUがノートを見る毎に次の行を指し示します。
 コンピュータのノートの位置(行数)は、正式にはアドレスまたは番地と言います。

 普通はノートを1行ずつ順番に読みますが、ちょっと別な部分を読む必要がある場合もあります。そのような場合には、今読んでいるノートの位置を記憶しておく必要があります。そのためにあるのがスタックポインタです。
 スタックというのは、記録したデータを、記録した順番とは逆の順番で取り出すようになっている装置のことで、ポインタは(コンピュータのノートの)位置を示すものという意味です。
 コンピュータは、次々に別な部分を読んでも、順番を逆にたどって、元の位置に戻って仕事を続けることができるのです。

ノートにはラベルが付けられる
 コンピュータはノートの位置は行数で表わすことができます。この行数の正しい呼び方は、アドレスまたは番地と言います。これはメモリの素子に0から順番に付けられた番号で、FF0B6C8 などのように16進数で表わします。
 FF0B6C8 のデータなどという表現では人間には分かりにくいですから、プログラムを作る場合には、コンピュータのノートにラベルを付けて、ノートの位置をラベルで示すことができるようになっています。

 実際は、Windows95やVBがアドレスとラベルの対応表を作って、プログラムが完成するとアドレスに変換するのですが、プログラマーはそんなことを考える必要がないようになっています。
 つまり、「コンピュータのノートの位置はラベルによって表わすことができる。」と考えることができます。

 実際のプログラムの例を示します。
 マウスボタンがクリックされたら、ABC と表示するプログラムです。
Private Sub Form_Click()
Str A '文字を書き込むための場所を決めて、「A」というラベルを付けます。
A = "ABC" 'ラベル A の部分に、「ABC」 と書き込みます。
Print A 'ラベル A の内容をプリント(表示)します。
End Sub

 なお、A の部分に書く内容はいろいろに書き替えることができますから、A の部分に書く内容を変数と呼びます。ですから、ラベル A は変数名と呼ばれます。
 ラベルはデータだけではなく、プログラムにも付けられます。プログラムがいくつかの部分に分かれているときには、部分毎にラベルが付けられます。
 ノートには、仕事別にラベルが付けられていて、必要があれば、コンピュータはノートのどこを見ればよいのかを、ラベルでさがすことが出来ます。

 コンピュータは通常は、マウスやキーボードを監視するプログラムを実行していますが、Form1がクリックされると Form_Click のラベルをさがして、その部分のプログラムを実行します。

 End Sub は、このプログラムの終わりを示していますから、コンピュータはスタックポインタから前にしていた仕事の位置を読み出して、また前の仕事(マウスやキーボードの監視)に戻ります。

コンピュータの中にはたくさんのコンピュータが入っている。
 コンピュータには動作の中心部分であるCPUがひとつしかありませんが、いくつかの仕事を少しずつ順番に行うことによって、人間から見ればたくさんのCPUがあるように動作しています。
 たとえば、時計を表示しながら文書を作成している場合は、コンピュータは時計を表示する仕事と文書を作成する仕事を交互に行っているのですが、その間隔が短いので、人間から見れば同時に進行しているように見えるのです。
 コンピュータが順番に行っている仕事をタスクといいます。ウインドウズ95のタスクバーには、現在コンピュータが処理しているタスクの内、人間にとって必要なものだけが表示されているのです。

 複数のタスクは同時に処理されなければなりませんから、タスクはコンピュータのノートに書いてある必要があります。タスクは、コンピュータの時間割毎の仕事と考えることができます。
 このように、複数の仕事を同時に処理する(ように見せかける)ことを、マルチタスクといいます。

課長は自分で出来ない仕事は係長にやってもらう。
 コンピュータには仕事の数だけCPUがあるということは、ノートに付けられたラベルの数だけのCPUがあることになります。(現在必要でない仕事を受け持っているCPUは休んでいるのだと考えます。)
 このような考え方をすれば、ある仕事をしているCPUが、自分で出来ない別な仕事をするときには、ほかのCPUを呼んでやってもらっていることになります。

上司はメインルーチン、部下はサブルーチン。
 コンピュータのノートに書かれている内容をルーチンと呼びます。ルーチンには、その内容によってラベルが付けられています。
 プログラムをひとつの会社の仕事に例えてみて見ると、そのルーチンには社長(または社名)というラベルが付きます。その中には社長の仕事と、部下のラベルが書かれています。その中の部下、例えば営業課長のルーチンには、営業課長というラベルが付けられて、営業課長の仕事と営業係長のラベルのが書かれます。
 課長が係長に仕事を依頼するように、あるルーチンが別なルーチンに仕事をやってもらうことをサブルーチンコールといいます。呼ぶ方がメインルーチンで、呼ばれる方をサブルーチンといいます。
 普通は、課長から見れば係長がサブルーチンで、部長がメインルーチンですが、係長が課長に仕事を依頼することもありますから、どのルーチンがサブルーチンか、はっきりと決まっている訳ではなく、その時に呼ばれるルーチンをサブルーチンといいます。

資料は引数、報告書は返り値。
 サブルーチンをコールする場合に、依頼する仕事に必要なデータを渡す場合があります。この時のデータを引数(ひきすう)といいます。例えば、ウインドウの大きさを変えるサブルーチンをコールする場合には、指定するウインドウの高さと幅が引数です。
 また、数値計算のサブルーチンをコールしたような場合には計算結果が返されます。この場合は、元になった数値が引数で、処理結果の答えは返り値と呼びます。
 返り値を返すことができるサブルーチンのことを関数といいます。
 関数のルーチンに付けられたラベルは、関数名と言います。

 関数 function . . . 自分でプログラムを作るとき
 C言語にはたくさんのサブルーチンが用意されています。
 それらの内、プログラムを作るときに使うものは関数と呼ばれ、関数名が付けられています。
 関数の中の、細かいサブルーチンを直接使う必要がないので、それらと区別するための呼び方だと思います。

 メソッド method . . . 自分でプログラムを作るとき
 Windows では、同時に複数のプログラムを動作させることができます。
 ですから、ひとつのプログラムがコンピュータを占有することはできません。
 他のウィンドウがクリックされたら、今まで動作していたプログラムは動作を中断する必要があります。
 このようなプログラムを作るための言語では、名前で呼出すことができるサブルーチンを、関数ではなくメソッドと呼ぶことがあります。

社長の世話役と雑用係はウインドウズ95の仕事
 ウインドウズ95は複数のCPUがあるように動作するので、同時に複数のプログラムを実行することができます。ウインドウズ95は、これらのプログラムを上記のサブルーチンとして管理しています。
 また、ひとつのプログラムはいくつかのルーチンに細分化されてラベルが付けられていますが、一番下のレベルのルーチンが、ウインドウズ95に含まれています。プログラムを作る場合には、細かな部分はウインドウズ95のルーチンをサブルーチンコールするようにして、大まかな部分だけをプログラミングするようにします。

VBには優秀な部下が大勢いる。
 ウインドウズ95で使えるルーチンは基本的なものだけですが、VBにはまとまった処理をしてくれるルーチンがたくさん入っています。
 まとまった処理をするルーチンは、Windows95の基本的なルーチンをサブルーチンコールするように作られています。

サブルーチンの具体例。
 VBを使って、サブルーチンを実際に作ってみます。
 「テキストを開く」というプログラムを作って、VBに含まれているShellというサブルーチンを呼び出し、その Shellに、Windows95のプログラムであるNotepad.exeを起動させる例です。
 Shellには起動プログラム名「notepad.exe abc」と、起動方法「1」を引数として与えます。
 プログラム notepad.exe には ABC.txt という文書ファイルを開かせます。

  1. VBを起動します。
  2. フォーム(Form1)が表示されていなければ、「表示」メニューの「フォーム」を選択して表示します。 このフォーム Form1 を「テキストを開く」用のウインドウとして使います。
  3. フォームが開かれると、「プロパティウインドウ」もいっしょに開かれていますので、タイトルを決めます。 「プロパティウインドウ」の、「Caption」の項目の右側には「Form1」と書かれています。 この「Form1」を、「テキストを開く」に書き替えます。 このタイトルは、ウインドウのタイトルバーに表示されます。
  4. フォームの上にカーソルを移動して、ダブルクリックします。 ダブルクリックすると、プログラムを書くための「ソースウインドウ」が現れます。
  5. ソースウインドウに、次に示すようなプログラムを書きます。 1行目と3行目は書いてありますから、2行目を書くだけです。 2行目をそのまま、ソースウインドウにコピーしてもだいじょうぶです。 各行の右側は注釈(説明)です。プログラムの動作には関係ありません。 注釈を書いておくと、どんなプログラムだったか後で分かりやすくなります。
Private Sub Form_Load() ' 1行目 このプログラムの種類と、コンピュータのノート用の名前。
X = Shell("notepad.exe abc", 1) ' 2行目 コンピュータの仕事の内容。
End Sub ' 3行目 このプログラムの終わりをコンピュータに知らせる。

 実行  せっかく作ったのですから、まず実行してみましょう。
  1. 実行ボタンが表示されていなければ、「表示」メニューの「ツールバー」を選択して表示します。
  2. 実行ボタン(右向きの▼印)をクリックして、このプログラムを起動します。
  3. 「ABC.txt」というファイルがなければ、新しく作るかどうか聞いてくるので、「はい」を選択します。 これで、「ABC.txt」というファイルが作られました。普通と同じに使用できます。 いらないファイルを作ったので、次のようにして、このファイルを削除しておきます。
  4. いま開いたテキストファイル「ABC.txt」の、「ファイル」メニューから「開く」を選択します。 ウインドウが現れて、「ABC.txt」のアイコンが作られています。
  5. 「ABC.txt」のアイコンをマウスの右ボタンでクリックします。メニューダイアログが現れます。
  6. メニューダイアログの中から「削除」を選択します。「ABC.txt」は削除されます。
  7. 「ABC.txt」のウインドウはまだ表示されているので、閉じて下さい。
  8. このプログラムの仕事は他にはありませんが、コンピュータのノートにはこのプログラムがまだ書かれたままになっています。コンピュータのノートを広く使えるように、消しておく必要があります。 終了ボタン(■)をクリックするか、Form1 の閉じるボタン(X)をクリックして下さい。
  9. ノートから今作ったプログラムが消されて、プログラムを作る画面に戻りました。 いま作ったプログラムは消されましたが、完全に消されたわけではありません。VBのデータのとしてはまだ書かれたままになっています。
 説明  次のようなプログラムを書いて、実行しました。
Private Sub Form_Load() ' 1行目 このプログラムの種類と、コンピュータのノート用の名前。
X = Shell("notepad.exe abc", 1) ' 2行目 コンピュータの仕事の内容。
End Sub ' 3行目 このプログラムの終わりをコンピュータに知らせる。

 これはまず、VBのデータとして保存されます。
 実行ボタンをクリックすると、VBはコンピュータが実行できるように、コンピュータのノートにラベルや仕事内容を書き込んだり、コンピュータの仕事の予定に、ラベルを書き加えたりします。
1行目: コンピュータのノートにラベルを作ります。
Private Sub Form_Load()
一般的な書式 ・・・ ルーチンの種類 名前 呼ばれる条件
種類 : Private は小さなルーチン(部下の数が少ないルーチン)という意味です。
2行目に書かれている「 Shell というVBのサブルーチン」だけを使っています。)
Sub はサブルーチンという意味です。
上の3行のプログラムは、今作った「ファイルを開く」プログラムの一部分(サブルーチン)なのです。
フォーム(「ファイルを開く」用のウインドウ)を描くプログラムなどは、VBが勝手に作ってくれています。
名前 : Form がこのルーチンのラベルです。
条件 : Loade はプログラムがロードされたとき(起動されたとき)に、このルーチンが呼ばれるという意味です。
マウスでクリックしたときに呼ばれるようにする場合は、Load の代わりに Click と書きます。
()の中には、呼ばれるときに受け取るデータを書きます。
ここでは notepad.exe abc というデータを自分で持っているので、もらうデータはありません。
2行目 : 仕事の内容です。仕事が多いときは、その行数だけ書きます。
X = Shell("notepad.exe abc", 1)
一般的な書式 ・・・ 結果のデータ = 仕事(元のデータ)
Shell はプログラムを起動するサブルーチンです。VBの中に含まれているので、自分で作る必要はありません。
()の中には、起動プログラム名などの、起動プログラム Shell に与えるデータ(引数)を書きます。
この内容を、例えば("calc.exe",1)に書き替えれば、Shellは電卓を起動します。
このルーチンが()内のデータを与えて Shell を呼出すと、あとは Shellが勝手に notepad を呼出し、Notepad が勝手に ABC.txt を開いてくれるわけです。
()内の 1 は、普通に開くという意味です。
X は、Shellの仕事の結果報告(返り値)を受け取るためのもので、YでもZでもかまいません。仕事の内容が計算だった場合には、X には計算した結果が代入されます。
Shell の場合には、X にはファイル番号が代入されます。コンピュータは自分のノートを有効に使うために、現在起動されているプログラムや使用中のデータファイルなどを番号で管理しています。
ここでは使いませんが、プログラムの中で、Shellに起動させたプログラムを操作(書き換えるなど) する場合には、ファイル番号を使います。
()内に書いた、サブルーチンに与えるデータを引数(ひきすう)といいます。
X と書いた、サブルーチンから受け取るデータは、返り値と呼びます。
返り値のある(データを返すことができる)サブルーチンは、特に、関数と呼びます。
返り値がないサブルーチンは書き方が少し異なります。
一般的な書式 ・・・ 仕事 引数 ・・・引数を()で囲みません。
例 ・・・ Print "ABC" ・・・ABC と表示する。
(注意。Load の呼出し条件では Print は動作しません。Load を Click に変えるなどが必要です。)
3行目 : このルーチンの終わりを示します。
  End Sub
ノートにこのように書かれていると、コンピュータはこのルーチンを呼出す前の状態に戻って、前の仕事の続きを行います。 コンピュータは、このルーチンのラベルを探してその内容を順番に読んでいたわけですが、この文章を読み終えると、前に読んでいた続きのところに戻るわけです。
コンピュータはノートの別なところを読むときには、今読んでいる行数(アドレス)をスタックポインタにしまってから、別なところを読みはじめます。
スタックは先入れ後出しのデータの入れ物のことをいいます。コンピュータが順番にいくつもの別なところを読んだ場合には、読んだ順番とは逆の順番をたどって元の所に戻ることになります。
このスタックには、ポインタ(ノートの位置を示すデータ)が格納されるので、スタックポインタと呼ばれます。
備考:ポインタについて。
VBでポインタと言えば、マウスの位置を示す「マウスポインタ」の意味で使われています。
アドレスを示すポインタであることをはっきり示したいときには、「アドレスポインタ」といいます。
T
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html