Kuina-chan

くいなちゃん2018年12月11日


6さいからのプログラミング」第2話では、どうすればプログラムを作ることができるのかを説明します。

1メインメモリの構造

第1話では、プログラムはメインメモリに配置されてから実行されると言いましたが、実際のメインメモリは図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)。
表1-1: 10進数と16進数と2進数
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: バイトとビット
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 ...

図2-1: 機械語のプログラム
16進数なので一見難しそうですが、1つ1つの命令は単純です。 この機械語は表2-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)。
コンパイル
図3-1: コンパイル
この自動翻訳することを「コンパイル」といい、専用のアプリを使って行います。 コンパイルしてくれるアプリのことを「コンパイラ」といい、また翻訳前のプログラムのことを「ソースコード」といいます。
コンパイルの仕組みを用いると、非常に簡単にプログラムが作れる上に、他にもたくさんの利点があります。 例えば、CPUの種類によってCPUが読める機械語が異なるのですが、コンパイラの設定を変えるだけで、翻訳前のソースコードを修正することなく別のCPUにも対応できたりします。 また、コンパイルするときに優れた機械語になるように調整する「最適化さいてきか」も行ってくれます。
コンパイラもアプリなので、プログラミングによって作り出すことができます。 いつかコンパイラ作りに挑戦してみると良いでしょう。

4プログラミング言語の種類

翻訳前のソースコードはどのような言葉で書かれるかというと、これもまた日本語や英語ではなく、「プログラミング言語げんご」と呼ばれる専用の言語です。 そしてこのプログラミング言語にもたくさんの種類が存在します。
初めはいくつかのプログラミング言語しか存在しなかったのですが、「こんな言語のほうが便利だろう」「自分ならこう設計をする」と人々がやっているうちに、いつの間にか数百種類になってしまいました。 しかも用途により適材適所で使い分けられています。 表4-1に、使用人口の多いプログラミング言語を挙げます。
表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ベーシック」や「Delphiデルファイ」という言語が優勢だったときもあり、言語の流行り廃りは著しいです。 しかし数十年前から最も多くの人が習得していて今なお使われている基本的な言語は「C言語」ですので、まずはC言語を中心に学習すると良いでしょう。
また、機械語の命令を人間が読めるぎりぎりの言葉に置き換えただけの「アセンブリ言語」がありますが、CPUに特殊なことをさせたい場合にたまに使うことがあり、C言語のプログラムの中に埋め込むこともできるので、これも触っておくと良いかもしれません。 アセンブリ言語に慣れておくと、他の言語で書くときにもCPUの動作を意識した効率の良いプログラムが書けるようになります。 ちなみに、アセンブリ言語のプログラムを機械語に翻訳するときはコンパイルではなく「アセンブル」といい、翻訳を行ってくれるアプリを「アセンブラ」と呼びます。
プログラミング言語によっては、機械語にコンパイルしてから実行するのではなく、実行している最中に機械語に逐次翻訳しながら進めるものもあります。 こうすると実行速度は遅くなりますが、ソースコードを修正するたびにコンパイルする手間がかかることを短縮できます。
以上がプログラムを作る手順になります。 基本的には、「書いたソースコードを機械語にコンパイルして実行」という流れです。 ソースコードはテキストエディタで作れます。 コンパイルの仕方は、各コンパイラの説明書に書かれています。 あとは、ソースコードの書き方を学べばOSやアプリが作れそうです。

5コンパイラ

ここからは、各コンパイラを用意する方法について簡単に説明しておきます。 本講義ではインストール方法などは割愛しますが、詳しい使い方はそれぞれの公式サイトなどを参照してください。
C/C++では、Windowsならば「Visual Studio」というパッケージに含まれる「Visual C++」というアプリがよく使われます。 コンパイラだけでなく、テキストエディタや他の便利な機能も揃っています。 「Visual Studio Express」という機能を減らした無料版も配布されています。 Visual StudioにはC#も含まれており、C#を書きたい人も通常はこれを使います。
LinuxやBSDでC/C++を書くときは、コンパイラは「Clang」などを使うと良いでしょう。
アセンブリ言語をアセンブルする際のアセンブラは、大抵C/C++のコンパイラに付属しているのでそれを使います。
JavaScriptはWebブラウザによって動かされるもので、コンパイルは必要ないため、コンパイラは不要です。 このサイトを見るのに使っているWebブラウザと、テキストエディタがあれば十分です。
次回からは、アセンブリ言語とC言語とJavaScriptをはじめとする、様々な言語のソースコードを見ながら、多くのプログラミング言語で必須となる知識をまとめて解説します。
1544537593jaf