从红宝石切换到水晶

2020-11-07 11:02:12

你爱鲁比吗?你是否希望有一个更好的Ruby版本,像C一样具有超快的性能?好了,你的祈祷已经应验了。让我向你介绍克里斯托。互联网称其为“像红宝石一样圆滑,像C一样快”。

自从Ruby编程语言问世以来,开发人员就一直喜欢它的简单性、专注于开发人员满意度和生产率。

Ruby(和Rails框架)在过去十年中催生了一些传奇的初创公司,包括Twitter、Github、Airbnb、Shopify、Soundcloud等等。

然而,Ruby的主要缺点是性能和可伸缩性。作为一种解释性语言,Ruby的性能不如C/C++、Rust和Go。

虽然并非不可能,但很难扩展Ruby on rails应用程序。此外,Ruby中缺少静态类型,这使得随着开发团队的发展很难重构代码。另一方面,Crystal拥有Ruby的所有优点,但没有缺点。

✔️Crystal拥有与Ruby类似的漂亮语法,✔️Crystal的性能与C相当,✔️Crystal支持原生C绑定、✔️静态类型以及用于元编程的强大宏。✔️Crystal拥有Rails和Sinatra之类的Web框架。

您将能够直接在Crystal Shell中编写Ruby代码,反之亦然。和Ruby一样,Crystal专注于让开发者开心和高效。Ruby开发人员对Crystal语法非常熟悉。以此为例(斐波纳契级数函数🌀):

此代码片段对于Ruby和Crystal都是相同的。由于语法相似,从一个迁移到另一个绝对是轻而易举的事。

安装Crystal和设置开发环境也非常简单。只需几个简单的命令,你就可以在任何Linux发行版或Mac上安装Crystal。请看这里的官方指南。不过,您需要安装Linux子系统才能在Windows上运行Crystal。我建议使用Ubuntu 18.04或更高版本。

在大多数基准测试中,Crystal的性能都好于Go、Python和Node.js。以下是将Crystal的性能与其他编程语言进行比较的几个链接:

Crystal构建在LLVM框架之上。这就是克里斯托火爆表演背后的秘密。LLVM与将C/C++代码编译为字节码的框架相同。

使用Crystal,您可以毫不费力地绑定到现有的C库和代码。这允许开发人员使用本机C库处理应用程序中的低级任务,从而进一步提高性能。

首先,我们可以使用GCC-c hello.c-o hello.o编译它,然后在Crystal脚本中调用它,如下所示:

Crystal的一个令人敬畏的特性是它的静态类型系统。它可以帮助开发人员在编译时捕获错误。Ruby和Python等动态类型语言允许开发人员轻松编写代码并快速交付功能。然而,随着时间的推移,随着我们的代码库和团队的增长,重构和维护这些代码变得越来越困难。

您可以用Crystal编写代码,就像任何动态类型的语言一样。在有歧义的情况下,编译器只会抱怨并要求您显式指定类型。

让我们来看看Crystal可用的Web框架。如果你喜欢Rails或Phoenix,那么你一定会喜欢Crystal的琥珀框架。

Amber是围绕着相同的Rails理念构建的(约定重于配置)。另一个很有前途的框架是Lucky,它的灵感也来自Rails。这两个框架都有令人惊叹的文档和热情的开发人员社区,他们积极为代码库做出贡献。

另一方面,如果你是Flask、Express.js(Node.js)和Sinatra等轻量级Web框架的粉丝,那么看看Kemal吧。还没被说服?

那么,让我们来看看这些Web框架的性能基准。与其他web框架相比,Crystal框架的性能非常好,Crystal框架的响应时间在亚毫秒级。

Crystal有一个强大的元编程宏系统。它可以用于一系列事情,如基本模板、AST检查、类型检查和运行任意外部程序。[来源:https://crystal-lang.org]。

以下面的代码片段为例。我们可以用这个简单的函数生成模块、类和结构:

宏DEFINE_CLASS(MODULE_NAME,CLASS_NAME,METHOD,CONTENT)模块{{MODULE_NAME}}CLASS{{CLASS_NAME}}def Initialize(@name:String)end def{{Method}}{{Content}}+@name end#这将生成:#MODULE FOO#class Bar#def Initialize(@name:String)#end##def say#";hi";+@name#end#end#endDefine_class Foo,Bar。P foo::Bar.new(";John&34;).Say#=>;&34;Hi John&34;

Crystal使用一种称为光纤的东西来实现并发性。纤程类似于操作系统线程,但重量较轻。执行由进程在内部管理。一个程序可以产生多个纤维,Crystal将高效地执行它们以优化性能。

纤维与围棋套路非常相似。下面是一个生成纤维的示例:

Crystal允许不同光纤之间的数据通信,而不必共享内存或担心锁定。Crystal通过通道做到了这一点,通道的灵感来自CSP(通信顺序进程)。

目前Crystal不支持并行性。然而,该团队正在努力将这一功能引入稳定版本。

如果您有好奇心,并且想要极客,请随意阅读有关并发模型的水晶文档。

如果你已经开发了一段时间的软件,你已经知道每一项技术都有它的局限性。Crystal的主要缺点是它是市场上的新手。许多人认为克里斯托及其生态系统还不成熟,还没有做好生产准备。

虽然这在某种程度上是正确的,但它也开启了你在适应这个闪亮的新工具方面走在前列的可能性。电动汽车初创企业尼古拉汽车公司正在生产中使用Crystal为他们的软件提供动力。你可以在这里读到他们的故事。

Crystal可用的库也有些有限。与Ruby的Gems或Node的NPM包相比,Crystal的可用库没有那么多。

最后,如果您试图构建一个利基产品并解决一个非常具体的问题,您可能找不到文档。例如,我试图用Crystal剥离一台GraphQL服务器。虽然Github中有一些很好的例子,但我找不到任何关于这个主题的适当文档或教程。

Crystal带来了Ruby的所有优点,但没有任何局限性。很容易从Ruby迁移到Crystal,反之亦然。Crystal速度快,拥有漂亮的类似Ruby的语法、静态类型和强大的功能,比如用于元编程的宏。然而,像所有技术一样,Crystal也有其自身的局限性。

Crystal的主要限制是它不像Ruby、Node或Python那样成熟。随着越来越多热情的开发人员支持Crystal,它可能用不了多久就会成为网络开发领域的下一个重要参与者。作为一名红宝石爱好者,我知道我正在密切关注Crystal的发展。

你经常来这里!我们希望你喜欢LogRocket博客。你能填一份关于你想让我们写些什么的调查问卷吗?

如果有的话,你认为哪一个会帮助你更有效地复制错误?一种解决方案,可以查看用户究竟做了什么来触发错误主动监控,从而更有效地自动发现具有支持团队分诊问题的问题。

谢谢!。想知道LogRocket如何改进您的漏洞修复过程吗?请留下您的电子邮件:

LogRocket是一个前端应用程序监控解决方案,它可以让您重现问题,就好像它们发生在您自己的浏览器中一样。LogRocket不是猜测错误发生的原因,也不是要求用户提供屏幕截图和日志转储,而是让你重播会话,快速了解哪里出了问题。它与任何应用程序完美兼容,无论框架如何,并且有插件可以记录Redux、Vuex和@ngrx/store的其他上下文。

除了记录Redux操作和状态之外,LogRocket还记录控制台日志、JavaScript错误、堆栈跟踪、带有标题+正文的网络请求/响应、浏览器元数据和自定义日志。它还利用DOM记录页面上的HTML和CSS,即使是最复杂的单页面应用程序也可以重新创建像素完美的视频。

免费试用一下。