我为什么要从 Python 转向 Crystal 语言

自 2011 年以来,我一直是 Python 的重度用户和爱好者。当时,一位好朋友建议我抛弃 Perl(eeek)并尝试使用 Python 时,一个全新的世界向我敞开了大门。 这个世界的可读性高于其他所有语言,并且明确统一样式。

在使用 Python 大约7年之后,尽管我还和当时有一样的热情,但是,随着时间的推移,人们也在寻找新的冒险和挑战。 现在是我是该尝试另一种语言的时候了!

Python 的问题

首先,列举我在 Python 中遇到的一些问题:

进一步来说,我不确定我真的喜爱 Python 在几个领域的发展方向,尤其是在异步和类型方面。

我应该说明我仍然是 Python 的忠实粉丝和支持者,而且认为它仍然是当前最好的解释型语言之一;特别是当你考虑到它惊人的生态系统和成熟度。

我在寻找什么

我的出发点是 Python 和 Ruby 。 我经常在需要的地方使用 Ruby ,也非常喜欢它。 Ruby 解决了 Python 所具有的几个问题(适当的私有/受保护的属性,较少冗长的语法等等),但仍然存在性能问题,并且缺少静态类型。

因此,我开始寻找具有以下特点的新语言:

候选项

下列语言被排除在外

我真正感兴趣并希望在未来进一步研究的语言有:

但是,最终,我决定致力于学习 Crystal !

原因如下:

注意事项

Crystal 是一个非常年轻的语言,仍然没有发布 1.0 版本。它通常会在版本中引入重大更改并且限制库。

不过,我打算仅在我的个人项目中使用这种语言,并且愿意成为早期使用者,因为我觉得这种语言有足够的前景值得使用。

经验

标准库

整个标准库非常容易阅读,我一直在引用它。库似乎也有一定的广泛性,是一个很好的基础教程。

以下是添加数组的示例:

这里是获取文件扩展名的函数:

如果你选择尝试 Crystal ,请确保让它的源码待在你身边; 它非常有价值和有用。

绑定到 C 库

这真的太神奇了!

下面是一个绑定从 Unix 系统获取用户信息的各种函数的例子:

异常处理

类似的异常处理提供给 Puby 和 Python :

写你自己的异常很简单;只需要集成 Exception 类。

导入系统和命名空间

这是来自 Python 的一些调整,但是因为 Ruby 遵循类似 C++ 的方法,把我带回到了 C++ 时代。

C++ 命名空间等同于你可以自定义 Ruby/Crystal 模块。要求任何库将导入它定义的所有项目,因此它总是完美的保证了你的整个库包含在模块中,以此来避免命名空间污染。

起初我还有点担心,但我发现它可以从任意数量的文件中轻松建立一个模块。然而,我得承认,找到事物的来源更像是一种挑战。

我最喜欢的有关 Crystal 的部分是它如何处理实例变量的赋值:

这将创建一个构造函数,它将自动用所提供的参数赋值给实例变量。Python 中的等价代码是:

虽然这涉及个人喜好,但我也非常喜欢 Ruby/Crystal 中 end 语句和两个空格缩进的对称性。我觉得它最终使得代码阅读起来更美观而优雅。

当然,我们也有适当的 protected 和 private 成员以及抽象类;这两个功能是我从我的 C ++ 时代就已经错过的。

文档

我非常喜欢 Crystal 的文档。阅读它是如此的愉悦。但与任何新的语言一样,它可能是如其预期的那么全面。

所提供的主要两个文档是:

另一个不错的有用资源是 Gitter 上的 Crystal chatroom 。该频道的每个人都非常热心和乐于助人。到目前为止,他们一直是我探索旅程中的重要信息来源。

性能

虽然现在确定性能增益还为时过早,但做个 Fibonacci 测试总是很有趣的:)

Ruby/Crystal

Python

C

用 -O3 编译以获得最佳性能。

C++

用 -O3 编译以获得最佳性能。

Go

结果

总结

尽管现在是我和 Crystal 的相处早期,我仍旧乐观地希望 Crystal 能尽快成为很多产品的选择。我想 Crystal 能像 Python 和 Ruby 一样顺其自然的发展。

在不久的将来,留心那些关于 Crystal 的帖子,它们将包含我的技巧与诀窍。