]追加された行はこの色です。削除された行はこの色です。COFFとの比較-まず、ベースとなるソースプログラムを提示します。}-たったこれだけの128バイトのプログラムです。3.4.5で普通にコンパイルすると(=リンクはしない)、以下の500バイトのCOFFファイルが得られます。ntf.-128バイトから500バイトになるなんて!-中身は見ての通りゼロばかりでスカスカです。-この中には32バイトの.textセクションと、0バイトの.dataセクションと16バイトの.rdataセクションと0バイトの.bssセクションがあります。-128バイトのソースから作るからスカスカなんだという反論は可能で、だからもっと長いソースから作ればスカスカ率は改善するかもしれないです。--手元にあるobj2uxf.cのコンパイルで実験したところ、15.9KBのソースに対して6.52KBのCOFFファイルでした。-こうなった原因の一つに、asがあまり優秀ではないということがあります。無駄なパディングが多すぎるのです。これはasがダメなのであって、COFFの仕様のせいではないです。-というこで、gccにアセンブラソースを出力させて、gas2naskを使ってnask向けソースに変換し、objを作ってみました。_uxfdl_printf.-128バイトが382バイトになりました。スカスカ感はあまり変わりません。-.textセクションが17バイトに、.dataセクションが7バイトになりました。.bssは0ですが、.rdataはありません(naskでは.rdataに対応しておらず、すべて.dataに読み替えられます)。-これをuxfに変換するとこうなります。fhello...-超スッキリです!41バイトです。.bssのサイズがすぐにわかります。-uxfでは_uxfdl_で始まるラベルについては、_uxfdl_が省略されて格納されます。--uxfdlというのはuxfのダイナミックリンクという意味です。world\n"を表示するのに必要なバイト数は16バイトでした。"hello\n"ならもっと小さくできるでしょう。それと比べたら、uxfは全然だめです。-でもこのサイズのhelloを作るのは結構大変で、C言語でちょろっとソースを書いてコンパイル、というわけにはいきませんでした。今回、uxf版は_uxfdl_という変なものがついてはいますが、でもそれ以外は普通の標準関数です。-efg01でも普通のC言語ソースでhelloを書いたらどうなるかの実験をしましたが、67バイトを要しました。worldの分の違いがあるとはいえ、41バイトとは有意な差です。-efg01は、APIも独自の仕様を選び、また内部のエンコードもgh4という4ビット体系を選び、とにかくサイズにこだわりました。便利な機能がAPIにそろっていますが、仕様が分かりやすいわけではなく、またローダもそれなりに大きくなっていました(15.0KB)。-今回はC言語で書ける範囲でしか頑張らないようにしていますし、ビット演算も少なくして8ビット単位のエンコードを採用しています。-uxfは「簡単な割には結構いけている」を目指しています。x86の究極はefg01です。-それに今や究極の小ささに関してはOSECPU-VMがあるので、efg01は中途半端で、だからuxfにも存在意義があると思っています。uxfdlを付ける仕様を選んだのか?-gccでprintfを普通に使うと、putsやputcharに置き換えるという最適化を勝手にやることがあります。これが意図せず行われると期待と異なる結果にある場合があり(サイズ的に)、それを回避したいというのが理由の一つです。uxfdl_を付ければgccはそういうおせっかいはしません。-また単にprintfを書けばいいということにすると、uxf生成プログラムは、このprintfがエラーにするべき未解決リンクなのか、それともダイナミックリンクしてほしい意図的な未解決リンクなのか、簡単には判断できません。uxfdl_を付けたらエラーにはしない、というルールにしています。-さらにC言語でprintfと書くと、COFF内のシンボル名では頭にアンダースコアが付与されて「_printf」になります。これも気に入りません。標準関数のダイナミックリンクは使用頻度が高いのでアンダースコアなんてついてほしくないです。_printfだったらアンダースコアを取る?それって内部にテーブルを持つのか?そんなの面倒です。uxfdl_を付ければいいじゃないですか。uxfファイルの生成時にこれをシンボル名から取り除くというルールにすればいいのです。4バイトを書かずにsh8でエンコードしているのか?-「シンプルを目指すのならsh8とかにしないで32ビットをそのまま書けばいいじゃないか!」それはその通りです。あ64ビットアーキテクチャだったらどうでしょうか。64ビットをだらだらと書くのでしょうか。それって何か違うと私は思いました。-そう考えて、だから可変長にすることこそ本質だとして、じゃあどんな可変長なら受け入れられるかを考えました。その結論がsh8です。uxfでCOFFの代用はできるか?-今のuxfでは.rdataは記述できません。デバッグ情報とかも載せられません。それを除けば、COFFの代用は可能です。-今のuxfでは.rdataは記述できません。デバッグ情報とかも載せられません。それを除けば、COFFの代用は可能です(つまりobjファイルをuxfで記述するということ)。-まあちょっと仕様変更すれば.rdataやデバッグ情報を積める余地が出てくるので、そうすればCOFFの完全代用も十分に可能です。