Mathematica 這門語言怎麼樣?

本人小白。學習Mathematica兩個月。

我說的不是這個數學軟體,而是此軟體自帶的編程語言,我覺得此語言表達能力異常強大,模式匹配等特性可以使代碼寫得非常短。但是此語言現在貌似仍然局限在Mathematica系統內部。

問:此語言和其他主流語言比起來優缺點在哪?以後Mathematica有沒有可能跳出Wolfram的封閉體系得到更廣泛的應用?


沒想到我的這個提問已經快要一年了,現在我來自己回答下。

我本人在入門Mathematica的時候沒有多少關於其它語言的經驗,僅僅是自學過一點點python,然後在學校接觸了C(水平大概在求1+2+.......+99+100的程度),這應該是值得慶幸的地方,因為許多習慣於傳統語言(主要是過程式)的人在使用Mathematica時都會非常的不適應。這一年來我一直都在玩Mathematica,水平可能仍停留在入門階段但是對這個呆萌的系統的認識肯定比一年前要多一些。現在我把回答的重點集中在這門語言的獨特之處。

翻開任何一本國內的Mathematica書籍,行文過程大概都是這樣的:怎麼在筆記本里輸入並運行表達式;介紹基本的數學函數;教你怎麼畫圖;過程式控制制語句(For,While,If等)。不得不吐槽過程式控制制語句這一部分,對Mathematica稍有了解的朋友都知道,在Mathematica里大量的使用過程式語句是非常不自然且不高效的一種做法,其他語言(比如C)中大量使用的For循環在Mathematica中醜陋而低效。

其實,Mathematica支持很多的編程範式(有可能是最多的),其中最為高效的應該就是函數式了,熟悉一點函數式語言的人再來接觸Mathematica可能會倍感親切。通過純函數(相當於Lambda演算)、高階函數(Nest、Fold、Map、Apply等等)等各種函數式編程的技巧,你可以輕易寫出簡潔到爆的程序,而且絕大部分情況下都比過程式版本高效得多。

但是,這就是全部嗎?Mathematica就是一個順帶支持其它編程範式的函數式語言嗎?

其實,Mathematica是一個基於規則和模式的重寫系統。藏在各種炫目功能和編程形式背後的是一個精心設計的規則替換和模式匹配引擎。Mathematica中的函數是規則,變數也是規則,甚至可以說在Mathematica里變數和函數根本沒有本質區別因為它們都是被附加了規則的符號而已。這在其它語言中是很難想像的事情,也正式因為這一點,很多在傳統語言中難以做到的事在Mathematica都能實現。比如:在運行過程中修改函數的定義。

經過巧妙的偽裝,這個重寫系統能模擬出函數式風格,而且模擬地很好,rule-based編程自然也是水到渠成,過程式風格也能剛好湊合,這不能不說是很特別!


大家已經說了一些,我來說說我的感受。

首先,用 Mathematica 編程,非常非常短。當然,這一方面仰賴 Mathematica 的巨量的函數,另一方面,也有它編程範式的功勞。

從官方網站的數據,Mathematica 編程的字母數,明顯少於 C 和 Python,他們甚至做了這樣的圖來表示:

大概如何描述呢?1000 行的 Python 代碼,在 Mathematica 下,大約只需要 110 行即可表述出來,對上之數據進行擬合,可以看到,他們的關係大約是:

L_{Mathematica}=3.48 sqrt{L_{Python}}

同樣的,對於 C 、C++ 、Java 、Matlab,它增長的速度依然低於這些語言。(係數分別是:C++ -&> 2.85, C -&> 2.36, Java -&> 3.53, MATLAB -&> 4.16)

如果與各個語言對比,Mathematica 幾乎比所有都要簡潔:

圖像代表了左邊的語言形式,寫成右邊的形式,行數的倍數。以上部分翻譯自How the Wolfram Language Measures Up


作為一個數學學院的學生,我覺得Mathematica完爆matlab。


Mathematica 的函數式編程能令程式的表達力很高,就是它強大之處


我是來唱反調的。首先旗幟鮮明,Mathematica就是一種不用寫括弧的Lisp

首先,我是mathematica的腦殘粉,科大兩次Mathematica講座我都是主辦人和主講人之一,但是我並不覺得Mathematica是一種完美的編程語言。

題主大約會快十種編程語言,並且經常寫其中的四五種,Mathematica是題主寫起來最縛手縛腳的編程語言之一。

開發環境

首先我們說開發環境吧,對於MMA自帶的那個notebook,在這裡寫代碼簡直是一種身心的折磨。作為Vim粉這個就不多說了。

其次是書寫風格,Mathematica作為一種函數式編程語言,在使用中混雜了不少非函數式的用法,典型代表是LinearModelFit函數,和其返回的Model對象,你想訪問這個對象內的元素,需要使用

諸如

lm["FitResiduals"]

之類的明顯OOP風格的操作,而且最坑的是MMA作為自我標榜的函數式語言是絕對不會給你補全這些string的值的,那麼好,我們只能查文檔了。

比如我們定義了一種數據結構TypeA,然後有一個操作比如abs吧,函數式語言的通用做法是abs函數對於TypeA有一個模式匹配,但是你怎麼快速知道TypeA都有哪些可匹配的模式呢!

如果是OOP風格,你只需要查下TypeA的class內function,但是MMA永遠不會在文檔里把話給你說全

數據結構和函數的同質化造成的效率低下

函數式語言作為書寫的語言寫起來那是真舒服,但是使用者真是慘啊!

我們知道Mathematica的底層數據結構組織是類似於lisp的形式,甚至可以說是另一種S表達式。比如一個list在lisp的s表達式中可以寫成

(list a b c d e)

在Mathematica中寫出來是

List[a,b,c,d,e]

有區別么?沒有,唯一的亮點是wolfram聰明的把圓括弧換成了方括弧,讓大家可以不用按shift就可以寫一個s表達式

但隨著而來的是恐怖的效率低下,舉個例子,我們使用了Import一個mp3文件,現在我們想去獲得Mp3的文件內容,我們知道我們導入的是Sound代表的數據結構,但是如何獲得裡面的值呢!如果是在Haskell裡面,我們大致是有這樣一種函數結構

Sound (SampleSoundList [list] r ),n

那麼獲得其List就可以寫作

getList (Sound (SampleSoundList [list] _)) = [list]

多麼簡單漂亮!

但是在Mathematica,你需要不停的使用難看的方括弧,而且速度巨慢無比

mp3 = Import["/Users/xuhao/a.mp3"]

Head[mp3]

這時候你確認了是一個以Sound開頭的函數

大概可以寫成Sound[SampledSoundList[a],n]的形式,這個時候我們想把a所代表的數組取出來,

然後你按照函數式編程的手段寫出來了這樣一個模式匹配

f[So[SSS[lis_], _]] := lis

且不論MMA一堆方括弧每次都自己把自己搞暈完全不如強制格式簡單明了,

這個時候你可以打一個

f[mp3]

然後你出去喝了一杯咖啡,回頭看到,沒有結果

然後你又去喝了一杯咖啡,晚上睡不著了。

坑爹的方括弧和格式縮進

mma雖然不用lisp那麼寫圓括弧了,但是鑒於MMA是基於S表達式的, 一堆方括弧不忍直視。。。。。。。

特別是提取一個數組元素的,時候,簡直要死了好嗎!還有坑爹的For循環等,你丫不是說好了函數式編程么,有本事就不帶副作用盯死啊

就說這麼多吧。。。總之別對任何一個編程語言抱太大期望,尤其是開!發!環!境!不!好!看!


誠然諸位說的優點都是對的,但我最期待的還是它運行效率的提高!


正在入坑。。。。


推薦閱讀:

UE4 C++編程學習路線?
2025年的編程語言將會是怎樣的?
wolfram language說得那麼優秀,為什麼沒有被普及,難道只是因為它貴?
為什麼編程語言中的區間一般是 [begin, end)?
MATLAB有什麼突出優勢和劣勢?

TAG:編程語言 | WolframMathematica |