UNIX
2009年08月21日
いつもいつもマイナーなネタですいません。
プログラミング言語 C 第2版の、奇妙な記述が気になりました。
あまりにもさらっと書かれていますが、意味不明です。当たり前では ?
実は当たり前ではなくて、UNIX のアセンブラでは、8 と 9 は、8 進数の 10 と 11 として扱われていたんですね… いやはや。
「UNIX Assembler Reference Manual, Dennis M. Ritchie」
http://www.tom-yam.or.jp/2238/ref/as.pdf
UNIX v6 以前のアセンブラの奇妙な習慣が、K&R の第1版まで脈々と続いていたわけです。UNIX と C の歴史は、こういうのがけっこう多いです。
プログラミング言語 C 第2版の、奇妙な記述が気になりました。
「付録 C 変更点の要約」より引用。
・誰もが好きなつまらぬ変更:8 と 9 は 8 進数ではない。(p.328)
あまりにもさらっと書かれていますが、意味不明です。当たり前では ?
実は当たり前ではなくて、UNIX のアセンブラでは、8 と 9 は、8 進数の 10 と 11 として扱われていたんですね… いやはや。
「UNIX Assembler Reference Manual, Dennis M. Ritchie」
http://www.tom-yam.or.jp/2238/ref/as.pdf
An octal constant consists of a sequence of digits; ‘‘8’’ and ‘‘9’’ are taken to have octal value 10 and 11.
UNIX v6 以前のアセンブラの奇妙な習慣が、K&R の第1版まで脈々と続いていたわけです。UNIX と C の歴史は、こういうのがけっこう多いです。
2009年08月07日
少し前の話になりますが、いただいたコメントをきっかけに、puts になぜ改行が付くのかというネタについて調べていた時、面白い論文を教えてもらいましたので紹介します。
"C and the AT&T Unix Port -- A Personal History", Stephen C. Johnson (翻訳)
http://roguelife.org/~fujita/COOKIES/HISTORY/USENIX/johnson.html
続きを読む
"C and the AT&T Unix Port -- A Personal History", Stephen C. Johnson (翻訳)
http://roguelife.org/~fujita/COOKIES/HISTORY/USENIX/johnson.html
続きを読む
2009年07月03日
1969 年に Bell Lab の Kenneth L. Thompson と Dennis M. Ritchie がプロトタイプを作成した時から数えて、今年は UNIX 40 周年の節目だそうです。UNIX の 1/4 世紀という本がありますが、あと10 年したら UNIX の半世紀ですね。
ちょっと昔の話をしたいと思います。35 年近く前の C の話です。(もちろん私は 20 代なので、まだ生まれてません。)1975 年、UNIX v6 がリリースされました (後の BSD UNIX につながる版です)。この版は pre K&R C という、現代の C (C99) から見ると非常に素朴な C で実装されています。
Dennis M. Ritchie, "C Reference Manual" (1975)
http://www.cs.bell-labs.com/who/dmr/cman.pdf
今日あたりまえのように使われている、void/unsigned/const/enum/union/volatile … ここらへんのキーワードが軒並み存在しません。(代わりに entry という謎のキーワードがあったりします。)
なんと、型のキャストという概念も存在しません。こんなんでまともなプログラムかけるのかな ? と思うかもしれませんが、Lions' Commentary on UNIX を読んでいると、いろいろと面白い技巧が垣間見れます。
参考サイト : 2238クラブ
キャストも unsigned も存在しないので、符号付き整数を unsigned で扱いたい場合は、ポインタ変数に代入してから計算していたようです。ポインタは unsigned ですから、アセンブラ的な感覚からすれば、unsigned というキーワードは無くても困りませんね :-)
rdwri.c
特定のメモリアドレスが定数として define されている場合、どのようにして参照すれば良いのでしょうか ? 今日の C ならば、*(int *)SW のように、ポインタへの型キャストを使えば良いわけですが、キャストは存在しません。
param.h を見てみますと。
いかがでしょうか ? 面倒で実用性が低い言語だと思われた方もいるかもしれませんし、パズル的で面白いと思われた方もいるかもしれません。
私には、pre K&R は、ある種のミニマリズム的美しさと実用性が奇跡のバランスで釣り合っている言語のように思えます。単に学術的な意味でのスマートな言語は他にもたくさんありますが、なんせ UNIX v6 を書いた言語なわけですから、やはり説得力が違います。
ちょっと昔の話をしたいと思います。35 年近く前の C の話です。(もちろん私は 20 代なので、まだ生まれてません。)1975 年、UNIX v6 がリリースされました (後の BSD UNIX につながる版です)。この版は pre K&R C という、現代の C (C99) から見ると非常に素朴な C で実装されています。
Dennis M. Ritchie, "C Reference Manual" (1975)
http://www.cs.bell-labs.com/who/dmr/cman.pdf
今日あたりまえのように使われている、void/unsigned/const/enum/union/volatile … ここらへんのキーワードが軒並み存在しません。(代わりに entry という謎のキーワードがあったりします。)
なんと、型のキャストという概念も存在しません。こんなんでまともなプログラムかけるのかな ? と思うかもしれませんが、Lions' Commentary on UNIX を読んでいると、いろいろと面白い技巧が垣間見れます。
参考サイト : 2238クラブ
キャストも unsigned も存在しないので、符号付き整数を unsigned で扱いたい場合は、ポインタ変数に代入してから計算していたようです。ポインタは unsigned ですから、アセンブラ的な感覚からすれば、unsigned というキーワードは無くても困りませんね :-)
rdwri.c
6323: /* Return the logical maximum 6324: * of the 2 arguments. 6325: */ 6326: max(a, b) 6327: char *a, *b; 6328: { 6329: 6330: if(a > b) 6331: return(a); 6332: return(b); 6333: }volatile はまぁ、この時代の C は PDP-11 マクロアセンブラみたいなものなので、もともとほとんど最適化は行われていなかったので問題は無かったのではないでしょうか。手で register のようなキーワードを使い、最適化を指示していた時代です。ある意味、C の成熟を象徴するようなキーワードだと思います。
特定のメモリアドレスが定数として define されている場合、どのようにして参照すれば良いのでしょうか ? 今日の C ならば、*(int *)SW のように、ポインタへの型キャストを使えば良いわけですが、キャストは存在しません。
param.h を見てみますと。
0166: #define SW 0177570 0167: 0168: /* --------------------------- */ 0169: 0170: /* structure to access : */ 0171: 0172: 0173: /* an integer */ 0174: 0175: struct { int integ; };この意味を理解するには、pre K&R C の struct 内部のメンバーの名前空間が単一であるという仕様を知っている必要があります。単に先頭アドレスからのオフセットと、メンバーの型だけが意味を持ちます。そして、明示的なキャスト構文はありませんが、アセンブラ的な意味での暗黙の型キャストが行われます。アロー演算子 -> の左側にあるスカラ値は、問答無用で構造体へのポインタ扱いされます。整数型も文字型も一切型チェックは行われません。というわけで、特定のメモリアドレスから、整数型として値を参照したい場合は、SW->integ のようにして参照できるわけです。
いかがでしょうか ? 面倒で実用性が低い言語だと思われた方もいるかもしれませんし、パズル的で面白いと思われた方もいるかもしれません。
私には、pre K&R は、ある種のミニマリズム的美しさと実用性が奇跡のバランスで釣り合っている言語のように思えます。単に学術的な意味でのスマートな言語は他にもたくさんありますが、なんせ UNIX v6 を書いた言語なわけですから、やはり説得力が違います。