目前為止介紹到這邊已經算是把Julia這個語言都介紹過一遍了。
雖然有些細節部份沒有提到,或是更進階的功能也沒有提到,不過這些應該足以讓我們可以完成一個專案了。
如同標題提到的,有人會問說Julia是個什麼樣的語言?
像C++、Java、C#、Python、Ruby是個物件導向的語言,Haskell、Erlang、Ocaml、Lisp都屬於函數式的語言。
那Julia是屬於哪個家族的呢?
我認為Julia有著metaprogramming的骨,披著object-oriented的皮。
他自己內部跟底層都是用metaprogramming所建立起來的,但是使用者在編寫的時候主要是以物件導向的方式在編寫程式,但他本身的語言又不支援傳統的物件導向,他在物件導向當中又摻了generic programming的成份在裏面。
所以我才會說他是披著物件導向的皮,但是有著metaprogramming的骨。
在設計上,變種的物件導向方式也讓functional programming有發揮的餘地。
我先前讀到一篇關於functional design pattern的slide,Functional Programming Patterns (BuildStuff '14),他裏面有提到關於一些functional language的特徵。
其中第一項就是端看程式語言是否支援function as first-class citizen,如果有才能將他視為一個東西。
進而可以將function任意排列成其他的function。
在functional的世界中type的概念並不等於物件導向中的class,type不俱備行為,type很小很便宜,可以被任意宣告及丟棄,type也可以加以排列組合,也就是algebraic type的概念。
相對物件導向世界中的class,宣告時會使用動態記憶體空間,這讓class變得靈活性很高,但是相對成本比較大、犧牲了部份效能,而class俱備行為也被視為一個重要的功能。
在Julia來說,我認為他很好的融合了物件導向的精神跟functional的世界,type不俱備行為、type很小很便宜、外掛式的多型也讓物件導向可以進來,以上的特徵讓使用者可以容易寫出高效率的程式碼。
談到物件導向跟函數式的融合就免不了講到Scala,雖然他是一個函數式的語言,但是事實上他會將函數式的部份轉成物件去執行,所以底層仍然是物件在跑,如此一來就跟functional的精神相違背了,雖然他吸納了很多functional的特徵,試圖降低class的使用成本,但是仍然比type的使用高。
Julia很好的融合了物件導向、函數式、metaprogramming,可是他有個比較大的缺點:他的底層LLVM,LLVM其實沒有支援垃圾回收的機制,所以Julia在記憶體的管理方面沒有很好,有時候較大的運算會吃掉比預期多的記憶體。
Julia是個優雅漂亮的語言,這點可以跟Python比擬,不過目前套件還不成熟,大家可以期待,官方在JuliaCon2016上公佈希望可以在JuliaCon2017之前完成v1.0版,如此一來語言進入穩定版之後就可以加速套件的建制了。