wolfram language說得那麼優秀,為什麼沒有被普及,難道只是因為它貴?

wolfram language看上去很好,為什麼用的人不多呢


幾年前社區里曾經有過相關的討論,有許多觀點值得一讀:

https://mathematica.meta.stackexchange.com/q/1152/17

就我個人的體驗來看,WL學起來並不比C#、haskell、rust、Python等各類用戶數量巨大的語言困難;高等數學等內容也僅僅是WL的一小部分功能而已,並不應該成為初學者無法繞過的障礙。

關於題主的問題,我個人的觀點是(並沒有就此與公司內部的人討論過,不要見得風就是雨),因為歷史上過於狹窄的市場定位及相應的宣傳路線,給Mathematica人為塑造了一個僵化的形象——「符號計算系統」,導致現在扭轉人們的思維定勢很困難。

另外,我一直覺得家庭版的許可證限制過於嚴苛,也打擊了個人愛好者將其用於日常項目的積極性。我猜公司搞樹莓派的移植版也部分是想要應對這個問題。

第三我覺得是WL的runtime太大,並且不允許隨意分發,這在很多時候阻礙了大家把它用在項目中。對此我是希望公司能剝離出一個內核來,單獨採用對項目更友好的授權方式的。

最後我想說,每次看到stackoverflow上的烏煙瘴氣,再回頭看我們mma.se社區的一片和諧,我就覺得對未來還是充滿希望的!


自己身邊的人用Mathematica還是比較多的,主要集中在物理系。其他學科用的人還確實不多。數學系的同學似乎對這種軟體不感興趣;計算機系都在討論php和python到底哪個是最好的語言;化學系聽說在用origin;學生物的好像R用的多一點。

Mathematica沒有普及,我覺得主要是兩個原因。

一個是代碼向外傳播的成本非常高。所謂「向外傳播」,就是指會MMA的人給不會MMA的人傳代碼。一方面是要安裝好幾個GB的軟體,另一個方面是價po格jie非常高(不過學生版的價格還是可以接受的)。這就導致代碼的通用性非常差。

另一個就是偏見或者說是傳統造成的吧。之前在實驗室做一個高維逾滲模型的項目,用C++寫估計要花掉三天左右,然後再在超算上跑兩天。我用Mathematica半個小時寫出來,12行,老師看了直接對我說「Mathematica玩玩就好,做計算速度不夠」,然而之後跟C++的比較,速度只是C++的1/3,和Python的版本(實驗室的另一個師兄寫的)速度幾乎一樣。而且國內的學校雖然很多都提供正版軟體,但大多是Matlab、Origin這樣的東西,很少有提供Mathematica的。

另外可能有一個次要的原因,就是Mathematica的Notebook寫代碼風格,不適合寫通用的代碼。而且由於代碼一般比較簡短,所以容易養成壞習慣,比如從來不寫注釋、變數名隨意、匿名函數滿天飛這類情況(最後一個只是覺得比較影響閱讀)。這就使得網上Mathematica代碼的例子可讀性都不太強。Mathematica擴展包的.m格式,書寫風格與Notebook相差比較大,而且我問了好多同學,很多都不知道有這個東西的存在,這可能也是影響其傳播的一個因素。

--------------

補充一下之前說的「MMA速度是C++的1/3」的問題。這個速度只是那個特定問題下的時間,而且高維逾滲可以用Mathematica里的形態學分量直接計算,所以速度會提到C++的1/3這樣的水準。但平時感覺用MMA省下的編程時間完全可以抵消運行時間了。


背景:

我們數學系的 department chair 之前有 CS 的經驗,自己的研究方向也有一些演算法之類的。而且我們本身的數學系也有很多應用方面的課程。

所以我們學校很傾向於 mathematica。不僅在學校給買 mathematica,甚至於我們招教授的時候好像會 mathematica 都是加分項(我並不很確定,畢竟只是個學生,但是我們學校確實會鼓勵教授在試講的時候用 mathematica 做演示)

所以我個人來說對 mathematica 還是比較有了解的,至少能達到初學者水平的。

但是也應該就只能達到初學者水平,所以如果文章中有偏頗的地方還請大家指出

最後,我個人並不喜歡 wolfram language。

-------------------------------------------------------------

我個人覺得 wolfram language 除了貴,不好和別人交換代碼(也是貴),還是有其它原因的:

1. 不僅沒有 object,而且 functional 也是一塌糊塗。

wolfram language 起源於 lisp,它本身沒有 object 這一說,而且對於 functional programming 的支持也是慘的不行:

  1. 所有變數默認 mutable;
  2. pattern matching 很是醜陋,而且很 confusing;
  3. 也沒有 monad 或者 computational expression 之類的語法糖;
  4. 很多數據結構也不是用的 functional programming 裡面常用的數據結構;
  5. 甚至於連 currying 都很麻煩,而且要用到相對不安全的 feature。

2. 沒有 type

wolfram language 的宗旨在於 Everything is an expression,它本身為了保證數學和物理的同學能夠不用考慮 type 這個麻煩的事情,而直接不寫 type 了。。。

但是這樣的話讓寫稍微有一點點規模的項目(大概幾百行)都極其的頭疼。

3. 讀的很慢

我個人來說覺得 lisp 的語法並不是不可讀,而是讀的很慢。

wolfram language 繼承了這一點,幾乎沒有語法糖,keyword,而且不支持 infix operator 的定義,只能用那幾個少的可憐的 predefined infix operator,自己的東西全都要寫成 prefix 的形式。

我個人來說並不是很喜歡這樣的代碼閱讀體驗,需要自己不斷地理清哪個變數跟哪個變數對應。

4. 其實很多認為很酷的東西在其他語言中很容易實現

我剛接觸 wolfram language 的時候才高中,當時並沒有接觸過很多的語言,小學接觸過 QB,C++,當時學了一點點 java,就這些了。

所以看到 mathematica 能夠實現精確的 pi 和無理數,還能求導感覺酷斃了。覺得這怎麼能做出來,精確的啊。。。

等到知識稍微多一點了才知道,精確的數在任何一個函數式語言中都是極其簡單的,甚至於在 python 和 C# 這些命令式為主的語言中實現也並不是很複雜。

5. mathematica 居然不支持高 DPI。。。

很難想像一個個人版要上千,學生版也要上百的軟體居然在 windows 上不支持高 DPI。。。

個人覺得比較不可理喻。。。


先給我兩千刀先


貴就不多提了……

MMA的優秀和難普及可以說是一體兩面的。前者很大一部分是應有盡有的自帶函數貢獻的,而這造成了runtime library巨大無比。為了一個幾兆不到的notebook,別人總不見得去下好幾G的player吧。

實在是不適合寫複雜的程序,稍微一長括弧地獄。而且可讀性還是覺得不如python,c++之類的。所以還是更適合以notebook的方式用於自己打打草稿畫個圖,寫點小工具之類的。畢竟ipython notebook就是借鑒了MMA的形式,用於這方面目的的。如果是notebook這種使用方式為主的話,分發的需求自然就下降了。

說了那麼多其實還是第一點最重要,函數式次要,國內matlab不就挺普及的嘛。


你先考慮考慮什麼叫「普及」。我覺得你說的普及應該是有大量的商業應用或者只是社區活躍。Wolfram Language 兩樣都不佔,社區我只能想到stack exchange上的分站。(應該reddit上也有)

然而性質和 Apple support communities 差不多。畢竟本來就沒給社區任何擴展的機會,會敲打語言的也並不是 Wolfram Language 的主要用戶。

貴是真的,我一個老員工+學生都用不起。

功能也沒有想像中的那麼好,真用到了會感覺設計很糟糕,比如 Manipulate.


那麼多人說貴……其實中國大陸的學生版真的已經很便宜了……一年前買了 Mathematica 10.4.1,也只花了五十刀。現在還免費升級到了 Mathematica 11.0.1……(不過最新版的 11.1 不能免費升級了……

已經很良心了好吧,比什麼阿逗逼 CC 每年訂閱良心多了吧?


對 貴


一個百萬行量級的項目,用mathematica就是災難啊


這個語言有其優點,但也有不少致命的缺點。我就舉一個例子:無法實現很多簡單的數據結構,比如linked list(Mathematica中的List其實是數組)。想問題要全面,不要光看見人家舉了幾個這個語言優點的例子,就覺得它有「說得那麼優秀」。


因為首先對非專業人士來說用處不大,第二隻支持英文,所以基本上普及率不高。

不過上周在課上裝逼之後老師下課問我怎麼算的,我就把wolframalpha介紹了一下,老師說這周就去找學校買授權(逃


因為使用wolfram language的專業並沒有普及


確實像在問題描述里說的,看上去很好,但為什麼用的人不多呢?

答案當然是大部分人用不著啊。

mmtc以符號運算函數式編程為特色,然而大部分人都用不到這個,為什麼呢?

簡單公式直接抄好了,不需要推導。

複雜函數反正也找不到符號解,數值解迭代好了,那麼請問就求個數值解為什麼死磕mmtc呢?

另,開發者原來是物理系的吧,軟體也一般分類為科學計算軟體,想想科學計算怎麼理解,基本就是數學建模,印證模型,和展示結果。經過印證模型才能應用。而c,python,Java直接應用這些模型批量化運用就可以了,不需要重複建模印證。

打個比方,也許不恰當。就像工廠花幾萬開模,然後就可以用模具生產了,沒必要為了每件產品都開個模具吧。


一個用途不夠general的language,只有官方獨一家的閉源實現,價格又貴得離譜,運行環境的體積又大,這些還不夠阻礙其普及嗎?

在這樣的障礙下,能普及才是例外,需要的不是多麼優秀,而是多麼湊巧的歷史機遇。


斷斷續續用了 Mathematica 十年有餘,用過Basic、Pascal、C/C++、Matlab、Python、Lua、Scala,說下我個人對Mathematica沒有普及的看法。

Mathematica這個語言其實已經很久了, wolfram前一陣重新推這個語言,但其實基本沒咋變。現在只是沒推動而已,沒改變本質。

  1. Mathematica設計時就是一個特定領域的語言,就像matlab一樣並非通用語言。依託於Lisp系的風格,在符號計算上挺好用,但在其他領域就沒打算髮展,也沒啥輪子。由於符號計算還不像數值計算經常需要和外界打交道,需要IO數據啥的。Mathematica很多應用就是手工錄入公式,然後把計算結果手工轉到論文中,或者畫個圖。Mathematica的notebook和plot體驗就很好,其他方面也就呵呵了。
  2. Mathematica符號計算的需求一直是一個小眾需求。其實相對來說更常見的數值優化的需求相對於web之類的來說一直也不算太大。像tensorflow(非nn的部分)這種東西最近才造出來……需求小眾,自然用的人就不多,一直以來身邊會用Mathematica的都是鳳毛麟角,能聽說過就算是不錯了。
  3. Mathematica一直保持著函數式的編程風格,當然並不是純函數式那麼清真。像什麼For、While之類的在傳統basic/c/pascal起家的人看來難用程度堪稱反人類,函數式語言的上手門檻大家都懂,這裡Mathematica也吃了這個虧。
  4. Mathematica一直以來的發展目標就不是亂加功能,一直在自己領域深挖的,而且特性選擇品味和工業界不同。類"字典"的數據結構都是最近才加入的,這在通用語言簡直不能想像。
  5. Mathematica本身並不優秀,也並不全能。Wolfram前一陣吹過頭了。語言層面其實東西不多,主要在於庫NB。 或者說Mathematica賣的其實是它的標準庫,語言本身只是個膠水方便你組裝邏輯。

總的來說還是過去一段時間大家沒有符號計算的需求,其他相關的東西像什麼Z3之類的做出來幾年了也都沒啥人知道就是例子。


就是貴啊 轉戰python


MATLAB的legacy太多,而且大部分相關用戶缺乏選擇權(包括教育和工作上的)。

國內的學校基本標配MATLAB,便不再考慮其他可能。但我在美帝的學校倒是常常見到mathematica,學校的超算上也有買


mma 一直是精緻的語言,處處體現了 CS 的美。各種函數的命名啊,生成的圖像啊,包括 lisp 本身,都是非常精緻的。

matlab 就是傻大粗,能幹活,不講究。給非 CS 的人一種「我也能寫代碼」的感覺。但是實用主義至上,你批判 matlab 代碼丑的一比,沒有可讀性,他們會說「但是 matlab 好用啊」,「我用 matlab 的 xxx 庫只用一下午就能寫出來」。

總而言之還是各理工專業都有強烈的寫代碼需求與低下的 CS 教育產生的矛盾,讓這種沒有美感的語言有了可趁之機。


我說一下我自己的體驗

1.只能在它的nb里敲代碼

2.代碼回刪的時候要點擊右側的長得像方括弧的東西

3.Mathmatica擅長符號計算,現在還是數值計算居多,Python就能解決

4.貴


跟所有師兄師姐師弟師妹聊天說平時用什麼語言多,他們的反應都是「你還用這麼古老的東西啊?」其實我是一臉懵逼的,mma不是一直在更新么?

安裝包大以及版權費用自然是它相比於C或python等語言的一大劣勢,但即使和matlab比,mma也至今默默無聞,個人感覺是mma代碼風格和包管理的問題。mma十分強大,很多功能幾行就實現,為了提供代碼靈活性導致穩定性下降,程序員不能準確預測一些input會輸出錯誤還是計算出結果。

包管理是又一個大問題。沒錯mma可以導入包,但是用起來很……奇怪。更不要提想像python一樣pip一下就能安裝包。

還有哦,之前安裝的一個版本,注釋會變成亂碼。以及mma作為一個將自己定位為多範式的語言,用某些範式(尤其是精簡無比的函數式)寫代碼的時候不知道如何寫注釋。


能免費提供給數學建模大賽使用不?(Matlab可以)

能提供數學建模大賽常用演算法源程序不?(Matlab可以)

能做到以上兩點,每年參賽的專科生本科生研究生這麼多,個個都能成為自來水,還愁什麼推廣呢?


wolfram 可能是玩具裡邊做的最好的最精緻的,但是生產環境不需要玩具。

符號系統很好,符號計算用的最多的其實是學生,高數解題神器,算個積分解個方程畫個圖什麼的。不過在生產環境中需要用的符號計算要麼已經算出來可以直接用結果,要麼根本算不出來,不管哪種情況都用不到「符號計算」了

另外 wolfram 語言說不上優秀,也就大雜燴而已,複雜程序可讀性簡直不能忍,異常處理更是一團糟

經常被說得優秀的其實是他的庫,確實是一個非常龐大且豐富的庫,不過仍然是個玩具庫,提供很多精巧複雜但是作用單一的功能,就拿最新更新的 11.1 中的三個新函數來說:

https://reference.wolfram.com/language/ref/SierpinskiMesh.html

https://reference.wolfram.com/language/ref/MengerMesh.html

https://reference.wolfram.com/language/ref/CantorMesh.html

就是生成三種分型的函數,即使沒有這三個函數也就幾行代碼就能實現,不明白增加這種函數的意義何在,難道是為了 golf code 比賽?不過其擁護者對此樂此不彼,說不定哪天就看到個問題「如何畫 Sierpinski 分型?」就會有人回答「我大 wolfram 一行就能實現!」引來一堆點贊吧

這種花哨但除此之外幾乎無用的功能確實不少,但真正實用的,例如大數據處理,機器學習(最近幾個版本才有)又是跟沒有一樣,所以也只好當個華麗高級的玩具了


推薦閱讀:

為什麼編程語言中的區間一般是 [begin, end)?
MATLAB有什麼突出優勢和劣勢?
請問學習網頁製作,需要學習什麼呢?
可不可以跳過彙編,直接學習SWIFT語言?
同時學習多門編程語言是否會降低學習效率?

TAG:編程語言 | 編程 | WolframMathematica | WolframLanguage |