歡迎來到 常識詞典網 , 一個專業的常識知識學習網站!
[ Ctrl + D 鍵 ]收藏本站
答案 1:
最近剛好在上編譯原理,應該算是詞法分析的問題。因為每次輸入“頭符號”后要判斷該符號是數字還是字符,如果是數字,則可以直接跳入數字處理的模塊,若是字符則按變量名來處理。如果允許變量名以數字開頭,則以后每次輸入一個符號都要做一次“是否為數字”的判斷,直到符號出現非數字再轉成變量名,而禁止以數字開頭只需要判斷一次,很顯然“每一次都要判斷”是一種極大的浪費。另外變量名以數字開頭對程序員而言也沒有任何的幫助,反而降低了編譯器的性能,畢竟O(1)和O(n)還是差距不小的。這是我自己做完編譯原理詞法分析實驗后的一些看法,水平有限,希望各位指正。答案 2:
主要是工程折衷。程序語言的分析分詞法和語法兩部分。詞法分析主要用的是正規文法,也就是三型文法。這類文法主要采用正則表達式分析。正則文法分析器的特點是它是不回溯的,所以實現很簡單。如果一個變量以數字開頭,那么分析器就必須在遇到第一個或第二個英文字符的時候回溯來確定是否是數字、變量名還是詞法錯誤,這時候就變成了二型文法。二型文法分析器的好處是支持回溯和遞歸語法(所以語法分析是靠它的),但是缺點是狀態機相比正則文法狀態大大增加,而且代碼寫起來更困難。考慮到詞法分析部分只是用來斷字,我們實在是沒有為了支持變量名以數字開頭這么一個小功能而讓整個詞法分析部分用二型文法寫。故,最后大家都默認了變量要避免用數字開頭。答案 3:
如果以數字開頭,這個變量就可能是純數字了,這樣語言的編譯器(或解釋器)就分不清當前的是數字還是變量名了。即使不是純數字,如100000L在有些語言中表示長整型,還是會有歧義的。答案 4:
編譯的過程中,源文件先根據正則表達式規則掃描、分割成tokens(這一步叫做詞法分析 lexical -ysis),然后根據tokens和保留字的順序和編程語言的規范組成語法分析樹(這一步叫做syntax -ysis),最后才是句法分析(se-ntic -ysis)。其中有很多優化,也盡量合并步驟,目標是使得盡量少的掃描原文,減少時間復雜度。一門語言既要考慮符合人類的習慣,又要考慮適當的規范使得編譯器能夠非常快的掃描。所以說一個token是變量還是常量(數字),應該在越早的時候就確定下來,而變量第一個符號規定不能為數字而是字母,一是符合人類習慣(你看到一個數字打頭的東西比如123l23也許也會感覺是數字,而且有研究表明人類對單詞的詞首和詞尾更-),二是方便正則表達式掃描的時候在一開始就區分開,一舉兩得,這個規定是有意義的。答案 5:
不嚴謹來說,一個程序寫出來,本身是一個大字符串,編譯器對它進行詞法掃描,把這個“字符串”變成一個“詞串”。在這一輪掃描中,為了實現簡單,要求其輸入符合正規文法,也就是說,逐個字符掃描,不能走回頭路。如果遇到數字,自動機就進入掃描數值的狀態,如果遇到字母,則進入其它的狀態。若是允許變量以數字開頭,那當編輯器掃描到一個數字時,就無法判斷它是數字還是字母,就需要進入一個待定狀態,后面再去判斷到底是變量還是數字。這倒不是不能實現,只是沒有必要費這個勁。答案 6:
除了樓上們說的,還有一個原因是:即便允許數字開頭,那也必需再加一句:“但不能只包含數字。”答案 7:
在不降低可用性的前提下,簡化詞法分析器的實現,避免不必要的復雜性。答案 8:
如7樓所說的,其實有些語言的變量名是可以用數字開頭的,只是不能完全是數字,如1a在C語言當中就是非法的,但是在Common Lisp里面就是可用的~答案 9:
1.主要還是習慣,數學變量通常是x_1, x_2,下標都寫在右側,計算機語言沿襲這一些管是很正常的事情;2.詞法解析一般是從左到右的,10000L遇到L可以很自然作為一個終結符,但如果允許1000Le-ian,那么L就沒辦法作為終結符,需要從e開始判斷。這樣需要記住一個像L這樣的字節作為Buffer,判斷起來就不是很簡潔。答案 10:
如樓上所言,容易產生歧義,除了 1000000L 之外,還有 102- 表示 -ex 等。答案 11:
如果以數字開頭,16進制與變量就出現混淆了,如0x10, 0xFF答案 12:
在《javascript權威指南》上剛好看到了一句:P26.數字不允許作為首字符出現,這樣javascript就可以輕易的區別開標識符和數字了;或許能這樣解釋 :)答案 13:
這是考慮計算機沒那么智能的識別關鍵字,編譯器的詞法分析器的分析能力也是有限的答案 14:
就好像不少網站都不準使用純數字作為用戶名(變量名)一樣,為了和用戶ID(數值)區分開來……下一篇:同樣是侵權,人們不討厭 VeryCD 卻痛恨-(文庫)? 下一篇 【方向鍵 ( → )下一篇】
上一篇:暴風影音有哪些問題?存在哪些痛處? 上一篇 【方向鍵 ( ← )上一篇】
快搜