2: 2007-01-10 (水) 09:47:53 |
現: 2024-01-06 (土) 22:39:13 |
| | | |
| 10111000,00010000 , 00000101,00001000 | | 10111000,00010000 , 00000101,00001000 |
| + | |
| └────────┘ └───────┘ | | └────────┘ └───────┘ |
| AXに16をセットしろ !AXの値に8を足せ! | | AXに16をセットしろ !AXの値に8を足せ! |
| B8,10, ← B8が「AXに値を入れろ!」という命令。後ろの10は10進数で16。 | | B8,10, ← B8が「AXに値を入れろ!」という命令。後ろの10は10進数で16。 |
| 05,08 ← 05が「AXの値と足し算しろ!」という命令。後ろの08が足す数。 | | 05,08 ← 05が「AXの値と足し算しろ!」という命令。後ろの08が足す数。 |
| + | |
| うーん。こういうふうに命令ごとに縦に割って書けばだいぶ解りやすくなってきましたね?。でも、やっぱり「足し算は05だ!」とか「代入はB8だ!」なんて、とても覚えていられませんよね?。こういう機械的な翻訳が得意な道具ってないかな・・・は! そうだ! あった!! ''コンピューターだ!!'' | | うーん。こういうふうに命令ごとに縦に割って書けばだいぶ解りやすくなってきましたね?。でも、やっぱり「足し算は05だ!」とか「代入はB8だ!」なんて、とても覚えていられませんよね?。こういう機械的な翻訳が得意な道具ってないかな・・・は! そうだ! あった!! ''コンピューターだ!!'' |
| | | |
| ここで、''アセンブラ言語''が考え出されました。B8とか05とかじゃわからない(覚えきれない)けど、MoveとかAddとかJumpとかならなんとか覚えられるよね?。あと、数値も10進数でも16進数でも2進数でも自由に書けたら後でチェックする時にも楽じゃない?。そんなわけで、アセンブラ登場!。(しかし、上記に書いた通り、Moveとか言ってもコンピュータにはわからない。ちゃんと最後は2進数に変換してやらないといけないんですよね。これが変わったわけではないのです) | | ここで、''アセンブラ言語''が考え出されました。B8とか05とかじゃわからない(覚えきれない)けど、MoveとかAddとかJumpとかならなんとか覚えられるよね?。あと、数値も10進数でも16進数でも2進数でも自由に書けたら後でチェックする時にも楽じゃない?。そんなわけで、アセンブラ登場!。(しかし、上記に書いた通り、Moveとか言ってもコンピュータにはわからない。ちゃんと最後は2進数に変換してやらないといけないんですよね。これが変わったわけではないのです) |
| アセンブラ言語で書く マシン語できた〜! | | アセンブラ言語で書く マシン語できた〜! |
| + | |
| ┌──────┐ アセンブラプログラム ┌────┐ | | ┌──────┐ アセンブラプログラム ┌────┐ |
| │MOV AX,16│ → が翻訳してくれる。 → │B5,10 │ | | │MOV AX,16│ → が翻訳してくれる。 → │B5,10 │ |
| | | |
| アセンブラ言語で書く マシン語できた〜! | | アセンブラ言語で書く マシン語できた〜! |
| + | |
| ┌────────┐ アセンブラプログラム ┌──────┐ | | ┌────────┐ アセンブラプログラム ┌──────┐ |
| │ADD CX,0x1234│→ が翻訳してくれる。 → │81,C1,34,12 │ | | │ADD CX,0x1234│→ が翻訳してくれる。 → │81,C1,34,12 │ |
| | | |
| これはJAVAだろうがD言語だろうがC++だろうが同じです。 | | これはJAVAだろうがD言語だろうがC++だろうが同じです。 |
| + | |
| + | さて、話のC言語ですが、上記の例を見ればわかるとおり、解りやすく書かれたC言語はCコンパイラというソフトによってマシン語に翻訳されるのですが、実はC言語は、「入出力」の命令を一切持っていません。入出力。すなわち、 |
| + | --画面になにか表示する |
| + | --キーボードやマウス等からの信号を受け付ける |
| + | |
| + | こういったことは、''純粋な意味でのC言語''では、一切できないのです。 |
| + | |
| + | 「え〜?そんなアホな! だって俺は現にC言語でHello! Worldという文字を表示できているぞ!画面だぞ!ウソつくな!」 |
| + | |
| + | こんな声が聞こえてきそうですが、ウソではないのです。C言語の命令をいくら駆使しても、画面の文字を出すことはできません。 |
| + | |
| + | C言語は、自分自身で文字を出力することはできませんが、''アセンブラやC言語等で作られたマシン語の命令の塊を関数として呼び出して使うことができる''のです。 |
| + | |
| + | この、アセンブラやC言語で作られた様々な命令の塊を「ライブラリ」といい、ライブラリにどんな関数が入っているのかという目次を書いたものを「ヘッダーファイル」と言います。 |
| + | |
| + | ヘッダーファイル(関数の目次)をC言語のソースにはさみこむことで、それ以降はじめて、今までのCにはなかった命令が使えるようになります。 |
| + | |
| + | もっとも有名な「printf」関数。画面に文字を出す関数ですが、これもC言語に内臓されているのではなく、別に用意されたライブラリ+その目次であるヘッダーファイルを挟み込むことで初めて使うことができるのですね。 |
| + | |
| + | ソースファイル Cコンパイラ |
| + | |
| + | Main(){ ←ふむ。最初に実行される関数だね。 |
| + | int a; ← 変数の定義か。これはできるぞ! |
| + | a = 16; ←ふむ。変数に値を代入だね。OK。 |
| + | printf("%f %e", a); ←・・・はぁ?なんだこの命令?しらんぞ! |
| + | } ←がーん。へんな命令がある!翻訳できないよ〜! |
| + | |
| + | ''純粋なC言語''だと、こうなってエラーになってしまいます。 |
| + | |
| + | しかし、どこかの誰かがアセンブラやC言語で、printfという、画面に文字を出す命令を作ってくれました。そしてそれらの関数を何個かひとまとめにしてライブラリを作っておいてくれました。あとは、C言語の中にヘッダーファイルをはさみこみ、「こんな名前の関数を作っておいたよ。使っていいよ〜」とすれば、printfを使えるようになるのです。 |
| + | |
| + | |
| + | ソースファイル Cコンパイラ |
| + | |
| + | <#include stdio.h> ←ふむ。stdio.hというファイルを読もう。なになに?いろんな関数があるなぁ。 |
| + | |
| + | Main(){ ←ふむ。最初に実行される関数だね。 |
| + | int a; ← 変数の定義か。これはできるぞ! |
| + | a = 16; ←ふむ。変数に値を代入だね。OK。 |
| + | printf("%f %e", a); ←お?この命令は知らないけど、たしかライブラリにあるな。それをそのまま使おう! |
| + | } ←よーし。全部知ってる命令だった。翻訳できた〜 |
| + | |
| + | とまあ、こういう仕組みになります。 |