Submit Search
Upload
emruby: ブラウザで動くRuby
•
0 likes
•
10,673 views
M
mametter
Follow
銀座Rails #32 https://ginza-rails.connpass.com/event/207692/
Read less
Read more
Technology
Report
Share
Report
Share
1 of 35
Download now
Download to read offline
Recommended
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
mametter
Ruby でつくる型付き Ruby
Ruby でつくる型付き Ruby
mametter
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書く
mametter
Marp入門
Marp入門
Rui Watanabe
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
kirimin
セマンティックWebとオントロジー:現状と将来展望
セマンティックWebとオントロジー:現状と将来展望
National Institute of Informatics (NII)
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
Hiroya Kabata
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
tmaehara
Recommended
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
mametter
Ruby でつくる型付き Ruby
Ruby でつくる型付き Ruby
mametter
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書く
mametter
Marp入門
Marp入門
Rui Watanabe
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
kirimin
セマンティックWebとオントロジー:現状と将来展望
セマンティックWebとオントロジー:現状と将来展望
National Institute of Informatics (NII)
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
Hiroya Kabata
はじめてのKrylov部分空間法
はじめてのKrylov部分空間法
tmaehara
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
Yutaka Kachi
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
Tetsutaro Watanabe
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
Rakuten Group, Inc.
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Yoshimura Soichiro
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
catupper
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
harmonylab
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Tomoya Kawanishi
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
Marp Tutorial
Marp Tutorial
Rui Watanabe
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
Takeshi Arabiki
短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術
Takafumi ONAKA
RedisConf17- durable_rules
RedisConf17- durable_rules
Redis Labs
異常検知 - 何を探すかよく分かっていないものを見つける方法
異常検知 - 何を探すかよく分かっていないものを見つける方法
MapR Technologies Japan
If文から機械学習への道
If文から機械学習への道
nishio
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
Daiyu Hatakeyama
MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
mametter
Statistical Semantic入門 ~分布仮説からword2vecまで~
Statistical Semantic入門 ~分布仮説からword2vecまで~
Yuya Unno
Ruby on Windows
Ruby on Windows
Tomoya Kawanishi
Mrubyの始め方
Mrubyの始め方
Masaki Muranaka
More Related Content
What's hot
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
Yutaka Kachi
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
Tetsutaro Watanabe
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
Rakuten Group, Inc.
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Yoshimura Soichiro
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
catupper
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
harmonylab
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Tomoya Kawanishi
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
Marp Tutorial
Marp Tutorial
Rui Watanabe
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
Takeshi Arabiki
短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術
Takafumi ONAKA
RedisConf17- durable_rules
RedisConf17- durable_rules
Redis Labs
異常検知 - 何を探すかよく分かっていないものを見つける方法
異常検知 - 何を探すかよく分かっていないものを見つける方法
MapR Technologies Japan
If文から機械学習への道
If文から機械学習への道
nishio
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
Daiyu Hatakeyama
MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
mametter
Statistical Semantic入門 ~分布仮説からword2vecまで~
Statistical Semantic入門 ~分布仮説からword2vecまで~
Yuya Unno
What's hot
(20)
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
楽天市場データ + 機械学習を用いた予測事例の紹介 梅田卓志/楽天株式会社
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
Marp Tutorial
Marp Tutorial
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術
RedisConf17- durable_rules
RedisConf17- durable_rules
異常検知 - 何を探すかよく分かっていないものを見つける方法
異常検知 - 何を探すかよく分かっていないものを見つける方法
If文から機械学習への道
If文から機械学習への道
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
MongoDBの監視
MongoDBの監視
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
Statistical Semantic入門 ~分布仮説からword2vecまで~
Statistical Semantic入門 ~分布仮説からword2vecまで~
Similar to emruby: ブラウザで動くRuby
Ruby on Windows
Ruby on Windows
Tomoya Kawanishi
Mrubyの始め方
Mrubyの始め方
Masaki Muranaka
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
Takuya Mukohira
mrubyでゲームを書いてみた
mrubyでゲームを書いてみた
Yousuke Kuroda
PHPer のための Ruby 教室
PHPer のための Ruby 教室
higaki
軽量Ruby『mruby』について
軽量Ruby『mruby』について
Ryosuke MATSUMOTO
RubyからC#を扱う
RubyからC#を扱う
107steps
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
Yoshito Tanaka
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
Misao X
Ruby Enterprise Environment
Ruby Enterprise Environment
Tomoya Kawanishi
mruby for embedded systems
mruby for embedded systems
masayoshi takahashi
VMを改めて学んで見る
VMを改めて学んで見る
kishima7
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
yamanekko
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
7shi
Ruby東京プレゼン 資料
Ruby東京プレゼン 資料
Kazuaki Tanaka
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
mametter
Ruby と C# をつなぐ
Ruby と C# をつなぐ
107steps
VimとRubyのアツい関係
VimとRubyのアツい関係
Misao X
Ember コミュニティとわたし
Ember コミュニティとわたし
Ryunosuke SATO
Rubinius Under a Microscope
Rubinius Under a Microscope
高広 内山
Similar to emruby: ブラウザで動くRuby
(20)
Ruby on Windows
Ruby on Windows
Mrubyの始め方
Mrubyの始め方
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
mrubyでゲームを書いてみた
mrubyでゲームを書いてみた
PHPer のための Ruby 教室
PHPer のための Ruby 教室
軽量Ruby『mruby』について
軽量Ruby『mruby』について
RubyからC#を扱う
RubyからC#を扱う
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
Ruby Enterprise Environment
Ruby Enterprise Environment
mruby for embedded systems
mruby for embedded systems
VMを改めて学んで見る
VMを改めて学んで見る
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
Ruby東京プレゼン 資料
Ruby東京プレゼン 資料
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
Ruby と C# をつなぐ
Ruby と C# をつなぐ
VimとRubyのアツい関係
VimとRubyのアツい関係
Ember コミュニティとわたし
Ember コミュニティとわたし
Rubinius Under a Microscope
Rubinius Under a Microscope
More from mametter
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
mametter
TRICK 2022 Results
TRICK 2022 Results
mametter
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mametter
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
mametter
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
mametter
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
mametter
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
mametter
Ruby 3の型推論やってます
Ruby 3の型推論やってます
mametter
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
mametter
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
mametter
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
mametter
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
mametter
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
mametter
Transcendental Programming in Ruby
Transcendental Programming in Ruby
mametter
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
mametter
TRICK 2018 results
TRICK 2018 results
mametter
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
mametter
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
mametter
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
More from mametter
(20)
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
TRICK 2022 Results
TRICK 2022 Results
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
Ruby 3の型推論やってます
Ruby 3の型推論やってます
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
Transcendental Programming in Ruby
Transcendental Programming in Ruby
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
TRICK 2018 results
TRICK 2018 results
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
Recently uploaded
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
Recently uploaded
(10)
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
emruby: ブラウザで動くRuby
1.
emruby: ブラウザで動くRuby 銀座Rails #32 Yusuke Endoh 1
2.
自己紹介:遠藤侑介 (@mametter) • クックパッドで働くフルタイムRubyコミッタ •
Ruby 3添付の静的解析ツールTypeProf作ってます • https://github.com/ruby/typeprof • でも今日はぜんぜん違う話をします 2
3.
emruby: ブラウザの上で動くRuby https://mame.github.io/emruby/ 3
4.
emrubyの狙い • ブラウザでRubyが動くのは楽しい • 頑張ればTryRuby(お試し環境)くらいにはなるか? •
将来的にJavaScriptの代替になるかはWASM次第? • Rust / Go / KotlinなどもWASM出力に対応してるので • おことわり • この発表にはRailsもRuby言語もほとんど出てきません • Rubyのビルドの知識が少し身につきます 4
5.
Rubyをブラウザで動かす関連研究 • Opal: JavaScriptで書かれたRubyインタプリタ •
https://github.com/opal/opal • Artichoke: Rustで書かれたRubyインタプリタ(WASM出力対応) • https://github.com/artichoke/artichoke • repl.it: Ruby 1.8をEmscriptenしたもの(らしい) • https://github.com/replit-archive/emscripted-ruby • Ruby on WebAssembly: mrubyをEmscriptenしたもの • https://github.com/blacktm/ruby-wasm • RubyのNaClサポート(2012~2017) • よくまとまってる記事 • https://blog.unasuke.com/2021/products-about-webassembly-and-ruby/ 5
6.
アジェンダ • ➔WASM /
Emscriptenとは • emrubyが動くまで • まとめ 6
7.
WebAssembly (WASM) • ブラウザの上で動く実行ファイル形式 •
2017年頃からメジャーブラウザが対応している • JavaScriptより速くて (?) 小さいらしい 7
8.
Emscripten • C/C++のプログラムをWASMに変換するコンパイラ • LLVMベース •
デモ一覧(古そう):https://github.com/emscripten- core/emscripten/wiki/Porting-Examples-and-Demos • http://kripken.github.io/boon/boon.html • https://files.unity3d.com/jonas/AngryBots/ • http://coolwanglu.github.io/vim.js/emterpreter/vim.html 8
9.
Emscriptenの基本的な使いかた 9 #include <stdio.h> int main()
{ printf("hello, world!¥n"); return 0; } emcc hello.c –o hello.js && node hello.js emcc hello.c –o hello.html
10.
アジェンダ • WASM /
Emscriptenとは • ➔emrubyが動くまで • まとめ 10
11.
前提知識:Rubyのふつうのビルド • Rubyソースのディレクトリで次のコマンドを打つ • ./configure:
環境ごとにビルド方法を調整する • どのシステム関数が使えるか、コンパイラオプションが使えるか • OS、コンパイラ、バージョンなどの違いを調べる •make: ソースコードをコンパイルする • まずminirubyという制限版ruby実行ファイルを作る • minirubyを使ってスクリプト(Rubyで書かれている)を動かし、 拡張ライブラリや最終的なruby実行ファイルを作る 11 ./configure && make
12.
話の流れ • minirubyをWASMにする • 本当のrubyをWASMにする •
最終目標:irbを動かす? 12
13.
./configure && makeのEmscripten化 •
Emscriptenはconfigure+makeに対応している • emconfigure / emmakeはビルドをうまくだまして Emscriptenコンパイラを使わせる • これだけ……ではない • 実用プログラムがゼロ変更でビルドできることは無いと思う 13 emconfigure ./configure && emmake make
14.
Emscriptenが未実装のC関数に対処する • 問題:Emscriptenで利用できないC関数がいっぱいある • popenがない •
pthread_createはあるがpthread_killはない • pthread_createはあるがpthread_attr_getguardsizeがない • pthread_sigmaskはあるけど実際には動かない (!) 、など • configureの盲点をつくような未実装がいろいろあった • 対処:Rubyのconfigureを改善して対応した • コミッタなので、Ruby側を直接変更しまくった 14
15.
Rubyは関数の引数の数にルーズだった • C言語では、関数に引数を余分に渡しても良い (!?) •
C言語仕様違反だが、 多くのCコンパイラで動く • Rubyはこれに依存していた • Emscriptenのオプションで 対応した • -s EMULATE_FUNCTION_POINTER_CASTS=1 15 int foo(int a) { printf("%d¥n", a); } int main() { int(*foo2)(int,int) = (int(*)(int,int))foo; foo2(42, 43); // 42 } 1引数の関数fooを2引数で呼び出す例
16.
miniruby.wasmできた! • 2018年はこの段階で公開した • 残念なお知らせ •
EMULATE…オプションがEmscirptenから削除された • コンパイルできなくなった • どうしたか • 放置した → 3年経ったら、Ruby側が直っていた! • 微修正で2021年1月に再ビルドに成功した 16
17.
話の流れ • minirubyをWASMにする • ここまでできた •
本当のrubyをWASMにする • 最終目標:irbを動かす? 17
18.
ruby.wasmを作るには • ふつうのrubyのビルドには、minirubyが必要 • しかしminiruby.wasmはLinuxで実行できない •
クロスコンパイルする • ビルド環境とはちがう環境の実行ファイルを作ること • Linuxでruby.exe(Windowsの実行ファイル)を作る、とか • 今回はLinuxでruby.wasmを作る • emconfigureはかえってややこしくなるのでやめた 18
19.
Rubyのクロスコンパイル • Rubyのconfigureはクロスコンパイルに対応している • minirubyの代わりにビルド環境のrubyを使ってくれる •
これで一応ruby.wasmはできた • が、全然動かないのでデバッグ&ドキュメント&ソース読み 19 $ ./configure ¥ --build x86_64-pc-linux-gnu ¥ --host wasm32-unknown-emscripten ¥ CC=emcc LD=emcc AR=emar RANLIB=emranlib $ make ビルド環境 対象環境 Emscripten
20.
問題:Rubyの保守的GC • 保守的GCとは • マシンスタックの値がオブジェクトの参照であると仮定して マーク対象とするガベージコレクタの方式 •
https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%BC%E3% 83%97#%E4%BF%9D%E5%AE%88%E7%9A%84%E3%81%AA%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%BF • つまり意図的にC言語仕様違反なメモリアクセスをする • Emscriptenのメモリモデルでは全然動かない • 対処:Emscriptenが保守的GC用のAPIを用意していた • emscripten_scan_stack / emscripten_scan_registers • スタックの先頭と終端がわかる、これらを使うようにした 20
21.
余談:Fiberに対応する(未完) • Rubyは2018年末にFiberの一部をアセンブリで実装した • Emscriptenでx86アセンブリはコンパイルできないので コンパイルエラーになっていた •
対処:EmscriptenのAPIを使って実装した • emscripten_fiber_init / emscripten_fiber_swap • コンパイルオプション -s ASYNCIFY と合わせて使う • miniruby.wasmでは動いたが、ruby.wasmでは動かない • 原因未解明、今後の課題 • とりあえずFiber使わなければ問題ない 21
22.
問題:動的リンクができない • つまり、拡張ライブラリの require
ができない • require "ripper"したらripper.soを動的リンクする • しかしEmscriptenは動的リンクに未対応(たぶん) • 解決:ripperを静的リンクした • 他にも必要な拡張ライブラリを色々足した 22 $ ./configure ¥ --with-static-linked-ext --with-ext=ripper … $ make
23.
その他Emscripten特有っぽい話 • リンクが失敗する(htonsが見つからない、とか) • -lcでlibcを明示的にリンクすれば動いた •
-fstack-protectorも対応してないようなので消した • すぐメモリ不足エラーになる • Emscriptenはデフォルトでメモリサイズを固定確保する • サイズ可変にするオプションをつけた (-s ALLOW_MEMORY_GROWTH=1) • stack overflowの検出が動かないので止めた、など 23
24.
ruby.wasmできた! • require "ripper.so"も動く •
ある程度複雑なRubyスクリプトも動く 24
25.
話の流れ • minirubyをWASMにする • 本当のrubyをWASMにする •
ここまでできた • 最終目標:irbを動かす? 25
26.
irbを動かすのに必要なもの • Rubyインタプリタ(できた) • ripper.soなどの拡張ライブラリ(できた) •
irbのソースコード(あるけどまだ組み込んでない) • 端末エミュレータ(無い) 26
27.
仮想ファイルシステム • Emscriptenのfile_packagerツールで作れる • irbやrubygemsなど必要なRubyソースコードをまとめた •
fs.jsとfs.dataができた • がんばってロードできるようにした • コンパイルオプションに-s FORCE_FILESYSTEM=1追加 • fs.jsを<script>で呼ぶだけ……なのだが意外と苦労した 27
28.
xterm.jsを組み込む • xterm.js: ブラウザで動く端末エミュレータ •
https://xtermjs.org/ • VS Codeでも使われている • 残念なお知らせ • Emscriptenは標準入出力の実装がいまいち • とりあえずの対応 • ライン編集はxterm.js側でやり、irbには行単位で送る • reline(irbの新しい編集機能)の活用は今後の課題 28
29.
ということで https://mame.github.io/emruby/irb/ 29
30.
CPU 100%を防ぐ • Emscriptenの生成物はほぼ同期で動く(asyncでない) •
入力待ちをポーリングでやるみたい(ゲーム想定?) • 対処:別スレッド(Web Worker)で動かすようにした • 通信方法はvim.wasmに習った(SharedArrayBuffer使用) https://rhysd.hatenablog.com/entry/2019/06/13/090519 • 残念なお知らせ:5月に動かなくなる見込み 30
31.
ということで • (かなり妥協したけど)irbがブラウザで動いた! • rubygems、did_you_meanなども一応動いているっぽい 31
32.
落ち穂拾い • ruby.wasmのサイズ:29 MB •
コンパイルオプションで調整して8 MB • -Os: 省サイズ重視で最適化する • -g0: デバッグ情報を省く 32
33.
Emscripten所感 • 夢の技術ではない • 現実のC言語コードをゼロ変更でビルドできることは無い •
いっぱい問題に遭遇する • が、とてもよくできている • 一生懸命調べればたいてい対処方法やAPIがある • 検索に頼らずドキュメントを通して読むのが早道 • 動いたらとても嬉しい 33
34.
まとめ • ブラウザで動くRuby、emrubyを紹介しました • 大体Ruby側で対応したのでたったこれだけでビルドできる 34 $
./configure ¥ --build x86_64-pc-linux-gnu ¥ --host wasm32-unknown-emscripten ¥ --with-static-linked-ext ¥ --with-ext=ripper,date,strscan,io/console,…,psych ¥ optflags=-Os debugflags=-g0 ¥ CC=emcc LD=emcc AR=emar RANLIB=emranlib $ make
35.
今後の予定 • ほそぼそとメンテナンスするつもり • WASMが大ヒットする日に備える •
そのとき「RubyもWASM対応してます」と言いたい • RubyからJSやDOMを操作できたらいいなあ • 当面はOpalを使うのがいいと思います • WASM版TryRubyができたらいいなあ • Opalであまり問題はないですが 35
Download now