javascript - 為何有的語言要聲明function關鍵字,有的卻不需要呢?

來源:互聯網
上載者:User
我看了很多語言原始碼,突然發現一個有趣的現象,對於 function這個關鍵字,很多語言設計出來了,而很多語言卻沒有。這是基於一種什麼考慮呢?

而且經過我的統計,出現function關鍵字的大多數是指令碼語言,比如php,js等等,而編譯式語言比如java,c等等,往往卻沒有用到這個關鍵字,這其中有什麼內在聯絡嗎?

回複內容:

我看了很多語言原始碼,突然發現一個有趣的現象,對於function這個關鍵字,很多語言設計出來了,而很多語言卻沒有。這是基於一種什麼考慮呢?

而且經過我的統計,出現function關鍵字的大多數是指令碼語言,比如php,js等等,而編譯式語言比如java,c等等,往往卻沒有用到這個關鍵字,這其中有什麼內在聯絡嗎?

很贊的一個問題。

我也看過很多語言原始碼,也對不同的語言的文法感興趣,所以簡單的聊聊這個問題。

首先出場的是 LISP 語言。 LISP 語言以逼格高聞名於世。他屬於函數式程式設計語言,所有的語句都是函數,因此不需要 function 這個關鍵詞。

隨後的 Fortran 語言,公式翻譯的意思 FormulaTranslation。既然是公式翻譯語言,因此 數學公式 f(x) = a + b 在 Fortran 的調用就是 x = a + b

在定義函數的方式上,使用 function:(代碼來自google)

function add(a, b)implicit nonereal::a, b    !聲明函數參數類型,這是必需的real::add     !聲明函數傳回值類型,這是必需的add = a + b   !傳回值的運算式returnend

COBOL語言。COBOL 設計的目的和 Fortran 不同,甚至連指派陳述式都沒有,而且根本就沒有函數的概念,取而代之的是 PROCEDURE DIVISION(過程)。

隨後就是 Basic:Beginner's All-purpose Symbolic Instruction Code。Basic 可謂是集大成者,不僅僅有函數,還有過程。函數使用 function, 過程使用 sub。(抄襲 fortran 和 cobol?)

C語言改變了這種局面,原因是C語言的一個獨闢蹊徑的設計理念:函數如何調用,就如何聲明。也就是說,我們如果這樣調用函數

sum = f(a, b);

那麼,我們就這麼聲明:

double f(a, b)     /* 舊式文法 */    double a;    double b;{}double f(double a, double b)  // 新式文法{}

隨後的 C++ Java C# 走的是C的路線。

但是調用和聲明一致的前提是,函數調用之前需要聲明。在 C 語言中,不僅僅是函數,即使資料類型定義也需要聲明。

不過在很多動態語言中,大部分資料和函數都不需要提前聲明,而且有很多函數只調用一次,那麼在函數調用之前聲明一次,以後這個函數就再不使用了,這樣就會顯得繁瑣。這時,就需要在文法上將函數定義和函數調用分別出來。

還有一個原因,C是種編譯性的語言,他的文法是為了更好的提升編譯速度和編譯完成後的代碼效能,比如早期C和pascal編譯器要求的資料和代碼分離的原則。

而現在的主要動態程式設計語言都不再需要編譯,更無需先行編譯。

function是個標記,表明正在聲明的是一個函數,這個關鍵字和編譯型或解釋型沒什麼太大關係,使用這個關鍵字的大多是動態類型語言,對於C/JAVA這一類靜態類型語言,標明傳回值和參數列表就可以明確的區分函式宣告函數調用,因為函數本身和參數都標明了類型,但動態類型的語言沒有類型表示,如果不加入一個特定的關鍵字,從文法上就不太好區分函式宣告函數調用,比如C語言中:
int f(int n)是一個聲明,f(n)是一個調用,但在JavaScript中,如果你不加function這個關鍵字,你該如何解釋f(n)到底是什麼呢?

問一個問題, 請問 "打" 的正確含義是什麼?

任何人都不應該給出正確的答案, 因為你不知道它被作為動詞還是量詞, 或者其他意思.

所以我們需要從 "一打" "打手" "開啟" 這樣的上下文中分析該詞的含義.

至於 function 這個關鍵詞需不需要出現, 取決於語言的設計.

合格的程式員都知道代碼文本, 經過編譯之後, 最終成為機器碼或者 vm 用的位元組碼, 所以跟你寫不寫 function 沒有關係. function 之類的關鍵字方便在編譯前的分析階段, 能夠正確(並且實現上不那麼費力)地通過文法和語義分析.

舉個例子, 在 5.4 之前, php 不支援 abc()[1] 這種對函數傳回值取數組索引(前提是得保證返回了理想長度的數組), 鳥哥給的原因(記不清了,估計是他)是解析代碼比較亂, 比較難實現, 到 5.4, 總算有人願意幹這個髒活了, 解決了這個問題. 如果哪天誰把 function 這個關鍵字的解析工作最佳化了, 那麼可能就會出現一個不需要 function 關鍵字的 php.

舉個栗子, 因為文法被很多人討厭的 bash
函數定義如下

 [ function ] name () compound-command [ redirections ]

定義函數的的時候, function 關鍵字是可選的, 但, 沒有 function 的時候, 需要寫上 ()
所以, 意味著 bash 通過 function 或者 () 來定位這是一個函式宣告, 而不是語句.

更加準確的回答, 需要從語言的解析具體實現進行分析, 另外還要確定是否存在和 abc(){} 衝突的特性存在, 就不繼續深入了

什麼叫思而不學則殆?這就是活生生的例子。

你沒見過用def定義函數的python嗎?沒見過用fn定義函數的rust嗎?沒見過用func定義函數的swift嗎?沒見過可以加function也可以不加function的bash函數嗎?沒見過既可以用def也可以用val定義函數的scala嗎?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.