ここまでの記事で、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の機械語だけ。
- 人間が読み書きできる言葉で書き、翻訳して渡すための道具がプログラミング言語。
- 翻訳には、先にまとめて訳すコンパイラ方式と、その場で訳すインタプリタ方式がある。
- どの言語も、順次・変数・条件分岐・繰り返し・関数の組み合わせでできている。
- 相手は融通が利かない。エラーは怒りではなく、分からなかった場所の報告。
- JavaScriptについての詳しい説明:「JavaScriptの書き方」
- 用語の整理:「エンジニアのわけのわからない横文字集」
- 次の記事:「フロントエンドとバックエンドは何が違うのか」