Island Life

< http://homepage3.nifty... | すげぇ→一輪セグウェイ。 >

2004/04/25

Lispで一番クリティカルな部分を速度で最適化する場合、 (optimize (speed 3) (safety 0)) とかにして、 型宣言をつけまくるわけだが、関数を編集して再定義したら インタラクティブに(disassemble 'foo) してどういう アセンブリコードが出てるかを調べる、というのをよくやる。 首尾良くCで書くのと同等のコードが出たらニンマリ。 もちろん(safety 0)だとミスればSEGVるところまでCと同等になるんだけど。

結局そのへんの泥臭さってのは、Cで書いててもLispで書いてても 似たようなもので、Lispプログラマも必要に応じて 「コードがどういうアセンブリに落ちるか」を意識する。 というか、80年代からLispやってた人達ってのは性能に関する議論を はじめるとだいたいそのレベルで考えるみたいで、 すぐに「こっちの方が1インストラクション少なくて済む」とか 「メモリロードが少なくなる」とかそういう話になる。 (MLerもコンパイル後のコードにセンシティブなような 印象があるんだけど、あんまり話したことないから知らない)。

そういう「低レベル(=アセンブラに近い)プログラミング」を している場合でも、Lispだとマクロを使ってがんがん定型処理を 自動化してくから、Cで書くのに比べてはるかに楽ではあるんだが。

このへんの感覚は、90年代以降に登場した高級言語とちょっと違う ような気がする。処理系そのものにタッチしている人を除いては、 その言語をかなり使ってる人でも、コンパイラの吐くコードがどうかって 考えながら書く人ってあんまりいなさそう。 それをしなくていいのが高級言語のいいところ、ってのはそうなんだけど、 クリティカルな部分でunder the hoodのどろどろしたところを いじりたいっていう要求もあるわけで。

効率は欲しいけどそういうどろどろは嫌、って人がstatically typedな 関数型言語に流れるんかな。コンパイラを賢くして全部やらせようっていう。

まあ、Lispっつっても処理系はいろいろあるわけで、 バイトコード処理系だとそこまでこだわりはないしな。 Gaucheだってネイティブコードにコンパイルしての最適化までやる気はないし。 VMレベルではもっと速くしたいけど。

いやまてよ。新しめの言語に比べて、そもそもLispは処理系に興味がある人くらいしか 触ってないって可能性があるか。

Tags: Programming, Lisp

Past comment(s)

hira :

そういやJavaの最適化ってVMレベルでがんばってますよね。それでバイトコードコンパイラが下手に良いコードを吐くと、かえってVMの最適化網に引っかからず逆効果になったりして。ループの展開で遅くなったり、トリッキーなコードでステップ数を稼いでも遅くなったりなんてざらにありました。だから、バイトコードを見ても速くなったかどうかなんて分からないんですよね。実際にターゲット上のVMでベンチ取らないと速度に言及することは出来ないと。私の場合、そんな経験してるからGaucheでもdisasmしながら良いバイトコードにしていこうなんて気にはならないと思います。Perl本にあったような「VM好みの書き方」が紹介されるまで気にしないでおこうと。
VMの最適化については、バイトコードの仕様を自由に変えられるGaucheと仕様が固まってるJavaとではぜんぜん違うと思うのですが、昔の組み込みJavaVMの場合、如何にキャッシュに収めるかが勝負だったような気がします。とはいっても、メモリがたくさん使える環境ではJITにボロ負けだったのですが(たしか20倍くらい遅かった)。

ささだ :

新し目の言語では、そもそも速度に気をかける機会が減ったとか(マシン速度の向上, そもそもそんなプログラムは書かない, など)。