任何語言都有開發出來編譯器的可能?
今天在思考乙個問題,畢竟學完編譯原理一段時間了,編譯器到底可以由哪種語言開發呢?
我們都知道編譯程式通常分為下面五個階段:
1)詞法分析
2)語法分析
3)語義分析與中間**產生
4)優化
5)目標**生成
當然最難的一點就是目標**的生成,這一階段實現了最終的翻譯,就是真正把原碼翻譯成可以被cpu直接計算的機器碼(nativecode)。
在網上看了看,有的網友說c語言的第一代編譯器是由b語言寫的,因為c語言畢竟是在b語言的基礎上設計出的一種新語言。
但是b語言由a語言修改而成的語言,當然b語言的編譯器肯定是a語言生成的,那a呢?無窮遞迴,總有乙個結束的地方。
那就是組合語言,組合語言寫出了第乙個簡單的編譯器,然後這個編譯器再生成編譯器,不斷的生成新的編譯器,不斷的拋棄舊編譯器,這樣編譯器就越來越成熟,越來
越好用了。
也就是下面的這句話:
機器生彙編,彙編生a,a生b,b生c,c生萬物。
理論上來講,用什麼語言都可以編寫出編譯器,只是效率的問題,因為經過很多步驟的翻譯,都最終翻譯成了機器碼,有的步驟多,效率低,有的步驟少,效率高,當然,我
們現在用的就是效率高的這種。
其實我在想為什麼組合語言生成乙個簡單的編譯器後,可以用新生成的編譯器再次生成編譯器,例如,c語言開發c的編譯器呢?
這是乙個遞迴的思想,舉個例子一看就明白了
用乙個大的模具可以生成乙個a模具,a模具可以做出來b模具,依次往下推,最終這個小模具可以做出來小盒子用來裝東西。
第乙個大模具肯定是手工做出來的第乙個模具,但是有了這個大模具後,後面就可以用他自動的生成更多的模具,後面的各種模具加起來又可以造出來更精緻的模具,
所以,自動第乙個大模具造出來模具的時候,大模具就可以被拋棄了。
開發出現的錯誤
1 unexpected end of input 的英文意思是 意外的終止輸入 2 它通常表示我們瀏覽器在讀取我們的js 時,碰到了不可預知的錯誤,導致瀏覽器 無語進行下面的讀取 3 通常造成這種錯誤的原因是應該成雙的符號輸入錯誤,比如說 當指令碼遇到未初始化的變數或物件時,通常會丟擲如上圖所示的...
學會了C語言可以開發出很多東西嗎?
c語言相比其他高階語言,就像內功和劍法一樣。只會c語言可能並不能寫出乙個看起來就很厲害的程式,但c語言是你學好其他一切語言的基礎。有了c語言的底子,再學別的語言就很容易上手了。你能想到的,c語言都能搞,可以說是無所不能,把c學好,上手其他語言也會事半功倍。只看教程不動手永遠學不會,推薦10個c的入門...
IOS開發之如何開發出更好的應用
用電量和記憶體的消耗是ios應用開發中比較重要的兩個因素,下面介紹一些減少這兩種消耗的因素 關於ios應用開發電量消耗的幾點建議 1 避免做需要輪詢的工作 輪詢會阻止cpu休眠,cpu一直執行中所以會增加耗電量 2 盡量避免頻繁的操作磁碟,如 檔案的讀取資料庫的操作等 3 最好採用延時的方式載入顯示...