2013年11月3日日曜日

C/C++ Hello World が動く仕組み

Hello Worldのプログラムを作って動かしたのですが、これがどうやって動いているかを説明します。

まずは、コンピュータの仕組みから説明します。コンピュータは基本的に次の3つから出来ています。


メモリ ↔ CPU ↔ I/O(Input/Output)


キーボードやマウス、ディスプレイにHDDはどこか?というとI/Oにつながっています。

そして、ご存知のようにコンピュータは電気で動いています。電気が流れる・流れないの2つの状態を大量にメモリに持っています。CPUでその電気の流れる・流れないの状態を取得したり、変更したりします。またCPUはキーボード等からI/Oを通じて電気の流れる・流れないを取得したり、ディスプレイに電気の流れる、流れないを渡して表示を行ったりすることができます。

単純に流れる・流れないは 2値(ディジタル)ですが、2値をたくさん組み合わたデータを操作することで色々なことができるのがコンピュータです。



さて、Hello Worldの仕組みに戻ります。a.exe(a.out)というファイルが作られたのですが、このファイルは実行形式のデータとなっています。画像は単に画像形式に、文書は文書形式になっているだけで、コンピュータは2値を組み合わせたデータを扱うと言う点に違いはないです。

実行形式のデータはOSによって中身が違っており、WindowsではPE(Portable Executable)という形式になっており、LinuxではELF(Excutable and Linkable Format)という形式になっています。gccなどのコンパイラはコンパイルすることでこれらの形式のファイルを作ります。

実行形式のファイルを実行する操作を行うと、OSが実行形式をI/Oを通じてHDDからファイルをメモリ上に展開します。 そして、main()という名前の関数から実行を行うようになっています。

CPUの部分では、以下の手順で実行を行っています。

printf();の実行
 ↓
return 0; の実行

メモリの部分では、プログラム自身と"Hello World\nGood bye\n"などの文字列を記憶しています。

I/Oの部分はプログラムを書くのが難しい部分です。そこで他の人(OS提供元など)が作ったプログラムを組み込み、それを使います。その組み込むプログラムのことをライブラリと言い、ヘッダーファイル(○○.h)と一緒に提供されます。

#include<stdio.h> では、標準I/O(Standard I/O)と言うものを組み込んであり、コンソールに表示を行う機能など、WindowsでもLinuxでも使えるような機能が提供されています。

ライブラリの組み込みは通常は、コンパイル時のオプションで指定する必要があります。しかしC言語の標準的な機能は、何も指定しないでもデフォルトで組み込まれるようになっています。

 以下のように"-v"オプションを付けてコンパイルを行うとコンパイルで何を行っているかの詳細が表示されます。

$ gcc -v hello.c

最後の辺りで -lmsvcrt などの文字が出てくると思います。これらがデフォルトで組み込まれたライブラリです(-lがライブラリを指定するオプションでmsvcrtというライブラリを組み込んだと言うことになります)。

Hello Worldの仕組みについては以上です。Hello Worldでも、大きいプログラムでも、コンピュータの基本が「CPU」、「メモリ」、「I/O」であることから、これらを操作する処理を書くことがプログラムを書くこと、になります。

0 件のコメント:

コメントを投稿