C言語の基本|プログラミング言語はどう進化したのか

0と1だけの命令から、人間が読めるコードへ。プログラミング言語の進化をたどってC言語の位置づけを理解しよう。

現在では、C言語をはじめ、Python、Java、JavaScriptなど、さまざまなプログラミング言語を使ってプログラムを作ることができます。

私たちはキーボードから英単語や数字、記号を入力し、それらを組み合わせながらプログラムを書いています。

たとえばC言語なら、画面に文字を表示するときにprintfを使います。

このようなコードは、ある程度プログラミングを学べば、人間でも処理内容を読み取ることができます。

しかし、コンピュータが誕生したころから、このように読みやすいプログラミング言語が存在していたわけではありません。

初期のコンピュータでは、人間がコンピュータの仕組みに合わせて、より直接的な形で命令を与える必要がありました。

その代表的なものが機械語です。

機械語はコンピュータにとって非常に都合のよい形式ですが、人間にとっては扱いにくいものでした。

そこで、

もっと人間が読みやすい方法はないだろうか

という考えからアセンブリ言語が使われるようになります。

さらに、

コンピュータごとの細かな違いを意識せず、もっと分かりやすくプログラムを書けないだろうか

という要求から、FortranやCOBOLなどの高級言語が登場しました。

このようにプログラミング言語の歴史を見ると、

コンピュータに近い書き方から、人間にとって分かりやすい書き方へ

少しずつ進化してきたことが分かります。

C言語も、この大きな流れの中で誕生したプログラミング言語の一つです。

C言語を学習するときに歴史を少し知っておくと、なぜコンパイラが必要なのか、なぜ機械語へ変換する必要があるのか、そしてなぜC言語がコンピュータの仕組みを学ぶのに適しているのかが理解しやすくなります。

ここでは、

機械語 → アセンブリ言語 → 高級言語 → C言語

という流れを中心に、プログラミング言語がどのように発展してきたのかを順番に見ていきます。

プログラミング言語の歴史を学ぶ理由

C言語を使ってプログラムを書くことだけを考えるなら、歴史を知らなくても学習を始めることはできます。

それでも最初に歴史を知っておくことには、大きな意味があります。

なぜなら、現在使っているプログラミング言語の多くの仕組みは、過去の問題を解決するために生まれてきたものだからです。

たとえば、機械語が人間にとって扱いにくかったため、アセンブリ言語が使われるようになりました。

アセンブリ言語でもコンピュータに近すぎて開発が大変だったため、さらに人間が理解しやすい高級言語が発展しました。

つまり、言語の進化を知ることは、

なぜ現在のプログラミング言語がこのような形になっているのか

を理解することにもつながります。

歴史を学ぶことで見えてくること

視点理解できること
コンピュータの基本コンピュータ内部では最終的に機械語の命令が実行されること
プログラミング言語の役割人間がプログラムを書きやすくするために言語が発展したこと
言語の抽象化コンピュータ固有の細かな操作を意識しなくても書ける方向へ進化したこと
C言語の特徴高級言語でありながらコンピュータに近い処理も意識しやすいこと
学習方法書き方だけでなく、その仕組みや理由を考えながら学べること

C言語では、この歴史的な背景を感じる場面が多くあります。

たとえばメモリを意識した処理や、コンパイルによってプログラムを変換する仕組みなどです。

そのため、言語の歴史を知ることは、C言語そのものへの理解を深めることにもつながります。

初期のコンピュータでは機械語が使われていた

コンピュータが登場した初期の時代には、現在のようなC言語やPythonなどは存在していませんでした。

プログラムを実行するには、コンピュータが直接理解できる形式に近い形で命令を与える必要がありました。

そこで使われたのが機械語です。

機械語とは、CPUが直接解釈して実行できる命令を表現したものです。

人間が見ると、たとえば次のような0と1の並びとしてイメージできます。

10110000 00110101
00000010 10010110
11001000 01101100
00100100 10100001
01110010 00110010
10010100 11001001

このような数字の列を見ただけで、

「これはデータを移動している」

「ここでは足し算を行っている」

「次の命令へ移動している」

と判断するのは非常に困難です。

しかし、コンピュータ側から見ると事情は反対です。

CPUは、人間が書いた日本語や英語の文章をそのまま命令として処理するのではなく、CPUで実行できる命令を処理します。

つまり機械語は、

コンピュータにとって扱いやすいが、人間にとって非常に扱いにくい

という特徴を持っています。

機械語の特徴

項目内容
表現0と1を中心とした命令として扱われる
コンピュータから見た利点CPUが実行できる命令に直接対応する
人間から見た欠点命令の意味を読み取りにくい
プログラム作成非常に手間がかかる
修正間違いの場所を見つけにくい
CPUとの関係CPUの種類や命令体系への依存が非常に大きい

プログラムが数個の命令だけで終わるのであれば、人間が機械語を扱うことも不可能ではありません。

しかし、プログラムが何百、何千、何万という命令になれば、0と1だけを見ながら開発することは非常に大変になります。

一つの数字を書き間違えただけでも、別の命令として解釈されてしまう可能性があります。

さらに、あとからプログラムを修正するときにも、

「この0と1の並びは何の処理だったのか」

を確認しなければなりません。

そこで、人間がもう少し理解しやすい方法が求められるようになります。

図1:機械語から人間が読める言語へ向かう第一歩

この図から分かること

機械語はCPUが実行する命令に近いため、コンピュータにとっては扱いやすい形式です。

しかし、人間から見ると0と1の並びから処理内容を判断するのは難しくなります。

この問題を解決するために、

数字だけではなく、命令の意味を表す分かりやすい名前を使おう

という考え方が生まれました。

その結果、機械語よりも人間が読み書きしやすいアセンブリ言語が使われるようになります。

言語の進化は、単に新しい技術を作るためだけに起こったわけではありません。

人間がプログラムを作るときの負担を減らしたい

という必要性も、大きな理由だったのです。

アセンブリ言語によって命令の意味が見えるようになった

機械語を直接扱う大変さを減らすために使われるようになったのが、アセンブリ言語です。

アセンブリ言語では、CPUの命令を0と1だけで表すのではなく、人間が覚えやすい短い記号を使って記述します。

たとえば、

MOV
ADD
SUB
JMP

などです。

これだけでも、機械語の数字だけを見ている状態とは大きく変わります。

ADDなら加算に関係する命令だと推測できますし、MOVならデータを移動する命令だと判断しやすくなります。

たとえば、次のようなプログラムを考えてみます。

main:
    MOV BX, 4
    MOV AX, 3
    ADD BX, AX
    XOR AX, AX
    RET

アセンブリ言語をまだ学習していなくても、ADDという文字から、

「何かを加算しているようだ」

ということは想像できます。

機械語の0と1だけを見ている状態と比較すると、人間にとって大幅に理解しやすくなっています。

機械語とアセンブリ言語を比較する

同じCPUの命令を扱う場合でも、機械語とアセンブリ言語では人間から見た分かりやすさが大きく違います。

項目機械語アセンブリ言語
命令の表現0と1を中心とした命令MOVやADDなどの記号
人間から見た読みやすさ非常に低い機械語より高い
書きやすさ非常に難しい機械語より書きやすい
実行方法CPUが実行できる命令アセンブラによって機械語へ変換する
CPUへの依存非常に強い強い
修正のしやすさ難しい機械語より改善される

ここで大切なのが、アセンブリ言語も最終的には機械語へ変換されるという点です。

CPUがMOVやADDという文字列を、そのまま人間のように読んでいるわけではありません。

人間が書いたアセンブリ言語をアセンブラと呼ばれるソフトウェアが機械語へ変換します。

流れを簡単にすると、次のようになります。

人間
  ↓
アセンブリ言語を書く
  ↓
アセンブラ
  ↓
機械語
  ↓
CPUが実行

この仕組みによって、人間は機械語を直接書く負担を減らせるようになりました。

ニーモニックとは何か

アセンブリ言語を理解するときに覚えておきたい言葉がニーモニックです。

ニーモニックとは、機械語の命令を人間が覚えやすい短い記号で表したものです。

ニーモニックの代表的なイメージ

ニーモニック主な意味のイメージ
MOVデータを移動する
ADD加算する
SUB減算する
JMP指定された位置へ処理を移す

0と1の長い並びを覚えるより、

ADD

と書かれていたほうが、加算に関係する処理であることを理解しやすくなります。

つまりニーモニックは、

CPUの命令に人間が理解しやすい名前を付けたもの

と考えると分かりやすいでしょう。

ただし、ここで注意したい点があります。

アセンブリ言語は人間にとって読みやすくなったとはいえ、まだCPUとの結び付きが非常に強い言語です。

アセンブリ言語にはCPU依存という問題が残っていた

コンピュータのCPUには、それぞれ利用できる命令があります。

CPUの種類や設計が違えば、利用する命令やレジスタなども異なることがあります。

そのため、あるCPU向けに作成したアセンブリ言語のプログラムを、まったく異なるCPUへそのまま持っていって実行できるとは限りません。

場合によっては、別のCPU向けにプログラムを書き直す必要があります。

つまり、アセンブリ言語では、

機械語より読みやすくなったものの、コンピュータ固有の仕組みを強く意識しなければならない

という問題が残っていました。

さらに、プログラムの規模が大きくなると、命令を細かく一つずつ記述すること自体が大変になります。

そこで次に求められたのが、

もっと人間の考え方に近い形でプログラムを書ける言語

でした。

高級言語の登場でプログラムはさらに人間に近づいた

1950年代には、機械語やアセンブリ言語よりも人間が理解しやすい形でプログラムを記述できる高級言語が発展していきます。

高級言語では、CPUの命令を一つひとつ意識するよりも、

「どのような計算をしたいのか」

「どのような情報を表示したいのか」

「どのような業務処理をしたいのか」

といった、人間が考えている処理内容に近い形でプログラムを書けるようになります。

代表的な言語として、FortranやCOBOLがあります。

高級言語の主な特徴

項目内容
読みやすさ機械語やアセンブリ言語より人間が理解しやすい
書きやすさCPUの命令を細かく並べる必要が少なくなる
開発効率より少ない記述で複雑な処理を表現しやすい
修正プログラムの意図が読みやすく保守しやすい
用途科学技術計算、業務処理など幅広い分野へ広がった
コンピュータとの差コンパイラなどが機械語への変換を担当する

高級言語の登場によって、人間はコンピュータ内部の細かな命令をすべて意識しなくてもプログラムを作りやすくなりました。

これはプログラミングの歴史における大きな変化です。

高級言語の高級とはどういう意味なのか

高級言語という言葉を見ると、

「高級な言語だから性能が高い」

「高級言語のほうが優れている」

という意味に感じるかもしれません。

しかし、ここでいう高級は、そのような意味ではありません。

高級言語は、一般的に人間の考え方に近い、抽象度の高い形で書ける言語という意味で使われます。

高級言語と低いレベルの言語のイメージ

分類コンピュータとの距離人間から見た特徴
機械語非常に近い読み書きが難しい
アセンブリ言語近いCPUの命令を意識しやすい
高級言語より人間側処理の意味を表現しやすい

高級言語では、機械語の一つひとつの命令を意識するのではなく、より大きな単位で処理を記述できます。

そのため、プログラムの目的そのものに集中しやすくなります。

Fortranは科学技術計算で発展した高級言語

高級言語の代表例の一つがFortranです。

Fortranは特に科学技術計算や数値計算などの分野を意識して発展してきた言語です。

大量の計算を行うプログラムでは、機械語やアセンブリ言語ですべての処理を書いていては開発に非常に大きな労力が必要になります。

そこで、数式や計算処理をより分かりやすい形で記述できる言語が重要になりました。

ここでは、文字列を表示する簡単なFortranプログラムを見てみましょう。

Fortranで学習メッセージを表示するプログラム
program study_message
    print *, "Programming language history"
end program study_message

実行結果の例

 Programming language history

環境によって、文字列の前後に空白が表示される場合があります。

program study_message

最初の、

program study_message

では、プログラムの開始を表しています。

study_messageは、このプログラムにつけた名前です。

C言語とは書き方が異なりますが、

「ここから一つのプログラムが始まる」

という役割を持っていると考えると理解しやすいでしょう。

printによる画面表示

print *, "Programming language history"

では、文字列を画面へ表示しています。

printは、表示を行う命令として使われています。

C言語で文字を表示するときにはprintfを利用しますが、Fortranでは異なる書き方をします。

言語が変わると文法は変わります。

しかし、

コンピュータに文字を表示させる

という目的は同じです。

この点は、プログラミング言語の役割を理解するときにとても大切です。

end program study_message

最後の、

end program study_message

は、プログラムの終わりを表しています。

最初のprogram study_messageと対応していて、どこからどこまでが一つのプログラムなのかを分かりやすくしています。

短いプログラムですが、機械語の0と1だけの世界と比べると、

print

や、

program

のように、人間が意味を想像しやすい単語が使われていることが分かります。

これが高級言語の大きな特徴です。

COBOLは業務処理を意識して発展した高級言語

もう一つの代表的な高級言語がCOBOLです。

COBOLは、事務処理や業務処理などで利用することを意識して設計された言語です。

Fortranが科学技術計算を得意として発展したのに対し、COBOLでは企業や組織で行われるデータ処理などが重要な用途となりました。

COBOLのコードを見ると、Fortranとはかなり見た目が違います。

COBOLで利用者向けメッセージを表示するプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. WELCOME.

PROCEDURE DIVISION.
    DISPLAY "WELCOME TO PROGRAMMING".
    STOP RUN.

実行結果の例

WELCOME TO PROGRAMMING

COBOLを初めて見ると、C言語やFortranよりも文章のように見えるかもしれません。

これも、言語が目的に合わせて設計されていることを示す例です。

IDENTIFICATION DIVISION.

IDENTIFICATION DIVISION.

は、プログラムを識別するための情報を書く部分の開始を表しています。

COBOLでは、このようにDIVISIONと呼ばれる大きな単位によってプログラムの構成を分けます。

C言語とはかなり異なる構造です。

PROGRAM-ID. WELCOME.

PROGRAM-ID. WELCOME.

では、プログラムの名前をWELCOMEとして指定しています。

Fortranでは、

program study_message

という形で名前を指定しました。

COBOLではPROGRAM-IDを利用します。

同じようにプログラムへ名前を付ける場合でも、言語によって書き方が異なることが分かります。

PROCEDURE DIVISION.

PROCEDURE DIVISION.

から、実際に行う処理を記述します。

ここでは、

DISPLAY "WELCOME TO PROGRAMMING".

によって文字列を画面に表示しています。

DISPLAYという英単語を見ると、

「何かを表示する処理だろう」

と比較的想像しやすいでしょう。

機械語の0と1と比べると、処理内容を人間が追いやすくなっていることが分かります。

STOP RUN.

STOP RUN.

は、プログラムを終了するための記述です。

これも英語に近い形で書かれているため、

「実行を終了する」

という意味をイメージしやすくなっています。

図2:FortranとCOBOLに見る高級言語の発展

この図から分かること

高級言語が登場したことで、プログラムは単に読みやすくなっただけではありません。

用途に合わせた言語が作られるようになったことも重要です。

Fortranは科学技術計算などの分野を意識して発展し、COBOLは事務処理や業務データの処理などを意識して発展しました。

つまり、

一つのプログラミング言語ですべてを解決するのではなく、目的に合わせて言語そのものが多様化していった

ということです。

これは現在にもつながっています。

さまざまなプログラミング言語が存在するのは、言語ごとに特徴や得意分野があるためです。

FortranとCOBOLの違いを見てみよう

先ほどの2つのプログラムを比較すると、同じように画面へ文字を表示する処理でも、見た目が大きく違います。

Fortran

program study_message
    print *, "Programming language history"
end program study_message

COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. WELCOME.

PROCEDURE DIVISION.
    DISPLAY "WELCOME TO PROGRAMMING".
    STOP RUN.

Fortranは比較的コンパクトです。

一方、COBOLはPROGRAM-IDやPROCEDURE DIVISIONなど、プログラムの構造を文章的に表現しています。

この違いは、単に開発者の好みで決まったものではありません。

それぞれが想定する用途や、どのようにプログラムを記述しやすくするかという設計思想が異なるからです。

FortranとCOBOLの比較

項目FortranCOBOL
主な用途として発展した分野科学技術計算、数値計算事務処理、業務処理
コードの印象比較的コンパクト文章的で構造が分かりやすい
代表的な表示printDISPLAY
プログラム構造programなどで構成DIVISIONによる構成
特徴計算処理を記述しやすい業務手順やデータ処理を表現しやすい

ここから分かるのは、

プログラミング言語は目的に合わせて設計される

ということです。

この考え方はC言語にも当てはまります。

高級言語も最終的にはコンピュータ向けの命令へ変換される

高級言語は人間にとって読みやすい言語です。

しかし、ここで一つ疑問が出てきます。

人間が、

print

や、

DISPLAY

と書いたとしても、CPUがその英単語を直接理解できるわけではありません。

高級言語で書かれたプログラムも、最終的にはコンピュータで実行できる形へ変換する必要があります。

そこで利用される仕組みの一つがコンパイラです。

大まかな流れは次のようになります。

人間が高級言語でプログラムを書く
             ↓
     コンパイラなどが変換
             ↓
コンピュータが実行できる命令になる
             ↓
          CPUが実行

この考え方は、これからC言語を学ぶときにも重要です。

C言語で作成したソースコードも、基本的にはコンパイルという処理を行い、コンピュータで実行できる形へ変換してから実行します。

機械語から高級言語までの違いを整理する

ここまでの流れを比較すると、プログラミング言語がどの方向へ進化してきたのかが見えやすくなります。

項目機械語アセンブリ言語高級言語
人間から見た読みやすさ非常に低いやや高い高い
コンピュータとの距離非常に近い近い比較的遠い
主な表現CPUが実行する命令MOV、ADDなど人間が意味を理解しやすい記述
CPUを意識する度合い非常に高い高い比較的低い
プログラム作成の負担非常に大きい機械語より軽減大きく軽減
変換CPUが実行する命令そのものアセンブラを利用コンパイラなどを利用

歴史の流れを非常に簡単に表すと、

機械語
  ↓
人間には読みづらい
  ↓
アセンブリ言語
  ↓
まだCPUへの依存が大きい
  ↓
高級言語
  ↓
より人間が処理内容を表現しやすくなる

となります。

この流れには、一貫した考え方があります。

それは、

人間がより効率よく、安全に、分かりやすくプログラムを作れるようにする

という方向です。

プログラミング言語が進化すると抽象度が高くなる

プログラミング言語の歴史を理解するときには、抽象度という考え方も知っておくと便利です。

抽象度が低い言語では、コンピュータ内部の細かな仕組みを意識してプログラムを書く必要があります。

一方、抽象度が高くなると、細かな仕組みをある程度言語や処理系に任せ、人間は「何をしたいか」に集中しやすくなります。

たとえば、機械語ではCPUの命令そのものを意識します。

アセンブリ言語でも、レジスタやCPU固有の命令などを意識する場面が多くあります。

それに対して高級言語では、

文字を表示する
計算する
条件によって処理を変える
処理を繰り返す

といった、より人間の考え方に近い単位でプログラムを書けるようになります。

抽象度とコンピュータとの距離

言語抽象度コンピュータとの距離人間の読みやすさ
機械語低い非常に近い非常に低い
アセンブリ言語低め近い機械語より高い
高級言語高いより人間側高い

高級言語の高級とは、この抽象度が高いことを表していると考えると理解しやすくなります。

プログラミング言語は使いにくさを改善しながら進化してきた

ここまでの歴史を見ると、それぞれの言語が突然登場したわけではないことが分かります。

前の方法に存在した問題を改善する形で、次の仕組みが必要になりました。

機械語での問題

機械語では、

01010110
11001010
00110001

のような命令を扱います。

CPUには適していますが、人間には読みづらく、修正もしにくいという問題がありました。

そこで、

命令に分かりやすい名前を付けよう

という方向へ進みます。

アセンブリ言語での改善

アセンブリ言語では、

MOV
ADD
SUB

のようなニーモニックを使えるようになります。

これによって命令の意味は分かりやすくなりました。

しかし、CPUに近い命令を扱うという性質は残っています。

そこで、

CPUの細かな違いをなるべく意識せず、もっと大きな単位で処理を書こう

という方向へ進んでいきます。

高級言語での改善

高級言語では、人間が意味を理解しやすい形で処理を記述します。

その結果、プログラムの作成や修正がしやすくなり、大きなプログラムも開発しやすくなっていきました。

つまり、プログラミング言語の進化は、

コンピュータ中心の記述から、人間中心の記述へ近づいていく歴史

と見ることもできます。

図3:機械語・アセンブリ言語・高級言語からC言語へ

この図から分かること

プログラミング言語は、

機械語 → アセンブリ言語 → 高級言語

という流れの中で、人間がより扱いやすい方向へ発展してきました。

機械語はコンピュータに非常に近い反面、人間には扱いにくい形式です。

アセンブリ言語では、MOVやADDなどのニーモニックを利用することで、人間が命令の意味を理解しやすくなりました。

さらに高級言語では、CPUの細かな命令から離れ、より人間の考え方に近い形でプログラムを書けるようになりました。

その高級言語の流れの中にC言語があります。

C言語は高級言語に分類されますが、コンピュータ内部の動きを比較的意識しやすいという特徴があります。

この特徴が、C言語を学ぶ大きな意味の一つです。

C言語はこの歴史の中でどこに位置するのか

ここまで機械語、アセンブリ言語、高級言語の流れを見てきました。

では、これから学習するC言語はどこに位置するのでしょうか。

C言語は高級言語の一つです。

つまり、機械語の0と1を直接記述するのではなく、人間が比較的理解しやすい単語や記号を利用してプログラムを書きます。

たとえばC言語では、

#include <stdio.h>

int main(void)
{
    printf("Hello\n");

    return 0;
}

のような形式で記述できます。

機械語と比較すれば、何をしているのかかなり分かりやすくなっています。

printfという記述を見れば、画面への表示に関係していることも学習によって判断できるようになります。

しかし、C言語にはほかの高級言語と比べても、コンピュータの仕組みに近い部分を意識しやすい特徴があります。

C言語は高級言語とコンピュータの世界をつなぎやすい

C言語の特徴を理解するときには、

人間が扱いやすい高級言語でありながら、コンピュータ内部の仕組みも意識しやすい

という点が重要です。

C言語を学習していくと、処理の順番だけではなく、メモリやアドレスなど、コンピュータ内部の動きと関係する考え方も登場します。

そのためC言語では、

人間が考える処理
    ↓
C言語で記述
    ↓
コンパイル
    ↓
コンピュータが実行できる形
    ↓
CPUが実行

という流れを意識しながら学習できます。

C言語を単に文章を書くための記法として覚えるのではなく、

自分が書いたコードがコンピュータ内部でどのように処理されるのか

という視点を持つことができます。

C言語の位置づけ

観点C言語の特徴
言語の分類高級言語
人間から見た特徴機械語やアセンブリ言語より読み書きしやすい
コンピュータとの関係コンピュータの仕組みを比較的意識しやすい
学習面CPU、メモリ、処理の流れなどへの理解につながる
実用面OS、組み込みシステム、ライブラリなどの分野と関係が深い
他言語への応用C系の文法を持つ言語を理解するときの土台になりやすい

C言語は古いから学ぶのではない

C言語の歴史を知ると、

「かなり前から存在する言語なら、今から学ぶ必要はないのではないか」

と感じることがあるかもしれません。

しかし、プログラミング言語は新しければ必ず優れていて、古ければ必要ないというものではありません。

言語には、それぞれ得意な分野や目的があります。

C言語には、コンピュータの仕組みに比較的近い位置でプログラムを書けるという特徴があります。

そのため、OS、組み込みシステム、さまざまなソフトウェアの基盤部分など、コンピュータを支える技術を考えるうえで重要な存在です。

また、C言語を学習すると、

  • プログラムはどのような順番で実行されるのか
  • データはどのように扱われるのか
  • CPUとプログラムはどのようにつながっているのか
  • 高級言語のコードはどのように実行可能な形へ変換されるのか

といった考え方への理解も深めやすくなります。

そのため、

C言語が昔から存在するから学ぶ

のではなく、

コンピュータとプログラムの関係を基礎から理解しやすいから学ぶ

という見方をするとよいでしょう。

C言語の文法を学ぶ前に歴史を知っておくメリット

これからC言語を学習すると、最初は見慣れない記述がたくさん登場します。

たとえば、

#include <stdio.h>

や、

int main(void)

などです。

さらに学習が進むと、変数、条件分岐、繰り返し、関数なども使うようになります。

そのとき、単に形だけを暗記するのではなく、

「人間が書いたこのコードは最終的にコンピュータ向けの命令へ変換される」

ということを知っていると、C言語をより仕組みとして理解しやすくなります。

たとえばコンパイルを行う理由も、

「C言語で書いたコードをCPUがそのまま理解できないから」

という歴史的な流れから考えることができます。

言語が変わってもプログラムの目的は変わらない

ここまで、機械語、アセンブリ言語、Fortran、COBOL、C言語という異なる言語を見てきました。

それぞれ見た目は大きく違います。

  • 機械語では0と1が並びます。
  • アセンブリ言語ではMOVやADDなどを利用します。
  • Fortranではprintを使った記述があります。
  • COBOLではDISPLAYを利用します。
  • C言語ではprintfを利用できます。

しかし、それらの違いは、コンピュータに何をさせるかという目的そのものが違うという意味ではありません。

たとえば、

画面に文字を表示する

という目的は、さまざまなプログラミング言語で実現できます。

違うのは、

その命令をどのようなルールで人間が記述するのか

という部分です。

この視点を持っておくと、将来ほかのプログラミング言語を学ぶときにも役立ちます。

言語ごとの文法を別々の知識として覚えるのではなく、

「この言語では、同じ処理をこのように表現するのか」

と比較して理解できるからです。

プログラミング言語の進化をC言語学習につなげよう

プログラミング言語の歴史は、0と1から始まり、人間が理解しやすい表現へと発展してきました。

機械語では、CPUが直接実行する命令を非常にコンピュータに近い形で扱います。

そこから、MOVやADDなどのニーモニックによって命令を表現するアセンブリ言語が使われるようになりました。

さらに、より人間が理解しやすく、目的に合わせたプログラムを書きやすくするため、FortranやCOBOLなどの高級言語が発展しました。

C言語も、その高級言語の流れの中にあります。

ただしC言語には、単に人間が書きやすいだけでなく、コンピュータ内部の仕組みも意識しながらプログラムを作りやすいという特徴があります。

これからC言語の文法を学習するときには、

人間が処理を考える
        ↓
プログラミング言語で記述する
        ↓
コンピュータが実行できる形へ変換する
        ↓
CPUが命令を実行する

という流れを頭の片隅に置いておくとよいでしょう。

そうすると、C言語のコードを単なる文字や記号として見るのではなく、

人間の考えをコンピュータへ届けるための表現

として理解できるようになります。

そして、機械語からアセンブリ言語、高級言語へと発展してきた歴史を知っていることで、C言語がコンピュータと人間の間をつなぐ重要な位置にあることも、よりイメージしやすくなります。