見出し画像

【サブスク・有料記事】コンピューター言語はなぜ乱立しているのか?

セール中

〜7月7日 02:30

こんにちは、榊正宗です。

普段は小説を書いたり、3DCGを作ったり、プログラムを書いたり、最近はAIを使った創作についての発信をしたりしています。ジャンルを行き来しながら仕事をしてきたおかげで、「専門家じゃない人に技術の話をどう伝えるか」をずっと考え続けてきました。この記事は、その集大成のつもりで書いています。

テーマは「プログラミング言語って、なんであんなにたくさんあるの?」という素朴な疑問です。C、Java、Python、JavaScript……名前だけは聞いたことがあるけど、何がどう違うのか、なぜ一つにまとまらないのか。この謎を、半世紀のコンピューターの歴史を一本の物語として読み解くことで解き明かします。ミサイルの迎撃失敗、消えていく株価指数、10日間で作られた言語が世界を制した話など、実際にあった事件をたどりながら進むので、歴史読み物として楽しんでもらえるはずです。

読んでほしいのは、こんな人です。プログラミングを始めてみたけど言語選びで迷子になっている人。エンジニアと一緒に仕事をしているけど、彼らの会話が呪文にしか聞こえない人。AIにコードを書かせる時代だからこそ、そもそもプログラミングとは何なのかを知っておきたい人。そして単純に、面白い歴史の話が好きな人。

プログラミングの知識はまったく要りません。専門用語はぜんぶ出てきたその場で説明します。むしろ知識ゼロの人の方が、先入観なしで物語として楽しめると思います。

それでは、始めましょう。

第1章 あなたのスマホの中の「バベルの塔」

プログラミング言語って、確認されているだけで数千種類あるそうです。実際によく使われているものに絞っても、C、C++、Java、Python、JavaScript、Go、Rust、Swift……と、両手じゃとても数えきれません。

これ、不思議だと思いませんか?

人間の言葉が国ごとに違うのは、歴史の成り行きだから分かります。でもプログラミング言語は、全部「コンピューターに命令を伝える」という同じ目的のために、人間がわざわざ設計して作ったものです。なのに、なぜか一つにまとまらない。それどころか、今も増え続けています。

しかも面白いことに、新旧交代が起きていません。C言語は50年以上前の言語ですが、いまだにOSや家電の中で現役バリバリです。新しい言語が古い言語を駆逐するんじゃなくて、地層みたいに積み重なって、全部が同時に使われている。人間の言葉でいえば、ラテン語と英語と若者言葉が全部現役で話されているような、かなり変な状況なんです。

この記事では、この「言語乱立の謎」を、ある一つの戦いの歴史として読み解いていきます。

その戦いとは、移植性(ポータビリティ)との戦いです。「あるコンピューターで動いたプログラムを、別のコンピューターでも動かしたい」。たったこれだけの願いが、この半世紀、どれだけ人類を苦しめて、どれだけ多くの言語を生んできたか。この一本の線でつなぐと、言語乱立の風景がガラッと変わって見えます。

まずは意外な話から始めましょう。実はコンピューターって、計算が得意じゃないんです。

第2章 コンピューターは計算が苦手である

「コンピューターは計算機なんだから、計算が得意に決まってるでしょ」と思いますよね。これ、半分正解で半分間違いなんです。

コンピューターが本当に得意なのは「0と1の高速な切り替え」だけです。電気が流れてるか、いないか。この二択を1秒間に何十億回も繰り返せる。それがコンピューターの正体です。

つまりコンピューターの中には「2」という数字すら存在しません。私たちが慣れ親しんだ十進数の世界を、ぜんぶ二進数に翻訳して無理やり押し込んでいるわけです。

ここで有名な実験をひとつ。多くのプログラミング言語で「0.1 + 0.2」を計算させると、答えは「0.3」になりません。「0.30000000000000004」という気持ちの悪い数字が返ってきます。

これ、バグじゃないんです。お使いのブラウザで開発者ツールを開いて「0.1 + 0.2」と打ち込めば、誰でも今すぐ再現できる、コンピューターの仕様そのものです。

なぜこうなるかというと、十進数の0.1は、二進数だと「0.000110011001100……」と無限に続く循環小数になってしまうからです。人間の世界で「1÷3 = 0.3333……」が割り切れないのと同じことが、コンピューターの世界では0.1みたいなありふれた数で起きる。十進数の「キリのいい数」と二進数の「キリのいい数」は別物なので、私たちが日常で使う小数のほとんどは、コンピューターにとって割り切れない厄介者なんです。

コンピューターのメモリは有限ですから、無限に続く数はどこかで打ち切るしかありません。打ち切れば、当然そこに小さな誤差が生まれます。

「小数点以下17桁の誤差なんて、どうでもよくない?」と思うかもしれません。ところがこの誤差、積もると人が死にます。1991年の湾岸戦争で、米軍のパトリオットミサイルが飛来するスカッドミサイルの迎撃に失敗して、28名が亡くなる事故がありました。後の調査で分かった原因のひとつが、システム内部の時刻計算に使われていた「0.1秒」の二進数誤差の蓄積です。100時間の連続稼働で誤差が積もって、ミサイルの予測位置が数百メートルもズレていたんです。

小数をどう表現して、どこで丸めるか。この地味な問題が、実はコンピューターの信頼性の根幹に関わる大問題なんです。

でもその話の前に、もっと根本的な話をしておきます。「そもそも、なんでプログラムは毎回コンパイルしないといけないのか」という話です。

第3章 なぜ毎回コンパイルするのか──機械語の壁

CPUが直接理解できる言葉は「機械語」だけです。機械語は0と1の羅列そのもので、人間が読み書きするのはほぼ不可能な代物です。

ここから先は

9,068字
この記事のみ
セール中
¥500
¥ 100

7月6日 02:30 〜 7月7日 02:30

PayPayで支払うと抽選で全額還元チャンス!7/31まで

・10章10万文字超の連載記事が読めます! ・無料公開アプリのサポート記事、マニュアルが読めます! ・過去の1万文字級記事もまとめて読めます! ・AI創作、キャラクター企画、アプリ開発の継続支援になります!

榊正宗のAI創作ラボ

¥500 / 月 初月無料

榊正宗のAI創作ラボは、榊正宗のAI創作、アプリ開発、キャラクター企画、記事連載を継続的に支援していただくための会員マガジンです。 AI…

この記事が気に入ったらチップで応援してみませんか?

ピックアップされています

榊正宗のAI創作ラボ

  • ¥500 / 月
  • 初月無料

購入者のコメント

コメントするには、 ログイン または 会員登録 をお願いします。
【サブスク・有料記事】コンピューター言語はなぜ乱立しているのか?|榊正宗|ずんだもん発案者
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1