ソフトウェア プログラム編その3 まずは機械語 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
前章までででやっとアルゴリズムができました。しかしここではまだアルゴリズムは日本語で書かれています。これでは当然コンピューターは理解できません。 そこでコンピューターの理解できる言語、すなわちプログラム言語に翻訳してやる必要があります。 プログラム言語に必要なもの![]() まずプログラム言語は少なくとも以下のような機能の表現ができないと困ります。
こういう命令を実行するための装置がCPUです。 機械語![]() それではCPUが実際に分かる言語から話を始めましょう。CPUが直接理解できる言葉は、そのものずばりの機械語と言われます。 今まで何度もコンピューターは数字しか分からないと書いてきました。これは機械語にもそのまま当てはまります。すなわち機械語とは見た目はメモリーのある領域に連続して書かれている数字の列なのです。 前にもちょっと記したとおり、コンピューターはこの数字列を最初から順番に読んでいって、その意味を解釈し、その指示に従った動作を行います。 それでは機械語にはどんな言葉や文法があるのでしょうか? 以下の例は、話を少しでも簡単にするために筆者がでっち上げた、現実には存在しない偽機械語です。 出てくる命令は必要最低限に押さえ、本当はメモリーには0〜255までの数しか書けませんが、ここでは一つのメモリーに書き込める数の大きさは0〜65535とします。こうでもしておかないと、後で実際のプログラムを作る際に、ただでさえややこしい物がますますややこしくなってしまいます。 (ややこしくてもいいから本物の機械語を知りたいという人はこちら) (1)データ転送命令メモリーに値を書いたり読んだりする命令です。
X,Yというのは適当な数を表します。以下同様です。
(2)演算命令値を計算する命令です
ここで前にもちょっとだけ書きましたが、コンピューターは一定範囲の整数しか扱えません。そのため計算した結果がその範囲に収まらないことが当然あります。その場合でも強引に計算をして、例えば255+1=0になってしまうと言いました(この偽機械語の例なら、65535を越えたら桁あふれしてしまいます) しかし計算結果の0が桁あふれして0になったのか正しい計算の結果0になったのかを判別できないとやっぱり困ります。そこでCPUの内部にはフラグというちょっとしたメモリーがあって、そこに今やった計算の結果に関しての情報が書き込まれます。 この機械語では以下の3種類のフラグがあるとします。
(3)ジャンプ命令プログラムは通常1000番の命令を読んだら、次は1001番といったように前から順番に実行されますが、その実行の順序を強制的に変更する命令です。前節のアルゴリズムの説明で「6.に戻る」といったような表現がありましたが、これを実現するためにはこのジャンプ命令が必要なのです。ジャンプ命令には単純にジャンプする以外に、フラグの状態を見てジャンプする命令もあります。これを利用して、ある条件の場合にはこれ、そうでないときはこれといった条件判断の処理を行うことができるようになります。
(4)論理演算命令条件判断の時にはこれとこれが正しいときはとか、こうじゃないとき、などといった複雑な条件を指定したい場合がよくあります。そういうときにこの論理命令を使います。多分昔に下のような表を見たことはありませんか?
コンピューターの世界では真を1、偽を0と定義しておいて、正しいとか違っているという概念を右のように表します。
計算した結果が0になった場合はZフラグに1をセットする。 (5)終了命令
とりあえずの例![]() それでは例として100番地から以下のような機械語が書かれていたとします。
これはこんな動作をします。
アセンブリ言語![]() それにしても機械語は言語と言っても、ほとんど見ただけでは理解不能です(世の中にはこれで会話のできる人もいますが)そこでもう少しユーザーフレンドリーにならないかということで考え出されたのがアセンブリ言語というものです。 機械語では例えば足し算をしろとかいう命令は20という数値ですが、そう書く代わりに"ADD"という記号を使うのです。 これを使えば前項の機械語の例はこう書けます。左の行番号のようなものは、その命令の始まる番地です。
それはかつては手でやっていました!機械語との対応表を片手に、アセンブリ言語を手で機械語に直していたのです。 意味がないって?いえいえ、プログラムを考えるときには機械語で考えるよりもアセンブリ言語を使った方がわかりやすいはずです。アセンブリ言語のレベルでプログラムができてしまえば、それを機械語に直すのは単純な作業です。こうすることで機械語で物を考えるよりは間違いはずっと減るのです。 でもそうは言っても、まだまだこれは間違いやすくうっとうしい作業です。 そこでこれを自動的に翻訳してくれるプログラムが開発されました。文字列を対応表に従って置き換えるだけなので比較的簡単に作れそうだと想像はつくでしょう? これがアセンブラと呼ばれるプログラムです。 他の命令は?![]() ところで、前の例はいくら偽機械語だからといっても、あまりにも命令の数が少なすぎるとは思いませんか?メモリーの読み書きはともかく、計算が足し算引き算しかできないなんて、あまりにも情けなさすぎるとは思いませんか? ところが実はこれだけで基本の大部分はカバーしてしまっているのです!嘘だと思うのならば、こちらの本当の機械語の説明を見てみてください。 で、何が言いたいかというと、ワープロやゲームのような立派なソフトウェアであっても、その中身はほとんどこのような情けない命令の組み合わせであるということなのです。 それでは迷宮からの脱出を・・・![]() では次の章では迷宮脱出のアルゴリズムを上のアセンブリ言語で書いてみましょう。 多分どういうことになるかはもう想像できているでしょうが・・・ |
![]() |
![]() |
![]() |
![]() |
![]() |