- Brian W. Kernighan & P. J. Plauger, 1976: Software Tools.Reading MA USA: Addison-Wesley Pulbishing Company. 338 pp.ISBN 0-201-03669-X.
- [日本語版] Brian W. Kernighan, P.J. Plauger 著, 木村 泉 訳, 1981: ソフトウェア作法。共立出版。[わたしはこの版も見たがよく読んでいない。]
英語版はA5判よりすこし大きめのペーパーバック。わたしが学生だった1979年ごろ買って、よく読んだ。具体的になにをまなんだかおぼえていないが、自分のプログラミングスタイルに影響をおよぼしているという意味で、「わたしをつくった本」のひとつである。
1978年、学部3年生だったわたしは、地球物理に関する計算をするために、プログラミングをする必要があった。つかうことを想定されていた言語は Fortran だったが、わたしは Fortran プログラムの表現形式がわかりにくいと感じ、もっとわかりやすい言語をもとめた。1年上の先輩が、Ratfor という言語があることをおしえてくれた。Ratfor 前処理系 (preprocessor) というプログラムがあって、Ratfor 言語で書かれたプログラムを Fortran 言語に翻訳してくれる。その結果を Fortran コンパイラにかければ機械語になり、実行できる。さいわい、大学の計算機では前処理系がつかえるようになっていた。【ただし、入出力機器のつごうで波かっこ「{」「}」 がつかえず、「$(」「$)」で代用する必要があったのだけれど。 】それで、Ratfor はいわばわたしのプログラミングに関する native 言語になった。その後、Fortran コンパイラが77標準のものになってからは、わたしは直接 Fortran でプログラムを書くようになったけれど、あたまのなかでは Ratfor でかんがえているところがある。
Ratfor 言語の作者は、『The Elements of Programming Style (プログラム書法)』 [読書メモ] の著者でもある Kernighan と Plauger だった。
Ratfor 言語について書いた本をもとめたら、本書だけがあった。ただし、本書は、Ratfor の入門書でも、プログラミングの入門書でもない。Ratfor 言語があることを前提として、Ratfor 前処理系 (9章) や、Unix の ed に似たラインエディタ (6章) や、roff に似た文書割りつけプログラム (7章) を、自分でつくれることを到達点とした、ソフトウェア工学の実習教材だ。プログラミング初心者のわたしには、その実習についていくことはできず、だいたい、ただテキストとして読んだだけだった。それでも、かなり影響をうけたとおもう。
Ratfor 言語は、制御構造を構成する文として、条件別処理をする if / else や、ループをつくる repeat または while などを、Fortran に追加したものだ。この追加した制御構造の文は (おなじ Bell 研究所で考案された)、C や Awk の制御構造とだいたいおなじ形をしている。また、複数の文をグループ化するのに (Pascalならば「begin」「end」をつかうところで) 波かっこ「{」「}」をつかっている。しかしそれ以外の文は、Fortran のままだ。ただし、Fortran言語は基本的に大文字と小文字の区別がなく、1970年代当時はすべて大文字で書くのがふつうだったのだが、本書の Ratfor の例文は、定数値をしめす文字列を大文字にする約束があるが、変数名は小文字をつかっている。そのおかげで、例文は一見 C言語のプログラムであるかのように見えるが、実はそうではない。
わたしが、Raftor 前処理系があったのにもかかわらず、実習課題をやれなかったのは、入出力のしかたのちがいのせいだ。Fortran の入出力は、パンチカードとラインプリンタがふつうだった時代のスタイルを反映して、1行ずつ読み書きすることを想定している。本書のプログラム例は、1文字ずつ読み書きする入出力機能があることを前提としている。また、読まれる文字のうちに、ファイルのおわりをしめす EOF と、改行をしめす NEWLINE がありうるとする。「ファイルにデータがあるかぎり読む」というプログラムを書くときは、データを読む関数を while の条件のなかにいれて、読まれた値が EOF になったらループから脱出するというスタイルを採用している。while 文は Raftor 前処理系をとおすと Fortran の if 文と go to 文になるが、if の条件のなかに read 文を書くことはできないから、read 文をふくむ関数を書いて、それが、1文字 または EOF をかえすようにしなければならない。Fortran でそれを実現する方法の例は 1.9 節に書かれているが、それは Fortran 処理系依存のところがあったし (サブプログラムがローカルにもっている変数の値を、そのサブプログラムがふたたびよびだされたときにつかえるようにしたいのだが、その実現のしかたの標準がなく、FortranコンパイラやOSごとの事情をさぐる必要があったのだ)、それだけでは当時わたしがやりたかった入出力をカバーできないとおもったので、あきらめてしまったのだった。【読むべきファイルがひとつだけならば関数内に1行ぶんのバッファをとっておけばよいのだけれど、複数のファイルから並行して読みたいときにバッファ用の配列をどこにもったらよいかわからなかった。】
なお、おなじ著者によって 1981 年に Software Tools in Pascal がでている。数値計算以外の計算機プログラミングの入門につかわれるプログラミング言語として Pascal がふつうになったからだ。わたしはその本を見たが読んでいない。そのほかの言語による版は出ていないようだ。
折りかえしのあとに目次をつける。
===== 目次 =====
Preface
Contents
Introduction
1. Getting Started
– 1.1 File Copying
– 1.2 Counting Characters
– 1.3 Counting Lines
– 1.4 Counting Words
– 1.5 Removing Tabs
– 1.6 Hand Compiling the Code
– 1.7 A Word on Structured Programming
– 1.8 Ratfor Synposis
– 1.9 Simple Versions of getc and putc
– 1.10 Prospectus
– Bibliographic Notes [以下略]
2. Filters
– 2.1 Putting Tabs back
– 2.2 Command Arguments
– 2.3 Overstrikes
– 2.4 Text Compression
– 2.5 Text Expansion
– 2.6 Encryption
– 2.7 Character Transliteration
– 2.8 Numbers
– 2.9 Summary
3. Files
– 3.1 File Comparison
– 3.2 Connecting Files by Name
– 3.3 File Inclusion
– 3.4 File Concatenation
– 3.5 File Printer
– 3.6 Multi-stage Processing: Pipelines
– 3.7 Creating Files Dynamically
– 3.8 Putting it All Togeger: archive
– 3.9 More Archive Commands
– 3.10 Program Structure
– 3.11 Summary
4. Sorting
– 4.1 Bubble Sort
– 4.2 Shell Sort
– 4.3 Sorting Text
– 4.4 Quicksort
– 4.5 Sorting Big Files
– 4.6 Improvements
– 4.7 Separation of Function: unique
– 4.8 Permted Index
5. Text Patterns
– 5.1 Text Patterns
– 5.2 Implementation
– 5.3 Building Patterns
– 5.4 Some Measurements
– 5.5 Changing Text
– 5.6 Summary
6. Editing
– 6.1 What the User Sees
– 6.2 Implementation
– 6.3 Control Programs
– 6.4 Buffer Representations
– 6.5 More Commands: Delete, Insert, Change, Print line number, Move
– 6.6 The Susstitute Command
– 6.7 Input/Output
– 6.8 Global Commands
– 6.9 The Main Routine
– 6.10 Scratch Files
– 6.11 Summary
7. Formatting
– 7.1 Commands
– 7.2 Construction
– 7.3 Command Decoding
– 7.4 Page Layout
– 7.5 Indenting
– 7.6 Filled Text
– 7.7 Right Margin Justification
– 7.8 Centering and Underlining
– 7.9 Some Measurements
– 7.10 Extensions
– 7.11 Bigger Things
8. Macro Processing
– 8.1 Simple Text Replacement
– 8.2 Table Lookup
– 8.3 Some Measurements
– 8.4 Macros with Arguments
– 8.5 Implementations
– 8.6 Conditionals and Other Built-ins
– 8.7 Applications
9. A Ratfor-Fortran Translator
– 9.1 Organization
– 9.2 Lexical Analysis
– 9.3 Code Generation Rules
– 9.4 Parsing
– 9.5 Code Generation
– 9.6 Output Routines
– 9.7 Extensions
– 9.8 Some Measurements
– 9.9 Some Usage Statistics
Epilogue
Appendix: Primitives and Symbolic Constants
Index of First Lines [各例文の1行めにあるそのプログラムを説明するコメントの一覧]
Index
==========
One thought on “Brian W. Kernighan & P. J. Plauger (1976) Software Tools”