続・tar(1) はなぜオプション引数にハイフンが不要なのか?―tarとkey argumentsの起源を更に辿る

TL;DR

CTSS bulletin 44 を見よ

また、過去ではなく未来方向、つまり Bell Lab で Unix の successor として生まれた Plan 9 や Inferno における tar についてはこちらで lufia 氏がまとめておられたので参考にどうぞ。Plan 9とInfernoにおけるtar(1)の変化

Introduction

前回の記事では、tar(1)が Unix v1 (1971) のtap(1)まで遡ること、 また、その引数は key というサブコマンドの原始的な姿のようなものだったことを調査した。

さて、実は Unix v1 Programmer's Manual の栄えある最初のページを飾るコマンドは今でもスタティックリンクライブラリの作成などで使われる ar(1) であり、 こちらも tar 同様に key を受け取ることになっており、引数の形態が tar(1) と大変良く似ている。 また、tar(1)と異なり、ar(1)は登場から 53 年、ずっと名前が変わってない。

こうなると次は、「tar(1),tp(1),tap(1)ar(1)に見られる『key』という引数形態はいったいどこからやってきたのだろう」ということが気になってくるのである。

Unixの源流

Unixで出てきた概念やコマンドの多くはたいてい、Unixが全くの初出ではなくMulticsで既に構想・設計された概念であることが非常に多い。

たとえば ken (Ken Thompson) や dmr (Dr. Dennis M. Ritchie) と同様に、Multics と Unix v1 どちらにも係わっている人物である jfo (Joseph “Joe” F. Osanna, Jr.) は、「ベル研究の特許出版物のための文章作成・組版システムを作る」という名目でUnixを作るための研究豫算と計算機をぶんどってきた功績と、そしてその組版ツールであるroff(7)の作者として著名だが、roff(7)は元々 Multics で RUNOFF と呼ばれたコマンドから来ている。[1][2]

同様に、Unixの現代のVimやNeovimに繋がるviエディタの祖先、ed(1)は Multics の QED に遡る。こちらは、RUNOFF と異なり Multics 版の作者も Unix ed(1) と同じく ken である。

Multicsとアーカイバ

では、実際に Multics の System Programmer's Manual を見ていこう。中に、BX.9.04 archive Command, 06/11/68, Solomon Ohayonという節がある。

[..]
Usage

    archive key name (segl...segN)

name is the name of the archive segment and may be a
pathname relative to the root or to the working directory.
each segment of the list, segl...segN is the entry name
of a segment in the archive segment name.

SegI (a member of the list seg1...segN) may not be a pathname
and is assumed to be in the same directory (or to be placed
in the same directory) as name.

key indicates what action archive should take and may
be one of d,r, or x.
[..]

もう答えが出たようなものだが、ar(1)tar(1)のコマンドラインインターフェースの由来は完全にここだろう。

ちなみに、マニュアルで作者として記載されている S. Ohayon は当時 MIT に居た、主に Multics のコマンド実装担当をしていた人物「Solomon Ohayon」のようだ [multicians][4]。

では、同様にテープ向けのアーカイバコマンドも存在するのだろうか。残念ながらマニュアルにあるのは PL/1 言語のテープアクセス・操作用の API と、システム配布用やバックアップ用のそれぞれのテープフォーマットの記載ぐらいしか存在しない。しかし、General Electric が計算機と Multics から手を引いたことによってその事業を継承した HoneyWell から、最終的に商用として発売された Multics の顧客向けドキュメントが存在しており、インターネット上にそのスキャンが残っている。

Name: tape_archive, ta
SYNTAX AS A COMMAND

ta key table_path {args}

FUNCTION

performs a variety of operations to create and maintain a set of files on magnetic
tape.

ARGUMENTS

key
    is one of the key functions described below.
table_path
    is the pathname of a segment created and maintained by tape_archive to serve as
    a table of contents for the archive. If the table segment does not exist, it is
    created by the append operation or the direct interactive mode.
args
    are additional arguments or control arguments as required by the particular key
    chosen (see below).

LIST OF EXTRACT OPERATIONS

x
    Usage: ta x table_path {components} {-control_arg}

    extracts from the archive[..]
[..]
http://www.bitsavers.org/pdf/honeywell/large_systems/multics/AG92-06B_multicsCmds_Nov87.pdf

しかしながら、実際に商用製品として Multics が発売されたのは Unix v3―v4 がリリースされたごろの 1973 年中であり、上記ドキュメントに「1985」とあるとおり、実際に 80 年代半ばまで市場に供給されていたとのこと。[myths]

よって、Unix などに影響され後からコマンドが拡充された可能性は十分高く(ta ほか多くのコマンドが省略形を持っていることも含めて)、Unix v1 以前から tape archiver が Multics コマンドにあったと断じることはできないと思われる。

Multicsの源流……?

さて、こうなると次は Multics の archive が更に遡ることができないか、である。しかし、筆者はこれ以上時代を遡っても原型らしきものは出てこないと考えている。註・追記(2024/06/28): CTSS リリース時のコマンドには存在しないが、後に拡張されたコマンドに源流らしきものを発見した。

CTSS

註4で多少触れているが、Multics の中心人物として MIT から参画した Prof. Fernando J. Corbató は Compatible Time-Sharing System (CTSS) という世界最初期のタイムシェアリングシステムの作者であり、Multics は CTSS の直接の後継となる。 Unix のroff(7) そして Multics の RUNOFF は CTSS の RUNOFF に由来している。

CTSS はなにに対して Compatible かというと、IBM 709 で動いていた FORTRAN Monitor System (FMS) という、ロードされた複数の FORTRAN プログラムを連続実行するバッチシステムであり、さらにその前を辿るとそもそも人間が帳簿で計算機利用を管理し、手動でパンチカードをマシンにくべていく「人間バッチシステム」である。つまり、OS のもっとも原始的なものにまで辿りついてしまい、当然 FMS にはタイムシェアリングシステムのような高級なコマンド群はない。

1961 年の CTSS が公開された当時、CTSS はタイムシェアリングシステムではあるものの、用意されているコマンドは loadstartfap (FORTRAN Assembly Program)mad (Michigan Algorithm Decoder)[5] など元の FSM がバッチシステムでやっていたことをオンラインでやるような仕組みのためのコマンドであり、Multics が新境地を拓いたような、現代の OS 環境で想像されるような「生活空間」を提供するようなシステムではない。Multics はそれほどに革新的、かつ野心的だったとも言えるが、CTSS の最初のデモからコマンドがどんどん拡充されており、Multics との連続性を伺わせる(RUNOFFTYPESET も後から追加されたもののひとつ)。

CTSS bulletin 44

MITでDARPAの資金を受けて組織されたProject MACにはMAC-M-などの符号で様々なメモランダムが残されている。CTSS に関しては、CTSS bulletin という名前でいくつかメモランダムが残っていおり、そのうち CTSS bulletin 44 というメモランダムを参照すると、

New command: ARCHIV
A. Summary
    [..]
B. Format ARCHIV key NAM CLASS ALPHA BETA ...
    key = C
        comines file ALPHA CLASS, BETA CLASS, etc. into a
        simple file NAM CLASS
    key = P
        prints file(s) ALPHA CLASS contained into NAM CLASS
    key = T
        prints a table of contents of the file NAM CLASS
    key = D
        deletes the first file ALPHA CLASS encountered in the
        file NAM CLASS
    key = X
        extracts and creates the file ALPHA CLASS from NAM
        CLASS
    key = R
        replaces in the file NAM CLASS the old version of
        ALPHA CLASS by a new one consiting of the file ALPHA
        CLASS
C. [..]

とあり、ar(1)tar(1) がサブコマンド的に key を受け取るのも、key の function letter が t, x, r, c などであるのも、はっきりここ由来だろう。更に言えばこのコマンドでは key は本当にサブコマンドとして空白区切りで渡されているように見える。

CTSS におけるテープアーカイバ

Multics の時点で tape_archive コマンドはあとから追加されたもののように推測できるので、CTSS でどうだったかを追うのはあまり意味はないが、一応裏取り。

図1: CTSS における disk memory control システムのうち、ディスク編集プロシージャの様子

マニュアルによれば、図.のように編集した内容や出力結果を数週間、あるいは数ヶ月テープに保存しておく仕組みはあるようだが、任意にテープリールをユーザーが指定してそこに一気にファイルを書き出すような仕組みはおそらく CTSS には存在しない。そもそも現代的なファイルシステムにつながるシステム自体が、Ken Thompson が Multics、そして Unix で設計・実装した仕組みである。[6](ただし、ディテクトリで階層化されたファイルシステムは Multics 発祥だが、ファイルの概念自体は CTSS で導入されている)

[1] man page は未だにroffで組版されるが、なぜか POSIX にroffは入ってない。また、現代に使うには少々厳しい文法を持っているが、俄かに信じ難いことに『プログラミング言語Go』の原書はtroffで組版されている。[3]

[2] このUnixとroffの関係と経緯故か、GNUのgroffのmanのHISTORYセクションが異様に詳しい。

[3] そもそも Go 言語の最初期の作者たちは Robert “Rob” Pike、Dr. Brian W. Kernighan、Ken Thompson、いずれもベル研でUnix や Plan 9 OS、Inferno OS、Limbo 言語などに係わっていた人材で今はGoogleに勤めている。

[4] 当時 MIT は Prof. Fernando J. Corbató を筆頭に、Project MACの一部として Multics 開発に参画していた。Prof. F.J. Corbató は世界最初期のTime-Sharing Systemのひとつ「CTSS」を作った功績で知られる。Project MAC は DARPA の資金でバックアップされており、複数人が同時に計算機リソースを使えるようにする OS 研究と、Prof. Marvin L. Minsky & Prof. John McCarthy が率いる AI 研究が併存していた。後者の AI Lab は FSF の創始者、Richard M. Stallman を輩出している。現在の MIT CSAIL の源流。参照しているドキュメントも CSAIL の Prof. Jerome “Jerry” H. Saltzer がやっているプロジェクトからきている。ちなみに Prof. Saltzer こそ CTSS の RUNOFFTYPESET を作成した人物である。

[5] FAP のアセンブリ言語と MAD は CTSS の記述にも利用されたようだ。

[6] 冒頭に触れた QED も、当時としては「計算機環境の中で完結してプログラム・コードを編集する、つまりオン・ラインで編集できる、ということで比較的画期的だった。ただし Multics オリジナルではない。「An online editor」という題で「オンライン編集」という概念がわざわざ論文として紹介されるほどであり、1974 年の初めてベル研の外に Unix を公表した論文でもこの「An online editor」が引用されている。オリジナルの QED は Berkley SDS-930 [7]で実現されており、ken は元々 UC Berkley 出身である。このことから名前と仕様を借りて独自実装を作ったのだと思われる。

[7] Berkley SDS-930 は Berkley 独自のタイムシェアリングシステムだが、ここや後継の SDS-940 で採用された仕組みが現在の fork(2) システムコールの動作モデルと仕組みの原点である。https://www.microsoft.com/en-us/research/publication/a-fork-in-the-road/