2010-01-23

最初に学んだ言語

この前、C++WG会議の後の酒の席で、面白い話題が出たので、書いておこうと思う。話題というのは、一番最初に学んだプログラミング言語は何か、という事である。

ほとんどの者は、BASICを挙げた。N88-BASICにしろ、VBにしろ、BASICには、実装の数ほど方言があるが、BASICである。

もちろん、これは世代による。昔は、コンピューターといえば、N88-BASICが走る箱であったという。その席にいた人たちは、大抵が、人生の比較的早い時期にプログラミングを始めた種類の人間である。とすれば、BASICが共通言語になっているのは、別に不思議ではない。

現代では、プログラミング言語は世にあふれている。多くの言語は、開発ツールがほぼ無償で手に入る。これは、数十年前からすれば、夢のような学習環境である。一体、今を生きる未来の天才プログラマは、どの言語を使って、プログラミングを学ぶのだろうか。

ちなみに、ひとりだけ、最初からC++でプログラミングを学び、printfではなくiostreamを使ってhello worldを書いたというツワモノがいたが、それは例外的な存在である。

では私はどうかというと、これがまた、相当変わっているのだ。

私は幼稚園の頃から、コンピューターを使っていたが、せいぜい、ゲームで遊ぶ程度であり、プログラミングをしようとは考えたことがなかった。ただし、プログラミングというものがどういうものかは知っていた。こうかくと、「何を当たり前のことを」といわれるかもしれないが、世の中の大多数の一般大衆は、今もって、プログラミングという概念自体を知らないのである。私はいつも、そういう種類の人に、「プログラミングするというのは、そもそも何であるのか?」と訊ねられて、説明に窮している。彼らは携帯やパソコンを使う。しかもプログラミングの何たるかを解さないのである。

この難題に対する、私の回答は、たいてい次のようなものである。

「MS OfficeやWindowsといったOS、あるいは携帯やゲームなども、所詮はソフトウェアに過ぎない。プログラミングは、そういったソフトウェアを作ることをいう。そういうソフトウェアを作るには、何をどうするかという、具体的な手順を指示する必要がある。その手順を記述するのが、プログラミング言語である。プログラミングするというのは、たいてい、この言語を書くことをいう」

この説明は、残念ながら、全く理解されない。難しいものだ。

ともかく、私は幼い頃から、プログラミングという概念を理解していた。しかし、私は生来の読書好きなので、小学校時代は、ただひたすら本を読んでいて、プログラミングをしようとは思わなかった。

中学生になって、私は無性に、プログラミングがしたくなった。しかし、私はその当時、パソコンを持っていなかったし、手に入れる手段もなかった。

この問題に対して、私の取ったworkaroundは、実に変わっていた。私は、ひたすら脳内で学んだのである。図書館でPC雑誌を積み上げ、過去のバックナンバー十数年分に渡って読みふけったり、様々なプログラミング言語の参考書を読みふけった。その当時、実に様々なプログラミング言語の参考書を読んだが、一番印象に残ったのは、C言語であった。C++の参考書も読んでいたが、やはりC言語に強く引かれた。Javaが最新で最強のプログラミング言語だと称する参考書もあったが、私はJavaの何がいいのか、さっぱり分からなかったし、今持って、分かっていない。当時の私は、参考書のサンプルコードを読み、脳内でコードを書き、脳内で解釈し、実行していた。おそらくは、これが今の私を形成したのであろう。

また、プログラミングには、英語が読めなくてはならぬと考え、英語を学んだ。私の英語の学び方も、また変わっていた。学校の英語教育は、実に役に立たなかった。私の初期の英語教育は、まったくNHKのラジオ英語講座に負うところが大きい。また、ひたすら洋書を読んだし、映画やcartoonを英語で観た。

高校生になり、バイトをして、パソコンを買った。自作も考えたのだが、当時は田舎に住んでいて、近所にPCショップもなかったし、面倒だったので、BTOでパーツを指定して買った。

プログラミングを学ぶにあたって、私が最初に選んだ言語は、HSPであった。HSPは、決して良い言語とは言えなかった。しかし、HSPの最大の魅力は、その手軽さにあった。何も書かなくても、最初からGUIのウインドウが表示されるし、たったの一行書くだけで、ウインドウに文字列や画像を描画できたし、Windowsのコモンコントロールウインドウも配置できた。

私が最も、実際に動くコードを書いたのは、あるいはこの時期だったかもしれない。

しかし、私はすぐに、壁に突き当たった。HSPの文法は、非常に貧弱だった。制御構文が、実に洗練されていなかった。それゆえ、ifとgotoを組み合わせたコードを書かなければならないことも、しばしばだった。

一年後、もうこれ以上、HSPで学ぶことはないと判断した私は、いよいよC言語に手をだすことにした。このため、私はVisual Studio.NET(無印)のアカデミック版を買いに走った。高かった。たしか、三万円ぐらいしたと記憶している。その翌年、VS7.1のアカデミック版が、1500円程度で売られ始めた。私は泣きたくなった。

そういうわけで、私はHSPという、贅沢で高級なGUIプログラミングから、C言語でCUIという、非常に低級な言語に、学習の環境を移した。すでに、何年もおよそ書店で売られている参考書は読み尽くしてきたので、習得に、さほど時間はかからなかった。私はポインタにつまづくこともなかったし、標準入力から任意のバイト数を読み込んで、動的にrealloc()でサイズが変更されるメモリ上に書き込むコードを書くこともできたし、双方向リスト構造も、バイナリツリーも書けた。また、私はバブルソートとクイックソートとマージソートを書くこともできた。

並行して、私はWin32 APIを使ったGUIプログラミングも学び始めた。MSDN Libraryを読むのに、英語は役に立った。すぐに、私はC言語で、HSPの表現力に迫りつつあった。

しかし、実際にC言語で書くのは、ひどく苦痛だった。たとえばメモリの動的確保だ。メモリ上に保持しなければならないデータのサイズが、実行時にしか分からない場合、また、実行時にデータがどんどん増えてゆく場合、malloc()とrealloc()を使って、メモリを動的に確保しなければならない。それ自体は、別に問題ない。私はポインタを恐れることはないし、正しいコードを書くことができる。しかし、わざわざ毎回そんなことをやっていては、甚だ面倒である。

私はメモリの動的確保のコードを、関数という単位に移したが、それでもやはり、満足できなかった。その関数を、それほどジェネリックに書くことができなかったのだ。それゆえ、私は、構造体ごとに、それぞれ別のメモリ確保の関数を書かなければならなかった。しかし、その関数内に書いている、実際のメモリ確保のコードは、あまり違わないのである。なんという労力の無駄遣いだろうか。

私はC++の世界に入門した。C++は使いやすかった。私はクラスを、構造体に関数を関連付ける機能として認識した。その他にも、コンストラクタ、デストラクタ、仮想関数など、ベンリな機能は様々あるが、言語として、構造体と関数を関連付けられるというのは、実に便利であった。C言語でも、双方向リストやバイナリツリーといったデータ構造を実装するときは、ある構造体専用の関数というものを書いていたが、言語の文法としてサポートされているのは、実に便利だった。

私は、オブジェクト指向(笑)という称する概念が理解できなかった。ましてや、デザインパターン(笑)だの、クラス設計(笑)だのUML(笑)だのと称するものに、何の価値があるのか、さっぱり分からなかった。デザインパターンなど、単なるプログラミング上のテクニックでしかないものを、何をもったいぶった名称を使わねばならぬのか。オブジェクト指向というものに対する私の認識は、「言語の機能や文法として、このような記述ができるというだけの話であって、その機能を使ってどのように記述しようが、それはプログラマの自由である」というものだった。私にとっては、デザインパターン、オブジェクト指向、クラス設計などという呼称は、思考、考え方、発想、アイディアなどと呼ばれるものを制限しているようにしか見えなかった。おそらく、私がJavaに抱く嫌悪感は、ここから来ているものと思われる。

また、C++の標準ライブラリは、実に便利だった。私はもはや、データ構造やアルゴリズムを自前実装しなくてもいいのだ。STLのコンテナに任せておけば、メモリは勝手に確保、解放してくれるし、リストやツリーの構造は、勝手に構築してくれるし、ソートも、要素同士の大小を比較する方法さえ提供しておけばいいのだ。しかも、このコンテナやアルゴリズムというやつは、自分の定義したあらゆる構造体に対して使えるのである。なんと便利なんだ。

しかし、STLのコンテナやアルゴリズムに対して疑問が沸いた。一体どのようにして、こんなクラスや関数を書けばいいのだろうか。「どのようにして」というのは、データ構造やアルゴリズムの問題ではなく、コードとしてコンテナやアルゴリズムを実装する方法である。どうやらテンプレートというものを使うらしいが、その使い方が、いまいちよく分からなかった。

私はさっそく参考書やWebをあさった。テンプレートの表面的な書き方は、いくらでも見つかったが、それだけでは、何か違和感がある。なにか本質的な理解が欠けているのではないのかと、私の生来の本能が告げていた。

とうとう私は、C++ Templatesを買った。この本には、まさに知りたい情報が載っていた。ちなみに、近々、この本が翻訳されるらしいが、今更感がただよう。この本を読むほどの気力のある、真のC++プログラマは、すでに読んでいるし、また、この本の存在を知らないズボラなユーザーは、日本語だろうと読むはずがない。だいたい、この本を正しく翻訳できる日本人が存在するとは思えない。この本は原書で読むべきである。

この時点で、私のプログラミングへの理解は、かなり向上していた。私はMSDN Libraryを読んだだけで、今まで知らないWin 32 APIでも、問題なく使えるようになっていた。今までは、MSDNを読み、ネット上で他人の書いたサンプルを探し、さらに自分で試行錯誤して書いて、ようやく動くという次第だった。しかし今や、MSDNを読み、コードを書き、コンパイラが告げるtypoを直せば、そのまま動くようになってしまった。プログラミング言語に対する理解が深まった今、必要なのは、ライブラリやAPIのドキュメントを読むだけなのである。

私はこれを、つまらないと感じた。これでは、私はただ、ライブラリやAPI、言語を使っているだけではないか。ゲームをつくるというのは、面白いかもしれない。しかし、そのゲームを作るために、こんな単調作業を続けなければならないとしたら、そんなのは面白いはずがない。

私は人に自分の性格を説明するとき、よく、「熱しやすく冷めやすい」という表現を用いる。ただし、飽きっぽいと言われると、それは違うのである。私は、苦労が好きなのである。最初は、何も分からないので、難しく感じるが、学習すると、次第に楽になって行く。ところが、楽になりすぎると、私はつまらないと感じてしまい、それ以上、継続する意欲がなくなってしまう。その場合の私は、何かまた別の、難しい事を探すのである。私は、同じゲームを数カ月以上続けて遊べた例はないし、同じジャンルの本を、数ヶ月以上読むということもしたことがない。次第に楽になって行くので、やる気がなくなるのである。

ただし私は、無駄な努力が嫌いである。たとえば、コピペして一部だけ変えればすむような、同じようなコードを何度も書くであるとかいう類である。

プログラミング言語はだいたい理解した。環境依存のAPIの使い方も、大体理解した。では、これより難しいこととは何か。

ここで、多くのプログラマは、OSやコンパイラを実装し始めるのだと思う。しかし、私の考えでは、それとて、すでに確立されたアルゴリズム、現実のハードウェア仕様などを学ぶだけである。もちろん、自分で斬新なアルゴリズムを考えだすことも可能である。ただし、それは相当難しい。

OSやコンパイラの実装は、まず土台に立てる基礎力をつけるだけで、相当難しい。ましてや一流になるのは、至難の業である。Rubyはあまり好きではないが、Matzは相当のやり手である。

私の進んだ方向は、C++の言語仕様を深く理解することであった。そのため、私は、C++0xのドラフトやペーパーに目を通した。そうして、今に至る。今から考えると、私は言語が好きだったのではないかと思う。たとえそれが、自然言語にせよ、人工言語にせよ。

思えば、私は相当の変人である。

4 comments:

萌ゑ said...

私とよく似た言語変遷ですね
私はVisual Basicから入って、あまりの言語仕様の固さに嫌気が差しすぐにC言語に移り、
多量のプログラムを書きました。しかし、毎回毎回車輪の再発明ばかりで、無駄に時間が
食われるのが気にかかり、ライブラリの使い勝手の悪さにも嫌気が差していました

そこに現れたのがC++というわけです
これは私の要求を完全に満たしてまだ余りありました
簡単なスクリプトは確かにPerlやRubyが良い
しかし実用的な速度で動くコンパクトなプログラムを書くにはどうしてもネイティブコード
を吐いてくれる言語が必要だったのです

今仕事が多忙になりRinGoch上のC++Wikiの更新は長い間停止したままですが、誰がやって
下さっても構いません

管理キーをお渡しします
C++0xWikiもそのうち必要になるでしょう

Anonymous said...

>とうとう私は、C++ Templatesを買った。

いつ頃ですか?(何歳のころ?)

>だいたい、この本を正しく翻訳できる日本人が存在するとは思えない。この本は原書で読むべきである。

「原書を読むべき」という気持ちは分かるのですが。
これは英語に自信がある人だからこそ言えると思います。
英語が弱い人には難しいと思います。
辞書を使いながら英語を読むより、翻訳されたものを読む方が、
断然、正確に理解できると思います。
(翻訳された方が、自分より英語力があることが前提ですが・・・)

日本人が「日本語を日本語で理解」する様に「英語は英語のまま理解しろ」みたいなことも言われますが、日本人には無理です。英語圏の人は「英語を英語で理解」してるのでしょうけど・・・


初めて、洋書(C++ Templates)に挑戦しようとしてる時に翻訳本が発売されるのはタイミングが悪すぎます。

faith_and_brave said...

> ちなみに、ひとりだけ、最初からC++でプログラミングを学び、printfではなくiostreamを使ってhello worldを書いたというツワモノがいたが、それは例外的な存在である。

C++から始めた変人ですいませんw

hito said...

>いつ頃ですか?(何歳のころ?)
アマゾンの購入履歴によると、2006/1/29に購入しているので、
当時、19歳でしたね。

>日本人が「日本語を日本語で理解」する様に「英語は英語のまま理解しろ」みたいなことも言われますが、日本人には無理です。

今の私は、英語は英語のまま理解している実感があります。でも、学習に、十年以上かかっています。
ただし、私が普通の日本語を、普通に読み書きできるようになったのも、だいたい十歳以降です。
とすれば、別に英語ネイティブと日本人とで、英語の学習に、あまり差は無いわけです。