• Seduced Programmer(誘惑されたプログラマ)

1980年台には、BASICインタプリタをROMで搭載した「ホームコンピュータ」が多数作られた。ここにBASICが使われたのは、初期にコンパクトなBASICインタプリタ(当時はTiny BASICと呼ばれた)が開発され、ホームコンピュータ以前のワンボードマシンでもキーボードやVRAM(ビデオ出力回路)を備えれば、コンピュータのように利用できたことに端を発する。

BASICはコンパイルやリンクといった作業なしにプログラムを実行できた。しかし、実行速度が遅かった。グラフィックス表示が可能なハードウェアもあったが、ソフトウェアでラインを引けば、ドットの書き換えが見えていた。CPU性能もあるが、インタプリタのプログラムの実行処理が遅かったからだった。

機械語でプログラムを書けば、ゲームを作ることができる程度には速くなった。そこで、当時「機械語ルーチン」と呼ばれる手法が流行った。プログラムのうち、高速化が必要な部分だけを機械語で記述し、これをBASICプログラムと組み合わせる。たとえば、ゲームプログラムの中で説明やハイスコアの表示などには、それほど速度は必要なく、BASICで記述しても問題ない。

しかし、ゲーム内で複数の「キャラ」を動かし、衝突判定を行うのには、高速な処理が必要になる。ここをアセンブラで記述するわけだ。筆者も当時、機械語ルーチンを作ったが、ハンドアセンブルでの機械語ルーチンの開発にはどうしてもサイズ的な限界がある。これは、格納先メモリよりも、プログラマの負担が大きかった。長くなればなるほど書くのもデバッグするのにも時間がかかる。

機械語で長いプログラムを書くのは、粘性の高い液体の中で泳いでいるような、先の見えない感覚を味わう。機械語の1ステップは小さく、BASICで1行になるようなものでも、数10行になることがある。マクロやサブルーチンの作成など、メインルーチンの1行分を実現するために何行も記述しなければならなくなる。アルゴリズム頭に浮かぶ速度に比べて、ゆっくりと時間が進むような感覚がアセンブラにはある。

そういう時代を経たので、インタプリタは遅い、開発するならCコンパイラ、といった概念が頭に染みついていた。しかし、それをひっくり返す出来事があった。2003年頃、筆者は、XMLで記述されたデータから線画を描こうとしていた(写真01)。趣味でIO Digital Penと呼ばれる手書き記録装置のファイルを解析していた。C言語ではXMLを読み込んで必要な情報を取り出すのがかなり面倒だったが、Rubyなどのオブジェクト指向のインタプリタ系言語ではXMLを簡単に扱うことができた。そのRubyからでも高速な描画が可能だったことが、筆者の目を覚まさせた。

  • 写真01: RubyとWxWindowで作成したツール。XMLファイルを読み込み、手書きデータを描画する。左側の領域は、ひとまとまりの手書きデータ(だいたい1行分)を示すもので、これを選択するとグラフィックス表示の色を変えて再描画する。手書きデータは短いものでも数個のラインから構成されていて描画量は結構多い

昔のBASICとは違い、Rubyなどのインタプリタ言語では、さまざまなライブラリやOSのAPIを直接呼び出すことができる。このとき利用していたウィジェット・フレームワーク(WxWidgets。当時はWxWindowと呼ばれていた)では、描画したいラインの始点、終点を配列にして渡せば、高速に描画が行えた。

これなら、どんなインタプリタでも、事前に配列さえ作ることができれば、高速で描画が可能になる。昔風にいえば機械語ルーチンで高速化したわけだが、Windowsやオープンソースライブラリなどがあり、アセンブラでプログラムを書く必要はなくなった。

CやC++など、多くのコンパイラ言語は、標準化を行ったため、言語自体の進化が遅くなった。FORTRANやCOBOLなどが標準化で広く普及したため、標準化されることが言語のロールモデルだったからだ。標準化と関係のないインタプリタ系の言語は、バージョンアップごとに機能が増えていくのが普通で、そこが面白い部分である。

ところが、どんな言語もVer.3あたりで、破壊的な変化が「必ず」訪れる。実ユーザーが増えることで、さまざまな使い方がなされマルチプラットフォーム化が行われる。プログラミングのスタイルやパラダイム、常識も日々変化していく。大きく普及する言語には避けて通れない道である。利用するだけの立場から言わせてもらえば、こうした破壊的な変化を想定しておくべきだ。

多くのインタプリタ系言語には、REPL(Read Eval Print Loop)機能があり、言語を直接実行させることができる(昔のBASICでいうダイレクトモード)。テキストエディタでプログラムを書くよりも、REPLを使いながらプログラムを作るほうが、コンピュータを直接操作している感覚もある。

筆者の印象を裏付けるのは、最近のコンピュータ言語のランキングでは、PythonがCやC++を押さえて上位に来ていることだ。たしかに世の中には、CやC++でなければ作ることが難しいプログラムがある。しかし、その数はそれほど多くはなく、誰もが作るとは限らない。これに対して、多くの人が作るプログラムのほとんどは、今ならばインタプリタ言語でも問題ないプログラムだ。いまやインタプリタが言語の主役である。

今回のタイトルネタは、Pythonにちなみ、1971年の映画「And Now for Something Completely Different」(邦題 モンティ・パイソン・アンド・ナウ)の、エピソードの1つ「Seduced Milkmen」(誘惑された牛乳配達人)から取った。映画では、このエピソードは、のちに「The Funniest Joke in the World」(邦題殺人ジョーク)を思いつく作家のネタとして語られる(テレビ放映時には異なる回に使われた)。