2014-12-11 15 views
3

如果忘記分號,C++等語言將不起作用,但其他語言(如JavaScript)會自動爲您包含它們。爲什麼一些編程語言允許自動包含分號?

我從這篇文章中知道Do you recommend using semicolons after every statement in JavaScript?,建議使用分號並且有可能會產生不必要的歧義的場景(例如,在不使用花括號時在C++中晃動其他場景)。

在某個時間點,必須有一個決定讓它們成爲可選項(例如,當JavaScript的創建者有意識地選擇使其成爲可選項時)。

我想知道爲什麼做出這個決定以及對這些語言的用戶有何益處。

背景:我是一個新手編碼器,最近纔開始學習JavaScript。

編輯:對於說這是不好的JavaScript的意見,我知道。如果大多數人認爲這是不好的做法,我首先會問爲什麼允許它首先發生。

+0

*「它是如何將這些語言的用戶受益」 * - 這不是在JavaScript中受益。它在JavaScript中非常非常糟糕。 – cdhowie 2014-12-11 00:28:54

+0

爲編譯器的利益 – chris 2014-12-11 00:29:01

+0

@chris不,甚至沒有編譯器。它需要額外的工作才能將此功能添加到編譯器中。 – cdhowie 2014-12-11 00:29:41

回答

4

關於JavaScript,Douglas Crockford在this video中解釋了這個想法的起源。 (這是一個偉大的談話,這真的值得你花時間看它,如果你打算繼續追求的JavaScript。)

這是從說話直接引:

分號的插入是什麼意在使C語法對初學者更容易。

至於它是如何在語言的用戶受益,克羅克福德詳細解釋幾個原因是不利於,而是如何引入非常嚴重的歧義和陷阱到語法。其中最顯着的情況下,當試圖在返回一個對象字面量使用大括號 - 上的左編碼風格(source from the video):

return 
{ 
    ok: false 
}; 

裏面居然返回undefined,因爲插入分號添加一個return後,和剩餘計劃目的字面被解析爲一個代碼塊,等價於:

return; 
{ 
    ok: false; 
} 

試圖讓語言初學者更容易可以善意失誤的一個重要來源。

1

很久以前,在遙遠的塵土飛揚的過去,這樣的事情主要是爲了彌補編譯/鏈接/運行循環以最少幾小時來測量的事實,並且經常運行超過一天。這可能是(好吧:是)等待幾個小時的結果是非常令人沮喪的,只是發現編譯器因爲一些愚蠢的錯字而停在第3行(或其他)。

爲了解決這個問題,一些的編譯器試圖來猜測你的意圖,所以如果一個錯字足夠小(對於「足夠小」的定義),它會認爲它知道你真正的意圖,並繼續編譯(甚至可能執行),儘管有錯誤。

那些沒有學習歷史的人註定要重複它。有些人從歷史中吸取教訓也很重要。對於那些會導致語言設計者目前犯這個錯誤的字符缺陷的確切類型,可能存在很大的爭論空間。然而,關於這是否是一個錯誤的爭論,空間要少得多(根本沒有),顯然是這樣,而且是不可原諒的。

2

作爲JavaScript語言的作者Brendan Eich,有關自動分號插入(ASI)主題的此主題的文章The infernal semicolon

相關報價:

ASI是(正式的說)一個語法糾錯程序。


我希望我在隨後代替ASI 1995年5月,由新行更顯著的JS早在這十幾天,我們會罵需要在兩端使用中綴運算符繼續行,或可能或蠻力括號,強制延續到一個連續的行。但那艘船航行了將近17年。


我的兩分錢:要小心,不要使用ASI,如果它給了JS顯著換行。

1

在javascript中,分號是語句分隔符,但換行符也是如此,所以如果每行有語句,則不需要它們。

其它語言,如C++,只有;作爲分隔符,以及像換行符一樣的空格,什麼也不做。有利弊

用C

++則表示語法是一致的

,如果你寫

int x=0; 
x++; 

如果你再壓縮到一條線,它使用相同的標記: -

int x = 0; x++; 

in javascript if you write

var x=0 
x++ 

然後如果你壓縮到一個行

var x=0 x++ 

將是一個問題

你需要做var x=0; x++

所以,大的事情是空白是否顯著與否。理想情況下,語言會始終使用一種機制。但是對於JavaScript來說它是混合的,所以它在使用時會留下一些模糊不清的地方;

相關問題