Tuesday, May 31, 2005

PowerPC よもやま話 - その1 エンディアン

次世代3機種が揃って PowerPC コアを採用することになった。俺はまだ次世代機の開発には携わっていないのだが、以前 PowerPC を使ったプロジェクトに携わったコトがある。その時思ったのだが、日本語による PowerPC の情報ってかなり少ない。一応それなりに知ってるつもりなので、続くかどうかわからないけど、たまに書いてみることにしようと思う。

ゲーム開発者のためのとか思ってるんだが、たぶんかなり CPU よりの話ばかりになってしまって、現代のゲーム開発ではそれほど役に立つとも思えないところが痛い、、、



で、最初の一回目で、エンディアンの話題って、おいおい、全然 PowerPC と関係ないじゃん、今さらそんなことー、という声が聞こえてきそうだな。

エンディアンって何?って人は、こことかここに非常に詳しく書いてある。俺よりはるかにうまく説明してくれる。

なぜ、こんな話をするかって?それは俺がビッグエンディアンが嫌いだからだ(笑)。そのせいで PowerPC まで嫌いになりそうになったくらい嫌いだからだ(笑)。

ちゃんと理解している人はどうでもいいじゃんと思うだろうし、どっちだろうと最近は(ある特殊なアプリを除けば)速度に影響がでるようなものでもないし、宗教戦争なんだからどちらが優れていると主張しても意味ないじゃんとも思う人が大半だろう。

でも、俺はあえて言いたい、ビッグでもリトルでもいいからエンディアンは統一してくれよー(ホントはリトルの方がいいけど)。

エンディアンのせいではまって悩んだり、移植のためにエンディアンを考慮してコードを書いたり、データの移植のためのフィルタを書いたり、ある種の特別なアプリ(エミュレータ等)の高速化に悩んだり、する全世界のプログラマの時間って馬鹿にならないと思うんだよね。

特に今まで PlayStation や x86 の PC でゲームを作ってきた人達には移植とかで色々と問題が起きると思う。

せっかく、組み込みはバイエンディアンのCPU が増えて、PA-RISC が絶滅して、SPARC が絶滅しかけて、Apple だけが細々とPowerPC を使ってて、世の中からビッグエンディアンの CPU が絶滅の過程をたどっていたのに、なんでここにきて、3機種そろってビッグエンディアンのPowerPC にしちゃうんだ!

そもそも、PowerPC もバイエンディアンサポートしてる奴もあるんだから、リトルの PowerPC にしてくれよ。IBM さんの自己都合(過去の資産のため)のためだけにビッグエンディアンになっているのが気にくわない。


以下は、リトルエンディアンの方が優れているという私見なので、蛇足。

大抵は、最初に慣れ親しんだ方が好きだと思うようになるらしいが、俺が昔ICE屋だったことは、M68000 と 8086 どっちが好きと言われれば、もちろん M68000 だったし(86 はセグメントが嫌いだったというのも大きいが)、メモリのダンプを読むことが多かったのでビッグエンディアンの方が好きだった。が、プログラムを書くと言うのが職業になった後は、リトルの方が好きになった。

なぜかと言うと、ビッグは人間に優しいが、リトルはコンピュータに優しいということだ。プログラムを書く上では、コンピュータの気持ちになって書いた方がいいに決まってる。

リトルのメリット:

  • サイズにかかわらずワード内のビット番号が不変。
  • 低い番地に低い方のデータを入れるというのは、数学的に理にかなっている。例えば多倍長の計算をする時など、バイト単位で順に計算をする場合、index は常にメモリの一番下の番地から単調増加すればよい。
  • 何バイト長のデータであろうとも、常に一番下の桁のデータが一番下の番地にあるので統一性がある。
  • キャストがしやすい。
  • データ長の拡張がしやすい。


ビッグのメリット:

  • 人間が読みやすい。人間はメモリの内容を低い番地から高い番地に向かって読む。数字の読み方とメモリ番地上のデータの読み方が一致しているので直感的。
  • 小さい型への丸めがしやすい。


メモリのダンプを見たり、丸めをする頻度を考えたら、リトルのメリットの方がいいと思わない?


あと、IBM のマニュアルを読むと、バイトオーダーとは別にレジスタの説明などのビットオーダーがビッグエンディアンになっている。MSB が 0bit、LSB が 31bit とかになっている。これもビット演算をするときなど非常にめんどくさい。

例えば、マニュアルを読んで、27bit 目が立っている数値を作りたいと思ったら、リトルだと (1 << 27) で済むのに、ビッグだと(1 << (31 - 27))などとしなきゃならない。これも嫌。

Translate into English

0 Comments:

Post a Comment

<< Home