ルニラボ

lni_T の長文置き場

RubyKaigi2019 1日目 Matz keynote メモ

せっかくRubyKaigiきたのでまっつさんの基調講演のメモを記事化することに

rubykaigi.org

The Year of Concurrency

  • ruby3の話
  • 静的解析の話
  • 検討中の各種機能の話

Ruby

  • Ruby is Good
    • 生産性
    • 柔軟
    • 楽しい
  • Ruby is Bad
    • パフォーマンス
    • マルチコア活用
    • 大きなチーム/プロジェクト
  • でも... Big Sites Use Ruby

Rubyは十分に早いと言えるのではないか


  • Twitter Story
    • RoRのアプリだったが、RoRの得意とするCRUDでのデータ書き換えが向いていない製品だった
    • 限界に突き当たってScalaに乗り換えた
    • ずっとRuby1.8使ってた

  • Ruby1.9以降早くなってきた
  • Ruby2以降も徐々にパフォーマンス改善
  • Ruby3以降も改善していく

Static Typing(静的解析)

  • プロジェクトが大きくなるに従って

    • テストが苦痛に
    • テストが書きづらい
    • テストに時間がかかる
  • Matz「テストきらい テストはDRYではない」

    • でも人類はテストなしに正しくプログラムを書く方法を知らないのでテストが必要
  • モダンな言語はだいたい型の静的解析がついている

  • 古い言語も型を取り入れている
  • Rubyはどうするか?
    • Type Annotation? → NO
    • Matz「型宣言きらい DRYではない」

Static Type Checking

4つのモデルを取り込もうとしている

  • Type Definition Syntax(.rbi) 型定義ファイル
    • 引数の型
    • 戻り値の型
    • Class/Module
    • Interface
    • などを定義しておくファイル
  • Type Definitions for Libraries
  • Type Profiler
    • 抽象解釈 def foo(a) # a is int a + 2 # int has `+`: OK end foo(15) # fooを引数15で呼び出す
    • 機能
      • 型の情報を集める
      • rbiファイルに定義されている型情報と矛盾があればエラーとして検知する
      • rbiファイルを生成する
    • テストが不十分の場合うまく動作しない
    • yardファイルからrbiを作るツールを計画中
  • Static Type Checker(静的型チェック)
    • Sorbet from Stripe
      • C++で実装
      • rbiファイルからチェック
      • Fast
      • Nominal
      • DSLとして型情報を追加できる
    • Steep
      • Rubyで実装
      • 柔軟

rubyのプログラムをそのままに型チェックができるようになる。型宣言を書かなくても!

Performance

  • 言語に速すぎるということはない(だいたい文句付けられる)
  • メモリが最初のボトルネックになる
    • GCの改善が重要

メモリだけがボトルネックじゃない

  • CPU

    • JITコンパイラ
    • マルチコア
      • Webはマルチコアに向いてる
        • Unicorn Multi-Process
        • Puma MUlti-THread
        • Falcon Multi-Fiber
      • Thread / Fiber
        • 課題があるのでよりよいモデルが必要
      • そこでGuild!
        • Object Space Isolation(ギルド間のオブジェクトスペースを分離し)
        • Communication via Channnel(Guild間はチャンネルを使って通信する Immutableなもののみ受け渡し可能)
          • Number
          • Frozen Strings
          • Symbols
          • Deeply Frozen object
        • Deeply Frozen Objects
          • 参照しているオブジェクトがFrozenでない場合、そこを書き換えられると値が変わってしまう
          • 再帰的に全ての要素がFrozenである場合にのみ、Deeply Frozen Objectとしてマークする
  • I/O

    • Node.js
      • Singleスレッドだけど早い
      • Fast V8 VM
      • Non-Blocking IO
    • Autofiber

  • Concurrency is hard
    • スレッドを入れたことに後悔している
  • Guilds (Isolates)
  • AutoFiber (Async Whateverなにか...)

  • 他言語の並行性(Concurrency)

    • Go: goroutine
    • ELixir: processes
  • RubyはできないのでAdd-Onとして提供する

  • 我々に必要なのはよりよい名前

Ruby3.0

  • パフォーマンス
  • 並行性
  • 互換性
    • Guildという名前にゲーム業界から反発が出た
      • 「俺たちこのクラスつかってる!」

今後検討中の各機能

  • Frozen String Literals
    • 3.0では導入されない
  • Obsolete ? Literals
  • バッククォートで囲むとシェルで実行して返すやつ
    • 3.0では死なない
  • キーワード引数
    • 整理しようという話になっている
    • 唯一の大きな非互換
  • Numbered block parameter
    • [1,2,3].map{@1 *2}
      • 紛糾
  • パターンマッチ
    • 関数型言語に含まれているようなパターンマッチ
    • 今日2019/04/18 セッションがある
    • 昨日trunkにマージされた!

  • 我々は生き残らなければならない
    • 我々はRubyがすきだ!
    • 時代遅れになってほしくない
    • ユーザーに「新しいRubyを使ってよかった」と思ってほしい

来年の12月にRuby3.0がでることを本当に期待している!!!


所感

  • 毎回わかりやすくてエモい基調講演があるのでたすかる
  • 型宣言を書かずに別ファイルに型情報をもたせる ということで進んでるっぽい
    • 昔「Rubyに型を作ったとしてもサブセットにして、必須ではなくする」という話を聞いた記憶があるが、確かに型書かなくても動いてくれそう
  • 他機能について
    • 結局frozen_string_literalはいらんのかーい
    • キーワード引数は非推奨な書き方されてたらレビューで蹴れるように勉強しよ まあ2.7で警告が出るようになるらしいけども…
    • パターンマッチたのしそう(小並感)

f:id:lni_T:20190420010321p:plain
rubykaigi2019