Mathematica 的语言怎么样?

注:狹指 Mathematica 软件自带的编程语言 Wolfram Language。 我觉得此语言表达能力异常强大,模式匹配等特性可以使代码写得非…
关注者
306
被浏览
77,035

8 个回答

没想到我的这个提问已经快要一年了,现在我来自己回答下。

我本人在入门 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

反对一下 @徐枭涵 的部分观点。(不好意思是知乎时间线要挖坟

首先编程范式是根据具体问题来决定的,某一类问题适合使用 oo 范式那么就不要拘泥于 fp 的写法。

WL 本来就是一个需要自己管理副作用的语言,其内部实现也严重依赖各种状态($开头的变量)和跳转(Reap,Throw)。对于副作用不能政治正确地反对它,重点在于代码环境是隔离的还是开放的。至于 Do, For 这类在 fp 范式下明显有更好的替代函数。

相比 Lisp,WL 是更彻底、纯粹的 homoiconic 语言,因为它连 macro 和 keyword 都没有,甚至 operator 都只是函数的特殊形式。优点是极其灵活,可以随意修改函数的定义,缺点是对底层解释器的实现要求很高,没有好的 linter 方法。

至于 WL 和 Haskell 的对比,后者是静态强类型的,想要写出一段可编译执行的代码太容易了,而前者则没有任何限定,可以动态执行可以编译可以模式匹配可以弱类型。

WL 的语言特性使得它可以不依赖编程范式、可以改写内部函数、可以自定义运行方式。那么它有没有问题呢?有,最大的问题在于,它依附于一个高昂的数学产品 MMA。可谓成也萧何败也萧何。MMA 向人们展示了 WL 强大的功能,毕竟那时候还没有 WL 这一说。代码底层实现上是高度为 MMA 服务。三十年的代码量想要和 MMA 解耦已经很难了,比如 Form, Box,这导致它对一个不关心数学的程序员十分不友好。内置函数越多,重写解释器的代价就越大。以至于现在没有任何一个独立的 WL 运行环境。有时候我觉得 WL 就是一座天空之城,换句话说就是空中楼阁,长得好看,但没有 MMA 什么都做不了。也许它的数学功能可以卖钱,但它作为编程语言本身,如果没有良好的开源环境,注定是发展不下去的。在数学上追赶甚至持平 MMA 的语言越来越多,笔记格式也不再是独有特色。技术平台和工具链的更新不是靠 WRI 一家公司就能轻松推动的了,不靠社区生态单吃数学软件包这一条路也不再好使。

作为一个数学学院的学生,我觉得Mathematica完爆matlab。

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