Web开发

首页 » 常识 » 诊断 » 五种语言五个故事你喜欢哪个
TUhjnbcbe - 2024/8/1 15:25:00

介绍

去年春天,我想看看使用Clojure实现一个小型Web服务器是多么容易,并为使用ClojureScript的后端实现提供一个简单的前端。今年秋天,我有一个好主意:为什么不使用其他4种语言实现相同的服务器,其中2种我已经非常清楚(Java和Python),其中2种我想学习(Javascript/Node和Go)以便我可以比较这五种语言如何完成工作以实现完全相同的事情。

所以,在这篇博客文章中,我将一遍又一遍地实现相同的服务器,比较这五种语言的经验。我也将使用相同的比例(1-5,1=最佳,5=最差)或其他一些我认为更适合这种情况的指标来评估各个方面的语言。读者必须明白,这些分数和我在这里写的所有内容都是基于非常个人的品味,并在脸颊上完成。那么,让我们开始吧!

语言特征

这五种语言彼此截然不同,这是一件好事,因为它们现在在我的工具箱中-我喜欢为不同的目的使用不同的工具。我认为这些语言的主要特征是:

编译为机器代码vs运行时:Go是这些语言中唯一一个编译为机器代码的语言。Java和Clojure编译为Java字节码,由Java虚拟机(JVM)解释。Python和Javascript是解释语言。静态vs动态类型:Java和Go是静态类型语言,它们提供了出色的语言支持,可以在编译时捕获典型的类型错误。Clojure,Javascript和Python是动态类型语言-使用这些语言很容易开发,但生产中有更多的错误空间(你可以缓解这些问题中的一些问题,例如在这些语言中使用类型提示)。功能vs程序与面向对象:Java显然是面向对象的。使用Javascript和Node,你可以使用具有某种功能和面向对象风格的程序风格,在一个奇怪的异步模型中进行编程。Python主要是过程语言,尽管你也可以使用它有点功能和O-O方式。Go显然是非常程序化的系统语言。而Clojure作为一个Lisp是非常实用的,默认情况下具有不变性。垃圾收集vs手动内存管理。所有语言都使用垃圾收集。被遗忘的是真正的男人编程C并管理自己程序的内存分配的那些日子。并发支持vs单线程。Java,Clojure和Go提供了开箱即用的良好并发支持。Python和Javascript基本上是单线程的,尽管有用于并发支持的库。无处不在vs龛。Javascript是一种真正无处不在的语言,因为它占据了前端。有很多前端的Javascript开发人员,他们后端的自然选择是Node。Java在企业后端世界中也非常普遍。Python在某些领域(如ML)是非常流行的语言。Go是一种更为小众的语言,主要出现在系统开发领域。Clojure非常适合-仅适用于开明的开发人员。语言设计

这些语言的历史是完全不同的。我个人认为最好的语言是Clojure和Go。他们非常适合他们的生态隔间。Java作为一种编程语言设计得很好,但它有点过于冗长和臃肿,但是它提供了Go缺乏的优秀抽象机制。另一方面,作为Lisp的Clojure提供了你能想象到的抽象,而语言设计也是Lisp的一个非常现代的版本。Python也是非常精心设计的语言,主要用于工作。如果Netscape的故事是真的(并且可能是在你学习语言及其奇怪的语法时),该类的黑羊显然是Javascript,它是在大约10天内设计和实现的。所以,判决是(我主要使用这些ascii表):

开发人员生产力

对于开发人员的工作效率,我有一些个人硬数据让我们看看使用这些语言实现服务器所花费的时间:

我必须诚实,我没有费心去检查Github有多少晚上我编程了Clojure,但我估计它有两个星期。因此,“Evenings”并不具有可比性,因为我对语言有着非常不同的体验(Java和Python:大约20年,Javascript:几周,节点:零,Clojure:大约1年,Go:零)。但这也很有趣。凭借大约20年的Java经验,我笨拙地忙着约18个晚上的工作(好吧,我已经做了大约1.5年没有认真的Java编程了,我花了很多时间探索新的Java10功能,新的Spring功能,新的IDEA功能,如何使用JavaREPL等...)。但由于没有使用Go的经验,我在8个晚上设法做了同样的服务器。让我们迭代这个:

20年的Java经验和18个晚上的实施经验与对Go和8个晚上实施的零知识相比。Wtf?

因为“晚上”在我对这些语言的背景上并不具有可比性,所以我添加了专栏“2y”,这是我非常个人的感觉,即如果我有两年的经验,我会用同样的语言再做多少个晚上关于那种语言。因此,考虑到我没有花费任何额外的时间来学习新的语言,Spring等功能,我从Java中删除了大约6个晚上。我想我也可以将Javascript压缩到一半,将Clojure从13压缩到3,因为一旦掌握它,它真的是一种非常高效的语言。Python已经处于最佳状态:3。我也可以至少在几个晚上挤出Go。

为了使这篇博客文章看起来更专业和科学,我发明了一个新的索引:“MarttilaProductivityIndex”(MPI),因此我使用第2y列的最短的晚上(Python:3)划分了第2列的所有语言结果。这种方法为每种语言的生产力(脸颊)提供了非常科学的指标。

生产力工具

此类别为提供卓越生产力工具的语言提供了良好的评分。LispREPL是迄今为止我用过的最好的生产力工具,所以Clojure自然会赢得这个类别。PythonREPL也很不错,但它是一个代码片段REPL,而不是像LispREPLs那样的真实系统REPL。JavaREPL在这个类别中是个坏笑话。所有动态类型语言也提供了快速创建代码的良好感觉,因此它们具有良好的总体分数。所有语言都提供了良好的IDE和优秀的调试器,所以没有转移。构建工具在这些语言中有点不同,最复杂的是带有Maven和Gradle的Java,它们不像其他语言中的等效工具那么容易学习。

代码行数

这部分可能是本博文中最科学的部分-每个人都可以验证克隆我的Github中的repos并运行“查找”的结果。运行:find.-inamelanguage-extension

xargswc-l

让我们可视化数据,使其更具可读性。

因此,Python是MarttilaCodeofCodeIndex和MarttilaProductivityIndex的赢家。Clojure没有那么多损失,生产力是相同的,但MLCI仅高出10%。Javascript的生产力损失相当多,实现时间增加了3倍,而MLCI则高出约30%。有趣的是,Go打破了MLCI和MPI之间的相关规则-Go的MLCI高出90%,但MPI仅为2倍。而Java,可怜的旧Java表现最糟糕:MLCI高出%,MPI高出4倍。你可以看到一个明显的趋势-动态类型语言往往比静态类型语言具有更少的代码行。源代码文件计数-具有类this的Java和在专用文件中的类非常可怕。

性能

Go性能非常出色,因为Go编译为裸机,并且金属和语言之间没有运行时,就像其他语言一样(Java和Clojure:编译为JVM字节码,JVM运行字节码,Python和Javascript:解释语言)运行时运行代码(虽然Python也编译为字节码).Go也可以非常快速地编译。节点的性能在那些几乎没有CPU处理的服务器中实际上非常好,但由于它的异步事件模型只提供简单的REST响应。对于臭名昭着的GIL而言,性能已经非常糟糕-Python的用例不在服务器实现中。当你知道如何进行同步编程并且能够使用带有线程的多核处理器时,Java的性能非常好.Clojure可以由于JVM运行字节码,因此基本上与Java一样好,而字节码是字节码,无论是从Java还是Clojure编译(粗略地说)。

并发支持

Go的并发支持非常出色-它提供了例程和通道作为语言的一部分。Clojure的并发支持也非常出色,是一种功能性和不可变的语言(在这些情况下并发性没有问题),当需要共享内容时,它具有处理并发性的特定和简单机制。Java还使用同步机制提供良好的并发支持,但对于新手程序员来说有点难以使用。Python和Javascript本质上是单线程语言,需要为库提供并发支持。

库支持

Java,Go,Python和Clojure提供了非常好的标准库。另一方面,Javascript提供了相当差的标准库,因此你通常在实现节点服务器时偶尔运行npm安装(请参阅下一章“依赖关系”)。我会从Java中删除几点,因为你通常不使用“纯EE”,但是你对Spring框架有很多依赖关系,这会依赖于自身等依赖关系(在下一章中会有更多内容)。因此,下表中的“库支持”度量标准衡量两件事:

标准库有多好,以及只使用标准库可以管理多少?

依赖

另一方面-如果Java中的标准库支持如此之好,为什么在给出命令时会看到超过行各种依赖项的可怕列表:“./gradlewdependencies

wc-l“=,wtf?如果你有直接依赖关系A,B,C,D,E然后A和C绘制J,K,L,然后B绘制J,K,R,S,那么你如何计算需要多少依赖项?J绘制R,S,T,然后R绘制V,W等依此类推(当你阅读超过行依赖项的列表时,情况就是这样)。然后是依赖关系之间的冲突。你倾向于在构建文件中编写各种排除项,因为A绘制的某些依赖项R和S会被依赖项F冲突,依赖项F由B绘制,依此类推。JavaSimpleServer的一个真实示例:

为了得到一些想法,我在gradle.build文件中添加了一个任务,将所有

1
查看完整版本: 五种语言五个故事你喜欢哪个