おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

私は如何にしてプログラミングを止め、プログラミング言語を愛するようになったか

このブログは基本的に無味乾燥なお勉強日記なんですが、たまには普通のブログらしいエントリを書いてみました。……つか、ホントに書きたいことは違うんですが、前置きに私の来歴を書いていたらすげー長くなっちゃって……で、独立した次第。

初めてのプログラミング

えーと私 1971 年 3 月 26 日生まれ独身(それは関係ない)なので、NEC から名機 PC-8001 が出たのが大体小学生高学年から中学にかけてですね。

ということで初めてのプログラミングは私が中学1年のとき、函館高専で行われた夏休み中学生向けマイコン講座というやつで N-BASIC でプログラムを書いたところから始まっております。
おお、すがやみつる大先生の「こんにちはマイコン」の世界が我が手に! 自分で作ったプログラムがホントに動いたときには感動したものです。

ナイコン族の時代

さて当時のパソコン、いやあえてマイコンと言うべきであろう、はオモチャのようなことしかできなかったくせに蔵が立つほど高かったので、嵐の日にミカンを輸送して大金持ちになり、日本人初の宇宙飛行を行ったことで有名な紀伊國屋文左衛門のようなごく一部の人々しか購入できない、庶民には高値のしろものでした*1

ここでマイコン好きっ子の人生の分かれ目。

  • 親からマイコン買ってもらってゲームやりまくるのも飽きて作り始めて性能欲しくなって機械語かじって……気づいたらコミケで同人ゲーム売ってました、のタイプ。
  • いわゆる「ナイコン族」と呼ばれる人間であり、友達の家で遊ばせてもらったり、たまには借り受けたり、チャリンコ漕いでお店に行きデモ機で遊ぶ、といった道を歩むタイプ。

プロレタリアートな私はむろん後者でありました。
すなわち私にとって、プログラムとは紙に書いて動きを手でトレースしていくのが主なもので、それをタイプして動かすのはもちろん面白かったけど、それが必須というものでもありませんでした。ぶっちゃけ、書いて満足してた。

Prolog との出会い

高校生のころ、親にポケコン (SHARP PC-1246 だったと思う) を買ってもらって、ぼちぼち遊んでいたのですが、なんかこう、プログラムを作って動かしてもそれほど喜びを感じなくなっていた自分に気づくのでした。

そんなころに必修クラブで「なんでもいいから好きな調査をしてレポートを上げる」とかいう非常にデタラメなクラブがあって、デタラメな私はむろんそこを選んだのですが、そこで Prolog なんて変なものに出会ってしまった。なんじゃこの言語は! 今まで知ってた BASIC と全然違う!

ということでオイラはなぜか当時のポケコンBASICPrologインタプリタ書いたりしてたんですね。といっても WAM *2 はおろか字句解析とか構文解析なんて知らなかったので、if 文並べてパターンマッチするだけ、バックトラックもできなかったし逆演算もできない「見た目 Prolog」だったんですが、そのとき確信しましたね、あたしゃプログラムを動かすことよりも、プログラミング言語というものそのものに興味があるんだってこと。

大学時代 (研究室以前)

大学は情報系で、国立大で学費が浮いたからといってごほうびに PC-9801RA2 を買ってもらいました。HDD 40MB (単位間違ったわけじゃないよ) 付きで 40 万ぐらいしたんじゃないかなぁ。中古車買えるぜ。

で、素直に Prolog をやるのかと思いきや、PC 用の Prolog の処理系ってどこ行けば買えるの? って理由もあり、最初に買ったのは確か Turbo Pascal だったと思います。これはどっかの雑誌で激賞されていたのであっさり影響されての選択肢だったと思うんですが、一瞬で終わるコンパイル、純 Pascal の欠点 (ある意味、哲学ではあると思うのですが) を補うかゆいところに手の届く拡張 (特に Modula-2 以前にモジュール化の概念を導入したのは素晴らしいと思う) などなど、お気に入りで、趣味のプログラムは大抵コイツで書いてました。

やっぱり C もやらなきゃなのかなーと思いつつ、Turbo C はみんな持ってるからピーコしてもらえば (時効ということでお許しください ><;) ということで Quick C を買いました。が、「別にできること Pascal と変わらないじゃーん」と思い、あんまり使いませんでした。

割と雑誌に騙されやすい私は Quick Basic の記事を見ておおっと思います。ちゃんと構造化された構文、グローバルスコープとローカルスコープを持っていること、なんといっても Any 型*3 というのが私としては非常に新鮮だったのでない小遣いを叩いて買いましたよ。でも「おーほんとだ、構造化構文書ける、Any 型面白ーい」で満足して、あんまりこれで大きなプログラムを書いた記憶がありません (^^;)。Windows 発売後に VB も買いましたが同様。

あー授業で学んだ言語の話も。うちの学科の電算機センターには ACOS が鎮座していて、一渡りの言語は入っていたと思うんですが、授業できちんと演習も含めやったのは COBOL と tiny BASIC (JIS 標準 BASIC) だけです。
でも、COBOL の経験は大きかったですね。ある目的に特化した言語を割り切って作るって言うのはこういうことかって。

情報処理技術者試験2種は大学1年で取ったのですが、当時は Fortral/COBOL/CASL の3択だったので Fortran で受けましたが、ぶっちゃけ Fortran は一度も書いたこともありません *4。それで受かるんだからインチキみたいな資格試験でしたな、当時は。特種・1種・2種しかなかったころですから。

授業では他に Prolog人工知能の授業の一貫として、Lisp を野崎昭弘先生*5 の夏期特別講義をちょっとやったぐらい。あと EDSAC (世界初のフォン・ノイマン型コンピュータ) のアセンブラ


10.9 追記

「えー大学まで行ったのにまともに言語教育受けてないの?」って思われるかもしれませんが、私はそれで全く構わないと思います。大学というところは学究の場所であって職業訓練校ではない。学ぶべきことのツールとしてプログラミング言語をやればあとは独習するものだ。むしろ独習に値するヒントをたくさんくれて、独習する機会を与えてくれるのがよい大学だと信じています。自分の母校の擁護じゃなくてね*6

授業で学んだことより先生との雑談で学んだことの方が多いですね。
Fortran のころはいわゆるコンパイラの理論なんかなかったから BNF の発明は偉大だったという話とか、ダートマス大学Basic を作った人たちがなぜ Fortran じゃダメで新しい言語を作るべきだと思ったのかとか、スタックがいかに偉大な発明だったのかとか、TeX と METAFONT と Weave の話とか。雑談ではもちろんキーワードしか貰えないので図書館で本読みまくり。オイラのうんちくはだいたいここらへんを起源としております。

研究室時代

いちおー卒業研究は人工知能屋さんということでマスターを含む三年間、SONY の NEWS というワークステーションで動く K-Prolog という処理系で Prolog のコードをずーっと書いてました。高校時代の憧れの言語とやっと本格的に向き合ったわけです。

でも憧れの言語はなんというか究極の言語ではなく、愛すべき欠点を持った可愛い奴って、ぐらいでしたね。でもほら、ちょっとぐらい欠点がある方が可愛いじゃん?

あと私はブライアン・カーニハン*7 の文章が大好きだったので「プログラミング言語 awk

プログラミング言語AWK (新紀元社情報工学シリーズ)

プログラミング言語AWK (新紀元社情報工学シリーズ)

(再販されてたんだね……) を読んで「おお、こいつはすげぇ!」と思い、それまでは Prolog の出力を加工する簡単なフィルタは C で書いてたのを、awk に全部乗り換えました。ということでオイラの LL デビューは awk です。

就職して

ご存知の通り就職したのは現職場の某事務機器メーカーです。
研修終えてちょうど立ち上がるプロジェクトがあるからって配属されて、Windows の印刷システムを作るよと。ついては新しく Windows 95 / NT 3.51 から導入されたユニドライバというプリンタドライバを作るプラットフォームが使い物になるか調べてくれよと。

……ドキュメント全部英語なんすけど。これを読めと?「うん。よろしく。仮訳メールで送ってくれたら一緒に悩んであげるから」
…………誤読じゃないとしたら、この仕様って今回のプロジェクトでは致命的にダメなんですが。「じゃ、それプレゼンして」
………………ということで、この制約を許容するか、フルスクラッチでドライバを書く以外ないと思われます。「そうか。考えるよ」
……………………「決めたんだけどさ、95のプリンタドライバ、担当して貰える?」

えっ?
えっ?えっ?

あのぉ、私、Windows のプログラムなんて書いたことないんですが。
C もせいぜい 100 行ぐらいのプログラムしか書いたことないんですが。
「人もいないし、NT3.51 の開発は関連会社さんでやるから、情報交換しながらできるよ。頼んだよ」

ということで、

  • 回りにノウハウがまるでない状態で
  • 超苦手な英語のドキュメントをひも解きながら
  • ほとんど使ったことがない C で
  • 初めての Windows プログラミングをする

というのがワタクシの入社して最初の仕事だったりするわけで。
イヤー勇気を通り越して無謀だよね (^^;)

ま、一応物は1年かけて出したんですけど……。

あと細かい職歴はアレですけど、だいたい「ノウハウがない仕事をいきなりまかされる」か「誰かが書いた見たくもないコードのメンテをする*8」で、言語は C or C++ でした。でも C++ の仕事は他人の作ったもののメンテで、いろんな人の手が入ってひっちゃかめっちゃかになってて、とても C++ でそれらしいコードを書いたとは言えません。

こういう経験つんでると、もうプログラム書くのいいや、って気になってくるですよ。
いや書くのはいい。ただ手探りで新規機能実装したり人のコード探索してリファクタリングしてると、それだけで疲れきっちゃって、モジュールテストとか甘くなる。それでミスを生む。もう限界だな、と。

そんなわけでオイラは「もう物作りはしたくない、ただし物作りの観点で提案なりなんなりしたいから、部署は物作りの部署にいたい」などとわがままをほざいておるわけです。

趣味のプログラミング

ということで趣味でも「プログラムを書いて動かす」ことより「そのプログラミング言語の一番おいしいところをつまみ食いする」のが目的だったりします。

今は Prolog の処理系を書いてみようかなとちょっと思ってるけど、それは錆びついた頭を Warren の論文でも読んでほぐしてみようと思ってるから。

CL は言語仕様が大きいのとマクロが僕は嫌いなので (Lisper はマクロ Lover が多いのでこの点私は Lisper と仲良くなれません) ちょっとなーとは思いますが CLOS のオブジェクト指向は面白いとのことなのでちょっとかじってみたいかなと。

ML 系 (SML とか OCaml とか) は破壊代入とかあるしあんま萌えないのだけど、計算機言語意味論の教科書を書いてる Robert Harper 先生は ML な人なので SML かじっとくと理解いいかもって気もしてて悩み中です。

今一番時間を割いてるのは SmalltalkErlang かな。Smalltalk はやっぱり環境に興味があること。Erlang は MIT のヒューイット先生の Actor であることがやっぱり。Actor 理論は「算法表現論」で読んで以来興味ありまくりだったのだ。

あとは長らくお留守だった Pascal 系、Molura-2, Modula-3, Oberon もやってみたいですね。特に Oberon は Smalltalk と同じように環境のオブジェクトをその場で弄れるという面白い環境なので、ちょっと本格的に触ってみたいです。


10/9 追記
LL の話書いてなかった。

Perlminibbs 全盛のころ改造のために Perl4 のラクダ本を買って、こんなきちゃない文法の言語できるかー、って投げ出してそれっきりです。正確には「汚くも書ける」なんでしょうけど、awk の非常に明解(ただしできることは小さい)な文法を愛していた私には耐えられなかった。ここ1年ぐらいですね、Perl に対する考えが少し変わったのは。優秀な人がひっぱってコミュニティの成果物をうまく使えれば非常に強力な道具なんだろうな、でも私は自分の会社で自分の仕事で使いたくないな、という雰囲気。

RubyJava-brewers という ML が昔ありまして、そこで久野先生や高木先生や matz さんが会話してるのを読んで興味を持ったのが最初。んで 1.8 リリース時に出た最初のバイブル買って、おおこりゃええわい、とか思ってたら、トドメが arton さんの Ruby 256 本邪道編。ということで RoR とかはっきり言ってどうでもいいのです。割と変態だな。

PythonLinux の仕事をするようになって慌てて勉強始めたのでまだ難しいこと語れるほどではないですが、iPython の強力さは羨ましいです。irb はちょっと非力だからなぁ。

あと LL じゃないオブジェクト指向言語JavaC# ですが、どちらも仕事ではまだ無縁です。趣味でもあんなに重い言語といまさらお付き合いしたくないなぁというのが正直なところです。

ということで

こんな背景を持つ私が「プログラミングの入門にふさわしい言語とは」という話を次回はしようと思います。お楽しみに?

*1:デタラメなので間違っても信じないでください。

*2:Warren Abstract Machine。Prolog の実装理論として有名。

*3:代入した値によって型が決まる型。確か PL/I にはあった気がするけど、身近な言語では始めてみた。

*4:後日談ですが、私は規格オタクなので Fortran 90 の規格が出たときは速攻チェックして、構造体とかポインタがあるので座り小便出そうになりましたね。

*5:GEB の訳者の一人。GEB は数学基礎論とコンピュータの主に自己言及に関する話題を、音楽と芸術とその他のものすごい教養で語っていくという猛烈面白い本なのでこーゆーのが好きな人はぜひ読め。そういえば野崎先生 Lisp の本も書いてたな。珍しく M 式使ってる奴。

ゲーデル,エッシャー,バッハ―あるいは不思議の環

ゲーデル,エッシャー,バッハ―あるいは不思議の環

*6:だから特に大きな企業も大卒や院卒を職業訓練校を出た人間のように扱わんでほしい。むしろ本来の職業訓練を目的とした専門学校や高専からの採用を増やした方が、即戦力を養成する機関のステータスが上がって相互によいと思うんだけど、まあ教育論は専門じゃないのでこの辺にしときます。

*7:K&R の K。分からない人はそこらへんの C に詳しい人に聞こう。

*8:大抵、みたくないのでしれっと全部捨てて書き直すんですが。