"伪代码"的英文是"Pseudocode",我查了一下这个词的延伸,好像跟"Pseudo"(伪、假的)有关的名词都挺不光彩的,Pseudomathematic(伪数学)、Pseudophysics(伪物理)、Pseudoscience(伪科学)……跟"民科"如影相随。好像只有"伪代码"是清白的,但好像在学术界"Pseudocode"这个概念并没有完全做到"出淤泥而不染",低人一等的样子。
我认为"伪代码"并不比真正的"编程语言"低一等,它是和"编程语言"是两个范畴的东西。"编程语言"是属于"实现层"的,用一套词汇和语法,能够让计算机识别并执行。"伪代码"是属于"思想层"的,把一套处理问题的路线叙述出来。当然,实际应用中,程序员往往直接用"编程语言"来叙述"思想层"了,用特定的如C、C++、Python等等,来阐述同一个思想,而不绕弯路去先用什么的"伪代码"或者"流程图"去演绎一下自己的想法。这样当然是无可厚非的,而且一些高级语言本身就与自然语言很相似了,得到的程序也不是很难理解。不过,对于非程序员来说,"伪代码"和"流程图"给了他们表达自己的机会,而当这个表达能够完成很复杂的事情的时候,给非程序员的鼓励和成就感也同样是非常大的。
尽管找到了这么多软件,几乎都是对程序员进行教学用的,也就是说能够实现的功能也仅仅限于逻辑表达,如果不是在学校里的话,这些软件实际上真的没什么可玩儿的,即便你在这些软件里实现了多么复杂的算法,它顶多是能够把你画的"流程图"或者写的"伪代码"转译为某个常用的"编程语言",然后可以嵌入或者独立执行——而对"伪代码"的学习成本并不比学习任何一门"编程语言"低。"编程语言"的学习难度在于其十分严谨的语法,可以说处处是地雷,而且"库"、"类"、"属性"等等花样繁多,各种进制,各种声明,五彩缤纷,眼花缭乱,可爬上一座山之后,基本上都是平原,初期的难度梯度较高,掌握一门"编程语言"之后,只要做语法上的调整,代换几个关键词,并且了解一下不同语言之间的性能上的差别,如此,就很可能马上学会并掌握另外一种"编程语言"。"伪代码"则是正好相反,很简单的几种元素,完全的彻底的都是思想上的问题,很容易学习,但易学难精,纯粹的脑力锻炼,如此呢,"伪代码"更适合研究算法——无论用哪种高级的"编程语言"来研究算法都不如用"伪代码"来的效率高,因为人们在用"伪代码"思考问题的时候想的不是语言本身,也不是某某功能需要怎么引用过来,他们想的是算法,很纯粹,加减乘除,不需要多么花哨的功能,仅仅是实现一个优秀的想法。嗯,所以我说"伪代码"和"编程语言"是两个范畴的东西,彻底点儿说,是完全不同的两个东西,谁也别说谁低级。用1天的时间就可以把"伪代码"中各种元素学明白,然而用"伪代码"实现高效的复杂的算法,可能需要自己思考10年,20年。
从利益上分析,也就很容易能够看出来,"编程语言"是可以实现功能的,是可以将思想变为现实的,也就可以用这些现实去卖钱。有一种许可正是这样的,语言本身是免费的(可能还是开源的),但用这种语言编写出来的软件却是可以卖钱的。早期的Mathcad软件是免费的,只要去官网下载并注册成用户就可以了,然而用Mathcad编写出来的计算软件都是涉及到很高的专业性的,含金量很大,所以除了很少量的学术交流或者教育性质的worksheet在网络上流通之外,大部分都是明码标价的。而"伪代码"则不同,难以变成现实,完全是思想,通过人们对思路的解读当然可以用"编程语言"把它转变成现实,但它本身不能成为现实,所以也就没有经济效益——除非,人们造出了一种可以把这个"伪代码"高效转译为"编程语言"的工具。还是Mathcad,随着与它合作的软件不断增多,人们在各个专业领域均找到了让这种免费语言发挥经济价值的方法,并造出了相应的工具,从Mathcad 7开始陆陆续续的出现了好多软件,于是Mathcad就从免费软件变成了商业软件,而且还挺贵的。
不能变为现实,多用于教学,总之吧,"伪代码"这种尴尬的性质可能是不会改变了。终归现在人们一说进行算法研究,都是用Matlab等等大型的数学软件。怎么说呢?Matlab尽管是程序行形式的,好像除了Mathcad及其效仿者之外,几乎都是程序行形式的,而且也有编程语法和规则,说是"编程语言"也无可厚非,一种类似于"伪代码"的编程语言。
一直以为"编程语言"的种类太多了,1个Basic,就有QBasic、TBasic什么的方言,Lisp也有好几种方言;再加上各种各样的库,1个Python,搞数学计算的就有SymPy、NumPy什么的,更是涉及到编程领域的方方面面,这就让我望而却步了。现在我才知道"伪代码"更乱!因为"伪代码"更接近自然语言,那么自然语言有多少种,就会有多少种"伪代码"。仅这次收集的软件里就有英语的,法语的,意大利语的,西班牙语的,而且不同的国家会有多种"伪代码"方言。PseInt使用的是西班牙语的"伪代码",从它的Perfiles文件夹里看,有351种方言!每个大学、研究机构都有自己的一套"伪代码"方言。天呐!本来以为"伪代码"应该是人类共同的思考语言呢,像UML一样,实际上乱得很。因为PseInt这个软件非常优秀,网络上就有人提出本土化这个软件,比如说翻译成英文,不过从这个软件的开发者回复中看,这件事是很难办到的,他不仅仅要把软件界面、说明文件什么的翻译成英文,还要把西班牙语的"伪代码"方言翻译成英语的,这样才能让这个软件发挥编程的作用——而英语的"伪代码"方言又不知道会有多少!我想说不定会有有心人会编写一本<"伪代码"大辞典>,尽管可能一点儿用处也没用,毕竟,"伪代码"更多的是内部交流思想的工具,更甚者,是自己梳理思路的工具,它不能代替"数学符号",不能代替"编程语言",而用"数学符号"和"编程语言"进行国际学术交流完全够用了!除非,除非有有心人确实用"伪代码"做出了足够宏大的算法逻辑,宏大到无论用"数学符号"还是用"编程语言"来表示它都会显得力不从心。
"伪代码"是典型具有工程性质的思考工具,用它搞学术搞理论力有不逮,但实现工程,"把不可能变成可能",我感觉它是有这个潜力的。
再说说Mathcad。在wiki百科的"pseudocode"条中,把Mathcad列为典型的"伪代码"——以前在百度"Mathcad吧"里也有懂编程的朋友这么说过,当时我还觉得挺受打击的,现在想来,他可能用的是褒义。而且我感觉Mathcad可能是至今为止最成功的的"伪代码"软件了,它给出了一套成熟的"伪代码编程语言",我们玩儿MC的都管这个叫"M++"语言。因为这个软件传播的非常广,世界上有很多人都在用或者用过,使这种语言得到了广泛的传播和认同——至少我有时候就会不自然的用这套语言来思考问题。当明确了Mathcad是"伪代码"之后,之前的很多疑问就都有了答案:
(1) 为什么从Mathcad跳到其他数学软件的学习成本会那么高?因为"伪代码"可以不必事先声明变量类型,它是在处理过程中对变量类型进行默认的,除非用户特别的给出指定,否则不必事先声明;甚至是模糊的,我前面将a声明为"整数",但当我之后给a加了下标,它就自动变成了"数组"或者"矩阵"。而其他数学软件基本都有自己的变量表,即使像Maple那样也不必事先声明,但a是"整数"就始终是"整数"了,除非给a另外刷新了定义。"伪代码"还给出了局部变量和全部变量的随意性,这使得我在Mathcad的程序块外面给a定义为"浮点数",但在程序块里将a作为1个"布尔值"或者"序列"是可能的,但在其他的数学软件里这么做肯定是会引起混乱的。玩儿MC的人一般不会关心变量管理或者函数管理这样的琐碎事情,这使得他们可以完全的投入到算法的实现,要想在用其他数学软件或者编程软件的时候能做到这种"专心",心理成本是很高的。或者说Mathcad用户被Mathcad惯坏了,养成了一大堆坏习惯,一点儿也不严谨——随便怎么说吧,我在使用其他数学软件的时候从来没有使用Mathcad时候那么流畅自由的体验。
(2) 为什么几乎所有数学软件都不支持将自己的代码与Mathcad进行共享交换?也是一样的,思维方式都不相同么。
(3) 为什么Mathcad的版本升级会那么难?从Mathcad 7到Mathcad 11,每个大版本的升级,其功能提升还是很明显的,而如果仔细观察则会发现,那些升级都是给MC不断的挂载新功能模块,而那些模块都不是用MC编写的——这是肯定的,MC是"伪代码"么——都是MathSoft公司和兄弟单位谈好了,他们为MC提供这个接口,那个服务,MC11相当于是一个集装箱或者百货商店,所谓的强大的功能都是外挂的。而当Maple闹起义,带领着SmartSketch、Vissim等一群大佬离开了Mathcad之后,从Mathcad 12一直到Mathcad 15,一直都表现平平,每次无论是大版本升级还是小版本维护,都仅仅是解决一些"无足轻重的小问题",偶尔新增了零星几个新函数,偶尔纠正了某个计算错误甚至是显示错误。怎么会这样呢?如果仔细看Mathcad的发展史,你会发现从Mathcad 2.5之后MC主程序本身就一直在原地踏步,甚至在Maple离开之后,还有所退步。这个过程中MC 5、6的变化是最大的,将MC的Windows界面完善成现在的样子,然后就真的是乏善可陈了。现在看其根本原因还是"伪代码"的缘故,MC没有用"编程语言"界面,这使得它与"编程语言"之间的互译难上加难。其他的几个数学软件可以很简单的将世界上其他"编程语言"所得到的算法成果买过来,加入到自己的程序行里,实现算法的升级和功能的升级,而且水涨船高,渐渐的也有其他公司来做合作伙伴,向Matlab、Mathematiaca里挂载自己的功能,越做越好。比如说Mupad,被Mathworks收购之后,一直到2019b版都是以独立的程序界面出现在Matlab里的,然后Matlab发挥了它强大的"编程语言"能力,造出了个"Symbolic Live Editor",直接把这个曾经很牛掰的符号代数软件吃下去,消化成了Matlab的一部分。类似的事情很多,Julia把SymPy降维成1个.jl文件收归己有,MapleSim则是直接使用Modelica编的。"编程语言"间的互译能力使得Mathcad这种"伪代码"软件变成了"升级的孤岛"。
多说两句,这里面还有另外一个原因,跟"伪代码"就关系不大了。Mathcad这个软件的组成很乱,主程序用的是Lisp(可能是Commen Lisp,AutoCAD的宏语言就是Lisp),计算引擎用的是C/C++,符号引擎在Maple时代用的是Lisp,在Mupad时代用的是C/C++,控件用的是Visual Basic Script和JavaScript,而用户干活儿却特么用的是"伪代码"。如果在Mathcad早期,发展最好的那几年(MC7~11),MathSoft公司利用自己的影响力做出M++语言与C语言之间的编译器就好了,可是那几年MathSoft忙着从各个商业用户手里收版税呢,他们可能觉得自己已经是老大了,不能让自己听别人的,要让别人听自己的,很霸道!没远见!而且从MC2.5开始,也就是1989年前后吧,MathSoft公司发起了一项持久的运动,鼓励用户自己编写计算库文件(.dll)——这件事在现在来说是很常见的事情,而且当时MC还是半开源的,这个运动一直到MC15仍然在继续。这个.dll文件是用C/C++编写的,跟Mathcad一点儿关系也没有,写完了之后就变成了一个可以在MC用户界面里可以执行的内部函数。从MC的升级手册里能够看到,在新版本里加入了谁谁谁提供的.dll,可以实现什么什么样的计算功能——据我试验,尽管这些官方提供的内部函数运算速度都很快,但也是有bug的,很多时候还是自己用基本的加减乘除来编写"伪代码"来得更踏实。MathSoft这么做当然是好事,这使得MC在每次升级都会出现计算能力的提升,实在不能加入主版本的函数,还可以放进Extension Pack或者Engineering Library中发布,效果是一样的。可命衰的是,MathSoft公司同时还鼓励所有用户用自己的编写的.dll武装过的Mathcad版本拿出去卖钱——既然我编写的软件可以卖更大的价钱,我为什么非要卖给你MathSoft公司呢?而且.dll是用C/C++编写的,既然它可以用在Mathcad里,也就可以用在任何数学软件里,稍微改头换面就可以的事儿,用户跟MathSoft公司之间没有任何义务和权利约定,那么他们辛辛苦苦做出来的优秀函数,可以卖给MathSoft,自然也就可以卖给MathWorks或者Wolfram。而且就像上面对"伪代码"用户的分析中说的,大部分用Mathcad的人是工程师或者科研人员,而不是程序员,而且从Mathcad"伪代码"跳到"编程语言"是有很大的心理成本的,这使得真正热爱Mathcad的人对Mathcad软件的发展几乎毫无推进作用,不管你用M++语言制造出了多么优秀的算法,要让它成为Mathcad的一部分让全世界的人都能够享受到你的研究成果,仅有传播WorkSheet或者HandBook一途可选。到了Mathcad 12之后,筵席散了,更没有人去搞什么M++到C/C++的编译器了,Mathcad升级中主要函数的来源只能靠MathSoft公司或者PTC公司里的那几个程序员来折腾,而且还要同时考虑整个程序的稳定性和继承性——要知道,编写出一个优秀的算法函数的难度相当于纠正整个软件bug的难度,可能还要大,因为里面是有创新的,对MC尤其如此,需要有丰富的工程计算经验和深厚的数学功底的——这是1个多么大的难题啊!据说Matlab工具箱都是那些领域的创始人或者大牛与MathWorks的特派编程团队合作出来的,是要投钱花时间的。而MathSoft公司在其他数学软件奋起的时候自己却濒临破产了,Mathcad的后妈PTC公司本身就不是搞数学的,它在工程计算圈和数学圈里没有什么号召力,又舍不得投钱,造成Mathcad 12之后的版本就只剩下维护了。不过呢,这对于基本用户来说也不是完全的没有好处,下面我会说。
(4) PTC接收MC已经十几年了,但开发出的Mathcad Prime到现在的这个V7的水平仍然追不上Mathcad 15,为什么?PTC接手MC后首先就发现了Mathcad软件中各种"编程语言"杂糅的情况不利于这个软件的开发,因此他才在维护了几个版本的MC之后索性放弃了,改去开发Mathcad Prime。MP是用C/C++编写的,借用了微软发布的.net和VC,跟Lisp无关。但是呢?如果编出来一个软件叫Mathcad Prime,但毫无之前Mathcad的任何特征,这就说不过去了,PTC公司收购Mathcad的目的是看准了Mathcad的庞大的用户群,他们需要用这个用户量来赚钱,这就不得不服从这些用户以前使用Mathcad的习惯,也就是"伪代码",于是呢,PTC就碰到了与MathSoft公司同样的问题,"伪代码"与"编程语言"之间的互译。如果PTC在开发MP的时候做得绝一些,干脆让所有Mathcad老用户以前编写的Mathcad文件都失效,让Mathcad直接成为历史,尽管这样会挨骂,但这样他们在开发MP的时候就无牵挂了,他们可以让用户遵从一个新的"伪代码"规则,必须符合特定的语法才可以,是有严谨结构和语法的"伪代码",嗯,那就跟Maple、Mathematica很相似了。可是这样老用户都没了,新用户如果不使用Pro/E或者Creo,谁会特别选用这种新软件呢?那PTC公司不就赔钱了么?而要让老用户能够喜欢用上Mathcad Prime,唯一的办法就是提供一个转译器,将.mcd或者.xmcd文件转译为.mcdx文件。原来人们使用Mathcad"伪代码"是很随意的,五花八门的,这就使得MP程序的编写难度非常之高,又要实现C/C++的中规中矩,又要实现Lisp的自由奔放。可以说PTC开发MP的这十几年一直在做的事情只有一件,就是和Lisp作斗争。嗯,看,PTC同时面对着两个难题,用户的"伪代码"对程序升级毫无用处,以及用C/C++实现类似Lisp的功能——比当年的MathSoft公司还多一个。PTC在之前的MP版本里关闭了用户自己编写.dll的通道,用自己的统一语法来做这件事情,我想等今年PTC把所有MC用户的许可证都吊销了之后,他们会以MathWorks公司的方式再次开放这个通道的——鼓励用户编写工具箱或者功能库——嗯,把MC老用户斩尽杀绝之后,PTC就可以推行自己的"伪代码"规则,废掉之前的"M++"语言,形成"M-Creo"语言,然后所有的事儿就都好办了,我们可以期待MP8会有脱胎换骨的升级,但这些已经跟Mathcad毫无关系了。
无论Allen Razdow先生当年造Mathcad这件事儿给数学软件界造成了多么大的麻烦,也无论Mathcad现在混得多么凄惨,就像我前面说的,到目前为止,Mathcad无疑是最成功的"伪代码"软件,它直接让用户使用"伪代码"去思考,去解决实际问题,这可能也将是后无来者的了。很难想象与计算机打交道能这么自由不是么?用"伪代码"编程势必需要有1个转译层,其执行效率势必要比"编程语言"低不少。就看你是怎么看待"算法"这件事儿了。如果你认为效率低、计算慢的数学软件就是垃圾,那最好去学Julia,我看了好几个Julia的教程,很多是听不太懂的,但几乎所有的教程都拿它的计算速度说事儿,太快了,无与伦比的快;如果你比较享受思考的过程,不在乎电脑或者人工智能能够实现什么,而是"我"或者"人类"能够实现什么,即便速度很慢,但它实现了,我想你肯定会是个"伪代码"的老铁的。我是后者,所以我也不太在乎Mathcad现在的内置函数的量那么简陋那么少,或者说用Mathcad造轮子也是很有乐趣的。所以我前面说从MC11开始MC的升级仅限于版本维护也不一定是件坏事儿,PTC让所有MC的许可证都失效也不一定是坏事儿,这等于是把MC给释放出来了,PTC把MC流放了,不管使用无服务器许可证的正版用户,还是盗版用户,都得到了解脱,不是么?完全可以自由的用Mathcad研究和交流算法了,不是么?不必再背着"工程计算标准"、"数学软件扛把子"等等这些包袱了,纯粹的在"伪代码"提供的自由思考海洋中徜徉。不必考虑升级,不必看着Modelica系的一系列仿真软件眼馋,完全专心的埋头做自己喜欢的事情——在Mathcad所能够提供的所有功能范畴内。这多少是件好事儿,说不定在PTC严酷镇压下,在各个国家或者全世界范围内会出现类似于Mathcad算法联盟的组织,人们自己学会脱离软件的束缚自己搭建自己的象牙塔。即便不是如此,MP仍旧继承了Mathcad的主要特征,人们仍旧会享受到部分MC的快乐的。再即便不是如此,这对于喜欢用直接的本质的必要的"伪代码"来表达自己想法的人们来说也不会有任何影响的——比如说西班牙人就可以用PseInt来进行高级的思考,而俄罗斯人可以用Drakon,意大利人可以用AlgoBuild,法国人LARP……
我认为"伪代码"并不比真正的"编程语言"低一等,它是和"编程语言"是两个范畴的东西。"编程语言"是属于"实现层"的,用一套词汇和语法,能够让计算机识别并执行。"伪代码"是属于"思想层"的,把一套处理问题的路线叙述出来。当然,实际应用中,程序员往往直接用"编程语言"来叙述"思想层"了,用特定的如C、C++、Python等等,来阐述同一个思想,而不绕弯路去先用什么的"伪代码"或者"流程图"去演绎一下自己的想法。这样当然是无可厚非的,而且一些高级语言本身就与自然语言很相似了,得到的程序也不是很难理解。不过,对于非程序员来说,"伪代码"和"流程图"给了他们表达自己的机会,而当这个表达能够完成很复杂的事情的时候,给非程序员的鼓励和成就感也同样是非常大的。
尽管找到了这么多软件,几乎都是对程序员进行教学用的,也就是说能够实现的功能也仅仅限于逻辑表达,如果不是在学校里的话,这些软件实际上真的没什么可玩儿的,即便你在这些软件里实现了多么复杂的算法,它顶多是能够把你画的"流程图"或者写的"伪代码"转译为某个常用的"编程语言",然后可以嵌入或者独立执行——而对"伪代码"的学习成本并不比学习任何一门"编程语言"低。"编程语言"的学习难度在于其十分严谨的语法,可以说处处是地雷,而且"库"、"类"、"属性"等等花样繁多,各种进制,各种声明,五彩缤纷,眼花缭乱,可爬上一座山之后,基本上都是平原,初期的难度梯度较高,掌握一门"编程语言"之后,只要做语法上的调整,代换几个关键词,并且了解一下不同语言之间的性能上的差别,如此,就很可能马上学会并掌握另外一种"编程语言"。"伪代码"则是正好相反,很简单的几种元素,完全的彻底的都是思想上的问题,很容易学习,但易学难精,纯粹的脑力锻炼,如此呢,"伪代码"更适合研究算法——无论用哪种高级的"编程语言"来研究算法都不如用"伪代码"来的效率高,因为人们在用"伪代码"思考问题的时候想的不是语言本身,也不是某某功能需要怎么引用过来,他们想的是算法,很纯粹,加减乘除,不需要多么花哨的功能,仅仅是实现一个优秀的想法。嗯,所以我说"伪代码"和"编程语言"是两个范畴的东西,彻底点儿说,是完全不同的两个东西,谁也别说谁低级。用1天的时间就可以把"伪代码"中各种元素学明白,然而用"伪代码"实现高效的复杂的算法,可能需要自己思考10年,20年。
从利益上分析,也就很容易能够看出来,"编程语言"是可以实现功能的,是可以将思想变为现实的,也就可以用这些现实去卖钱。有一种许可正是这样的,语言本身是免费的(可能还是开源的),但用这种语言编写出来的软件却是可以卖钱的。早期的Mathcad软件是免费的,只要去官网下载并注册成用户就可以了,然而用Mathcad编写出来的计算软件都是涉及到很高的专业性的,含金量很大,所以除了很少量的学术交流或者教育性质的worksheet在网络上流通之外,大部分都是明码标价的。而"伪代码"则不同,难以变成现实,完全是思想,通过人们对思路的解读当然可以用"编程语言"把它转变成现实,但它本身不能成为现实,所以也就没有经济效益——除非,人们造出了一种可以把这个"伪代码"高效转译为"编程语言"的工具。还是Mathcad,随着与它合作的软件不断增多,人们在各个专业领域均找到了让这种免费语言发挥经济价值的方法,并造出了相应的工具,从Mathcad 7开始陆陆续续的出现了好多软件,于是Mathcad就从免费软件变成了商业软件,而且还挺贵的。
不能变为现实,多用于教学,总之吧,"伪代码"这种尴尬的性质可能是不会改变了。终归现在人们一说进行算法研究,都是用Matlab等等大型的数学软件。怎么说呢?Matlab尽管是程序行形式的,好像除了Mathcad及其效仿者之外,几乎都是程序行形式的,而且也有编程语法和规则,说是"编程语言"也无可厚非,一种类似于"伪代码"的编程语言。
一直以为"编程语言"的种类太多了,1个Basic,就有QBasic、TBasic什么的方言,Lisp也有好几种方言;再加上各种各样的库,1个Python,搞数学计算的就有SymPy、NumPy什么的,更是涉及到编程领域的方方面面,这就让我望而却步了。现在我才知道"伪代码"更乱!因为"伪代码"更接近自然语言,那么自然语言有多少种,就会有多少种"伪代码"。仅这次收集的软件里就有英语的,法语的,意大利语的,西班牙语的,而且不同的国家会有多种"伪代码"方言。PseInt使用的是西班牙语的"伪代码",从它的Perfiles文件夹里看,有351种方言!每个大学、研究机构都有自己的一套"伪代码"方言。天呐!本来以为"伪代码"应该是人类共同的思考语言呢,像UML一样,实际上乱得很。因为PseInt这个软件非常优秀,网络上就有人提出本土化这个软件,比如说翻译成英文,不过从这个软件的开发者回复中看,这件事是很难办到的,他不仅仅要把软件界面、说明文件什么的翻译成英文,还要把西班牙语的"伪代码"方言翻译成英语的,这样才能让这个软件发挥编程的作用——而英语的"伪代码"方言又不知道会有多少!我想说不定会有有心人会编写一本<"伪代码"大辞典>,尽管可能一点儿用处也没用,毕竟,"伪代码"更多的是内部交流思想的工具,更甚者,是自己梳理思路的工具,它不能代替"数学符号",不能代替"编程语言",而用"数学符号"和"编程语言"进行国际学术交流完全够用了!除非,除非有有心人确实用"伪代码"做出了足够宏大的算法逻辑,宏大到无论用"数学符号"还是用"编程语言"来表示它都会显得力不从心。
"伪代码"是典型具有工程性质的思考工具,用它搞学术搞理论力有不逮,但实现工程,"把不可能变成可能",我感觉它是有这个潜力的。
再说说Mathcad。在wiki百科的"pseudocode"条中,把Mathcad列为典型的"伪代码"——以前在百度"Mathcad吧"里也有懂编程的朋友这么说过,当时我还觉得挺受打击的,现在想来,他可能用的是褒义。而且我感觉Mathcad可能是至今为止最成功的的"伪代码"软件了,它给出了一套成熟的"伪代码编程语言",我们玩儿MC的都管这个叫"M++"语言。因为这个软件传播的非常广,世界上有很多人都在用或者用过,使这种语言得到了广泛的传播和认同——至少我有时候就会不自然的用这套语言来思考问题。当明确了Mathcad是"伪代码"之后,之前的很多疑问就都有了答案:
(1) 为什么从Mathcad跳到其他数学软件的学习成本会那么高?因为"伪代码"可以不必事先声明变量类型,它是在处理过程中对变量类型进行默认的,除非用户特别的给出指定,否则不必事先声明;甚至是模糊的,我前面将a声明为"整数",但当我之后给a加了下标,它就自动变成了"数组"或者"矩阵"。而其他数学软件基本都有自己的变量表,即使像Maple那样也不必事先声明,但a是"整数"就始终是"整数"了,除非给a另外刷新了定义。"伪代码"还给出了局部变量和全部变量的随意性,这使得我在Mathcad的程序块外面给a定义为"浮点数",但在程序块里将a作为1个"布尔值"或者"序列"是可能的,但在其他的数学软件里这么做肯定是会引起混乱的。玩儿MC的人一般不会关心变量管理或者函数管理这样的琐碎事情,这使得他们可以完全的投入到算法的实现,要想在用其他数学软件或者编程软件的时候能做到这种"专心",心理成本是很高的。或者说Mathcad用户被Mathcad惯坏了,养成了一大堆坏习惯,一点儿也不严谨——随便怎么说吧,我在使用其他数学软件的时候从来没有使用Mathcad时候那么流畅自由的体验。
(2) 为什么几乎所有数学软件都不支持将自己的代码与Mathcad进行共享交换?也是一样的,思维方式都不相同么。
(3) 为什么Mathcad的版本升级会那么难?从Mathcad 7到Mathcad 11,每个大版本的升级,其功能提升还是很明显的,而如果仔细观察则会发现,那些升级都是给MC不断的挂载新功能模块,而那些模块都不是用MC编写的——这是肯定的,MC是"伪代码"么——都是MathSoft公司和兄弟单位谈好了,他们为MC提供这个接口,那个服务,MC11相当于是一个集装箱或者百货商店,所谓的强大的功能都是外挂的。而当Maple闹起义,带领着SmartSketch、Vissim等一群大佬离开了Mathcad之后,从Mathcad 12一直到Mathcad 15,一直都表现平平,每次无论是大版本升级还是小版本维护,都仅仅是解决一些"无足轻重的小问题",偶尔新增了零星几个新函数,偶尔纠正了某个计算错误甚至是显示错误。怎么会这样呢?如果仔细看Mathcad的发展史,你会发现从Mathcad 2.5之后MC主程序本身就一直在原地踏步,甚至在Maple离开之后,还有所退步。这个过程中MC 5、6的变化是最大的,将MC的Windows界面完善成现在的样子,然后就真的是乏善可陈了。现在看其根本原因还是"伪代码"的缘故,MC没有用"编程语言"界面,这使得它与"编程语言"之间的互译难上加难。其他的几个数学软件可以很简单的将世界上其他"编程语言"所得到的算法成果买过来,加入到自己的程序行里,实现算法的升级和功能的升级,而且水涨船高,渐渐的也有其他公司来做合作伙伴,向Matlab、Mathematiaca里挂载自己的功能,越做越好。比如说Mupad,被Mathworks收购之后,一直到2019b版都是以独立的程序界面出现在Matlab里的,然后Matlab发挥了它强大的"编程语言"能力,造出了个"Symbolic Live Editor",直接把这个曾经很牛掰的符号代数软件吃下去,消化成了Matlab的一部分。类似的事情很多,Julia把SymPy降维成1个.jl文件收归己有,MapleSim则是直接使用Modelica编的。"编程语言"间的互译能力使得Mathcad这种"伪代码"软件变成了"升级的孤岛"。
多说两句,这里面还有另外一个原因,跟"伪代码"就关系不大了。Mathcad这个软件的组成很乱,主程序用的是Lisp(可能是Commen Lisp,AutoCAD的宏语言就是Lisp),计算引擎用的是C/C++,符号引擎在Maple时代用的是Lisp,在Mupad时代用的是C/C++,控件用的是Visual Basic Script和JavaScript,而用户干活儿却特么用的是"伪代码"。如果在Mathcad早期,发展最好的那几年(MC7~11),MathSoft公司利用自己的影响力做出M++语言与C语言之间的编译器就好了,可是那几年MathSoft忙着从各个商业用户手里收版税呢,他们可能觉得自己已经是老大了,不能让自己听别人的,要让别人听自己的,很霸道!没远见!而且从MC2.5开始,也就是1989年前后吧,MathSoft公司发起了一项持久的运动,鼓励用户自己编写计算库文件(.dll)——这件事在现在来说是很常见的事情,而且当时MC还是半开源的,这个运动一直到MC15仍然在继续。这个.dll文件是用C/C++编写的,跟Mathcad一点儿关系也没有,写完了之后就变成了一个可以在MC用户界面里可以执行的内部函数。从MC的升级手册里能够看到,在新版本里加入了谁谁谁提供的.dll,可以实现什么什么样的计算功能——据我试验,尽管这些官方提供的内部函数运算速度都很快,但也是有bug的,很多时候还是自己用基本的加减乘除来编写"伪代码"来得更踏实。MathSoft这么做当然是好事,这使得MC在每次升级都会出现计算能力的提升,实在不能加入主版本的函数,还可以放进Extension Pack或者Engineering Library中发布,效果是一样的。可命衰的是,MathSoft公司同时还鼓励所有用户用自己的编写的.dll武装过的Mathcad版本拿出去卖钱——既然我编写的软件可以卖更大的价钱,我为什么非要卖给你MathSoft公司呢?而且.dll是用C/C++编写的,既然它可以用在Mathcad里,也就可以用在任何数学软件里,稍微改头换面就可以的事儿,用户跟MathSoft公司之间没有任何义务和权利约定,那么他们辛辛苦苦做出来的优秀函数,可以卖给MathSoft,自然也就可以卖给MathWorks或者Wolfram。而且就像上面对"伪代码"用户的分析中说的,大部分用Mathcad的人是工程师或者科研人员,而不是程序员,而且从Mathcad"伪代码"跳到"编程语言"是有很大的心理成本的,这使得真正热爱Mathcad的人对Mathcad软件的发展几乎毫无推进作用,不管你用M++语言制造出了多么优秀的算法,要让它成为Mathcad的一部分让全世界的人都能够享受到你的研究成果,仅有传播WorkSheet或者HandBook一途可选。到了Mathcad 12之后,筵席散了,更没有人去搞什么M++到C/C++的编译器了,Mathcad升级中主要函数的来源只能靠MathSoft公司或者PTC公司里的那几个程序员来折腾,而且还要同时考虑整个程序的稳定性和继承性——要知道,编写出一个优秀的算法函数的难度相当于纠正整个软件bug的难度,可能还要大,因为里面是有创新的,对MC尤其如此,需要有丰富的工程计算经验和深厚的数学功底的——这是1个多么大的难题啊!据说Matlab工具箱都是那些领域的创始人或者大牛与MathWorks的特派编程团队合作出来的,是要投钱花时间的。而MathSoft公司在其他数学软件奋起的时候自己却濒临破产了,Mathcad的后妈PTC公司本身就不是搞数学的,它在工程计算圈和数学圈里没有什么号召力,又舍不得投钱,造成Mathcad 12之后的版本就只剩下维护了。不过呢,这对于基本用户来说也不是完全的没有好处,下面我会说。
(4) PTC接收MC已经十几年了,但开发出的Mathcad Prime到现在的这个V7的水平仍然追不上Mathcad 15,为什么?PTC接手MC后首先就发现了Mathcad软件中各种"编程语言"杂糅的情况不利于这个软件的开发,因此他才在维护了几个版本的MC之后索性放弃了,改去开发Mathcad Prime。MP是用C/C++编写的,借用了微软发布的.net和VC,跟Lisp无关。但是呢?如果编出来一个软件叫Mathcad Prime,但毫无之前Mathcad的任何特征,这就说不过去了,PTC公司收购Mathcad的目的是看准了Mathcad的庞大的用户群,他们需要用这个用户量来赚钱,这就不得不服从这些用户以前使用Mathcad的习惯,也就是"伪代码",于是呢,PTC就碰到了与MathSoft公司同样的问题,"伪代码"与"编程语言"之间的互译。如果PTC在开发MP的时候做得绝一些,干脆让所有Mathcad老用户以前编写的Mathcad文件都失效,让Mathcad直接成为历史,尽管这样会挨骂,但这样他们在开发MP的时候就无牵挂了,他们可以让用户遵从一个新的"伪代码"规则,必须符合特定的语法才可以,是有严谨结构和语法的"伪代码",嗯,那就跟Maple、Mathematica很相似了。可是这样老用户都没了,新用户如果不使用Pro/E或者Creo,谁会特别选用这种新软件呢?那PTC公司不就赔钱了么?而要让老用户能够喜欢用上Mathcad Prime,唯一的办法就是提供一个转译器,将.mcd或者.xmcd文件转译为.mcdx文件。原来人们使用Mathcad"伪代码"是很随意的,五花八门的,这就使得MP程序的编写难度非常之高,又要实现C/C++的中规中矩,又要实现Lisp的自由奔放。可以说PTC开发MP的这十几年一直在做的事情只有一件,就是和Lisp作斗争。嗯,看,PTC同时面对着两个难题,用户的"伪代码"对程序升级毫无用处,以及用C/C++实现类似Lisp的功能——比当年的MathSoft公司还多一个。PTC在之前的MP版本里关闭了用户自己编写.dll的通道,用自己的统一语法来做这件事情,我想等今年PTC把所有MC用户的许可证都吊销了之后,他们会以MathWorks公司的方式再次开放这个通道的——鼓励用户编写工具箱或者功能库——嗯,把MC老用户斩尽杀绝之后,PTC就可以推行自己的"伪代码"规则,废掉之前的"M++"语言,形成"M-Creo"语言,然后所有的事儿就都好办了,我们可以期待MP8会有脱胎换骨的升级,但这些已经跟Mathcad毫无关系了。
无论Allen Razdow先生当年造Mathcad这件事儿给数学软件界造成了多么大的麻烦,也无论Mathcad现在混得多么凄惨,就像我前面说的,到目前为止,Mathcad无疑是最成功的"伪代码"软件,它直接让用户使用"伪代码"去思考,去解决实际问题,这可能也将是后无来者的了。很难想象与计算机打交道能这么自由不是么?用"伪代码"编程势必需要有1个转译层,其执行效率势必要比"编程语言"低不少。就看你是怎么看待"算法"这件事儿了。如果你认为效率低、计算慢的数学软件就是垃圾,那最好去学Julia,我看了好几个Julia的教程,很多是听不太懂的,但几乎所有的教程都拿它的计算速度说事儿,太快了,无与伦比的快;如果你比较享受思考的过程,不在乎电脑或者人工智能能够实现什么,而是"我"或者"人类"能够实现什么,即便速度很慢,但它实现了,我想你肯定会是个"伪代码"的老铁的。我是后者,所以我也不太在乎Mathcad现在的内置函数的量那么简陋那么少,或者说用Mathcad造轮子也是很有乐趣的。所以我前面说从MC11开始MC的升级仅限于版本维护也不一定是件坏事儿,PTC让所有MC的许可证都失效也不一定是坏事儿,这等于是把MC给释放出来了,PTC把MC流放了,不管使用无服务器许可证的正版用户,还是盗版用户,都得到了解脱,不是么?完全可以自由的用Mathcad研究和交流算法了,不是么?不必再背着"工程计算标准"、"数学软件扛把子"等等这些包袱了,纯粹的在"伪代码"提供的自由思考海洋中徜徉。不必考虑升级,不必看着Modelica系的一系列仿真软件眼馋,完全专心的埋头做自己喜欢的事情——在Mathcad所能够提供的所有功能范畴内。这多少是件好事儿,说不定在PTC严酷镇压下,在各个国家或者全世界范围内会出现类似于Mathcad算法联盟的组织,人们自己学会脱离软件的束缚自己搭建自己的象牙塔。即便不是如此,MP仍旧继承了Mathcad的主要特征,人们仍旧会享受到部分MC的快乐的。再即便不是如此,这对于喜欢用直接的本质的必要的"伪代码"来表达自己想法的人们来说也不会有任何影响的——比如说西班牙人就可以用PseInt来进行高级的思考,而俄罗斯人可以用Drakon,意大利人可以用AlgoBuild,法国人LARP……