にふうち回避

日々のプログラミング勉強の記録

*自分自身の勉強の備忘録としての記事がほとんどです.内容の正確性などは担保されません.

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ファイルをダウンロードしてブラウザ上で実行させている
    ruby-wasm

ブラウザ上irbデモ

- https://irb-wasm.vercel.app

  • ブラウザ上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すると「ロングジャンプ」が発生する
  • (ここはよくわからなかった………)

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

    【Ruby】Fiber(ファイバー)を理解する - Qiita

    class Fiber

  • Make MANY threads >100k を目標にしている

    • M:Nはいいらしい
      • 例えば、OSの提供スレッドとして使った過去がある
      • JAVAでもある
  • 二つのスケジューラー
    • ractor lebelスケジューラー M:Nmodel

    • Thread level schedular 1:N
  • これまでのHandle blocking

    スクリーンショット 2022-09-08 13.43.05.png

    • マネージドのものはインタープリンターが頑張っていたが、unmannagedなものが出ると諦めていた
  • ManyPJでは Unmagaedなものは dedicated native threadという概念で対処する

    スクリーンショット 2022-09-08 13.45.48.png

    スクリーンショット 2022-09-08 13.46.33.png

互換性の問題

スクリーンショット 2022-09-08 13.47.06.png

これからするthreadはDNTを使うという宣言を用意して互換性に対応

MNの利点

  • いろいろ軽量になる
  • MNにするとネイティスレッド気にせずに移行ができるようになる
  • ネイティブ<<<rubyスレッドのほうが早いからいいやんと思っていたがネイティブも結構早い

MNの欠点

  • 若干のオーバーヘッド
  • 互換性の問題
  • Rubyプロセスの外から見た時に形が違う

Fiber Schedularとの比較

スクリーンショット 2022-09-08 13.50.08.png

スクリーンショット 2022-09-08 13.51.20.png

DNT  dedicated native thread

評価

  • Thread 作った時

    スクリーンショット 2022-09-08 13.51.51.png

    17マンスレッドくらいでネイティブだとダメになる、MNのほうが早いが、想像していたものほどではなかった

  • GCoverhead GC無効にするとめっちゃ早い→オーバーヘッドのせい

    スクリーンショット 2022-09-08 13.52.44.png

  • Ractor 生成 話にならない。GCオーバーヘッドが深刻

    スクリーンショット 2022-09-08 13.53.41.png

    スクリーンショット 2022-09-08 13.53.55.png

  • これよくわからん

    スクリーンショット 2022-09-08 13.54.17.png

    一周するのにかかる時間

    一周するのにかかる時間

    RubyのスケジューラーとコンフリクトしてMasterは遅い

    スクリーンショット 2022-09-08 13.55.12.png

    Native抜いてグラフ見てみる

    • Goの方が早いからまだ頑張れる

      スクリーンショット 2022-09-08 13.55.31.png

      スクリーンショット 2022-09-08 13.55.51.png

    • リーダーとライターを別々にして改良したもの

      スクリーンショット 2022-09-08 13.56.56.png

      スクリーンショット 2022-09-08 13.57.08.png

これから

- 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の型定義を集めたもの

コントリビュート方法

  1. まずは対応していないgemを見つける
    1. steep checkで型定義と実装のずれをチェックできるがそれで見つかることが多い
    2. .source_locationで元を見る
    3. 型をチェックしよう
    4. ブロックを受け取れない状態であれがgem_rbsに受け取れるように記述を追加しよう
  2. 対応していなければ、環境構築後やってみる。
  3. 自動でも生成できる

部分的に定義する方法

  • 自分がよく使う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を表示できるようにした

    IMG_9038.JPG

    • かなりわかりやすくなってる
  • bug_triaging.rdog

  • rdoc . で自動生成できる
  • localでもパッと見れるよ
  • format指定もできる

potフォーマットとは?

- pot→powerpointドキュメンテーション

  • 簡単なドキュメンテーションの例

IMG_9039.JPG

IMG_9040.JPG

  • call sequencesはプレーンテキスト、現状

    - だから型名、name,anameみたいな書き方が許させる

  • RBS
    • steep入れるといいよ
    • RBSで片付けしておけばRDocがよりいい感じになる
    • つけましょう
    • no_stdlib: true
  • Not optimized for human
    • 例えばgsubのこれ 人には読みづらい……

    • 改良して人にも読みやすい、書きやすいものに改良する挑戦をしている

      • 不要な書き方の修正、シンタックスハイライト対応など
    • ぜひコミッターになったり意見送ってね

Ruby4のJITについて

Towards Ruby 4 JIT - RubyKaigi 2022

Ruby -> AST -> Bytecode -> 機械語 (おさらい

BYOJ Biring Your Own JIT!!

  • 自分自身のJITを作るってこと!?

https://twitter.com/_craftscat/status/1567770392533823488?s=20&t=2ST_Nc3PdR5TT0ATWcgpqQ

そもそもJITがよくわかっていないので読む

Rubyがいかに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

GC

module GC

https://twitter.com/risacan/status/1567775625183920128