2011-02-24 100 views
70

這可能是一個愚蠢的問題,但我一直在想這個問題。 C(或任何其他低級語言)是否具有源代碼,還是編譯器是「完成所有工作」的部分,包括解析?如果是這樣,不同的編譯器有不同的C語言嗎? stdlib的因素在哪裏呢?我真的很想知道這是如何工作的。是C開源嗎?

回答

120

C語言不是一個軟件,而是一個defined standard,所以人們不會說它是開源的,而是它是一個開放的標準。對於C來說,有很多不同的編譯器,而且其中的許多編譯器確實是開源的。最值得注意的例子是GCC's C compiler,它全部在GNU General Public License (GPL)之下,這是一個開源許可證。

還有更多選項。例如,Watcom是開源的。不缺少開源C編譯器,但毫無疑問,至少在非Windows世界中,最廣泛的是GCC。

對於Windows,您最好的選擇可能是Watcom或GCC,通過使用CygwinMinGW

2

GCC的C編譯器是用C寫因此,我們知道至少有C語言編寫的一個 C編譯器

GNU的stdlib(glibc的)也被寫在C(stdio.h中,文件stdlib.h )。但它也有一些用匯編語言編寫的部分。

25

C是一個標準,它指定了C編譯器應該如何生成程序。
C本身沒有任何源代碼,就像音符沒有任何塑料一樣。

一些C編譯器,如GCC,是開源的。

+5

很好的答案,雖然音符/塑料比喻有點超現實。 :-) – Spudley 2011-02-24 13:22:59

3

編譯器會確定所有映射從C到大會等...但只要有人擁有它.....沒有人真正擁有-c但是在ANSI/ISO確定標準

10

C是剛一種語言,也是一種標準化的語言。編譯器幾乎「做所有的工作」。不同的編譯器有不同的方言;在C99 ANSI標準之前,你有像Borland C和其他競爭編譯器那樣的東西,它們以他們自己的方式實現了C語言。

stdlib只是需要在任何ANSI C實現中出現的標準庫的商定集合。

4

要添加到其他偉大的答案:

對於不同的方言 - 但是也有一些具體的編譯器添加到C一些額外的功能。您可以將命令行標記-std=...提供給gcc以指定要使用的C標準,每個標準對語法都有輕微的變化/添加,最常見的可能是c99

每個編譯器都傾向於實現一些不同的額外特性,例如,typeof()不在C標準中,所以編譯器不必實現這一點,但它很有用,大多數編譯器都提供它。這裏是a list of gcc C extensions

stdlib是C標準中規定的一組函數。很像編譯器,stdlib可以有不同的實現。GNU實現和gcc一樣是開源的,但也有其他的編譯器,也可能是stdlib的其他閉源實現。

1

一個非常好的問題。 There is a way以嚴格和無歧義的語言以「源代碼」的形式定義語言標準(不是實現!)。不幸的是,包括C在內的所有舊語言的定義都很差。但是仍然有可能將這些定義轉換爲源代碼形式。

另一種方法是通過其operational semantics定義語言,往往在一個簡單的(和效率不高)參考實現的形式。

1

埃爾加·拉夫恩·岡納森寫的主要答案,但我認爲這將是值得注意的是,你可以有效地與方言結束了。

編譯器應該做同樣的事情,以標準爲準他們支持(這些天應該是幾乎所有相同的版本),但也有灰色地帶的問候。例如,編譯器爲「未定義」功能工作的方式。如果C規範說明某個特定情況下的行爲未定義,那麼編譯器可以做到它想要的東西。

還有的添加(添加新庫)的庫編譯器廠商支持特定平臺的特質,創造競爭優勢,或者只是爲了讓生活更輕鬆函數的例子。玩世不恭者可能會建議添加其中的一些,以幫助將人員鎖定到特定的編譯器中。

0

我要說的是,C作爲一門語言是不是開源。 正如指出的很多,你可以下載GNU許可的編譯器和庫免費,但如果你想寫自己的C編譯器,你將需要遵循ISO C標準,ISO收取真金白銀爲C的說明語言,在發佈時這是178美元。 所以真正的答案取決於你對自由和開放源代碼感興趣的元素。