編譯器的工作就是將用代碼編寫的源程序翻譯爲計算機可以執行的目標程序,例如.c編譯後生成.exe
前面會涉及一些基礎,可以直接看第四標題的內容
機器語言
計算機剛發明的時候人們通過各種開關和電纜來編寫程序。這時候的程序是真正的二進制,例如000110101011。
後來做出了改進,把程序打在穿孔帶上,讓機器讀取。但本質還是沒有改變,還是在使用二進制編程。下面舉一個例子:
0001表示加
1010表示寄存器a
1011表示寄存器b
那麼把a和b的值加起來放在a,就是0001 1010 1011
當時的程序員比大熊貓還稀少,每天腦子裏除了0就是1
彙編語言
既然二進制這麼難記,人們就想到了給這些指令記一個好記的名字
0001:add
1010:a
1011:b
這樣子就變成了,add a b
但計算機太笨了,只能執行二進制,所以彙編器出來了,用來把彙編語言轉換爲機器語言
高級語言
機器語言和彙編語言一直被統一稱爲低級語言
人類一直探索一種更高級的語言來寫程序。這個語言應該是面向人而不是面向機器。
能使用變量來存放數據,而不是寄存器:int a=10;
能用表達式來表示自己的意圖:a++;
能用判斷語句來處理分支:if(a>=0) ;else a=-a;
能用循環語句:for(int i=1;i<=100;i++) sum+=i;
能定義一個函數處理一段多次使用的操作:int getmax(){}
編譯器的工作就是把高級語言翻譯成機器語言
編譯器的操作
我們先看看編譯的過程:
詞法分析:
簡單來說,就是刪除語句中的空格,建立一張符號表,例如sum+=i;
語法分析:把符號表根據語法規則組建成一棵語法樹
語義分析:判斷標識符的類型、作用域是否正確,運算是否合法,取值範圍是否有問題等等
中間代碼生成:
temp1=id1+id4;
id1=temp1;
翻譯成彙編語言:
MOV R1 id1;sum的值放入寄存器R1
MOV R2 id4;i的值放入寄存器R2
ADD R2 R1;R1和R2的值相加,放入R1
MOV id1 R1;把R1的值放入id1
接下來就是彙編成二進制了。