对多种程序语言的一个测评

By guenchi at 2018-03-12 • 0人收藏 • 366人看过


近来粗略使用了以下几种编程语言,做个简要评价:


语言特性

Scheme:动态 强类型。多范型函数式语言。

OCaml:静态 强类型。多范型函数式语言。

JavaScript:动态 弱类型。天生支持函数式编程,具有lambda和原型链式对象。

Lua:动态 弱类型。

Python:动态 强类型,对函数式编程支持不足。

Ruby:动态 强类型,按照面向对象设计,但却具有很多函数式编程的功能。可算是多范性。


运行速度

Scheme:快,第一梯队,一般可认为根据优化程度有1/3-1的C速度。

OCaml:快,第一梯队,Ocaml是以速度著称的,具有于C媲美甚至超过C的传言。

JavaScript:较快,处于第二梯队,V8几乎把JavaScript优化到顶级,但是弱类型语言的特性使得解释开销巨大。基本不再具有进一步优化速度的能力。

Lua:较快,处于第二梯队,Luajit的速度非常快,配合C库进行开发至少不至于拖了后腿。

Python:慢,作为强类型语言这个速度简直可耻,编译器需要巨量的优化,有很大的优化空间

Ruby:慢,作为强类型语言这个速度简直可耻,编译器需要巨量的优化,有很大的优化空间


库数量

Scheme:库非常少,而且因为社区原因分裂成不可互用的几部分。Chez可以方便的调用C库,一定程度上弥补了这个缺陷,但是对程序开发者要求比较高。

OCaml:具有丰富的高质量工业库。

JavaScript:库非常丰富,开发者众多。

Lua:

Python:非常丰富,主要集中在科学计算,神经网络基础框架。

Ruby:网络开发库比较丰富。


调用C库能力

Scheme:可以非常方便直接调用动态链接库的C函数。

OCaml:可以直接调用动态链接库的C函数。

JavaScript:可以非常方便直接调用动态链接库的C函数,或者直接混写。

Lua:需要对C库进行包装

Python:需要对C库进行包装

Ruby:需要对C库进行包装


被C调用能力

Scheme:编译成动态链接库后,过程可以非常方便的被C函数调用。

OCaml:

JavaScript:

Lua:Lua一开始被设计为嵌入语言,C可以直接调用Lua函数。

Python:

Ruby:


并行计算

Scheme:显式暴露控制流,函数式语言特性先天支持高度并行。

OCaml:据说OCaml的GC有些薄弱,可能对于长时间大量并发运行有局限。

JavaScript:隐式控制流,函数式编程对并行支持度高,但编程需要手写CPS风格代码。

Lua:Lua具有高速协程,适合嵌入对实时要求比较高的系统。

Python:Python有全局解释器锁,对并行计算有非常大的局限。

Ruby:


总体来看,个人理解是,动静态类型只决定大工程中对程序员的纠错能力,现代编译器的速度并不取决于这个。强弱类型则决定编译器的优化难度。


这里看到ruby和python完全是编译器之耻,而JavaScript和Lua两个弱类型语言双双跑在速度前列,几乎要推翻上一段的结论。


现代语言对C库的调用能力也非常重要,毕竟高密集cpu的任务,最好的办法就是扔给C线程。JavaScript因为有社区的支持,在这一块做的非常好,但是因为动态弱类型语言的特性,还是在调用上比原生C程序有很大的降速。Scheme对C库的互相调用是非常方便的,而且实际上也没有观测到调用对执行速度造成很大影响。OCaml除系统底层其实是不太需要调用C库的,它的编译代码执行速度非常的快。


如果只是考虑速度上来说,OCaml是一个很好的选择。但是听闻它的GC不适合长时间作为服务。从应用上来看,它作为工具链的应用非常多,但是作为服务跑的时候非常少,从侧面印证了这一个说法。


从语言的优雅程度来说,Scheme确实是最为优雅,而OCaml最为丑陋。JavaScript则是因为要用C的风格写CPS,殊为怪异。



参考:

关于Pyhton GIL的解释:http://theschemer.org/t/201

8 个回复 | 最后更新于 2018-03-14
2018-03-13   #1

关于函数式:迄今只有JavaScriptCore支持了尾递归优化


关于速度:8102年,V8已成最慢JS引擎,SpiderMonkey、JavaScriptCore都比V8快。


关于并行:迄今只有JavaScriptCore支持了多线程,见Nexus.jsConcurrent JavaScript: It can work!。JavaScript从ES2015起支持协程,无需手写CPS。

2018-03-13   #2

而OCaml最为丑陋

说说看丑在哪里?


2018-03-13   #3

建议添加的语言:Java、Erlang、C#、Go、Perl、Common Lisp、C、Pascal、Rust、Haskell、C++、Scala、PHP

2018-03-13   #4

说说看你是怎么区分强弱类型的?我建议把这一栏去掉。

2018-03-13   #5

PyPy已有无GIL的版本。

2018-03-13   #6

据说OCaml的GC有些薄弱,可能对于长时间大量并发运行有局限。

请求来源。

2018-03-14   #7

回复#3 @dou4cc :

只是随便说说自己之前在选型过程中了解到的


还没那个实力去做一个全面的评测

2018-03-14   #8

回复#1 @dou4cc :

尾递归这一点我之前写帖的时候一时间还没想到 加上去!

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...