先声明下,本人非计算机从业人员,计算机语言属于爱好,而且语言对我来说是工具,主要是它适合干什么,没有好坏之分。另外,本人都是helloworld水平,高手勿喷。
这些语言,都用过或者玩过一段时间,有些还写过能用的程序。这里不聊语法,主要谈感受。
我把这10多门语言,分成了四类,
第一类:底层性能类,c,c++,rust
底层,通俗讲,就是比较难,大多数人读大学学的都是谭浩强的C语言。C的特点,是直接操纵内存,其他高级语言一般不用管内存的使用,因为内存已经有运行时,虚拟机替你管了。多半还优化的不错,你只需要用就行了。而C不行,你需要关心内存的使用,然后衍生出了大量内存的骚操作,比如指针的使用等。
而C++呢,在还在使用vc6.0的MFC时代,那个时候写windows程序都用VC++,虽然MFC使用起来很痛苦,但也没太多选择,那个时候的C++和现在所谓的modern C++不太一样,其实是 C with class,有类的C,或者是面向对象的C语言。
C++后来加了11,14,17标准后,越来越复杂,特别是模板,以及由此改造了整个标准库,现在叫标准模板库,各种酷炫的东西。学习现代C++的门槛很高,网上基本上也很少有modern C++的好的课程,侯捷的C++11的视频,以及翻译的modern C++的书籍,看的就费劲,一件事情,本来不复杂,课程讲完,更懵逼了,好像就是故意让你搞不懂。现在手头在翻译的Cherno的C++算是最好的教程,毕竟小哥年纪轻,思维敏捷,而且在著名游戏公司的引擎部门,实战经验丰富。
那么C++在加入到那么多新特性后,而且C++20即将到来,越来越臃肿,那C++还能玩吗,我的意见是,虽然C++添加了那么多新的内容,但仍然是一件好事,因为C++标榜的就是多范式的编程语言,实现同一件事情,有不同的方法,你仍然可以使用C with class的风格写程序,一样可以用C++98的标准,用与不用都取决于你自己。什么都有的C++,才是最好的。
另外说到C++的用途,如果是我自己当互联网公司老板,我肯定不用C++,因为是多范式的,那员工代码一定是五花八门,想想这管理难度就是地狱级的,除非你公司已经有了一套写好的框架,员工只是在底下用lua脚本等调用框架,就是让大牛做框架,码农做脚本,绝对不能一堆码农协作C++,那是灾难。但如果做实时的程序,比如游戏,那就是C++最好的场景之一了,速度是决定性的,而C++在理论上,直接操纵硬件,可以疯狂的优化。这就是为什么现在的游戏大多是用C++,比如游戏引擎什么的。
我自己的项目,就要求有绝对的性能,所以选择用C++,而且涉及到高性能计算,显卡的cuda程序,英伟达只提供了C++的接口,自然用C++更好。C++还有一点好处,因为使用的人多,写好的现成代码是真的多,基本上想要什么代码,谷歌一下,都能找到。什么叫有群众基础,C/C++就是。
C++的优势就是性能以及几十年积累的人气和大量成熟的库,除了高性能计算、实时交互程序之外,其他的都有了替代品。
C++的缺点就是容易出内存管理问题,所以mozilla搞出了个rust,在内存资源上,提供了语言级的解决方案,我发现币圈码农最喜欢尝鲜,不管是golang,rust,在币圈都挺流行,号称破除了区块链不可能三角的algorand项目,就是使用的rust。所以之前抽了个时间,我过了下官网的教程,也尝试着helloworld了一把,因为我比较关注协程,结果发现rust还没做这一块,之前搞过一个green线程,现在又取消了。rust最让我受不了的是,语法真的繁杂,用各种东西约束你,不让你搞出问题,出发点虽然好,但是那语法,各种撇,点,眼睛都会看花,而且rust的特性一直在增加,虽然目标是要取代C++,但最终也会成长成C++这样的怪兽,门槛极高,学习曲线极为陡峭。基本上就是装逼极客的选择。要装逼,请用rust。
第二类:当代流行类 golang,python,C#
这里面应该还有Java,js这些,不懂就不说了。因为我不是码农,对于大企业里干活的996工具人使用的语言工具兴趣不大。
有个问题,golang,python到底谁更简单,是个难题,不管如何,有C/C++基础的人,入门这两个语言,应该也就是半天的事情,真的是简单到无语。上午看完教程,下午就可以独立写程序了,其他靠百度和谷歌。个人以为,golang是企业主的首选,速度快,单一代码实现方式,gofmt一搞,连书写风格都统一了,管理难度下降几个数量级。看看识时务的互联网公司,比如B站,就用的go,不知道为啥有互联网公司用python做后台,少买几台服务器不香吗?说起python的性能,自己有亲身体会,同样一个选股程序,跑市场的4000只股票,python程序一般是要10个小时,睡前跑,通宵第二天看结果。后来受不了了,改成了golang,代码结构基本一样。好了, 10分钟就跑完了,10分钟对比10个小时,就是这么大的差距,不要说什么优化,我python,golang都是菜,都不优化,python无非就是使用了pandas库。
python现在用在AI上比较多,pytorch啥的,当然,后面是显卡计算,和python语言在CPU上的速度没啥关系,不代表python快,而是人家显卡快。
总之,对于python和golang,创业开公司,肯定golang,历史包袱小,谷歌支持,语法及其简单,代码风格强制统一,速度还快,要啥自行车呢。
python也很简单,但脚本语言,速度慢是事实,平常写个脚本,用着pyqt5写个GUI程序,都没问题,我的量化程序基本都是python写的。简单易用上手快,时间就是生命,用python,等于增加了寿命。
哦,还有个C#,C#我用过一段时间,写过几个量化程序,因为要写winform,当时调用的是一个C++写的dll库,真挺麻烦的。C#语法并不简单,只是复杂度略小于C++,但其实也挺复杂的,语法特性很多。有了golang,我实在想不到还要使用C#的地方?估计只有winform、wpf了吧。所以这几年就没碰过了。
第三类:科学工程类,matlab,octave,julia
上学的时候,工程系孩子们的必备,就是matlab,写论文,做仿真,离不了它,在商业领域,基本没有对手,语法简单,自然语言化,甚至还能写gui程序,速度一般般,但人家目标明确,只是脚本,某种意义上,和其他通用语言不是一回事。反正好上手,画图出图很容易。Octave也把玩过几天,就是matlab的非商业形式,基本差不多,喜欢折腾就玩玩,不喜欢折腾就算了。
现在这个Julia是最有潜力的,速度某些场合是matlab10倍,号称与C相当,流行度逐步增加。工程类的替代及未来可能的升级之选,因为贸易战,matlab已经不让一些大学正版使用了。julia是个好的替代。其实julia的目标不是要取代商业的matlab,而是要干掉python,因为julia比python快的多,就是现在支持度低,主要用于科学计算,比较小众,库比较少,还没出圈。
第四类:函数式 erlang,elixir
曾经接触过erlang一段时间,被它的完全不同的思维方式吸引,我觉得erlang才是未来的语言,虽然计算机硬件基本算是顺序执行的,但erlang尽量的模拟了现实世界,通过Actor模型,将每一个事物,抽象成一个actor,actor之间通过发信的方式进行沟通,一台pc电脑,可以轻松开到10万个actor同时运行,这让我想到了我们大脑的800亿个神经元,嗯,相当契合,大脑的神经元就像一个个的actor,之间的沟通也是通过脑电波,神经递质进行信息传输。这方面,golang也是可以做的,不过模型不同,golang是将每一个传输信道,抽象成一个通道,然后开出的协程通过这些个通道进行信息传输。相比之下,erlang的actor模型与现实更为贴切。
因为是基于消息的,所以erlang稳定性特别好,erlang也被喻为是最稳定运行的语言,广泛应用在电信领域,想让它代码崩溃,说实在很不容易。
但说到为啥我搞不下去了,是因为代码风格,很难适应,特别是思维方式,要从C语言的思维方式彻底转变,尾递归无处不在,太伤脑细胞。而且,毕竟是基于erlang虚拟机的,速度上差点意思。前面说过,区块链的码农最喜欢搞新奇的玩意儿圈钱了。他们将以太坊的golang代码改成其他语言,然后就当成了一个新的项目,比如AE币,团队就搞了个erlang的所谓欧洲以太坊,结果币价跌出翔。erlang是小众,结果AE也成了山寨币中的垃圾币。
总而言之,erlang是小众,但是却是最符合大自然模型的编程语言。其实我挺期待有像erlang一样的类C语言出现的(现在有个pony语言,就是这个路子,可是还不完善)。现在的语法实在是难以接受。
elixir只是在erlang的虚拟机上,语法借鉴ruby搞的另一个erlang,基本相当于换个马甲,库都可以通用。专门给那些喜欢ruby的老派程序员耍的。
好了,自己玩过的计算机语言就到这里,语言没有好坏,关键看你要做什么。而且说实话,精通了一门计算机语言,再学其他语言,再容易不过,特别是熟悉了C++语言,那所有的类C语言,都不是个事。除了huskell、lisp、erlang这些完全的另类除外。