crystal 编程语言_为什么Crystal是我2017年及以后最喜欢的编程语言

crystal 编程语言

如果您要问我经常联系我最喜欢的语言是什么的开发人员,我可以保证您会喊出一个响亮的“水晶!”。 原因很简单。 无论是Twitter,Telegram,Reddit还是博客,我总是分享对Crystal语言的热爱。 地狱,我再做一次。

现在,我选择的语言已经确立,但并不总是Crystal。 我从事Web和软件开发已有8年了,Crystal仍然是一种相当新的语言(甚至还不是Beta版)。 在过去的几年中,我一直是一名沉重JavaScript开发人员,但我还与Rust,D,C ++,Elixir,Nim和其他一些公司合作。 那么,即使Crystal仍在开发中,为什么Crystal仍将其作为我的最爱呢?

很好的回答是,如果您了解或至少已经了解Ruby语法,它将很有帮助。 我知道这是一个有争议的话题,但是我实际上发现Ruby语法非常漂亮。 我的意思是看一下这段代码,并告诉我,您不仅会坠入爱河。

class SimpleClass
def say_hello(name)
puts "Hello, #{name}"
end
end
simple_class = SimpleClass.new
simple_class.say_hello("World") # => Hello, World

Crystal与Ruby共享相同的基本语法,这是我非常喜欢它的第一个原因。 实际上,上面的Ruby代码也是完全有效的Crystal代码。 头脑被炸了吗? 没有? 好吧,让我们继续。

水晶编译

这是Crystal和Ruby之间的第一个巨大区别。 Crystal是一种编译语言,这意味着在编译时会捕获许多错误,然后才可能导致生产中的问题。 当然,这需要一个小的“发展速度”权衡,但从长远来看会有所回报。 这也意味着您可以构建和发布二进制文件,而不必部署整个代码存储库。 对于可能只有10或20 GB存储空间的VPS的人们来说,这非常好。

当然,编译也有其缺点。 解释性语言的编写和测试速度非常快,因为您不必每次进行更改都等待编译代码。 在元编程或编写可编写和修改代码的代码方面,Ruby也是一种非常高级的语言。 这意味着可以随时更改Ruby代码,可以基于不断变化的数据生成方法,等等。对于Crystal而言,情况并非如此,主要出于安全原因。 当编译语言在运行时改变自身时,它将失去许多使编译语言变得很棒的安全功能。

水晶是静态类型的

这是Crystal的最佳功能之一。 大多数所有语言都有某种基本类型系统。 甚至JavaScript都具有基本类型,包括数字,字符串,对象,数组等。但是,许多语言不强制执行类型或提供任何类型的类型检查。 JavaScript,Ruby,Python和PHP就是这种方式(我知道我会得到有关Python和PHP实际上具有类型的注释,但实际上并没有。至少在程度上与真正的类型化语言不同)

Crystal可以在很多时间推断类型,这就是为什么此代码

def str_concat(str1, str1)
str1 + str2
end
puts str_concat("Hello, ", "World")

即使没有任何类型信息也可以工作。 当然,此代码也适用于整数或可以使用+运算符加在一起的任何其他值。 因此,我们可以轻松地将类型定义添加到我们的代码中。

def str_concat(str1 : String, str1 : String)
str1 + str2
end
puts str_concat("Hello, ", "World")
puts str_concat(1, 5) # => Throws an exception

现在, str_concat方法仅适用于字符串。

Crystal还支持联合类型。 这些基本上是组合类型,这意味着某种东西可以是A型或B型。这是一个示例。

alias Num = Int32 | Int64 | Float64
def sum(num1 : Num, num2 : Num)
num1 + num2
end
puts sum(3, 4)       # => 7_i32
puts sum(4, 9.25) # => 13.25_f64
puts sum(7, "eight") # => Exception

水晶有宏

还记得我之前提到的元编程吗? 实际上,Crystal确实也允许这样做,但只能在编译时进行。 Crystal通过称为宏的特殊方法来执行此操作。 宏可以是一些令人困惑的话题,但与一点点知识,了解如何编程语言工作,我认为他们可以很容易理解。

大多数编程语言都具有称为标记器(或词法分析器)和解析器的功能。 分词器负责获取代码的原始文本表示形式并将其转换为“令牌”。 这些标记代表从字符串到标识符(定义,类,模块等)再到数字的所有内容,通常包括基本信息,例如找到标记的行和列。 然后,解析器将这些标记转换为AST(抽象语法树)。 该树包含代表类,模块,方法等的节点。

这是一个非常基本的定义,可能有些瑕疵,但可以满足我们的目的。 宏在AST创建阶段进行扩展,并在创建AST时实际对其进行修改。 这意味着您可以动态地(在编译时)添加方法,创建和修改类等。与Nim和Rust相比,Crystal的宏系统是非常基本的(具有极其混乱的宏),但它仍然很有帮助。 这是一个简单的宏的示例。

# This is an anti-pattern in Crystal, but I do it anyway sometimes
macro alias_method(new_name, existing_method)
def {{ new_name.id }}(*args, **kwargs)
{{ existing_method.id }}(*args, **kwargs)
end
end
def send_tweet(message)
# Do something
end
alias_method :tweet, :send_tweet
tweet("Hello, world")

基本上, alias_method宏仅采用一个新方法名称和一个现有方法的名称,并创建一个复制现有方法的方法。 Ruby可以使用alias来做到这一点,但是由于它被视为反模式,因此Crystal开发人员并未将其包含在语言本身中。

水晶快

如您所见,Crystal已经为此付出了很多。 它很漂亮,经过编译,静态类型化,具有元编程功能,接下来可能是什么? 好吧,如果我告诉您Crystal也几乎与C一样快?

我知道这听起来令人难以置信。 我的意思是说美丽的语言不能很快吗? 在发展世界中总是存在着权衡取舍。 确实是这样。 至少,Crystal很容易比Ruby快100倍(不是在开玩笑)。 只是看看基准

速度当然不是全部,但不必担心它确实很不错。

我不喜欢什么

使用Crystal会有一些弊端,尤其是在尚处于开发阶段时。 第一个是Windows兼容性基本上不存在。 您可以在WSL(适用于Linux的Windows子系统)中下载并运行Crystal,但这不如本机兼容性。 现在,它正在开发中 ,但是并不是最重要的事情,因此开发速度很慢。

由于它是较新的,因此开发工具确实还不存在。 在名为Scry的Crystal语言服务器上已经取得了长足的进步,但是,由于缺乏专职开发人员,导致类似的项目再次花费了很长时间才能完成。 也有正在开发的Atom和VSCode插件。

最后是沟通问题。 这个问题已经解决了好几次了,值得赞扬的是,最近几个月,核心开发人员的工作做得更好,但是与沟通一直以来都是Crystal项目的一个小问题。 Crystal由阿根廷的Manas Tech公司开发和资助。 他们不是像Google或Microsoft这样的大公司,因此无法为开发投入数十万美元。 因此,Manas慷慨解囊地将开发Crystal所花费的时间捐赠给了社区,有时其他项目也被优先考虑。

重点是,Crystal是一种很棒的语言,您绝对应该尝试一下。 我将继续传播福音,并希望其他人也能照做。 如果您愿意,可以访问我的GitHub存储库,并查看我的一些项目(其中很多都是Crystal的惊喜,惊喜)。

编码愉快!

翻译自: https://hackernoon.com/why-crystal-is-my-favorite-programming-language-of-2017-and-beyond-ee733224e6f2

crystal 编程语言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值