カガミノナカノカガミ

プーシキン・コンコーダンス・システムを作り直そうと,余暇に再設計をやっている。いろいろ考え,核となる単語解析エンジンはやはり C/C++ で書くことにした(現行の版は C である)。ところが最近,もっぱら Perl, Java,JavaScript ばかりを弄っているので,C/C++ コーディングの勘所を忘れてしまい,会社の行き帰りに C++ 本,スティーブ・オウアルライン著『C++ 実践プログラミング』,デイビッド・クリ著『UNIX C プログラミング』を読み直している。私は仕事でシステム設計をやっているけれども,もう 20 年くらい業務に関るプログラム・コードを書いておらず,プログラミングは日曜大工でしかない。1990 年代に出た C/C++ の本を眺め直すにつけ,懐かしいやら,もの忘れの酷くなった己に呆れるやら,この年になって自分が何をやって来たのか,やっているのかわからないブルーな気分になってしまう。

C はその言語仕様が極めてシンプルであり,薄い教科書(カーニハン,リッチー『プログラミング言語 C』)一冊を丹念に読めば,たいていのことができるようになる。C を好むプログラマは大概「ものぐさ」だという印象が私にはある。覚えることが少ないので私も C が好きである(念のため言っておきますが,C はプログラミング言語の C のことであり,アレのことではありません)。私はその昔,PL/I という高級言語(IBM が作った最強のプログラミング言語)を会社の教育で勉強させられたが,その言語仕様マニュアルの膨大さに呆れ,また一方で C の対照的な単純さにも大いに呆れたものである。

ところが,C の拡張言語である C++ の本はというと,逆に分厚いのが多いのにまたもや呆れる。『C++ プライマー』という有名な本があるが,「初心者」という名の本なのに,邦訳で 1000 頁近くある。最近出たビャルネ・ストラウストラップ(C++ の設計者として超有名なソフトウェア科学者)の『プログラミング入門』だって 1127 頁ある。「ものぐさ」を自認する私は,当然ながら C の教科書くらいに薄い本,グレゴリー・サティア,ダウグ・ブラウン共著『C++ プログラミング入門』を読んで C++ を触るようになったが,これとてオブジェクト指向・クラス概念に解説の焦点をあてた,しかも C プログラミング経験者(構造体や共用体,ポインタの概念,これらをどういうときにどう使うべきかを知っている人)を大前提とする,とても言語入門書とは思えない,難しい本であった。要するに C++ は,たくさん読んで勉強しなくちゃいけないのである。

C/C++。仕事のシステム開発で用いる言語はほとんどこれ。「プログラミング」と一般的にいうとき,暗黙裡に頭にある言語は C/C++ である。Web アプリケーション全盛の最近は,ようやく Java もそれなりにシステム記述のメイン言語として採用されるのだが,Java による開発のための生産技術・ノウハウの蓄積は C/C++ の膨大さには遠く及ばない。いつも仕事で身近に接しているのに,この懐かしさはいったい何なのか。何でいまさらプライベートの日曜大工で C/C++ なのか。本棚の奥にしまい込んであった C/C++ 関係の書籍を引っ張り出して眺めていると,ああこんなコードをオレも書いていたなぁ,なのにいまやもうまったく忘れてしまったなぁと,ヘンに哀しくなる。

と,C のシステムプログラミングの本といっしょに,20 年以上前に仕事で書いた,わが社のロゴが印刷されたコーディングシート(※)が出て来た。ああ,私が設計したとある特許情報オンライン情報検索システムの,接続端末台数をロギングするプログラム。HITAC アセンブラ。C/C++ が昔必死こいて学びいまもしょっちゅう付き合わされているフランス語だとしたら,これは古典ギリシア語のようなものである。古典文化の精華だったギリシアもいまやデフォルト債務危機で冴えない国家であるごとく,アセンブラは絶滅危惧種プログラミング言語といってよい。もう開いた口が塞がらない,そういうシロモノである。

※プログラムを作るとなるとすぐパソコンの前に座ってキーボードをカチャカチャやりはじめる人には,コーディングシートとは何のことか,わからないかも知れない。プログラマは,かつて,詳細設計を終えた段階でプログラムをまず紙,すなわちコーディングシートに手で書き入れ,机上でデバッグして誤りを訂正し清書した上ではじめてパンチャーに渡す。パンチャーはこれをカードにパンチする。さらにセンタオペレータはこれをカードリーダに読み込ませてシステムに入力する。それからはじめてプログラマは端末の前に座るわけである。昔は計算機使用料がとてつもなく高価だったので,コーディングで計算機を使用しないこのようなプロセスを選択したわけだ。

何だ? システム仮想記憶の CSA(システム共有エリア)の情報を一定時間毎に取得するプログラムと,こいつに起こされたり寝かされたりしながら情報をディスクに書き込むプログラム,そして時価数十億の計算機・大型汎用機のシステムコンソール(それは最高執政官コンスルにだけ許可された指令席)からのコマンド操作で動作をコントロールするプログラム。次のコードは最初のプログラムのごく一部である。

* COM LOGING CYCLE CONTROL
K1GET    GETCOM  COMID=K1
         C       GR15,=F'0'
         BNE     ERRMSG
         ST      GR1,K1ADR
         ST      GR0,K1LEN
*
JUMBI    POST    ECB0
*
LGCYCLE  WAIT    1,ECB=ECB1,LONG=YES
         MVI     ECB1,X'00'
         CLC     ECB1+2(2),=X'0001'
         BE      RTNNRM
         B       GETINFO
LGPOST   POST    ECBLG,5
         B       LGCYCLE
*
K1ADR    DS      F
K1LEN    DS      F
...

パラパラ捲って眺めたが,何がなんだかさっぱり記憶を失ってしまっている。GETCOM でシステム共通メモリエリアを取って来て,ええと,寝ているタスクを POST で起こして,今度は自分が ECBWAIT している? システムマクロはレジスタの 15 番にリターンコードを格納して帰って来るから,それを C して(アレのことじゃないよ,Compare だよ)チェックしている? OK なら 1 番レジスタに入っている共有エリアの先頭アドレスを K1ADR にストアする... 大型汎用機(メインフレーム)というほとんど過去の遺物。オレ,いままで何やって来たんだろうか。まるで鏡の中の鏡を覗いているような,何か果てしない乾いた空虚に閉じ込められているような気分になる。

年は取りたくない。いかん。このアセンブラ・プログラムは厳密に言えば業務情報である。焼却処分ぢゃ。

C++実践プログラミング
スティーブ・オウアルライン
望月康司 監訳
オライリージャパン

本書はお勧めの C++ 参考書である。C++ コーディングのツボのみならず,プログラムの設計段階の注意事項,gdb シンボリックデバッガの簡単な使い方など,プログラムを作る営みそのもの,ライフサイクルへの配慮が心憎い。浮動小数点の精度に関する記述もきちんとされていて,日本人の著者がどんなに気を利かせても米国のソフトウェア技術者にはとうてい適わないという感を強くする。

ちなみに,だが,著者 Steve Oualline には,おそらく C 言語が染み付いている。

class linked_list {
    public:
    ...
        // リンクリストの初期化
        linked_list() {first_ptr = NULL;}
    ...

こういうサンプルコードを見ただけで,著者 Steve は C++ よりも C が好きなんだなということがわかる。はじめから C++ で育てられプログラマなら,クラスのポインタの初期化に NULL 定数を書かず,ただ 0 と書くだろう。どちらも同じなんだけど。プログラミングにも「文体」があるのである。

UNIX Cプログラミング (NUTSSHELL HANDBOOKS)
デビッド・A. クリ
アスキー編集部訳
アスキー

ソフトウェア技術関連図書ではまず間違いなく筆頭にあがる米国のソフトウェア書籍出版社 O'Reilly の邦訳書籍は,最近ではオーム社が独占的に出版権を有している。けれども,昔はアスキーやソフトバンクから出ていたものである。いまや絶版になったこの UNIX システムプログラミングの訳書も,アスキーから出たものである。

本書の翻訳文体は「である」調であって,現在主流の「です・ます」調に気味悪さを感じる古くさい私なんかには好感が持てる。20 代に首っ引きで読んだ本書を,コンコーダンスのインコア操作,シグナル処理のために,私はいま再びブルーな気分で読んでいる。でもなぁ,fork() だの,setjump() だのの UNIX システムコールを,いまいったい誰が使うのか?