$30 off During Our Annual Pro Sale. View Details »

最速で最速のRuby擴張を作る

 最速で最速のRuby擴張を作る

さっちゃん

March 23, 2017
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

  1. 最速で最速の
    Ruby擴張を作る

    View Slide

  2. .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

    View Slide

  3. Ruby

    View Slide

  4. Ruby
    最速で開發出來る⾔語

    View Slide

  5. View Slide

  6. Crystal

    View Slide

  7. Crystal
    LLVMでcompile出來るRuby-likeな⾔語

    View Slide

  8. Crystal
    LLVMでcompile出來るRuby-likeな⾔語
    Ruby-likeなsyntax
    型推論
    macroによるDSL
    Cのlibをそのまま使へる
    → 最速の開發

    View Slide

  9. Crystal
    LLVMでcompile出來るRuby-likeな⾔語
    型による最適化
    LLVMによる最適化
    macroによるcompile時計算
    Cのlibをover head無く使へる
    → 最速の實⾏

    View Slide

  10. Rubyの實⾏速度が遅い

    View Slide

  11. Rubyの實⾏速度が遅い

    Cで擴張を作る

    View Slide

  12. Rubyの實⾏速度が遅い

    Cで擴張を作る

    實⾏速度は速く成ったが
    開發速度が遅く成った

    View Slide

  13. Rubyのeco systemに頼りながら
    開發速度を落とさず
    遲い部分をCrystalで速く出來ないだらうか

    View Slide

  14. 既存の試み
    manastech/crystal_ruby
    頑張る前に放棄されてゐる
    全然使へない
    動かない
    phoffer/crystalized_ruby
    頑張った跡
    rb_define_module_function等を⼿動で呼ばなければならない
    もう動かない

    View Slide

  15. ♥ Ruby meets Crystal ♥
    ne-sachirou/sample_ruby_extension_in_crystal

    View Slide

  16. ne-sachirou/sample_ruby_extension_in_crystal
    ruby hello_cr,
    def hello_cr : Nil
    puts "Hello, World!”
    end
    hello_cr

    View Slide

  17. ne-sachirou/sample_ruby_extension_in_crystal
    ruby Fib,
    module Fib
    def self.fib_cr(n : Int32) : Int32
    (1..n-1).reduce([1,1]){|ns|[ns[1],ns[0]+ns[1]]}[1]
    end
    end
    p Fib.fib_cr

    View Slide

  18. ne-sachirou/sample_ruby_extension_in_crystal
    Benchmark
    同じalgorithmで、fibonacci數列の31番⽬を100万回計算する
    def self.fib_rb(n)
    ns = [1, 1]
    i = 1
    while i < n
    ns0 = ns[0]
    ns[0] = ns[1]
    ns[1] = ns0 + ns[1]
    i += 1
    end
    ns[1]
    end

    View Slide

  19. ne-sachirou/sample_ruby_extension_in_crystal
    Benchmark
    同じalgorithmで、fibonacci數列の31番⽬を100万回計算する
    C 0.1秒

    View Slide

  20. ne-sachirou/sample_ruby_extension_in_crystal
    Benchmark
    同じalgorithmで、fibonacci數列の31番⽬を100万回計算する
    C 0.1秒
    Ruby 3.0秒

    View Slide

  21. ne-sachirou/sample_ruby_extension_in_crystal
    Benchmark
    同じalgorithmで、fibonacci數列の31番⽬を100万回計算する
    C 0.1秒
    Ruby 3.0秒
    Crystal 0.2秒

    View Slide

  22. ne-sachirou/sample_ruby_extension_in_crystal
    macro ruby(name, code)
    {{ code }}
    {% if code.class_name == "Def" %}
    Ruby.ruby_def {{ name }}, {{ code }}
    {% elsif code.class_name == "ModuleDef" %}
    Ruby.ruby_module_def {{ name }}, {{ code }}
    {% end %}
    end
    LLVMで速いbinaryを作る
    ⾃動でRubyにmodule/methodを登録する
    `rake compile`

    View Slide

  23. ne-sachirou/sample_ruby_extension_in_crystal
    gem化をマテ!

    View Slide