言語

デフォルトって?

ありがちダメなコードのダメな理由を書くコーナー。 char const* getNameFromID(int id) { switch (id) { case ID_FOO: return "FOO"; case ID_BAA: return "BAA"; default: return "TEST"; } }ID_FOOを受け取った場合に"FOO"、ID_BAAを受け取った場合に"BAA…

PGReliefは悪くない。けど役にも立たない。

http://d.hatena.ne.jp/minekoa/20100119/1263914704の話。 あれは最低線を底上げするもの。 PGReliefの指摘観点は公式サイトによると PGRelief 独自のノウハウでチェック SECコーディング作法ガイドの適合性チェック MISRA ルール適合性をチェック(オプシ…

検査例外・非検査例外

http://d.hatena.ne.jp/kmaebashi/20100114/p1, http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/Nagise/20100116/1263630204の検査例外は重要だけどJavaの検査例外は面倒という話。 文脈が大事。 たとえば、 ユーザ入力の文字列を数値へ変換する。 設定…

再開発≠再実装

http://d.hatena.ne.jp/tt_clown/20091228/1261996214、http://d.hatena.ne.jp/monjudoh/20091228/1262023451、http://d.hatena.ne.jp/Isoparametric/20091230/1262134418の話。 態度表明。 先に明言しておくと、私は「再開発はするな。再実装は考えてからし…

エラー握りつぶし

ありがちダメなコードのダメな理由を書くコーナー。 #include <stdlib.h> #include <math.h> #include <stdio.h> int mysqrt(int x) { if (x < 0) { return 0; } else { return (int)sqrt(x); } } int main() { printf("%d\n", mysqrt(4)); printf("%d\n", mysqrt(1)); printf("%d\n", m</stdio.h></math.h></stdlib.h>…

期待されない答え

http://d.hatena.ne.jp/skelton_boy/20091217/1261053652の話、というよりhttp://d.hatena.ne.jp/Isoparametric/20091219/1261201890の話。ポータブルに仕様の穴を突く方向で考えてみた。 /* MyTypeの定義 */ typedef int MyType[1]; void set(MyType m, int…

RAIIの代用

C++だとRAIIでリソースの後始末ができる。CだとRAIIが使えないが代案を考えてみた。エラーコードが雑なのは気にしないで。 ありがちなもの。 int func(char const* filename) { FILE *fout = fopen(filename, "a+"); if (fout == NULL) { return -1; } fprin…

名前がおかしい。

extern int checkStatus(void);static int status; int checkStatus() { status = !status; return status == 0; }間違っている点は 宣言と定義の返り値が違う。enum型の大きさがintとは限らない。 宣言と定義の仮引数リストが違う。 check〜という名前にも…

挿入ソートの話のまとめ

gcc4.3 -O3 on Atom, N=10000の条件で挿入ソートを測った結果(ソースコードは下に)。所要時間(time)を測っただけでは振る舞いが掴めないので、cachegrindでD1キャッシュ読み回数(D1read)を数えてみた。 関数 メモリ time D1read yane0 malloc 9.79 62M wkpd0…

挿入ソートの話の途中経過

Atom/gcc -O3だとループ変数をj=iからj=i-1に変えるといった、本質的ではない変更でも20〜30%の速度変化が起こり得るようだ。これはiccで比較してみた方が良いかもしれない。それらを含めた印象としては Wikipedia版もやね版も最適化がよく効いている場合に…

引数の評価順序。

ありがちダメなコードのダメな理由を書くコーナー。 現象。 #include <stdlib.h> #include <stdio.h> int main() { printf("puts(\"A\"), puts(\"B\"), puts(\"C\")+puts(\"D\") = %d, %d, %d\n", puts("A"), puts("B"), puts("C")+puts("D")); return 0; }をコンパイルして実行</stdio.h></stdlib.h>…

副作用のタイミング

ありがちダメなコードのダメな理由を書くコーナー。 現象。 C99のソースコード(tmp.c) #include <stdlib.h> #include <stdio.h> int main() { int i = 0; printf("(++i) + (++i) = %d\n", (++i) + (++i)); return 0; }をコンパイルして実行すると、 $ gcc -std=c99 -pedantic -O</stdio.h></stdlib.h>…

v8もたらいまわし

http://d.hatena.ne.jp/kilrey/20091111#p2の話。 function tarai (x, y, z) { if (x <= y) { return y; } else { return tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y)); } }; for (var i = 0; i < 0x10; ++i) { (tarai(12, 6, 0)); } print…

マルチスレッドのvolatile

ありがちダメなコードのダメな理由を書くコーナー。 現象。 C99+POSIX(SUSv3)のソースコード(tmp.c) #include <stdlib.h> #include <stdio.h> #include <pthread.h> volatile int count = 0; int const COUNT_PER_THREAD = 0x100000; int const THREAD_NUM = 0x10; void* work(void* arg) {</pthread.h></stdio.h></stdlib.h>…

google golangでたらいまわし

http://golang.org/の話。 とりあえずたらいまわしてみたら、gcc -O3の4倍くらいの所要時間だった。なかなか速い。 package main import "fmt" func tarai(x int, y int, z int) int { if x <= y { return y } else { return tarai(tarai(x-1, y, z), tarai(…

固定小数点数のフォロー

http://www.kt.rim.or.jp/%7ekbk/zakkicho/09/zakkicho0910c.html#D20091027の話。 Wikipediaだと。 固定小数点数(こていしょうすうてんすう)は、コンピュータにおける実数の近似値の表現方式。固定小数点数では整数部分に用いるビット数と小数部分に用い…

日本語文法では音便や省略が重要

http://d.hatena.ne.jp/kanimaster/20091022/1256217225に書いたブックマークへの追記。 「おいしいです」はやや崩した表現。「おいしゅうございます」の方がより丁寧。選択肢としては「おいしいのです/おいしいんです」も。 「おいしいのです」は書き言葉、…

free_LIST()

http://www.tees.ne.jp/~sin-x/200910a.html#0901 http://shinh.skr.jp/m/?date=20091011#p01 http://www.tees.ne.jp/~sin-x/200910b.html#1201 http://homepage1.nifty.com/herumi/diary/0910.html#12 の話。 作るべきもの。 仕様の話としては リストの先頭…

C言語でCurrying 5

ちょっと休んだけどまだ続くよ。 これまでのまとめ。 呼び出し規約 cdecl 呼び出し側でスタック掃除 stdcall 呼び出され側でスタック掃除 部分適用とは 関数を呼び出す際の引き数を、呼び出し時と事前との二つに分けて与える。問題になるのは 呼び出し側から…

C言語でCurrying 4

Boehm GCと組み合わせた場合の注意点について述べる。 悪い例。 下のような記述ではGC_malloc()で取得したポインタを部分適用したものの、肝心のメモリ領域が回収されてしまう。何故かと言えば、GC_malloc()で取得したポインタがポインタサイズ境界に位置し…

C言語でCurrying 3

もっとも簡単な手段がもっとも優れた手段ということがしばしばある。 calleeがスタックを解放する場合 x86=IA32でのstdcall関数の場合、calleeがスタックを解放する。つまり call cを呼んだ直後のスタック …… 100 ret(c) jmp addを呼んだ直後のスタック …… 1…

C言語でCurrying

と思ったら既にあった。http://d.hatena.ne.jp/shinichiro_h/20060119 厳密には。 #include <stdio.h> int test(int i, int j) { return i+j; } static int _i; int test1(int j) { return _i+j; } int (*test2(int i))(int) { _i = i; return test1; }厳密には「int </stdio.h>…

C言語でCurrying2

http://d.hatena.ne.jp/shinichiro_h/20060119の手法は引数を積みなおして関数ポインタを呼ぶというもの(だと思う)。 call cを呼んだ直後のスタック …… 100 ret(c) call addを呼んだ直後のスタック …… 100 ret(c) 100 10 ret(add) という感じで。これをtail …

C言語で継続2

http://d.hatena.ne.jp/kilrey/20090921#p1で作成した継続は本当に「スタックを巻き戻す」ことしかできない。例えば、外部リソースを再利用できない、といった問題がある。 外部リソースを再利用できない。 下のソースコードでf1()で記録した継続をf2()で巻…

C言語で継続

C言語で継続を実装できるかを考えてみた。もちろん、生のC言語でできるわけがないのだけど、環境を制限すればできないこともない。 前提、setjmp()とlongjmp()について。 setjmp()とlongjmp()の用途はあくまでも大域脱出である。そのため、setjmp()を呼び出…

C言語で多値返却

ちょっと古いけどhttp://d.hatena.ne.jp/yuyarin/20090825/1251136545の話。 C標準では。 C言語の仕様レベルでは多値返却にもっとも近いのは構造体の値返却だ。複数の値を返すという用途は充分に満たしている。 struct int_int_t { int x; int y; }; struct …

今の環境ならコンパイル・アセンブル・リンクを分ける必要はない。

C言語の処理過程を考えると大まかに次のようになっている。 人間の頭 編集 ソースコード パース 抽象構文木 コンパイル アセンブリコード アセンブル オブジェクトコード リンク 実行ファイル OSによる起動 プロセス プロセス実行 出力 これは必ずしも一斉に…

名前推論

http://shinh.skr.jp/m/?date=20090831の話。名前推論は面白い話なだけにひっかかるところも多い。 賛成できない、というか少しひっかかるのは名前推論の話。最初見た時はすごいなー面白いなーと思った記憶がある。 でもいつだったかその話をぼんやり思い出…

関数型言語に足りないもの

http://d.hatena.ne.jp/kilrey/20090814#p1の続き。 非正則正格評価対応DBMS 現行のRDBMSに適当なラッパーを被せても良いのだけど、それだと速度のメリットがない。初めから非正則正格ネイティブなDBMSがあれば状況が変わる(かもしれない)。 簡単なGUI言語 t…

自作言語完成したよ

言語の名前が変わった上に別名義で公開することになったので、あまり細かいことはここに書けないけれども。