$30 off During Our Annual Pro Sale. View Details »

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

  2. #256 Mirrativ, Inc. Infra Engineer
 • 主にGoを書く、RubyとRustが好き
 • シニアシレンジャー
 •

    好きなtrait: PartialEq
 • バイナリアンワナビ
 近藤うちお (@udzura)
 ※ ミラティブはGo/フロントエンド/Unity/ネイティブアプリエンジニアを強烈に募集しています。

  3. 福岡市エンジニアカフェ
 ハッカーサポーターというタイトルで色々お手伝いしてます


  4. Today’s LT


  5. Rust、熱量ありますね
 Rubyist的には、YJITとか、RubyGemsのRustビルダー対応とか


  6. #256 今日のテーマ
 RustでRuby(MRI)の拡張gemを書く話
 • LTなので時間厳守です、要点だけです
 • めちゃくちゃ早口です
 • 時間が余ったら僕とRustに関するナラティブを垂れ流します


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


  8. #256 Rubyで拡張を書きたい時
 YJITはまあ置いときましょう
 • A.
 • スピードがとにかく欲しい。文字列操作でいちいちStringインスタンス作りたくない ような状況など
 • B.


    • 特定のシステムコールやCライブラリ関数を呼びたいが既存のものがない
 • C. 他にあれば教えてください

  9. #256 第一の選択肢: C言語?
 • ところでC言語といえば…
 脆弱性ですよね(諸説あり)
 • 僕が色々いうよりIPAの
 資料を読んだ方がいい
 (古いのが難点)


    
 • 他の選択肢… 
 • C++: Cより安全にする仕組みはあるがそれでも自由すぎ 
 • FFIとか: 便利だが逆に自由度低い、ややバッドノウハウ 
 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html
  10. #256 C言語と脆弱性
 • 2021 CWE Top 25 の上位には相変わらずCのメモリに関する脆弱性
 2021年に起こった脆弱性を振り返る 


    https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html 
  11. #256 メモリの脆弱性を回避したコードを書くのは簡単ではない
 • 回避策やツールはある
 • が使われるとも限らない
 • udzura mruby本 第9章


    • (第9章だけバラで売りたいw)
 • 他「初めて学ぶバイナリ解析」とか

  12. そこでRustなんすよ…


  13. #256 Rust の特徴的機能
 だいたい全てはメモリ安全性のために
 • 所有権
 • 借用規則
 • ライフタイム


    • Option
 • unsafe …

  14. #256 ただ安全なだけじゃない
 • 上記に加え、型の表現力がとても高く、意図を表現しやすい。
 • 安全かつ快適にコードが書ける(しかも多くの場合速い)
 • これってすごくない?
 • Rubyと同じ雰囲気がある、Rubyistはしっくりくると思う


  15. 論より動くもの


  16. How to Implement Rusty Gem


  17. #256 詳細はブログをじっくり読んでください
 LTじゃ無理っすわ、jimlockさん...
 • https://udzura.hatenablog.jp/entry/2022/05/11/193100

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


  19. #256 It works! よかったね。
 オレはようやくのぼりはじめたばかりだからな


  20. 時間があれば話す


  21. #256 One More Thing
 5分では絶対話せない
 • もうちょっと真面目に
 中身を書いてみた
 • 実装例 👉


  22. #256 渋ポイント1
 • bindgenはCマクロを
 エクスポートしない
 • 大事な機能に限って
 マクロだったりする
 • Cで小さなラッパ関数を


    書いてリンクするとか
 おもてなしが必要…。
 本当は RSTRING_LEN() が
 使いたいんです…。

  23. #256 渋ポイント2
 • Rubyメソッドに対応する
 関数は、可変長引数(?)
 • transmuteして
 fn() -> VALUE

    型扱い
 他にもQnil→VALUEとか
 transmute多くて治安が
 • 一方mrubyは
 mrb_get_args()を使った…
 治安が悪い!!

  24. #256 Rust gemを便利に作れるラッパcrate欲しい
  
 • 暇があればぼくが作…ウッ
 • !?:
 https://crates.io/crates/coffret 


    • 名前重要なので押さえました
 • 頑張って中身を作りましょう
 nixみたいな。コントリチャンスだ! 
 少しだけ良くなります 

  25. 終わりに


  26. #256 僕とRustのナラティブ
  
 • 口頭のみです!!(??)
 僕が一番Rustをうまく使えるんだ(使えるとは言っていない)