メモ
2010年05月28日
最近では gcc、clang に押され気味 (?) ですが、老舗の C コンパイラとして PCC (Portable C Compiler) があります。
http://ja.wikipedia.org/wiki/Portable_C_Compiler
なぜいまPCC? - 高速さとクオリティの高いコード出力が魅力 (2007/10/16)
とりあえずビルドしてみましょう。
2010年05月18日
twitter で見かけたのですが、QEMU をベースにしたバイナリ挙動調査ツールとのことです。
TEMU: The BitBlaze Dynamic Analysis Component
BitBlaze という、セキュリティのためのバイナリ解析プロジェクトの成果物(の一部)のようですね。
続きを読む
TEMU: The BitBlaze Dynamic Analysis Component
BitBlaze という、セキュリティのためのバイナリ解析プロジェクトの成果物(の一部)のようですね。
続きを読む
2010年05月10日
twitter でも follow させていただいている森山さんから、前回の QTextCodec の円記号問題についてコメントいただきました。ありがとうございました。
さっそく試してみました。
2010年04月14日
Gauche (Scheme 処理系) のチャットルームやtwitterなどで話題になっていたのですが、Apple の iPhone OS SDK 4.0 のライセンスの条項 3.3.1 の修正が波紋を広げているようです。
続きを読む
「3.3.1:Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).」
アプリケーションはiPhone OS WebKit engineで処理される為、Objective-C, C, C++または JavaScriptによって書かれなくてはならず、またObjective-C, C, C++または JavaScriptで書かれたコードだけがコンパイルされ、Documented APIにリンクされなくてはならない。(例えば、アプリケーションがintermediary translation(中継の為に変換されたコード)やcompatibility layer or tool(互換性を目的とするレイヤーやツール)を通じてDocumented APIにリンクすることは禁止されている。)
この文章の解釈によっては、Adobe Flash Professional CS5や、NETを利用してiPhoneアプリを開発できる開発環境「MonoTouch」などは禁止という事になるかもしれないようです。
Appleの開発キット以外でアプリを開発するのであれば、Webアプリで開発するように説明してる内容のようです。
Macお宝鑑定団Blog[羅針盤] 2010/04/09 (Fri)
AppleがiPhoneデベロッパライセンス規約を変更し、Adobe Flash Professional CS5などのクロス・コンパイラを禁止に?
(via ただのにっき 2010-04-09(金)■ iPhoneを捨ててAndroidにするよ)
続きを読む
2010年04月12日
Windows で Qt アプリを書いているのですが、Qt の文字列クラス QString はデータを Unicode で持っているので、例えばダイアログから取得した文字列を外部の API や関数に渡す際には Shift-JIS などに変換する必要があります。
# Unicode や Shift-JIS という用語はあいまいなので良くないのですが… 簡単のため。本当は ISO/IEC 10646 や Windows-31J (旧 cp932) と書くべきだと思います。
QTextCodec クラスを使えば良いだけなのですが、なぜか Codec が初期化できなくて苦労しました。(QTextCodec::codecForName("Shift-JIS") が NULL を返す。)
2009年10月16日
以前の記事で使用した 「リアルタイムトレース」 という用語は、KMC が製品の特徴を一言で伝えるためのキーワードとして使用している独自の用語であり、一般的な技術用語では無いので、社外や blog などで使用する時は注意が必要、という指摘を辻さんからいただきました。ありがとうございます。
ARM の ETM/ETB などのトレース機能は、例えばバッファに一時的にトレースデータをため、タイムスタンプなどはパケットがまとめて送信される時に付くので、厳密には本当にリアルタイムではないのだそうです。ARM 社などが「リアルタイム」という用語をあえて避けているのは、その辺の誤解を嫌ってのことなのでしょう。
KMC が「リアルタイムトレース」と言う時のリアルタイムとは、厳密な技術用語の文脈の「リアルタイム」ではなく、「プログラムの実行を止めなくても、動かしながらトレースログを見れる」という意味で使用しています。
例えばリアルタイム OS と言った場合には、スケジューリングや割り込み、システムコールなどの各種処理の実行時間の予測可能性が保証されている、という意味であるように、リアルタイムという用語には様々な技術的文脈でいろいろな意味があるので、説明無しに「リアルタイム」という用語を使ってしまったのは我ながら軽率だったと思います。技術者たるもの、誤解やすれ違いを避けるために、用語の使い方には常に気をつけたいものです。
ARM の ETM/ETB などのトレース機能は、例えばバッファに一時的にトレースデータをため、タイムスタンプなどはパケットがまとめて送信される時に付くので、厳密には本当にリアルタイムではないのだそうです。ARM 社などが「リアルタイム」という用語をあえて避けているのは、その辺の誤解を嫌ってのことなのでしょう。
KMC が「リアルタイムトレース」と言う時のリアルタイムとは、厳密な技術用語の文脈の「リアルタイム」ではなく、「プログラムの実行を止めなくても、動かしながらトレースログを見れる」という意味で使用しています。
例えばリアルタイム OS と言った場合には、スケジューリングや割り込み、システムコールなどの各種処理の実行時間の予測可能性が保証されている、という意味であるように、リアルタイムという用語には様々な技術的文脈でいろいろな意味があるので、説明無しに「リアルタイム」という用語を使ってしまったのは我ながら軽率だったと思います。技術者たるもの、誤解やすれ違いを避けるために、用語の使い方には常に気をつけたいものです。
2009年10月02日
GDBの7.0からReverse Debugging(ヒストリの逆実行)が入るということで、一部で話題になっているようです。
http://www.gnu.org/software/gdb/news/reversible.html
http://d.hatena.ne.jp/hayamiz/20090930/1254323169
(ネタ元は、私がtwitterに張ったURLのようです。すごいブックマークの数ですね。)
ちなみに私は、greenteaさんの獲物で知ったのですが、同僚の佐藤さんやkobaさん、社長などは既に知っていました。
この機能は、GCC Summit 2007で発表されたようです。
http://ols.108.redhat.com/2007/GCC-Reprints/GCC2007-Proceedings.pdf
"Reversible Debugging", Paul Brook(CodeSourcery), Daniel Jacobowitz (CodeSourcery), pp.69-76
佐藤さん曰く、Non-stop multi-threaded debuggingも地味だけど面白いとのことです。
続きを読む
http://www.gnu.org/software/gdb/news/reversible.html
http://d.hatena.ne.jp/hayamiz/20090930/1254323169
(ネタ元は、私がtwitterに張ったURLのようです。すごいブックマークの数ですね。)
ちなみに私は、greenteaさんの獲物で知ったのですが、同僚の佐藤さんやkobaさん、社長などは既に知っていました。
この機能は、GCC Summit 2007で発表されたようです。
http://ols.108.redhat.com/2007/GCC-Reprints/GCC2007-Proceedings.pdf
"Reversible Debugging", Paul Brook(CodeSourcery), Daniel Jacobowitz (CodeSourcery), pp.69-76
佐藤さん曰く、Non-stop multi-threaded debuggingも地味だけど面白いとのことです。
続きを読む
2009年08月17日
MIT の教育システムは本当にすごいですね。
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 リライトまでやられていたとは… いやはや、脱帽です。
続きを読む
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月10日
C99 の規格が成立してから 10 年が経つわけですが、VC++ 2008 では ANSI C89 (ISO C90) までしか対応しておらず、C99 は未対応のようです。
次期の 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' の使用は現在推奨されていません。今後のバージョンからは削除されます。」という警告が出ます。
次期の 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日
少し前の話になりますが、いただいたコメントをきっかけに、puts になぜ改行が付くのかというネタについて調べていた時、面白い論文を教えてもらいましたので紹介します。
"C and the AT&T Unix Port -- A Personal History", Stephen C. Johnson (翻訳)
http://roguelife.org/~fujita/COOKIES/HISTORY/USENIX/johnson.html
続きを読む
"C and the AT&T Unix Port -- A Personal History", Stephen C. Johnson (翻訳)
http://roguelife.org/~fujita/COOKIES/HISTORY/USENIX/johnson.html
続きを読む
2009年07月29日
PARTNER(ARM) のマニュアルを編集していた際、mmu コマンドに /T というオプションを見つけました。マニュアルの説明を読んでもよくわからなかったので先輩に聞いてみたところ、これは TCM (Tightly Coupled Memories) という、ARM コアの内部に存在する超高速メモリ (SRAM) を操作するためのオプションなのだそうです。
TCM は、要するに、ユーザが読み書きできるキャッシュメモリのようなものなのだそうです。容量は小さい (10 数 KB ほど) のですが、DRAM の初期化が済んでない状況でも使えるので、開発の初期段階でちょっとデバッガや簡単なプログラムを動かしてみたい時などに重宝するそうです。また、OS などのシステムソフトウェアの高速化の際にも有用です。(こちらの方が一般的な用途。)
TCM は全ての ARM コアに存在するわけではなく、オプション的に実装されるものなのだそうです。あまりアプリケーションプログラマは恩恵を受けられない機能ですし、SRAM は回路が大きくて実装コストが高いため、実装されないケースも多そうです。特殊な用途の TCM よりも、同じ SRAM を実装するならば、より大きなキャッシュを実装してくれた方がうれしい技術者が多いと思います。
しかし、CPU が速くなれば、相対的にメモリアクセスがボトルネックになりますから、シリコンが余ってきた状況ではおいしい場面も出てくるかもしれません。組み込みの世界では、必ずしも絶対性能は重要ではなく、過去のソフトウェア資産やコストパフォーマンスが重要視されます。ARM 9 ファミリーなどの少し古い v5 アーキテクチャもまだまだ現役です。プロセッサの加工技術が向上すれば、同じアーキテクチャを実装したとしても、シリコンの面積が小さくて済むので、どんどんシリコンが余ります。そのため回路の 1 チップ化 (SoC) を進めたり、コアの数を増やしたりしているようなのですが、TCM のような SRAM もどんどん大きくなっていくのかもしれません。
また、iPhone や Android などが普及し、LLVM などの動的最適化技術 (JIT をより一般的にしたような技術)が進歩すれば、プログラマが意識しなくても、勝手に TCM を使って高速化してくれたりとかいう未来が来るかもしれません。
TCM は、要するに、ユーザが読み書きできるキャッシュメモリのようなものなのだそうです。容量は小さい (10 数 KB ほど) のですが、DRAM の初期化が済んでない状況でも使えるので、開発の初期段階でちょっとデバッガや簡単なプログラムを動かしてみたい時などに重宝するそうです。また、OS などのシステムソフトウェアの高速化の際にも有用です。(こちらの方が一般的な用途。)
TCM は全ての ARM コアに存在するわけではなく、オプション的に実装されるものなのだそうです。あまりアプリケーションプログラマは恩恵を受けられない機能ですし、SRAM は回路が大きくて実装コストが高いため、実装されないケースも多そうです。特殊な用途の TCM よりも、同じ SRAM を実装するならば、より大きなキャッシュを実装してくれた方がうれしい技術者が多いと思います。
しかし、CPU が速くなれば、相対的にメモリアクセスがボトルネックになりますから、シリコンが余ってきた状況ではおいしい場面も出てくるかもしれません。組み込みの世界では、必ずしも絶対性能は重要ではなく、過去のソフトウェア資産やコストパフォーマンスが重要視されます。ARM 9 ファミリーなどの少し古い v5 アーキテクチャもまだまだ現役です。プロセッサの加工技術が向上すれば、同じアーキテクチャを実装したとしても、シリコンの面積が小さくて済むので、どんどんシリコンが余ります。そのため回路の 1 チップ化 (SoC) を進めたり、コアの数を増やしたりしているようなのですが、TCM のような SRAM もどんどん大きくなっていくのかもしれません。
また、iPhone や Android などが普及し、LLVM などの動的最適化技術 (JIT をより一般的にしたような技術)が進歩すれば、プログラマが意識しなくても、勝手に TCM を使って高速化してくれたりとかいう未来が来るかもしれません。
2009年07月27日
C の規格に関するちょっとした話です。
今まで、extern が付いていない最上位宣言での変数宣言(グローバル変数)は、全て定義宣言になるのだと思っていたのですが、厳密には異なるそうです。
(1) と (2) は、単に初期値が与えられているかいないかだけの違いで、どちらも定義に見えます。
ところが、厳密には (2) だけが定義宣言で、(1) は仮定義という扱いになるのだそうです。続きを読む
今まで、extern が付いていない最上位宣言での変数宣言(グローバル変数)は、全て定義宣言になるのだと思っていたのですが、厳密には異なるそうです。
int x; /* (1) */
int y = 0; /* (2) */
extern int x; /* (3) */
(1) と (2) は、単に初期値が与えられているかいないかだけの違いで、どちらも定義に見えます。
ところが、厳密には (2) だけが定義宣言で、(1) は仮定義という扱いになるのだそうです。続きを読む