* 高速化のアイデア -(by [[K]], 2013.04.02) ** 基本的な考え方 -OSECPUは遅い。JITコンパイラだからインタプリタ方式よりは間違いなく速いと思うけど、それでも普通の機械語よりは遅い。 -これを気にしないということももちろんできるし、あきらめるということもできるけど、それはやっぱり僕らしくはない。OSECPUが教材用であることを含めても、やはり気になる。 -.NETではこれをunsafeという方法で克服したらしい。よくわからないけど、要するにバイトコードの中に機種依存な機械語を混ぜることにしたのだろう。・・・実は僕も似たようなものを先日まで考えていたのだけど、それはやめた。新しい方法を思いついたのでそれをここに書きたい。 -unsafe方式の残念なところは、Windows用のunsafeなコードが入っている場合に、他のOSでは動かなくなってしまうところにある。また、インターネット上のunsafeなものは実行できないらしい。 -僕は次のような代替案を考えている。 --OSECPUはunsafeみたいなフォーマットを持たず、基本的にアプリもライブラリもOSECPUのバイトコードのみで書かせる。これにより性能さえ気にしなければ、最も高いセキュリティ機能と、十分な互換性を提供できる。 --一方で、オプションのライブラリとして、高速化フレーズライブラリというものを持つ。これはある種のバイトコード列を見つけたら、JIT時にライブラリ内に登録済みの機械語のほうを使うというものである。このライブラリはスタティックリンクやダイナミックリンクをして使うような普通のライブラリではなく、翻訳キャッシュの辞書みたいなものである。 --ユーザは信用できるソースから生成した機種依存のコードのみを自分のライブラリに登録しておけばいいだろう。 --この方法なら、配布元が「これは安全だ、署名もあるぜ、信用しろ」と言ってきて、なんかうさんくさいけどこれがないと動かないからあきらめて使う、みたいなことも起きない。 ---そういうものはOSECPUの標準JITコンパイラで、低速なまま使えばいいのだから。 ** 議論 -unsafe方式でも、unsafeな部分を全てDLLとして外部に追い出した上で、そのDLLのunsafe版とsafe版の両方を提供してユーザに選ばせれば同じことはできる。しかしそのunsafe版だけど、果たしてそれは信用できるものなのか? --信用するためには最低でもオープンソースである必要があるだろうし、自分の手元でビルドしないと不安だ。 --そうでなければ、ある特別な入力が与えられるまでは完全におとなしくしていて、その合図と共に悪さを始める、なんていうコードではないとどうして確信できるだろう。 -オープンソース化してきちんと確認するためには、コードの量が膨大になってはいけない。 --ということで「オレオレな」unsafeコードをたくさん作られても困る。 -一方で、自分で作ったものはもちろん信用できるから(バグはあるかもしれないけど、少なくとも悪意はない)、審査を受けないと実行できないとかそんなのはごめんだ。警告すら出てほしくない。なぜシステムに僕の作品を危険物呼ばわりされるのだ。ソースを公開してないメーカ製のライブラリのほうがはるかに注意を要するというのに。 -フレーズ方式なら、とにかく確認が取れたものから登録していける。遅くて我慢ならないところから確認して登録すればいいだろう。さらにフレーズ方式は、既存のアプリに対しても「この部分はこうやってJITコンパイルしてくれ」と指示することが可能である。したがって他人が作ったものを部分的に解析して、高速化することもできる。 -先ほどはunsafe方式でも「DLLのunsafe版とsafe版の両方を提供すれば同じことはできる」と書いたが、果たして配布元はそんなに気の利いたことをしてくれるだろうか?という心配もある。 --開発元としてはunsafe版を使ってほしいと思っているに違いない。それこそが(自分たちの考える)本来の速さだと思っているに違いない。その気持ちは分かる。 --しかしそれを買ってきてorダウンロードして使う側としては、むしろ心配なのだ。スピードよりもまずは安全がほしい。というかそのためのOSECPUではないか。だからsafe版を必ず開発してほしい。unsafe版だけでいいや、十分だと思わないでほしい。 --フレーズ方式なら、結果的にsafe版の提供を回避することはないだろう。 -アプリのコードもおそらく80-20ルールに従うだろう。つまりコードのうちの20%程度を高速化フレーズで置き換えるだけで、機種依存で最適化されたプログラムと遜色ない(まあ20%くらいしか遅くない?)スピードが出るだろう。しかもその高速化フレーズはおそらく多くのプログラムで共通な部分が多く、その重複も考えれば、アプリの全コード量のうちの1%未満の量の確認だけで、僕の期待する安全性が得られるのではないかと想像する。 --スピードについては100%にならないわけだけど、それはセキュアなこととのトレードオフだからしょうがない。僕は1.2倍程度で済むのであれば許容してもよい。 -インターネット上のものでも、フレーズさえ一致すれば高速化される。だから定番のフレーズを使っている限りインターネット上のものでも高速だし、もしくはこのフレーズを登録すれば速くなりますって、高速コードのソースを公開してもいい。 --僕はコードを精査していれるかどうかを判断する。 --僕はコードを精査して入れるかどうかを判断する。 ** メモ -フレーズ方式だとラベル番号が比較の際に邪魔になるので、OSECPUの上位の命令体系では、ラベル番号が生では現れない形式のほうが好ましい。 --lbstk表記(のバイナリ版)を上位の命令体系で採用すればいいかなと思っている。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。