なぜ言語設計者はこの文法を作ったのか

「なぜ」を学ぶ重要性

世の中にはたくさんのプログラミング言語があります。そしてプログラミングに関する概念も、関数、型、スコープ、クラス、継承など、さまざまなものがあります。これらを単に利用するだけならそれほど苦労することはありませんが、しっかりと理解し、実感を持って利用できるようになるにはたくさんの知識が必要になります。

これらの知識を効率的に身に付けるためには、その概念が「なぜ」生まれたのかを理解する必要があります。そのために本書では、言語設計者の視点に立ち、複数の言語を比較し、そして言語がどう変化してきたのかを解説するというアプローチをとります。

while、forの例

例として、本書でも解説しているwhile、forを考えてみます。どちらも繰り返しを表現しますが、では「なぜ」2つも同じことを表すものがあるのでしょうか。それは、whileとforを「比較」すると明らかになります。

iを0以上N未満の範囲で、1ずつ増やしながら表示する処理をforを使って表現するとリスト1のようになります。同じ処理をwhileを使って書くこともできますリスト2⁠。

リスト1 forを使った繰り返しの表現
for(i = 0; i < N; i++){
    printf("%d\n", i);
}
リスト2 whileを使った繰り返しの表現
i = 0;
while(i < N){
    printf("%d\n", i);
    i++;
}

どちらも「まずi = 0とし、i < Nが真ならば処理を実行し、iに1を足して最初に戻る」という動作をしていますが、whileのほうは「ループの外でi = 0ループの条件式でi < Nループの最後でi++と3ヵ所にコードが分散してしまって、あとで読むときに意図がわかりにくくなってしまいます。for文で書くとこれらの処理が1ヵ所にまとまるので、ループの意図を理解するのが楽になります図1⁠。これが、forが生まれた理由です。

図1 3ヵ所のコードがfor文では1ヵ所にまとまっている
図1 3ヵ所のコードがfor文では1ヵ所にまとまっている

本書の目的

こういった形で、本書ではほかの言語での状況と比較したり、その概念の変遷をたどっていったり、そして言語設計者の視点を借りることで、プログラミング言語が持つ概念が「なぜ」存在するのかを明らかにしていきます。⁠なぜ」生まれたのかを理解することで、なぜ使うべきか、いつ使うべきか、どう使うべきかを判断できるようになるでしょう。そして、今後生まれてくる新しい概念も、よりいっそう理解しやすくなることでしょう。