跳至内容
GitHub 代码库 论坛 RSS 新闻源

NeuraLegion 和 Crystal

NeuraLegion

这是一篇来自 NeuraLegion 团队的客座文章,讲述了他们使用 Crystal 进行生产的故事。我们要感谢他们抽出时间分享他们的经验,并邀请任何在生产环境中使用 Crystal 的其他公司或个人也分享他们的经验 - 如果你想分享,请联系 我们

NeuraLegion,我们已经使用 Crystal 有相当一段时间了。我们想在这篇简短的文章中分享我们的经验,从我们是如何发现 Crystal,爱上它,以及为什么我们决定将 Crystal 作为我们首选语言开始。

关于我们

在我们开始讲述关于 Crystal 的故事之前,让我们先介绍一下自己。我们是一家新兴的创业公司,热衷于通过机器学习和人工智能让世界变得更美好。我们目前专注于网络安全领域,这是我们日常生活中日益重要的一部分。

NexPloit 是我们的第一个产品(即将发布),它将通过人工智能的力量重新定义软件渗透测试。

为什么选择 Crystal?

抛开宏大的声明不谈,当我们开始开发我们的第一个产品时,我们已经是 Ruby 的长期粉丝。我们喜欢 Ruby,因为它默认是面向对象的,这使得它易于使用,它用途广泛并且拥有社区开发的丰富的库。此外,我们发现 Ruby 作为一种编程语言既美观又成熟。

然而,当我们撸起袖子开始构建 NexPloit 时,我们发现 Ruby 的一些固有特性并不能满足我们特定的需求。举几个例子:

  1. Ruby 不提供显式类型。这会带来几个影响,包括无法推断数据类型、性能和大小方面的惩罚以及数据必须经历的不必要的操作。对我们而言,效率是一个非常重要的问题。
  2. 为了解决之前的问题,通常使用 C 绑定。但是,它们可能非常难以实现。正如我们已经提到的,Ruby 没有显式类型。另一方面,C 是一种强类型语言,但在任何给定时间都必须有意识地知道要传递的确切类型可能有点令人生畏,并且可能需要尝试几次才能使其正常工作。
  3. undefined method for nil:NilClass。如果你之前使用过 Ruby,那么你不需要任何解释。如果没有,你可能会在其他动态的、非编译的语言中识别出这个错误,因为你试图调用一个方法来操作你认为是一个对象的东西——但在运行时它由于某种原因变成了 nil。缺点是,当在编译类型(或评估的其他阶段)中没有执行任何检查时,你只能在运行时完全调试程序。
  4. 当执行我们用 Ruby 编写的程序时,性能相当有限。

由于我们提到的这些原因以及其他一些原因,我们需要一种编程语言,它拥有 Ruby 的所有优点,但没有它的缺点。就在那时,我们发现了 Crystal,并且几乎立即爱上了它 ❤️。Crystal 流畅的编码体验、易于进行低级库绑定、编译时的类型安全性(无需执行程序),以及最后闪电般的运行时性能,给了我们所需的一切,让我们能够真正地点燃键盘!我们真诚地说,Crystal 为我们提供了优雅高效地将 NexPloit 从想法变为现实的工具。

如何让 Crystal 变得更好

现在让我们公平地说——我们喜欢 Crystal,但是总有改进的空间。我们在 Crystal 中遇到的挑战之一是缺少用于机器学习和科学工具的 shards(Crystal 的“gems”)。然而,期望其他人添加 shards 是不公平的,因此我们决定为 Crystal-FANN 创建一个 shard 作为我们需求的基础(我们在我们的 Github 页面上将其公开,供任何需要的人使用)。目前,Crystal-FANN 似乎很适合我们,但我们仍在考虑添加 Torch 或 TensorFlow,如果我们得出结论认为 FANN 本身不够用。

总结

你应该尝试 Crystal 吗?绝对应该!Crystal 是一种很棒的语言,它非常易于使用,并且能够产生良好的结果。我们绝对推荐 Crystal,试试它,你一定会喜欢它!

Crystal 与 Ruby - 免责声明

我们要指出,本文仅仅是我们个人关于为什么我们决定选择 Crystal 的经验和观点。我们仍然喜欢 Ruby,并且强烈推荐它给任何可能与我们有不同需求的人。Ruby 已经很成熟并且拥有一个强大的支持社区,这对编程初学者尤其有用。我们相信 Ruby 还有很多很棒的东西在未来等着我们。

以下是我们所看重的参数的对比:

Ruby Crystal
动态类型 静态类型
运行时的 Nil 引用错误 编译时的 Nil 引用错误检查
大量的现有库 相对较少的现有库
有限的运行时性能 快速的运行时性能
在虚拟机中运行 编译成原生代码

我们的网站

FANN 机器学习库