
1メインメモリの構造
第1話では、プログラムはメインメモリに配置されてから実行されると言いましたが、実際のメインメモリは図1-1のような構造になっています。

メインメモリは情報が格納された長い帯のイメージです。 図では「B8 03 00 00 00 83 C0」という情報が入っていますが、この左右にも延々と続いています。
メインメモリの情報は、よく「16進数」という書き方で表されます。 わたしたちは数値を書くとき「0123456789」の10種類の記号を使いますが、これは「10進数」と呼ばれ、16進数では「0123456789ABCDEF」の16種類の記号で数値を表します。 また「01」の2種類だけで数値を表す「2進数」もプログラミングではよく使われます。 「9」に「1」を足すと、10進数では繰り上がって「10」になりますが、16進数では「A」になります(表1-1)。
10進数 | 16進数 | 2進数 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 2 | 10 |
3 | 3 | 11 |
4 | 4 | 100 |
5 | 5 | 101 |
6 | 6 | 110 |
7 | 7 | 111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
10 | A | 1010 |
11 | B | 1011 |
12 | C | 1100 |
13 | D | 1101 |
14 | E | 1110 |
15 | F | 1111 |
16 | 10 | 10000 |
16進数では「F」に「1」を足すと繰り上がって「10」になります。
さて、先ほどの図1-1ではメインメモリの上部にも16進数が書かれていますが、これは「アドレス」と呼ばれ、メインメモリの先頭から順番に1つずつ増やしながら割り当てられています。 アドレスを「○○番地」と表現すると、先ほどの図でB8が入っているのは「3C番地」、83が入っているのは「41番地」になっています。 また「42番地にはC0が入っている」ともいえます。
メインメモリの1つの番地には、16進数で「00~FF」の範囲の値を入れることができます。 これは10進数では「0~255」、2進数では「00000000~11111111」の値です。 この値1つあたりの長さを「1バイト」と呼び、2進数で表したときの各桁の長さを「1ビット」と呼びます(図1-2)。

1バイトの情報は2進数で「00000000~11111111」の8桁で表せますので、「1バイト=8ビット」です。 例えば「B8 03 00 00 00 83 C0」という情報は、7バイトであり、また56ビットです。
2機械語
第1話でプログラムは命令の集まりだと言いましたが、CPUは実は日本語や英語ではなく「機械語」と呼ばれる専用の言語しか理解できないため、プログラムは機械語で作る必要があります。 図2-1は機械語のプログラムの例です。
B8 03 00 00 00 83 C0 02 A3 A0 00 00 00 ...
16進数なので一見難しそうですが、1つ1つの命令は単純です。 この機械語は表2-1のような意味になっています。
機械語 | 意味 |
---|---|
B8 03 00 00 00 | CPUのレジスタに3を書き込む。 |
83 C0 02 | CPUのレジスタの値を2増やす。 |
A3 A0 00 00 00 | CPUのレジスタの値をメインメモリのA0番地に書き込む。 |
このプログラムをよく読むと、メインメモリのA0番地に5が書き込まれるプログラムであることが解ります。 以上のような機械語を書いていけば、最終的にはアプリやOSが完成します。
3コンパイル
しかし実際にプログラムを機械語で書いていくのは大変なので、現在では普通もっと便利な方法が行われます。 人間にとって解りやすい言葉で書き、あとで機械語へ自動翻訳させるのです(図3-1)。

この自動翻訳することを「コンパイル」といい、専用のアプリを使って行います。 コンパイルしてくれるアプリのことを「コンパイラ」といい、また翻訳前のプログラムのことを「ソースコード」といいます。
コンパイルの仕組みを用いると、非常に簡単にプログラムが作れる上に、他にもたくさんの利点があります。 例えば、CPUの種類によってCPUが読める機械語が異なるのですが、コンパイラの設定を変えるだけで、翻訳前のソースコードを修正することなく別のCPUにも対応できたりします。 また、コンパイルするときに優れた機械語になるように調整する「最適化」も行ってくれます。
コンパイラもアプリなので、プログラミングによって作り出すことができます。 いつかコンパイラ作りに挑戦してみると良いでしょう。
4プログラミング言語の種類
翻訳前のソースコードはどのような言葉で書かれるかというと、これもまた日本語や英語ではなく、「プログラミング言語」と呼ばれる専用の言語です。 そしてこのプログラミング言語にもたくさんの種類が存在します。
初めはいくつかのプログラミング言語しか存在しなかったのですが、「こんな言語のほうが便利だろう」「自分ならこう設計をする」と人々がやっているうちに、いつの間にか数百種類になってしまいました。 しかも用途により適材適所で使い分けられています。 表4-1に、いくつかのプログラミング言語を挙げます。
名前 | 説明 |
---|---|
アセンブリ言語(げんご) | 機械語の命令を、人間がぎりぎり読める言葉に1対1で置き換えただけのような言語。 機械語よりはこれで書いたほうが解りやすいです。 |
C言語(シーげんご) | 最も多くの人が習得している基本的な言語。 まずはこれをマスターすることを勧めます。 |
C++シープラスプラス | C言語を拡張した言語。 大抵C言語をそのまま書くことは少なく、C++が使われることが多いです。 C言語と合わせて「C/C++」と表現されたりします。 |
Java(ジャヴァ) | 多くの種類のコンピュータで動作可能な言語。 一時期下火になったり、Androidアプリを作る際の標準言語となって息を吹き返したりと、流行り廃りに波があります。 |
C#(シーシャープ) | Windows界隈で人気の言語。 名前に「C」と付きますが、中身はC/C++よりもJavaに近いです。 Windows用アプリを作るときによく使われます。 |
JavaScript(ジャヴァスクリプト) | 凝ったWebサイトを作るときに必須の言語。 Webブラウザ上で動作します。 名前に「Java」と付きますが、Javaとは全く異なる言語です。 |
Perl(パール)、PHP(ピーエイチピー)、Python(パイソン)、Rubyルビー | 凝ったWebサイトを作るときに、JavaScriptとは別に必要となる言語。 主にWebサーバ上のプログラムを作るときに使います。 また、Pythonは機械学習(人工知能に関する分野)などでもよく使われています。 |
関数型言語(かんすうがたげんご) | C言語などとは異なる発想の言語。 関数型言語には「LISP(リスプ)」「Haskell(ハスケル)」「F#(エフシャープ)」などが存在します。 |
この他にも様々な言語が存在します。 C#が登場するまでは「Visual Basic」が優勢だったり、最近はC/C++に代わる言語として「Rust」が登場したり、言語の流行り廃りは著しいです。 しかし数十年前から最も多くの人が習得していて今なお使われている言語は「C言語」ですので、まずはC言語を中心に学習すると普遍的な知識が習得できると思います。
また、機械語の命令を人間が読めるぎりぎりの言葉に置き換えただけの「アセンブリ言語」がありますが、CPUに特殊なことをさせたい場合にたまに使うことがあり、C言語のプログラムの中に埋め込むこともできます。 ちなみに、アセンブリ言語のプログラムを機械語に翻訳するときはコンパイルではなく「アセンブル」といい、翻訳を行ってくれるアプリを「アセンブラ」と呼びます。
プログラミング言語によっては、機械語にコンパイルしてから実行するのではなく、実行している最中に機械語に逐次翻訳しながら進めるものもあります。 こうすると実行速度は遅くなりますが、ソースコードを修正するたびにコンパイルする手間がかかることを短縮できます。
以上がプログラムを作る手順になります。 基本的には、「書いたソースコードを機械語にコンパイルして実行」という流れです。 ソースコードはテキストエディタで作れます。 コンパイルの仕方は、各コンパイラの説明書に書かれています。 あとは、ソースコードの書き方を学べばOSやアプリが作れそうです。
5コンパイラ
ここからは、各コンパイラを用意する方法について簡単に説明しておきます。 本講義ではインストール方法などは割愛しますが、詳しい使い方はそれぞれの公式サイトなどを参照してください。
C/C++では、Windowsならば「Visual Studio」というパッケージに含まれる「Visual C++」というアプリがよく使われます。 コンパイラだけでなく、テキストエディタや他の便利な機能も揃っています。 無料版も配布されています。 Visual StudioにはC#も含まれており、C#を書きたい人も通常はこれを使います。
LinuxやBSDでC/C++を書くときは、コンパイラは「Clang」や「GCC」を使うと良いでしょう。
アセンブリ言語をアセンブルする際のアセンブラは、大抵C/C++のコンパイラに付属しているのでそれを使います。
JavaScriptはWebブラウザによって動かされるもので、コンパイルは必要ないため、コンパイラは不要です。 このサイトを見るのに使っているWebブラウザと、テキストエディタがあれば十分です。
次回からは、C言語とアセンブリ言語とJavaScriptをはじめとする、様々な言語のソースコードを見ながら、多くのプログラミング言語で必須となる知識をまとめて解説します。