さて、3ヶ月近く放置したことでこの日記を見る人も激減していると思うので、ここぞとばかりに適当なことを書き散らすことにする。
ふつぱいらのコンパイラがJavaなので、最近家ではJavaばっかり書いている。さんざんJavaで書きまくってると、Javaも意外と悪くないなあと思うようになってきた。先入観イクナイ。
でも Java 1.4 は本当にイクナイ。generics のない静的型付きオブジェクト指向言語なんてありえん。キャストの嵐がめどすぎる。コンパイラも実は 1.4 対応なんだけど、Java 5 にすればよかった。まさか 2 年以上かかるとは思ってなかったからなあ。
それとは対照的に C# は俺内評価が下がりぎみ。Java ばっかりいじってたからかもしらんけど、どうも気に食わない。もっとも、言語がというより IDE が気に食わない可能性も大。メソッドが全部大文字で始まってるあたりが地味に嫌だ。あと言語的には virtual を書かせるあたりが嫌だ。
一方、昼間は相変わらずシェルスクリプトばかり書いている。シェルスクリプトもそれほど悪くないのだが、500行を越えるとウンザリしてくる。特に素の sh にはローカル変数がないので地獄を見る (見た)。ksh であっても local があったりなかったりして嫌だ。しかたないので防衛的に、常に alias local=typeset を入れておかなければいけない。
それと、UNIX の常識的なルールに従う限りは問題ないのだが、スペースの入ってるパスもちゃんと扱おうとか、マルチバイト文字の入ってるパスもちゃんと扱おうとか、そういう余計なことを考えるととたんにウザくなる。local basedir="$(dirname "$(dirname "$0")")" とか書くのはもう疲れた。何回クオートすればいいんだよ!
スペースやマルチバイト文字の入ってるパスなんて実際にはないだろうと考えて無視したいところだが、SUA (SFU) だとフツーにありうるから困る。あの環境には心底ウンザリだよ。
そんなわけで結論としてはやっぱり Ruby がいいなあー、ということになったのであった。最近はちょっとしたツールくらいしか書いてないけど、実に楽だ。each と map がサクッと書けるだけで感動できる。
もっとも、そのへんはシェルスクリプトでも意外と同じようなことができるわけだが、行より細かい単位の文字列処理がからむと Ruby が圧倒的に楽でいい。awk とか sed とか cut とか expr とか駆使してチマチマ処理していると発狂しそうになる。
そもそも echo に移植性がない時点で泣ける。こないだ発見したバグなんてひどかった。"C:\WINDOWS\SUA\home\bwuser" っていうパスをecho すると "\b" がバックスペースになってしまうというバグ。こんな感じのコードで発覚した。
echo ".export report file = `NativePath "$path"` > "$tmp"
この時は cat + ヒアドキュメントで回避できたのだが、いつか回避できないときが来るような気がしてならない。恐ろしい。
Ruby が楽だという話をするはずなのに、気付くとシェルスクリプトに対する不満に変わっているのはなぜだろう。
やっぱねー、Ruby はいいよねー。例外あるからエラー処理が楽だし、配列もハッシュテーブルもあるし。
ちなみにシェルスクリプトの嫌なところをもう一つ。以下のコードで $stat が絶対に変化しない理由を述べよ。
#!/bin/ksh main() { stat=0 cat $file | procfile exit $stat} procfile() { if ! sed ..... then echo "$0: error: sed failed" 1>&2 stat=1 return 1 fi} main "#@"
ヒント: 次のコードなら $stat は変化する
#!/bin/ksh main() { stat=0 procfile < $file exit $stat} procfile() { if ! sed ..... then echo "$0: error: sed failed" 1>&2 stat=1 return 1 fi} main "#@"
そのてん Ruby ならこんな変な罠はないし、オブジェクトを返せるから情報の受け渡しには苦労しない。
あと、仮引数だよな。関数の仮引数を明示的に書けないのは非常に、非常に、非常によくない!ソースコードのわかりやすさが極端に下がる。
もちろん、もっと単純な、スカッとパイプライン一本で解決するような話ならシェルスクリプトはめっちゃ楽なんだけどさ。やっぱ根本的にシェルスクリプトに向いてない処理をやろうとしてる気がするな。真剣に Java 化を考えよう。
(01:19)
AMD64 はいいよねー。何がいいって、汎用レジスタの本数が増えたことが一番だが、RIP(プログラムカウンタ)相対アドレッシングが地味によい。おかげで PIC でもグローバル変数アクセスが超簡単。グローバル変数からのロードもこんなコードで一発ですよ。
movq gv@GOTPCREL(%rip), %rax
x86だとサンクをcallしてスタックから戻りアドレスを取って……と激しくめどい。
(02:31)