導航:首頁 > 源碼編譯 > c語言能寫出匯編的編譯器嗎

c語言能寫出匯編的編譯器嗎

發布時間:2025-01-09 06:11:48

❶ 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】進入!

還有編程學習文件(源碼,零基礎教程,項目實戰教學視頻),歡迎初學者和正在進階中的小夥伴們!

❷ 匯編語言的編譯器是用什麼寫的呢

編譯器一般是用c寫的,最初的東西肯定是用機器語言寫的,我老師曾經用在紙帶上穿孔的辦法寫過程序。
他當時的願望是用鍵盤敲一個A就能輸入一個A,而不是出來一排孔。

❸ 匯編語言編譯器是怎麼來的

第一個軟體,顯然是用機器語言寫的。

當用機器語言寫成了文字處理軟體,才能用屏幕、鍵盤打字。

當用機器語言寫成了編譯軟體,才能把打好的字,編譯成機器碼。

❹ 用c語言寫程序時,還可以用匯編語言嗎

可以像樓上一樣用特定編譯器支持的asm、__asm一類關鍵字內嵌匯編,也可以讓編譯器編譯時輸出匯編代碼,然後再在上面進行改動,最後一並轉成機器碼。要用哪種方法還是看需要而定,如果是實現一個特定模塊,可以內嵌;如果是要做代碼調整,用後一種。
不過話說回來,在現代編譯器把優化已經做得很好的情況下,用C這么底層的語言已經很少用得到匯編了。

❺ c語言編譯器是用匯編語言寫的嗎

這個是肯定的。演算法優化,首先是邏輯描述的精煉化。至於C,只是計算邏輯到計算機模式的一種映射,而匯編僅是利用特殊計算機指令的一個更深的藕荷。
不過有一點,C語言由於是計算邏輯到計算機模式的映射,所以不單單考慮演算法本身,還肩負數據組織的實現。數據流動方式,數據組織方式,對計算性能的影響也很大。這要看是否和計算機組成原理相貼近。其實這塊也是側重邏輯的設計,而不是具體機器指令的實現,因此匯編是無能為力的。
不過在DSP等特殊CPU架構,C語言和編譯器無法很好的將上述邏輯轉換為機器指令,或者C本身的邏輯無法很好的貼近CPU的特性,那麼還是得匯編。一個典型的例子就是如何使用DSP的並行指令(通常的矢量計算)和並發指令集,幾個不同的指令(隸屬不同處理單元)的同時執行。使用C語言無法描述清楚這些邏輯方式,而編譯器又太水,則還是不得不用匯編。此時C語言僅能淪落到大的計算機組織特性的貼近,和整體框架,模塊的設計上。細節方面無能為力了。

❻ 程序語言,操作系統,編譯器三者之間有何關系

可以理解為程序語言需要在編譯器裡面進行編譯,但是編輯器需要運行在操作系統里
編程語言(programming language),是用來定義計算機程序的形式語言。它是一種被標准化的交流技巧,用來向計算機發出指令。一種計算機語言讓程序員能夠准確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當採取的
簡單講,編譯器就是將"一種語言(通常為高級語言)"翻譯為"另一種語言(通常為低級語言)"的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)
操作系統是管理計算機硬體資源,控制其他程序運行並為用戶提供交互操作界面的系統軟體的集合。操作系統是計算機系統的關鍵組成部分,負責管理與配置內存、決定系統資源供需的優先次序、控制輸入與輸出設備、操作網路與管理文件系統等基本任務。操作系統的種類很多,各種設備安裝的操作系統可從簡單到復雜,可從手機的嵌入式操作系統到超級計算機的大型操作系統。目前流行的現代操作系統主要有Android、BSD、iOS、Linux、Mac OS X、Windows、Windows Phone和z/OS等,除了Windows和z/OS等少數操作系統,大部分操作系統都為類Unix操作系統。

閱讀全文

與c語言能寫出匯編的編譯器嗎相關的資料

熱點內容
都市麗人的解壓視頻 瀏覽:864
我的世界伺服器轉送點怎麼轉 瀏覽:640
php用什麼linux系統 瀏覽:139
cgi模塊python 瀏覽:226
安卓手機如何悄無聲息整壞手機 瀏覽:808
php獲取資料庫名稱 瀏覽:557
app伺服器怎麼防止交互埠 瀏覽:833
對一個演算法的評價不包括 瀏覽:535
3D臉pdf 瀏覽:886
在編譯之前更改指定時間 瀏覽:360
機房伺服器電源線如何扎線 瀏覽:732
什麼演算法治宣傳 瀏覽:18
哪個app可以測溫槍 瀏覽:18
macmongodbphp 瀏覽:336
php寫游戲伺服器 瀏覽:875
對立陣營插旗命令 瀏覽:373
java實現帕斯卡三角形演算法 瀏覽:316
linux文件名限制 瀏覽:710
金稅三期代理伺服器地址是什麼意思 瀏覽:429
多自變數擬合Python 瀏覽:456