很多編程語言都要用到花括弧,分號等來分割代碼,是不是有利?

為什麼很多編程語言在設計的時候都要用到花括弧,分號等來分割代碼,而不像python那樣利用縮進,總的來說,為什麼不減少 一些無實際意義的字元的輸入,而用換行分割,這種編程語言設計風格的改變為什麼如此緩慢


代碼是字元串,字元串就要被複制。顯然在把代碼從一個地方複製/剪切到另一個地方的時候,使用大括弧+分號或者類似的結構的語言可以保持大概的語義不變,而python,嘿!嘿!嘿!

其實我心目中的IDE,應該支持把一個語言渲染成不同的風格,譬如說大括弧啊,縮進啊,要不要分號啊,還是乾脆用begin/end啊,渲染成lisp啊,縮進要多少啊,大括弧要不要換行啊,if後面要不要加空格啊,隨便你!反正保存下來的是二進位的語法樹,拒不兼容其它文本編輯器,merge工具IDE給你做好,一了百了。


python令人不滿的除了不會數3以外,還有一大問題就是需要遊標卡尺啊,題主你選吧,遊標卡尺還是花括弧……


有個故事說,魯迅問書商,為什麼你們計算稿酬的時候按漢字數而不計入標點符號。

書商回復說,啊,周先生,因為那是些無意義的符號啊。魯迅說,哦,這樣啊。

回頭他就把寫好的稿子重新抄了一遍,把標點全去掉,拿給書商。

書商:尼妹!

魯迅:呵呵,你不是說無意義的符號嘛。

無實際意義的字元,說白了就是增加可讀性。

用換行分割代碼好是好,可是萬一你要寫一條超長的語句,是換行還是不換?換行了以後,機器可以根據語法完整來判斷,可程序員怎麼樣才能一眼看出是新語句還是接上句?個人覺得分號是個好東西。

用縮進代表級層也可以,但是問題是縮進這點空間究竟是Tab還是4個空格?我不是Python黨,不知道這個可讀性坑怎麼解決的,反正心裡覺得有點彆扭。


給你一個實例,告訴你分號的意義

lua語言是支持;作為語句結尾,也可以沒有,如果沒有, lua會以能夠理解的一個語句去分割,有下面的例子:

function f1()
print("a1")
return
print("a2")
end

寫return得同學是希望程序執行到return後返回,忽略後面的print("a2"),但是lua本身不支持在return後面還有任何語句,所以lua的理解變成了

function f1()
print("a1")
return print("a2")
end

這樣變莫名其妙執行了print("a2"),所以這個時候正確的做法是

function f1()
print("a1")
return;
print("a2")
end

這樣lua會報告一個語法錯誤:

"end" expected (to close "function" at line 1) near "print"


Python 的縮進會導致語言的文法無法用 CFG 表示,弄到 parser 很難寫


以 Python 為例,因為代碼塊是以縮進數量來判斷的,寫 parser 構建 scope tree 的時候就需要做一些計算 indent 數量進而判斷代碼塊 scope 位置的額外工作,如果遇到 tab 和空格混用的代碼,處理起來就會很成問題。其他明確地使用『{}』符號來分割代碼塊結構的語言,在這方面處理起來就可以方便許多。

所以從 parser 構建角度來看,適當的分割符號可以簡化許多工作。進一步理解可以看看 antlr4 裡面的 python 語法樣例:antlr/grammars-v4。


你們不願意用 S-Exp 我也沒辦法咯(攤手


當然是不利的。有了這些東西,代碼就沒法朗讀了。沒法朗讀還怎麼談笑風生。

根本原因是因為他們不懂得用函數把函數組合成函數。最近在開發的程序語言,就沒有任何括弧以及其他各種標點符號,連換行縮進也不需要。大概長這樣

今有數甲又有整數乙又有整數丙問甲如乙而丙得幾何曰甲以乙除之以丙乘之

不知道比現在這些垃圾語言高到哪裡去了


不利,因為人類會因為花括弧需不需要換行而打起來。


網易公開課


好多過去覺得理所當然的東西慢慢都被證明是多此一舉。

花括弧和分號在OO三傑 c/c++,java,c#中是最重要的分隔符。花括弧和分號語義清楚,比一些語言中的begin/end寫起來方便一些。當然,設計師偷懶,抄襲前人設計的語法也是重要原因 :)

但是python的天才設計師根本不需要這些可見的分隔符,而且還自帶漂亮的代碼格式化。

反過頭來看前面三種語言,除了可以把代碼寫得更加緊湊一些(一行可以寫多句),就只留下了花括弧是否要換行的恆久爭議。

所以,趕快出一個可編譯的python的版本才是當務之急,坐等python4 :)


我是打算來認真回答一下問題的, 曾經困擾了我很多年. 搞得我最後強行自學 parser 然後擼了個語言前端出來. 包括現在大部分時間用網頁寫代碼, 廣告部分調整 https://twitter.com/cirrulang 查看..

歸根到底... 歷史原因!! 歷史原因啊!!

編程語言圈子探索了幾十年, 語法也是已經很多了, 可以到網上對比看一下: http://rosettacode.org/wiki/Search_a_list_of_records

主要的比如:

* 花括弧風格

* begin/end

* Lisp 風格, S 表達式

* ML 風格, 偏向數學公式語法

* Smalltalk 風格

* Python 風格縮進

* CoffeeScript 風格縮進

* 其他...

我個人認為 CoffeeScript 這一套風格已經是最新的進展了, 由於編程語言語法設計存在大量的相互借鑒, 而 CoffeeScript 本來就是借鑒了好多語法之後設計優化的, 目前語法融合已經非常普遍, 所以 CoffeeScript 可以看出來編程語言語法至少在演化來說, 並不慢.

問題是, 目前排行榜上領先的語言, 幾乎都是花括弧一套的, 或者 Web 圈子熱門的語言, Java, JavaScript, C/C++, Go, 大量使用了花括弧的語法. 而 Ruby, Python 之類語言相對小眾. 大家已經形成了習慣, 教程, IDE, 鍵盤手感, 很多都跟花括弧綁定到了一起.

這些圈子也是有很多人信仰減少無用的符號輸入, 比如 CoffeeScript 在當年 ES6 還沒影子的時候, 有大量的粉絲. 以及受到 CoffeeScript 影響, js 圈出現 Coco, LiveScript 這樣的方言, Lua 社區出現 MoonScript, PHP 社區有人開發 SnowScript, Java 社區有人嘗試做 looplang. 此外前端圈 HTML 和 CSS 的方言也是頻繁使用縮進的.

可是即便有人認同縮進, 比如 CoffeeScript 當年氣焰那麼囂張, 等 ES6 消息一出來, 馬上聲音就蓋過了 CoffeeScript, 包括 CoffeeScript 作者也認為 ES6 出來 CoffeeScript 存在的意義不是那麼大了. 為什麼? 因為 ES6 是會在瀏覽器院原生實現的, 包括 Node 也將會支持, 原生的支持比起額外寫個語言要方便多. 而且那是標準. 同時標準也要做到向後兼容, 也就是要對花括弧保持兼容.

那麼最早為什麼用花括弧呢? 細節需要考證了, 我沒有看到過明確的結論, 之前知乎上有提過是因為語法解析的問題, 花括弧或者 begin/end, 特別是 S 表達式會更好解析, 我自己也試過, 解析縮進要處理的情況比單純處理符號麻煩得多. 雖然現在來看, 其實也麻煩不到哪裡去. 反而習慣了括弧之後, 很多人對縮進就不敏感了.

最後我個人還是覺得的, 文本的局限性很大. 這麼多年了還用文本寫代碼, 沒有圖形化的代碼編輯工具, 演化太慢了, 具體還是看我前面給的鏈接 https://twitter.com/cirrulang .


Tokenizer 需要根據這些分詞。


我認為是個習慣的問題。不是技術方案優劣。

早期,計算機語言編程都是在紙面上先書寫,然後在紙卡、紙帶上輸入。多一個空格,都是浪費時間、存儲空間。後來進步點兒了,有字元終端和鍵盤了,很多系統中,輸入代碼仍然沒有全屏的編輯器,只能一行一行地輸入,一行一行地編輯。C、Lisp、FORTRAN……都歷經了當時的歷史。Java脫胎於C++,設計始於90年代初。當時的Unix System V,像vi這種全屏編輯器,尚且不是標配。

Javascript誕生時,html本身已經被設計成空格、回車不敏感。為了兼容不同系統的回車、空格、tab,很多現成詞法分析器,上來就是一個trim。

總之,當年的情況,python這種設計是不現實的。

時間到了2017年,python已經被廣泛應用的情況下,再來說這種設計有硬傷,我覺得只能是思維慣性。代碼複製或者網路傳輸丟失一個空格?tab顯示不兼容?沒有這麼誇張吧。


源碼是給人看的,不是給機器。

既然是給人看的,自然是怎麼明白怎麼來。

花括弧可以分離代碼的語義和樣式,

這樣,不同習慣、審美或信仰的程序員就可以按照自己喜歡的風格來換行,而不會對最後程序執行的結果產生影響(前提是代碼得寫對)


你看個沒標點的文言文累不累


對不起,我已經受夠了遊標卡尺了。。。我選擇花括弧。。。


以前出過的最艹蛋的bug是,代碼縮進應該用一串空格,結果我用了一個TAB。肉眼並看不出來有半毛錢區別,可是死活運行不了

個人認為,用縮進分割的話有個問題,就是你的TAB怎麼算呢?是TAB和空格混用?還是TAB和空格互不匹配?如果互不匹配,那就會發生上面肉眼看不出來的BUG。

如果可以混用呢?有的IDE會幫你把TAB自動轉換成空格,有的TAB佔4個位置,有的佔8個位置。那你在不同的IDE里,對同一段代碼可以看到不同的縮進。


等你設計一個語言就基本知道了 parser token得需要一些標記去分割。魔幻的語言比如ruby parser是很複雜的甚至都拖慢了這門語言。


因為Python看起來噁心啊,用括弧看起來多優雅


推薦閱讀:

請問在線平台實驗樓的會員課程怎樣?
你在上海漢得感覺怎麼樣?
為什麼顯示器不能顯示半個像素?
作為一個程序員,你遇到過哪些來自周圍人的奇葩請求?
你遇到過哪些奇葩的變數名?

TAG:編程語言 | 信息技術IT |