哪些概念控制流,數據類型,語句,表達式和操作屬於?語法或語義?編程語言的原語
控制流,數據類型,語句,表達式,操作,函數,...之間的關係是什麼?一個程序是如何從這些基元逐級構建的?
我想了解這些原始概念及其關係,以便找出應該學習的新語言的哪些方面。
感謝和問候!
哪些概念控制流,數據類型,語句,表達式和操作屬於?語法或語義?編程語言的原語
控制流,數據類型,語句,表達式,操作,函數,...之間的關係是什麼?一個程序是如何從這些基元逐級構建的?
我想了解這些原始概念及其關係,以便找出應該學習的新語言的哪些方面。
感謝和問候!
所有這些語言元素都有語法(它是如何被寫入的)和語義(它被寫入的方式如何對應於它的實際意義)。控制流決定執行哪些語句以及何時,表達式產生一個值並且可以由函數和其他語言元素組成(雖然細節取決於編程語言)。操作通常是一系列的陳述。 「功能」的含義因語言而異;在某些語言中,可以通過名稱調用的任何操作都是一個函數。在其他語言中,函數是產生結果的操作(與不報告結果的過程相反)。有些語言也要求功能是非變異的,而程序可以是變異的,儘管這種變化因語言而異。數據類型封裝了可以在該數據上操作的數據和操作/過程/功能。
這些概念屬於兩者。
語句,表達式,控制流操作,數據類型等使用語法定義了它們的結構。但是,它們的含義來自語義。
當您爲編程語言及其結構定義了語法和語義時,它基本上爲您提供了一組構建塊。該語法用於理解代碼中的結構 - 通常使用抽象語法樹或AST來表示。然後可以遍歷樹並將語義應用於每個元素以執行程序,或者爲某些指令集生成一些指令,以便稍後執行代碼。
它們屬於兩個世界:
語法將描述這是運營商,這是基本類型(int
,float
),這是關鍵字(return
,for
,while
)。所以語法決定了你可以在編程語言中使用哪些「單詞」。與字我的意思是每一個可能的令牌:=
是令牌,void
是令牌,varName12345
是被認爲作爲標識符的令牌,12.4
是視爲浮動令牌等等..
語義將描述如何將這些令牌在您的語言中組合在一起。
例如,你將有while
語義是一樣的東西:
WHILE ::= 'while' '(' CONDITION ')' '{' STATEMENTS '}'
CONDITION ::= CONDITION '&&' CONDITION | CONDITION '||' CONDITION | ...
STATEMENTS ::= STATEMENT ';' STATEMENTS | empty_rule
等。這是語言的語法,它準確描述了語言的結構。所以它可以根據語言語義來決定程序是否正確。
然後還有第三個方面的語義,那就是「這個結構是什麼意思?」。您可以將其視爲例如for
循環與它如何轉換爲需要執行的較低級別語言之間的對應關係。
這個第三方面將決定你的程序在允許的操作方面是否正確。通常你可以讓一個編譯器拒絕許多沒有意義的程序(因爲它們違背了語義),但是爲了能夠找到許多不同的錯誤,你將不得不引入一個新的工具:類型檢查器,它也會檢查你每當你做什麼根據類型他們的操作是正確的。
例如,您的文法可以允許做varName = 12.4
,但類型檢查器將使用varName
的聲明來了解是否可以爲其分配浮點數。 (當然我們正在談論靜態類型檢查)