コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2013年6月21日 >>> 2013年6月8日
link もっと後

2013年6月21日

世の中にありそうでない言語2

せっかく年休を取ったのに、雨、というか台風来てるし…。

前回(2013年6月13日の日記参照)こんなこといいな、できたらいいな、とウダウダ書きましたが、結局何がしたいのか?を考えてみました。

条件2(ガベージコレクション)と3(標準ライブラリ、GUIライブラリ)についてはalloc/freeは面倒くさい、車輪の再発明は面倒くさい、という普遍的な悩みですから特筆することはないでしょう。引っかかるのは条件1(unsigned型の存在)です。

条件1がなくて困るのは「バイト列のMSB側からNビット取ってきて、数値として返す」処理(※)が返すべき数値が、signedだったり、unsignedだったりして扱いが面倒くさいことです。

例を挙げると、あるバイト列から3ビット取ってきて3'b101というビット列が得られたとします。得られたビット列を5と解釈すべき場合と、符号拡張して -3と解釈すべき場合があるということです。

(※)MPEGの仕様書なんかでgetbits() という関数が出てきますが、まさにアレです。

符号拡張が悩み?

単にNビット整数値の符号拡張をしたいだけであれば、下記のようにすればunsigned型なんて要りません。

符号拡張in C言語

/**
 * 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のように無限長整数を扱える言語の方がオーバーフローを考えなくて良いという点で有利である、とすら言えるでしょう。

あれだけ長々書いたくせに自己解決しちゃったよ、非常に迷惑だね!
でも、なんだろうこのコレジャナイ感は…?

編集者:すずき(2013/06/21 15:06)

コメント一覧

  • IKeJIさん(2013/06/24 15:09)
    前の記事のコメントはそういう事をやるクラスを作ったらいいんじゃないか、と思ったんです。
    class SignedFixedInteger {
     SignedInteger(byte[] val, int size);
     SignedInteger toOtherSize(int size);
     SignedInteger operator+(SignedInteger s);
     SignedInteger operator+(long long s);
     // other operators.

    Javaだと、演算子オーバーロードがないので、Scalaとか?
    最近の自分のマイブームはkotlinです。

    こういう用途の場合、暗黙にmodされて欲しいという事はないんでしょうか?
  • すずきさん(2013/06/25 08:10)
    >IKeJIさん
    今は整数をラップしたUInt, SIntクラスと、DataInputStreamクラスに似せたBitStreamクラスを作って、
    UInt hoge1 = str.getU32(1);
    UInt hoge2 = str.getU32(3);
    みたいに読めるようにしています。
    ご指摘のとおり、数値側のクラスをもっと強力にした方が良さそうですね。

    暗黙のmodはあったほうが嬉しいです。用途によっては、逆に丸められると困る(オーバーフロー、アンダーフロー検知が必要な)場合もあるかもしれません。今はバイナリ読んで解析のパターンしかやっていないので、どちらもあまり必要としていませんが…。

    Scalaにkotlin、ご紹介ありがとうございます。世の中、面白い言語がいっぱいありますね。
open/close この記事にコメントする



2013年6月13日

世の中にありそうでない言語

最近、自習を兼ねて、バイナリ解析するアプリを書いていますが、言語が備えていると(私が)嬉しい3つの条件があります。

個別にみると珍しくない条件で、3つの条件を満たす言語もこの世に既にありそうですが、今のところ「コレだ!」というものが見つからず、気分がモヤモヤしています。

3つの条件

  • 整数型が存在すること。unsigned型が存在すると嬉しい。
  • ガベージコレクションが存在すること。
  • 最低限LinuxとWindowsで動かせること。各種コンテナや、GUIライブラリが揃っているとなお嬉しい。

今までの選択

初めは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/06/16 01:46)

コメント一覧

  • IKeJIさん(2013/06/16 07:19)
    CからJavaへ移植するために元がunsignedで困る事は良くありますね。

    バイナリ解析用途だと時前でbyte[]を使って実装するのはどうでしょうか?
  • すずきさん(2013/06/16 09:01)
    >IKeJIさん
    そうですよね、どちらかというとunsignedは使われると他言語移植の時に困る代物になっていますね。
    byte[]のまま処理するというのはおもいつかなかったです。今はbyte[]で読んできて全部64bit整数に変換して凌いでます。
  • よしだあさん(2013/06/18 02:04)
    Ruby使いですがバイナリも意外といけるよ。いっしょにRubyやろうぜ!笑

    http://ref.xaio.jp/ruby/classes/string/unpack
  • すずきさん(2013/06/19 00:28)
    >よしだあさん
    Rubyはバイナリの扱いもさることながら、整数の桁数が実質無制限なので、負数の扱いについて、CやJavaと違う処理が必要になりそうです。
    文句言う前に考えろって話ですけど、それなりに面倒くさいんです…。
  • よしだぁさん(2013/06/20 12:49)
    binstr = "\001\002\003\004\377\376\375\374"
    # unsigned
    binstr.unpack("I*") => [67305985, 4244504319]
    # signed
    binstr.unpack("i*") => [67305985, -50462977]

    取得にかんしては、こんな組込み関数があるけどね。内部表現としても 32bit とか 64bit とか、ということになると Ruby は不向きかもなぁ。

    http://moko.cry.jp:3232/~keiji/ruby-manual-1.8-20050214/pack_A5_C6_A5_F3_A5_D7_A5_EC_A1_BC_A5_C8_CA_B8_BB_FA_CE_F3.html
  • すずきさん(2013/06/21 13:16)
    >よしだあさん
    なんと、こんなことできるんですか。さすがRuby…できる子。
open/close この記事にコメントする



2013年6月8日

エンジニア川柳

部下のやる気を「完全に抹殺」する管理職様の心得を川柳にしてみた。

優先度放棄
お客様の 要望全部 最優先
無理な期日
早くやれ どうしてできない 言ってみろ!
恐怖政治
まず怒鳴り 机を叩いて 物を投げ
丸投げ
やっといて あとはよろしく ねえ?できた?
無計画
明日を見ろ 一年後なんか 知らねえよ

メモ: 技術系?の話(なのかな…これ)はFacebookから転記しておくことにした。

編集者:すずき(2014/03/16 23:55)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2013年6月21日 >>> 2013年6月8日
link もっと後

管理用メニュー

link 記事を新規作成

<2013>
<<<06>>>
------1
2345678
9101112131415
16171819202122
23242526272829
30------

最近のコメント5件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」

最近の記事20件

  • link 24年10月31日
    すずき (11/04 15:17)
    「[DENSOの最終勤務日] 最終勤務日でした、入門カードや会社のPCを返却してきました。在籍期間はNSITEXE(品川のオフィ...」
  • link 22年7月8日
    すずき (11/02 20:34)
    「[マンガ紹介 - まとめリンク] 目次: マンガ紹介一覧が欲しくなったので作りました。5作品乙女ゲームの破滅フラグしかない悪役...」
  • link 24年10月30日
    すずき (11/02 20:33)
    「[マンガ紹介] 目次: マンガ紹介お気に入りのマンガ紹介シリーズ。最近完結した短めの作品を紹介します。マイナススキル持ち四人が...」
  • link 19年3月28日
    すずき (11/02 13:27)
    「[マンガ紹介] 目次: マンガ紹介お気に入りのマンガ紹介シリーズ。こわもてかわもて(全2巻、2019年)(アマゾンへのリンク)...」
  • link 21年6月20日
    すずき (11/02 13:22)
    「[読書一生分が93万円?] 目次: マンガ紹介書籍通販のhontoがこんなキャンペーンをやっています。honto読書一生分プレ...」
  • link 17年10月27日
    すずき (11/02 13:11)
    「[異世界&最強系漫画の種類] 目次: マンガ紹介少し前にアニメ化されて盛り上がって(おそらく負の方向に…)いた「...」
  • link 24年10月28日
    すずき (10/30 23:49)
    「[Linuxからリモートデスクトップ] 目次: Linux開発用のLinuxマシンの画面を見るにはいろいろな手段がありますが、...」
  • link 23年4月10日
    すずき (10/30 23:46)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年10月24日
    すずき (10/25 02:35)
    「[ONKYOからM-AUDIOのUSB DACへ] 目次: PCかれこれ10年以上(2013年3月16日の日記参照)活躍してく...」
  • link 24年7月25日
    すずき (10/25 02:24)
    「[OpenSBIを調べる - デバイスツリーの扱い(別方法)] 目次: LinuxOpenSBIのブート部分を調べます。Ope...」
  • link 24年8月7日
    すずき (10/25 02:23)
    「[Debian独自の挙動をするQEMUとbinfmt_misc] 目次: Linux前回はbinfmt_miscの使い方や動作...」
  • link 24年9月9日
    すずき (10/25 02:22)
    「[GDBの便利コマンド] 目次: LinuxGDBは便利ですが、少し使わないでいるとあっという間にコマンドを忘れます。便利&使...」
  • link 24年10月20日
    すずき (10/25 02:22)
    「[ゲームを買ったら遊びましょう2] 目次: ゲーム前回の振り返り(2022年5月13日の日記参照)から2年半経ちました。所持し...」
  • link 24年8月2日
    すずき (10/25 02:21)
    「[Debian on RISC-V] 目次: LinuxOpenSBI + Linuxの環境まで動いたので、次はLinuxのデ...」
  • link 24年8月6日
    すずき (10/25 02:21)
    「[他アーキテクチャ向けバイナリを実行する仕組みbinfmt_misc] 目次: LinuxRISC-V 64bit用の実行ファ...」
  • link 24年8月27日
    すずき (10/25 02:20)
    「[Milk-V Jupiterが届いた] 目次: RISC-VMilk-V Jupiterが届きました。お値段が非常に安かった...」
  • link 24年9月13日
    すずき (10/25 02:20)
    「[OpenSBIを調べる - OpenSBIとRISC-V ISA extensions] 目次: Linux今回はOpenS...」
  • link 24年10月11日
    すずき (10/25 02:19)
    「[企業のドメイン] 今の企業は公式サイトを持っていなほうが珍しいと思いますが、ドメイン名の使い方は各社でバラバラで面白いです。...」
  • link 24年10月21日
    すずき (10/25 02:18)
    「[OpenPilotを調べる - プロセス間通信msgqの仕組み] 目次: OpenPilot最近はOSSの運転支援ソフトウェ...」
  • link 24年10月6日
    すずき (10/25 02:11)
    「[OpenPilotを調べる - ビルドと実行] 目次: OpenPilot最近はOSSの運転支援ソフトウェアOpenPilo...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/04 15:17