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

842aaadff6e13fbf372c9b17b49b031c?s=128

Pine Mizune

July 31, 2015
Tweet

More Decks by Pine Mizune

Other Decks in Programming

Transcript

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

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

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

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

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

    言語との容易なバインディング 4. コンパイル時評価によるコード生成 5. 高速なネイティブコード出力
  6. 1. Ruby 風シンタックス 6 Ruby-inspired syntax.

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

  8. 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 完全に一致
  9. Crystal syntax ≒ Ruby syntax 9 • ほとんど同じだって Matz も言ってる!!

    出展: https://twitter.com/yukihiro_matz/status/610842781091672064
  10. 2. 型推論による静的型付け 10 Statically type-checked but without having to specify

    the type of variables or method arguments.
  11. 11 Crystal は静的型付け、だけど 変数・メソッドに 明示的に型は不要

  12. 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 明示的に書いても良い 型を明示的に書かなくて良い
  13. 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) 整数・実数型はビット数別 リテラルからの推論 組み合わせの型も静的に推論
  14. 3. C 言語との容易なバインディング 14 Be able to call C code

    by writing bindings to it in Crystal.
  15. 15 Crystal は 言語レベル で C 言語バインディングをサポート

  16. 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 とリンクすることを指定 プロトタイプを指定 関数として呼び出し
  17. 4. コンパイル時評価によるコード生成 17 Have compile-time evaluation and generation of code,

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

  19. 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 ]) 普通のただのメソッド 数値は当然足せる 配列も足せる
  20. 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 命令に メソッド呼び出しに変換
  21. power-assert がマクロで書ける!! 21 参考: https://github.com/rosylilly/power_assert.cr power-assert power-assert.cr

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

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

  24. 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 秒
  25. 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
  26. Crystal のコンセプト [再掲] 26 1. Ruby 風シンタックス 2. 型推論による静的型付け 3.

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

    Ruby プロジェクトの段階的移植 • Ruby エンジニアが多い環境での新規採用
  28. • セルフホスティングコンパイラ – ある仕様 FIX & 安定動作するフェーズ • 最新版: v0.7.5

    (2015/07/31) • 安定した開発 28 Crystal 開発進捗
  29. Crystal のコンセプト [再再掲] 29 1. Ruby 風シンタックス 2. 型推論による静的型付け 3.

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

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