2016.09.14)↑これは何?プログラミング言語を作っていると、実行速度が出なくて悩ましいことがある。プログラムのうち高速化の必要があるところは全体の2割くらいなので、そこだけアセンブラで書けたらいいなと思う。いうときの逃げ道としてC言語が用意しているのはインラインアセンブラだけど、インラインアセンブラをやることにするとアセンブラを解釈できなければいけないので、言語処理系の負担が大きい(naskをライブラリとして呼び出す方法もあるかもしれないけど、それはnaskがないと動かないということになって、情けない)。Cはどっちにしてもアセンブラが必要になるので、インラインアセンブラという手法はいい選択だった。それで、実行バイナリを扱うわけだけど、COFFやELFはオーバースペック過ぎて「僕がほしいのはこれじゃない」感が強い。こんな複雑なフォーマットを解釈しなければいけないのだとしたら、それだけで処理系も相当に肥大化してしまう。必要十分な機能があればそれでいい。第二世代OSASK(efg01)の技術をそのまま使うことも考えたけど、あれはサイズを極端に小さくするために頑張っているので、それもなんかしっくりこない。いうことで、efg01の技術をもっとずっとシンプルにしたようなものを考えた。↑sh8まず、このuxfで使われる可変長整数のエンコードを紹介します(sh8)。このエンコードでセクションサイズやアライン情報などをエンコードします。xxxxxxxxこれより大きな表現も考えられますが、x86の32ビットだけを想定するのなら、これくらいで十分でしょう。この12ビット値を一つの整数として、上記のエンコードでエンコードします。アラインは0~15まで指定できるわけですが、「0」の1バイトアライン指定は別の意味があり、この場合はデフォルトのアラインが利用されます。デフォルトのアラインは16バイトです。したがって、どれも16バイトのアラインで十分なら、アライン情報は0を書いておけば十分です。各セクションの生データは、サイズ情報が1以上の場合のみ記述されます。リロケーション情報は、生データが存在した場合のみ記述されます。リロケーション情報は少し複雑で、次のようになっています。エントリポイントは.textの先頭に固定されています。p;}↑uxfのプログラムはどうやって書くの?基本的にはC言語で書きます。アセンブラで書いてもいいですが。現状ではuxfを出力できるリンカがないので、それを適当に作らないといけません。識別子長を0にしたときに拡張動作にするという道もある識別子はバイト単位なので、長さもバイト数で記述されるリンクタイプ0と1の拡張によって、未解決シンボルを記述できるので、api呼び出しなどを記述できるリンクタイプ2の拡張によって、publicラベルが宣言できるようになるので、先頭以外をentryにさせることもできるし、uxfをobjファイルの別形式として使うこともできる。↑こめんと欄リンカはできました。20:00:34拡張仕様についてもサポートできました。11:05:05まだどこにもアップロードしていません、すみません。