2009年08月
2009年08月31日
AndroidのDalvik VMではJavaのバイトコードから変換されたDXコードというものをインタープリタで実行しています。DXコードの中には浮動小数点演算を行うための命令もあるのですが、現状のDalvik VMではFPU命令を使わずにすべてソフトウェアによる浮動小数点演算のライブラリを呼び出しています。
Android SDKのシミュレータでは実はkernelとqemuはVFPが有効になっているのでFPU命令を使うことができます。そこでインタープリタのコードの浮動小数点の四則演算の部分をFPU命令を使うように書き換えて少し高速化してみました。
2009年08月28日
デバッガの肝の一つとして、ELF バイナリに入ってるデバッグ情報の解析があるのですが、そこらへんはほぼ全て社長と佐藤さんが行ってきたそうです。
私は入社してから今まで、ほぼずっとシミュレータ周りの開発をしてきましたので、どちらかというと PARTNER のコア部分とは少し離れた位置にいます。
しかし、デバッガベンダーに勤めていながら、全くデバッグ情報の解析について知らないというわけにもいかないので、少しずつ勉強していく過程をメモしていこうかと思います。
続きを読む
2009年08月26日
2009年08月24日
2009年08月21日
プログラミング言語 C 第2版の、奇妙な記述が気になりました。
「付録 C 変更点の要約」より引用。
・誰もが好きなつまらぬ変更:8 と 9 は 8 進数ではない。(p.328)
あまりにもさらっと書かれていますが、意味不明です。当たり前では ?
実は当たり前ではなくて、UNIX のアセンブラでは、8 と 9 は、8 進数の 10 と 11 として扱われていたんですね… いやはや。
「UNIX Assembler Reference Manual, Dennis M. Ritchie」
http://www.tom-yam.or.jp/2238/ref/as.pdf
An octal constant consists of a sequence of digits; ‘‘8’’ and ‘‘9’’ are taken to have octal value 10 and 11.
UNIX v6 以前のアセンブラの奇妙な習慣が、K&R の第1版まで脈々と続いていたわけです。UNIX と C の歴史は、こういうのがけっこう多いです。
2009年08月19日
PowerPCにはCPUのクロックサイクルでカウントアップされるタイムベースレジスタというカウンタがあります。これを利用して簡単にプログラムの2点間の時間を計測することができます。
ある関数を複数の方法で実装して、どちらが速いかを比較する場合に便利です。
手軽に使えるようにソースコードを一つのヘッダファイルにまとめてみました。
2009年08月17日
xv6 という、MIT の OS の講義のために、UNIX v6 を ANSI C で書き直して、x86 マルチプロセッサシステムに移植したものが存在することを、ひらさんの twitter で知りました。
wikipedia がよくまとまっています。Lions 本のように、読みやすくソースコードが編集された PDF へのリンクもあります。OS のソースコード全部で、たったの 75 ページと、非常にコンパクト。
http://en.wikipedia.org/wiki/Xv6
他にも MIT は、初級計算機科学の講義のために書かれた SICP (日本語訳 : 計算機プログラムの構造と解釈)などでも非常に有名です。(こちらは Scheme でプログラムが書かれています。)どちらも講義資料 full text が全て無料で読めるというのが、なんとも太っ腹ですね。
私がけっこう前から、のんびりと pre K&R C のコンパイラを趣味で書いてる動機の一つとして、最小限の変更で UNIX v6 を x86 の上で動くようにしたいというのがあるのですが、既に完全 ANSI C リライトまでやられていたとは… いやはや、脱帽です。
続きを読む
2009年08月14日
ARM11のCP15にパフォーマンスモニタがあり、そのサイクルカウンタを利用して簡単にプログラムの2点間の時間を計測することができます。
計測用の関数を手軽に使えるようにソースコードを一つのヘッダファイルにまとめてみました。
ある関数を複数の方法で実装して、どちらが速いかを比較する場合に便利です。
2009年08月12日
元々、ミステリーが好きでよく本を読んでいたのですが、最近本の読み方が大きく変化しました。
実際には、物理的な本は読まずに、T-01A(ドコモのWindowsモバイル携帯)を使って読書しています。
2009年08月10日
次期の VC++ 2010 でも状況は変わらないようです。(ベータ版のマニュアルですが。)
http://msdn.microsoft.com/ja-jp/library/02y9a5ye(VS.100).aspx
やはり C# や .NET をプッシュする Microsoft 的には、OS の根幹を支える C++ はともかく、いまさら C はどうでも良いという扱いなのでしょうか。KMCでは、現在でも C はバリバリの現役なので、少し寂しいところです。
ちなみに VC++ にも、GCC と同様に独自の拡張機能が含まれており(ただし、GNU C のような派手な (?) 拡張は存在せず、独自の解釈的な拡張が多いようです)、/Za で ANSI C/C++ と互換性の無い機能を無効にできるそうです。(GCC の -ansi -pedantic 相当。)
「/Za、/Ze (言語拡張機能の無効化)」
http://msdn.microsoft.com/ja-jp/library/0k0w269d.aspx
「Microsoft C/C++ の拡張機能」
http://msdn.microsoft.com/ja-jp/library/34h23df8.aspx
VC++ の拡張機能を有効にする /Ze オプションは、VC++ 2008 で付けると「cl : コマンド ライン warning D9035 : オプション 'Ze' の使用は現在推奨されていません。今後のバージョンからは削除されます。」という警告が出ます。
2009年08月07日
"C and the AT&T Unix Port -- A Personal History", Stephen C. Johnson (翻訳)
http://roguelife.org/~fujita/COOKIES/HISTORY/USENIX/johnson.html
続きを読む
2009年08月05日
AndroidのSDKではgoldfishという仮想ハードウェアをqemuで動作させています。この環境は実際のハードウェアがなくても動作させることができるのでとても便利です。goldfishはCPUがARMv5TEアーキテクチャのarm926なのですが、これをARMv6アーキテクチャのarm1136に置き換える実験をしてみたところ意外にすんなり動きました。
その手順をここで紹介します。
2009年08月03日
pre K&R C の時代は、return 文が取る式を () で囲むことが文法上必須でした。その時代の習慣を引きずったためか、K&R (第1版) でも return 文の後の式を括弧で囲っていたようです。(私は第2版しか所有していないので確認できないのですが。)
そのため、今でも括弧を付ける人もいるようです。一方、括弧を付けると return を retuan のようにタイプミスした時に関数呼び出しとして解釈されてしまい、コンパイルエラーにならない(リンク時にはエラーになる)ために良くないと主張する人などもいるようです。いずれにせよここらへんの話は、IDE やエディタがキーワードをハイライトしてくれるようになった現在では、好みの問題の範囲と言えるでしょう。
http://www.math.utah.edu/computing/compilers/c/Ritchie-CReferenceManual.pdf
return ;
return ( expression );
しかし、そもそも私には、この () が pre K&R C で必須だった理由がわかりませんでした。最後に ; が必須なのですから、この括弧があることにより、特にパーシングに対して有利ということもありません。続きを読む