GNU Octave简介与展望

GNU Octave是Matlab的开源替代,在小型数值计算项目上有很多优点。本文介绍其基本特点,兼谈从中体会到的软件开发问题。

请激活……

最近一段时间哈工大被禁止使用Matlab的事情引起了很多关注。好巧不巧,临近期末的时候,我还需要完成数值分析和系统控制分析两门课的实验。课程并没有要求我一定使用Matlab,但是在数值计算方面,Matlab的易用性的确要更高些;况且Python、R之类的语言,我几乎从来就没学会过。

疫情在家待了半年,Matlab几乎没有打开。果然,许可证缓存期限已过,而我又不在校园网环境里,要重新激活必然是相当繁琐。(顺便吐槽,Matlab的Linux适配太差了,UI极其丑陋)

Matlab

我对Matlab早有不满,看来寻找开源替代势在必行。于是,GNU Octave就这样被我第一次从硬盘的角落里唤起了……

叩响数值音阶

Octave是「八度音阶」的意思,虽然按照作者的说法,其实Octave的名称来源于他的老师Prof.Octave。这是GNU项目里的一部分,主要是用于数值计算。

Octave的历史我不甚清楚,但当下,它是以完全兼容Matlab为目标的。Matlab首先是一门语言,然后是一个软件。从语言的角度来讲,Octave完全可以被认为是Matlab语言的开源实现,因为Octave的源语言基本上和Matlab保持了一致。核心标准库的接口和实现也基本做到了100%兼容。因此,如果你只是需要完成一些数值计算任务的话,Octave足矣。

当然,Matlab不只是用于数值计算,它有很多独立的模块可以用于完成一些领域专有的任务。比如,用于控制论的Control Toolbox就包含了系统校正、时域频域仿真等工具。如果我们抛开这些附加模块提供的GUI界面的话,实际上它们就是Matlab语言的库。

Octave毕竟是开源软件,现阶段并没有实现全部的Matlab库。就以这学期我使用的控制论库而言,Octave就缺少算超调量dcgain,零极点模型zpk等等接口,给我带来了一些不便。不过就完备性来说提供的接口是足够完成绝大部分任务的,只不过会繁琐一些。值得一提的是,Octave的第三方库安装方式和Matlab不同,所以引入了和Matlab不同的模块引入语句,这是少有的不兼容语法。

那么,Octave相比Matlab有什么优势呢?它适合哪些人群使用?

我想Octave的最大优点是和GNU/Linux环境的整合。Octave在Linux下的启动速度比Matlab快很多(和Matlab终端REPL相比);REPL环境比Matlab好得多,有自动补全和GNU readline支持,从而提供Vim快捷键;内置离线帮助系统比Matlab快速,本地帮助文档更加详细;可以更容易地和编辑器整合。这些都能显著地提高小型项目的开发效率。

因此,我在用Octave完成两个实验项目的过程中,基本上是保持着愉悦的心情。本身数值计算就很少出bug,加之Octave简洁明了的接口,易于开发的环境,进行短期内的开发相当「惬意」。

如果你是想开发原型系统,或是需要一个高级的可编程计算器,又或是想开发小型的数值计算项目,Octave可能会很适合你,尤其是对Linux用户而言。

但是正如之前提到的,Octave在大型项目开发工具上的缺乏还是一个主要的问题。比如,Matlab内置了大量的AI算法,如在控制论中,从离散的输入输出数据自动拟合出传递函数。这在Octave中当然是不可能的。在复杂系统开发中,可视化开发也是很重要的一环,但是Octave的GUI界面长这样:

如果从Linux桌面环境或者美观的角度来说,这个GUI不算差。但是从工程师的角度来说,这个界面就有点不堪其用了,因为本质上,这就是把终端版本的Octave加了一层壳而已,实际还是主要用于写脚本、跑脚本。这也是为什么我一直都在终端进行开发的原因。

从这些角度来说,Octave似乎还是和其他商业软件的开源实现一样,精致、方便但是不普适。

粗鄙的外壳

说完Octave本身,现在我想谈一谈从我使用Octave中得到的启发。

我接触Matlab的最初,对它的感受就是:笨重、臃肿,甚至有些市井。其实不惟Matlab,其他的垄断软件,像Adobe全家桶都给我这种感觉。

但是我不得不承认,虽然不优雅,它们能很好地解决问题。虽然有时运行效率差劲,但是开发效率很高。大部分人并不关心软件开不开源,实现方式优不优雅,或者用了什么算法,他们只希望能把自己的需求解决,那就够了。

我在软件方面的确是有些洁癖,不愿意用那些特立独行,破坏系统「纯洁性」的软件。其他例子也很多,比如能不用wine就不用wine,有原生的应用就绝对不用electron版的,源里有的软件绝对不手动安装,能用vim就不用ide等等。这些大部分其实无伤大雅,只是有些多多少少带来不便。我想主要是因为作为学生,没什么实际的需要,所谓的「需求」多少都有些儿戏的味道吧。

我想做一个类比:虽然命令式语言都是不纯的,但是一直以来,人们都是依靠它们解决了大部分的问题,而且有时,正是语言的副作用起到决定性的作用。纯的函数式语言,像Coq,的确非常、非常优雅,非常能体现出计算机科学的魅力,但是用来解决实际问题,却是相当困难。不是有人说,函数式语言符合人的思维模式吗?是的,就像Octave的很多改进也符合我的兴致一样。但是镶满宝石的剑,有时候倒不如一把匕首有用。所谓「符合」,只是主观的一种倾向而已,但是实用性是用客观量衡量的,二者没有必然的关系。

引申开来说,前些日子某位老师发表了关于此次Matlab被禁事件的评论,里面说Matlab不过是实现了很多早已被研究透彻的算法,之所以人们做不出来替代品,那是因为大家都习惯了简单地调用,懒得再去关心底层的实现。这位老师甚至说matlab是为「低能」的人准备的,每一个合格的研究者都能自己实现这些算法。

我无意攻击这位老师的说法。我只是觉得,如果问题只是算法的实现这么单纯、这么简单的话,那么Octave早就可以取代Matlab了。很多粗鄙的、dirty的工作都需要完成,才能形成最终的产品;开源社区一向不擅长这类工作,有所不足在所难免(但是,如果说仿照Octave实现这些数值算法,至少可以解决一部分的问题的话,那么T大的另外一位副教授说的,「警惕国外开源软件的隐形“科技侵略”」,就实在不知道该做何评论了。)

因此,国产Matlab的事情,短期恐难有成效,现在能做的,唯有不断积累而已。像数值计算、EDA这类基础软件的不足,若不论玄学,所差大抵也就是dirty work的部分罢。

发表于 2020-06-22 最后修改于 2020-06-23
JS
Arrow Up