Categories |
CPUの創りかた |
Modern Compiler Implementation in ML |
NerdTV |
PDP-11シミュレータで古代のUNIXを動かしてみる |
The Yakumo Project |
やさぐれ読書録
最近のツッコミ:1.Dominic(2008-06-23 05:05)
2.CheapestCheapOEMoem(2008-06-17 03:00)
3.NewDownloadCreativAdobOEM(2008-06-12 20:00)
最近のトラックバック:1.濃縮還元オレンジニュース:プロ.. (2006-12-22 22:02)
先日はプログラミングに関するインタフェースに ついて、あれこれと話をしたワケだが、今日はそこから少しズームアウトして、インタフェースがプログラムに 占める位置について考えてみようと思う。
■ 「アルゴリズム+データ構造=プログラム」という教え
大学に入って最初に受けたプログラミングの授業では、プログラミング言語としてPascalが使われていたのだが、そのPascalの 設計者であるNiklaus Wirthが書いた、「ア ルゴリズム+データ構造=プログラム」という本がある。このタイトルを図で表現すると、まぁこんなカンジに なるだろうか。

そのプログラミングの授業では、「アルゴリズム+データ構造=プログラム」が参考書籍というか、副読本として勧められていたので、早速 学校の図書室で借りて読んだのだが、そこで提示されていたプログラムリストをいくら眺めても、何をやっているのか理解できない。当時は自分のアタマが悪い せいだろうと思い、そのまま放り投げたのであった。
それからさらに10年以上経ったある日のこと。ふと思いついて「アルゴリズム+データ構造=プログラム」を再び読んでみた。今度は少し はなんとかなるだろう…と思っていたが、やはり歯が立たない。ヘンだなとおもってよく見てみると、提示されていたプログラムはグ ローバル変数を大量に使って、 それをいじり回すというスタイルで書かれている、ということが分かった。いわゆる構造化、つまりprocedure(手続き)を使い、プログラムを分割す るという 姿 にはなっているものの、procedure間のデータの受け渡しが全く見えないのだ。
■ 「インタフェース」が欠けているのでは?
プログラムを作るには「アルゴリズムとデータ構造」が必要であることは間違いない。でもそれだけでは足りないものがある。それは一体何 だろう?ということをしばらく(半年ほどか)考えた後に現れたのが「インタフェース」という言葉であった。「アルゴリズム+データ構造+インタ フェース=プログラム」というのが本来あるべき姿なのではないだろうか?

上の図の中で色を付けた部分が、前回のエントリ『「ユー ザ・インタフェース」に対する「プログラミング・インタフェース」という呼び名』で取り上げていた箇所となる。
ではプログラムの構成要素としてなぜ「インタフェース」が必要なのか?
例えば(GoF の)デザインパターンにはアルゴリズムは登場せず(オブジェクト間のやりとりを示したシーケンスは登場するが、これはアルゴリズムと 呼ぶには単純に過ぎる)、またデータ構造も表舞台には登場しない(データ構造は道具として使われるだけであり、最終的にはオブジェクト構造の陰に 隠れてしまう)。だがデザインパターンがプログラムを作る際の考え方の一つとして重要な位置を占めていることは間違いない。
もっと一般化させてみよう。もし、「プログラムにはアルゴリズムとデータ構造があれば良いのであって、インタフェースについては特に考 慮する必要はない」と考えた場合には、一つの関数で全ての処理を行なってしまう、あるいは一つのクラスで全ての処理を行なってしまうようなプログラムとい うものも、アルゴリズムとデータ構造さえしっかりしていれば良いプログラムということになる。しかし現実はそうではない。ある程度以上の規模を持ったソフ トウェアであれば、プログラミング・インタフェースに よる構造の整理は必須のものとなるであろう(例えばそれが無ければテストコードを書くことすら不可能となる)。ユーザインタフェースに関しては改めて強調 するまでもなく、ほとんどのプログラムにおいて考慮の対象となるべき存在である。
■ 今も見られる「アルゴリズム+データ構 造=プログラム」という考え方
しかし「プログラムにはアルゴリズムとデータ構造があれば良い」という考え方は、「アルゴリズム+データ構造=プログラム」が1976 年に登場してから30年ほど経つ今もなお、散見される。
1つのクラスで長々とではありません。もちろん、MVCを気にかけてオブジェクト分割しています。そういうプログラミングテクニックよりも、アルゴリズムを学ぶことの方が重要だと思います。その辺が作業員と技術者の違いになると 私は 思います。
(スラッシュドット ジャパン: 「まだやります人間対コンピュータのチェス対決」コメント)
コンピュータ上で計算を行うプログラムはデータ構造とアルゴリズムから構成される.
(京都大学工学部情報学科「ア ルゴリズムとデータ構造入門」)
すなわち、アルゴリズムとデータ構造が決まれば、プログラムはほぼ完成したものと言える。
(東北大学「2004 年度前期 IT教育基礎論特論B 第7回: アルゴリズムとデータ構造」)
だがこの文章でも述べたように、プログラムには「アルゴリズム」「データ構造」「インタフェース」の三つを揃えるべきである、という考え方を、そろそろ強調するべきなのではないかと僕は思っている。いかがだろうか。
(ちなみに「アルゴリズム+データ構造=プログラム」の最後の章で取り上げられている、PL/0(Pascalのサブセット的な言語)のコンパイラのプログラムリストはここで参照できる。興味のある方はどうぞ)
(以下の文章はまだ書きかけであり、しばらくの間(大小を問わず)追加や修正が随時入ることが見込まれます。あと、この文章の英語版もつくらなきゃね。書いた後に改めて眺めてみると、何か恐ろしいことを口にしてしまった気がしないでもないが、もはや手遅れである)
個人的なプログラムを書いたり、日本語でさまざまな技術的話題を語ったり、NerdTVのような(良質な)英語の情報を日本語に直すと いう作業はとても楽しいし、それが少なからぬ反応を呼ぶというのは、とてもうれしいことである。時間が許す限りこういった活動は続けていきたい、と思う。
だが日本語でのみ流通している情報を、日本語圏以外の人に伝えるということも、そろそろ本気で考えなければいけないのかも知れない。
今から2年前、2003年11月に、Smalltalker's Salon Mailing Listに僕はこんな文章を書いた:
日本語で良い論文やプログラムを作る人に「広めるためには英語も必要なのだ、使え」
と言ってそれでおしまいにするのはやはりためらわれる上、とてももったいない
と思う思いもあって、非常にもやもやしているというのが正直な気持ちでもあります。
# 未踏ソフトウェアなどを見ると特にそう思います。
もしかしたら日本語で書かれた良い論文やプログラムやそのマニュアルを
英文に書き直すことに徹する人が登場してもよい時期なのかもしれません。
英語の文章を日本語に翻訳するプロジェクトは昔から山のようにありますが、
そのエネルギーの10分の1でも逆の方向に振り向けられるようになればいいのに、
と思ったりする次第です。
と言いつつも日本語から英文への書き直しはとてつもなく大変な技量が要求される
タスクであることも十分に認識してはいます。それでもそういう人が必要なのでは
ないかという問題提起だけはしておきたいなぁ、と。(Smalltalker's Salon Mailing List (SML) 6356, 「Re: プログラムや論文に自国語を使うことの是非再び」)
こんなことを書いてから2年ほどの間、手に余ることを言ってしまったのではないかと思いながら、「まだ早い」と具体的な行動を先延ばし にしていたが、そろそろそんなことも言ってられなくなってきたようだ。『杉田玄白たち』に対応するような、『小泉八雲たち』が必要なのだと思う。
「でも小泉八雲は元々はガイコクから来た人だよね、『小泉八雲たち』というのも、こちら側(日本語圏)に住む人でなくていいのではないの?向こう側(英語圏)か らの努力に任せるというのがいいんじゃない?」という問いも出てくるかもしれない。しかし現在の状況を考えるに、こちら(日本語圏)の側から最初に火をつけ ることが必要なのだと僕は考える。一度火がつけば、日本語でも価値ある情報が数多くあることを知った向こう側(英語圏)から人がやってくることもきっとあ るだろう。まずは点火のためのマッチというか、エンジンを回すためのセルモーターという役目が必要で、今は日本語圏の人間の方が、それが出来るところに近 い距離にある、と思うのである。
もしもこれをプロジェクトにするならば、名前は"The Yakumo Project"としようと思う。「プロジェクト杉田玄白」や、その原型となった"Project Gutenberg"とは語順は逆であるが、これは読みやすさ、言いやすさを優先するため。"YAMDAS Project"と似ているのは(ちょっとした敬意も込めての)ご愛嬌、ということで。
# k.inaba [はじめまして。英語圏からの、日本語圏の情報が中で閉じているのがもったいないという趣旨の意見を何度か聞いて… http..]
# びい [着手する、行動するというのが重要だと思います。 行動する人の母国語がなんであるか、ということは関係のない、とても重要..]
# 佐野 [先日はバッテリありがとうございました。 本体が帰ってきたら有効活用させてもらいます。 訳すこと自体の能力自体は多分..]
# maida01 [始めまして。面白いですね。 10年前に、日本の素晴らしいミュージシャンを英語世界に 紹介したくwww.j-music..]
# 福盛 [皆様、コメントありがとうございます。 これが「一人プロジェクト」にはならないであろう、という確信が得られたのはうれし..]
by Hideo Fukumori
For the last few years, new waves of excellent articles, documents, and softwares are emerging on the web. The problem is, most of them are basically written in Japanese language, and that makes them inaccessible to the English-speaking world.
For the last few months, the English-speaking people started to see these waves, and several of those people began to voice their frustration of not being able to read them in English. Some of their words are harsh, making them sound like words of accusation. But I regard them as proof of the potential value of information written in Japanese language. I see them as cries for help.
It was two years ago when I first recognized this trend, but I postponed taking action, making excuses to myself like "it is not the right time", "I'm not up to the task", "is it really worth the effort?" and so on... Now I know I was wrong. I should not hide any longer. Someone has to introduce this emarging wealth of Japanese information to English-speaking world, and I'm going to give it a try.
And I hope you to join and see what we can do.
I wish to call this effort "The Yakumo Project" after Yakumo Koizumi (Lafcadio Hearn), a Greek-born English writer who came to Japan in late 19th century and made significant contribution in introducing Japanese folk stories to English world through his translation.
I still don't know where to begin, but one thing is certain; this effort is going to be like a coal fire that may last a few decades, not a firework that draws everyones attention and die down in a few months. The fire may take a while to catch on, but I'll keep trying.
Before...
# おごちゃん [本来の話とは違ったことですが、プログラムがどう分析されるものであれ、あの本そのものが難解です。「わかれば簡単なことを..]
# soda [んなに難解でしたっけ? 当時、私は計算機とは全く関係ない学科の学生に過ぎなかったんですが、Wirth の本の PL/..]
# soda [> んなに難解でしたっけ? copy&pasteするときに、行頭の「そ」が抜けました。失礼しました。:-) ]
# hyuki [結城と申します。まず、 > プログラムには「アルゴリズム」「データ構造」「インタフェース」の三つを揃えるべきである..]
# Tets [初めまして。大学生風情ながらコメントさせていただきます。 プログラムをグラフのように捉えてはいかがでしょうか? デ..]
# 福盛 [図に関する補足説明と修正について、取り急ぎコメントを。 まず、「アルゴリズム+データ構造=プログラム」の原題は "..]
# 福盛 [(ということで)すみません、直接の質問とそれに関係するコメントにだけ、まずは回答を。 結城さん: >・「インタフ..]
# しんのすけ [「データ構造+アルゴリズム」=プログラムでいいと思います インターフェイスっていうのは、もっと詳細なレベルでの設計時..]
# わ [しんのすけさんの意見に加え、プログラムも広義な言葉だと思いますので、このあたりをもう少し明確にしないと、ちょっと乱暴..]
# わ [すいません、とあるニュース記事の最近のエントリから飛んできたため、時間軸がずれたコメントを入れてしまいました。流して..]