-
AWKの創始者 Dr. Brian Kernighan への短いインタビュー
-
Dr. Brian Kernighan の紹介
- Dr. Brian Kernighan はカナダ出身のコンピュータ科学者で、Bell Labs で UNIX の開発に貢献
- Dennis Richie とともに、Cプログラミング言語に関する基本書である "The C Programming Language" を共著
- 2000年から Princeton University で次世代のプログラマーを育成している
- 最初の "Hello World!" プログラムを書いた人物として有名
-
AWKの新しいアイデア
- AWK の主要なアイデアは連想配列(associative arrays)
- 当時は新しい概念だったが、現在ではほとんどの言語でライブラリ関数(hashmaps in Java or C++)や言語自体(dictionaries in Perl and Python)として使われている
- 連想配列は非常に強力な構造で、さまざまなデータ構造をシミュレートするために使える
- パターン・アクションのパラダイムも当時は広く使われていなかったが、特定の計算を整理する効果的な方法
-
プログラミング言語を作る際に参照した資料
- Dr. Kernighan: "なし"
- 1970年代当時は新しい特定用途向け言語が多く、参考にできる先行資料はほとんどなかった
- Yacc は文法を簡単に作成して実験できるようにする重要なツールだった
- Lex は語彙レベルで同じ役割を果たし、多くの退屈なコードをルールセットで置き換えた
- Lex と Yacc はパターン・アクション言語の例であり、互いに良い循環を生み出していた
-
プログラミング言語設計に関心のある若者への助言
- 小さな特定用途向け言語を設計して実装してみるよう助言
- これはとても楽しく有用で、Rust や C++ の代替言語を作るよりはるかに簡単
- 自動化できる作業を見つけて、簡単なコンパイラとランタイムを作るよう勧めている
- Jon Bentley がずっと以前に書いた関連記事は今でも有効
-
画像の出典
- Wikimedia Commons
-
GN⁺のまとめ
- Dr. Brian Kernighan は UNIX と C言語の開発に貢献した重要人物であり、連想配列とパターン・アクションのパラダイムを導入した AWK 言語の創始者
- 連想配列は現在、ほとんどのプログラミング言語で使われている強力なデータ構造
- 若いプログラマーにとっては、小さな特定用途向け言語を設計して実装してみることが有益
- Yacc と Lex は文法解析と字句解析を容易にするツールで、パターン・アクション言語の良い例
1件のコメント
Hacker News の意見
あまり知られていない Brian Kernighan に関する雑多な事実: 2000年に Princeton CS 学科に加わったが、Bell Labs Research にいた1993年ごろには、すでに Princeton で少なくとも1つ授業を教えていた
ある学生が pre-1.0 Linux の動く 386sx ノートPCをよく持ってきていて、Brian が awk の細かな挙動を思い出せないとき、その学生が awk コマンドを実行して「正解の実装」を教えていたらしい。なので Brian は比較的早い時期に Linux に触れていたことになる
1994年秋に AT&T のフリーダイヤル番号帳をインターネットに載せた文章もある: https://www.cs.princeton.edu/~bwk/800.html
興味があるなら、Lex Fridman が BK と行った 1時間半のインタビューがかなり良い: https://www.youtube.com/watch?v=O9upVbGSBFo
ときどき、今この時代に生きていることが途方もない特権のように感じる。数学者が Euler にインタビューしたり、物理学者が Newton にインタビューしたりできるようなものだ
Masterminds of Programming という本には、Aho と Weinberger まで含めた、より包括的なインタビューがある。強くおすすめする
https://en.wikipedia.org/wiki/Brian_Kernighan
http://www.linuxjournal.com/article/7035
http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/index.html
https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory
https://web.archive.org/web/20131126220450/http://princetonstartuptv.com/post/49379235060/the-legendary-brian-kernighan-on-teaching-writing
今週、1983年の The Unix Programming Environment を読んでいるが、35年ほど遅れて読んでいることになる。本の中で awk は本当に際立っており、現在人気のある JavaScript、Lua、Python、Perl、Tcl のような言語に最も近い存在に見える
awk が「連想配列」と呼ぶものを、JavaScript は単に「オブジェクト」と呼ぶ。1979年の第7版 Unix の awk ソースは https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk によればわずか2680行で、実行ファイルは46KB、PDP-11 の64KBアドレス空間で動いていたというのは驚きだ。そのバージョンと、その4年後に出た本に載っている awk にはユーザー定義関数もなかったようで、V7 Bourne shell も同様だったらしい。ただし bc にはあった
実行ファイル46KBも Turbo Pascal 3.02 よりは少し大きかった: https://prog21.dadgum.com/116.html もちろん Turbo Pascal には正規表現エンジンはなかったが
functionキーワード、for e in a、セミコロン不要の構文、文字列中心の型処理、delete x[e]のような要素を見ると、JavaScript の基盤が awk だったことはかなり明らかで、Brendan Eich もそう語っている: https://brendaneich.com/2010/07/a-brief-history-of-javascript/01983、01979のように書くのは、年の書き方でもないし、実際には数字の書き方としても奇妙だ昔、誰かが Usenet の
.sigに「Perl はマーガリン、awk はバター」と書いていたのを覚えている。順序は逆だったかもしれないPerl には欠点も多いが、Perl を見つけてからは awk を使うことがずっと少なくなった
1980年代のオーストラリアのUnixカンファレンスで、Dr. KernighanにサインしてもらったK&Rの本を持っている。いちばん大切にしているものの一つ。
その本とKernighan/Pikeの『The Practice of Programming』、Byte誌のようなものが、1980年代の私にとっての「Stack Overflow」だった
彼が連想配列を「比較的新しいもの」のように語っているのが興味深い。Lispにはほぼ20年前からあったからだ
1990年代にプログラミングを始めたときでさえ、Cの世界のかなりの部分では、ハッシュテーブルのような連想データ構造をやや異国的なものと見なし、本当にどうしようもないときだけ取り出して使うものだと考えていた。プログラミングの世界は速く動くと思いがちだが、実際にはそうではなく、とくに当時はもっと遅かった。1960〜70年代にある言語に登場した機能が広く採用されるまでに、数十年かかった例は多い。Lispも当時はほかの選択肢に比べて性能がかなり悪く、自分の機能を売り込むにはよい事例ではなかったのかもしれない
awkは遅いマシンと小さなメモリの上で生まれ、配列の性質もその環境の結果だった。添字を文字列に限定し、構文糖があっても1次元に限定したことがその例だ。より一般的な実装なら、多次元配列や、少なくとも配列要素として配列を入れる方法を許したはずだという。SNOBOL4の安定版は1967年: https://en.wikipedia.org/wiki/SNOBOL
したがって、Lispの組み込み連想配列にalistやプロパティリストまで含めないなら、awkが生まれた時期とほぼ同時代か、少し後のものに見える
どんな言語でも線形探索で連想配列らしきものを数分で作ることはできるが、SNOBOL4、MUMPS、awk、Perl、Python、Tcl、Lua、JavaScriptのように言語機能として組み込みであるものとはまったく違う。初期のLispがデータ構造化のために提供したのは
cons、car、cdrであり、これは同じものではない。awk以前のUnixの中にも、リンカのシンボル、Cコンパイラ、アセンブラ、ファイルシステムディレクトリという形のカーネル、シェル変数のように、連想配列を含むプログラムはあったが、プログラミング言語機能として提供されていたわけではなかった。Bourne shellは変数名を連結してeval myarray_$key=$valのような形でまねできたので最も近く、V7 Bourne shellのシェル変数処理は二分木探索で実装されていた正規表現からlex、yacc、awkへと続く開発の流れがとても印象的だ。先行する作業の上に積み重ね、より一般的な結果を生み出したという感じが説得力をもって伝わってくる
叩かれる発言だろうけれど、GitHubにはこうしたコーディングの伝説たちよりも、もっとよく書かれたリポジトリを持つプログラマーが非常に多い気がする。当時は人材プールがずっと小さかった