來自高層次的編程背景,我有興趣瞭解低級編程。我想知道編譯器是如何編譯的?編譯器如何編譯編譯器?
看過wiki中的一些文章後,Numerical machine code被認爲是最低級的語言,但必須有編譯器才能編譯此機器碼。編譯器編寫的語言是什麼?
來自高層次的編程背景,我有興趣瞭解低級編程。我想知道編譯器是如何編譯的?編譯器如何編譯編譯器?
看過wiki中的一些文章後,Numerical machine code被認爲是最低級的語言,但必須有編譯器才能編譯此機器碼。編譯器編寫的語言是什麼?
通常情況下,編譯器作者們兩條路線之一:
寫在其他一些現有的語言,整個編譯器。這通常是最簡單的選擇。
在一些其他語言中編寫足夠的代碼以擁有最低限度可用的翻譯程序,並使用該「腳手架」作爲編譯程序本身編譯時所用語言的基礎。這更復雜,通常需要更長時間,但通過在真實項目中測試語言,內在地提供了清除語言錯誤和弱點的機會。
翻譯代碼的第一個程序至少部分寫在了機器代碼中 - 這是告訴CPU該做什麼的實際數字。這是最低級別,因爲機器代碼*沒有真正的「編譯器」它只是以某種方式排列的數字,並且CPU內部有電路可以在沒有外部幫助的情況下處理它們。
*有些程序可以幫助設計解釋和執行指令的硬件,但這可以說是超出了編譯器的定義。這些程序生成硬件描述 - 電路圖等 - 與編譯器輸出的直接可執行文件相反。
數值的機器代碼是二進制的。 1s和0s。編譯意味着將其減少到一些更低的形式,所以它不是真正編譯的。
例如,從維基文章你報: For example, on the Zilog Z80 processor, the machine code 00000101, which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B.
所以你必須在你寫的Z80彙編語言和指令DEC B將被編譯成「00000101」編譯 - 反之亦然。
您可以隨時使用自己喜歡的編譯器來寫另一個編譯器,說B.在這家B你添加了一些額外的功能,所以它很容易成爲你最喜歡的一個,你會用它來編寫編譯C,.. 。
如何開始呢? 過去人們只是用原始數字填充內存直接由CPU解釋。這就是爲什麼源通常被稱爲的代碼。 一旦這樣編寫了一個最小化的編譯器,就可以執行它來創建另一個用它編譯的語言編寫的編譯器。 這也可以用來創建更高級別等等。
事實上填充原始指令代碼到存儲器本身可被視爲一個零電平的編譯過程,其中所述人類是編譯器。
這是很平常的,對於一個給定的語言的編譯器是用同一種語言。例如,C編程語言就是這種情況。這多半是一致的,因爲誰知道一種足夠敢於爲它編寫編譯器的語言,可能在他最喜歡的編程語言中有這種語言用於編程。 雖然這只是一個典型的例子,但沒有必要,因爲有許多語言可供選擇,包括特別適合編譯器構建的語言。
數控機牀代碼表示一系列斷和狀態的電路是所有電子數據是在最低水平的東西。 對於這種低級語言,每個人都沒有「編譯器」,而是將計算機中的電路組合起來並以這樣的方式構建,即通過讀取由高或低電狀態實現的代碼中的開啓和關閉來「解釋」它們。無論如何,這些高或低級別的狀態會導致不同的門/電路打開或關閉,一般情況會有所不同。 查看更多關於Electronic Gates。
機器碼不需要編譯。它直接由CPU執行。您可以使用十六進制編輯器輸入它。 – Blorgbeard
從文章第二段 – wtsang02
中可以看出,數字機器代碼(即非彙編代碼)可以被認爲是編譯和/或彙編的計算機程序的最低級別表示。是,*最低級別* - 沒有低等級。這是什麼其他語言編譯*爲*! – Blorgbeard