2010-03-26 240 views
1

哪些概念控制流,數據類型,語句,表達式和操作屬於?語法或語義?編程語言的原語

控制流,數據類型,語句,表達式,操作,函數,...之間的關係是什麼?一個程序是如何從這些基元逐級構建的?

我想了解這些原始概念及其關係,以便找出應該學習的新語言的哪些方面。

感謝和問候!

回答

2

所有這些語言元素都有語法(它是如何被寫入的)和語義(它被寫入的方式如何對應於它的實際意義)。控制流決定執行哪些語句以及何時,表達式產生一個值並且可以由函數和其他語言元素組成(雖然細節取決於編程語言)。操作通常是一系列的陳述。 「功能」的含義因語言而異;在某些語言中,可以通過名稱調用的任何操作都是一個函數。在其他語言中,函數是產生結果的操作(與不報告結果的過程相反)。有些語言也要求功能是非變異的,而程序可以是變異的,儘管這種變化因語言而異。數據類型封裝了可以在該數據上操作的數據和操作/過程/功能。

1

這些概念屬於兩者。

語句,表達式,控制流操作,數據類型等使用語法定義了它們的結構。但是,它們的含義來自語義。

當您爲編程語言及其結構定義了語法和語義時,它基本上爲您提供了一組構建塊。該語法用於理解代碼中的結構 - 通常使用抽象語法樹或AST來表示。然後可以遍歷樹並將語義應用於每個元素以執行程序,或者爲某些指令集生成一些指令,以便稍後執行代碼。

2

它們屬於兩個世界:

  • 語法將描述這是運營商,這是基本類型(intfloat),這是關鍵字(returnforwhile)。所以語法決定了你可以在編程語言中使用哪些「單詞」。與字我的意思是每一個可能的令牌:=是令牌,void是令牌,varName12345是被認爲作爲標識符的令牌,12.4是視爲浮動令牌等等..

  • 語義將描述如何將這些令牌在您的語言中組合在一起。

例如,你將有while語義是一樣的東西:

WHILE ::= 'while' '(' CONDITION ')' '{' STATEMENTS '}' 
CONDITION ::= CONDITION '&&' CONDITION | CONDITION '||' CONDITION | ... 
STATEMENTS ::= STATEMENT ';' STATEMENTS | empty_rule 

等。這是語言的語法,它準確描述了語言的結構。所以它可以根據語言語義來決定程序是否正確。

然後還有第三個方面的語義,那就是「這個結構是什麼意思?」。您可以將其視爲例如for循環與它如何轉換爲需要執行的較低級別語言之間的對應關係。

這個第三方面將決定你的程序在允許的操作方面是否正確。通常你可以讓一個編譯器拒絕許多沒有意義的程序(因爲它們違背了語義),但是爲了能夠找到許多不同的錯誤,你將不得不引入一個新的工具:類型檢查器,它也會檢查你每當你做什麼根據類型他們的操作是正確的。

例如,您的文法可以允許做varName = 12.4,但類型檢查器將使用varName的聲明來了解是否可以爲其分配浮點數。 (當然我們正在談論靜態類型檢查)