プログラミング言語の動向に詳しい方ならば「Crystal」言語の名前を聞いたことがあるかもしれません。Rubyと互換性の高いシンタックスを採用し、コンパイラによる型チェックや高速実行が可能な利点を持っています。
このCrystal公式ブログに「Top 5 Reasons for Ruby-ists to Use Crystal(Ruby開発者がCrystalを使うべき5つの理由)」という興味深い情報が公開されています。
特にRuby開発者ならばチェックしておいて損がない情報といえるかもしれません。
非常に低い学習曲線
CrystalはRubyと互換性の高いシンタックスを採用しており習得が容易。
例えば以下のコードはRuby/Crystalどちらでも動作する。
module Year def self.leap?(year) year % 400 == 0 || (year % 100 != 0 && year % 4 == 0) end end
完全な互換性があるわけではないが、Rubyの経験があればすぐに実践に導入可能。
コンパイル時のチェックとメソッドオーバーローディング
Crystal言語では入力と出力の型がコンパイル時にチェックされる。
メソッドに引数の型を指定してオーバーロードすることも可能。
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
極めて高速
コンパイルによるその他の利点として速度と最適化がある。乱数生成のサンプルでは10桁の規模でCrystalがRubyより高速。組み込みのHTTPサーバーは200万リクエストを一秒間に処理できる。
Webフレームワークもすでに存在
Railsのような統合フレームワークとしてはAmberが、Sinatraのようなカスタマイズ性が好みならばKemalがある。
コンパイル時の型チェックやHTTPメソッド、データベースクエリなどを実装したフルスタックフレームワークLuckyも存在。
CrystalはCrystalで書ける
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; }
Crystalは以下の通りシンプルだ。
def all? each { |e| return false unless yield e } true end
Rubyは30.6%がCで64.8%がRubyで書かれているのに対し、Crystalは0.3%がC++で98.4%がCrystalで書かれている。
まとめ
CrystalはRuby開発者に馴染みやすい文法を採用しているのに加え、コンパイラによる型チェックや高速動作など優れた特徴をいくつか持っています。
TIOBE Index for January 2018では、まだ50位以内に入っていないプログラミング言語ですが(51〜100位のNext 50には選ばれています)、今後の発展に期待できそうです。