言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

言語遍歴(技術的な近況)

私が色々なプログラミング言語が好きなのは、それぞれの言語が新しい視点を提供してくれるからだ。正しい言語を選だけで、複雑すぎてやってられないような仕事が呆れる程簡単になってしまう!というような事が今まで何度もあったし、これからもあって欲しいと思っている。たまたま機会があって、最近では自分でも言語を作っている。その辺の経緯を一番最初から書く。

最初はみんなと同じ BASIC。パソコンという物に触れる前に、千里中央にあった電電公社ショールームでバイオリズムを出力するプログラムを見たのが初めてだと思う。ロールペーパーに打ち出された行番号と英単語はとてもかっこ良かった。すがやみつるの漫画でプログラムを学び、最終的にマルチウインドウのアスキー画像エディタを作ってゲームのキャラ作成に使った。ドラクエ風を目指して作ったウインドウは全部モーダルで、配列をスタックとして使って8画面まで重ねる事が出来た。

機械語はビープ音しか無い PC-8001mkII で音楽を作成するために覚えた。画像の表示にも使ったけど、ハンドアセンブルでゲーム全体を作る根性は無かったし、そのうちパソコン自体の興味を無くした。

Prolog、C 言語、Smalltalk、HyperTalk は同じ頃図書館の本で知った。とても興味深かったけど、高校生の私は裕福では無かったので自分で試す事は出来なかった。色々妄想を膨らました話は以前書いた。http://d.hatena.ne.jp/propella/20070611/p1

まともにプログラムを書くようになったのは、院生の頃 Java に出会ってからだ。しょうもないライフゲームマンデルブロ集合のプログラムを作った。BASIC と違って、ライブラリの役割が大きいのが面白く、特に API のソースが読めるのに感激した。

自分で掲示板のソースを改造したのがきっかけで、バイト先で Perl を使うようになった。Perl は言語本体が大きくて、BASIC みたいな言語だったのですぐ慣れた。Java で一応オブジェクト指向の知識はあったけど、会社でのプログラムの書き方はグローバル変数使いまくりで BASIC とさほど変わらなかったので、普通の人は最新の技術なんか使わないんだ!というのを発見した。

しかしだんだんプログラムの規模が大きくなって来たので、若手だけでも Perlオブジェクト指向機能を使う事にした。同じ頃 SQL を覚えた。周りにデータベースを使える人が居なかったので、正規形を使いこなせるようになるのに二年くらいかかった。SQL の文法は嫌いだけどアイデアは好きだ。

それから転職してプログラムが仕事じゃ無くなった。最初はサーバー管理で、そのうちパワポを書いて営業に行って見積もりを書いてテスト項目を作って部下にコードを書かせるというのが仕事になってしまった。それでも仕事をサボってよくプログラムを書いた。C++ をサーバーに、VisualBasic をクライアントにしてチャットシステムを作った。C++ は小さなプログラムしか書かなかったので、みんなが言うほど酷いとは思わなかった。特に STL は面白かったけど、幸か不幸か真面目に触る事は無かった。

仕事をサボる一貫で Squeak Smalltalk も覚えた。Smalltalk は特にデバッガとコレクションクラスに感動した。コレクションクラスについては、なぜこんな凄い物が何十年も前に発明されているのに他の言語が真似しないのか不思議だった。そのうち未踏で会社を辞めて。毎日 Smalltalk が書けるようになった。

会社を辞めてから Haskell を知った。Haskell はとても取っ付きにくかったけど、一方で Haskell でプログラムを書けるという事はそのアイデアについて自分がはっきり理解出来ている証拠だと自信が持てる事に気がついた。 Smalltalk は快適すぎて、あまり分かってない仕様でも何となく書けてしまという欠点(?)がある。一方、Haskell は本当に分かるようになるまで何度も何度もムチでしばかれる感じがした。モナドに納得するまで五年くらいかかったが、モナドを知ってからは、Haskell でプログラムを書かない時でもモナドで考えるようになった。

Prolog を知ったのは十代の頃だが、実際に自分のパソコンで使えるようになったのはこの頃だった。Prolog に比べると Haskell すら普通の言語だという事が分かった。普通の言語が自分のやりたい事を書くのに比べて、Prolog の場合 Prolog 様の気持ちを考えてルールを書く羽目になって大変だけど、うまくはまれば大変便利だと分かった。

Haskell に疲れた頃、関数型スタック言語の Joy と Cat を知った。Joy は想像出来る限り最もシンプルで強力なので、これは世界の神秘を知ってしまった!と一時思ったくらいだ。Joy のシンプルさは関数定義に自由変数を持たないという性質から来る物だが、関数定義に自由変数を持たないというのが思ったよりも複雑な性質だという事に気がついてもう少し関数について勉強してから出直す事にした。

ふとしたきっかけで XilinxFPGA キットを買って Verilog を覚えた。残念ながら時間がとれなくて Verilog の勉強は進んでないけど、Verilog の場合普通のプログラミング言語ですら無いので Prolog 並の衝撃を受けた。

私がプログラミング言語を通して新しい概念を学んだのは Verilog が最後で、それから興味は言語の実装に移った。この日記にも色々偉そうな事書いたけど、自分で実装するとなると lisp が精一杯だった。最新のプログラミング言語を追いかけて来たつもりだけど、60 年代から歴史をやり直す事になった。

というわけで、今は Adobe VM むけの lisp コンパイラを作っている。色々な事があって、lisp を作るための lisp のライブラリを書くという一見不毛な事をやる羽目になっている。どういう事かというと、同僚の書いた lisp インタプリタがあるんだけど、それが本当にインタプリタだけで全くライブラリが無い。eval と apply 以外何も出来ない。文字列の連結すら出来ない。C のライブラリ関数だけは簡単に呼べるようになっていて、低レベルの部分では C の関数を呼び出す。まあそういうのをコツコツ積み上げて lispコンパイラが書ける程度のライブラリを書く。

このライブラリの書き方にもコツがあって、出来るだけ依存関係を単純にしたい。例えばライブラリ用のディレクトリからプログラム呼ぶローダを書くとする。となるとファイル名とディレクトリ名を文字列連結する処理が居るのだが、当然その定義はローダよりも前にある必要がある。文字列の連結にはストリーム処理がいる。という事は文字列連結の前にストリームライブラリが居るのだが、ライブラリを呼ぶためにはローダが必要だ!という三つどもえ状態をほぐして行かないと行けない。

どうやってこの問題を解決するかというと、本当はストリームを使ったかっこいい文字列連結を書きたい所だがローダの時点でストリームは無いので、ローダ用に memcpy で作ったちょっとダサメの文字列連結関数を用意しておく。という具合だ。

いくらでも文章が長くなってしまうのでこの辺でやめる。とにかく、プログラミング言語何十年もの歴史を頑張って早送りして追体験しているというのが今の状況である。