2018-05-20

"UNIX プログラミング環境" Brian W.Kernighan & Rob Pike 著

前記事でマイク・ガンカーズの UNIX 哲学に浸りながら本棚を眺めていると、なにやら懐かしい香りのする一冊に目が留まる。ライアン・カーニハンとロブ・パイクの本... 20年以上前に買ったやつだ。
これら二冊を要約すると... 一つのことを確実にすっきりやる!それらをうまく協調させる!そして、インターフェースの基本は標準入出力を介して!... これが、UNIX 哲学ということになろうか。エリック・レイモンドは、UNIX は口承文学!と書いた。ドナルド・クヌースは文芸的プログラミングを提唱した。技術分野とはいえ言語を語るからには、やはり文学的に味わえる余地を残したい...

本書の考古学的な発掘のおかげで、改めて気づかされることがある。それは、辞書的な扱いのために、じっくりと読んだ覚えのない専門書が幾多も埋れていることだ。ヘネパタ本をはじめお蔵入りした高価な書群が、数段に渡って本棚を占拠してやがる。面倒臭がり屋は、これらを横目にハウツー本へ飛びついてきた。なんてもったいないことを...
仕事が忙しい!などという台詞は、自分自身を納得をさせるのに実に都合のいい、威厳をまとった言い訳である。そのために、本質的な考え方を疎かにし、盲目であり続ける。その方が幸せなのかもしれんが...
哲学をやるなら、精神が本当の閑暇を知らねばならない。
しかし、だ。プログラミング環境は、まず慣れろ!というのがある。まず触ってみて、書いているうちにその思想を習得していく。そのために手っ取り早く使い方から学ぶ。実際、理屈をこねても何も始まらない。本書を手にしたのは、sed, grep, awk といったコマンド群の教科書としてである。これらのコマンドを押さえるだけでも、かなりのことができ、しかも、フィルタやパイプの機能を通してシェルの設計思想に触れることができる。標準入出力を基本インターフェースとする考え方は、自分でこしらえるプログラムもこの路線に乗せることで、シェルの有難味を実感できる。そのインターフェースを司るのが、C言語でいうところの put/get 系関数。ただ、あまりコンパクトにしようとすると、正規表現の暗号めいた記述のために悩まされることも多い。
他にも、低レベルの入出力を提供するシステムコールの仕組み、ファイルポインタや i ノードへアクセスできる機構、nohup という端末を off してもプロセスの実行を続けてくれるコマンドなど、重宝したものである。
「複数のフィルタを結合して、1本のパイプラインにすることは、問題を解決可能な小問題に分解するのに役立つ。このようなツールの利用法こそは UNIX プログラミング環境の核心であるといわれることが多い。この見方は一面的に過ぎるが、フィルタはシステムのあらゆるところで利用されており、なぜうまく動いているのかを調べておいて損はない。」

さて、何をもって UNIX と呼ぶか?となると、人それぞれ。コンパイラ、エディタ、コマンド群といった環境の一群を指す場合もあれば、X Window などのグラフィックス環境までを含む場合もあり、はたまた、文書作成ツールや統計解析ツールといったパッケージ群まで含む場合もある。その名が Multics から継承されているので、真髄がタイムシェアリングにあることは確かであろう。
本書は、UNIX の特徴に、まずファイルシステムを強調している。階層化された構造こそが... と。用語ではディレクトリとファイルで区別されるが、マッピングの中身は属性が違うだけ。最初は、現在の作業場としてカレントディレクトリという概念から触れることになるだろう。
そういえば、新入社員の時代、この単純化した仕組みを理解するために、パーティションやセクタで管理されるディスクの物理構造の書に飛びついたものである。低レベルの物理構造を知っておくと、ディスクをアクセスする関数の構造もイメージしやすい。
Windows でも同じ用語を使っていたが、いつ頃からか、フォルダという用語で抽象化された。ディレクトリという用語に不都合を感じないが、文具用語としては馴染みがないからか?あるいは、Mac のパクリか?コマンドプロンプトでは、dir コマンドのままだけど。
「UNIX システム上ではあらゆるものが1つのファイルである。ファイルシステムこそ、UNIX システムの成功と、使い勝手のよさをもたらした核心と言える。」

ところで、UNIX の ls というコマンド名は評判が悪いという話も聞くが、どうだろう。list と directory がいまいち合わないらしい。
ちなみに、おいらは、sl コマンド好きで、必ずインストールし、わざと間違えてタイプする。そう、あの蒸気機関車 SL が走るやつだ。

また、UNIX のプログラミングスタイルを四つ挙げている。
  • 第一の姿勢... 汚れ仕事はマシンにやらせよう!人間は思考すべきことに集中すること。
  • 第二の姿勢... 仕事は他人にやらせよう!既存のプログラムを素材とし、それを結合し、シェルの思想、すなわちフィルタやパイプの機能に乗せること。
  • 第三の姿勢... 仕事は順序を踏んで行おう!最も単純なものからこしらえ、その経験を軸に拡張していくこと。無闇にオプションを追加して多機能主義に陥らないこと。
  • 第四の姿勢... ツールを作ろう!環境を自分だけのものにカスタマイズして自由を謳歌すること。UNIX システムは完全ではないので、修正の余地が多分にあるということを理解すること。
これらの姿勢は、今となっては当たり前といえばそうなのだが、当時は感動的であった。そして、構造化プログラミングからオブジェクト指向への布石であったようにも映る。結果論ではあろうけど...
UNIXは、ギークな自由精神を体現する場として発展してきたところがある。その経緯はオープンソース的で、ボランティア的ですらあり、極めて民主主義的である。そのために、やりたければ自分でやれば!と冷たく突き放される。だから自由なのだ。才能なき酔いどれ天の邪鬼は自由が欲しいと大声で叫び、才能あふれる UNIX グルは静かに自由を謳歌する...

ところで、この手の書に触れると、お喋りが止まらなくなるのは悪い癖。歳のせいか... いや、そろそろ引退勧告か...
おいらが UNIX に出会ったのは、30年以上前。マシンが一人一台なんて環境は贅沢、ハードディスクなんて高嶺の花だった。メインフレームを利用するにしても、CPU の使用料を部署ごとに予算化しなければならず、なんで社内の機械を使うのにお金が請求されるのよ?と愚痴ったものである。
なので、朝、出勤と同時にワークステーションの端末に社員が群がる。SunOS か、HP-UX かでも人気度が違い、BSD系と System V系の派遣争いが色濃く残っていた時代で、まだ Solaris の名は聞かない。
当時の記憶として、やたらと TSS(Time Sharing System)という用語を使っていたような気がする。いくらパソコンが革命的に出現したとはいえ、まっとうなマルチタスクを実現できたのはメインフレーム以外には UNIX マシンだけ。しかも、TCP/IP を標準装備し、ネットワーク環境が当たり前のように整っているのが魅力だった。
その時代からの名残であろうか。おいらは、いまだに母艦マシンが手元にないと落ち着かないネアンデルタール人だ。15年前の独立時、Solaris マシンに設備投資したが、今では、Linux が母艦マシンを担っている。厳密に言えば、Linux は UNIX とは認められていないが、UNIX ライクであることに違いはない。タダだし、システム要件も緩い。ただ、タダほど高いものはないとも言う。実際、参考書やらで意外と投資額は大きいが、啓発的な浪費ならば慰めにもなる。
ずっと Fedora を愛用してきたが、周りには Ubuntu 愛好家が多く、変わり者と言われている。Fedora の魅力はパッケージ群が豊富なこと。とはいえ、システム関係をいじれば時々フリーズする。特に、グラフィック系で。それでも、ほとんどリモートで CUI 環境で操作するし、視覚的に覗きたい時はブラウザを経由するので、大した問題にはなっていない。
しかし、だ。UNIX の本分は、やはり安定感であろう。惚れっぽい酔いどれは暗示にかかりやすい。そして、CentOS に鞍替えするも、酔いどれ天の邪鬼ゆえか...

0 コメント:

コメントを投稿