幸ログ

ナレッジを溜めていきます

Crystalを触ってみた

なぜ??

基本Rubyで開発している私ですが、なにかそろそろ新しいものに触ってみたいなと思い、
Speaker Deckでサーフィンしていたところ...
Crystalという言語を発見!!
キッカケとなったスライドはこちら

speakerdeck.com

なんか流行りに乗れるんじゃないかと思い、
すぐに仮想サーバで環境構築をしました。

Crystalとは

Ruby風の文法を持ち、高速に動作する言語です。
RubyのいいところとCのいいところ混ぜつつ、
悪いところを改善した言語となっているそうです。
Rubyスクリプト言語に対して、
Crystalはコンパイル言語です。
詳しくは下記のリンクへ

Crystal

インストール

インストール方法
Installation | Crystal Programming Language

環境

vagrant 1.8.1
Cent OS 7

リポジトリの追加

$ curl http://dist.crystal-lang.org/rpm/setup.sh | sudo bash

Crystalをインストール

$ sudo yum install crystal

実践

# hello.cr
puts "Hello world!"
$ crystal  hello.cr
Hello world!
$ crystal build hello.cr
$ ./hello
Hello world!

誰もが通る道 Hello World!!! これができたらCrystalの環境は構築できています。

試しにFizz Buzz問題を書いてみます。

# fizzbuzz.cr
class FizzBuzz
  def self.fizzbuzz(from, to)
    (from..to).reject do |num|
      if num % 15 == 0
        puts "FizzBuzz"
      elsif num % 5 == 0
        puts "Buzz"
      elsif num % 3 == 0
        puts "Fizz"
      else
        puts num
      end
    end
  end
end

FizzBuzz.fizzbuzz(1, 100)
$ crystal fizzbuzz.cr
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzzl
.
.
.
Buzz
Fizz
97
98
Fizz
Buzz

まるっきりRubyですね!!!
ただRubyのコードがそのまま使えるわけではないですね。
属性の宣言などが変わっていて、そのままコピペすると痛い目に合います。
本当は型宣言があるんですけど、
まだ勉強不足で書けないです...

ベンチマーク

高速で動作をすることが売りのため、 測ってみます。 以下のコードを使います

def fib(n)
  if n < 2
    n
  else
    fib(n-1) + fib(n -2)
  end
end

puts fib(20)
$ time ruby fib.rb
6765

real    0m0.049s
user    0m0.036s
sys 0m0.012s

$ time crystal fib.cr
6765

real    0m1.195s
user    0m0.446s
sys 0m0.552s

$ crystal build fib.cr
$ ./fib
6765

real    0m0.003s
user    0m0.000s
sys 0m0.002s

こんな結果になりました。