トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

MayCodeBeWithYou

Last-modified: 2008-02-24 (日) 19:49:36 (925d)
Top / MayCodeBeWithYou

以下の文章は雑誌連載のために書いた文章です。ディレクトリを探しているとたまたま見つけて、寝かしておくのももったいないなと思い、ここに載せます。なにごとももったいない精神が大切。


 TransTECH 連載
 はじめる!PC-UNIXプログラミング
 第 10 回 (最終回)
 Auther: すずきひろのぶ

プログラムとは何だ?

突然の出来事

突然のことではありますが諸般の都合により今日でこの連載が終ることになり ました。PC UNIX上で実際にプログラムを書きながら、色々ソフトウェアにつ いて考えていこうとしていたのがこの連載の主旨です。

なんの心の準備もなかったのですが、いきなり最終回ということで、少々乱暴 でもプログラムに関して考えるということのまとめに入ってしまうしかありま せん。人生は待ってくれないという良い教訓です。

さて今回は最後ということで「ソフトウェアとはいったい何から出来ているの か?」ということを筆者なりに考えてみます。連載を続けていく過程で、その 実際のプログラムを組み立てながら考え方を徐々に展開するつもりだったもの が、もう時間がないので、駆け足でまとめてみたいと想います。

ではあらためて、「ソフトウェアとはいったい何から出来ているのでしょうか? と質問してみます。 「CPUを動作させる命令群」という答えをする人も多いかと思います。残念 ながら、それだけでは実行コードのことを説明しているだけになってしまいま す。実行コードは、CPUの命令の集合で、どのようにCPUが動作するかを 指示しているものです。 「いやいや、それでもアセンブラコードは実行コードとほとんど同じようなも のですよ」と言われる方も出て来るでしょう。しかし、それでもやはりCPU をコントロールするための命令群です。 では、Cで書いたら、どうなのでしょうか?あるいはPerlで書いたらどう なのでしょうか?これも、そのコードだけを考えるとCPUをコントロールす る命令群をさらに抽象化した別の命令群でしかありません。

制御構造と表現

ハイレベルの制御構造がある言語を使ったからといっても「その言語を用いた コードを書いた」ということにはなりますが、筆者の考える所のプログラムが 書けたということにはなりません。

ここで言う筆者の考える所のプログラムとは身近な世界に例えるなら、私達の 使っている「言葉」と対比できます。その言葉を使って自分の考えたこと、想っ たことを伝えるための表現することです。もちろん言葉遊び的に、断片的な言 葉の集まりを羅列したり、あるいは決められた言葉を組み合わせることによっ て相手に伝えることはできます。たとえば電話で時報を聞いた時を想い浮かべ て下さい。その「事実」を伝えるために音声合成システムを使い時間を通知し ます。しかし、これはここで述べている「表現」の範囲には当たりません。

『表現』とは人間の知的活動の中でも最も高度な部類に入る外界との コミュニケーションの1つです。その表現をするための道具の1つ私達は「言 葉」というものを使います。言葉によって表現が行われることをまた別の形で 行ったことが

プログラム書くということは、言葉と表現のコンビネーションにより成立した 状況を意味していることと同様なものではないかと筆者は考えます。そしてプ ログラムとは、1つの比喩としてですが、人がコンピュータという機械を通し て行う表現の手段ではないか。そして、制御構造は言語としてのもつ構造であ ると言えるのではないか、と。

コミュニケーション

コミュニケーションとは自分と相手との情報のやり取りです。ここで考えるコ ミュニケーションの範囲ですが自分は常に一人なので、一対一あるいは一対多 の間でやりとりになります。厳密には「やり」と「とり」という具合にインタ ラクティブであること、つまり双方向の関係にありますが、このままでは時間 的な制約に支配されてしまします。相手と自分の時間が共有することで、厳密 な意味でのインタラクティブ性が確保させなければいけないからです。

それでは大変なので時間的な制約を緩くした形で考えてみます。たとえば、出 版という形で世に問い、その読者からあるいは世間から著者に反響が戻ってく るということをイメージしてみましょう。これは時間的に非常に緩い形でのコ ミュニケーションだと言えます。

さて、人間が行う表現によるコミュニケーションには1つの特徴があります。 それは自分の頭の中で思い描いている形にならない抽象的である内容を、情報 として相手に伝えようとすることです。相手に伝わって、相手が理解すること、 それは自分の頭の中にあった内容が、正しく伝わったかの議論はひとまず(あ るいは永遠に)横においておいて、相手の頭の中にも存在しはじめるというこ とです。 このことに観念とか概念とかいう言葉を当てはめますが、いずれにしろ形のな いものです。情報というものが形がない、というわけではありません。情報は 言語であり、言葉の並びであり、ビット列であり、何らかの形で定量化できる ものです。情報という器に概念という形のないものが注がれます。 つまる所、概念という掴みどころのないものを入れる器であれば、何であって も構わないわけです。逆に概念が乗ってしまえば、それは情報ということにな ります。

コード

さてソースコードのコードです。コミュニケーションする同士での共通の理解 として存在する規約がコードです。このコードの意味は記号論の世界でもだい たい似たような定義がされています。

そのコードを作る自分と、それを受け取り読み取る相手で共通の規約があるの でコミュニケーションできるわけですが、これはみなさんが、そして私ががプ ログラムを書くことと本質的に同じです。

私達はコンピュータを思い通りに動かそうとしてコードを書きます。思い通り に書く、つまり抽象的な概念をコードという形で結実させるわけです。抽象的 な概念をコード化するわけですから、それなりに冗長性が必要です。短くいっ てしまえば、大きなコードになりがちだということになり、短いコードの中に 抽象的な概念まで組み込むことは不十分であるということになります。このコー ドはまったく違う3の顔があります。まずコンピュータに対しての命令として のコードです。コンピュータは今の所は概念を理解できないので、これは明白 にコミュニケーションではありません。2001年宇宙の旅に出て来たHAL9000の ようなコンピュータが出てくるまで待つ必要があります。

次に、そのコードによってコンピュータを動かすことです。これには2つの場 合があります。人間が接することがないコンピュータに用いられるもの。もう 1つは人間が接するコンピュータ上で、直接人間が操作する、あるいは人間が 利用するものです。後者には時間制約の弱いコミュニケーションが発生します。

最後にコードを人間が読むということを考えてみましょう。時間的制約は緩い 必要がありますが、これは立派なコミュニケーションです。

現代ではインターネットなどという情報の伝達における空間的距離を0にして しまう全世界規模の計算機ネットワークがあります。そこで公開されたソース コードは、瞬く間に全世界からアクセスされ、コピーされていきます。もちろ ん、コピーするに価値のあるコードですが。そのコピーされたコードはコンパ イルされ利用されると同時にそのコードは、また別の人間によって読まれるこ とになります。その反響は、たぶん多くはバグ報告で、少しは改良コードのフィー ドバックでしょうが世界中からやってきます。改良コード、といってもコード 形式的な改良ではなく、もっと使いやすくするとか、新しい機能をつけるといっ た抽象化的なレベルで行われることの結果としてのコードですが、送られてく るでしょう。このようにコミュニケーションが成立する状況が現在はあるので す。

もちろん、すべての人間が読むわけではありません。コードの大切な定義であ る、コミュニケーションする同士での共通の理解として存在する規約というこ とを思い出してください。このコードを共通の理解とできる人達に取ってのみ 利用できるものですが、プログラムのコードは、コミュニケーションのための コードであるのです。

コードと共に

	May code be with you! (コードと共にあれ!)

これはハッカー達が好んで使う言葉の1つです。説明するまでもないですが、 このハッカーとはマスコミが興味本位に垂れ流す通俗的な意味でのハッカーで はなく本当の意味でのハッカーです。

このMay code be with youはスターウォーズの中のセリフMay force be with you (フォースと共にあれ) のパロディーですが、ジュダイの騎士はフォース が備わって始めてジュダイの騎士となりえるように、ハッカーにはコードがあっ てこそ始めてハッカーとなりえるということなのでしょう。

ハッカーにはコードの操作、つまりコードを書く、コードを読むこと、それか ら発生するコードが語る意味(概念)を理解するということが、我々が普通に使っ ている言葉を使っての活動(あるいはパロールと呼ばれる言語行為)と同じもの になります。

とはいえコードだけがあればコミュニケーションできる、あるいはコードさえ あれば理解できるというものではないのは言うまでもありません。コードは、 その時点で既にいくつもの情報をそぎおとしているからです。そのコードがど のようなコンテクストの中で使われるかが問題になってきます。ここでのコン テキストとは、コード全体、システム全体、利用する環境まで含めたもの、あ るいはユーザまで含めたプログラムを取り巻くすべてという具合に広い意味で のコンテクストと考えてください。

コードでコミュニケーションするものに取って、つまりハッカーに取ってコン テクストとコードは緊張関係にあります。コミュニケーションという観点から 考えると、コードが不完全であれば、コンテクストには依存度が高くなり、逆 にコードが完全であればコンテクスト依存度は低くなります。一方でコードは、 コンピュータによって処理されることを前提とされていますので、その表現に かなりの制約を受けます。

広い意味でのコンテクスト依存といっても、言語のコンテクスト依存のレベル とハッカーの依存しているコンテクストとはすいぶん違います。コンテクスト に依存するということでは、ハッカーズディクショナリーに出て来る"The Story of Mel, a Real Programmer (本物のプログラマ、Melの物語り)"が思い 浮かびます。命令アドレスをインクリメントするとオーバーフローが発生し、 キャリーによってオペコードに1が加算され、それがジャンプ命令になるとい う話が出て来ます。単にトリッキーな技法といえば、それまでですが、しかし、 これは1つのコンテクスト依存のコードだとも言えます。また、それが単純に コードによる表現を越えた、表現だともいえます。本人はさして意識せず、た んなる思い付きのトリッキーな技法に対する過大評価なのかも知れません。し かし、Melの話を書いた人である受け取る側にすれば芸術様式とも思えた(と、 Melの話の中では書かれている)このコードは、芸術様式とも思わせるという概 念を伝えたことになります。

つまる所プログラムとは

準備がないまま突然来るべき時が来てしまって、慌ててまとめているので、な んやらこ難しい文章になってしまいましたが、ここでプログラムとはという部 分に入ってしまします。

ある一部の人間達には、それはたぶんハッカーと呼ばれるレベルの人達に取っ てですが、プログラムとは自己表現であり、言行為であり、そしてコミュニケー ションであるということが少しはお分かり頂けたかと思います。

ソフトウェアはコードだけではなく、コンテクストまで含んだ広い世界になる はずです、という議論をする時間がありませんでした、ごめんなさい。

プログラムを記号論的視点から、さらに広げて考えてみるというようなことは 何故かしないのです。多くのコンピュータ科学者や言語学者がプログラムコー ドは機械の制御命令であると思っているからなのでしょうか? しかし、現実 にはハッカーはコードとは小説やエッセイ、あるいは知的活動の結晶だと知っ ているのです。クヌースの文芸的プログラミング論にもその香りがあります。

ハッカーに取ってコードが独占され、そして隠されることは、外界からの隔絶 と同じことになってしまいます。だからこそハッカーは本能的に自由にプログ ラムを組めること、ソフトウェアは自由(フリー)にすべきだと考えているので はないでしょうか。

おしまい

1307