久しぶりに Risse を弄っていました。
RisseにPythonライクなパッケージの概念を導入しました。
概念としては、いままで一つだけだった global が、パッケージごとに存在することになります。パッケージごとに global、つまり大本の名前空間が別れているため、名前空間の衝突をあまり心配しなくて良くなります。
構文としては
import math;
のようにすると、もしmathパッケージに sin というメソッドがあれば
math.sin(f)
のように呼び出すことができるようになります。
as で別名を指定して
import math as m;
のようにし、
m.sin(f)
のように呼び出すことも可能です。
あるいは
import sin in math;
や
import * in math;
とすると、指定された識別子を直接インポートすることができます。この場合は math. をつけずに
sin(f)
のようにして直接呼ばれるようになります。
パッケージは階層を持つことができて、これはパッケージのおいてあるディレクトリの階層にマッピングされています。たとえばパッケージ検索パスに graphics/rina.rs というパッケージがあれば import graphics.rina; でインポートすることができます。この rina.rs はそのパッケージがどこかで初めて import されたときに、そのパッケージを global として1回だけ実行されます。
言語仕様上重要な Object や String などのクラスはすべて risse というパッケージに入っていると見なされています。すべてのパッケージは、その初期化の際、暗黙のうちに
import * in risse;
が実行されたかのように振る舞います。つまり、risse パッケージにあるすべての識別子が自動的にインポートされます。
実のところ import 文は this::import( ) の呼び出しをコンパイル時に生成する糖衣構文です。this はトップレベルの場合 global ですので、トップレベルに import 文を書いた場合は global::import( ) が呼ばれることになります。
import は Object クラスで定義されているので直接呼び出すことが可能ですが、引数の形式がかなり複雑なので import を使った方が楽でしょう。
また、この性質から、
class C {
import * in math;
}
のようにしてクラスメンバとしてパッケージをインポートすることができます。
( ゚Д゚)ホスィ・・・
出たけどここで書いたやつはあんま状況が変わってない模様。4.2よりは良くなってるけど、まあ、駄目という判断。あれ、これループが展開されちゃってるな。
SIMD以外の最適化がどう良くなっているのかはあまり見ていません。処理負荷が特に集中するグラフィック周りはどうしてもSIMDによる最適化をしなければならないので、そこが遅いと残念な気分なのです。
gcc4.2でいろいろ試していたのですが、intrinsicを使って書いた MMX 用コードが C 言語版コードより遅かったです。そのときは「そういうこともあるだろう」と思って気にしなかったのですが、別のコードを MMX/SSE 用に書いたら、これまた遅い。
コンパイラの吐いたコードを見てみると、ものすごい量のローカル変数への load と store。MMXレジスタなんて mm0~mm2 の3つしか使ってない。いちいち結果をメモリに store しているなどなど。
奇妙に思って こういうソースコード を -masm=intel -O3 -march=athlon64 -mtune=athlon64 でコンパイルしてアセンブリ言語を出力させてみると
ということで、見た感じ、コード品質は gcc4.2.1 << gcc3.4.5 < gcc.4.1.2 の予感。
実際に TLG6 のデコーダで使われているコードでベンチマークを走らせてみると、この MMX/SSE を使った該当部分、 gcc3.4.5 で作成したバイナリでは 1100ms で終わる処理が、 gcc4.2.1 で作成したバイナリでは 1800ms ほどかかります。ちなみに gcc3.4.5 で吐いたバイナリの速度は手書きでアセンブリ言語で書いた TLG6 デコーダの該当部分と互角の速度のよう。
新しいバージョンでは改善してるのかなとおもって、 ここに gcc43-20061204.tar.bz2 という gcc 4.3.0 のバイナリがあったので それで試してみると gcc4.2.1 とほぼ同じコードを吐きました。
うーーん、まいった。新しいバージョンのコンパイラで改善しているならばまだ良いんですが 4.3 のバイナリでも改善してないとは。いや、4.3 まだ正式には出てないので本当のところどうなっているのかはチェックしてないですけど。
gcc3.4.5 に戻るという手もありますが、吉里吉里3が正式にリリースされる時期に見合ったコンパイラを使いたいですし、わざわざ古いコンパイラに戻るのもどうかなぁと。あるいはここだけ古いコンパイラを使うとか? なんか全然シンプルな解法じゃないですね。
どなたかここら辺の事情をご存じの方いらっしゃいますか。