03.07 C語言是用什麼編出的?

Hsf1119


首先答案是c語言是用c語言編寫。



語言自舉性

一個語言能否自己編寫自己實現自己編譯,這叫自編譯,自舉性。目前能實現自舉性的語言沒有幾個,而自舉性也就成了一個語言能否真實強大的標誌。

一般來說圖靈完備的語言,編譯型語言,虛擬機語言可以實現自舉。而解釋型語言基本上很難。



現代很多語言都沒實現自舉,Java(jvm),Javascript, python,ruby,lua,php,perl……一堆。這些語言編譯器、解釋器都是c語言。

一個語言能自舉是他們社區和開發一直夢寐以求的事情,也是他們情懷和追求所在。有一個語言為了實現自舉成功,花了近20年,前年聖誕節才正式推出了第一個正式版本。它就是perl6,perl的下一代語言。perl6支持過程、OO、函數式三種程模式,支持虛擬機的語言(自己的虛擬機和jvm)。為了做好perl6,社區搞了一個功能啟示錄,把要實現的功能好點子都錄進去。後來一個日本人參考這個啟示錄自己實現了一個語言,這就有了ruby語言,但是ruby沒有自舉。



c語言的自舉過程和交叉編譯

我在以前的回答中,曾說過c語言的來歷:

上世紀70年代,為了實現unix,教主Tomphson和Ritchie開發了B語言,但是b語言性能不行,編寫也較繁瑣,所以又在B語言的基礎上開發出了現在的C語言。

第一個C語言編譯器的原型是用B語言或者混合B和彙編語言編寫的。採用部分實現功能,交叉編譯方式實現。

先用B和彙編語言編寫一個C語言的部分必須功能的編譯器,再通過這個編譯器,完成完整的C語言編譯器。詳細過程如下:

1、先編寫一個只有C語言最基本功能編譯器C0語言,用匯編語言編寫出C0的編譯器。

2、接著用C0實現比C0複雜,功能不完整的C語言子集C1語言,用C0編譯出C1語言的編譯器。

3、在C1-〉c2……如此循環直到Cn,Cn功能已經強大到可以實現C。

4、用Cn編譯實現了第一個c語言編輯器,即C實現了自舉。


蟲蟲安全


C語言,是一門高級計算機語言,熟知的unix、linux都是C語言編寫。但最早的語言並非如此的易學好用,多數偉大的創造都源自於一群調皮的人。

最早的高級計算機語言是,ALGOL 58、後來進化為ALGOL 60。分別被創造於1958年和1960年,這門語言暫且被稱為A語言,儘管當時的人不這麼叫,現在的人還是習慣了。

1963年,由劍橋和倫敦大學合作改進的CPL語言出現,當時並沒有把它命名為C語言、也不是B語言。鑑於是對A語言的改進,暫且叫做A+語言吧。這門語言更接近硬件一些,但是使用不那麼容易,很多事情還是難以實現。

1967年,這時候B語言(BCPL)來了,這也是第一個有了小括弧,大括號的語言。由劍橋大學的馬丁·理察德簡化CPL語言而來。

19世紀60年代末的時候,正在上班的Ken Thompson,想自己著手開發一個電子遊戲,苦於沒有操作系統,於是在1970年Ken用B語言寫了一個造作系統叫做UNIX。1971年,貝爾實驗室的D.M.Ritchie加入Ken的興趣團隊,一塊完善了UNIX。

1972年,閒來無事的D.M.Ritchie覺得很無聊,在一個閒情雅緻的下午,D.M.Ritchie決定對B語言進行改造。於是產生了C語言。C語言並不是為了和A、B語言排隊而命名,而是取自BCPL語言的第二個字母。C語言一誕生,便迫不及待的用C語言重寫了UNIX系統。並且,在設計期間,考慮將UNIX兼容到各種機器上,也奠定C語言成為第一個可移植的語言。


變餅檔


首先C語言是一門計算機編程語法規則規範,可以將C語言比做英語語言,我們在學習英語的時候都是先學語法 單詞之類的英語規則,在學會了語法以後我們就可以用英語寫出自己的文章,同樣的道理C語言也是如此,我們可以用C語言寫出自己的程序。

其次計算機並不認識什麼C語言,計算機只認識數字0和1(硬件上是使用開關來表示,用數字0來代表低電平,數字1代表高電平),那怎麼用0和1來描述十進制整數?答案是二進制。

再次我們的編寫的程序要能在計算機上實現,首先要做的就是翻譯工作,將C語言編寫的程序(文本格式)翻譯成二進制數字文本格式,

最後就是翻譯好的二進制文件,如何讓計算機幫我們運行呢?答案就是通過一種工具將我們編譯好的二進制文件存儲到存儲器中,存儲器是啥呢?存儲器可以比作是一個有很多抽屜的櫃子,比如二進制文件開頭處是數字001,那麼我們的工具就會在第三個抽屜放東西,前兩個抽屜為空,來代表001。

至此 我們的C語言程序就能夠在計算機上運行起來!


GkGavin


首先,C語言不是由什麼語言寫的。好比問:中文用什麼語言寫的?用什麼語言講的?C語言是int a=6;而不是mov ax,bx(彙編語言)。C語言可以用計算機寫,也可以用手寫,寫在紙上。

你要問的應該是C編譯器用什麼寫的。假若我猜對了,以下回答是你需要的。假若我猜錯了,也看一看吧。C編譯器用來把int a=6生成機器代碼,當然還有鏈接器,把機器代碼鏈接成可執行文件。

C編譯器說到底也是一個EXE文件,或者再加上其他的dll啊之類的。假設這裡有一個C編譯器A.exe。

可以A.exe寫一個A出來。寫好C源碼,用A.exe編譯出另外一個A.EXE,功能可以做得一樣。這種行為看起來很無聊,這裡我們不探究這種行為有無意義,但這樣做是可行的。還可以用A.EXE寫出A2.0.exe,或A3.0.exe,A3.11exe,A3.1.1.exe,寫出進化版的C編譯器。還可以用Java寫A.EXE,用C++寫A.EXE。甚至用匯編寫A.EXE。

第一個A.EXE怎麼來?當然是用匯編語言寫的。第一個彙編器哪裡來?用機器代碼寫。

小結。C語言是int=2;這些東西,而用來寫C代碼的東西叫開發環境,例如VC6,命令行界面的gcc等。int=2是人為制訂的規則,可以用筆寫在紙上。而開發環境就需要用C或者另一種語言寫出來。


用戶59162661


C語言標準文檔是 pdf 格式的,你可以在這裡下載 http://open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf 至於是什麼編寫的,因為很多文檔編輯器都可以導出 pdf,這個還真不好猜測。。。


如果你說的是 C 語言編譯器是什麼編寫的,當今三大主流 C 語言編譯器都是使用 C++ 語言編寫的。

1. 首先是Windows平臺的 cl(全稱叫 Microsoft (R) C/C++ 優化編譯器)。該編譯器是閉源的,但是從它的可執行文件的導入符號可以看出它是用 C++ 語言編寫的,並極有可能就是用自身編譯的。

2. 然後是在Linux平臺廣泛使用的 gcc。gcc 編譯器(平臺)最初是用 C 語言編寫的,但是在 2012 年 8 月,gcc 宣佈全面遷移至 C++ 語言,所以現在都是使用 C++ 語言編寫了。

3. 最後是在BSD系(包括蘋果系統)使用的 clang 編譯器,它屬於 LLVM 編譯器平臺,從誕生第一天起就是使用 C++ 語言編寫的。


其他還有很多小眾編譯器,多數是使用 C 或 C++ 語言編寫(C 語言居多),由於數量眾多這裡就不列舉了。


可以看到 cl 的引用了 C++ 語言編寫的函數


手機用戶78320221300


C語言有一特性:自生長。先用匯編語言編寫一個很小的編譯器核,就具有了編譯基本C源程序的能力。以後就用這個小C語言開發庫函數等擴展部分。因此可以說,C語言的核是彙編語言開發的,而大部分代碼是用C語言自我開發的。


Beepbug


C語言是一門比較底層的計算機語言,會被編譯器轉換成 assembly code 交與計算機逐行執行。所以該問題應該是想問 C語言 的編譯器是用什麼寫的吧?


力扣LeetCode


C編程語言是在20世紀70年代早期設計的,作為新興Unix操作系統的系統實現語言。它源於無類型語言BCPL。c編譯器最初期的版本,是在pdp-11機器上,用匯編語言編寫的,用其編寫人的名字縮寫命名,為dmr,在github上可以查找legacy-cc,找到部分dmr的編譯器的源代碼。

最開始的c的代碼,帖一部分在這裡,紀念一下。


/* C compiler

Copyright 1972 Bell Telephone Laboratories, Inc.

*/

ossiz 250;

ospace() {}\t/* fake */

init(s, t)

char s[]; {

extern lookup, symbuf, namsiz;

char symbuf[], sp[];

int np[], i;

i = namsiz;

sp = symbuf;

while(i--)

if ((*sp++ = *s++)=='\\0') --s;

np = lookup();

*np++ = 1;

*np = t;

}

main(argc, argv)

int argv[]; {

.....


Hello編程世界


通俗點說 c語言不是什麼編寫的 是一套規範和邏輯理論形成的一套語言 他的實現是通過這個規範和理論通過不同平臺的編譯器轉換具體的c語言代碼為相應平臺的彙編代碼 比如x86彙編 51彙編 之類的 然後彙編跟相應的機器(cpu內存等)緊密聯繫 最終還是機器代碼 如果你是初學者 很容易會認為c語言就是IDE(集成開發環境)只不過是一套便利的開發工具 要分開看 其他語言同理 關鍵在於編譯器 如何去解釋你的代碼


君He


C語言,用符合C語言語法的語句編寫的。

你能在記事本上編,就是沒有檢查語法錯誤的功能。

你也能在有關C語言的編譯器上編寫,在編譯器上能檢查錯誤。編好的文件是C語言文件,若是要放到電腦上運行的話,要通過編譯操作,就是說將C語言文件轉化為電腦能識別的機械語言,機械語言就是那些一大堆的“0”和“1”。


分享到:


相關文章: