為什麼不少程序員認為Matlab的語言設計不優雅甚至比較丑?能否舉出一些例子來說明?

比如和其他科學計算語言或者腳本語言相比


很多答案有些意氣用事了,Matlab特別是工具箱確實強大,但有不少地方給人感覺不是那麼優雅。

很多功能明明很近似,介面的命名、調用方式卻差距很大。

產生均勻分布隨機數是rand,正態分布隨機數是randn,指數分布卻是exprand。

有的介面給人感覺跟大一新生寫的作業一樣,expm1,expm2,expm3到底是什麼鬼。ode113,ode45,ode23,ode23s,你是老師你給這樣的編程作業打幾分。

很多相似的介面差距卻不是一般的大:

zeros是生成零矩陣,zero跟線性系統有關,fzero又是方程求根。。。你能告訴我line和lines的區別嗎?

按理說矩陣每個元素求正弦值,因為數學裡本來就有個方陣函數一說,所以sin(A.)更符合規律,但偏偏直接用sin(A)表示。那方陣函數怎麼辦?指數函數用expm,其它的卻用funm,簡直……

所以不少人知道了Matlab的一個功能後,很難類推其它功能,查了一圈後發現Matlab居然也能做,而做的方式是他萬萬沒想到的。

向量化確實很強大,但是在一些表達式里,強調是針對矩陣元素對應運算的那個點號該放在簡直毫無規律可言。matrix dimension not match的表達式拆成兩個居然又能算出正確結果了,這是怎麼回事。。。

Mathematica的介面清一色都是駝峰命名法,非常一致;Matlab的卻大小長短不一。。。

這些問題極大的增加了學習成本,同時也降低了代碼的可讀性、可維護性,進而影響了工作效率。


沒有一個正面回答問題的……

作為一個(幾乎)常年跟 Matlab 打交道,每天生產幾百行 Matlab 代碼的搬磚工,完全贊同 Matlab 的語法有問題這一說法,——咋地還不讓吐槽了啊,吐槽了又能如何還不得繼續用啊……

下面細數 Matlab 語言(以及模仿者 Octave)語法的 N 宗罪:

1. 坑爹的括弧。

首先讓我們假定,看到這個答案的你已經很熟悉 Matlab 了,所以你一定知道,Matlab 的函數調用跟矩陣下標都(特么的)使用小括弧來完成。當然,這個問題在有些時候的表現是有點意思的(比如 NaN/Inf 本身是個函數,但本身也是個常量),但是更多時候帶來的是無盡的苦逼和彆扭。這個問題上,誰再好意思說 Matlab 優雅簡直是強詞奪理,不服氣的去看看 Mathematica 括弧怎麼用。具體說來,解釋器遇到 foo(...) 的用法時,根本沒可能知道到底是變數 foo 要索引元素呢,還是函數 foo 按照參數調用。當然,Matlab 不會讓自己陷入僵局,於是——

2. 蛋疼的搜索順序

Matlab 遇到符號之後,會按照一定的順序去檢索這個符號是啥,基本的幾個重要位置是:當前上下文中定義的變數、當前函數內部的嵌套函數、當前腳本內部的函數和子函數、當前路徑下的腳本、Matlab 搜索路徑中的腳本或者內部函數……所以,上面的例子中 Matlab 按照順序找 foo 到底是個啥,然後決定到底是索引元素,還是調用函數。實在啥都找不到,注意 Matlab 的返回信息,你就知道第一個坑到底是啥了(Undefined function or variable "foo".)。那麼,當你一不小心定義了倆變數 foo, bar(學過計算機的你不要說你從來沒用過這倆當變數),然後後面又一不小心想畫一個條形圖出來(help bar),——

3. 無奈的「保留」名稱

然後你就中招了。眾所周知,Matlab 自帶的各種函數各種腳本非常豐富,很多名字都是常用單詞,一不小心就能定義一個變數把 Matlab 自己的覆蓋掉。但是坑爹的是,為毛都沒有個警告!運行不過去來找,有的時候還發現不了!因為這個原因,我在 Matlab 中的循環變數,現在養成的習慣是 ii, jj 這麼寫(別告訴我你不知道為啥)。

4. 奇葩的函數調用

這個應該也算在第一個坑裡面。我們知道,Matlab 的程序分成腳本文件(按腳本名稱調用,無參數)、過程式函數文件(按腳本名稱調用,可以有參數可以無參數),以及面向對象的方法(主要是構造函數)。可是,Matlab 的語法糖是,沒參數的腳本/函數調用,可以不寫括弧!有參數的函數呢,還有種調用方法叫做命令形式!括弧坑坑人也就算了,現在連括弧都沒有了!卧槽看別人代碼看到一個東西叫 foobar,真心不知道這貨到底是個變數呢還是個函數呢還是個腳本呢還是個啥。這位說了,不是能從編輯器裡面打開選定,或者高亮提示的么?行吧你一定沒見過有很多人的代碼濫用一種東西的:——

5. 穿越的全局變數

其實呢,一旦遇到全局變數了,每種語言都是坑。所以這個也不能怪 Matlab。可是,(針對上面的主要問題)你丫加上個類似命名空間的東西能死啊!能死啊!啊!

%%%%%%%%% 未完待更 %%%%%%%%%


罵來罵去罵來罵去笑看工科狗們撕逼(利益相關理科研究生)

作為一個搞PLT養家糊口的,我見過的matlab代碼大都丑的難以直視,這裡面matlab語言本身要負一半的責任,具體的白如冰和Litux已經介紹過了,現在我們來講另一半。

程序要寫的好看,有幾樣缺一不可:編寫者合格的審美品位和追求,良好的系統設計,提供適當特性的程序語言,最後是一致性。

在大部分matlab的程序中,第一條就有很大的問題:寫matlab的很多不是專業的程序員員而是別的專業的來跑模擬,人家一來對程序編寫的了解僅限於分支循環函數調用三板斧頭,高級點的語言特性根本就不知道你讓人家怎麼寫的漂亮,二來他們進行程序設計的過程基本就是(親眼觀察)照著數學公式和流程圖一點一點填上去,完全不考慮遵循通用程序設計的基本模式(自頂向下,向上,對象,函數),大一點的東西能看就有鬼了,三來人家的追求根據很多答主的答案就是能跑,自己當時能看懂就行了,沒啥好處為什麼要好看?

在編寫者對審美既沒品位又沒追求,面向流程圖編程毀掉了人類自二十世紀五十年代以來總結的所有軟體工程和設計模式的經驗,用的語言還難看,最後一千個腦洞就有一千種開鑿方法(具體見 @王力樂對Fortran的血淚控訴),大家命名和定義介面都是興之所至管他洪水滔天,你們能見到的大部分馬特拉比代碼要還能稱得上美那才叫天理不容。

不過話說回來寫得丑並不是被罵的充分條件,比如我就沒見過幾個人罵brainfuck的,這說明如果僅僅長得難看低調點還是不至於被人扔臭雞蛋的,比如我,既然長得不如人意,就從來不半夜出來嚇人。matlab被程序員出身的集火,說明了它的丑還是對一些人產生了困擾的,比如需要看別人代碼的苦逼孩子比如我。現代的編程語言相對於上古的那些在編程上體現出來的美感只是副產品,真正的提升在於代碼的表達能力和可維護性。matlab由於巨量的內置特性和庫在前一條上並不輸陣,但是後一條,好的,或者說優秀的代碼與其對立面的差距是不可以道里計的,代碼可維護性的缺失會給代碼的排錯,審查與移植帶來巨大的麻煩。具體一點,matlab很多時候完成的是一個原型,而原型通過了之後就需要程序員(職業的)去用Java,C++這種工程語言去完成產品,這時候外行們(無貶義)寫的亂七八糟慘不忍睹matlab代碼對於試圖理解他的程序員來說就是噩夢了,於是matlab就在這個問題中被黑出了翔。

大家都火大,解決方案或者建設性的意見我確實是沒有,不過兩邊都相互體諒一下,工程師們寫東西規矩一點,程序員也搞出點更好用的工具來。話說MIT拿python入門果然是有所圖的咩(逃


謝同學邀,

我覺得是很多用的工程師沒大部分受過代碼格式的訓練,寫出來奇怪碼風可讀性低的MATLAB代碼,比如CamelCase和snake_case的混用,不明意義的變數名稱,缺少注釋,沒有統一的標準,CS黨看了自然覺得丑。

MATLAB設計也要背一部分鍋,自己也有一堆看上去不能直接懂幹什麼的函數。很多時候用一個函數要查一個文檔。

MATLAB里分號用來抑制控制台輸出,有時忘打一個不報錯但是控制台里就巨丑。

作為一個IDE,MATLAB的linter還有vcs真是讓人想吐,稀爛的linter導致寫的時候容易出錯,還不好debug。醜陋的vcs不如直接開個shell敲命令。

但是!!MATLAB作為一個巨型計算器,尤其是在做矩陣運算的時候是極其方便的!有很多做Web開發,系統開發的cs黨是感受不到的!不同語言適合不同的事情。cousera上Andrew Ng的Ml課都在用,就是因為MATLAB適合數學運算。我所在實驗室基本是MATLAB做模擬或者實驗後再用C++造一遍輪子。

再者,從優化的角度來說,比如用c,c++寫矩陣乘法,還要考慮到空間和時間局部性。讓個普通搞CS的寫出來的不一定比MATLAB更好。Mathworks來我校大部分只招PhD和極少部分M.S。

假設所有工程師都能寫出可讀性高的,碼風正常的MATLAB碼,我估計覺得他醜陋的人要少很多。

利益相關:跨工程和CS的MATLAB使用者。


優點:矩陣運算,幾個不錯的工具箱,simulink動態建模,完善的幫助文件和異常報錯

缺點:安裝包巨大,版權費很貴(別跟我說學生版),函數文件分開保存,找工作麻煩

其他:矩陣操作python也可以,圖像處理python也可以,遺傳演算法和神經網路python也可以,類似java該有的也都有,最重要的是——免費,工作好找,這就夠了


我覺得Matlab的官方需要負一定的責任, 比如它的幫助示例里或者source code里, 就沒有按照代碼規範來寫,比如逗號後面不加空格, 等號兩邊不加空格等。這樣根本就沒有教編程新手應該怎麼寫出好看的代碼。


說實話,跟R比起來,matlab已經十分優雅了


10萬行代碼的c++ 還是那醜樣, 但是10萬行matlab我連想都不敢想, 這就是matlab為什麼被程序員噴的原因。

如果說10萬行少的, 可以自動換成100萬行。


多用用R語言,就不覺得Matlab丑了。。

我覺得非CS專業的,寫代碼之前都應該看一遍PEP8


我只好實名贊 @白如冰 的答案。

除了函數和小學生拼音縮寫,或者是北歐人寫的英文一樣,數字字母結合,毫無規矩。這真是讓我這種看到大寫字母開頭就知道是Class, 全部大寫就知道是FINAL,第一個小第二個單詞大的就知道是method的人,無法接受。你們比較一下吧:

如果是Java,我們會有:

Map& map = new HashMap&();

map.containsKey()

map.get()

map.put()

我跟你們說,java寫程序就和念書寫作文一樣,你寫多了,英文水準都會提高。。

如果是Matlab呢,我們會有:

mp = Hmp&

mp.conky1()

mp.gt()

mp.pt()

Mathematica, Python 等都保持了很好的命名完整和規範。

而Matlab,別人寫的Matlab你能看懂?這也說效率高也是醉了。

另外一個坑爹之處是,我完全分不清他的row 和 col的順序。有的函數是先row,後col(例如plot,難得啊,一個全稱函數==)

而有些函數則先col,後row,例如interp2 還是interp3來著(對不起我記不得這樣的函數名!)

matlab是這樣的,他很強大,也完全可以在某個版本之後把所有的函數名都改正一下。可是。。。可是她的用戶社群太爛了,拒絕重構代碼,拒絕重寫之前的代碼,因此這條路不可能走得通。白如冰說的那些個奇葩函數,多少就是完全不懂英文和程序的人寫的。當然,這群人也有一個好處,就是夠狠,真的敢寫,專業水平也高。。(這和用labview那種所謂數據流編程的一群人一樣,那玩意。。算了不說了,都是計算機界的奇葩!)

雖然matlab寫原型速度快,可是很多人家的function你拿來就用,你也看不懂,亂試試能用,用對就好。這樣漿糊一樣的寫程序,你確定你的代碼能力會提高?真的是越寫越懶,越寫越蠢。難怪最後寫了幾十年matlab,結果一個好的計算機程序也無法寫出來。matrix dimension not match 算是matlab最常見的error了吧。每次我反正都是通過轉置,調換順序等鳥槍法嘗試,總有一個成的。matlab 的documentation字體選擇的會讓我近視(去對比一下人家mathematica的文檔!!就算java的也比你強啊)。反正,算出來之後,我再也不會想去看我寫了一坨什麼翔。

Matlab真的不是一個可以讓人接受的程序語言。他只是一個工程師可以用的小工具罷了。這個工具主要就是算、算、算。

Matlab 自己其實是用Java 等寫的ui然後調用的C庫,不信你讓Matlab bootstrap 一下?Mathworks的程序員也不是傻子,知道自己該用什麼寫代碼。寫Matlab 的專職程序員如果有一天知道自己不能用語法規範,靜態類型檢查,支持exception , template , class 的計算機語言寫代碼,估計他們就辭職了,下一版Matlab 就再也不會出現了。

樓下有人評論道出了matlab最廣泛用戶群的真心:

說的好.對我這種非cs的編程渣,明知matlab有各種問題,但是我就是不願意用c py etc. 原因就是matlab我實現新功能簡單,看documentation就懂了拿來無腦用,其他語言都要系統學習一遍,發布的package用都不會用.

系統學習的好處不言而喻,我們能在此處用漢語交流,就是系統學習的結果。正是這種良莠不齊的用戶群,這種不願意系統學習的風氣,這種不規範,隨性而為,造就了今天的matlab社群和函數庫。請不要用這樣的東西戕害尚在學習能力強盛時期的學生了。

Matlab 本就是設計給不會寫程序,不會數據結構和演算法設計,不懂硬體體系結構的工程人員用的。一般語言都可以分析dynamic scope , static scope,但看到Matlab 我都不忍心分析下去。寫Matlab 代碼的時候,coder 的腦子裡估計都是一團漿糊。只盯著矩陣運算看去了,實現的邏輯都異常簡單,就是什麼if,for,都特別費勁。都要求tab了還來一個end if end for,你以為是c裡面的macro啊。更別說其他語言可以返回函數指針(高階函數),處理異常,控制封裝,以及存在各類功能強大的不同選擇的IDE了。Matlab 你真是,哎。我都不好意思說你。


MATLAB像一輛坦克,別的所謂「優雅」的語言是高級跑車。你讓坦克跟跑車比優雅?坦克是用來打仗的,不是用來兜風的。

具體請參考知乎上很火的問題:開過飛機、坦克、潛艇的人再開家用轎車是什麼感覺?

覺得MATLAB不「優雅」的,尤其是CS出身的一些大神,給我的感覺是開跑車的跟開坦克的人說你們是真的不懂法拉利的好,就是你們說的都對,MATLAB是不適合寫數據結構、靜態分析啥的,但我一工程師要那玩意兒幹什麼……


July | 2009 | Abandon MATLAB

MatLab 醜陋之處的搜集的一個存檔站


很多程序員根本不清楚大部分工科生在用Matlab時候用的是什麼, Simulink是啥還不知道呢就喊Python。


實在看不下去Matlab被一些半瓶水人亂噴,有沒說到點子上的,也有似是而非自己都沒弄太明白的。手機碼字簡單說下。

有人點乘語義都沒弄明白的就先不說了

。還有人對函數調用和矩陣索引都用圓括弧也能東扯西拉不相關的分析,這個也不說了

單說這位:

函數指針(高階函數),處理異常,控制封裝

這幾樣哪個matlab不能搞?nested function, anonymous function,error,try catch,mexException,class,handle class ,這些都是幹嘛的?


許多人對 Matlab 不滿,只是因為他們對 Matlab 不如對別的語言了解得多。

許多人的抱怨都集中在運行效率上……可是這跟我們的主題「優雅」「美醜」有關係嗎?難道彙編才是最優雅的程序語言嗎?


知乎最讓我討厭的就是程序員太多,在很多問題上看法有偏差。

Matlab對於工程師(不包括程序員)來說就是大號計算器,唯一用處就是算。對於動不動就要翻好幾斤重的手冊查個數的工程師來說已經無所謂優雅不優雅了,能最快給我結果就行。相比之下其他編程語言寫起來慢的要死。

從程序員角度看,Matlab確實很爛。但你要是想拿Matlab寫應用或者操作系統那絕對是腦子進水了,人家就不是給你用的。


噴了,優雅能當飯吃?你拿Lisp寫一個比Matlab還快的Cholesky給我看看,或者用純C給我畫個系統Bode圖看看,或者用Python給我模擬個三相橋式整流電路看看?

Matlab就是這樣一個工程領域的全能多面手,專治各種不服。

什麼人吃什麼飯,吃饅頭的還瞧不起吃米飯的了,用個語言還用出優越感來了,這個語言的標準是你定的,還是這個語言的編譯器是你參與編寫的?

程序員最低級的嘴炮就是語言大戰和工具大戰了。


對不起,matlab並不是為程序員設計的。

更準確地說,matlab是借用了計算機語言的方式實現了工程運算。你可以認為,matlab僅僅是一個計算器。

因此,並不需要由程序員來評價matlab的語言。

好吧,儘管我也認為髒亂差。但是但是,竟然有人說phython,我也是…


優雅不優雅我不知道,但是作為科研狗,要讓我拋棄matlab(或其他同類軟體)強大的函數庫和工具箱,從頭用基礎語言寫模擬程序的話。。。相信我,這個過程真心「不優雅」。。。

或許有大神寫程序都入定了,代碼優雅的像詩一樣,看別的語言別人的代碼一坨坨像屎一樣。

但是說白了編程語言就是個工具,你握著刻刀切割鑽石美如畫,但何必因此嘲笑別人手持電鋸木屑橫飛亂如麻?


Matlab壓根就不是給程序員用的。

是給非程序員用來跑結果的。

能出結果就行,至於好不好看,那都是次要的。

只有少數的Matlab程序需要跑很多遍,大部分都是只跑幾次就好了。


推薦閱讀:

matlab把數值數組轉成分立的字元組成的元胞數組?
初學matlab需要什麼基礎嗎?
matlab2016b打開m文件的問題?
MATLAB中內置了哪些函數是本科生常用的?

TAG:程序員 | 編程語言 | MATLAB | 研究生 |