page0084
の編集
http://osecpu.osask.jp/wiki/?page0084
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* OSECPU-VMはなぜJavaVMと違うのか? -(by [[K]], 2014.06.11) ** (0) -バイトコードのVM方式の代表といえば、やはりJavaだと思う。完成度においては後発の.NETのほうが上かもしれないけど、先駆者はJavaであって、その歴史的偉業の大きさは比較にならない。 -Javaや.NET以外にもたくさんのバイトコードVMがあるけど、それらはみんな似たり寄ったりである、OSECPU-VMと比べれば。・・・ということでここではJavaを代表にして、OSECPU-VMと比べたい。 -決定的に違うのはアプリのサイズである。しかしこれは結果であって原因ではない。 ** (1) -JavaもOSECPU-VMも最初の目的は同じである。CPUやOSに依存しないアプリ実行環境を整備したい。・・・しかしこの目的を達成するためのアプローチが大きく異なる。 -Javaは、まずJavaという高級言語を設計した。.NETもC#などの高級言語を設計した。そしてバイトコードというのは、これらの高級言語のための中間コードでしかない。主役ではないのである。・・・だから気合が入っていない。完成度もそれなりである。 -これに対してOSECPU-VMではまずバイトコードから設計する。そのバイトコードを生成するためのコンパイラもアセンブラもすべて後回しである。そもそもよいバイトコードとは何か?そこから始まる。 --(1-1)よいバイトコードは、命令セットがシンプルでVMが書きやすい。 --(1-2)よいバイトコードは、アプリをコンパクトに記述できる。 --(1-3)よいバイトコードは、アプリバイナリが圧縮しやすい。 -そもそもアプリが簡潔に記述できないというのはどういうことなのか。それは無駄な記述を強いられていることに他ならない。そんなことが許されるだろうか。それは美しいだろうか。それは正しいだろうか。 -高級言語だけをみて、その実現手段を気にしないということはできる。しかしその土台であるバイトコードの完成度がいい加減だとしたら、その上によい高級言語を構築できるだろうか。まずは基礎をしっかりさせるべきではないのか。 -OSECPU-VMはx86やARMやMIPSや68040や6809などの既存のよくできたCPUの機械語の研究から出発した。ここから無くてもかまわない命令を取り除き整理した。 -高級言語の理想とは、人間にとって使いやすいことであろう。そして人間とは非合理的で非効率的な存在である。そんなものに迎合すれば、それなりのものしかできない。一方で機械は合理的で効率的である。これを土台にすればマシになるのは当然だろう。・・・Javaのバイトコード設計者がCPUの機械語にもう少し詳しければ・・・。 -ここまで批判されるほど、Javaはダメなのか。多少は無駄があったかもしれないが、それでも1~2割程度なのではないか。・・・そう思うだろう。いやほんとにそうだったらどんなによかっただろう。現実はとても厳しい。→[[page0066]] -しかも悲しいことに、ダメなのはJavaだけではないのだ。他のバイトコードもJavaと大差ない。つまりJavaが悪いのではなく、高級言語屋が作ったVMは全部ダメなのである。彼らはバイトコード設計には向いてない。そういわざるをえない。 -僕たちのような機械語屋は最近はかなり不人気である。「今どき、そんなこと必要ないでしょ」とバカにされることも少なくない。僕も大勢では彼らの見解に賛成である。・・・しかしそれにしてもこの結果はひどい。ないがしろにしたツケがこんなところにあったのだ。 ** (2) -OSECPU-VMでは、まず小規模なアプリを研究した。これはおそらく一般的なアプローチではない。世間の人たちはまず大規模な事例だけを研究対象にする。確かに大規模なアプリでの1%の改善は小規模なアプリの10%の改善よりも価値があるだろう。 -しかし大規模アプリは、たいていの場合、もはや全体が見えていなくて、局所最適化の集合体になってしまっている。本当はこう書くべきなのに、そうなっていないのだ。そんなプログラムに対して、命令の使用頻度を調べて命令セットを工夫しても、それはダメなプログラムがコンパクトに書けるだけで、よいプログラムが小さくならない。・・・とはいうものの、僕も最初からそれに気づいていたわけではなく、単にすぐには大規模アプリを用意できなかっただけなのであるが。 -小さなアプリを小さく書けるようにするというのは、実は当たり前のことである。単純なものは簡潔に記述できるべきである。「こういう規則にしておけば、小規模なときは不利だけど大規模では有利なはず」みたいなことを設計者はやりがちなのだけど、それはたいてい間違っている。・・・結局は大きなプログラムも小さなプログラムの集合であり、小さなプログラムのための工夫を大きなプログラム内でも積極的に利用できることがわかった。そしてそのように書き直すと、大きなプログラムも劇的に改善するようである。 ** (3) -僕は可逆圧縮のマニアでもある。圧縮アルゴリズムがどれほど苦労して圧縮をしているのか知っているのである。だからそれを邪魔したくはない。むしろ手伝いたい。だから圧縮前からできるだけ小さくしておきたい。余計な情報は最初から取り除いておく。 -処理内容が似ているものはバイトコードも似るべきである。そうすれば圧縮しやすい。 ** (9) メモ -命令セットがシンプル: --メモリにアクセスするのは、ロードストア系のみ。即値を指定できる命令も即値ロード命令のみ。 --フラグレジスタを持たず、レジスタの値によって制御する。比較した結果も普通の整数レジスタに格納させる。 --演算系もたとえば加算はADD命令しかなく、INC/DECなどの命令はない。ビット反転するNOTやCOMみたいな命令もない(それは-1とのXORで行う)。符号反転するNEGみたいな命令もない(それは-1のMULで代用)。 -小規模なアプリから学んだこと: --十分にレジスタが豊富なら、レジスタによる演算が中心となる。メモリを参照する頻度は高くない。 //小さなプログラムの典型的なパターンに配慮してない。レジスタ中心とか。 //小さくする気があるのか?まじめにやっているのか? //人間は非合理・非効率、機械は合理的で効率的。数学的な美しさが正しいのと似ている。 * こめんと欄 #comment
タイムスタンプを変更しない
* OSECPU-VMはなぜJavaVMと違うのか? -(by [[K]], 2014.06.11) ** (0) -バイトコードのVM方式の代表といえば、やはりJavaだと思う。完成度においては後発の.NETのほうが上かもしれないけど、先駆者はJavaであって、その歴史的偉業の大きさは比較にならない。 -Javaや.NET以外にもたくさんのバイトコードVMがあるけど、それらはみんな似たり寄ったりである、OSECPU-VMと比べれば。・・・ということでここではJavaを代表にして、OSECPU-VMと比べたい。 -決定的に違うのはアプリのサイズである。しかしこれは結果であって原因ではない。 ** (1) -JavaもOSECPU-VMも最初の目的は同じである。CPUやOSに依存しないアプリ実行環境を整備したい。・・・しかしこの目的を達成するためのアプローチが大きく異なる。 -Javaは、まずJavaという高級言語を設計した。.NETもC#などの高級言語を設計した。そしてバイトコードというのは、これらの高級言語のための中間コードでしかない。主役ではないのである。・・・だから気合が入っていない。完成度もそれなりである。 -これに対してOSECPU-VMではまずバイトコードから設計する。そのバイトコードを生成するためのコンパイラもアセンブラもすべて後回しである。そもそもよいバイトコードとは何か?そこから始まる。 --(1-1)よいバイトコードは、命令セットがシンプルでVMが書きやすい。 --(1-2)よいバイトコードは、アプリをコンパクトに記述できる。 --(1-3)よいバイトコードは、アプリバイナリが圧縮しやすい。 -そもそもアプリが簡潔に記述できないというのはどういうことなのか。それは無駄な記述を強いられていることに他ならない。そんなことが許されるだろうか。それは美しいだろうか。それは正しいだろうか。 -高級言語だけをみて、その実現手段を気にしないということはできる。しかしその土台であるバイトコードの完成度がいい加減だとしたら、その上によい高級言語を構築できるだろうか。まずは基礎をしっかりさせるべきではないのか。 -OSECPU-VMはx86やARMやMIPSや68040や6809などの既存のよくできたCPUの機械語の研究から出発した。ここから無くてもかまわない命令を取り除き整理した。 -高級言語の理想とは、人間にとって使いやすいことであろう。そして人間とは非合理的で非効率的な存在である。そんなものに迎合すれば、それなりのものしかできない。一方で機械は合理的で効率的である。これを土台にすればマシになるのは当然だろう。・・・Javaのバイトコード設計者がCPUの機械語にもう少し詳しければ・・・。 -ここまで批判されるほど、Javaはダメなのか。多少は無駄があったかもしれないが、それでも1~2割程度なのではないか。・・・そう思うだろう。いやほんとにそうだったらどんなによかっただろう。現実はとても厳しい。→[[page0066]] -しかも悲しいことに、ダメなのはJavaだけではないのだ。他のバイトコードもJavaと大差ない。つまりJavaが悪いのではなく、高級言語屋が作ったVMは全部ダメなのである。彼らはバイトコード設計には向いてない。そういわざるをえない。 -僕たちのような機械語屋は最近はかなり不人気である。「今どき、そんなこと必要ないでしょ」とバカにされることも少なくない。僕も大勢では彼らの見解に賛成である。・・・しかしそれにしてもこの結果はひどい。ないがしろにしたツケがこんなところにあったのだ。 ** (2) -OSECPU-VMでは、まず小規模なアプリを研究した。これはおそらく一般的なアプローチではない。世間の人たちはまず大規模な事例だけを研究対象にする。確かに大規模なアプリでの1%の改善は小規模なアプリの10%の改善よりも価値があるだろう。 -しかし大規模アプリは、たいていの場合、もはや全体が見えていなくて、局所最適化の集合体になってしまっている。本当はこう書くべきなのに、そうなっていないのだ。そんなプログラムに対して、命令の使用頻度を調べて命令セットを工夫しても、それはダメなプログラムがコンパクトに書けるだけで、よいプログラムが小さくならない。・・・とはいうものの、僕も最初からそれに気づいていたわけではなく、単にすぐには大規模アプリを用意できなかっただけなのであるが。 -小さなアプリを小さく書けるようにするというのは、実は当たり前のことである。単純なものは簡潔に記述できるべきである。「こういう規則にしておけば、小規模なときは不利だけど大規模では有利なはず」みたいなことを設計者はやりがちなのだけど、それはたいてい間違っている。・・・結局は大きなプログラムも小さなプログラムの集合であり、小さなプログラムのための工夫を大きなプログラム内でも積極的に利用できることがわかった。そしてそのように書き直すと、大きなプログラムも劇的に改善するようである。 ** (3) -僕は可逆圧縮のマニアでもある。圧縮アルゴリズムがどれほど苦労して圧縮をしているのか知っているのである。だからそれを邪魔したくはない。むしろ手伝いたい。だから圧縮前からできるだけ小さくしておきたい。余計な情報は最初から取り除いておく。 -処理内容が似ているものはバイトコードも似るべきである。そうすれば圧縮しやすい。 ** (9) メモ -命令セットがシンプル: --メモリにアクセスするのは、ロードストア系のみ。即値を指定できる命令も即値ロード命令のみ。 --フラグレジスタを持たず、レジスタの値によって制御する。比較した結果も普通の整数レジスタに格納させる。 --演算系もたとえば加算はADD命令しかなく、INC/DECなどの命令はない。ビット反転するNOTやCOMみたいな命令もない(それは-1とのXORで行う)。符号反転するNEGみたいな命令もない(それは-1のMULで代用)。 -小規模なアプリから学んだこと: --十分にレジスタが豊富なら、レジスタによる演算が中心となる。メモリを参照する頻度は高くない。 //小さなプログラムの典型的なパターンに配慮してない。レジスタ中心とか。 //小さくする気があるのか?まじめにやっているのか? //人間は非合理・非効率、機械は合理的で効率的。数学的な美しさが正しいのと似ている。 * こめんと欄 #comment
テキスト整形のルールを表示する