1: 2007-01-10 (水) 08:04:35 |
2: 2007-01-10 (水) 09:47:53 |
| | | |
| (実はつい40年くらい前までは、この「死にそうになる」方法でプログラムが作られていたらしい。 | | (実はつい40年くらい前までは、この「死にそうになる」方法でプログラムが作られていたらしい。 |
| + | |
| + | たとえばAXレジスタに数値16をセットし、それに数値8を足し算したい。こんなのを考えると、人間は頭の中で、とにかく最初に 「+」を思い浮かべるだろう。しかし、コンピュータにこの動作をさせるためには |
| + | |
| + | 10111000,00010000 , 00000101,00001000 |
| + | |
| + | └────────┘ └───────┘ |
| + | AXに16をセットしろ !AXの値に8を足せ! |
| + | と、こう信号を送る以外にはないのだ。それ以外では絶対にコンピュータは動作しない。(ペンティアムだろうがPS3だろうがMacだろうが!) |
| + | |
| + | ちなみにこれらの数値(二進数)はどうやって決まっているのか。これはCPUを設計した時に「そうしよう」と決められただけ。なにが何番とかそういう分類や整理は一切ない。(つまり、もしこういう命令を覚えようと思ったら、単なる丸暗記以外には方法がない) |
| + | |
| + | ・・・昔はこんなことしてたんですねぇ・・・ほんとに信じられません・・・(^^; |
| + | |
| + | で、これじゃぁあんまりなので、もう少し人間にわかりやすいようにできないものかと考えられ、二進数を16進数に直して書けばすこしはわかりやすいだろうということになりました。 |
| + | |
| + | B8,10,05,08 |
| + | |
| + | ほら! こんなに解りやすいでしょう!? |
| + | |
| + | ''・・・・・・・orz・・・・・・・'' |
| + | |
| + | 前よりは、確かにナンボか読みやすくなりましたが、やっぱりそれでも「暗記」「暗号解読」になっちゃいますよねぇ。もうすこしなんとかならないかなぁ。 |
| + | |
| + | ちなみに、上記のヘンテコな暗号は、こういうふうに読みます。 |
| + | |
| + | B8,10, ← B8が「AXに値を入れろ!」という命令。後ろの10は10進数で16。 |
| + | 05,08 ← 05が「AXの値と足し算しろ!」という命令。後ろの08が足す数。 |
| + | |
| + | うーん。こういうふうに命令ごとに縦に割って書けばだいぶ解りやすくなってきましたね?。でも、やっぱり「足し算は05だ!」とか「代入はB8だ!」なんて、とても覚えていられませんよね?。こういう機械的な翻訳が得意な道具ってないかな・・・は! そうだ! あった!! ''コンピューターだ!!'' |
| + | |
| + | ここで、''アセンブラ言語''が考え出されました。B8とか05とかじゃわからない(覚えきれない)けど、MoveとかAddとかJumpとかならなんとか覚えられるよね?。あと、数値も10進数でも16進数でも2進数でも自由に書けたら後でチェックする時にも楽じゃない?。そんなわけで、アセンブラ登場!。(しかし、上記に書いた通り、Moveとか言ってもコンピュータにはわからない。ちゃんと最後は2進数に変換してやらないといけないんですよね。これが変わったわけではないのです) |
| + | アセンブラ言語で書く マシン語できた〜! |
| + | |
| + | ┌──────┐ アセンブラプログラム ┌────┐ |
| + | │MOV AX,16│ → が翻訳してくれる。 → │B5,10 │ |
| + | │ADD AX,8 │ (これをコンパイルと言う) │05,08 │ |
| + | └──────┘ └────┘ |
| + | |
| + | ちなみに、OS自作入門の中で |
| + | ADD CX,0x1234 は 81 C1 34 12 という4バイトの命令 |
| + | ADD AX,0x1234 は 05 34 12 という3バイトの命令 |
| + | という記載があります。お解りになりますか?。命令部分は「B8」とか「05」とか、1バイトとは限らないんです。「81,C1」という2バイトでひとつの命令になるものもあります。上記の図みたいに書き直すと・・・ |
| + | |
| + | アセンブラ言語で書く マシン語できた〜! |
| + | |
| + | ┌────────┐ アセンブラプログラム ┌──────┐ |
| + | │ADD CX,0x1234│→ が翻訳してくれる。 → │81,C1,34,12 │ |
| + | │ADD AX,0x1234│ (コンパイルと言う) │05,34,12 │ |
| + | └────────┘ └──────┘ |
| + | |
| + | こういうふうに横に並べてみると、アセンブラは「言語」とは言っても、16進数のマシン語をちょこっとだけ見やすくしただけというふうに見えますよね?。数値を自動で計算してくれたり、ラベル機能が使えたりしますが。なんとな〜く想像してみてください。命令の一覧表が手元にあれば、アセンブラで書かれたソースを見ながら、手で(紙とエンピツ)マシン語に翻訳することは可能っぽくないですか??(ちなみに昔はまさにこれでやっていたそうです。呼び名はそのまま、「ハンドアセンブル」と言ったそうです) |
| + | |
| + | さて。アセンブラの登場で、だいぶコンピュータのプログラミングは楽になってきましたが、やっぱりむずかしいですよね?。アセンブラは事実上マシン語です。CPUのレジスタやメモリなどの構造・理屈を知っていないと使えません。かと言って、人間が口で |
| + | |
| + | --まず、数値をひとつ覚えろ。そうだな。じゃ、16にしよう。 |
| + | --その覚えた数値に8を足し算しろ! |
| + | |
| + | なんて言っても、コンピュータは理解できません。どうしよう・・・ |
| + | |
| + | そこでいよいよ、「高級言語」と言われる、より人間の感覚に近く、整合性が取れたプログラム言語が考え出されました。それがC言語です。(いきなりCが出来たわけではありません。それ以前にもいろいろ考え出されました。B言語とかフォートラムとか) |
| + | C言語はアセンブラと違い、ずいぶんと人間の感覚に近いものになりました。(とは言っても、やはり口でしゃべれば解るなんて理想からすれば程遠いものですが・・・(^^; ) |
| + | |
| + | |
| + | 細かいことはおいておいて、C言語でプログラムを書くとこうなります。 |
| + | Main{ |
| + | int a; |
| + | a = 16; |
| + | a = a+8; |
| + | } |
| + | |
| + | ・・・なるほど。少なくとも「なにをやっているか?」を推察するという意味では、アセンブラなんかに比べてもずいぶん解りやすくなりましたね?。 |
| + | |
| + | もうこれで、アセンブラなんか必要なくなりました。アセンブラなんて過去の遺物です。一度C言語が完成した以上、もう誰もアセンブラなんか必要ありません。アセンブラはこの世から消失していきました・・・・ |
| + | |
| + | ''大嘘です!!!!!'' |
| + | |
| + | もう一度よく考えてみてください。コンピュータは、アセンブラ(マシン語)以外では絶対に動かないんですよ?。「でも現に、C言語で動いているじゃないか!」ですって? |
| + | |
| + | 違います。コンピュータはC言語で動いているのではなく、''C言語が作り出したマシン語で動いている''のです。 |
| + | |
| + | また現在でも、C言語は通常は直接マシン語を作ってはくれません。C言語で書かれた元のプログラム(ソースと言う)を一旦アセンブラに翻訳して(本当のアセンブラではないが、マシン語ではない)、そのアセンブラをさらに翻訳してマシン語(実行できる。つまりコンピュータが理解できるもの)を作り出しているのです。 |
| + | |
| + | COLOR(red){これは解りやすい概念です。実際には細かい部分が違います} |
| + | |
| + | これはJAVAだろうがD言語だろうがC++だろうが同じです。 |