新一代简单易学的语言:Crystal

Crystal是一个非常年轻的语言,是一门基于 LLVM 的可编译的语言,它整个设计尽可能的接近 Ruby 的体验,语法、各种标准库的接口都几乎和 Ruby 一样(兼容不是它的目标),但又有 C 一样的性能(官方给出的某些测试数据表明)。

特性:

语法类似 Ruby Ruby-inspired syntax.

无需指定变量类型和方法参数类型 Never have to specify the type of a variable or method argument.

可以调用 C 代码 Be able to call C code by writing bindings to it in Crystal.

编译时代码模拟和生成 Have compile-time evaluation and generation of code, to avoid boilerplate code.

编译成高效的本机代码 Compile to efficient native code.

示例(使用埃拉托色尼筛选法计算100以内的素数和的Crystal代码如下):

Crystal代码

max = 100

sieve = Array.new(max, true)

sieve[0] = false

(2...max).each do |i|

if sieve[i]

(2 * i).step(max - 1, i) do |j|

sieve[j] = false

end

end

end

sieve.each_with_index do |prime, number|

puts number if prime

end

Crystal的Hello World:

Crystal代码

puts "Hello World"

你也可以使用面向对象方法:

Crystal代码

class Greeter

def initialize(name)

@name = name.capitalize

end

def salute

puts "Hello #{@name}!"

end

end

g = Greeter.new("world")

g.salute

或者使用块:

Crystal代码

"Hello World".each_char do |char|

print char

end

print '\n'

Ruby-ists使用Crystal的五大理由

1.极低的学习曲线

过去流行的语言有Elixir,Go,Rust,它们都比Ruby有性能优势,但更难以学习和掌握。

而Crystal却是更容易的学习曲线,获得性能增益。

多么容易?我们来看看一些代码。

问:下列哪些模块是用Ruby编写的?哪些在Crystal?

module Year

def self.leap?(year)

year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)

end

end

module Hamming

def self.distance(a,b)

a.chars.zip(b.chars).count{|first, second| first != second }

end

end

上述模块将以Ruby或Crystal工作。

但这并不意味着所有的Ruby代码都可以在Crystal中使用(反之亦然),但是可以通过Crystal做很多事情,高效工作。

Crystal(强类型和编译语言)如何像Ruby(一种动态和鸭型语言)一样?Crystal的编译器使用两种强大技术的组合:类型推断和联合类型。这允许编译器读取类似ruby的代码并找出(推断)要使用的正确类型。

除了相似点之外,Crystal提供了比Ruby更多的核心优势。

2.编译时间检查和方法重载

Crystal是一种编译语言,在编译时检查所有的方法输入和输出。如果任何类型不匹配,它们将在运行前被捕获。

上面的例子。在Ruby中,当输入不是整数时会发生什么?

Year.leap?("2016") #=> false

Year.leap?(Date.new(2016, 1, 1)) #=> undefined method `%' for #<Date: 2016-01-01 ... >

对于String得到的错误答案,Date得到一个运行时异常。修复Ruby中的东西至少需要一条语句:

module Year

def self.leap?(input)

if input.is_a? Integer

input % 400 == 0 || (input % 100 != 0 && input % 4 == 0)

elsif input.is_a? Date

input.leap?

else

raise ArgumentError.new("must pass an Integer or Date.")

end

end

end

在Crystal中,我们可以选择显式输入输入(和输出)。我们可以改变方法签名self.leap?(year : Int),我们保证有一个整数作为输入。

我们在编译时得到有用的消息,而不是运行时:

Year.leap?("2016")

Error in line 10: no overload matches 'Year.leap?' with type String

Overloads are:

- Year.leap?(year : Int)

如果在模块中添加对Ruby的支持Time(DateTime我们可以考虑使用Ruby),那么可以重载Year::leap?:

module Year

def self.leap?(year : Int)

year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)

end

def self.leap?(time : Time)

self.leap?(time.year)

end

end

像Ruby一样,方法重载允许输入的灵活性,但没有鸭子输入的猜测。编译时间检查防止类型不匹配错误导致生产失败。

3.快速的表现

编译的另一个优点是速度和优化。通常,比较Ruby和Crystal的性能时,可以用数量级而不是百分比来表示。

在一个例子中,将Crystal中的随机数加起来可以比Ruby 快10个数量级(约快37%)。这是由于编译器优化以及在Crystal中使用原始数据类型的能力。这确实伴随着大数字整数溢出的风险(参见Ary的解释)。

基准测试中, Crystal内置的HTTP服务器每秒能够处理超过200万个请求。许多Web框架一直为Web应用程序提供亚毫秒级的响应时间。

4.想要的网页框架已经在这里

你想要一个完整的框架,利用编译时间检查强参数,HTTP动词和数据库查询吗?

1月份,这些Web框架中的每一个都将在他们自己的专门帖子中突出显示。查看Crystal的博客,了解更多信息。

5.Crystal是用Crystal书写的!很容易理解并对语言做出贡献

Ruby的实现 Enumerable#all?

static VALUE

enum_all(int argc, VALUE *argv, VALUE obj)

{

struct MEMO *memo = MEMO_ENUM_NEW(Qtrue);

rb_block_call(obj, id_each, 0, 0, ENUMFUNC(all), (VALUE)memo);

return memo->v1;

}

需要多长时间才能弄清楚代码在做什么?如果从未使用过C代码,那可能是很长时间的。

与Crystal的实现相比Enumerable#all?

def all?

each { |e| return false unless yield e }

true

end

需要多长时间才能弄清楚?如果知道Ruby或Crystal,可能只需几秒钟。

考虑到这一点,考虑到98.4%的Crystal是用Crystal编写的,只有0.3%是用C ++编写的。

Ruby在C语言中占30.6%,在Ruby中占64.8%。

事实上,Crystal中只有一个文件是用C ++编写的,所以只要不改变LLVM扩展,无论在Crystal语言中寻找什么,都可以保证用Crystal写入。

————————————————————————————

SSL证书是HTTP明文协议升级HTTPS加密协议的重要渠道,是网络安全传输的加密通道。关于更多SSL证书的资讯,请关注数安时代(GDCA)。GDCA致力于网络信息安全,已通过WebTrust 的国际认证,是全球可信任的证书签发机构。GDCA专业技术团队将根据用户具体情况为其提供最优的产品选择建议,并针对不同的应用或服务器要求提供专业对应的HTTPS解决方案。


猜你喜欢

转载自blog.csdn.net/trustauth/article/details/80746073