為什麼數學軟體要用自己的語言?
雖然現在我們有 Numpy/Sympy 了,但那些商用的數學軟體都用自己的語言(比方說 Mathematica/Matlab/Maple)。(我舉 Python 的例子,不是讓 Mathematica 去學習 Python,我是說雖然確實存在由編程語言發展來的、很好用的科學計算方面的庫,但大頭還是私有語言。)
這些語言有什麼特性/優勢嗎?設計的時候是怎麼考慮的?比方說,像為什麼數學軟體要用自己的語言? - 知乎用戶的回答所說,從語法層面上易於 JIT、易於處理稀疏矩陣、易於畫圖、易於自動並行化循環?
比如Fortran95加入的elemental, pure, forall, where,這些語法限制嚴格的一逼,在邏輯表達上的靈活性非常差,但是一旦使用這些語法,編譯器就可以大刀闊斧的進行優化,閉著眼睛並行化也不會出現memory collision的情況,因為潛在的問題都在語法裡面限制死了。
相比起來比如C, 語法靈活,但是編譯器在優化過程中就很難假設你究竟想要幹什麼,只能進行最通用的優化,還要警告你O3可能會影響運行速度。
順便安利一發Julia,前幾年一幫搞計算化學的科學家覺得這麼多語言用起來都有問題(其實是不爽),不如根據咱的需要自己搞一個語言,把自己覺得爽的特性都加進去......然後就有了Julia,編碼用UTF,變數名可以直接用希臘字母,命令行支持latex輸入數學符號,強調矩陣的表示和運算能力,函數式編程所以並行友好,一股濃郁的科學計算味。
題主沒有經歷過JAVA歷程,可能無法理解。
JAVA語言發展到了1.7後,才開始支持函數式和很多先進特性,為什麼前期沒有做改進?
語言其實和軟體操作系統一樣,每一版的改動都需要考慮大量已經存在的工程,庫,代碼。尤其是大社群,因為商業化後誰也不會因為語言更新牛逼了,改自己成熟的系統的,外一改掛了,誰來負責。所以語言的進步一直都是個難題,所以想換語言就從新開發一套系統嘍,但這需要碰到一個合適的機遇節點的。
下面回答正題,一門語言的設計,最主要是順應當時的潮流文化需求。比如工業設計,弄個複雜難學或者很難公式化的就完蛋了
比如JAVA適合工程
Python適合快速開發,自省,數據處理haskell適合科學家。。。呃⊙ω⊙PHP適合網站。。。呃。。⊙ω⊙go適合併發
等等現在語言針對行業特性越來越明顯把評論回復一起搬上來:Matlab或者Mathematica的強大就在於他們已經在BLAS,LAPACK,MKL這些基本的東西上已經給你搭建好了一個高度集成優化的平台。numpy/scipy只是做科學計算的人們在python這個平台下「模仿」專業科學計算平台搭建的一個平台,為的是可以在python這個有著某些很好的特性的語言環境下進行科學計算。然而畢竟是「模仿」而已,如果能在主要的幾個方面都能超過matlab,那matlab乾脆別收費了。python有python的優勢,比如易於開發,比如學了其他語言的人再到python上不會產生奇奇怪怪的問題(例如行向量和列向量的問題…)。人們為了利用python的特性進行科學計算或者其他操作才去用numpy/scipy。為了使用python才是原因,而不是因為numpy/scipy好用才用numpy/scipy。不要本末倒置。PS:「模仿」沒有感情色彩。
Solve systems of linear equations Ax = B for x
Syntax- x = AB
example
- x = mldivide(A,B)Algorithm for Full Inputs
The flow chart below shows the algorithm path when inputs A and B are full.
Algorithm for Sparse InputsIf A is full and B is sparse then mldivide converts B to a full matrix and uses the full algorithm path (above) to compute a solution with full storage. If A is sparse, the storage of the solution x is the same as that of B and mldivide follows the algorithm path for sparse inputs, shown below.
numpy是學得別人的api。matlab什麼的(開始流行的時候)比python(開始流行的時候)早多了。那時候還只有C,java剛出現。所以,他們用自己的語言,是因為那時候還沒有其他好用的語言……
問題可能應該反過來問:為什麼matlab沒有做成一個通用程序語言,而只是一個數學計算用的語言?
一方面是matlab沒那個野心……
另一方面是matlab本身要模仿的是符號化的數學語言,而數學語言又比編程語言早多了。matlab的主要用戶是需要科學計算的人,不是程序員,所以所有設計都盡量向數學語言靠攏,而不是像機器實現靠攏。針對性的優化其實都是後面的事情了。
所以問題可以再深入一步:為什麼數學語言沒有成為常用的編程語言?
其實函數式語言算是一種嘗試。但根本上說,數學沒有時空限制,數學家在寫x=y+z的時候,不需要想這玩意兒算一下要大概消耗多少個cycle。而演算法有明確的時間和空間限制,程序員寫程序的時候常常要邊寫邊掂量複雜度。
--
補充一下:說數學語言容易JIT和處理一些東西,是有點牽強附會的。其他語言也一樣能做,並且也沒有多難。只是因為數學計算不是通用語言的主營項目,所以沒有像matlab做得那麼優化罷了。有Mathematica那是哪年了,我查了一下1.0是1988年發布的。Python是1991年發布的,你讓一個編程語言去學三年後發布的另一款編程語言的語法?
終於,她出生了 ~ Julia語言
Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments.瀉藥。
你問的問題其實包含了很多東西。我無法詳細回答你提出的問題。思路上來說:
首先,軟體這種形態是為了解決具體問題。所以有很明確的設計傾向。其實,通用編程語言不是為了解決具體問題,而是提供編程範式的組合,具體問題則通過相關擴展的庫或者框架來解決。每個軟體或者語言設計者思路和首要解決目標都不同,所以千差萬別。這些語言有什麼特性/優勢嗎?設計的時候是怎麼考慮的?
一般特定語言相對於通用語言的特點就是:
目的明確,語法簡潔,特定領域更容易使用,抽象維度高,可特殊優化。如果你問為什麼Mathematica不用Lisp作為核心語言,因為Wolfram更偏好M-Expr。然而Python…對AST做個變換得用一堆trick的語言,他老人家放到現在也不會考慮吧。
matlab是很直覺的,語言真的是你想偷懶就會幫你自動做。。。
優勢:簡單,好用。快速上手並解決問題。
比如說Matlab20世紀70年代,美國新墨西哥大學計算機科學系主任Cleve Moler為了減輕學生編程的負擔,用FORTRAN編寫了最早的MATLAB。——引用自 MATLAB_百度百科
在一門數學向課程過多的討論程序設計是不明智的,這樣的設計可以讓使用者將精力放在解決問題而不是糾結這段程序應該怎樣編寫。
Matlab是一種面向科學與工程計算的高級語言,允許用數學形式的語言編寫程序,且比Basic、Fortran和C等語言更加接近我們書寫計算公式的思維方式,用Matlab編寫程序猶如在演算紙上排列出公式求解問題。因此,Matlab語言也可通俗地稱為演算紙式科學演算法語言,由於它編寫簡單,所以編程效率高,易學易懂。
——MATLAB軟體介紹_mouldli_新浪博客
你說的這些,我都用過,我的建議是,都要會,缺一不可。另外,R也要學。
沒有明白題主到底想問什麼,所以只能憑著我對MATLAB的理解來強答一下。
1. 庫VS獨立的語言
最開始的時候(那時候Cleve Moler還沒有遇上Jack Little)Cleve Moler寫的就是一個Fortran的線性代數庫。但是做庫的話就非常依賴於那個語言本身支持的特性。做自己的語言的話想搞什麼就搞什麼。比如說你要用C++寫個矩陣庫,你想初始化一個矩陣就沒法像MATLAB那樣寫,因為C++初始化類的語法就那麼些。最為一個商業軟體,最重要的就是讓客戶覺得好用,直接自己從最底層的語言寫起方便很多也更方便擴展。其實MATLAB裡面很多函數都是C++實現的,比如說著名的backslash解線性方程組算符。但是要做成C++庫的話就沒法這麼搞,因為C++根本不讓你重載backslash。這也是自己開發語言的優勢所在,想搞什麼語法糖就搞什麼語法糖(這裡我就不提什麼內存管理啥的了,因為對於有GC的語言來說用戶本來就不用太操心這些)。2.為什麼從語法層面易於JIT?
我覺得題主理解錯那個答案的意思了。那個答案說MATLAB的JIT比Python好(這我並不知道對不對),但是其實這跟語法設計沒啥關係。MATLAB最初設計的時候只是想方便的支持矩陣運算,所以矩陣在MATLAB是一等公民,而且也是為了支持矩陣所以設計成了動態弱類型語言(不像Python雖然是動態但依然是強類型)。就我所知JIT最初根本沒考慮,後來是為了提高效率(因為MATLAB越做越龐大)加進去的。而且因為後來不斷加入新的東西(比如匿名函數、對面向對象的支持等等),最後導致解釋器和JIT無法維護,不得不重頭寫了一個(你可以看MATLAB R2015b的文檔)。所以題主的這個問題是不成立的。如果單從語法設計上來看MATLAB其實是挺奇葩的parse都非常不好做。然而既然公司靠它來賣錢那麼總會把它做好。這也是Proprietary language可能的好處之一。類似的,易於畫圖也跟MATLAB這個語言沒有關係,MATLAB軟體的畫圖功能基本是Java實現的(感謝undocumented MATLAB),只是用MATLAB的函數封裝了一下(當然有些高級的畫圖函數像矢量圖啥的也有用MATLAB寫演算法的,但這些都是建立在底層圖形引擎的基礎上)方便客戶使用。最後說一句,題主想問題還是單一地從數學工具包使用者的角度出發。其實你從軟體公司的角度考慮一下,我有實力做自己的平台(像MATLAB和Mathematica),為啥還要幫別人開發庫呢?自己搭平台的自由度和技術選擇都會大非常多的。謝邀。
首先,題主其實問了 2 個問題:1. 為什麼數學軟體要向用戶提供一個自己定義的語言?2. (數學軟體)這些語言有什麼特性/優勢嗎?關於問題 1:
語言有兩個極端:+ 提供精細的控制,使得寫代碼的人可以精細地控制程序行為。 例如 c 語言,干臟活累活好使;可以控制在 hot path 不做 memory allocation,可以減少內存佔用,可以優化數據的 memory layout 減少 cache miss,等等。+ 方便用戶表達自己的意圖。不是所有時候用戶想關心這個變數存在堆還是棧,什麼時候釋放。數學軟體誕生時,同期的編程語言主要提供 「精細控制」 的功能,所以必須自己造一個趁手好使的語言給用戶。
@劉賀 @劉鑫 都回答了這個方面。關於問題 2:
我個人認為相比 python,clojure,racket,這些內置語言設計上,沒有決定性的優勢。對於實現的優化做得很好,正如 @jz wang 所言的。其實東西(內置語言)一旦做出來,就不會輕易地撤掉的。隨便撤掉用戶是會罵的。並不需要有什麼優點,因為歷史原因,它們就會被留著(想想 C++ 的一大部分 feature,嘿嘿)。畢竟,都做好了為什麼要改呢,為什麼需要重新做一遍呢 ;D (PS: 有些大公司都有 change management 來著, 沒有正當理由什麼 change 都不能做...)推薦閱讀:
※MATLAB和Python 相互無法替代的地方有哪些,對於以後一直做科研的人,兩種語言到底哪家強?
※Matlab面向對象編程是否值得大量使用?
※R相比於matlab有哪些優勢?為什麼現在被越來越多的使用?
※學習 MATLAB 有哪些書籍是值得推薦的?
※數學建模一般用哪種軟體比較好?MATLAB是否有局限性?
TAG:編程語言 | 數學軟體 | MATLAB | WolframMathematica | 編譯原理 |