娘のためにその4:C言語・プログラムカウンタ[15分]

娘に読ませる以外の意図はなく、よって質問や指摘には対応していません。すなわちネットの浄化作用が働いていない不正確な内容になりますので、正しい情報を求める方は閲覧をご遠慮ください。公開しているのは、通信手段としての利便性のためです。

いくつかのプログラムを micro:bit 上で実行してきたが、それらはCという言語で記述されていた。ここで改めてその内容を解説していきたい。

C言語は古くからあるプログラム言語で、現在でもよく使われているものだ。一般的には、難しい、扱いにくい、その代わり高速、そんな評価をされる。ここでC言語を学習してもらうのは、メモリを直接操作できるからだ。前回の説明にあったように、メモリを直接操作すると簡単にクラッシュさせることができるため、近代的な言語では直接的な操作を許容していないものも多い。なお、C++(シープラスプラス)という言語を耳にしたことがあるかもしれないが、ここで説明する基礎においては区別する意味がない。つまりここでの解説はC++の解説でもある。

void setup()
{
}

void loop()
{
}

さて、このようなプログラムがあった。この言語はC言語である。ここには setuploop というふたつの関数定義がある。Arduino は setup という名前の関数を起動直後に実行し、loop という名前の関数をその後繰り返し実行するようにできている。なので setup や loop はC言語の規定ではなく、Arduinoの規定だ。

大切なのは、setup や loop は定義なのであって、別の何かがこの関数を呼び出しているということだ。つまり定義した内容は、何かから呼び出されることで初めて実行される。

void setup()
{
    Serial.begin(9600);
}

void loop()
{
}

void AAA()
{
    Serial.println("AAA!!!");
}

たとえばこんなプログラムを書いたとしよう。最後にAAAという関数定義を加えている。しかしこのAAAの中身は、決して実行されない。誰も呼んでいないからだ。C言語は、記述に問題があるとエラーを出してくれるが、こんな無意味な記述が含まれたプログラムでもエラーは出ない(親切に警告してくれるかもしれないが)。C言語として間違いではないが、AAAなんて関数を呼び出す機構がないので、実行もしてくれないというわけだ。さあ、実際にこのプログラムを実行して、AAA!!! とは表示されないのを確かめよう。

AAAを実行しようと思ったら次のように記述する。

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    AAA(); // 追加
}

void AAA()
{
    Serial.println("AAA!!!");
}

loop の中に AAA(); と書いたことにより AAA は実行される。コンソールに表示されるのを確認しよう。

プログラムはこのように、実行されて初めて機能する。そして「いまここを実行中」という地点が存在する。関数の中であれば、上から下に実行される。たとえば

void ffff()
{
    int a = 100;
    int b = a * 20;
    int c = a * b;
}

ffffというのは適当につけた関数の名前だ。こんなプログラムがあった場合、ffffが呼び出されれば、まず変数 a に 100が代入され、 次に変数 b に a の20倍が代入され、最後に変数 c に a と b の乗算結果が代入される。* という記号は乗算を意味する。結果、cには 200000 が格納された状態になる。

「いまここを実行中」という地点のことを「Program Counter (プログラムカウンタ)」と呼ぶ。書いたものがあちこち同時に実行されるわけではなく、たったひとつあるプログラムカウンタが下へ下へと動いていくことによって「ひとつずつ順番に」実行されていく。

通常のプログラムでカウンタと言えば、カウントするもの、つまり数値を数える変数だが、「プログラムカウンタ」はコンピュータの動作における「いまどこを実行中なのか」という特別な意味になる。

そしてこれが非常に大事なことなのだが、プログラムもまたメモリに格納されている。つまりプログラムカウンタというのは、プログラムが格納されているアドレスを受け取り、それをひとつずつ増やしながら実行していく。

プログラムがメモリに格納されている、というこの重大な事実は、またのちほど解説する予定なので、ここでは「なんとなく」理解しておけば十分だ。

次回までの間に、プログラムを書き換えて何ができるか試してみよう。適当に書くとエラーが出るはずだ。エラーメッセージにも慣れが必要なので、たくさんエラーを出してみよう。

つづく


この記事が気に入ったらサポートをしてみませんか?