結局、コンパイラのc++とg++と天ぷらの違いって何?
始まり始まり
「昔々、ある町に惣兵衛という貧しい農民がいました。惣兵衛は日頃から満足な食事がとれていませんでした。
ある日、惣兵衛は友人に連れられて、近くの蕎麦屋へいきました。蕎麦屋には天ぷらのかき揚げがのっており大変美味しかったそうな。
惣兵衛は天ぷらを食べた感動が忘れられず、一念発起。馬車馬のように働き、お金持ちになりました。
その後、豪華な家に引っ越しました。
そして、遠い東の都に美味しい天ぷらの料亭があると聞き、旅へ出掛けました。
一ヶ月、嵐や盗賊から逃れながら、命からがら、やっとの事で着いた後、出てきたのは、アンコウの肝の天ぷら。
苦く大人の味でとても食べたものではありませんでした。
店主が
「お味はいかがでしょうか?」
と聞くと、惣兵衛が一言。
「うーーむ。やはり天ぷらは蕎麦(側)が良い」
目次
1. あなたのc++はどこから?
あなたの〇〇はどこから?
私は元から!(某CM風)
全然関係ないですが、上の目次を作るときに、どうしても1と2がリンク飛ばなくて、何でかなーと試行錯誤していたら、QiitaのMarkdwonのパーサーが”++”を読み飛ばすらしく、それをつけなかったら行けました……。詳しくはサイトのURLに.mdつければわかります。…はい。
話を戻します。(始まってなかった)
みなさんは、C++をコンパイルするときに、g++ main.c++ みたいな感じでコンパイルされていますかね?
それともc++ main.c++?
また、cc と gccも同じような関係にありますよね?
今回は、それらの違いと、実際にどのように作用されているのかを探るため、この記事を書きました。
探してみた
実際に今使っているのパソコン(Mac)で、lsコマンドと、whichコマンドでその場所を特定してみます。
#!/bin/bash
ls -l `which cc`
> lrwxr-xr-x 1 root wheel 5 Nov 7 2019 /usr/bin/cc -> clang (出力)
ls -l `which gcc`
> -rwxr-xr-x 1 root wheel 18288 Sep 21 2019 /usr/bin/gcc (出力)
ls -l `which c++`
> lrwxr-xr-x 1 root wheel 7 Nov 7 2019 /usr/bin/c++ -> clang++ (出力)
ls -l `which g++`
> -rwxr-xr-x 1 root wheel 18288 Sep 21 2019 /usr/bin/g++ (出力)
以上から、cc、c++の/usr/bin/ccと/usr/bin/c++は clang、clang++ へのシンボリックリンクであることがわかります。
そしてgccとg++のバージョンを調べてみると
#!/bin/bash
gcc --version
> Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin (出力)
g++ --version
> Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin (出力)
これらから、gccまたg++ コマンドは実際には Apple Clang コンパイラを指していることがわかります。これは Apple が提供する GCC コンパイラのインターフェースで、内部的には Clang コンパイラを使用されていることを指します。
2. c++とg++との違い
つまり、私のパソコンではどちらもclangに行くため、あまり違いはありませんでした。(´・ω・`)
なので、一般的な場合においての違いをまとめてみました。
特徴 | c++ | g++ | 天ぷら |
---|---|---|---|
主な用途 | C++ コードのコンパイル | C++ コードのコンパイル | 食べる |
種類 | 様々(Clang, MSVC, GCCなど) | GNU コンパイラコレクション(GCC)の一部 | 揚げ物 |
拡張性 | コンパイラによって異なる(例: Clangの特定最適化) | GNU独自の拡張(例: __attribute__ ) |
野菜、魚、肉などの具材を使える |
互換性 | 標準C++に準拠する程度による | 標準C++に準拠し、GNU拡張を提供 | 様々な食材で作れる |
パフォーマンス | コンパイラと設定に依存 | コンパイラと設定に依存 | 揚げたてが最高 |
特徴的な点 | 標準に準拠したコンパイル | GNUプロジェクトの一部としての開発 | 日本の伝統料理 |
対象ユーザー | 様々な開発者(プラットフォームに依存) | 主にLinux開発者、オープンソースコミュニティ | 庶民 |
3. おわりに
今回は難しい部分が多く、いろいろ調べましたが、結局は環境によるところが大きい、という事が知れました。
天ぷらの例はいらなかったかな?
自分のパソコンがg++もc++もclang++になっていたので、具体的なコードでの差異は見つけられませんでしたが、今はとても清々しい気分です。
なぜですかって?
なんとか書き上げ(かき揚げ)たからです。
おあとがよろしいようで。