學術探討系列:型別推論(一) Type inference(I)
本篇是學術探討系列的第一篇,與先前不同的是內容上會以純粹學術角度集中探討一些題目,打響頭炮的將會是關於型別推論(Type inference)。歡迎大家留言建議一些題目啊。
靜態x型別 vs 動態型別
在Programming 的世界,自古以來已有兩大 陣營:靜態型別(Static Typing) 及 動態型別( Dynamic Typing),以下將會簡稱為Static 及Dynamic。Static 的歷史較久,由 Fortran 至 Cobol 、C 至 C++ 、 C# 至 Java ,都是Static 陣營的中流柢柱。Dynamic 陣營在八九十年代開始變得受歡迎,亦由於簡單易學成為初學者的最愛,最受歡迎的 Javascript 、Python 、PHP 皆是Dynamic 陣營的代表 。
圖片來源:https://blogs.agilefaqs.com/
如何分辨Static 跟 Dynamic 陣營呢? 其實Static 跟Dynamic 所描術的是變數的type。
靜態型別
例如以下一段code,可見變數name以及names都分別定義為 String 及 List<String>,好處是Editor/IDE 能夠顯示所屬類別的method 和property。但明顯表達得相當累贅,由其是第二行,List<String> 跟 ArrayList<String> 各出現一次,相當囉囉嗦嗦。 而之後亦不能夠將變數改為其他type,因此是變數的type是Static 的。
String name = "John Doe";
List<String> names = new ArrayList<String>();
names.add(name);
Java Code例子
動態型別
同樣的feature ,在Python 實現就簡單得多,以以下一段code,可以看見只需寫下variable的名字,表達得亦相當自然。問題是其實未到運行一刻,亦不會知道type上是否正確。names 是否有一個叫 append 的method 此類問題在實際運行前一概不知。 而亦可以隨便將變數改為其他type,因此變數的type是Dynamic 的。
name = "John Doe";
names = [];
names.append(name);
Python Code 例子
正是兩者各有優劣,因此往往圍繞這個問題的討論都會非常熱烈,而兩個陣營各有支持者:
- Static 陣營支持者覺得Dynamic 陣營的Code普遍欠缺結構,亦欠缺應有的Validation。
- Dynamic 陣營支持者覺得Static 陣營多此一舉,Code size 亦因而較大。