編程語言為什么要區(qū)分表達式expression和語句statement?
先說核心觀點:表達式解決"是什么"的問題,表示的是一個值;語句解決"做什么"的問題,表示的是一個動作。設(shè)計編程語言的要求,邏輯更清晰,更容易設(shè)計便于程序員更好的、更精確地交流表達式、語句的區(qū)別
所有代碼都有語句組成(簡單語句、復(fù)合語句),而表達式可能是語句的一部分。以自然語言來類比下,“買一本書”,其中“買一本書”整體是一個語句,而“書”是一個表達式。代碼是要執(zhí)行的,本質(zhì)上是執(zhí)行一堆指令的過程,所以代碼由語句組成。但是要執(zhí)行一條語句,可能需要先明確“表達式”的值,否則計算機會模糊。
以Python為例, 可以print的都是表達式:
比如print(3), print(max(3, 9)) 都能執(zhí)行成功,表明3和max(3,9)都是一個表達式。
而print(x=3), print(import numpy)會報錯,說明x=3, import numpy不是表達式,其中前者是一個賦值語句,后者是一個導(dǎo)入語句。
有時候,一個語句可能全部由表達是組成,稱之為表達式語句,其中該語句的表示的動作是“求該表達式的值”,python官方文檔的原文是:
表達式語句用于計算和寫入值(大多是在交互模式下),或者(通常情況)調(diào)用一個過程 (過程就是不返回有意義結(jié)果的函數(shù);在 Python 中,過程的返回值為 None)。表達式語句會對指定的表達式列表(也可能為單一表達式)進行求值。這一點,可能會讓很多人模糊糾結(jié),其實使用起來不用太較真,只要記住表達式用來表示的是一個值,語句表示的是一個動作。
如果讓你設(shè)計一門新的編程語言,要區(qū)分表達式和語句么?你可能說,那太難了,我就是一個語言的使用者。那換個問題,如果讓你設(shè)計一輛汽車,你需不需要將汽車拆分成發(fā)動機、車架、車窗、輪胎等各個零件?作為設(shè)計師,你為什么要拆分呢? 我想一種答案,可能是拆分后,每個人可以關(guān)注與自己的細(xì)分領(lǐng)域,效率會更高。
一門編程語言的誕生,語法要足夠嚴(yán)謹(jǐn)。如果語法模糊,編譯器會困惑,軟件開發(fā)人員作為使用者會更困惑,嚴(yán)重影響體驗。語法要嚴(yán)謹(jǐn),就要將語句進行進一步的拆分。打個比方,程序設(shè)計同樣如此,這樣邏輯會更清晰,更容易設(shè)計。絕大多數(shù)語言的設(shè)計,都會區(qū)分表達式和語句的。
便于交流程序員會有很多專業(yè)術(shù)語,這些術(shù)語就是為了更好、更準(zhǔn)確的交流。想象下,如果不區(qū)分兩者,碰到兩個較真的程序員,那兩人可能會每次都要花額外的時間,來確定一個模糊兩可的詞匯,都會去猜、然后去確認(rèn)。豈不是溝通效率很低?
這個問題我之前也糾結(jié)過,站在程序語言的設(shè)計視角可能會更容易理解,更容易明白原因。