コンピュータの構成と設計(上) [6日目]

コンパイラの仕組みのはなし.
今けっこう興味あるところ.

2.12 〜 2.15


アセンブラのコードを断片的に示すことの1つに, アセンブラで組んだプログラムの全体像が読者には分からないという点がある」
よかった. 分かんねえのうちだけかと思った.
まあ, まだまだうちはアセンブラの基本がわかってないから, こう判断するのは速すぎるのかもしれないけど, ちょっと安心した.


C言語からアセンブリ言語への翻訳する際の一般的な手順

  • プログラム変数にレジスタを割り付ける
  • 手続き本体用のコードを生成する
  • 呼び出し側の手続きと被呼び出し側の手続きの両方で使用されるレジスタを退避する

おそらく, アセンブリ言語を理解していれば, この作業は単純作業になるんだろうな.
最適化を考えなければ, いつも同じようにやるだけ〜みたいな.


P.119 のソートプログラムの C と Java での性能比較はすごいな.
C と Java それぞれ, C は, 最適化した場合, しなかった場合(O1, O2, O3), Java は, JIT コンパイラを使ったかどうか.
すると, Java は, JIT コンパイラ使うと, 最適化してない C より, Java の方が速くなると書いてある.
最適化しても, C の方が 1.13 倍ほどしか速くない.
ただ, これはバブルソートでのはなしで, クイックソートとなると然程, JIT コンパイラの力は発揮されていない.
なぜかというと, 実行時間が短い場合には, あまり JIT コンパイラの恩恵は受けられないからだろう, と.
ふむ. なるほど.
実行時間がかかる処理の場合, JIT コンパイラの力は絶大で, C と比べて遜色ない速度を叩き出せるってことだね.
これはすごいな.
んで, ちょっと調べてみると, こんなのがでてきた.


少しずつ変換しながら実行する従来の方式より実行速度は速いが、変換に時間を要するので実行を始めるまでにかかる時間は従来より長くなる。

最初に java コマンドを起動させようとするとめっさ遅いのはこれが原因か?
今, 配布されてる Java では, デフォルトで JIT コンパイラとなってるのかな. よーわからん. まあいいか.


2.15 は, 関数に配列(ポインタ)を渡し, その内容を 0 で初期化する関数を用いた, ポイントと配列の違いのはなし.
配列の場合, ループ中のアドレスを計算しなければならないけど, ポインタの場合, アドレスを直接繰り上げている.
そのため, 配列より, ポインタの方が効率の良いアセンブラのコードになる.
でも, 今のコンパイラだと, このような最適化はやってくれるから,
プログラマは, ポインタの方が速いから〜とか気にせず, 配列を使ってよいと.
# 最適化は, 人がやらずに, コンパイラにまかせましょうってことやね.

今日は

すすんだね.
予備知識がすこしでもあるかないかというのは, かなり違うな.
明日で, たぶん2章を終わらせられるかな.

更新時刻

2007年, 10月30日, 1:44