テキストファイルとバイナリファイル

問題を整理しよう。第一の疑問は、こうだ。「ある良く似た ふたつのデジタルデータがあるとき、その違いを常に計算することができ るか? 」、もう一つは、こうだ、「もしそうなら、その違い を人間がわかる形式で表現できるか? 」 この二つだ。ここでいう 「違い」のことを、コンピュータの世界では「差分 」と言ったり、「デルタ」と言ったりする。後者は耳 慣れない言葉だが、差分は英語で difference と言い、頭文字のd はギリ シャ文字でデルタという文字になるところから来ている。この本ではいつ でも差分と言うことにする。ここはアメリカでもギリシャでもウクライナ でもない。日本なのだ。

第一の疑問にはあっさり答えることができる。つまり、イエス、 だ。どんな場合にでも、どんな形式のデジタルデータでも、差分を計算 することができる。ドキュメントデータもデジタルデータの一種だから、 もちろん差分を計算することができる。問題は第二の疑問だ。これは非常 に難しい。R-0とR-1の差分をせっかく求めても、人間がわかる形で表現でき るとは限らないのだ。いまの例で言えば、最初の日の修正前のドキュメン トと修正後のドキュメントを指定して、その両者の差分を出力するプログ ラムを書くことはできるが、その差分が、「1320、2行削除、14015、3行 追加」とか、そこまで親切な形ではなくても、とにかく人間が解読できる ようなデータにできるとは限らないのだ。その差分データにせいぜいでき ることといえば、変更前のドキュメントと、一緒に渡して、変更後のデー タを復元するようなプログラムの存在を必ず保証できることだけなのだ。

ずいぶんと悲観的な話をしてしまったようだが、単に私は「デジタ ルデータ一般についてはノー」と言っただけだ。すべての女性にピアスが 似合わなくても、ピアスの似合う女性はたくさんいるし、すべての政治家 が公正廉直でなくても、公正廉直な政治化だって、いるにはいる。たぶん。 そんな女性や政治家を探してみよう。いま問題になっているのは、「ドキュ メントファイル」だ。しかしドキュメントファイルにもいろいろある。ワー プロのドキュメントはたいてい、行によってフォントの大きさが違ってい たり、イタリックになっていたり、段幅が微妙に違っていたり、文字その もの以外のデザインに関係したデータがたくさん入っている。これとは逆 に、単なる文字情報だけが入っていて、それ以外の情報が一切入っていな いようなものもある。豊富な情報が入っているデータにもいろいろある。 たとえばあるソフトウェア会社の作ったデータは、その会社独自のデータ かも知れない。他の会社のワープロのデータと互換性があれば、自分のと ころのソフトウェアが売れなくなる可能性があるから、わざとそうしてい るのかも知れないし、互換性の問題に気づくことができない単に無能なソ フトウェア集団なのかも知れない。いま言った、文字だけの情報が入った ファイルのことを、テキストファイル、と言う。そしてそれ以外のファイ ルをバイナリファイルと言う。さて第二の疑問の答えは、こうだ、「もし 君のドキュメントがテキストファイルであれば、差分を計算できて、その 結果を人間が把握する形式で表示することもできる。もしそうでなければ、 つまり君のドキュメントがバイナリファイルであれば、うまくいくかどう かは、そのバイナリファイルの性質による」。

君のドキュメントが運よくテキストファイルであったとしよう。す ると、二つのドキュメントの差分を以下のように表示するためのプログラ ムがある。具体的にどうやるんだよという話は、ちょっと端折らせてほし い。狭くて深いクレバスの谷底までいちいち降りていたんじゃいつになっ ても頂上には着けない。あとで詳しく説明するが、GNUdiff、グニューディ フと呼ばれるプログラムを使うと、とにかく以下の出力を手にできる。ディ フは、さっきも出てきた difference つまり差分の意味だ:

--- R-0       2004-04-12 09:52:47.000000000 +0900
+++ R-1       2004-04-12 09:52:56.000000000 +0900
@@ -1317,6 +1317,8 @@
     てまで解釈されるものではない。
 XI. 特別工作員間の通信はすべて非対称暗号方式を利用するものとし、
     具体的な形式は以下のいずれかとする。
-イ.楕円暗号
-   楕円暗号は他方法によることができない場合にのみ使用することを許可する。
 ロ.量子暗号のうち、二粒子相関系を用いたもの。
 ハ.オメガ・チャンネル(推奨)
    オメガ・ディテクターを携帯している特別工作員は常にオメガ・チャ
@@ -14012,9 +14014,6 @@
   し、又はこの条約で捕虜に与える権利を制限する恐れがある場合に限り
   行うことを認められる。但し、当該紛争当事国が外交上及び領事業務上の
   慣習及び条約に従って通常行う任務を行うことを妨げない。
+第17条の2
+  第1条から第16条までの規定にかかわらず、関係諸機関にはジュネーブ第一条
+  約、第二条約、第三条約、第四条約の各条項が厳格に適用されるものとする。

 第18条
   第3条、第12条、第14条及び第15条に掲げる特別工作員は、次の標示に関し

いったい何の話かわからないだろう。実を言うと私にもさっぱりだ がここで注意したいのは、データの内容ではなく、このファイルの構造だ。 大雑把に言って、先頭の二行を除けば、@@ -1317,6 +1317,8 @@ のような行で始まる大きく二つの部分に区 切られていることがわかると思う。これをハンクと言い、@@ の行をハン クヘッダー、と言う。ハンクとは英語で「ちょっとした大きさのかたまり」 程度の意味らしい。最初のハンクヘッダーは次のように読む「修正前のファ イルの 1317 行目から始まる 6行は、修正後の 1317 から始まる 8 行に 対応しています。対応の仕方は以下です」。次のものは、「修正前のファ イルの 14012 行目から始まる 9 行は、修正後の 14014 行目から始まる 6 行に対応しています。対応の仕方は以下です」。最初のハンクには '-' 文字で始まっている行が 2 行ある。これは行が削除されたことを示して いる。一方二番目のハンクには '+'文字で始まっている行が 3 行ある。 これは行が追加されたことを示している。先頭に記号のない行は変更があっ たまわりの様子を示すための手がかりとして置かれた行で、修正の前後で 変化がなかった行を示している。それぞれの変更がどんな内容だったのか は一目瞭然だろう。君は救われたのだ。

少し話をはぐらかしてしまったような気がして恐縮している。デジ タルデータ一般についての差分の話をしておきながら、テキストファイル とバイナリファイルに分類して、いつのまにかテキストファイルに限定し た差分の話をしてしまった。実はバイナリファイルにはテキストファイル の差分のようなうまい一般論はない。バイナリファイルに属するもっと個 別の具体的なファイル形式について議論するより他なくて、それはこの本 の内容を超えているのだ。ではこんな限定した議論に意味がないかという とそうでもない。テキスト形式のデータもたくさんあるからだ。まずまっ さきにあげなくてはならないのが、プログラムのソースコードだ。これは 何十年もの間、ずっとテキストファイルだった。そうでないコンピュータ 言語や開発処理系もあるのかも知れないがとても主流だとはいえない。そ れからドキュメント文書の一部、たとえば TeX と呼ばれるドキュメント 形式は、やはりテキストファイルだ。それから電子メールなんかもテキス トファイルだし、HTML のホームページもそうだ。他にもいろいろある。 一部の表計算のソフトなんかでも、ファイルの保存形式を選択することで テキスト形式で保存できるものもある。自分のお気に入りのプログラムが あれば、マニュアルなんかで調べてみると思わぬ発見があるかも知れない。

君の回りで、便利なソフトを使わず、わざわざテキストファイルを 使っている人がいたら要注意だ。彼は本当の便利さを理解しているのかも 知れないのだ。