Steel Bank Common Lisp 1.1.8の変更点

[News - Steel Bank Common Lisp](http://www.sbcl.org/news.html)の内容を日本語訳したものです。内容の正しさは保証しません。

-----

# 告知

* MAP-ALLOCATED-OBJECTS（[ROOM](http://www.lispworks.com/documentation/HyperSpec/Body/f_room.htm#room)と一部のSB-INTROSPECTの関数の心臓部）の実装が完全に書き直されました。以前はなかったバグが発生するかもしれません。

# Unicodeに関する修正と機能拡張

* 文字データベース情報が[Unicode](http://ja.wikipedia.org/wiki/Unicode) 6.2のものにアップデートされました。
* [プライマリ合成](http://www.unicode.org/glossary/#primary_composite)と一緒に文字の[正準分解と互換分解](http://ja.wikipedia.org/wiki/Unicode%E3%81%AE%E4%BA%92%E6%8F%9B%E6%96%87%E5%AD%97)のサポートが追加されました。
* 文字列の[Unicode正規化](http://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96)形式（NFC、NFKC、NFD、NFKD）がサポートされました。
* Unicodeで定義されていないコードポイントに対する文字データベースへのクエリが、より間違いの少ない応答をするようになりました。（[#1178038](https://bugs.launchpad.net/sbcl/+bug/1178038)、Ken Harrisによって報告されました）

# 新機能

* [SSE SIMD](http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions)に対する最低限のランタイム、コンパイラインフラがSB-EXT:SIMD-PACKとして整備されました。x86-64ではビルド時featureの`:sb-simd-pack`を介して有効にできます。これによって、SBCL自身にパッチをあてたりすることなく、収録している拡張をライブラリとして有効にできるはずです。長い間ブランチを保守してくれた Alexander Gavrilovに感謝します。

# 機能強化

* 生成されるプロセスのワーキングディレクトリを設定するために[RUN-PROGRAM](http://www.sbcl.org/manual/index.html#Running-external-programs)が:DIRECTORY引数をサポートしました。（[#791800](https://bugs.launchpad.net/sbcl/+bug/791800)、Matthias Benkardによるパッチ）
* [PPC](http://ja.wikipedia.org/wiki/PowerPC)で[ボクシング](http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E5%8C%96)された[ベクタ](http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_v.htm#vector)（[T](http://www.lispworks.com/documentation/HyperSpec/Body/t_t.htm#t)か[FIXNUM](http://www.lispworks.com/documentation/HyperSpec/Body/t_fixnum.htm#fixnum)のベクタ）をスタックに割り当てることができるようになりました。
* PPCで「不変のオブジェクト」をスタックに割り当てることができるようになりました。
* PPCでGENCGC（訳注：SBCLの保守的な世代別ガベージコレクタ）を利用するときWITH-PINNED-OBJECTSがコンシングをしなくなりました。
* `(sb-introspect:find-definition-sources-by-name x :vop)`が関数を変換したものでないVOPについての情報を返せるようになり、IR2CONVERTとSTACKALOCATE-RESULTという種類のDEFOPTIMIZERについても探し出すようになりました。
* [APPEND](http://www.lispworks.com/documentation/HyperSpec/Body/f_append.htm#append)、[NCONC](http://www.lispworks.com/documentation/HyperSpec/Body/f_nconc.htm#nconc)、[LIST](http://www.lispworks.com/documentation/HyperSpec/Body/f_list_.htm)に対するより良い型の導出。（[#538957](https://bugs.launchpad.net/sbcl/+bug/538957)）
* MAP-ALLOCATED-OBJECTS（ROOMの心臓部）が、それまでのその場しのぎの方法ではなく、GCと似たやり方でヒープを走査するようになり、それによっておそらく同じ程度に正確になりました。
* 一部の[ASSERT](http://www.lispworks.com/documentation/HyperSpec/Body/m_assert.htm#assert)された式で途中の評価結果を表示するようになりました。（[#789497](https://bugs.launchpad.net/sbcl/+bug/789497)、Alexandra Barchunovaによるパッチ）
* （RIPに関係する）アンボクシングされた定数への参照が存在するとき、x86-64で逆アセンブルしたときにアンボクシングされた定数値で注釈が付けられるようになりました。

# バグ修正

* LOG{AND,IOR,XOR}（訳注：[LOGAND](http://www.lispworks.com/documentation/HyperSpec/Body/f_logand.htm#logand)、[LOGIOR](http://www.lispworks.com/documentation/HyperSpec/Body/f_logand.htm#logior)、[LOGXOR](http://www.lispworks.com/documentation/HyperSpec/Body/f_logand.htm#logxor)）に対する型導出が、最悪のケースでも、入力の大きさに対する二次関数的にではなく線形にスケールするようになりました。（[#1096444](https://bugs.launchpad.net/sbcl/+bug/1096444)）
* 起動時の*DEFAULT-PATHNAME-DEFAULTS*とSB-EXT:*RUNTIME-PATHNAME*とSB-EXT:*POSIX-ARGV*の初期化の際、文字デコーディングのエラーやディレクトリが削除されているといったエラーに対処するようになりました。
* 連続していない動的（訳注：メモリ）領域にコアを読み込んでも、動的領域の利用量を正しく計算するようになりました。
* 逆アセンブラがSHLDで`,8`を出力していませんでした。
* シグナルハンドラ自身に対しては「不正」なスタックフレームを関連付けるシステムでの、INTERNAL-ERRORシグナルハンドラを介したバックトレースで、割り込まれた（シグナルの）コンテキストからスタックフレームを得るため、saved-fp-and-pcメカニズムを使うようになりました。スレッドを利用しているFreeBSD/x86-64に関係することが判明しています。
* 一部の[LOOP](http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm#loop)文がコンパイルできませんでした。（[#1178989](https://bugs.launchpad.net/sbcl/+bug/1178989)）
* SB-SEQUENCE:DOSEQUENCEがベクタのリテラルに対して動作するようになりました。
* x86とx86-64で、総称的な算術のエラーが発生したときにアセンブリルーチンの呼び出し側を表示するようになりました。（[#800343](https://bugs.launchpad.net/sbcl/+bug/800343)）
* コンパイル時の型エラーが[COMPILE-FILE](http://www.lispworks.com/documentation/HyperSpec/Body/f_cmp_fi.htm#compile-file)の失敗を引き起こさなくなりました。（[#943953](https://bugs.launchpad.net/sbcl/+bug/943953)）
* コードを生成したりダンプするとき、既知の誤ったローカル呼び出しが、おかしな失敗を引き起こさなくなりました。（[#504121](https://bugs.launchpad.net/sbcl/+bug/504121)）
* 多重にインライン化された構造体のコンストラクタがIR2（訳注：[Conversion](http://www.sbcl.org/sbcl-internals/IR2-Conversion.html#IR2-Conversion)）時のcodegenエラーを引き起こさなくなりました。型検査は必要に応じて挿入されます。（[#1177703](https://bugs.launchpad.net/sbcl/+bug/1177703)）
* 符号なし合同算術が正しく（主にFIXNUMと同じ長さのVOPを利用する）符号つき合同算術に変換されるようになりました。（[#1026634](https://bugs.launchpad.net/sbcl/+bug/1026634)）
* インライン化された[&optional](http://www.lispworks.com/documentation/HyperSpec/Body/03_da.htm#AMoptional)を伴なうローカル関数と再帰の組み合わせで、説明を含まないコンパイルエラーが発生しなくなりました。（[#1180992](https://bugs.launchpad.net/sbcl/+bug/1180992)）
* サブワードのBOOLEAN外部型（訳注：[8.2.3 Foreign Type Specifiers](http://www.sbcl.org/manual/index.html#Foreign-Type-Specifiers)）で、ゼロでないことを調べるときに高位のビットを無視するようになりました。
* `(concatenate 'null ...)`がジェネリックなシーケンスに対して失敗しなくなりました。（[#1162301](https://bugs.launchpad.net/sbcl/+bug/1162301)）
* コンパイル時に検出された条件式の値における型の不一致で、定数[NIL](http://www.lispworks.com/documentation/HyperSpec/Body/v_nil.htm)についてのエラーが出るのではなく、正しく報告が行なわれるようになりました。（[EQ](http://www.lispworks.com/documentation/HyperSpec/Body/f_eq.htm#eq)で比較できない[CATCH](http://www.lispworks.com/documentation/HyperSpec/Body/s_catch.htm#catch)タグについても同様の修正がされました）
* 値としての[INLINE](http://www.lispworks.com/documentation/HyperSpec/Body/d_inline.htm#inline)なグローバル関数への参照がコンパイルの失敗を引き起こさなくなりました。（[#1035721](https://bugs.launchpad.net/sbcl/+bug/1035721)）

# 最適化

* [FIXNUM](http://www.lispworks.com/documentation/HyperSpec/Body/t_fixnum.htm#fixnum)と小さな[BIGNUM](http://www.lispworks.com/documentation/HyperSpec/Body/t_bignum.htm#bignum)に対し、より高速な[ISQRT](http://www.lispworks.com/documentation/HyperSpec/Body/f_sqrt_.htm#isqrt)。
* x86-64で、FIXNUMに対し、より高速で小さい[INTEGER-LENGTH](http://www.lispworks.com/documentation/HyperSpec/Body/f_intege.htm#integer-length)。
* x86-64で、コードアラインメントのために使われるマルチバイトNOP命令の数が最小限になりました。
* 64ビットターゲットで、`(signed-byte 64)`あるいは`(unsigned-byte 64)`より小さくてFIXNUMより大きい、コンパイル時に既知の型、またはその[COMPLEX](http://www.lispworks.com/documentation/HyperSpec/Body/t_comple.htm)な亜種に対して、より速い型検査のコードをコンパイラが生成するようになりました。
* x86ターゲットでクロスコンパイルするとき、より多くのALIEN-FUNCALLでINVOKE-WITH-SAVED-FP-AND-PCをインライン展開するようになりました。
* x86系以外のシステムで、[ROOM](http://www.lispworks.com/documentation/HyperSpec/Body/f_room.htm#room)がとんでもなくコンシングをしていたのが直りました。
* 結合しているビット演算で、`(f (f x k1) k2)`のようなパターンを`(f x (f k1 k2))`とするために再結合するようになりました。有理数の値に対する[+](http://www.lispworks.com/documentation/HyperSpec/Body/f_pl.htm)や[*](http://www.lispworks.com/documentation/HyperSpec/Body/f_st.htm)についても同様です。
* 準クォート式が、実行時に等価なリストをコンシングする代わりに、より良く定数畳み込みをするようになりました。([#1026439](https://bugs.launchpad.net/sbcl/+bug/1026439))
* インライン化された高階関数のローカル呼び出しの解析が、より速く収束し、複雑な関数に対してより良いコードを生成するようになったはずです。
* x86-64で、中程度の大きさの（32ビット以下の）整数の定数が、特に符号拡張された`(signed-byte 32)`として表現できるとき、より賢く扱われるようになりました。（Douglas Katzmanのパッチがベースになっています）
* IF/IF変換で、内側の[IF](http://www.lispworks.com/documentation/HyperSpec/Body/s_if.htm#if)の結果が常に偽か常に真である場合（の一部で）でも、確実に正常なコードを生成するようになりました。
* x86系で、マシンワードの変数の右シフトが、ジェネリックなVOPを経由したりせず、素直にSAR/SHRにコンパイルされるようになりました。([#1066204](https://bugs.launchpad.net/sbcl/+bug/1066204))