新一代簡單易學的語言:Crysta

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.

新一代簡單易學的語言:Crysta

示例(使用埃拉托色尼篩選法計算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 #

對於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解決方案。


分享到:


相關文章: