RubyKaigi2022-1日目メモ
忘れないうちにメモ セッションの写真は資料がWeb上で公開されているもののみ。 セッションでスピーカーが話したこと、自分の感想混ぜて
RubyKaigi 2022 - RubyKaigi 2022
感想
- Rubyをはじめて火が浅いが、ある程度理解できた。そして1日目にしてかなり刺激を受けている
- 1セッションが短くて聞きやすい
- ソロ参加者も結構多い。何人かとお話しできた。
- コントリビューターの方の顔が見えると、自分も何かやってみようと思える
- スポンサーブース楽しい
- ランチが豪華
Sessions
Ruby meets WebAssembly(Key-note)
Ruby meets WebAssembly - RubyKaigi 2022 Ruby meets WebAssembly - Speaker Deck - RubyがWebAssembly対応したよって話
Speaker
- GoodNotesで働く 早稲田大学B4 @kateinoigakukunさん
- CRubyコミッター
これまでのRubyの課題
- ちょっとしたプログラムを公開したい場合、フロントでの実行ができないためサーバー上でRuby環境整備してあげないといけなかった
- 環境構築も大変で、初学者が詰まってしまいがちだった
- これらを解消すればよりRuby開発体験が良くなるのでは?
WebAssembly(WASM)で解消!
そもそもWASMとは
- stack-based machine用のフォーマット→Webブラウザで動かせる
- JSを補完・並行しながら動作できる - ref: WebAssembly | MDN
WASMが解決するもの
- どこでも動かせる。
- 初学者が環境構築でつまづかなくて済む
- 感想:GoogleColabやJSPlaygroundのようにブラウザ上で動作させられるIDEも出てくるのかなーと期待している
一般的なWASMの動き
- コンパイルし.wasmファイルを作成
- ブラウザ上で実行
CRubyのばあい?
- ruby.wasmでRuby実行環境用意し、.rbファイルをダウンロードしてブラウザ上で実行させている
ブラウザ上irbデモ
- ブラウザ上irbでSVGgem使ってSVGを表示させているところ
WASM用のhtmlを組んでいるところ
- 簡単に書ける感じ良い
どうやって動いている
- ブラウザ上だけてで無く、サーバーレスプラットフォームでもいける
- ブラウザのJSと共に動いているわけではない
WASIについて
- プラットフォーム非依存なインターフェイス
- WASIサポートはかなり広がっている
wasi-vfs
- .rbをバイナリ変換して.wasmに内包する形で配置させるもの
- サーバーからダウンロードする必要がなくなる
- before
- after
- Read-only なrbをバイナリとして内包させておく
- Ruby3.2から
- npmもある ruby/ruby.wasmを使うとよい
CRubyをWASMとWASIに対応させるための道のり
- CRubyはCで書かれているから…CからWAにコンパイルするのは楽だよね…!そんなことはなかった
setjmp/longjmp
vm_execでひたすらrubyを動かしているが
- エラーraiseすると「ロングジャンプ」が発生する
- (ここはよくわからなかった………)
Cなんにもわからないどうしよう #rubykaigi
— teaaa🍵 (@nifuchi222222) 2022年9月8日
FIberについて
[https://docs.ruby-lang.org/ja/latest/class/Fiber.html](https://docs.ruby-lang.org/ja/latest/class/Fiber.html)
保守的GC
- WASMのVM内のCスタックは線形メモリだからスキャンできる
- ValueStackは保護Stackだからscanできない
CallFrameも読めない
pauseとresume サポートを担ってくれるのがAsycify
JSのAsyncをCのsyncから呼び出すためののもの
コンパイルして元のプログラムではできない動きを再現する
sleepしている間にmainまで戻ってくる→sleep中に他にやりたいことが自由にできる
- 1回目にsleepしていた時の挙動を2回目のfoo-callで再現できている
直接お話しした、mainに戻ってくる際にローカル変数を全て回収してきてるから再現できる、つまりローカル変数が増えると…
ここは勉強しないとわからない
現時点ではバイナリさずはでかい
Asyncifyによるオーバーヘッドでスピードはまあまあ落ちる
ruby.wasmはnpmで配布中
- とりあえずブラウザirbで試してみよう
ここからはスクショは後で貼る
--
MaNy Project
参考資料
【Ruby】Thread(スレッド)を理解する - Qiita
Make MANY threads >100k を目標にしている
- M:Nはいいらしい
- 例えば、OSの提供スレッドとして使った過去がある
- JAVAでもある
- M:Nはいいらしい
- 二つのスケジューラー
ractor lebelスケジューラー M:Nmodel
- Thread level schedular 1:N
これまでのHandle blocking
- マネージドのものはインタープリンターが頑張っていたが、unmannagedなものが出ると諦めていた
ManyPJでは Unmagaedなものは dedicated native threadという概念で対処する
互換性の問題
これからするthreadはDNTを使うという宣言を用意して互換性に対応
MNの利点
- いろいろ軽量になる
- MNにするとネイティスレッド気にせずに移行ができるようになる
- ネイティブ<<<rubyスレッドのほうが早いからいいやんと思っていたがネイティブも結構早い
MNの欠点
- 若干のオーバーヘッド
- 互換性の問題
- Rubyプロセスの外から見た時に形が違う
Fiber Schedularとの比較
DNT dedicated native thread
評価
Thread 作った時
17マンスレッドくらいでネイティブだとダメになる、MNのほうが早いが、想像していたものほどではなかった
GCoverhead GC無効にするとめっちゃ早い→オーバーヘッドのせい
Ractor 生成 話にならない。GCオーバーヘッドが深刻
これよくわからん
一周するのにかかる時間
RubyのスケジューラーとコンフリクトしてMasterは遅い
Native抜いてグラフ見てみる
Goの方が早いからまだ頑張れる
リーダーとライターを別々にして改良したもの
これから
- LINUX以外でもサポートして、できれば3.2に入れたい
![スクリーンショット 2022-09-08 13.59.54.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/30adf71b-73ff-4886-bb14-a4c3f51ec482/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-09-08_13.59.54.png)
- Ractor local GC オブジェクトヒープが分かれているからローカルでやったらいいんじゃないかという考え
Types teaches success, what will we do?
Types teaches success, what will we do? - RubyKaigi 2022
Types teaches sucess!!!
- 型付けをしましょう!そしてgemfileの型付けコントリビュートをしましょう!というお話
RBS,Steepなどが3から同梱されるようになった
- 小さく始めらる
- コードそのものとは別に使えるのでRubyの楽しさは失われない
- だがまだ導入事例は少ない
なぜ導入事例が少ない?
- RubyGems.orgには17万のgemがあるが
- rbsのgemsはどれくら意サポートしてうる…?
- 44件しか型定義されていない……すくない
gem_rbs_collectionにコントリビュートして増やしましょう!
どうやればコントリビュートできる?
gemrbsはなに
- gemの型定義を集めたもの
コントリビュート方法
- まずは対応していないgemを見つける
- steep checkで型定義と実装のずれをチェックできるがそれで見つかることが多い
- .source_locationで元を見る
- 型をチェックしよう
- ブロックを受け取れない状態であれがgem_rbsに受け取れるように記述を追加しよう
- 対応していなければ、環境構築後やってみる。
- 自動でも生成できる
部分的に定義する方法
- 自分がよく使うAPIを定義すると良い
- 使うとこだけでいい
Generatorで自動生成
rbs prototype rb
でソースファイルと生成名を指定して実行する
使い分けは?
- 明確にこのAPIが欲しいとわかっていたら部分的ん手動で
PJでsteepチェックした時に特定のgemで大量に出たら自動生成
感想:Rubyの型付けについてはとても興味があったので面白かった。小さなところからgem型付けコントリビュートしていけそうで良い
Adding Type Signatures into Ruby Docs
Adding Type Signatures into Ruby Docs - RubyKaigi 2022
- Rubyapi.org開発のお話
- Rdocのサイトで調べるとアルファベット順にAPIが出てくる。重要なもの順に出てきて欲しい、という課題解消をしたサイト
- Ruby API (v3.1)
RDocsをもっと良くしようぜ
RDocsをよくするには
- 型付しようぜ
- typeanotationつけようぜ
TypeSignaturesを表示できるようにした
- かなりわかりやすくなってる
bug_triaging.rdog
- rdoc . で自動生成できる
- localでもパッと見れるよ
- format指定もできる
potフォーマットとは?
- pot→powerpointドキュメンテーション
- 簡単なドキュメンテーションの例
「rdocのメソッド記述はcall sequenseとdescriptionで構成される。call sequenseには呼び出しインターフェイスを記述するが、ここはplain textなのでintegerなどの型名だけでなくnameやaStringといった記述が許される」 #rubykaigi #rubykaigiB
— 黒曜@Leaner Technologies (@kokuyouwind) 2022年9月8日
- RBS
- steep入れるといいよ
- RBSで片付けしておけばRDocがよりいい感じになる
- つけましょう
- no_stdlib: true
- Not optimized for human
例えばgsubのこれ 人には読みづらい……
改良して人にも読みやすい、書きやすいものに改良する挑戦をしている
- 不要な書き方の修正、シンタックスハイライト対応など
- ぜひコミッターになったり意見送ってね
Ruby4のJITについて
Towards Ruby 4 JIT - RubyKaigi 2022
Ruby -> AST -> Bytecode -> 機械語 (おさらい
Ruby -> AST -> Bytecode -> 機械語 (おさらい) #rubykaigi #rubykaigiA
— はのにくちゃん (@hanoniku_chan) 2022年9月8日
BYOJ Biring Your Own JIT!!
- 自分自身のJITを作るってこと!?
https://twitter.com/_craftscat/status/1567770392533823488?s=20&t=2ST_Nc3PdR5TT0ATWcgpqQ
そもそもJITがよくわかっていないので読む
https://twitter.com/watson1978/status/1567771068110376960?s=20&t=rJ6hcpZloXp_GrFHz8Jj-A
https://twitter.com/watson1978/status/1567771179427180544?s=20&t=tUoU84wzwJ05L9P7lOtKRQ
MicroBenchimark
Ruby4 はJavaやJSより早くしたい
https://twitter.com/kokuyouwind/status/1567772989487476737?s=20&t=h9NmRmwJj31LqyMh7uy0HQ