Slide 1

Slide 1 text

Crystal Ruby 風シンタックスな静的言語の紹介 Mobile Factory, Inc 水音ぴね

Slide 2

Slide 2 text

目次 • Crystal とは ? • Crystal の 5 つのコンセプト • Crystal の使い所 • Crystal の開発進捗

Slide 3

Slide 3 text

Crystal とは? 3 Ruby の 表現力 を C の 速度 で実現する 静的型付け言語

Slide 4

Slide 4 text

Crystal とは? 4 Ruby ○ 高い表現力 ○ 高い生産性 × 遅い C 言語 ○ 非常に高速 × 表現力が乏しい × 生産性が低い Crystal 同時に実現

Slide 5

Slide 5 text

Crystal のコンセプト 5 1. Ruby 風シンタックス 2. 型推論による静的型付け 3. C 言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力

Slide 6

Slide 6 text

1. Ruby 風シンタックス 6 Ruby-inspired syntax.

Slide 7

Slide 7 text

7 Crystal のシンタックスは Ruby とほぼ 等しい

Slide 8

Slide 8 text

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 完全に一致

Slide 9

Slide 9 text

Crystal syntax ≒ Ruby syntax 9 • ほとんど同じだって Matz も言ってる!! 出展: https://twitter.com/yukihiro_matz/status/610842781091672064

Slide 10

Slide 10 text

2. 型推論による静的型付け 10 Statically type-checked but without having to specify the type of variables or method arguments.

Slide 11

Slide 11 text

11 Crystal は静的型付け、だけど 変数・メソッドに 明示的に型は不要

Slide 12

Slide 12 text

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 明示的に書いても良い 型を明示的に書かなくて良い

Slide 13

Slide 13 text

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) 整数・実数型はビット数別 リテラルからの推論 組み合わせの型も静的に推論

Slide 14

Slide 14 text

3. C 言語との容易なバインディング 14 Be able to call C code by writing bindings to it in Crystal.

Slide 15

Slide 15 text

15 Crystal は 言語レベル で C 言語バインディングをサポート

Slide 16

Slide 16 text

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 とリンクすることを指定 プロトタイプを指定 関数として呼び出し

Slide 17

Slide 17 text

4. コンパイル時評価によるコード生成 17 Have compile-time evaluation and generation of code, to avoid boilerplate code.

Slide 18

Slide 18 text

18 ジェネリクス と マクロ で Crystal は同じ処理を 繰り返し書く必要がない

Slide 19

Slide 19 text

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 ]) 普通のただのメソッド 数値は当然足せる 配列も足せる

Slide 20

Slide 20 text

20 ジェネリクスで出力されたバイトコード 0000000000404a80 <*generic_add: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>: 404ad0: 50 push %rax 404ad1: e8 ba 29 00 00 callq 407490 <*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)>: 404ae0: 50 push %rax 404ae1: e8 4a 0c 00 00 callq 405730 <*Array(Int32)@Array(T)#+: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 命令に メソッド呼び出しに変換

Slide 21

Slide 21 text

power-assert がマクロで書ける!! 21 参考: https://github.com/rosylilly/power_assert.cr power-assert power-assert.cr

Slide 22

Slide 22 text

5. 高速なネイティブコード出力 22 Compile to efficient native code.

Slide 23

Slide 23 text

23 Crystal は C 言語と 同等速度 の ネイティブコードを出力

Slide 24

Slide 24 text

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 秒

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Crystal のコンセプト [再掲] 26 1. Ruby 風シンタックス 2. 型推論による静的型付け 3. C 言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力

Slide 27

Slide 27 text

Crystal の使い所 27 • 速度が求められる場所 – API 層、コア部分 • 既存 Ruby プロジェクトの段階的移植 • Ruby エンジニアが多い環境での新規採用

Slide 28

Slide 28 text

• セルフホスティングコンパイラ – ある仕様 FIX & 安定動作するフェーズ • 最新版: v0.7.5 (2015/07/31) • 安定した開発 28 Crystal 開発進捗

Slide 29

Slide 29 text

Crystal のコンセプト [再再掲] 29 1. Ruby 風シンタックス 2. 型推論による静的型付け 3. C 言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力

Slide 30

Slide 30 text

• rbenv の Crystal 版 – 複数バージョンを共存させるツール • 簡単に Crystal を試せるのでぜひ • Star つけてください! – https://github.com/pine613/crenv 30 宣伝: crenv の紹介

Slide 31

Slide 31 text

Fin.