部下のやる気を「完全に抹殺」する管理職様の心得を川柳にしてみた。
メモ: 技術系?の話(なのかな…これ)は Facebook から転記しておくことにした。
最近、自習を兼ねて、バイナリ解析するアプリを書いていますが、言語が備えていると(私が)嬉しい 3つの条件があります。
個別にみると珍しくない条件で、3つの条件を満たす言語もこの世に既にありそうですが、今のところ「コレだ!」というものが見つからず、気分がモヤモヤしています。
初めは C で書いていましたが、条件 2 と条件 3 がない辛さに耐えられなくなりました。リストや連想配列の再発明は、それはそれで楽しいけれど、やりたいこととは関係ないんです。
次は C++ with Boehm GC で書きましたが、条件 3 に躓いたとき GTK にぶち当たって挫けました。決して悪いライブラリではないのですが…。
今は Java で書いていて概ね良好ですが、条件 1 の unsigned 型がないため細々した部分で面倒くさいです。
一番条件が合うのは Visual C# .NET でしょうか。条件 3 の Linux サポートが微妙か?Mono の気分次第ですね。変わり種として D 言語も条件合いそうですが、使う気があまり起きません…なぜでしょう。
スクリプト言語の手軽さには心惹かれていて、ぜひ使いたいところですが、Ruby や Python はやはり条件 1 が満たせません。Java と同様で unsigned がないのです。
ブラウザベースの JavaScript や、ゲーム界で大人気の Lua も心惹かれていますが、どうも整数値という概念がなく、全て浮動小数点として扱われるようで、演算、特に除算とビットフィールドの扱いが面倒くさそうです。
時代の流れ的に整数型ってなくなる方向みたいですし、今後に期待しても望みは薄いかもしれません。うむむ…困ったね。
せっかく年休を取ったのに、雨、というか台風来てるし…。
前回(2013年6月13日の日記参照)こんなこといいな、できたらいいな、とウダウダ書きましたが、結局何がしたいのか?を考えてみました。
条件 2(ガベージコレクション)と 3(標準ライブラリ、GUI ライブラリ)については alloc/free は面倒くさい、車輪の再発明は面倒くさい、という普遍的な悩みですから特筆することはないでしょう。引っかかるのは条件 1(unsigned 型の存在)です。
条件 1 がなくて困るのは「バイト列の MSB 側から N ビット取ってきて、数値として返す」処理(※)が返すべき数値が、signed だったり、unsigned だったりして扱いが面倒くさいことです。
例を挙げると、あるバイト列から 3 ビット取ってきて 3'b101 というビット列が得られたとします。得られたビット列を 5 と解釈すべき場合と、符号拡張して -3 と解釈すべき場合があるということです。
(※)MPEG の仕様書なんかで getbits() という関数が出てきますが、まさにアレです。
単に N ビット整数値の符号拡張をしたいだけであれば、下記のようにすれば unsigned 型なんて要りません。
/**
* Sign extension.
*
* @param v Value
* @param n Bits of v
* @param s 0: don't sign extension,
* otherwise: do sign extension
*/
long long signext(long long v, int n, int s) {
long long sb, mb;
if (n == 0) {
return 0;
}
sb = 1LL << (n - 1);
mb = (-1LL << (n - 1)) << 1;
v &= ~mb;
if (s && (v & sb)) {
v = mb + v;
}
return v;
}
さらに言えば Ruby のように無限長整数を扱える言語の方がオーバーフローを考えなくて良いという点で有利である、とすら言えるでしょう。
あれだけ長々書いたくせに自己解決しちゃったよ、非常に迷惑だね!
でも、なんだろうこのコレジャナイ感は…?
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)