bar_1

contents_map

2014年5月31日土曜日

LLVMプロジェクト: "libc++" C++ 標準ライブラリ 日本語訳

原文は、”libc++” C++ Standard Library http://libcxx.llvm.org/ です。


libc++ は、C++11 をターゲットとした、C++ 標準ライブラリの新しい実装のひとつです。
libc++ でのすべてのコードは、MIT ライセンスか UIUC ライセンス (BSDライクなライセンスのひとつ) の デュアル・ライセンス でライセンスされます。

機能仕様とゴール Features and Goals

  • C++11 標準によって定義された正確性 correctness。
  • 高速な実行。
  • 最小のメモリ使用量。
  • 高速なコンパイル時間。
  • gcc の libstdc++ との ABI 互換性: 例外オブジェクトたち、RTTI やメモリ配置といったいくつかの低水準機能たちのためのもの。
  • 拡張的な単体テスト群。

なぜ C++11 のための新しい C++ 標準ライブラリなのか? Why a new C++ Standard Library for C++11?

手始めの説明の後に、多くの人が「既存のライブラリへの貢献ではなく、なんでわざわざ新しいライブラリなんですか?」とたずねます (Apache の libstdcxx, GNU の libstdc++, STLport, 等が既にあります)。既存ライブラリへの貢献の理由はたくさんありますが、(訳注: 新しく作る) 最大の理由は:
  • 何年もの経験 (以前に標準ライブラリを実装したことを含む) から、どうやってそれらが実装されるかということにおいて、われわれは、ABI ブレイケージ や根本的な変更を要求される、標準コンテナたちの実装について多くのことを学びました。たとえば、一般には、std::string をコピーオンライト (Copy On Write; COW) の代わりに「短い文字列最適化 (short string optimization)」を使って構築することは、マルチコアのマシンのためには最良のアプローチである (とくに右辺値参照のあるC++11 で) と、受け入れられています。古いバージョンのライブラリとの ABI 互換性を破ることは、libc++ のパフォーマンス・ゴールを達成するのに、クリティカルであると判断されます。
  • libstdc++ メインラインは GPL3 に切り替えられましたが、libc++ の開発者たちが使えないライセンスとなりました (訳注: [1])。libstdc++ 4.2 (最後の GPL2 バージョン) は、C++11 をサポートするために独自に拡張されうるものでしたが、これはコードベースのフォークとなるでしょう (このことはプロジェクトには、新しい独立したものを始めることより、しばしば悪いこととして見られます)。libstdc++ のもうひとつの問題は、G++ 開発にタイトに統合されているということで、G++ のバージョンとのマッチングすることに、そうとう緊密に縛られることでしょう。
  • STLport と Apache の libstdcxx ライブラリは、別の 2 つのポピュラーな候補ですが、C++11 サポートを欠いています。われわれの経験では (そして libstdc++ 開発者たちの経験では)、C++11 (とくに右辺値参照rvalue references と 移動のみの型move-only types) のサポートを追加するには、書き直しするとの等しいくらい、ほとんどすべてのクラスと関数を修正する必要があり、実質的には書き直しの量です。書き直しに直面して、われわれはスクラッチから始めようと、経験に基づいた第一のプリンシプルから、すべての設計判断を評価しようと決めました。
  • さらに、これら2つのプロジェクトはどうも見捨てられたようですapparently abandoned: STLport 5.2.1 のリリースは 2008 年の 10 月、STDCXX 4.2.1 は 2008 年の 5 月です。

プラットフォームのサポート Platform Support

libc++ は、g++-4.2 と clang を使用して、以下のプラットフォームで動作することが知られています (C++11 言語サポートの欠落は、いくつかの機能性を犠牲にします)。
  • Mac OS X i386
  • Mac OS X x86_64

現在のステータス Current Status

libc++ は Apple の OS X 上での 100% 完全な C++11 実装です。
LLVM と Clang は、Linux 上で、C++ と libc++ を使った C++11 モードで、セルフホストできます。
libc++ はまた 100% 完全な C++14 実装でもあります。新しい機能仕様群と C++14 のための変更の一覧は、ここで 見られます。
他のプラットフォームへのポーティングは途上です。ここに WindowsLinux での最近のテスト結果があります。

入手して参加しよう! Get it and get involved!

最初にどうかわれわれの開発者のポリシーを見なおしてください。
コードをチェックアウトするには、以下のコマンドを使います:
  • svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
Mac OS 10.7 (Lion) かそれ以降では、このライブラリを入手する最も簡単な方法は、Xcode 4.2 かそれ以降をインストールすることです。しかしながら、もしここであなたが trunk からの最新のものをインストールしたいなら (最先端を入手するということ)、以下を読んでみよう。しかしながら、警告です; Mac OS 10.7 は /usr/liblibc++.1.dylib の正式なコピーがないと、ブートしないでしょう。
次に:
  • cd libcxx/lib
  • export TRIPLE=-apple-
  • ./buildit
  • ln -sf libc++.1.dylib libc++.dylib
これが libc++.1.dylib と libc++.dylib の結果となるはずです。一番安全にやるには、あなたの Mac OS が使っているライブラリを置き換えるのではなく、ローカルに libcxx をインストールした場所から使うことです。
システムにインストールされている (訳注: OS デフォルトの) libc++ を clang で使うには:
  • clang++ -stdlib=libc++ test.cpp
  • clang++ -std=c++11 -stdlib=libc++ test.cpp
Moc OS 上のあなたの最新版tip-of-trunk の libc++ を clang で使うには:
  • export DYLD_LIBRARY_PATH=<path-to-libcxx>/lib
  • clang++ -std=c++11 -stdlib=libc++ -nostdinc++ -I<path-to-libcxx>/include -L<path-to-libcxx>/lib test.cpp
libc++ のテストスイートを実行する (推奨) には:
  • cd libcxx/test
  • ./testit
    • あなたは testit が使うコマンドラインオプションを、export OPTIONS="あなたが必要なオプション" で、変更できます。

ノート Notes

-fno-rtti オプションで libc++ をビルドすることは、サポートされていません。しかしながらそれに対して、-fno-rttiリンクを行うことは、サポートされています (訳注: 強調は翻訳者による)。
ディスカッションを (clang メーリングリスト) に送ろう。

バグレポートたちとパッチたち Bug reports and patches

もしあなたが libc++ にバグを見つけたと思ったら、どうぞ LLVM Bugzilla を使ってそれを報告してください。もしあなたがわからなかったら、cfe-dev メーリングリスト か IRC にメッセージを送信することもできます。サブジェクト (訳注: メールタイトル) に “libc++” を含めてください。
もしあなたが libc++ にパッチの貢献をしたいならば、ベストな場所は cfe-commits メーリングリスト です。どうか “libc++” と “PATCH” をサブジェクト (訳注: メールタイトル) に含めてください。

Linux 上で CMake と libsupc++ を使ってビルドする。 Build on Linux using CMake and libsupc++.

libsupc++ (訳注:[2]) を作るためには、あなたには libstdc++ が必要になります。
あなたのシステムで、どこに libsupc++ ヘッダがあるか見つけておきます。Ubuntu では、これは /usr/include/c++/ と /usr/include/c++// になります。
あなたは以下を実行することによっても、これを見つけることもできます
$ echo | g++ -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.7
 /usr/include/c++/4.7/x86_64-linux-gnu
 /usr/include/c++/4.7/backward
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
はじめの 2 つのエントリたちは、われわれが何を探しているのかを示すものなので、気をつけてください。これは、他のプラットフォームでは正しくないかもしれません。
さあ、われわれは CMake を実行できます:
  • CC=clang CXX=clang++ cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libstdc++ -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr <libc++-source-dir>
  • 上記においてあなたはまた、-DLIBCXX_CXX_ABI=libsupc++ を置き換えることもできます。これは、リンクするライブラリに libstdc++ の代わりに libsupc++ をリンクしようとするものですが、しかしこれは、あなたが、libc++ のように同一の実行可能バイナリにおいて、libstdc++ に対し、リンクする必要が全然ないということが、わかっているときにだけ、おすすめされます。GCC は libsupc++ を分離して配布されていますが、静的ライブラリとしてだけです。もし、あるプログラムが libstdc++ に対するリンクすることも必要な場合、それは libsupc++ それ自身のコピーを産み、そしてこれは微妙な諸問題を導き得ることになります。
    You can also substitute -DLIBCXX_CXX_ABI=libsupc++ above, which will cause the library to be linked to libsupc++ instead of libstdc++, but this is only recommended if you know that you will never need to link against libstdc++ in the same executable as libc++. GCC ships libsupc++ separately but only as a static library. If a program also needs to link against libstdc++, it will provide its own copy of libsupc++ and this can lead to subtle problems.
  • make
  • sudo make install
あなたは今 clang を -stdlib=libc++ で実行できます。

Linux 上で CMake と libc++abi を使ってビルドする。 Build on Linux using CMake and libc++abi.

あなたは、あなたのビルドマシン上で、 libc++abi のソースツリーを触れるように保っておく必要があるでしょうし、あなたの libc++abi 共有ライブラリのコピーは、あなたのリンカーが見つけられる場所に、配置してある必要があります。
われわれは今 CMake を実行できます:
  • CC=clang CXX=clang++ cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="<libc++abi-source-dir>/include" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr <libc++-source-dir>
  • make
  • sudo make install
残念ながら、この時点では、あなたは単純に clang を “-stdlib=libc++” で実行することはできません ――clang が、libsupc++ にリンクされた libc++ をリンクするようセットアップされているからです。このあたりをやるには、あなたはあなたのリンカーを自身でセットアップしなければならないでしょう (もしくは clang にパッチを当てるか)。たとえば、
  • clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
代わりに、あなたは、単にあなたのライブラリリストに libc++abi を追加することも可能です ――ほとんどの場合同じ結果が得られるでしょう。
  • clang++ -stdlib=libc++ helloworld.cpp -lc++abi

Linux で CMake と libcxxrt を使ってビルドする。 Build on Linux using CMake and libcxxrt.

あなたは、あなたのビルドマシン上において、libcxxrt の ソースツリーを触れるように保つ必要があるでしょうし、あなたの libcxxrt 共有ライブラリのコピーは、あなたのリンカーが見つけられる場所に配置しなければなりません。
われわれは今 CMake を実行できます:
  • CC=clang CXX=clang++ cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libcxxrt -DLIBCXX_LIBCXXRT_INCLUDE_PATHS="<libcxxrt-source-dir>/src" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr <libc++-source-dir>
  • make
  • sudo make install
残念ながら、この時点では、単純に clang を “-stdlib=libc++” するだけで実行することはできません; clang は、libsupc++ にリンクされている libc++ を、リンクするようにセットアップされているからです。このあたりをやるためには、あなたはあなたのリンカーを、あなた自身でセットアップする必要があります (もしくは clang にパッチをあてるか)。たとえば、
  • clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc
代わりに、あなたは単に libcxxrt をあなたのライブラリ・リストに、加えることも可能です; ほとんどの場合、同じ結果が得られるでしょう:
  • clang++ -stdlib=libc++ helloworld.cpp -lcxxrt

設計ドキュメント群 Design Documents

訳注

[1] GPL2 と GPL3 の違い

[2] libsupc++ とは

RTTI と例外を扱うための g++ のライブラリ。

0 件のコメント:

コメントを投稿

何かありましたら、どうぞ: