---
# System prepended metadata

title: C++環境
tags: [C++Book]

---

# C++環境
###### tags: `C++Book`
## GNU
“GNU ，名稱來自Gnu's Not Unix"的縮寫，==一個類UNIX 的操作系統==，由GNU計劃推動，目標在於創建一個完全兼容於UNIX 的自由軟件環境。”
GNU計劃本來是為了開發一個自由系統來取代UNIX的，但是由於開發的內核hurd一直不怎麼樣，這個系統至今都沒出穩定版本，然而GNU計劃中開發的其他一些自由軟件，比如GCC編譯器，卻非常的好，在移植到各大操作系統上一直廣泛使用至今。

## gcc
==“ GCC （GNU Compiler Collection ，GNU編譯器套裝）==，是一套由GNU 開發的編程語言編譯器。它是一套以GPL 及LGPL 許可證所發布的自由軟件，也是GNU項目的關鍵部分，亦是自由的類Unix 及蘋果電腦Mac OS X 操作系統的標準編譯器。GCC（特別是其中的C語言編譯器）也常被認為是跨平台編譯器的事實標準。 
它原本只能處理C語言。GCC很快地擴展，變得可處理C++。之後也變得可處理Fortran、Pascal、Objective-C、Java、Ada，以及Go與其他語言。

### gcc 和 g++
GCC就代表the GNU Compiler Collection，所以表示一堆編譯器的合集。==g++ 則是GCC的 c++ 編譯器==。

現在你在編譯代碼時調用的gcc，已經不是當初那個c語言編譯器了，更確切的說他是一個驅動程序，根據代碼的後綴名來判斷調用c編譯器還是 c++ 編譯器 (g++) 。比如你的代碼後綴是*.c，他會調用c編譯器還有linker去鏈接c的library。如果你的代碼後綴是cpp, 他會調用 g++ 編譯器，當然library call也是 c++ 版本的。

 
## Clang
“  Clang  是一個C 、C++ 、Objective-C 和Objective-C++ ==編程語言的編譯器前端==。它採用了底層虛擬機（LLVM）作為其後端。
它的目標是提供一個==GCC的替代品==。

**GCC** : 目前作為跨平台編譯器來說它的兼容性無最強,性能較差
**Clang,LLVM** : 的蘋果為了提高性能，因此專門針對mac系統開發了專用的編譯器clang與llvm，clang用於編譯器前段，llvm用於後端。

## LLVM
“  LLVM ，它是一個編譯器的基礎建設，以C++ 寫成。它是為了任意一種編程語言寫成的程序，利用虛擬技術，創造出編譯時期，鏈結時期，運行時期以及“閒置時期”的優化。

## MinGW
MinGW提供了一套簡單方便的Windows下的==基於GCC程序開發環境==。
MinGW收集了一系列免費的Windows使用的頭文件和庫文件；
同時整合了GNU的工具集，特別是GNU程序開發工具，如經典gcc, g++, make等。MinGW是完全免費的自由軟件，它在Windows平台上模擬了Linux下GCC的開發環境，為 C++ 的跨平台開發提供了良好基礎支持，為了在Windows下工作的程序員熟悉Linux下的 C++ 工程組織提供了條件。



## 編譯器相關知識

>問題：蘋果以clang作為編譯器前端，llvm作為編譯器後端，那麼編譯器的前後端到底是什麼東西呢？


最簡單的GCC使用指令如下所示：
`gcc hello.c -o hello`
GCC接受hello.c作為輸入，最後產生目標可執行代碼hello。這個簡單的流程實際上經歷了很多步驟，如下圖所示：
![](https://i.imgur.com/Y3tipWW.png)

以中間代碼為分界，前面的詞法分析、語法分析、語義分析我們把它稱之為前端處理，後面的優化和目標代碼生成我們稱之為後端處理。

試想一下，是否可以為不同的高級語言單獨寫一個前端，然後為不同的處理器架構單獨寫一個後端呢？
GCC基本上也是這麼實現的，不過不要誤會，並沒有一個統一的gcc執行程序能夠處理如此多的前端和後端，每個語言的編譯器都是一個獨立的程序（如C語言的編譯器是gcc，C++的編譯器是g++），而不同的後端也要對應不同的可執行程序。你可以下載單獨的一份GCC源代碼，通過不同的configure來生成自己需要的編譯器。

>[https://blog.csdn.net/itianyi/article/details/43057279](https://blog.csdn.net/itianyi/article/details/43057279)

>作者：李锋
链接：https://www.zhihu.com/question/20940822/answer/16667772
来源：知乎
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
