長男が熱心だった Scratch プログラムだけど、この冬休み期間に、長女・次女も再チャレンジし始めた。
以前は難しくてやめてしまったのだけど、今の年齢なら楽しめるようだ。
で、長女(小4)から質問が出た。
Scratch は Flash という言語で作られていて、その Flash はC言語という別のプログラム言語で作られている。
…ここまでは、プログラム言語の多様性を知ってほしくて以前に教えている。
#厳密に言えば、Scratch ver.2 が Flash の ActionScript 言語で作られていて、ActionScript は C言語の拡張である、C++ 言語で作られている。
ここからが長女の質問。
「では、このパソコンで動く一番最初のプログラムはどうやって作られたの?」
あぁ、なるほど。そこに疑問を持ったか。
同じようなことに興味を持っている人もいるかもしれないので、長女に答えたことを記して置こうと思う。
まず、目の前の疑問の答えは、クロスコンパイルだ。
すでに動いているコンピューターの上で、別のコンピューターのプログラムを開発する。
僕はテレビゲームの開発をやっていたけど、テレビゲーム機の上では、普通は「プログラム」を作れない。
長女も Nintendo Switch で遊んでいるけど、そこでプログラムは作れない。
プログラムを楽しみたいときは、パソコンで Scratch をやっている。
Switch でゲームを作っている人も、Switch を使って作っているわけではない。
パソコンの上でプログラムを作って、それを特殊機材で Switch に送って動かしているんだ。
新しいパソコンが作られる時も、同じように別のパソコンでプログラムを作ることになる。
今広く使われているパソコン…IBM PC 互換機、と呼ばれるものが出てきたときも、基本プログラムはすでにあったコンピューターで作られた。
#それ以前の 8bit マシン…CP/M マシン上で開発されていたようだ。
長女はこの答えには納得できないようだった。
「このパソコンの」と言ったのは言葉のアヤで、真意は「最初のプログラム」にあったのだ。
そのプログラムはそれ以前のプログラムで作られたという。
じゃぁ、「それ以前」はどうやって作ったのか。もっともな疑問だ。
そのため、ここで話を切り替える。
コンピューターの中では、すべてを数値として扱っている。
計算をするときには、例えば「1番は足し算、2番は引き算」というように、命令も数値になる。
1 2 3
という3つの数値があったとしよう。
ここで、1 は足し算の命令で、2 3 が足すべきデータになる。結果は 5 だ。
一番最初のコンピューターでは、人間が直接この「数値」の列を作り出した。
もっとも、プログラムを作るときに 1 2 3 と直接書いていると、頭がこんがらがってしまう。
1 は足し算(英語で ADD)なのだから
ADD 2 3
のように紙に書いておき、プログラムが全部出来上がったら、命令を手作業で数値に直していけばよい。
そして、この数値を入力するには、ON / OFF できるスイッチを使う。
コンピューターの中では、数値は全部、電気信号の ON / OFF に置き換えて覚えられている。
ON なら 1 、OFF なら 0 として、寄せ集めるともっと大きな数値も表せるようになる。
#いわゆる2進数だけど、この話では詳しく知る必要はない。
ちなみに、長女は以前教えて2進数を知っているので、この部分に疑問は持たなかった。
スイッチをぱちぱちやって数値を作り、「書き込み」スイッチを押すと、メモリに書き込まれる。
どんどん連続してメモリに書き込まれていく回路を作ると、これでプログラムを準備できる。
そして、CPU に対して「実行」を指示すれば、「最初のプログラム」が無事動き出す。
最初はこんな風にしてプログラムが作られた。
じゃぁ、最初にどんなプログラムを作ったか。
スイッチをぱちぱちやるのは、プログラム方法としてはかなり面倒くさい。
だから、最初に作るのは「タイプライターのキーを押すと、それが文字だと識別されるプログラム」だ。
これがあれば、もう「ぱちぱち」とはおさらば。タイプライターで効率よくプログラムが作れる。
次に作るのは、ADD なら 1 、SUB なら 2 …という、命令から数値への変換を、自動的にやってくれるプログラムだ。
先ほど「人間が手作業で命令を数値に直す」としていたけど、自動的にやってくれるプログラムがあれば効率が上がる。
#一般には、数値化する作業を「アセンブル」(組み立て、の意味)と呼び、これを自動的に行うプログラムは「アセンブラ」と呼ばれる。
もし、この時点で新しいコンピューターが設計されたとしよう。
新しコンピューターでは、命令の数値なども変わるのが普通だ。
今まで使っていたコンピューターでは、ADD は 1 だったけど、新しいコンピューターでは 10 かもしれない。
そうしたら、アセンブラのプログラムを修正する。
ADD は 1、だったところを ADD は 10 、にするだけでいい。
これで、新しいコンピューター用のプログラムを作り出すことができる。
最初に書いた「クロスコンパイル」というのは、ただこれだけの話だ。
ここで話はひと段落。
スマホで情報を検索して、Altair 8800 の画像を長女に見せてみた。
Altair 8800 は、最初のコンピューターではないが、最初のパソコンとされる。
前面パネルには、ON / OFF のスイッチがたくさんついていて、結果出力のためのランプもある。
入力も、出力も、ON / OFF しかないんだ。
でも、タイプライター(厳密にはテレタイプ)を接続して使うのが普通だった。
電源を入れたら、RAM の中には何もない。
だから、まずはタイプライターからの入力を読み取るためのプログラムを、 ON / OFF スイッチで入れる必要があった。
このパソコンを使っている人は、それが毎日の作業なので、短いプログラムを暗記していた。
タイプライターの入力が読めるようになったら、タイプライターについている紙テープ読み取り機から、紙テープを読み込ませる。
テレタイプでは、入力内容を紙テープ化できた。そうすることで、同じ原稿を何度でも打ち出すことができる。
でも、ここでは紙テープに記録されているのは「文字」ではなく、プログラムそのものだ。
たとえば、テレタイプを入出力として、BASIC 言語を解釈するプログラム。
このプログラムが動き始めれば、タイプライターを使ってプログラムを作れるようになる。
時には、さらに「BASIC で作られたプログラム」を紙テープから読み込み、何らかの実作業に使ったかもしれない。
ここでは、タイプライターだから出力が紙なのだけど、キーボードで文字を入力して、人間にわかる文字で結果を返す、という、誰にでもわかりやすいプログラム環境が出来上がったことになる。
このときは、手っ取り早く Altair 8800 の画像を見せた。
でも、それ以前からコンピューターは存在する。
それらも、構造的にはほぼ同じだった。
うちのページでいえば、TX-0あたりを見ていただきたい。
Altair 8800 よりずっと古い機械だけど、トグルスイッチを使って2進数を入力するあたりも、ほぼ同じ構造だ。
もっとも、TX-0 は紙テープを読み込んでメモリにデータを配置する機能を、ハードウェアで持っていた。
そのため、毎回紙テープを読み込むプログラムを入れる必要はない。
さらに古く、電子計算機の元祖に近い EDSAC では、完成後の改造で「イニシャルオーダー」が備えつけられた。
抵抗とワイヤーで ON / OFF を表現することで、紙テープを読み込むプログラムを固定化したものだ。
必要に応じて取り外せるようになっていて、取り外すとその部分は普通のメモリとして扱われる。
ROM に準備され、コンピューターが起動するときに最初に読み込むプログラム…今でいえば、BIOS や UEFI に相当するものだった。
ともかく「手作業で」最初の小さなプログラムを作り上げ、そこからプログラム環境が整えられていく。
あとは、Scratch の話と一緒だ。
Scratch は Flash で作られ、Flash は C で作られていた。
Altair 8800 では、Scratch に相当するものが BASIC だった。
BASIC はアセンブラで作られ、そのアセンブラは、ON / OFF スイッチを駆使して入力されるものだった。
BASIC から C までの間は長女には説明しなかったけど、想像は付いたようだ。
より便利な環境を作るために、誰かが「その時使える」環境で、新しいプログラムを書いてきた。
その積み重ねの果てに、子供でも使える良く練り込まれた環境、Scratch が存在している。
Scratch も、そろそろ Javascript で書かれた Ver.3 に移行する予定だ。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |