『壹』 c語言編譯器是用什麼語言寫的
第一個C的編譯器前10%是用匯編寫的,後90%使用C寫的,他是用滾雪球的方式寫的,後來的C編譯器基本都是用C寫的
『貳』 C語言是由什麼語言編寫而成的
我想,你問的是 C語言編譯器 是用什麼語言寫的。
概括說,當今幾乎所有的實用的編譯器/解釋器都是用C語言編寫的,有一些語言比如Clojure,Jython等是基於JVM或者說是用java實現的,Ironpython等是基.NET實現的,但是Java和C#等本身也要依靠C/C++來實現,等於是間接調用了C。
世界上第一個C語言編譯器,是在B語言基礎上,用B語言與PDP匯編語言 編寫的。開發過程是先用匯編寫了一個最基本功能的子集C0,利用自編譯Self-Compile功能,或虛擬機CVM(C Language Virtual Machine)功能,增添新的東西,變C1, 按此法多次增添發展,滾雪球般用匯編把小雪球揉到一起,1生2,2生3,...成了C。C 再生萬物。
這里,該向C語言之父Dennis Ritchie(丹尼斯·里奇)致敬。
『叄』 C語言這么厲害,它自身又是用什麼語言寫的編寫過程被稱為自舉
來自一個小白的提問: 「C語言本身用什麼語言寫的?」
換個角度來問,其實是:C語言在運行之前,得編譯才行,那C語言的編譯器從哪裡來?用什麼語言來寫的?如果是用C語言本身來寫的,到底是先有蛋還是先有雞?
我們假設世界上不存在任何編譯器, 先從機器語言說起,看看怎麼辦。
機器語言可以直接被CPU執行,不需要編譯器。
然後是匯編語言, 匯編語言雖然只是機器語言的助記符,但是也需要編譯成機器語言才能執行,沒辦法只能用機器語言來寫這第一個編譯器了(以後就不用了)。
匯編語言的問題解決了,就往前邁進了一大步,這時候就可以用匯編語言去寫C語言的編譯器,我們說這是C編譯器的老祖宗。
有了這個老祖宗,就可以編譯任意的C語言程序了,那是不是可以用C語言本身寫一個編譯器?只要用老祖宗編譯一下就可以了。
OK, 這么一層層上來,終於得到了一個用C語言寫的編譯器, 真是夠麻煩的。
到這個時候,之前那個匯編寫的C語言編譯器就可以拋棄了。
當然,如果在C語言之前,已經出現了別的高級語言,例如Pascal,那就可以用Pascal來寫一個C語言的編譯器。
第一個Pascal的編譯器據說使用Fortran寫的。而作為第一個高級語言的Fortran,它的編譯器應該是匯編語言寫的。
關於編譯器,這里邊有個有趣的傳說:
傳說Unix 發明人之一的 Ken Thompson在貝爾實驗室,大搖大擺的走到任何一台Unix機器前,輸入自己的用戶名和密碼,就能以root的方式登錄!
貝爾實驗室人才濟濟,另外一些大牛發誓要把這個漏洞找出來,他們通讀了Unix的C源碼,終於找到了登錄的後門, 清理後門以後編譯Unix , 運行, 可是Thompson 還是能夠登錄進去。
有人覺得可能是編譯器中有問題,在編譯Unix的時候植入了後門, 於是他們又用C語言重新寫了一個編譯器,用新的編譯器再次編譯了Unix, 這下總算天下太平了吧。
可是仍然不管用, Thompson 依然可以用root登錄,真是讓人崩潰!
後來Thompson 本人解開了秘密,是第一個C 語言編譯器有問題, 這個編譯器在編譯Unix源碼的時候,當然會植入後門, 這還不夠,更牛的是,如果你用C 語言寫了一個新編譯器,肯定也需要編譯成二進制代碼啊,用什麼來編譯,只有用Thompson寫的那第一個編譯器來編譯,好了, 你寫的這個編譯器就會被污染了,你的編譯器再去編譯Unix , 也會植入後門 :-)
說到這里我就想起了幾年前的XcodeGhost 事件,簡單來說就是在Xcode(非官方渠道下載的)中植入了木馬,這樣XCode編譯出的ios app都被污染了,這些app就可以被黑客利用做非法之事。
雖然這個XCodeGhost和Thompson的後面相比差得遠,但是提醒我們,下載軟體的時候要走正規渠道,從官方網站下載,認准網站的HTTPS標准,甚至可以驗證一下checksum。
可能有人問:我用匯編寫一段Hello World都很麻煩,居然有人可以用它寫復雜的編譯器?這可能嗎?
當然可能,在開發第一代Unix的時候,連C語言都沒有, Ken Thompson 和 Dennis Ritchie 可是用匯編一行行把Unix敲出來的。 WPS第一版是求伯君用匯編寫出來的, Turbo Pascal 的編譯器也是Anders 用匯編寫出來的,大神們的能力不是普通人能想像得到的。
對於編譯器來說,還可以採用「滾雪球」的方式來開發:
還是以C語言為例,第一個版本可以先選擇C語言的一個子集,例如只支持基本的數據類型,流程式控制制語句,函數調用...... 我們把這個子集稱為C0。
然後用匯編語言寫個編譯器,只搞定這個語言的子集C0,這樣寫起來就容易不少。
C0這個語言可以工作了,然後我們擴展這個子集,例如添加struct,指針...... ,把新的語言稱為C1。
那C1這個語言的編譯器由誰來寫? 自然是C0。
等到C1可以工作了,再次擴展語言特性,用C1寫編譯器,得到C2。
然後是C3, C4...... 最後得到完整的C語言。
這個過程被稱為bootstraping , 中文叫做自舉。
對於熱愛編程的人來說,有一群一起學習一起解答的小夥伴很重要!
這里有一個 C/C++編程學習交流俱樂部 (群),私信我【01】進入!
還有編程學習文件(源碼,零基礎教程,項目實戰教學視頻),歡迎初學者和正在進階中的小夥伴們!
『肆』 請問,編譯軟體最早是由誰發明出來的
Grave of Grace
後記
Grace Hopper是個非常amazing的人 (常被稱為Amazing Grace),崇拜她的人相當多。雖然她的事跡很多,但是還有很多有類似事跡的人並沒有像她這樣受到眾人的崇拜。由其中一點我們可以看出來:從1947年開始 (二戰結束後第二年),她獲得了第一個榮譽博士學位 (賓州大學),從那以後,她先後被40多所大學授予榮譽博士學位,其中包括芝加哥大學、華盛頓大學、馬里蘭大學等知名學府。各種婦女社會團體和學術組織都曾授予Grace各種稱號和獎勵。1991年,布希總統在白宮授予她的「美國國家技術獎」 (National Medal of Technology) 是其中的最高獎項,她也是至今惟一獲此殊榮的美國女性。她的名言有很多,她自己最喜歡的,也是她最喜歡對所謂的「年輕人」說的 (在她年老時,她所謂的年輕人就是「年齡不到我的一半的人就叫做年輕人」),這句話是:
「A ship in port is safe, but that is not what ships are built for.」
語錄
下面Grace的語錄中有幾句比較有意思的話。
From then on, when anything went wrong with a computer, we said it had bugs in it.
The most dangerous phrase in the language is, 「We』ve always done it this way.」
Humans are allergic to change. They love to say, 「We』ve always done it this way.」 I try to fight that. That』s why I have a clock on my wall that runs counter-clockwise.
Leadership is a two-way street, loyalty up and loyalty down. Respect for one』s superiors; care for one』s crew.
One accurate measurement is worth a thousand expert opinions.
Someday, on the corporate balance sheet, there will be an entry which reads, 「Information」; For in most cases, the information is more valuable than the hardware which processes it.
We』re flooding people with information. We need to feed it through a processor. A human must turn information into intelligence or knowledge. We』ve tended to forget that no computer will ever ask a new question.
To me programming is more than an important practical art. It is also a gigantic undertaking in the foundations of knowledge.
They told me computers could only do arithmetic.
In pioneer days they used oxen for heavy pulling, and when one ox couldn』t budge a log, they didn』t try to grow a larger ox. We shouldn』t be trying for bigger computers, but for more systems of computers.
Life was simple before World War II. After that, we had systems.
We went overboard on management and forgot about leadership. It might help if we ran the MBAs out of Washington.
At any given moment, there is always a line representing what your boss will believe. If you step over it, you will not get your budget. Go as close to that line as you can.
I seem to do a lot of retiring.
I handed my passport to the immigration officer, and he looked at it and looked at me and said, 「What are you?」
參考
維基網路:
http://en.wikipedia.org/wiki/Grace_Hopper
國立中央大學數學系:
http://li.math.ncu.e.tw/bcc16/pool/3.06.shtml
耶魯大學計算機系:
http://cs-www.cs.yale.e/homes/tap/Files/hopper-story.html
計算機先驅:
http://202.207.0.245:9001/jisuanjifazhanshi/xianqu/18.htm
This entry was posted in網路3Cand taggedcompiler,debug,Grace Murray Hopper,傳記,發明,編譯器,起源. Bookmark thepermalink.Post a commentor leave a trackback:Trackback URL.
『伍』 c語言編譯器是用什麼於語言寫的
第一個C語言編譯器應該是用匯編寫的,但是第一個成熟的C語言編譯器應該是由匯編和C語言共同寫的。
編譯原理講到了「自舉編譯器」。大意就是先用底層語言(應該是匯編)寫一個能運行,但效率極低的C語言編譯器(底層語言不好優化),有了C語言的編譯器以後,就可以用C語言好好寫一個編譯器了,用之前那個運行沒問題,但效率低得編譯器編譯一下,就得到了可以使用的編譯器了。
『陸』 第一個 C 語言編譯器是用什麼語言編寫的
第一個C語言編譯器(簡單的編譯器)是用匯編完成的,後來的完整C語言編譯器是用C語言編寫的(也就是由簡單的編譯器編譯)。
『柒』 計算機各種語言編譯器怎麼來的
大部分的語言編譯器都是用C開發的(核心部分則可能用到匯編),這一點與操作系統的開發類似(比如linux或者Windows),後期的各種IDE或者軟體部分可能用諸如C++、Delphi(這兩個在linux上都有對應的版本)或者VB等等開發。
最初的匯編編譯器當然是直接用二進制機器碼開發的。「是不是這個編譯器編寫出的程序也必須在這個相應的操作系統上運行?」這個並不完全正確,有些語言是可以跨平台運行的的,比如JAVA,它的口號就是,「一次編譯,到處運行」
『捌』 匯編語言的編譯器是用什麼寫的呢
編譯器一般是用c寫的,最初的東西肯定是用機器語言寫的,我老師曾經用在紙帶上穿孔的辦法寫過程序。
他當時的願望是用鍵盤敲一個A就能輸入一個A,而不是出來一排孔。
『玖』 高級語言寫好之後需要編譯器編譯成機器語言 那是不是C語言 java python等都要編譯 這些編譯器誰開發的
C語言最早的編譯器是用匯編開發的,後來的就可以用C開發了
Java和Python屬於解釋性的語言,
Python的解釋器是用C語言開發的。
每種語言有自己擅長的地方,也有自己的缺點。
『拾』 編譯器一般由哪種語言開發
其實我在想為什麼匯編語言生成一個簡單的編譯器後,可以用新生成的編譯器再次生成編譯器,例如,C語言開發C的編譯器呢?
這是一個遞歸的思想,舉個例子一看就明白了
用一個大的模具可以生成一個A模具,A模具可以做出來B模具,依次往下推,最終這個小模具可以做出來小盒子用來裝東西。
第一個大模具肯定是手工做出來的第一個模具,但是有了這個大模具後,後面就可以用他自動的生成更多的模具,後面的各種模具加起來又可以造出來更精緻的模具,
所以,自動第一個大模具造出來模具的時候,大模具就可以被拋棄了。
我們都知道編譯程序通常分為下面五個階段:
1)詞法分析
2)語法分析
3)語義分析與中間代碼產生
4)優化
5)目標代碼生成
當然最難的一點就是目標代碼的生成,這一階段實現了最終的翻譯,就是真正把原碼翻譯成可以被CPU直接計算的機器碼(NativeCode)。