閉じる
閉じる
×
麻布十番でひさしぶりに「もや鍋」を食べながらボケーっとしていたら、「オブジェクト指向は禁止するべき」という記事がタイムラインにながれてきていて、「なぬ!?」と思ったのだけど、まともな記事だった。
オブジェクト指向がなぜ優れているのか、というかなぜ世の中はオブジェクト指向を必要としたのか、という点について無視すると、たしかに初心者にオブジェクトの概念教えるのは難しいんだよね。
僕は基本的にゲームプログラミングから入っているから、オブジェクト指向というのはびっくりするくらい重要というか、当たり前のものの一つになっている。
ゲームだとオブジェクトというのが画面に現れる。
例えば弾とか敵とかね、あれがひとつひとつオブジェクトだよ、と言われれば納得する。
その昔、ナムコの業務用基盤(ギャラクシアンとか)ではスプライトのことをオブジェクトと呼んでいたくらいだからゲーム=オブジェクト指向は揺るぎないと思う。
しかしゲーム以外のプログラミングの世界では、オブジェクト指向はかなり難解な概念として捉えられるらしい。
なぜかというと、ゲームのようにオブジェクトが見えないからだ。
もしくは見えたとしても、ウィンドウオブジェクト、それを継承したウィジェットクラスとスクロールバーオブジェクト、それに集約されたボタンオブジェクト、などなど、と言うように、目に見えてはいても概念として頭にスッと入ってこないものが多いのだ。
むしろ何気なく見えてるこの画面の上で、無数のオブジェクトが生き物のように互いにメッセージをやりとりしながら動作しているのだ、という前提は不気味ですらあるだろう。
オブジェクト指向の概念を最初に考えたのは誰だ、というと揉めることが多いが、間違いなく黎明期のオブジェクト指向に重大な影響を及ぼした一人はアラン・カーティス・ケイだ。
で、アラン・ケイは、なんと子供にプログラミングを教えるためにオブジェクト指向のアイデアを使ったのだ。
子供になにかを説明するために擬人化して説明したりする。
それだね。
しかし残念ながらいい大人であるにも関わらず、アラン・ケイのSmalltalk環境を僕はハックできない。つまり本当にユーザーフレンドリーなのかどうかはよくわからない。
まあせっかくだからこんどチャンスがあったらしてみようかと思うけど、やろうと思ったことがない。それをやりたいと思っていた中学生の頃はまだインターネットも普及してなかったし、日本語の本も見当たらなかったしね。
ただ、ケイ先生本人に聞いた話でもあるけど、ジョブズが古くさいとバカにしたXeroxのパロアルト研究所(PARC)で、たまたまみつけたアラン・ケイのSmalltalk環境を見て、ジョブズは「スクロールが文字単位なんて性能が低く見える」とバカにしたそうな。
すると、ダン・インガルスが「口の減らねえ小僧だ。そこで座ってみてろ」と言って、ダダダッとその場でテキストエディタを継承して1ドット単位のスムーズスクロールするテキストエディタを創りだした。ものの五分だったという話だ。
それでスムーズに動くところをみてジョブズは「マルチウィンドウってすげえ!」と思ったそうな。
けど1995年にジョブズはインタビューの中で振り返っているけど、この時、彼は非常に重要なものを見落としていた。
そう。オブジェクト指向だ。
なにしろMacは使うは天国、作るは地獄と言われていた。
なぜか?
オブジェクト指向がないのにイベント駆動方式のプログラムを作らなければならなかったからだ。
これはMFC以前のWindowsアプリを作ったたいていの人が経験した地獄と似ているが、初期のMacのはもっと悲惨だった。
そもそも純正環境はLISA(200万円)を買わないとMac用のソフトが開発できないという「それは本当にパソコンなのか?」という衝撃的な制約があった。いまのAndroidやiPadのような感覚だ。Macを買わないとiOS向けアプリが作れないという制約は、伝統的なものなのである。
それからサードパーティがMacFORTHとMacintosh Pascalを出した。そう。Cすらなかった。
MacやWindowsのアプリを誰もが手軽に作れるようになるには、オブジェクト指向の登場が必須だったのだ。
HyperCardはオブジェクト指向を強く意識したイベント駆動モデルを採用していた。
そしてゲームプログラミングの世界では、C++を導入しようとしたら笑い者になった時代がある。
「おまえ、コンパイラの小細工がなけりゃオブジェクト指向も書けない坊やなのか?」
てな感じである。
94年くらいかな。
なにしろまだ大半のゲームがマシン語で直接書かれていた。Cですら軟弱なのにってなもんである。
僕はペーペーのヒヨッ子だったから、CD-ROMの回転タイミングにあわせてデータを分散配置したり、8ビットマシンの上にSmalltalkのVMを実装してRPGを作ったり(天外魔境だ)する凄腕の話を聞いてガクブルすることしかできなかった。
だがこの世代のオジンどもが絶滅すると、今度はコンパイラを妄信する青くさい坊やが大量に涌いた。
彼らはポリモーフィズムのコストを知らず、リソースをまるでバイキングのように食べ尽くした。
最適化のことを-O2だとしか思ってないからゲームプログラムの質は下がった。もうマシンパワーを最後の1ビットまで使い切るようなコードを誰も書こうとしない。
で、それがまずいのかというと、むしろそれは人類の進歩だと僕は思う。
確かに大量生産でひとつひとつのものは雑になり、資源を有効に活用できていないかもしれない。それはそれでまた伸びしろであって、大量生産の弊害としておかしな歪みができたのなら、そこを突けばイノベーションが起こせる可能性がある。それはウィザード級ハッカーの活躍する余地として存在していい。
ひとつひとつのモノの質が上がって行くよりは量が作られることで、質的転換が起きることのほうを期待したい。
複雑な問題を隠蔽し、本当に必要なコア機能の実装だけに集中できるようになった。これは紛れもない恩恵である。
オブジェクト指向の元々のパラダイム、つまりオブジェクト同士がメッセージをやりとりして云々というファンシーな前提はさておくとして、現実にオブジェクト指向はうまく機能している。あとは教えかたの問題であって、オブジェクト指向が問題なのではない。
経験がない人間がいきなりクラス設計から始めると躓く。
だから最初はクラスを作るのではなく、オブジェクトを作るところから始める、というのがMOONBlockの考え方の根本にある。
オブジェクトを作っているようで、実はクラスのアーキタイプを作っているのだが、それは意識の上で区別がなくなるようにしている。
MOONBlockに継承の概念を入れるかどうかはまだ迷っている。だが、継承を使った方が明らかに良い場合があるのは事実で、なにかうまい方法がないかと思っている。たとえばJavaのInterfaceに相当するようなものを導入するかどうかとかとか。
けど、プログラミング言語は機能を増やせば増やすほど使いこなすのが難しくなる。
最新のC++やJavaは、まるでテレビのリモコンのように無数の機能があり、どの機能をどのタイミングでどうやって使えばいいのか熟練者でもわからなくなっている。
たとえばテンプレートや多重継承など、それぞれのメカニズムは誰かが何らかの必要性を訴えて実装されたのだと思うが、実際にそれをどのような場面で使うべきか、というポリシーとセットでないと正しく使うことが出来ない。強力な機能によって、人はいくらでも最悪なコードが書けてしまう。
言語としては下の下であっても、PHPが実際のところ最も使われているWebプログラミング言語であるのと同じように、結局、高度な機能を使いこなすにはプログラマーの側に高度な知性が要求されるような状態というのはあまり好ましくない。
先日、nVidiaのチーフサイエンティストであったデイビッド・カーク氏(現フェロー)と夕食をとる機会があって、そこで彼は「超並列コンピューティングアーキテクチャ」についていくつかのアイデアを語ってくれた。
カークの一つのアイデアの形がCUDAであるのは間違いないが、CUDAは到達点ではなく通過点である。
CUDAを活用したプログラムを書くには、未だに高い知性が必要だ。
GPUのプログラミングは面白い、と僕が言うと、カークは笑って
「たいていの人にとって、GPUプログラミングはとても難しい。大学院程度の知性が必要になってしまう」
と言った。
理想的には、若い子供たちでもGPUプログラミングのような超並列プログラミングをものにするためには、これまでとは全く異なるコンピュータアーキテクチャが必要だ。ただしアーキテクチャはあくまでメカニズムであって、それをどのように扱うか、というポリシー、いや、むしろフィロソフィが必要になる。
カークの新しいアイデアのひとつはGPUコアひとつひとつがひとつのシンプルなオブジェクトを処理するような仕組みだった。これはうまく作ればきちんと動くだろう。Tegra K1プロセッサには192個のGPUコアがある。一般のゲームに登場するオブジェクト数からすると充分な数とは言えないが、シンプルなものは作ることが出来るだろう。
オブジェクト指向といえば、先日、Common LispのCLOSの仕様策定に関わった青山学院大学の井田先生から本を頂いた。
CLOSは、Common Lisp上に実装されるオブジェクト指向システムで、実に強力かつ美しい仕組みである。
CLOSを見るとオブジェクト指向がいかに強力かつプログラマにとって頼もしい味方であるか再確認できる。
プログラミング言語の進化は未だ発展途上にあると思う。
これからも沢山の言語が産まれて行くだろうし、さまざまな用途に向けてさまざまなアプローチが産まれて行くだろう。コンピュータの用途が広がれば、プログラミング言語も進化していく。そしてまた、同時に退化していくこともあるだろう。
たとえばアセンブリ言語やC言語についていたマクロ機能というのはいつのまにかなくなった。Javaにはジェネリックプログラミングの機能が追加されたけれども、JavaScriptにはマクロもテンプレートもない。その必要がないのだ。まあ作られた目的が違うから当然なんだけど。
話がとっ散らかってしまったけど、オブジェクト指向は素晴らしい。
けど、もっといいメカニズムやポリシーが登場したら、なくなってしまう可能性もある。
そしてオブジェクト指向が初心者にはあまり優しくないのも事実だ。
それはやっぱり教えかたの問題じゃないかなあ。うーん
-
次の記事これより新しい記事はありません。
-
前の記事2014-07-18 16:46:00『ゴトー博士のenchantMOONで遊ぼう!』アーカイブ動画公開開始!
チャンネル会員ならもっと楽しめる!
- 会員限定の新着記事が読み放題!※1
- 動画や生放送などの追加コンテンツが見放題!※2
-
- ※1、入会月以降の記事が対象になります。
- ※2、チャンネルによって、見放題になるコンテンツは異なります。
電脳ヒッチハイクガイド
更新頻度:
毎週月曜日
最終更新日:
チャンネル月額:
¥1,080
(税込)