鏡の中の鏡,あるいは文科系コンピュータ屋のとまどい
since June 2 2005
アセンブラもまたアセンブラで書かれています.
— 某メーカのマニュアル

UNIX はジョークに満ちている.

UNIX は Multics という,豪華すぎるがゆえに失敗に終ったマルチユーザ・マルチタスキングのオペレーティング・システムの名を捩って命名された.「単細胞」という自虐めいたものかと思う.

***

もう三十年以上変りない UNIX のログインプロンプトはこうである.

login: isao
Password: sorehahimitu
...
	

どうして "login: " の先頭は小文字なのに,"Password: " は大文字なのか.システムの入り口からなんかヘンという気持を起こさせる.

一説によると,これは UNIX 開発当初の誤りであるが,いったんリリースしてしまった以上,このプロンプトを期待してプログラムを作ってしまったユーザへの影響を考え,頑なに仕様変更を拒み続けてきたとのこと.

UNIX は伝統を重んじるのだと.

ウソだろ.

ユーザ資産を無視した仕様変更を UNIX ベンダが行ったためしがないなどと誰が言い切れるのか.(ここでナンですが,UNIX は The Open Group の商標です)

政府から遠く離れたカリフォルニアの若者のひねりのきいた暗い知性を感じるのは私だけだろうか.

反体制のにおいがする.

なんとなく.

ソフトウェア技術者の "地" はアンダーグラウンドなのだと思う.

バークレイ発のフリーウェアには,皮肉なしかけがあるんじゃないか,すごいトラップドアがあるんじゃないかと思ってわくわくする.sendmail, bind, tcl, perl, etc., etc...(実際はそんな不埓なプログラムではないが)

***

GNU のフリーソフトウェアのライセンスは copyleft と呼ばれる.コピーライトを認めないからコピーレフト.

GNU は「GNU IS NOT UNIX」の略で,その定義のなかにすでに "GNU" が入れ子になっている.

***

UNIX において,普段は待機しているがあるイベントでむくむくと起き上がって仕事をする常駐プログラムを,「デーモン(daemon)」という."〜mon" なる命名をよくする.Oracle にも "qmon" という要求待ち行列(キュー)を監視するデーモンがいたり,実世界には M & A の機を窺う "horiemon" などもある.

ギリシア神話のダイモン・守護神に由来するそうだが,一方で悪魔(damon)をも示唆しているに違いない.

***

親プロセスが後始末をしないで終了した子プロセスを「ゾンビ」という.計算機資源をムダ使いする一因である.

放っておけないね.

おもしろいことに,親プロセスが子プロセスを続けて二回生み(fork)し,一回目の子が死ぬ(終了する)と,二回目の子(つまり一回目に fork( ) されてできた「子」のなかでさらに fork( ) された,すなわち「孫」...)は,親プロセスのさらなる大親分(init)が親の地位について孫の後始末をするため,ゾンビにならずにすむという.

いったいどういう神話に基づいた仕様なのか.

親が子の面倒を見るのは現実世界と同じだが,死を看取る必要まであるのかは如何.

***

私が職についてはじめて触れた計算機は数十億円の大型汎用機システムであった.八十年代後半の当時は普通のこと.

システムの標準入力装置はキーボードではなくカードリーダ,標準出力装置はディスプレイではなくラインプリンタであった.いずれもマシンガンのような雄叫びをあげる機械であった.

ジョブ制御言語を一行あたり一枚のカードにパンチ,カードの並びを確認してリーダにセット,システムに読込ませる... とオープンリール磁気テープ装置がガガガガガと勢いよく回り出す.

いまだに私には「計算機」というほうがピンとくる.マシン室はオフィースというより工事現場に近い.ここで一点の誤りも許さない計算機の寡黙なリゴリズムと納期への恐怖とに虐げられて,生身のSEは何日も徹夜するはめになる.「電脳」などという魔法おとぎ話も,「コンピュータ」というカタカナ語の放つデジタル・ナルシスもありはしない.

いま,オペレーティング・システム VOS3 最新のバージョンを組込む.

そのために,SOS(スタータ・オペレーティング・システム)つまり一世代前のオペレーティング・システムを組込み,これを使って最新システムを生成するのである... この作業をシステム・ゼネレーションと言う.なんで OS を入れる準備としてその親 OS を入れなければならないのか.SOS の力を借りて,アセンブラ言語で書いた周辺装置などのユーザ独自の設定情報をアセンブルし,新バージョンの OS とリンケージするのだ.

まるで王位継承の儀式のようなことをやっていた時代があったのだ.(いまも執り行っている計算機ユーザは当然います)

***

大型汎用機でもっぱらアセンブラ言語(計算機言語の世界の古典ギリシア語)でシステムを記述していた時代には,プログラマは OS という専制君主のもとにデモクラティックに振舞わねばならなかった.たくさんのユーザがシステムを共同利用していることを意識して,あるきまりを守ったものである.

プログラムの開始時には,OS のタスク切替え(たくさんのユーザへのサービスの切替え)のために,計算機に十数個しかない共用のレジスタ内容(それはよそ様の途中の計算内容)を己のメモリ領域に保存し,かつ特定のレジスタでその番地をポイントした上で,やっと自らの課題解決に向けて飛び立つ,というマナーを守らねばならなかった.そして終了時には,この保存領域からレジスタの値を回復してはじめて OS にさよならを言う.そうすることで OS によって,タスク切替え時点において別のプログラムのためにレジスタが横流しされても,再び自分の番が回ってきた際,今度は別のプログラムが保存しておいてくれた己のレジスタ内容で復元されて,何事もなかったように自分の仕事が再開できるわけである.あたかも共用のレジスタ資源をひとり占めしているかのような自由を手にすることができるのだ.

DEMOCRAT START                      * STARTING PROGRAMME DEMOCRAT
*                                   * DEFINE REGISTERS MACROS
GR0      EQU     0                  * SYSTEM USE
GR1      EQU     1                  * PARAMETER LIST ADDRESS
GR2      EQU     2                  * WORK
GR3      EQU     3                  * WORK
GR4      EQU     4                  * WORK
GR5      EQU     5                  * WORK
GR6      EQU     6                  * WORK
GR7      EQU     7                  * WORK
GR8      EQU     8                  * WORK
GR9      EQU     9                  * WORK
GR10     EQU     10                 * BASE REGISTER 1          
GR11     EQU     11                 * BASE REGISTER 2          
GR12     EQU     12                 * LOCAL RETURN ADDRESS     
GR13     EQU     13                 * SAVE AREA POINTER        
GR14     EQU     14                 * RETURN ADDRESS           
GR15     EQU     15                 * ENTRY  ADDRESS           
*                                                              
DEMOCRAT CSECT                      * CONTROL SECTION
         USING   *,GR15                                        
         B       SAVEREG                                       
         CNOP    0,4                                           
SAVEAREA DC      20F'0'             * AREA FOR SAVING REGISTERS
SAVEREG  STM     GR14,GR12,12(GR13) * SAVE REGISTERS: 14-12
         LR      GR10,GR15          * SET BASE ADDRESS 1 TO GR10
         LR      GR11,GR15                                     
         AH      GR11,*+8           * SET BASE ADDRESS 2 TO GR11
         B       *+6                                           
         DC      H'4096'                                       
         DROP    GR15               * BASE ADDRESS  = DEMOCRAT  
         USING   DEMOCRAT,GR10,GR11 * BASE REGISTER = GR10,GR11
         LR      GR12,GR13                                     
         ST      GR13,SAVEAREA+4    * SAVE REGISTERS: 13
         LA      GR13,SAVEAREA      * POINT TO SAVE AREA
         ST      GR13,8(GR12)       * SAVE GR13
*
MAIN     ・・・・儀式は終り.さあ仕事,仕事・・・・
*
GOODBYE  L       GR13,4(GR13)       * RECOVERY OF REGISTERS: 13,
         RETURN  (14,12),RC=0       * 14,15,0,1..12 & NORMAL END
*
    

このサンプル,MAIN 行以外はすべて段取り,後片付けである.

こうした時候の挨拶,儀式のような定型処理をはじめ,プログラムをいかに効率よく,簡潔に,スタイリッシュに書くかということを当時のプログラマは競い合った.レジスタの扱いやデータ領域の持ち方など,その書法で仲間うちの誰が書いたのかさえ分かるくらいであった.まるで詩文学サークルである.「なんだ汚ねえコード」,「なにを頭っからちんたら探すのか,バイナリサーチをなぜ使わない,バカかおめえ」なんて私も批評されたものである.天から授かった貴重な,貴重な記憶域,限られた実行ステップをギリギリまで削った—1989年は X'89' で十分だ,2000年には不都合があるだろうけど,その頃にはこんなに貧しくはないすばらしい時代がやってくるはずだ.見た目は二の次でもよいから目的にそぐわない余計な計算は断じてしない,飾り立てずとも計算結果こそがダイヤモンドのように映えるはずであった.

CPU 能力が飛躍的に高まるとともに主記憶容量も莫大になり,C や Java など高級言語で書くのが当たり前となった現在では,これに類した前振り,後始末は言語プロセッサが自動的にやってくれ,誰も気にしなくなった.計算機の大衆化とともに,いまや散文の,いやおしゃべりの時代がやってきた.分かりやすく書くことがプログラマの最も重要な課題である.原稿料を稼ぐため用紙を書き散らすのとまさに同じように,ふんだんにコードを書いて工数をいただく.

オヤジじみているが,次に言いたいのはだいたいお分かりかと思う.現在はプログラミングのマナー,様式感覚などない.同じ計算機を皆で効率よく使う,なんて考えないばかりかウィルスをばら捲いてよそ様の計算機資源まで喰い潰そうとするものもある.それが技術だと思っているフシさえ窺えないこともない.「自動化」のもたらす頽廃か.

***

こんな計算機パワーの豊かな時代,HTML の作法にはうるさい方々が増えているらしい.しかるべき規格に則ってどのブラウザでもきちんと表示できるよう心がけなければならない,外観要素の実現はスタイルシートで指示しなければならない,テーブルの多用は表示性能・ソースの可読性の点でやるべきではない,etc.,etc.まさに正論である.私の HTML はお行儀が悪い.誰もご覧にはならないだろうけど.

***

大型汎用機の機械命令に NOP 命令というものがある.「何もしない」という命令である.

TeX には \relax というプリミティブがある.「何もしない」という命令である.

最高のデジタル・ジョークか.計算機プログラムにおいても,沈黙は時に雄弁に勝ることがある.

***

「アセンブラもまたアセンブラで書かれています」

そのアセンブラもやっぱりアセンブラで書かれているのだ.

***

「無限ループ」

この世界には無限があったのか.

***

「a = a - 1;」

a から 1 を引いても a だ?

オレの財布から一万円使っても,もとの財布だといいんだけど.

***

「本ソフトウェアはオペレーティングシステムからのエラー報告を受けるとまず最初に回線を再度接続しようと試みます.retrytimes 値の再試行ののち,再接続が不可能な場合は,exitfunc に従って後処理を実行しようとします.」

ソフトウェアは生き物か?

***

ソフトウェアのマニュアルは,書いても読まれないもののひとつである.

***

「再帰的関数呼び出し(recursive call)」

関数が自分のなかで同じ自分を呼出す.呼出された同じ関数はやっぱり同じところで同じ自分を呼出す.

/* 二項分布確率計算  Binomial distribution            */
/* p値1/6のサイコロを50回振り同じ目がk回出る確率を計算する */
#include <stdio.h>
#include <math.h>
double  nCr(double, double);

int
main(int argc, char **argv)
{
    double  p=1.0/6.0, n=50.0; /* p値1/6のサイコロを50回振る */
    double  y, k;

    printf("** n: %3.0f; p: %5.4f; mu: %5.4f; s^2: %5.4f;\n", 
           n, p, n * p, n * p * (1.0-p));
    for (k=0; k<=n; k++) {
        y = nCr(n, k) * pow(p, k) * pow(1.0-p, n-k);
        if ((y >= 0.000000001) || (k >= n) || (k <= 1.0))
            printf("%3.0f\t%12.8f\n", k, y);
    }
    return 0;
}

/* 組合せ計算 */
double
nCr(double n, double r)
{
    if (r < 1.0)
        return 1.0;
    else
        return n * nCr(n-1, r-1) / r;
}
	
***

マリアから愛を告白された Computer J* 君は,4,082 年と,12 月と,24 日の後に「僕もだよ」と応えるだろう.32 bit,だいたいの時間だけど.

#include <stdio.h>
#include <limits.h>
#include <unistd.h>

int
main()
{
    long thinking=LONG_MAX;
    printf("Maria :\n\tI love you. Do you love me?\n\n");
    printf("Computer J* :\n");
    while (thinking--) {
        printf("\t...\n");
        sleep(1);
    }
    printf("\t!\n\tYes, I love you, too.\n");
    return 0;
}
	
***

プログラミング言語で詩を書くひとがいる.私にはまだ,米国人のジョークの一変化球としかとらえられないけれど,これは思うに日本人にはマネできない.成績優秀の理科の君にはわかるかな.ところでこのプログラムを実行しても黙して語らず.Proust だよ,君.

for (long => time) {$early && $self->went($bed);}
rand time && do {
    while ($candle--) {
        (time => $eyes->shut()) < (time => print "Falling asleep!")
    }
};
	
Simon Cozens, "Advanced Perl Programming, 2nd Ed.", O'Reilly
***

銀行預金残高を書き換えるコンピュータ犯罪の犯人はすぐ捕まる.

彼はその高度なテクニックを言い触らさずにはおれないからだ.

官庁のホームページを改竄した犯罪グループはなかなか捕まらない.

あまりにレベルが低くて誰にでもできるからだ.

というか愛国無罪か.

***

最近とあるジョーク集を読んだ.こんなのがあった.

問い:2004年,アルバニア軍のコンピュータ系統が一斉にダウン.どうして?
答え:2000年問題.
    

あんまり笑えない.

***

もう十余年前,まだ Windows 3.1 が全盛であったころ,ある検索サービスシステム開発において,サーバに接続して有料サービスを受けるための Windows クライアントソフトウェアをサポートする仕事をしたことがある.そのころはシステム設計だけでなく顧客の手に負えない仕事はなんでもしてさしあげなければならなかったのだ.そのサービスのユーザは事務方ばかりで,私はエンドユーザの事務所に出向いて PC の設定までした.況やまだ PC の利用もネットワークも特殊技術に属していたわけで,ISDN-PPP による TCP/IP 連動に関わるユーザ電話サポートはただごとではなかった.

顧客:あのー,プログラムが動かないんだけど.画面がうんともすんとも
   いわないのよー.
私 :一度電源をお切りになって,これから申し上げる操作をしてみて
   いだだけますか?
顧客:電源を切った....で,スイッチ入れたよ.
私 :(しばらく待って)立ち上がりましたか?
顧客:え?...分かった,はい.
私 :プログラムマネージャというボックスに XXXX という OOOO の絵が
   あります.それをダブルクリックしてみてください.
顧客:まだ砂時計しか出てこないよー.いや,でも,なんで立たないと
   いけないのかな?
私 :(.......)す,すみません,お立ちになる必要はありません,
   お座りください.ところでプログラムマネージャは... 
    

こんなのもあった.

顧客:XXXX を動かせないんだけど.
私 :いま画面になにが出ていますか?
顧客:OOOO の絵(XXXX のアイコン)が見えるんだけど矢印がそこにいか
   ないんだよ.
私 :マウスを操作しても矢印が動きませんか?
顧客:動く動く.
私 :ではマウスを滑らせて矢印を OOOO の絵に合わせてダブルクリック
   してみてください.
顧客:それがどうしてもいかないから困っているんじゃないか.
私 :マウスに応じて矢印は動くんですよね.
顧客:動くよ.でも机の端にきてしまってマウスをそれ以上動かせないん
   だってば.
	
***

情報リテラシーを少しなりとも身につけた人なら,LaTeX の表記を見てことさら違和感を覚えたりしない.ラテフとか,ラテックとか,レイテックとか読むことも知っているはずである.

しかし白状するが,私は最初に "LaTeX" の表記に出逢ったときは UNIX 一流の冗談かと思った.これはラテックス・コンドームの捩りだと.だから私は,あまり計算機のものごとを知らない人には,決して LaTeX については「書かない」ことにしている.

D. クヌースの『文芸的プログラミング』の訳者あとがきだったと思う.LaTeX のことを「ラテックス」と表記していた.この訳者も私と同じ部類に属する方かもしれない.

***

Windows も Mac も優れた OS だが,そんなこんなで UNIX はなにか度し難い,ブラックな奥行きを秘めている.実はこれが私の,UNIX を使い続ける本当の理由である.

ユーザがシステムに惹かれるのはなにも品質ばかりではない.Windows はバグだらけとの話はよく聞く.それは夥しいユーザ数の証であって,ジョークのネタとしてもこと欠かないわけだが,ゆえに Windows が好きというひとがいればおもしろい.Mac はお洒落という陳腐きわまりない称賛よりよっぽど.ところで私も Mac を使っているけれど,ノーマルな操作で固まること度々であり,可愛いだけで頭の悪い女に抱く苛立ちを,時おり覚える.

ルーマニアの IT ジョークにこんなのがある.

ビル・ゲイツ率いるマイクロソフトが,新しく自動車業界に進出することになった.
しかし,できあがった車は以下のようなものだった.
  1.特に理由がなくても二日に一度は突然動かなくなる.
  2.高速道路ではそれが特に顕著である.
  3.こうした場合,最悪のケースとしてはエンジンを総取り替えしなければならない.
  4.ユーザは新しい道ができるとそのたびに,新しい車に買い替えなければならない.
    
早坂隆, 『世界の紛争地ジョーク集』, 中公新書クラレ

その安定性を持ち上げる UNIX の信者がいるけれども,UNIX だってバグは多い.私は FreeBSD を使っているんだけど.(ここでナンですが,FreeBSD は UNIX ではなく UNIX クローンの OS です)

***