写个小程序,什么语言跨平台兼容,性能更好?戈朗
众所周知,Python、Ruby甚至Java都是在解决业务问题,属于面向应用的语言,主要侧重于解决业务逻辑,但是还有一个领域是系统,偏于网络层和底层操作。我一直在寻找这方面的优雅解决方案,C++被我先淘汰了。C的开发效率太低,但Java更适合,就是太臃肿,缺乏系统编程的基因。毕竟它。
最后我选择了Erlang,因为它在网络层有着出色的性能,良好的容错性和健壮性,它的虚拟机是唯一可以和JVM抗衡的,OTP是一个超级重量级的武器,几乎可以秒杀网络层应用,但是根据我的总结,它有一个硬伤,也有一个软肋,后面会开发。可以说,Erlang是目前我所知道的最好的解决方案。
直到有一天我认识了Golang,我才知道Golang其实挺早的。大约在2008年,我知道谷歌正在开发一种奇怪的语言。随后几年,以老莫为代表的很多人都在嘀咕Golang。其实我从来没怎么关注过。我从ROR中学到的经验是,成熟度对业务非常重要,越来越多的产品是基于Golang开发的。我必须研究它,我知道这是我梦寐以求的蟒蛇。效率和性能达到了最佳平衡。对Go了解的越多,就越不想用Erlang写代码。主要原因是:
1,Erlang的硬伤在于代码的可读性和表现力。我举个小例子。例如,如果你为你的系统软件构建一个RESTFUL接口,我们可以对代码风格有一个大致的了解。先不说二郎。无论你是c/c++/python/ruby/java出身,你是否对围棋有一种久违的感觉?为什么是硬伤?因为对于一门语言来说,语法不太可能有大的变化,也不会有大的变化。不知道有没有人看过松本幸弘的《编程世界》,里面把道理解释得很清楚。真正好的编程方法是人主宰计算机而不是计算机。感觉二郎在我的编程思维上有点占优势(我本身视力就不好,还在杀眼睛!),编程首先是逻辑,其次是工程,最后是数学,这让我想起了吴军的《数学之美》。人工智能在上个世纪一直在走弯路,期待机器高度图灵,而忽略了人类现有的文明和统计归纳的应用。
2.Erlang的软肋在于缺乏高质量的库。虽然有很多杀手级的应用,但是Go在这方面也是一个软肋。这对于一门不到五年的语言来说可以理解,但是对于一门二十多年的语言来说就有点说不过去了。比如用json解析库,很多人都是从mochiweb这个基本不更新的库里提取的。我觉得json之类的东西可以集成到语言标准库中,因为未来商业软件的api趋势越来越明显。说白了,一个倚老卖老,一个与时俱进。反正我一点都不担心Golang的图书馆。目前易经已经很好了,远远好于Ruby/Python的前五年。请参考现有优质库列表。
3.Erlang不合群,主要体现在和其他语言的交互上。当然还有深层次的原因。Erlang本身有自己的哲学,比如错误恢复机制。如果你用另一种语言整合一些东西,这个账就不好算了,就像你坚持让一个喝咖啡的人和一个吃大蒜的人坐在一起一样。简而言之,你写一个Erlang端口远比Go复杂。甚至比Python/Java还要复杂,导致Erlang的底层编程效果不太好,也无法利用linux的很多优秀成果。我一直认为Erlang不需要任何mysql/pg/oracle驱动。Erlang必须是一个自容器应用,只要用别的东西,按照木桶理论,不敢叫九个九,用系统的眼光看问题。我认为一个系统的健壮性不能依赖于某个组件,这也是爱立信本身的Erlang应用没有被广泛使用的原因。
4.先说数据类型。听到1以上的人说Erlang处理字符串不好。它把字符串当成了列表,其实也是应该的。但是,还是那句话,违背了以人为本的理念,应该做一些DSL,比如:=在Golang是糖衣,相当于var xx yyy = zzzz。程序员输入更少的字符非常方便。在Golang中,字符转换基本类似于python。切片贴图功能非常强大,支持lambda条件。虽然Erlang的基本类型很少,但是结构很多。所谓的结构相当于Golang中的复杂结构。这也很奇怪。就是觉得二郎结构伤眼睛好吗?可能是括号的比较吧,我觉得没必要。很明显,二郎缺少DSL的基因,这和二郎出生的年代有关。不夸张的说,自从用了二郎,我的视力下降了65,438+000度左右。我不太喜欢lisp提到的符号,但可能和函数式编程有关:形式演绎远大于逻辑演绎。
5.其实我最不在乎的就是性能,因为有了摩尔定律,一个单位计算单元的性价比会无限高。但既然Golang提出了性能接近C,我还是提一下吧。当然Erlang也可以,虽然比Java慢,但是和Python在一个级别上。
6.再来说说报错机制,因为Erlang的报错信息太纠结了。一开始以为不会看错误信息,后来用了Sasl,还是不够直观。有时我甚至需要使用工具分析崩溃文件来定位问题。还是和二郎的哲学有关。在Erlang中一切都是并行的,所以它根本不在乎物理的哪一条线是错的。和演员绑定就行了,然后告诉你演员的ID和错误码。可以自己凭经验分析。这样做的好处是可以很容易定位并行发生的问题,但一切都是相对的,有点矫枉过正。根据我的经验,很多时候我只是想先指出哪一行对我来说是错的,好吗?甚至用完整的英语句子打印出顺序回溯,好吗?至于并行错误,在命令式多线程语言中并不常见。虽然也不是没有,但是遇到错误我还是会尽力调试。但并不是所有的逻辑都用并行思维来定位问题。我甚至认为,一个系统并不是完全平行或串联的,就像我们不能简单地用唯物主义或唯心主义来衡量世界一样。Golang做了很好的妥协。在不需要并行的时候,可以老老实实写串行代码。
7.再说招人。之前从C招过几个人。说实话,水平很不错。我可以在一周内完成一个小组件。libevent很熟悉。后来我逼着人家用Erlang,结果把人家赶走了。我还是很后悔,把自己一厢情愿的想法强加给别人真的不合适。但是可以说我从纯二郎招人比从objc招人更难。没有人。空谈技术的优雅一开始不靠谱,再看看邮件列表。Golang的活跃度明显比Erlang高很多,基本接近Ruby。更重要的是,我一点也不担心Golang的天赋,因为只要熟悉Python/C/Ruby/或者C++,基本上半天就能上手,然后就可以一边工作一边搜索资料了。虽然有足够的深度,但是门槛极其温和,工程师可以重用很多现有的。Erlang其实和第一点有关。大部分人都是疑惑一周。每个人的抽象思维和世界观不都一样吗?所以,虽然函数式编程并不比命令式语言起步晚,但总是很少有人学。这是历史。对于大多数人来说,他们更喜欢解决问题,创造价值,而不是用数学去推导。
8.最后,我建议如果你玩c/c++,现在是学习Golang,用一种可靠的语言成长的最好时机。这种感觉太棒了。你用Erlang折腾了1个应用,恐怕你用Go完成了10个开源项目。当然也要结合自己的口味。Golang是崇高的文字,Erlang。
相信自己的判断,相信自己的逻辑,赢就是赢,输就是输。
转载仅供参考,版权归原作者所有。祝你有愉快的一天。满意请采纳。