Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crystal - Ruby 風シンタックスな静的言語の紹介 - (Long Talk 版)

Crystal - Ruby 風シンタックスな静的言語の紹介 - (Long Talk 版)

『 東京 Crystal 勉強会 #1 in 五反田 』 で発表した資料
http://crystal.connpass.com/event/17496/

プレゼン中で紹介している 『 crenv 』
https://github.com/pine613/crenv

Pine Mizune

July 31, 2015
Tweet

More Decks by Pine Mizune

Other Decks in Programming

Transcript

  1. 目次 • Crystal とは ? • Crystal の 5 つのコンセプト

    • Crystal の使い所 • Crystal の開発進捗
  2. Crystal とは? 3 Ruby の 表現力 を C の 速度

    で実現する 静的型付け言語
  3. Crystal とは? 4 Ruby ◦ 高い表現力 ◦ 高い生産性 × 遅い

    C 言語 ◦ 非常に高速 × 表現力が乏しい × 生産性が低い Crystal 同時に実現
  4. Crystal のコンセプト 5 1. Ruby 風シンタックス 2. 型推論による静的型付け 3. C

    言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力
  5. Ruby syntax 100.times do |x| if x % 15 ==

    0 puts ”fizzbuzz” elsif x % 3 == 0 puts ”fizz” elsif x % 5 == 0 puts “buzz” else puts x end end 8 Crystal syntax 100.times do |x| if x % 15 == 0 puts ”fizzbuzz” elsif x % 3 == 0 puts ”fizz” elsif x % 5 == 0 puts “buzz” else puts x end end 完全に一致
  6. Crystal syntax ≒ Ruby syntax 9 • ほとんど同じだって Matz も言ってる!!

    出展: https://twitter.com/yukihiro_matz/status/610842781091672064
  7. 12 Crystal syntax def add(a, b) return a + b

    end r = add(3, 5) puts r # => 8 Crystal syntax (型アノテーションあり) def add(a : Int, b : Int) : Int return a + b end r : Int = add(3, 5) puts r # => 8 明示的に書いても良い 型を明示的に書かなくて良い
  8. 13 puts 84.class # => Int32 puts true.class # =>

    Bool puts “str”.class # => String puts nil.class # => Nil puts /regexp/.class # => Regex puts [ 1, 2, 3 ].class # => Array(Int32) puts [ 84, nil ].class # => Array((Nil | Int32)) puts { :key => 1 } # => Hash(Symbol, Int32) 整数・実数型はビット数別 リテラルからの推論 組み合わせの型も静的に推論
  9. 16 Crystal -> C 言語 @[Link("m")] lib LibM fun acos(x

    : Float64) : Float64 fun floor(x : Float64) : Float64 end puts LibM.acos(-1.0) puts LibM.floor(LibM.acos(-1.0)) puts LibM.acos(-1.0).floor libm とリンクすることを指定 プロトタイプを指定 関数として呼び出し
  10. 19 無意識で使えるジェネリクス def generic_add(a, b) a + b end puts

    generic_add(3, 5) puts generic_add("foo", "bar") puts generic_add([ 1, 2, 3 ], [ 4, 5, 6 ]) 普通のただのメソッド 数値は当然足せる 配列も足せる
  11. 20 ジェネリクスで出力されたバイトコード 0000000000404a80 <*generic_add<Int32, Int32>:Int32>: 404a80: 01 f7 add %esi,%edi

    404a82: 89 f8 mov %edi,%eax 404a84: c3 retq 404a85: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 404a8c: 00 00 00 00 0000000000404ad0 <*generic_add<String, String>:String>: 404ad0: 50 push %rax 404ad1: e8 ba 29 00 00 callq 407490 <*String#+<String, String>:String> 404ad6: 5a pop %rdx 404ad7: c3 retq 404ad8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 404adf: 00 0000000000404ae0 <*generic_add<Array(Int32), Array(Int32)>:Array(Int32)>: 404ae0: 50 push %rax 404ae1: e8 4a 0c 00 00 callq 405730 <*Array(Int32)@Array(T)#+<Array(Int32), Array(Int32)>:Array(Int32)> 404ae6: 5a pop %rdx 404ae7: c3 retq 404ae8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 404aef: 00 整数演算の add 命令に メソッド呼び出しに変換
  12. 24 Crystal の実行速度 (1/2) 0 100 200 300 400 500

    C/C++ Crystal Go Node Ruby Python JSON Brainfuck Matmul 出展: https://github.com/kostya/benchmarks 秒
  13. 25 Crystal の実行速度 (2/2) 0 2 4 6 8 10

    12 14 C/C++ Crystal Rust Go D Node JSON Brainfuck Matmul 秒 出展: https://github.com/kostya/benchmarks
  14. Crystal のコンセプト [再掲] 26 1. Ruby 風シンタックス 2. 型推論による静的型付け 3.

    C 言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力
  15. Crystal の使い所 27 • 速度が求められる場所 – API 層、コア部分 • 既存

    Ruby プロジェクトの段階的移植 • Ruby エンジニアが多い環境での新規採用
  16. Crystal のコンセプト [再再掲] 29 1. Ruby 風シンタックス 2. 型推論による静的型付け 3.

    C 言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力
  17. • rbenv の Crystal 版 – 複数バージョンを共存させるツール • 簡単に Crystal

    を試せるのでぜひ • Star つけてください! – https://github.com/pine613/crenv 30 宣伝: crenv の紹介