您好,登錄后才能下訂單哦!
面對需求人員不斷提出的變態需求,軟件開發人員的主要工作就是將需求人員口中或文檔中的自然語言翻譯成計算機能夠理解的形式語言。自然語言指的是人類的語言,比如漢語、英語等,它具有多義性(在不同的上下文中,意義是不同的),冗余性(語法錯了一點 并不會讓人引起誤解)。而形式語言是用精確的數學或機器可處理的公式定義的語言,例如計算機編程語言,它的特點就是語法非常嚴格,并不具有多義性和冗余性。
計算機編程語言可以分為高級語言和低級語言。高級語言編程更加容易、維護容易,具備可移植性(一份代碼可以運行在多個平臺上),典型代表 :Java、Python、C、C++、Ruby、C#等。低級語言只能在某個平臺上運行,不具備可移植性,比如說我們在Intel x86編寫的代碼,無法在PowerPC或ARM上運行,它的典型代表有機器語言和匯編語言。
高級語言中又可以分為解釋型語言(interpreting)和編譯型語言(compiling)。解釋型語言通過解釋器讀入高級語言寫的指令,然后解釋執行,Ruby、Python、PHP都是解釋型語言。編譯型語言使用編譯器把高級語言變成目標代碼。下面舉個例子來介紹解釋型語言和編譯型語言的區別。
sum = x*4 - y
針對上面這行代碼,計算機首先要做詞法分析,將代碼變成一個個token。下圖中的每一行表示一個token。
再獲得token之后,進行語法分析 構建抽象語法樹(AST)。
解釋型語言會對抽象語法樹進行解釋執行,而編譯型語言會繼續進行語義分析、中間代碼生成 、代碼優化、目標代碼生成。
目前很多語言都是混合了解釋和編譯,例如Java,如下圖所示,Java編譯器先把Java編譯成Class文件,然后在各個JVM上解釋執行,由于每個平臺對應一個JVM,因此Java是跨平臺的。由于2-8原則的存在,JVM發現一段代碼經常執行,那么,JVM將這段代碼編譯成本地代碼,即如果有熱點代碼,就編譯成本地代碼(Native Code)。
計算機高級語言還可以分為靜態語言和動態語言。靜態語言是代碼經過編譯之后,類型就確定了,典型代表就是Java。靜態語言可以通過IDE來進行類型錯誤檢查。而動態語言類型錯誤無法在編譯期檢查出來,會在運行期出現。為了幫助大家更好的理解,直接上代碼。當執行test(new Women())
,IDEA會報告編譯出錯。為了消除這個錯誤,我們可以抽象出一個對象Person
,然后讓Man
和Women
都繼承于這個Person
,而且void test(Person p)
,這樣一來既消除了錯誤,又維護了原有的功能。
class Man {
public void eat(){
System.out.println(" man eat!");
}
}
class Women {
public void eat(){
System.out.println(" Women eat!");
}
}
void test(Man m){
m.eat();
}
通過上述內容的介紹,我們知道了計算機語言的分類,那么,我們該如何
定義一門語言呢?首選我們需要定義BNF。通過BNF來判定源代碼是否符合該規范。下面,以Java的Class的BNF為例。
修飾符(modifier)是“public、private、protected、static等”關鍵字(keyword)之一;
修飾符之后是class關鍵字,class之后是標識符(identifier),標識符是有“a...z $..”組成
可選的extends
具體實例
public class Employee extend Person{
...
? ? 略
...
}
編譯器首先讀取public這個token,同時,由于編譯器事先知道BNF,那么 它知道public是modifier是符合語法的。
然后,編譯器讀入class,同BNF進行比較,符合語法的。直到編譯器讀入extend,發現和BNF規定的不相符,提示錯誤。
如果源代碼符合BNF規則,則繼續進行詞法分析、語法分析、語義分析等等,這里就不做過多介紹了,我會在后續文章中詳細介紹的。
順序
分支(if else,switch)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。