パスワードを忘れた? アカウント作成
6060396 story
プログラミング

GCC、CからC++への移行が完了 102

ストーリー by headless
完了 部門より
hylom 曰く、

GCCをC++で再実装する「cxx-conversion」のマージがすべて完了した(Merge from cxx-conversion branch本家/. )。

これにより、GCC自体はC++コンパイラーのみでビルド可能となる。ただしコンパイラーの機能に関しては変更されておらず、これまで通り使用することが可能とのことだ。

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

    「これまでCコンパイラーのみでビルド可能だったが、C++コンパイラーが必要になる」の間違いじゃないの?

    • わたしがGCCをビルドしていたのは10年以上前なのでピント外れなことをいっているかも知れないけど、当時、GCCがコンパイルできる環境やCコンパイラは少なかった。つまり、特にポータビリティが高いわけではなかった。事実上、それなりに新しい、余力のあるUnixシステムじゃなければ、ポートにはかなりの作業が必要だった。それをする人がいなくなれば、対応システムからハズされるだけ。

      それなりに新しいUnixシステムなら、GCCなり、それなりのC++が搭載されているだろうから、GCCがC++で書けていても、特に問題にならない。

      以前のように、リアルタイムシステムのようなサードパーティのシステムが豊富にある状況じゃないし、独自のコンピュータのベンダーも減ったしね。Sony NEWSもOMRON LunaもDECもSGIもない。やっぱり、大きな問題はないね。つまらないけど、それが現実。

      親コメント
    • by Anonymous Coward on 2012年08月19日 14時49分 (#2214596)

      > 1- The compiler can only be built with a C++ compiler.
      「C++コンパイラーでのみビルド可能」の誤訳。
      タレこみ時点 [srad.jp]では
      > ビルドの際に必ずC++コードを利用するようになる。
      で、少なくとも嘘ではなかったのに、headlessェ…

      親コメント
  • by Anonymous Coward on 2012年08月18日 18時27分 (#2214375)

    gccのソースをコンパイルできるくらいまともなC++コンパイラって数えるほどしかないような

    • Re:bootstrapはどうなるの? (スコア:5, おもしろおかしい)

      by Anonymous Coward on 2012年08月18日 18時29分 (#2214378)

      1. まずclangをビルドします。
      2. gccをビルドする必要がなくなったので終了

      親コメント
      • by Anonymous Coward on 2012年08月18日 19時34分 (#2214412)

        1. まずclangをビルドします。
        2. gccをビルドする必要がなくなったので終了

        BSD界隈なんかに、こういう勘違いしている人が多いけど
        実際にはclangはLLVMに依存しているし、LLVMはgccに依存している
        ゆえにgccへの依存は消えない

        ほぼ全てのCコンパイラで自身をビルドできるgccのbootstrapの話してるところに
        LLVMが無ければ自身を作ることさえできないclangを持ち出すとか
        なにを勘違いしてるんだか・・・・・・・・・・・・

        # LLVMが不要なclangか、gccが不要なLLVMができると良いね(棒読み)

        親コメント
        • by Anonymous Coward

          これは初耳なんですけどそうなんですか?
          llvm-gcc の勘違いじゃなくて?

          • 詳細は http://llvm.org/docs/GettingStarted.html [llvm.org] あたりに書いて有りますが,
            llvm はバイトコードから native code を作るときに GCC を使います.
            そのためllvmのビルドにもGCCが必要です.

            厳密にはGCCじゃなくても,solaris の cc のようなCコンパイラがあればビルドできますが
            >1. まずclangをビルドします。
            >2. gccをビルドする必要がなくなったので終了
            というのはありえない話で,1の時点でCコンパイラがすでに使える状態になっています.

            親コメント
        • by Anonymous Coward

          いろいろと勘違いしているよ

      • by Anonymous Coward

        clangをclang-llvmでコンパイルできます?
        なんか失敗する。

      • by Anonymous Coward

        clangじゃアーキテクチャ間の移植性がまだ弱いからgccの代わりにはならないよ

      • by Anonymous Coward
        世間ではgcc4.7をbootstrapして、その後gcc4.8(?)をビルドしろ、という事になっているらしい。まあ今時の環境でCコンパイラはあるがC++コンパイラがないというのは中々考えにくいですが…
    • by s02222 (20350) on 2012年08月19日 0時31分 (#2214495)
      「もしうっかり、世界中からgccをコンパイル可能なコンパイラのバイナリを消しちゃったらどうしよう?」みたいなネタが気になります。

      gccのソースだけが手元にあるところから、徒手空拳でgccのバイナリを得るまでの手間が大幅に増えちゃったというか。 今までなら「頑張ってCコンパイラをアセンブラで書け」だったのが「頑張ってC++をアセンブラで書くのは・・・流石に無理だから、Cで書かれた別のC++コンパイラのソースを探せば?」に、ブータビリティ(とか、試しに呼んでみる)が大幅後退しちゃうので。

      まあ、そんな心配は妄想上の産物だからこそ、C++で書かれることになったんでしょうけど。「gccをコンパイルできるCで書かれたC++コンパイラ」のソース(以前のgcc?)を常にセットで置いておけば、ほとんど何も変わりませんし。

      ただまあ、変な例えだですが、「この車はドライブバイワイヤ採用なので、ハンドル←→前輪、はシャフトでは直結してなくて、モーターで遠隔で動かしてます」と言われたときに感じる「え? いざというとき大丈夫?」感に近いもやもやした気分です。テクノロジの進化でむしろ利点の方が大きくなってるのは理屈では分かるんだけど、そこは直結しといて欲しい! 感覚として! みたいな?
      親コメント
    • by Anonymous Coward

      クロスコンパイルでターゲット用のバイナリを最初に作れば良いだけじゃないか?

      ターゲット用の環境でコンパイルして動かしたら自動的にターゲット用のバイナリを出力するわけじゃないぜ?

  • by Anonymous Coward on 2012年08月18日 18時27分 (#2214376)

    C++で記述し直すことによりメンテナンスがしやすく成るとか性能が上がるとかいった利点が有ったのでしょうか?
    C++コンパイラは実質的にCコンパイラも内包しているので言語の陳腐化等も問題にはならないと思うのですが

    •  dodongaです。

      > C++コンパイラは実質的にCコンパイラも内包しているので

       良くある勘違いです。
       C++とCは互換ではないです。

      --
      閑話休題
      親コメント
      • by Anonymous Coward

        Cが内包されていない、もしくはほかで置き換えることが出来ない点ってどんな点?
        いやまあ、ペダンティックな話じゃなくて、GCCについてなんだけど

        • by Anonymous Coward

          C99のDesignated Initializer

        •  dodongaです。

           C++とCは互換ではないです。

          1) サイズの問題
           sizeof('a');

          2)スコープの問題
            int x[100];

          void f()
          {
                  struct x { int a; };
                  sizeof(x);
          }

            const の扱い
            省略時の扱い int f(void) とint f()

           挙げればキリがなくw

           

          --
          閑話休題
          • 話がずれてますよ。

            確かに「C++言語の言語仕様は、C言語と互換性がない部分がある」のは事実です。ですが、元コメは

            C++コンパイラは実質的にCコンパイラも内包

            と書いてます。言語仕様ではなく処理系が論点。

            実際のところC++の言語処理系は、C言語モードでのコンパイルが可能なものばかりです。C言語としてのコンパイルができないC++専用コンパイラって見たことありません。

            だから、C++で書かれたコードがビルド出来る環境なら、Cで書かれたコードもビルド可能。
            そういう点で、コメの疑問であるビルド環境の普及度という点では、CからC++への移行へのメリットはないですね。
            最大の利点はソースコードの保守性の問題でしょうな。

            親コメント
          • by Anonymous Coward

            逆にいえばこの程度という感じですね、Cで書く時に両方で通るようにコードした方が色々便利になりそうだし多分そうするかな
            もっとも、もうC++移行済みでさらにC++撤退してC# and Java に行ってしまいましたが(^^;

          • by Anonymous Coward

            で、そういう違いがあることで一体どんなメリットが生じるのかな?

            • by Anonymous Coward on 2012年08月19日 3時16分 (#2214521)
              • sizeof('a') → オーバーロードのため(Cはすぐにintへ格上げ、C++はオーバーロードがあるのでこの段階ではまだcharのまま)。
              • スコープ → 文字通りスコープ(名前空間やクラス内部のクラス)の関係でそうなった。
              • const → #defineをぶっつぶすため(C++では定数定義目的なら#defineに代えて使える)。
              • int f(void)とint f() → コンパイル時のチェックを強化するため(C++がプロトタイプ宣言をしっかり書け(書かないやK&Rスタイルは消えろ)と言っている影響)。

                • 答えが求められているものではないようにも思えるけど、一応答えてみた。

                  そもそも、そんなことよりもvoid*から他のポインタ型への暗黙変換がC++にはないこと(これは安全性の強化という理由)のほうがC→C++での移植では経験上よく引っかかる。あるいは、名前マングルの問題(ようはextern "C")もよくある。

              親コメント
            • by Anonymous Coward

              C++標準化委員会にでも聞いてろよ

        • by Anonymous Coward

          GCCは以前からCコンパイラではない
          コンパイラを呼び出すドライバだ

          • by Anonymous Coward

            つまりCなりC++の差は実質問題ないってこと?

            • by Anonymous Coward

              1.CとC++は全く違う
              2.GCCがCで記述されていたのがC++に変わる
              3.なんで書いてあっても良い
              この3つに要約される

              • by Anonymous Coward on 2012年08月18日 21時20分 (#2214448)

                Migrating GCC to C++ as implementation language:

                C++ is a standardized, well known, popular language.
                C++ is nearly a superset of C90 used in GCC.
                The C subset of C++ is just as efficient as C.
                C++ supports cleaner code in several significant cases.
                C++ makes it easier to write and enforce cleaner interfaces.
                C++ never requires uglier code.
                C++ is not a panacea but it is an improvement.

                親コメント
      • by Anonymous Coward

        大抵のC++コンパイラは、オプション等で明示してやればCコンパイラとして動作する。
        これを指して「C++コンパイラはCコンパイラも内包している」と言ってるのだと思われ。

    • by Anonymous Coward

      > C++で記述し直すことによりメンテナンスがしやすく成るとか性能が上がるとかいった利点が有ったのでしょうか?

      メンテナンス関係以外は思い浮かばないですねー。
      吐き出すバイナリは原則同じでしょうし、性能(←これってコンパイルに要する時間ですかね)は、最大限頑張って”C”実装と同等になるかもしれないけど、まずそうはならないでしょう。(-_-;;

      私はアプリ屋なんですが、普段は”C++”で書いていて、”C”で書くことはもうほとんどありません。なんというか書いているアプリの複雑さが”C++”を使うことが前提になっちゃてて、もう”C”で書ける気がまったくしないんですよね。
      コンパイラ屋さんも、とうとう「”C”でのメンテナンスは厄介だ!」的な気分になってきたとか?

      • by Anonymous Coward on 2012年08月18日 21時39分 (#2214456)
        gccは古の黒魔術を駆使してCで色々と各種データ構造を実装してたわけだけど、こいつがまあ黒魔術なのでイマイチ綺麗に書けてない。メンテナンス性が悪いだけなら(まだ)いいのだけど、綺麗なメモリ管理とかが出来ないために動作時の速度・メモリ利用量が馬鹿みたいに増えるとかいった問題も出ていた。とくにD$とか仮想メモリとかとの相性がイマイチという問題があった。

        この辺を改善したくても黒魔術コードを綺麗に書き換えるのが大変すぎた、というのが今までのネック。C++化でこの辺りの改善がやりやすくなれば、性能(コンパイルにかかる時間)は改善する可能性が高い。

        また例えば命令の並び替えとかの最適化を限界まで頑張ると組み合わせが爆発するので、メモリ使用量が爆発してしまって途中で足切りするわけだけど、この辺もより限界まで総当りチェックとかがしやすくなり、出力されるバイナリの実行性能も改善する可能性がある。

        以上、まあ、一応公的な意見はこんなもんらしい。

        出先なのでAC

        親コメント
      • by Anonymous Coward

        > 性能(←これってコンパイルに要する時間ですかね)は、
        実行時の性能に決まってるだろ。いくら根拠のないデマでC++をdisりたいからって曲解にもほどがある

        • by Anonymous Coward

          出力したバイナリが実行時に速いということなら意味が通らないよ。
          ”C++”実装のコンパイラでそういうバイナリが出力できるなら、
          ”C”実装のコンパイラでもまったく同じバイナリが出力できるだろ。

          • by Anonymous Coward on 2012年08月18日 23時25分 (#2214485)

            ものがコンパイラだけに話がややっこしいですね。
            1. C++コンパイラがgccをコンパイルするのにかかる時間
            2. C++でコンパイルしたgccが何かをコンパイルするのにかかる時間
            3. C++版gccでコンパイルされたものが何かを処理するのにかかる時間
            何よりも先に、どれについて話しているか明確にした上で話し始めないと会話が成立しなさそうです。

            それはさておき、もしC++化によって(2)が高速化して、
            その結果、時間がかかるけど効果がある最適化手法が使えるようになって
            そのうち(3)も高速化されるといいですね。逆パターンもあり得ると思いますが。

            親コメント
          • けれど、C++で実装するのとCで実装するのでは、手間が全然違うだろ?
            論理上は同じものが書けるとしても、現実的に非常に手間がかかる場合は、「現実的には同じものは書けない」と言える。

            極論するなら、今のgccと同等のバイナリを、バイナリエディタ直打ちで書ける神はいるか?

            --
            1を聞いて0を知れ!
            親コメント
typodupeerror

未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー

読み込み中...