タイトル/名前 | 更新者 | 更新日 |
---|---|---|
C言語系/「デーモン君のソース探検」読書メモ/05, locate(1) | msakamoto-sf | 2010-01-10 15:48:17 |
C言語系/「デーモン君のソース探検」読書メモ/04, uuencode(1),uudecode(1) | msakamoto-sf | 2010-01-10 15:47:29 |
C言語系/「デーモン君のソース探検」読書メモ/02, getopt(3) | msakamoto-sf | 2010-01-10 15:45:47 |
C言語系/「デーモン君のソース探検」読書メモ/01, getpass(3) | msakamoto-sf | 2010-01-10 15:45:27 |
C言語系/「デーモン君のソース探検」読書メモ/03, getchar(3) | msakamoto-sf | 2010-01-10 15:45:03 |
JavaScript/Bookmarklet/「右クリック禁止」の禁止 | msakamoto-sf | 2010-01-08 16:06:03 |
日記/2010/01/07/「エキスパートCプログラミング」読了 | msakamoto-sf | 2010-01-07 15:07:22 |
C言語系/00_参考資料 | msakamoto-sf | 2010-01-07 14:54:22 |
日記/2010/01/06/プロトタイプ宣言の引数型の格上げとかK&Rとか、 gccの"-traditional", "-ansi", "-pedantic"オプションとか。 | msakamoto-sf | 2010-01-06 18:36:47 |
C言語系/NetBSD1.6における setjmp(), longjmp() の実装(2) | msakamoto-sf | 2010-01-04 14:31:53 |
お題:locate(1)がデータファイルを構築する仕組みを追跡せよ。
先に結末:追跡しきれませんでした。bigramや文字列差分を組み合わせた圧縮そして展開のコード、自分の理解力とソース読解力では太刀打ちできませんでした。゚(゚´Д`゚)゚。
javascript:alert('右クリック禁止を禁止!'); document.body.oncontextmenu=''; \ document.oncontextmenu=''; document.onmousedown=''; void(0)
出典:"イベントで「右クリック禁止」を禁止してみよう - @IT"
http://www.atmarkit.co.jp/fcoding/articles/js/02/js02c.html
もうちょっと早めに読んでおきたかったナー、という良書。
これとか「ふつうのコンパイラをつくろう」とか読んでて思ったのだけれど、本当に「C言語のポインタと配列をマスターした!」と言えるのは、C言語のコンパイラを作ったことが必須条件じゃないかなーとすら思う。
でも、最近はアセンブラにも手を出して良かったな~と思うことも多い。読んでる本がLinuxカーネルやC言語のディープな話関連が多くなってるからだろうけど、かなりアセンブラが出てきてるので、基礎知識として勉強しておいたおかげで、本が大分読みやすかった。アセンブラ周りの話で停まったり躓くことが無かったのは助かったと思う。
読書/C言語関連と重複しますが、C言語を基本としてLinux/UNIX/Windowsでのプログラミングを勉強するのに読んだ本などを。
あと、Amazon上で見つからなくて残念なのですが「独習C++」の著者であるハーバート・シルト氏による「Windows32 API プログラミング入門」(正確なタイトル失念)にもお世話になりました。当時はC++Builderの世界しか知らなかったので、Windows32APIでごりごりウインドウを作ったりメニューを作ったりダイアログを表示したりして、イベントループを書いたりなど、大変勉強になりました。
「猫でも分かる」シリーズが出たり、仕事がLinuxやJava中心にシフトした事もあって本は手放してしまいましたが、大学時代にあの本を読み込んだ経験は無駄にならないどころか、VBの仕事でも生きてきたりとそれなりに活躍してます。
1997-2003年、高校~大学にかけてはBorland C++ BuilderやC++ Compilerに大変お世話になったのだけれど、VisualStudioが"Express"エディションとして無償提供される事になり、やはり昨今は素直にVisualC++のExpressエディションか、Linux/UNIXのGNU開発ツールで勉強する人が増えているのだろうか・・・。
また「エキスパートCプログラミング」ネタ繋がりです。
自分は"K&R"のC言語本を読んだことが無いので、昔のC言語では関数のプロトタイプ宣言で引数を指定しなかったなんて初めて知りました。
int foo(); int foo(a, b) int a; char b; { ... }
こんな書き方してたんですね・・・。先日NetBSD1.6のsetjmp()の実装調べてた時に"__P"マクロとゆーのに出会い、それ繋がりです。
で、K&R時代のC言語では引数の型が、自動的に格上げされてたみたいです。charとかshortはintへ(ワードより小さいサイズはワード単位へ)、floatはdoubleへ、という具合に、アセンブラレベルで変換されてしまうみたいですね。
一方でANSI時代のC言語では引数の型の格上げはなくなり、charはchar, shortはshort, floatはfloatとしてアセンブラレベルでちゃんと渡されるようになったらしいです。
gccの場合はプロトタイプ宣言で古い書き方もサポートしてはいますが、ANSI-Cとの兼ね合いで引数の格上げがややこしいことになってるっぽいです・・・。
詳しくは "info gcc" -> "C Extension" -> "Function Prototypes"、あるいは下記URLの「プロトタイプ宣言と古い形式の定義」参照。
http://www.sra.co.jp/wingnut/gcc/gcc-j.html
ほか、gccのinfo見てて幾つかオプションの意味を誤解してたのがあったのでメモしておきます。
("info gcc" -> "Invoking GCC" -> "Option Summary")
"-traditional" : てっきり"K&R"のCでコンパイルすると思ってたんですが、厳密には「古いC言語の幾つかの機能をサポートする」、という意味で、ANSI時代の機能も引き続き使える、という意味でした。古いコードの五巻維持が目的で、別に新しい時代の機能が使えなくなる、というわけじゃなかったです。
"-ansi" : こちらは、"ANSI-Cに従わないコードは全部エラーにする"程の強い意味をもってると思ってたんですが、そこまで強くはなかったみたいです。確かにANSI規格と互換性の無いGCCの機能をオフにしたりはするようですが。普通に ANSI規格の機能をサポートする、という意味でした。(加えて"__STRICT_ANSI__"マクロの定義や、幾つかのビルトイン関数が組み込まれなくなったりするようです)
本当に、ANSI-Cに従ってないコードを拒絶/警告するには "-pedantic" オプションを組み合わせるようです。
"-pedantic" : ANSI-CとISO-C++に厳密に準拠した場合に、規格が要求している警告を全て発する。・・・のですが、かといって「じゃぁこれ使えば、ANSI/ISOに従っていないコードは全て拒絶出来る、チェック代わりになるのだが」とは行かないようです。規格の方で「警告メッセージを要求している」ものについては警告を発しますが、適合していなくとも規格の方で警告メッセージを要求していないものについては無視されるようです。
ややこしいですね・・・。
それにしても、C言語って少しディープな世界に首突っ込むと、即座にCPUや機械語(アセンブラ)レベルの知識が絡んできます。ぶっちゃけC言語勉強するなら、アセンブラや電子計算機の歴史を学んでからの方が効率が良いよな気が(最近は)してます・・・。
前回、NetBSD1.6でのsetjmp/longjmpの中身を追いかけたところ、リンク後には"__setjmp14"/"__longjmp14"というシンボルにいつの間にか名前が変わっていた。
これについて簡単に調べてみた。
結論から言うと、setjmp.h の中で setjmp/longjmpが組み込みアセンブラでの"__setjmp14"/"__longjmp14"の呼び出しにdefineされていた。