News - Steel Bank Common Lispの内容を日本語訳したものです。内容の正しさは保証しません。
告知
- MAP-ALLOCATED-OBJECTS(ROOMと一部のSB-INTROSPECTの関数の心臓部)の実装が完全に書き直されました。以前はなかったバグが発生するかもしれません。
Unicodeに関する修正と機能拡張
- 文字データベース情報がUnicode 6.2のものにアップデートされました。
- プライマリ合成と一緒に文字の正準分解と互換分解のサポートが追加されました。
- 文字列のUnicode正規化形式(NFC、NFKC、NFD、NFKD)がサポートされました。
- Unicodeで定義されていないコードポイントに対する文字データベースへのクエリが、より間違いの少ない応答をするようになりました。(#1178038、Ken Harrisによって報告されました)
新機能
-
SSE SIMDに対する最低限のランタイム、コンパイラインフラがSB-EXT:SIMD-PACKとして整備されました。x86-64ではビルド時featureの
:sb-simd-pack
を介して有効にできます。これによって、SBCL自身にパッチをあてたりすることなく、収録している拡張をライブラリとして有効にできるはずです。長い間ブランチを保守してくれた Alexander Gavrilovに感謝します。
機能強化
- 生成されるプロセスのワーキングディレクトリを設定するためにRUN-PROGRAMが:DIRECTORY引数をサポートしました。(#791800、Matthias Benkardによるパッチ)
- PPCでボクシングされたベクタ(TかFIXNUMのベクタ)をスタックに割り当てることができるようになりました。
- PPCで「不変のオブジェクト」をスタックに割り当てることができるようになりました。
- PPCでGENCGC(訳注:SBCLの保守的な世代別ガベージコレクタ)を利用するときWITH-PINNED-OBJECTSがコンシングをしなくなりました。
-
(sb-introspect:find-definition-sources-by-name x :vop)
が関数を変換したものでないVOPについての情報を返せるようになり、IR2CONVERTとSTACKALOCATE-RESULTという種類のDEFOPTIMIZERについても探し出すようになりました。 - APPEND、NCONC、LISTに対するより良い型の導出。(#538957)
- MAP-ALLOCATED-OBJECTS(ROOMの心臓部)が、それまでのその場しのぎの方法ではなく、GCと似たやり方でヒープを走査するようになり、それによっておそらく同じ程度に正確になりました。
- 一部のASSERTされた式で途中の評価結果を表示するようになりました。(#789497、Alexandra Barchunovaによるパッチ)
- (RIPに関係する)アンボクシングされた定数への参照が存在するとき、x86-64で逆アセンブルしたときにアンボクシングされた定数値で注釈が付けられるようになりました。
バグ修正
- LOG{AND,IOR,XOR}(訳注:LOGAND、LOGIOR、LOGXOR)に対する型導出が、最悪のケースでも、入力の大きさに対する二次関数的にではなく線形にスケールするようになりました。(#1096444)
- 起動時のDEFAULT-PATHNAME-DEFAULTSとSB-EXT:RUNTIME-PATHNAMEとSB-EXT:POSIX-ARGVの初期化の際、文字デコーディングのエラーやディレクトリが削除されているといったエラーに対処するようになりました。
- 連続していない動的(訳注:メモリ)領域にコアを読み込んでも、動的領域の利用量を正しく計算するようになりました。
- 逆アセンブラがSHLDで
,8
を出力していませんでした。 - シグナルハンドラ自身に対しては「不正」なスタックフレームを関連付けるシステムでの、INTERNAL-ERRORシグナルハンドラを介したバックトレースで、割り込まれた(シグナルの)コンテキストからスタックフレームを得るため、saved-fp-and-pcメカニズムを使うようになりました。スレッドを利用しているFreeBSD/x86-64に関係することが判明しています。
- 一部のLOOP文がコンパイルできませんでした。(#1178989)
- SB-SEQUENCE:DOSEQUENCEがベクタのリテラルに対して動作するようになりました。
- x86とx86-64で、総称的な算術のエラーが発生したときにアセンブリルーチンの呼び出し側を表示するようになりました。(#800343)
- コンパイル時の型エラーがCOMPILE-FILEの失敗を引き起こさなくなりました。(#943953)
- コードを生成したりダンプするとき、既知の誤ったローカル呼び出しが、おかしな失敗を引き起こさなくなりました。(#504121)
- 多重にインライン化された構造体のコンストラクタがIR2(訳注:Conversion)時のcodegenエラーを引き起こさなくなりました。型検査は必要に応じて挿入されます。(#1177703)
- 符号なし合同算術が正しく(主にFIXNUMと同じ長さのVOPを利用する)符号つき合同算術に変換されるようになりました。(#1026634)
- インライン化された&optionalを伴なうローカル関数と再帰の組み合わせで、説明を含まないコンパイルエラーが発生しなくなりました。(#1180992)
- サブワードのBOOLEAN外部型(訳注:8.2.3 Foreign Type Specifiers)で、ゼロでないことを調べるときに高位のビットを無視するようになりました。
-
(concatenate 'null ...)
がジェネリックなシーケンスに対して失敗しなくなりました。(#1162301) - コンパイル時に検出された条件式の値における型の不一致で、定数NILについてのエラーが出るのではなく、正しく報告が行なわれるようになりました。(EQで比較できないCATCHタグについても同様の修正がされました)
- 値としてのINLINEなグローバル関数への参照がコンパイルの失敗を引き起こさなくなりました。(#1035721)
最適化
- FIXNUMと小さなBIGNUMに対し、より高速なISQRT。
- x86-64で、FIXNUMに対し、より高速で小さいINTEGER-LENGTH。
- x86-64で、コードアラインメントのために使われるマルチバイトNOP命令の数が最小限になりました。
- 64ビットターゲットで、
(signed-byte 64)
あるいは(unsigned-byte 64)
より小さくてFIXNUMより大きい、コンパイル時に既知の型、またはそのCOMPLEXな亜種に対して、より速い型検査のコードをコンパイラが生成するようになりました。 - x86ターゲットでクロスコンパイルするとき、より多くのALIEN-FUNCALLでINVOKE-WITH-SAVED-FP-AND-PCをインライン展開するようになりました。
- x86系以外のシステムで、ROOMがとんでもなくコンシングをしていたのが直りました。
- 結合しているビット演算で、
(f (f x k1) k2)
のようなパターンを(f x (f k1 k2))
とするために再結合するようになりました。有理数の値に対する+や*についても同様です。 - 準クォート式が、実行時に等価なリストをコンシングする代わりに、より良く定数畳み込みをするようになりました。(#1026439)
- インライン化された高階関数のローカル呼び出しの解析が、より速く収束し、複雑な関数に対してより良いコードを生成するようになったはずです。
- x86-64で、中程度の大きさの(32ビット以下の)整数の定数が、特に符号拡張された
(signed-byte 32)
として表現できるとき、より賢く扱われるようになりました。(Douglas Katzmanのパッチがベースになっています) - IF/IF変換で、内側のIFの結果が常に偽か常に真である場合(の一部で)でも、確実に正常なコードを生成するようになりました。
- x86系で、マシンワードの変数の右シフトが、ジェネリックなVOPを経由したりせず、素直にSAR/SHRにコンパイルされるようになりました。(#1066204)