Twitter で、こんな話題を見かけた。
そういえば「最初に"?"をPRINTの省略形として実装した」のってどのへんだろうか… https://t.co/L51W2m9Tr1
— 後藤 浩昭 / GORRY (@gorry5) April 23, 2015
元は、Nintendo 3DS の「プチコン」というプログラム言語で、PRINT の代わりに ? が使える、という話題から。
これ、1980年代の BASIC ユーザーなら半ば常識でした。
BASIC を知らない人のために書いておけば、PRINT は「画面に数値や文字を表示する」という命令。
もっとも基本的な命令で、一番最初に覚えるものでしょう。
この PRINT 命令は、 ? と略記することができました。
BASIC は、? を 内部的な中間コードでは PRINT と同じものとして記憶します。
プログラムリストを見ると、中間コードを人間向けの命令に直して表示するため、? と入れたのに、PRINT に変換されて表示されます。
他にも、LOCATE を LOC. で表現出来たりした BASIC もあります。
でも、大抵は先頭何文字かと . の組み合わせで認識する。? で PRINT になる、というのはかなりの特別扱い。
一体、最初にやったのはどのマシンか…という話。
この後みんなで話をしていて、PC-8001 にはある、MZ-80にもすでにある、等と判っている。
Apple II は Woz の BASIC にはなく、Microsoft BASIC だとあったそうです。
マイクロソフトの方言かな?
MZ は MS 系ではない独自 BASIC でしたが、十分に BASIC が普及した後に作られたために、便利な機能は真似していたのかもしれません。
ビル・ゲイツは、Altair 8800 用に BASIC を作って売り込んでいます。
この時にはまだ、「マイクロソフト」はありませんでした。
(マイクロソフトは、この BASIC を他のパソコン会社向けに売り込むために作った会社)
そのAltair 8800 BASIC のリファレンスマニュアル(1975)があります。
重要なのは、41~42ページにある「SPECIAL CHARACTERS」という章。
この最後に、 ? があり、このように説明されています。
Question marks are equivalant to PRINT.
For instance, ? 2+2 is equivalant to PRINT 2+2.
Question marks can also be used in indirect statements.
10 ? X, when listed will be typed as 10 PRINT X.
意訳:
? は PRINT と一緒だから、? 2+2 ってかいたら PRINT 2+2 になるよ。
プログラム中でも、 10 ? X って書いたら 10 PRINT X になるよ。
すでに、非常に洗練された形で実装されています。
Altair BASIC を作るのに際して急に思いついて入れた、という感じではなく、設計当初から盛り込んであったような感じ。
ビルゲイツは、DEC の PDP-10 でコンピューターを学んでいます。
この PDP-10 には DEC が作った BASIC がありました。
この PDP-10 BASIC マニュアルを読んでみます。
… PRINT を ? で代用する、という方法は用意されていません。
Question mark に関しては「INPUT 命令を実行すると、設定した表示文の後ろに ? が表示されて入力待ちとなる」という説明程度です。
もっとさかのぼって、BASIC の元祖である Dartmouth BASIC を調べます。
BASIC はダートマス大学で学生にプログラムを教えるために作られた言語でした。
最初はパンチカードを使ったコンパイラ言語でしたが、テレタイプ端末の普及にあわせて「入力したプログラムがすぐに動き、命令ごとの直接実行も可能な、対話型の言語」になっていきます。
つまりは、良く知られている BASIC の原型はここで作られています。
ここにも、PRINT を ? で代用する、という方法は記述されていません。
もっとも、見つけられたマニュアルは、第2版と第4版のものだけです。
最初の BASIC だけあって、版を重ねるごとにどんどん機能が改良されていますから、Altair BASIC よりも前の第6版(1971)までに ? が実装されていた可能性が否定されるものではありません。
Altair BASIC が作られるより前の…1975年ごろまでの BASIC を手当たり次第に調べてみました。
でも、成果なし。手当たり次第なので見落としも多いと思いますが。
たとえば、PDP-11 には複数の BASIC があったことがわかりました。
PDP-10 の BASIC と互換のものと、グラフィックが描けるものと、文法を拡充したものと、オンラインで複数ユーザーが使えるものと…
すべて DEC 製。需要に応じて少しづつ方向性が違うものが必要だったのでしょう。
PDP-11 だけでこうなのですから、もっと多数の BASIC があったはずです。
実は、ビル・ゲイツ自身も、中学の時に PDP-10 用の BASIC を自作してみていたようです。
80年代の子供なら、テレビゲームを見て「自分でも真似してみる」ところなんでしょうけど、当時としては BASIC 自体が「真似してみたくなる」対象。
その経験があるから、作ってもいない Altair 8800 用の BASIC を「動いている」なんて電話で言ってしまってから、商売になりそうだとわかって移植開始している。
内部構造はわかっているから、時間さえあれば作れる自信があったのですね。
さて、そんな状態ですから、どこかに ? が PRINT になる BASIC があったかもしれません。
PRINT は基本命令だから良く使ったし、計算式を入れれば答えを教えてくれる、という意味で、? を使うのは非常に適切。
もちろん、その機能を持つ BASIC を作ったのが、中学生のゲイツだった可能性だってあります。
もう一つ、便利機能として用意されていたとしても、マニュアルに載っていない、という可能性だってあります。
PRINT と ? が同じだけど、? って入れてプログラム作ると全部 PRINT に置き換わる、って説明すると混乱するだけ。
気付いた人だけが使える機能、とかで入れてあってもおかしくない。
ここは、マニュアルを調べて調査しているだけではわからない。
ここら辺は憶測の域を出ません。
個人が趣味で「真似してみた」程度のプログラムは、ほとんど失われてしまったでしょうから。
今のところは、Altair 8800 BASIC で、いきなり洗練された形で登場したのが最初、というのが調査結果です。
余談:
PDP-11 の BASIC の中に BASIC-PLUS というのがありました。
この中に「statement modifier」という機能がありました。
print などの命令(statement)を先に書いて、後にその命令を実行するかどうか、「条件」を示す記述方法。
X=A IF X<A
とか書けるのですね。
…perl じゃん。
perl の文法見た時に、後ろに条件が書ける、というのがスマートでかっこいいと思ったのですが、PDP-11 の BASIC から取り入れた機能だったのかもしれません。
ちなみに、こんなこともできます。
X(I)=0 FOR I=0 TO 10
これで、配列変数 X の 0~10 を 0 で初期化できます。
同じテーマの日記(最近の一覧)
関連ページ
BASIC言語 初稼働日(1964)【日記 15/05/01】
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |