パスワードを忘れた? アカウント作成
12032241 story
GNU is Not Unix

GCC 5.1リリース 19

ストーリー by hylom
分かりやすい解説ありがとうございます 部門より
あるAnonymous Coward 曰く、

4月22日、GCC 5.1がリリースされた(GCC 5 Release SeriesChangeLogSourceForge.JP Magazine)。

2014年に新しくなったGCCの開発スケジュールにおける初のリリースバージョンとなる。主な変更点としては、IPOやLTOの改善、OpenMP、ClikPlus等の言語拡張のサポート強化、C++14のサポート強化、Golang 1.4.2のサポート、AVX512サポート等が挙げられる。

特に重要な変更点としては、デフォルトでlibstdc++のABIを新しい物に変更する様になった。これに伴い、std::type_traitsライブラリの複数のメタ関数に名前の変更が起きる。また、std::basic_string (std::string)の実装がCOWからSSOに変わる。古いABIを用いる場合は_GLIBCXX_USE_CXX11_ABIを0にセットする。

また、興味深い点として、GCCの機能を共有ライブラリ化したlibgccjitのexperimental版が挙げられる。このライブラリによって、GCCによるC/C++プログラムのコンパイルのためのAPIが提供される。LLVM/Clangではこれらの機能は開発当初から提供され、コード補完ライブラリやC++インタプリタ等の優れたサードパーティツールの開発に役立った。この分野ではGCCは後発(libgccjitの開発は2013年から始まった)だが、今後に期待したい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2015年04月27日 14時54分 (#2804901)

    COW = "Copy On Write".
        文字列自体は一ヶ所で保存していて、各オブジェクト間で、この文字列の保存先をオブジェクト間で共有する。

    SSO = "Small-String Optimization".
        サイズの小さな文字列は、オブジェクト毎に格納する方式。

    例えば 文字列ライブラリの解説 [blogspot.jp]を参照してね

    • by Anonymous Coward on 2015年04月27日 15時40分 (#2804926)

      個人的にはこれが今回一番うれしいですね。

      gccのstd::basic_stringはCOWのせいでstateful allocatorを使うとすぐぶっ壊れるので、並列環境用に最適化したアロケータが使えませんでした。

      親コメント
  • 色々書いたり配布したりする人からすると、ABI変えられると厳しいですよね。
    Windowsと言うかMinGWのように基本Static Linkしてくれてるのはいいのですが、GNU/LinuxのようにDynamic Linkが基本だと、ABI変えられちゃうと、主要ディストリがStableでGCC5系を採用してくれないと、配布がしづらいですから。
    もしくは、ディストリごとに別々のバイナリを配布しなくちゃならなくなるので、サイトの容量が大きくないと厳しい。
    # いや、そんな言うならバイナリで配布すなと言われても、ソースコードだけでは怒り出す人達が結構いる状況だとねぇ…

    • by Anonymous Coward on 2015年04月27日 16時33分 (#2804955)

      C++なんぞ使っているから,ABIの変更に弱くなるのです

      ABIを気にするなら
      1) 全部Cで書く
      2) APIはCで書いて,実装だけC++
      3) テンプレートライブラリ化して,ヘッダファイルだけのライブラリにする
      あたりが常套手段ですよ

      親コメント
    • by Anonymous Coward

      実行前にチェックするようにできんの?と言ってみる。
      使えそうなら呼ぶ、使えなさそうならstaticな処理を呼ぶ。
      windowsでdll呼ぶときときやっただけなんで、同じ事出来るか分からん。。

      • by Anonymous Coward

        .so に両方のライブラリを含めばよいような。
        実際にはどういう対応がされてるんでしょ?

        • by Anonymous Coward on 2015年04月27日 17時33分 (#2804984)

          _GLIBCXX_USE_CXX11_ABI パラメータでABI が切り替えられる。
          古いバイナリには古いABI で、新しくコンパイルする際には(デフォルトでは)新しいABI が使われる。
          .so には両方入ってます。

          親コメント
          • by Anonymous Coward

            ありがとうございます。
            だとすると、インターフェースが変わらない前提で
            バイナリ(別ABIでコンパイルされたライブラリ)混在も動いたりするかな?

    • by Anonymous Coward

      pUnkにしましょうぜ、増やしたりも簡単!

  • by Anonymous Coward on 2015年04月27日 14時49分 (#2804899)

    とってかわるような物ではないでしょと思ったけど、ChangeLogにも

    A new implementation of std::string is enabled by default, using the small string optimization instead of copy-on-write reference counting.

    とあって謎い。文字列が短いときにはという話なのか、それとも…?

    • by Anonymous Coward on 2015年04月27日 15時27分 (#2804920)

      参照カウンタを使うCOWは、参照を追加するだけでオブジェクトが更新されるためキャッシュフレンドリーでなく、
      マルチスレッド環境下での共有に同期が必要になるため、汎用的な文字列ライブラリとしては最近はあまり好まれないのです。
      以前から問題視されていたのですが、ABI互換性維持のため長らく直せなかったのです。
      今回、ようやくCOWを止めましたよ、というニュースかと思います。

      SSOは別の話というか、COWの代わりにイマドキのコンテナライブラリとしてポピュラーな実装手法を採用したよ、という話かと。
      おっしゃるとおり別に対立するようなものではないと思います。

      親コメント
  • by Anonymous Coward on 2015年04月27日 15時01分 (#2804905)

    libgccjitをリンクしたプログラムを公開するときはGPLv3にしなければならないんでしょ? LLVMに勝てる気がしないんだけど。LLVMを使った上でGPLを選択することも可能なわけだし。宗教的な理由以外でどんな需要があるんだろう。ていうか宗教的な理由でわざと部品化を困難にしてたんじゃなかったっけ?

    • by Anonymous Coward

      それじゃぁ、libstdc++ をリンクしても GPLv3 で公開しなければならないのかい?

      • by tty01 (46299) on 2015年04月28日 0時27分 (#2805199)

        libstdc++にはランタイム例外条項が追加されてるからリンクしたもののソースを公開する必要がない

        親コメント
      • by Anonymous Coward

        GCCでコンパイルするとGPLの指紋が埋め込まれてどうやっても消せないので
        自動的にGPLと見なされます

  • by Anonymous Coward on 2015年04月27日 19時37分 (#2805042)

    fedora22は5.0.1だったと思うのですが、開発版だけのリリースなんでしょうか?

    • by Anonymous Coward on 2015年04月28日 1時23分 (#2805220)

      fedora22ではgcc5.1で、旧ABIを用いる。
      fedora23ではgcc5.1で、新ABIを用いる様です。https://fedoraproject.org/wiki/Changes/GCC5、http://developerblog.redhat.com/2015/02/10/gcc-5-in-fedora/

      https://gcc.gnu.org/develop.html [gnu.org]を見て頂ければ分かりますが、gcc5.0.0はexperimentalで5.0.1はpreleaseとなっております。
      つまり、5.0.z系はrelease版ではありません。
      その後は、gcc6系列とgcc5系列に分かれて、gcc5系列はgcc5.y.zのz=0とz=1を繰り返して、zが1周期する毎にyをインクリメントする予定です。
      つまり、
      5.1.0
      5.1.1
      5.2.0
      5.2.1
      ...
      とリリーススケジュールは組まれています。

      親コメント
      • by Anonymous Coward

        最後のバージョン番号を見ても、そろそろ安定したかどうかわからなくなっちゃったよ。

    • by Anonymous Coward

      0号機のような試作品ではなく、出来は既に初号機レベルなのだという自信の現れ…だといいなあ。バージョン飛ばし流行ってるのかな。

typodupeerror

あつくて寝られない時はhackしろ! 386BSD(98)はそうやってつくられましたよ? -- あるハッカー

読み込み中...