Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Narrative of Ruby & Rust

Narrative of Ruby & Rust

KONDO Uchio

May 11, 2022
Tweet

More Decks by KONDO Uchio

Other Decks in Technology

Transcript

  1. 近藤宇智朗 / 2022-05-11 

    Narrative of Ruby x Rust

    Fukuoka.rb #256 Special LT


    View full-size slide

  2. #256
    Mirrativ, Inc. Infra Engineer

    • 主にGoを書く、RubyとRustが好き

    • シニアシレンジャー

    • 好きなtrait: PartialEq

    • バイナリアンワナビ

    近藤うちお (@udzura)

    ※ ミラティブはGo/フロントエンド/Unity/ネイティブアプリエンジニアを強烈に募集しています。


    View full-size slide

  3. 福岡市エンジニアカフェ

    ハッカーサポーターというタイトルで色々お手伝いしてます


    View full-size slide

  4. Today’s LT


    View full-size slide

  5. Rust、熱量ありますね

    Rubyist的には、YJITとか、RubyGemsのRustビルダー対応とか


    View full-size slide

  6. #256
    今日のテーマ

    RustでRuby(MRI)の拡張gemを書く話

    • LTなので時間厳守です、要点だけです

    • めちゃくちゃ早口です

    • 時間が余ったら僕とRustに関するナラティブを垂れ流します


    View full-size slide

  7. #256
    なぜRustで拡張gemを書くのか?


    View full-size slide

  8. #256
    Rubyで拡張を書きたい時

    YJITはまあ置いときましょう

    • A.

    • スピードがとにかく欲しい。文字列操作でいちいちStringインスタンス作りたくない
    ような状況など

    • B.

    • 特定のシステムコールやCライブラリ関数を呼びたいが既存のものがない

    • C. 他にあれば教えてください


    View full-size slide

  9. #256
    第一の選択肢: C言語?

    • ところでC言語といえば…

    脆弱性ですよね(諸説あり)

    • 僕が色々いうよりIPAの

    資料を読んだ方がいい

    (古いのが難点)


    • 他の選択肢…

    • C++: Cより安全にする仕組みはあるがそれでも自由すぎ

    • FFIとか: 便利だが逆に自由度低い、ややバッドノウハウ

    https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html

    View full-size slide

  10. #256
    C言語と脆弱性

    • 2021 CWE Top 25 の上位には相変わらずCのメモリに関する脆弱性

    2021年に起こった脆弱性を振り返る

    https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html 

    View full-size slide

  11. #256
    メモリの脆弱性を回避したコードを書くのは簡単ではない

    • 回避策やツールはある

    • が使われるとも限らない

    • udzura mruby本 第9章

    • (第9章だけバラで売りたいw)

    • 他「初めて学ぶバイナリ解析」とか


    View full-size slide

  12. そこでRustなんすよ…


    View full-size slide

  13. #256
    Rust の特徴的機能

    だいたい全てはメモリ安全性のために

    • 所有権

    • 借用規則

    • ライフタイム

    • Option

    • unsafe …


    View full-size slide

  14. #256
    ただ安全なだけじゃない

    • 上記に加え、型の表現力がとても高く、意図を表現しやすい。

    • 安全かつ快適にコードが書ける(しかも多くの場合速い)

    • これってすごくない?

    • Rubyと同じ雰囲気がある、Rubyistはしっくりくると思う


    View full-size slide

  15. 論より動くもの


    View full-size slide

  16. How to Implement Rusty Gem


    View full-size slide

  17. #256
    詳細はブログをじっくり読んでください

    LTじゃ無理っすわ、jimlockさん...

    • https://udzura.hatenablog.jp/entry/2022/05/11/193100

    View full-size slide

  18. #256
    実装の全体だけでも


    View full-size slide

  19. #256
    It works! よかったね。

    オレはようやくのぼりはじめたばかりだからな


    View full-size slide

  20. 時間があれば話す


    View full-size slide

  21. #256
    One More Thing

    5分では絶対話せない

    • もうちょっと真面目に

    中身を書いてみた

    • 実装例 👉


    View full-size slide

  22. #256
    渋ポイント1

    • bindgenはCマクロを

    エクスポートしない

    • 大事な機能に限って

    マクロだったりする

    • Cで小さなラッパ関数を

    書いてリンクするとか

    おもてなしが必要…。

    本当は RSTRING_LEN() が

    使いたいんです…。


    View full-size slide

  23. #256
    渋ポイント2

    • Rubyメソッドに対応する

    関数は、可変長引数(?)

    • transmuteして

    fn() -> VALUE 型扱い

    他にもQnil→VALUEとか

    transmute多くて治安が

    • 一方mrubyは

    mrb_get_args()を使った…

    治安が悪い!!


    View full-size slide

  24. #256
    Rust gemを便利に作れるラッパcrate欲しい

     

    • 暇があればぼくが作…ウッ

    • !?:

    https://crates.io/crates/coffret 

    • 名前重要なので押さえました

    • 頑張って中身を作りましょう

    nixみたいな。コントリチャンスだ!

    少しだけ良くなります 


    View full-size slide

  25. 終わりに


    View full-size slide

  26. #256
    僕とRustのナラティブ

     

    • 口頭のみです!!(??)

    僕が一番Rustをうまく使えるんだ(使えるとは言っていない)

    View full-size slide