Clojure vs Go - 泰坦之战!
Posted StatusOfficial
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure vs Go - 泰坦之战!相关的知识,希望对你有一定的参考价值。
作者 | Robin
翻译 | huahuangege
如果你对这些编程语言来说是一个新手; 当我说Golang和Clojure都是极其重量级的编程语言时,请相信我。
在过去的几年里,我有幸自由地探索了几乎所有主要语言。我是一个万事通(但尚未达到这些领域的大师级别!),这使我能够深入比较各种编程语言。虽然我会尽力对这篇文章的大部分内容保持客观,但我仍然对这两个语言有着个人见解,文章的后面将会对此进行详细解释。
如果您对这两种语言都很熟悉,那么本文很可能不教不了你任何新东西。这篇文章针对的是那些不懂任何编程语言或只熟悉其中一种语言的开发人员。
在我们深入讲解之前,你可以在这里(https://golang.org/)找到关于Go编程语言的资料
你可以在这里(https://clojure.org/)找到Clojure 。
Clojure概述
Clojure在2007年首次公布。该版本背后的想法是创建一个现代的Lisp分支,基于数据的不可变特性,并且强调并发能力。它是一种函数式,动态的语言,多年来发展迅速,包括强大的新抽象,如 transducers, protocols 和 multimethods,仅举几例。
Clojure基于Java虚拟机(JVM),它有很多好处,但在我看来也有一些缺点。JVM基础架构数十年以来一直提供性能优化,大量开发人员对此架构熟悉,以及庞大的库生态系统。因为Clojure可以访问所有的Java库,也有许许多多的内部和社区贡献,我可以大胆说一句,在所有编程语言中,Clojure绝对是最大的一个的生态系统。
几年前我参加了ClojureConj,并且非常有幸会见了该语言的原作者Rich Hickey。我坚定认为他可以轻松成为我们这一代最优秀,最聪明的计算机科学家之一。
Clojure用于什么?
Clojure实际上是一种非常通用的语言。它被设计成一种托管语言; 虽然它托管在Java虚拟机上,但它也可以在javascript引擎(browsers和node.js)上运行。
通过添加ClojureScript,Clojure现在可以完全从头开始构建Web应用程序,而无需使用任何其他语言。
ClojureScript结合了JavaScript的平台优势,Clojure的灵活性和交互式开发,以及Google Closure的整体程序优化,为Web编程提供了最强大的语言。
Clojure is also extremely powerful when it comes to manipulating data. It is excellent at concurrency, or even avoiding concurrency altogether and making parallelism easy to achieve, especially as data is immutable.
在处理数据方面,Clojure也非常强大。它具有出色的并发性,甚至可以完全避免并发性,并且可以轻松实现并行性,尤其是在数据不可变的情况下。
几乎所有行业都可以使用Clojure,除非是硬件受限的环境。飞机上甚至还有实用Clojure监控系统的例子!
Clojure的好处:
非常强大,
开源语言,
史诗级支持原生并发,
丰富的包生态系统,
高度通用,
非常高效,
相当容易学习,
比其他Lisp系语言更友好,
友好性远远超过了其他JVM,
提供的出色的项目管理——Leiningen,
也可以使用Java的Gradle。
Clojure的缺点
基于JVM(个人观点!)
错误可能是模糊和没有帮助,
没有像Go那样多的学习资源,
编译时间可能过长。
Clojure语法
举一个简单的例子,我们将让Clojure产生10个线程,这些线程会随机休眠一段时间,然后在0-9之间打印一个数字。对于已经熟悉任何Lisp方言的人,你会注意到这里的相似之处。另外值得注意的是,以下示例实际上与下一节中的Golang代码示例具有相当的相似性!
(ns async-example.core
(:require [clojure.core.async :refer :all])
(:gen-class))
(defn -main [& args]
(doseq [i (range 10)]
(go
(Thread/sleep (rand-int 1000))
(println i)))
(Thread/sleep 2000))
Go概览
Go是Google在2009年推出的一种命令式,并发的,静态类型的编程语言。创建者已经提到Go最初是作为服务器语言开发的; 但是,由于它的概念与其史诗般的社区一起成长为一个更为通用的语言。Go的语法和环境都采用了动态语言中常见的模式。
对我来说,Go就像是简短的C.我能用C写的任何东西,我用Go完成只需要1/5的时间(注:指开发效率),错误最少并且实际上我喜欢用它(在C中很少有这种情况)。Go垃圾收集工作做得很好,缺乏malloc使我非常高兴!
许多转向Go的人都来自Ruby和类似的面向对象语言。网络上充满了很多关于Go的故事,从Rails重写为Go的服务器成本降低了90%,可靠性提高了10倍,响应时间缩短了10倍。Golang的爆炸性出现,吸引了业内一些最伟大的人才。
Go用于什么?
Go绝对是两者中更通用的语言。在过去的几年中,出现了一个巨大的Golang效应,大量的web应用程序开发纷纷转向Go!由于非常灵活,Go可以用于任何Web应用程序所需的几乎所有后端服务。从低级数据库活动,到数据处理和API开发; Go可以用于所有!我个人使用Go来构建SOA应用程序中的所有后端服务。Go非常适合REST API开发。这里需要注意的是,虽然Clojure 可以通过CLJS用于前端开发,但Go 在这里做得并不好。
Go的好处:
非常强大,
开源语言,
史诗并发原语,
围绕Go的强大的社区,
比Clojure更简单的学习曲线,
使构建高性能系统变得相当容易,
简化的基于C的语法,
最近大大改进了包管理。
Go的缺点
缺乏测试框架,
对于全栈开发不好; 与Clojure / ClojureScript相比,
go get包管理器仍然需要改善,
Go语法
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i := 0; i < 10; i++ {
go func(i int) {
sleep := time.Duration(rand.Intn(1000))
time.Sleep(sleep * time.Millisecond)
fmt.Println(i)
}(i)
}
time.Sleep(2000 * time.Millisecond)
}
并发
上面的代码示例展示了两种语言的基本原生并发特性。使用任一语言生成轻量级线程是一种使用异步线程的高效且安全的方法。操作系统线程通常非常繁重,过去的编程语言必须使用它们。然而,现在goroutines和core.async go blocks的想法让我们能够产生数以百万计的线程,同时没有因此压垮处理器!
在并发编程方面,这两个语言都具有非常相似的功能。我想比较这两个编程语言 的原因之一,不仅仅是因为我喜欢它们,而是因为它们实际上非常相似,尽管它们是不同的编程范例。
Go有goroutines,Clojure可以使用go blocks在单独的轻量级线程上生成和运行进程。他们甚至使用同一个词,意味深长!Rich Hickey(Clojure的创建者)在原始博客文章中宣布增加core.async; 该团队直接从Golang的并发特性中获取灵感。
这里有一篇关于Clojure并发的精彩【文章】。
https://www.braveclojure.com/core-async/
Clojure:
go表达式中的所有内容 - 称为go块 - 在单独的线程上并发运行。Go块在一个线程池上运行您的进程,该线程池包含多个等于2的线程加上您机器上的核心数,这意味着您的程序不必为每个进程创建新线程。这通常会带来更好的性能,因为您可以避免与创建线程相关的开销。
Go:
主要的并发构造是goroutine,一种轻量级的过程。以go关键字为前缀的函数调用在新的goroutine中启动函数。语言规范没有规定如何实现goroutine,但是当前的实现将Go进程的goroutine复用到一小组操作系统线程上,类似于在Erlang中执行的调用。
结论和我的个人意见
首先 - Clojure。2012年,当我在Couchbase时,我被介绍使用Clojure。我们在一些内部工具上使用了Clojure,它立即引起了我的注意。当时,我是一个Ruby和Python开发人员,而且是一个相当不熟练的人。不同编程范式的想法对我来说是陌生的,因为我只熟悉面向对象。
Clojure是我学到的第一种函数式编程语言,正因为如此; 我学到了很多关于编程和不同编程模式的知识。Lisp语法在开始时对我没有任何意义,但我实际上很快掌握了它。Clojure并不像初看起来那样难以学习!这是Clojure的乐趣之一!
我在生产环境使用过Clojure,而且性能总是值得夸耀。可靠性和可扩展性确保了Clojure始终在我心中占有一席之地。遗憾的是,去年我没有多少机会接触Clojure,但我会确保它回到我日常开发的最前沿。
现在,Go ... 从2014年到2016年,我写的几乎所有代码都是Go。再一次,我在Couchbase被介绍使用Go,因为在那里工作的天才工程师重建了从C到Go的大部分后端。重写从C到Go的,说明了很多事情。我甚至无法相信Go可以与C的表现相媲美,事实上,Go比C更容易学习,并且几乎与C的性能相匹配!
学习Go语言对我来说比学习Clojure容易得多。Go是一种命令式语言,让我比Clojure的函数式范例有着更熟悉,更平缓的学习曲线。其中一个最大的原因,Go更容易学习,因为有更多的资源可以进行网上学习。在资源,内容和参与方面,Go社区相比Clojure社区而言,飙升势头实在猛多了!
我已经构建并维护了使用各种功能构建的Go生产应用程序。我在3年前建立了的一个创业公司,我们使用了面向服务的架构,并在Go中构建了许多小型服务,这些服务链接在一起形成一个强大,高性能的系统。真是太令人满意了!
如果你现在问我,“你更喜欢哪种语言?”:
我不得不说,我真的很难回答。由于我最近没能写出很多Clojure,我想我必须选择Go。相信我 - 这不是一个简单的答案!
我会喜欢听到关于Go VS Clojure的个人喜好。请在下面的部分发表评论,让我知道你的想法!或者如果您想进一步与我讨论,请随时通过robin@status.im与我联系。
谢谢阅读!
扫码有惊喜!!!
以上是关于Clojure vs Go - 泰坦之战!的主要内容,如果未能解决你的问题,请参考以下文章