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 #
對於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解決方案。
閱讀更多 GDCA數安時代 的文章