围棋世界中的水晶
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
这篇文章最初发表在我的博客上。
想象一下,有一种编程语言,它拥有 Ruby 的简洁语法、C 的执行速度、Go 的并发模型,而且最重要的
是,它还配备了一个在编译时执行空值检查的编译器。听起来像个
梦想?其实,这种语言确实存在,但你很可能至今还没听说过它。
认识一下克丽丝塔尔!
Crystal 具备以上所有优点,此外它还拥有类型系统、出色的文档以及强大的社区,源源不断地提供新的库(也称为“分片”)。不要被当前的版本号 (0.32.1) 所迷惑。Crystal 自 2012 年以来已经存在多年,拥有成熟的语言特性和完善的库生态系统。
速度从何而来?
Crystal 使用 LLVM 基础架构生成快速轻量级的原生应用程序。我说的“快速”是指真的非常快。随便找一段你能找到的最快的 Go 代码,用 Crystal 编写的相同代码很可能至少能与之媲美,而且通常速度更快。用 Ruby 来衡量 Crystal 的性能毫无意义。
无需任何运行时框架或虚拟机。只需获取编译好的二进制文件即可部署。与部署和运行 Ruby 应用程序相比,这简直是天壤之别。
需要注意的是,这里存在一些需要注意的地方,我将在以后的博文中讨论。现在,我们只需知道,构建和分发与 Rust 一样简单。就速度而言,目前还没有任何语言能超越 Go 编译器,但我使用 Crystal 工具的体验到目前为止都非常愉快。
CSP风格的并发性
Go 语言的一大亮点在于其并发模型。goroutine 通过通道进行通信的理念源于 20 世纪 70 年代末提出的通信顺序进程(CSP)方法。Crystal 也采用了类似的方法。程序运行在被称为“纤程”(fiber)的单元中。主纤程可以生成任意数量的并发纤程,这些纤程通过阻塞通道发送和接收数据。
channel = Channel(Nil).new
spawn do
puts "Before send"
channel.send(nil)
puts "After send"
end
puts "Before receive"
channel.receive
puts "After receive"
为什么要在 2020 年重新发明 Ruby?
Crystal 的创建者显然并非有意通过创造一种新语言来改变编程世界。他们只是热爱 Ruby,并为放弃它而选择性能更高、类型更安全的替代方案感到惋惜。由于实现层面的一系列权衡,Ruby 的速度仍然比竞争对手慢,内存占用也更高。尽管 Rails 完美地满足了大部分 Web 用户的需求,但在其他应用场景下,其性能却落后于其他语言。
这一点说得有道理。Ruby 作为一种语言,拥有简洁优雅的语法。一旦掌握了基本的惯用法,编写 Ruby 代码便能带来纯粹的乐趣。Crystal 通过类型安全、原生速度和极其简单的并发模型,将这种乐趣提升到了更高的层次。
别误会,我也喜欢 Go 语言,正是因为它冗长且缺乏惯用语。在与他人合作开发大型项目时,为了透明度和代码可读性,我更倾向于采用更规范、更严格的流程。不同的语言服务于不同的目的,供不同的人群使用。关键在于了解何时使用哪种语言。
那么,Crystal值得一看吗?
当然!就算只是为了了解它的存在并关注它的发展,我也会去研究一下,并用它写几个应用程序。不过,Crystal 未来能否流行起来还很难说。正如前面提到的,它与 Ruby 的相似度高达 99%,速度也极快,这固然很好。然而,我感觉 Crystal 社区在提升其影响力方面缺乏动力。他们一直在努力推进 1.0 版本的发布,这是一个重要的里程碑,肯定会吸引很多新用户。据我了解,Crystal 语言及其工具集已经足够稳定,可以发布 1.0 版本了。
我知道 Crystal 没有 Google 或 Mozilla 的支持,也没有什么价值数十亿美元的应用案例可以展示在首页上。我也明白,与 Go、C/C++ 和 Rust 争夺同一市场是不公平的。然而,我也相信,选择一种技术而非另一种技术早已不再是零和博弈的时代了。它需要的只是一点推动力。
我希望一切顺利!
