はじめに
RubyKaigi 2022に参加してきましたのでそのレポートです。
Keynote Ruby meets WebAssembly
Rubyの良さ
- 書いていて楽しい
- 何でも作れる
- エコシステムが成熟している
Rubyの難しさ
- Ruby interpreterが必要になる
- ちょっとしたプログラムでサーバで動かしたくない
- RubyのInstall buttleがあり、環境によって動かない
この難しさを解消するには??
- 選択肢としてはWeb Assemblyがある
- プログラムのゲームチェンジャー
- Webブラウザでプログラムを動かせる
- 外部の信頼できるプログラムであること
- ブラウザはどこでもあるからRubyはどこでも動く
- ブラウザ上で動けば環境構築で躓くことは少ない
Execution Flow of WebAssembly
Demo
Rubyがブラウザで動く!!
JSとRubyが共存できる
example
<script type='text/ruby'> document = JS.document[:hoge] </script>
How WebAssembly works??
WASI (WebAssembly Sxxxx Interface )
様々な言語で動き急速に対応言語が拡大している
Demo 2
Rubyがedge computeで動く!
つまり
AsyncifyによってCRubyが動くようになった
できないこと
- Thread APIがまだ動かない
- WASI自体のThread APIが未定義のため
Not Implemented Error
になる
- C Libraryがまだリンクしていない
- まだサポートしていない
バイナリサイズ
8MB ~ 25MB
どのくらい早いの?
Opalが一番はやい、mrubyは、、、
試せるの?
https://irb-wasm.vercel.app/ でかんたんに動かせる!!
Making MaNy threads on Ruby
何の話?
- RubyにMNスレッドをつくるという話
- MaNy Project
- RubyにManyスレッドを実現する(>100K)
- 結局Golangみたいなものができた
例えば
CPUが3つあったときに、1つ1つRubyが取り合いになる (Ruby ~ 1.8 1:N)
Ruby 1.9 ~ 1:1
Golang M:N
つまりM:Nはいい感じらしい
Rubyはまだだが
Golang gorutine, Rust, Java の機能提案がある
RactorはRactor間のスレッドは同時に処理できる
純粋なRubyはスレッドを単純に使うとボトルネックがある
Blocking Operationはどうするの?(RDB connectとか)
そもそも止まってしまう処理がある
- Sleeping
- I/O Read
- RDB connect
課題
- 互換性があるかどうか
- C Extensionで最初から1:1で組まれている機能
- そもそもそれは Dedicated Native Thread (DNT, ロックするスレッド) でやる
欠点
- 互換性
- Overhead
面白いこと
- orderの話
- 少ない前提、全スレッドいてレートする、数十万あるとボトルネックになる
評価
100万個以上作るとサチった
速度はMNのほうが早かった、想像の100倍とかではなかった
Chat Serverをつくるとすると
真っ当にやったパターン
Queue パターン
Blockerパターン
これから
- 実行がまだまだ
- Ractorのサポート
- Ruby 3.2に入るかどうか。。。
- デバッガーをしやすくする(Massive concurrent application)
Types teaches success, what will we do?
Talker
@fugakkbn
Ruby の型を使ってる人は?
会場の1%くらいだった
TypeScriptの型を使ってる人は?
会場の80%くらい
Steep
型定義がLogicは別でできる
なぜ普及しないのか
全体のGemの0.02%くらいしか普及していない
Let’s contribute gem_rbs_collection!!
書き方はこちら
修正までのSteps
- Finding
- steep check
- rbsファイルを性的に解析して実装と差異がないかチェックする
- Check
- Fix
- Patch
型を作る手段
- 自動的に型定義をつくる
- 手動でつくる
すべてのAPIの型定義を書く必要はない
- 実際に使われているもの
- 利用頻度の高いもの
Generateの仕方
- rbs prototype rb \
- gems/hoge/hoge/**.rb \
- destination_file-generated.rbs
- 実行すると500行文のコードが生成される
- 大体は
Untyped
になる
全部にテスト書く必要あるのか?
- 全て書く必要はない
- 必要なものだけ、よく使われているものだけ
- ⇒ でもそれでは誰も書かないのでは?
手動と自動はどんなふうに使い分ければよいのか??
- 特定のAPIを実装するときは手動
- ライブラリ追加などで怒られたときは自動生成
Finally…
rbsやSteepを積極的に使いましょう!
型もつけることでRuby本来の書きやすさを目指していきましょう
Tools for Providing rich user experience in debugger
何の話?
デバッガーのリッチなDeveloper Experieceを向上させる話
やってること
- debug.gem (3.1~)
- Ruby Programでデバッガーが使える
- VSCodeでデバッグをサポートできる機能の作成
Chrome dev tools
- JavaScriptでデバッグできる
- これをRuby Programでデバッグできるようにした
リッチなUIを使ってデバッグしたいけどVSCodeではない
VSCodeでできることをChrome dev toolsでできるようにした
Demo
ChromeでRubyプログラムが動いてデバッグできる!!
- Step in
- Step over
- Step out
- Break point
- Call stack
- Chrome console ⇒ 使われそう
- デバッグ中の変数を確認できる(あくまでRuby Program)
- 変更もできる
Step Over, Break pointが一番使われそう
ローカル変数、return値が出てデバッグが可能
VSCodeのデバッグについて
実行の順番や処理を記録したり、戻ることができる
Option
- back: コマ送りで戻れる
- forward: コマ送りで進める
- filter機能がある(History Inspector)
- Debug console
- ActiveRecordのインスタンスでも見れる
- Record検索時のURLをクリックするとVSCodeで良い感じに見れる
- グラフ機能もある!
感想
RubyMineはまだなのかな?
確かに便利だと思うけど、もともとなかったのかという発見
Towards Ruby 4 JIT
何の話?
- YJITについて話す
- Shopify開発のJITコンパイラ
- YJIT since Ruby 3.1~
- 3.1 no code GC, C
- 3.2 arm64 support , Rust, code gGC
- MJIT since Ruby 2.6~
- 3.1 native threads, C
- 3.2 Experimental, Ruby
BYOJ Bring Your Own JIT
- Load and pause MJIT
- Define RubyVM::MJIT.compile
- Call RubyVM::MJIT.resume to start JIT
Handling Benchmarks
- Benchmark
- activerecord, hexapdf, liquid-render, mail…
- Other
- binarytrees, erubi
- Micro Benchmarks
My wish Ruby 4JIT
- Java, JavaScriptに近づけていきたい
- Pythonからは離れる
- 4年以内にPythonより5倍早くならなければ!
How can we get there??
- Constants
- Variables
- Method calls
- Garbage collection
初日の感想
去年はオンラインだったのでだいぶわいわいしていていろんなRubyエンジニア、スポンサーブースの人たちと話せて楽しかったです。
Rubyはマルチスレッドや型付けなど今流行の言語の良いところを吸収していて5年後でも普通に保守性も高い言語として運用されそうだなと考えてます。
ただ今は初期生産性が高くて保守性はどうなんだろうと行ったところです。型付けがデフォルトになったRuby 3.1をみんなが使ってるところを想像すると楽しみですね。
Next!!
RubyKaigi 2022 09/09(2日目) 参加レポート