ここまでの記事で、HTML・CSS・JavaScriptを書いてきました。書いた文字がそのまま画面になり、動きになりました。

しかし、よく考えると不思議な話です。コンピュータは日本語を理解しません。英語も理解しません。では、私たちが打った document.getElementById という文字列は、どうやって相手に伝わっているのでしょうか。

この記事では、コンピュータへの命令の伝わり方そのものを扱います。

1. コンピュータが分かるのは0と1だけ

コンピュータの中身は、突き詰めると膨大な数のスイッチです。電気が流れているか、いないか。それを1と0で表します。

つまり、コンピュータが本当に理解できる命令は、次のようなものです。

10110000 01100001

これを機械語と呼びます。「メモリのこの場所の値を、あの場所に移せ」といった、ごく単純な指示の羅列です。人間にとってはまず読めませんし、これで1つのアプリを書こうとすれば一生では終わりません。

2. だから、あいだに通訳を立てる

そこで、人間が読み書きできる言葉で命令を書いておき、それを機械語に翻訳する、という方法が生まれました。この「人間が書くための言葉」がプログラミング言語です。

人間        「1から10まで足して」
 ↓ プログラミング言語で書く
ソースコード  for (let i = 1; i <= 10; i++) { sum += i; }
 ↓ 翻訳
機械語       10110000 01100001 ...
 ↓
コンピュータ が実行する

私たちが「プログラムを書く」と言っているのは、この真ん中の段を書く作業のことです。翻訳から下は、道具が引き受けてくれます。

3. 機械寄りの言葉と、人間寄りの言葉

プログラミング言語には、機械に近いものと人間に近いものがあります。

機械寄り(低級言語) 人間寄り(高級言語)
例 アセンブリ、C JavaScript、Python、Ruby
書きやすさ 書くことが多く、手間がかかる 短く書ける
速さ 速い 比較的遅い(ただし普通は困らない)
気を配ること メモリの管理まで自分でやる 細かい面倒は言語が見てくれる

「低級」は劣っているという意味ではなく、機械に近い層を扱う、という意味です。OSやゲームエンジンのように速度が命のものは、今でも機械寄りの言語で書かれています。

Web開発で最初に触るJavaScriptやPythonは、いちばん人間寄りの側にあります。だから初心者でも書けます。

4. 翻訳のタイミングは2種類ある

翻訳のやり方には、大きく2つの流儀があります。

コンパイラ方式 ― 先にまとめて全部翻訳し、出来上がったものを配ります。

書いたコード → [まとめて翻訳] → 実行できる形 → 配る

実行が速く、翻訳の時点で間違いが見つかります。C、Go、Rustなどがこの方式です。

インタプリタ方式 ― 実行するその場で、1行ずつ翻訳しながら動かします。

書いたコード → [動かしながら順に翻訳・実行]

書いてすぐ試せるのが利点です。JavaScriptやPythonがこちらです。ブラウザーがJavaScriptをその場で読んで動かせるのは、この方式のおかげです。

SassをCSSに、TypeScriptをJavaScriptに変換する話が後の記事に出てきますが、あれも同じ「先に翻訳してから配る」という考え方の仲間です。

5. どの言語でも、部品はだいたい同じ

言語の種類はたくさんありますが、命令の部品はどれもほとんど同じです。だいたい次の5つを組み合わせているだけです。

1. 上から順に実行する

console.log("おはよう");
console.log("いってきます");

2. 値に名前を付けて覚えておく(変数)

const name = "たろう";
console.log(name);

3. 条件で分ける(条件分岐)

if (age >= 20) {
  console.log("おとな");
} else {
  console.log("こども");
}

4. 繰り返す(ループ)

for (let i = 0; i < 3; i++) {
  console.log("こんにちは");
}

5. まとまった処理に名前を付ける(関数)

function greet(name) {
  return `こんにちは、${name}さん`;
}

どんなに複雑なアプリも、拡大していけばこの5つの組み合わせです。そして1つの言語でこれを覚えると、他の言語には「書き方の違い」として入っていけます。2つ目以降の言語の習得が速いのはこのためです。

6. なぜ言語がこんなにあるのか

得意分野が違うからです。

言語 よく使われる場所
JavaScript Webページの動き、サーバー
Python データ分析、機械学習、自動化
Java / C# 業務システム、大規模なアプリ
Swift / Kotlin iPhone / Androidのアプリ
C / C++ / Rust OS、ゲームエンジン、速度が命の処理

「どれを勉強すべきか」という問いには、「作りたいものが決まれば自動的に決まる」というのが正直な答えです。Webページを作りたいなら、JavaScriptが最短です。

7. コンピュータは融通が利かない

最後に、人間相手との決定的な違いに触れておきます。

人間なら、「あれ取って」で通じます。少し言い間違えても、意図をくんでくれます。コンピュータはくみません。

console.log("hello");   // 動く
console.1og("hello");   // エラー。l が 1 になっている

セミコロンひとつ、大文字と小文字の違いひとつで、命令は伝わりません。これは意地悪をしているのではなく、曖昧さを残さないという設計になっているからです。曖昧さがないからこそ、同じコードは誰のパソコンでも同じ結果になります。

エラーメッセージは、その融通の利かなさの現れです。怒られているのではなく、「ここが分かりませんでした」と場所を教えてくれていると考えてください。プログラミングに慣れるとは、この几帳面な相手との会話に慣れる、ということでもあります。

まとめ

  • コンピュータが分かるのは0と1の機械語だけ。
  • 人間が読み書きできる言葉で書き、翻訳して渡すための道具がプログラミング言語。
  • 翻訳には、先にまとめて訳すコンパイラ方式と、その場で訳すインタプリタ方式がある。
  • どの言語も、順次・変数・条件分岐・繰り返し・関数の組み合わせでできている。
  • 相手は融通が利かない。エラーは怒りではなく、分からなかった場所の報告。