SlideShare a Scribd company logo
1 of 24
Rust + WebAssemblyやってみた
基礎からWebAssemblyまで
Rustとは?
- 比較的新しい言語
- Stack Overflowで2016年から5年連続で1位
- とにかく速い
- 機械語に直接コンパイル
- ガベージコレクションを持たない
- ゼロコスト抽象化を追求している
- C/C++言語の代わりになると言われている
- モダンな言語機能が一通り入っている
- 安全性が高い
- OSからWebまで幅広く実装できる
- 他言語関数インターフェイスを用いている
Rustの利用事例
- AWSはFirecrackerをRustで実装した
- AWS Lambda が「カスタムランタイム」という機能を追加し、Rustをサポートし
て
- MicrosoftはRustをソフトウェア安全性を高く保つソリューションとして評価し、
実際に使用を開始している
- MicrosoftはRustとWebAssemblyによってKrustletというプロダクトを実装した
- Facebookは仮想通貨のコアLibraをRustで実装した
- Googleは現在開発中のFuchasia OSのライブラリをRustで
公開している
- IBMはRustを使ってNode.jsのプロジェクトを書き換えた
- DropBoxがAWSからの移行でRustを採用
- ドワンゴがOSSとして公開したFrugalosでRustを採用
Rustを気軽に試せるPlayground
https://play.rust-lang.org/
Rustの基本文法、非同期処理、アトリビュート
- 変数宣言
- 数値型
- 文字列型
- 配列
- 関数
- 制御構文
- 非同期処理(Future)
- アトリビュート
変数宣言
- 変数
- 不変は「let」
- 可変は「let mut」
数値型
文字列型
- str
- コアライブラリ
- 文字列スライスで扱える文字列データが固定
- UTF-8エンコード
- String
- 標準ライブラリ
- 文字列のデータ変更や長さの変更が可能
- UTF-8エンコード
- お互いに型変換が可能
- 型の名前に「&」をつけてその型を参照できる
- ただし、&strをStringに変換するには、メモリの確保が行われるので、
長い文字列は注意が必要
配列
- 配列のサイズは固定でコンパイル時に決まっている必要がある
- [要素の型; 要素数]
- 内部の値にアクセスするときは、[ ]を使って指定する
- 配列を参照する時は、自動的にスライスとして扱われるので、[start..end]の
ような範囲指定ができる
増減できる配列
- 要素数が増減できる型はVec(ベクタ型)
- vec![ ] と記述するとあらかじめ要素を詰めた状態を作ることができる
- [ ] によって内部の要素にアクセスできる
- 要素数以上の範囲にアクセスしようとするとパニックが起きてしまい、強制
終了してしまう
- パニックをなくし安全にアクセスするにはget()メソッドがある
- get()で範囲外へアクセスするとパニックせずにNoneを返す
関数
- 関数の定義はfnを使う
制御構文
非同期処理
- ランタイムが必要
- use futures::executor; で読み込む
- Future = Promise の感覚
- L13 のexecutor::block_on()で実行
アトリビュート
- アトリビュートはモジュール、クレート、要素に対するメタデータ
- 使用目的
- コンパイル時の条件分岐
- クレート名、バージョン、種類(バイナリか、ライブラリか)の設定
- リントの無効化
- コンパイラ付属の機能(マクロ、グロブ、インポートなど)の使用
- 外部ライブラリへのリンク
- ユニットテスト用の関数を明示
- #![test]
- ベンチマーク用の関数を明示
Rust環境構築
- rustup
- https://rustup.rs/
- 上記ページのコマンドを叩く
- % curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- % rustup --version
- その他便利なもの
- % cargo install cargo-edit
- % cargo install cargo -generate
- VS Code
- Rust RLS拡張機能のインストール
WebAssemblyでの開発
- WebAssembly(略してwasm)とは
- プログラミング言語やライブラリの名前ではない
- ブラウザ上で動くバイナリコードの新しいフォーマット(仕様)
- Google, Microsoft, Mozzila, Appleによって仕様が策定され開発が進められている
- 高速化手段、あるいはJavaScriptの処理系にできないことをするといった目的で提案された
- DOM操作はJSで行い、重い処理をwasmのモジュールに投げることを想定している
- 2017年11月にFirefox、Chrome、Safari、Edge等の主要なブラウザの全てに対応したと発表
された
- C/C++やRust、Golang、TypeScriptなどからコンパイルが可能
Rust + WebAssemblyでの開発準備
- 必要な環境
- npm
- cargo-generate
- wasm-pack
- curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
create
- cargo generate --git https://github.com/rustwasm/wasm-pack-template
- PJ_nameの入力
- Cargo.toml
- パッケージマネージャーとビルドツールの依存関係
- build
- cd PJ_name
- wasm-pack build
- Web page
- npm init wasm-app www
- cd www
- npm i
- npm audit fix 絶対にしない
- npm run start
- http://localhost:8080/
- アラートが出たらOK
- https://rustwasm.github.io/docs/book/game-of-life/introduction.html
- src/lib.rs へ記述
- index.html/index.js へ記述
- www/package.jsonへ追加
- wwwでnpm run start
https://github.com/tak002/wasm-game-of-life
チュートリアル
まとめ
- Rustとは?
- 比較的新しい言語
- とにかく速い
- C/C++言語の代わりになると言われている
- モダンな言語機能が一通り入っている
- 安全性が高い
- OSからWebまで幅広く実装できる
- WebAssembly(略してwasm)とは
- ブラウザ上で動くバイナリコードの新しいフォーマット(仕様)
- DOM操作はJSで行い、重い処理をwasmのモジュールに投げることを想定している
- C/C++やRust、Golang、TypeScriptなどからコンパイルが可能
- 所感
- なれない記述や概念が多いので難しい
- コンパイルエラーが出まくる(安全性が高い)のがエラーが読み慣れない
- 日本語のドキュメントまだまだ少ない
- 新しい言語は面白い

More Related Content

What's hot

OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallTakuya ASADA
 
2013年 re:Invent報告会
2013年 re:Invent報告会2013年 re:Invent報告会
2013年 re:Invent報告会Aya Komuro
 
Gitlab-CIを活かして自動化してみよう
Gitlab-CIを活かして自動化してみようGitlab-CIを活かして自動化してみよう
Gitlab-CIを活かして自動化してみようYoshiyuki Nakahara
 
Cloud9をつかってみた - LT駆動開発#25
Cloud9をつかってみた - LT駆動開発#25Cloud9をつかってみた - LT駆動開発#25
Cloud9をつかってみた - LT駆動開発#25NAKAOKU Takahiro
 
20160523 Red Hat and Microsoft
20160523 Red Hat and Microsoft20160523 Red Hat and Microsoft
20160523 Red Hat and MicrosoftTakayoshi Tanaka
 
社内勉強会(Docker)
社内勉強会(Docker)社内勉強会(Docker)
社内勉強会(Docker)Shinya Sasaki
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# DevelopersTakayoshi Tanaka
 
EC2の天井を超える
EC2の天井を超えるEC2の天井を超える
EC2の天井を超えるSugawara Genki
 

What's hot (10)

OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/Fall
 
2013年 re:Invent報告会
2013年 re:Invent報告会2013年 re:Invent報告会
2013年 re:Invent報告会
 
Gitlab-CIを活かして自動化してみよう
Gitlab-CIを活かして自動化してみようGitlab-CIを活かして自動化してみよう
Gitlab-CIを活かして自動化してみよう
 
OSv噺
OSv噺OSv噺
OSv噺
 
Cloud9をつかってみた - LT駆動開発#25
Cloud9をつかってみた - LT駆動開発#25Cloud9をつかってみた - LT駆動開発#25
Cloud9をつかってみた - LT駆動開発#25
 
20160523 Red Hat and Microsoft
20160523 Red Hat and Microsoft20160523 Red Hat and Microsoft
20160523 Red Hat and Microsoft
 
社内勉強会(Docker)
社内勉強会(Docker)社内勉強会(Docker)
社内勉強会(Docker)
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# Developers
 
EC2の天井を超える
EC2の天井を超えるEC2の天井を超える
EC2の天井を超える
 
Rx入門
Rx入門Rx入門
Rx入門
 

Similar to Rust + web assemblyやってみた

Ruby Enterprise Environment
Ruby Enterprise EnvironmentRuby Enterprise Environment
Ruby Enterprise EnvironmentTomoya Kawanishi
 
Rust と Wasmの現実
Rust と Wasmの現実Rust と Wasmの現実
Rust と Wasmの現実ShogoTagami1
 
Azure DevOps 関西 2019 - Overview
Azure DevOps 関西 2019 - OverviewAzure DevOps 関西 2019 - Overview
Azure DevOps 関西 2019 - OverviewKeiji Kamebuchi
 
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~Akira Inoue
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれMasataka MIZUNO
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデートAkira Inoue
 
Couch DB in 15minutes
Couch DB in 15minutesCouch DB in 15minutes
Couch DB in 15minutesYohei Sasaki
 
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」Kaz Aiso
 
Building document with the Sphinx public edtion
Building document with the Sphinx public edtionBuilding document with the Sphinx public edtion
Building document with the Sphinx public edtionYukihiko SAWANOBORI
 
Azure DevOps と開発管理
Azure DevOps と開発管理Azure DevOps と開発管理
Azure DevOps と開発管理Tsukasa Kato
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
Internet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Internet Week 2016 脆弱性スキャナによる対策支援の課題 VulsInternet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Internet Week 2016 脆弱性スキャナによる対策支援の課題 VulsKota Kanbe
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見zaru sakuraba
 
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~Akira Inoue
 
OSC 2010 Tokyo/Fall MSセッション
OSC 2010 Tokyo/Fall MSセッションOSC 2010 Tokyo/Fall MSセッション
OSC 2010 Tokyo/Fall MSセッションMasaki Takeda
 

Similar to Rust + web assemblyやってみた (20)

Ruby Enterprise Environment
Ruby Enterprise EnvironmentRuby Enterprise Environment
Ruby Enterprise Environment
 
Rust と Wasmの現実
Rust と Wasmの現実Rust と Wasmの現実
Rust と Wasmの現実
 
AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは
 
Azure DevOps 関西 2019 - Overview
Azure DevOps 関西 2019 - OverviewAzure DevOps 関西 2019 - Overview
Azure DevOps 関西 2019 - Overview
 
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
 
VIOPS07: “Practical” Guide to GlusterFS
VIOPS07: “Practical” Guide to GlusterFSVIOPS07: “Practical” Guide to GlusterFS
VIOPS07: “Practical” Guide to GlusterFS
 
Couch DB in 15minutes
Couch DB in 15minutesCouch DB in 15minutes
Couch DB in 15minutes
 
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
 
Building document with the Sphinx public edtion
Building document with the Sphinx public edtionBuilding document with the Sphinx public edtion
Building document with the Sphinx public edtion
 
Azure DevOps と開発管理
Azure DevOps と開発管理Azure DevOps と開発管理
Azure DevOps と開発管理
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
Internet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Internet Week 2016 脆弱性スキャナによる対策支援の課題 VulsInternet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Internet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
 
Keep a diary
Keep a diaryKeep a diary
Keep a diary
 
Askusa on AWS
Askusa on AWSAskusa on AWS
Askusa on AWS
 
LINE API × heroku ×selenium
LINE API × heroku ×selenium LINE API × heroku ×selenium
LINE API × heroku ×selenium
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
 
OSC 2010 Tokyo/Fall MSセッション
OSC 2010 Tokyo/Fall MSセッションOSC 2010 Tokyo/Fall MSセッション
OSC 2010 Tokyo/Fall MSセッション
 

More from tak

可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)tak
 
可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)tak
 
可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)tak
 
可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)tak
 
可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)tak
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたtak
 
TypeScriptのdecoratorについて
TypeScriptのdecoratorについてTypeScriptのdecoratorについて
TypeScriptのdecoratorについてtak
 
第ⅴ部:clean architecture アーキテクチャ Part8
第ⅴ部:clean architecture アーキテクチャ Part8第ⅴ部:clean architecture アーキテクチャ Part8
第ⅴ部:clean architecture アーキテクチャ Part8tak
 
第ⅴ部:clean architecture アーキテクチャ Part7
第ⅴ部:clean architecture アーキテクチャ Part7第ⅴ部:clean architecture アーキテクチャ Part7
第ⅴ部:clean architecture アーキテクチャ Part7tak
 
第ⅴ部:clean architecture アーキテクチャ Part6
第ⅴ部:clean architecture アーキテクチャ Part6第ⅴ部:clean architecture アーキテクチャ Part6
第ⅴ部:clean architecture アーキテクチャ Part6tak
 
第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5tak
 
第ⅴ部:clean architecture アーキテクチャ Part4
第ⅴ部:clean architecture アーキテクチャ Part4第ⅴ部:clean architecture アーキテクチャ Part4
第ⅴ部:clean architecture アーキテクチャ Part4tak
 
第ⅴ部:clean architecture アーキテクチャ Part3
第ⅴ部:clean architecture アーキテクチャ Part3第ⅴ部:clean architecture アーキテクチャ Part3
第ⅴ部:clean architecture アーキテクチャ Part3tak
 
第ⅴ部:clean architecture アーキテクチャ Part2
第ⅴ部:clean architecture アーキテクチャ Part2第ⅴ部:clean architecture アーキテクチャ Part2
第ⅴ部:clean architecture アーキテクチャ Part2tak
 
第ⅴ部:clean architecture アーキテクチャ Part1
第ⅴ部:clean architecture アーキテクチャ Part1第ⅴ部:clean architecture アーキテクチャ Part1
第ⅴ部:clean architecture アーキテクチャ Part1tak
 
第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則tak
 
第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則tak
 
第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよtak
 
第ⅰ部:Clean Architecture イントロダクション
第ⅰ部:Clean Architecture イントロダクション第ⅰ部:Clean Architecture イントロダクション
第ⅰ部:Clean Architecture イントロダクションtak
 

More from tak (19)

可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)
 
可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)
 
可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)
 
可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)
 
可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみた
 
TypeScriptのdecoratorについて
TypeScriptのdecoratorについてTypeScriptのdecoratorについて
TypeScriptのdecoratorについて
 
第ⅴ部:clean architecture アーキテクチャ Part8
第ⅴ部:clean architecture アーキテクチャ Part8第ⅴ部:clean architecture アーキテクチャ Part8
第ⅴ部:clean architecture アーキテクチャ Part8
 
第ⅴ部:clean architecture アーキテクチャ Part7
第ⅴ部:clean architecture アーキテクチャ Part7第ⅴ部:clean architecture アーキテクチャ Part7
第ⅴ部:clean architecture アーキテクチャ Part7
 
第ⅴ部:clean architecture アーキテクチャ Part6
第ⅴ部:clean architecture アーキテクチャ Part6第ⅴ部:clean architecture アーキテクチャ Part6
第ⅴ部:clean architecture アーキテクチャ Part6
 
第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5
 
第ⅴ部:clean architecture アーキテクチャ Part4
第ⅴ部:clean architecture アーキテクチャ Part4第ⅴ部:clean architecture アーキテクチャ Part4
第ⅴ部:clean architecture アーキテクチャ Part4
 
第ⅴ部:clean architecture アーキテクチャ Part3
第ⅴ部:clean architecture アーキテクチャ Part3第ⅴ部:clean architecture アーキテクチャ Part3
第ⅴ部:clean architecture アーキテクチャ Part3
 
第ⅴ部:clean architecture アーキテクチャ Part2
第ⅴ部:clean architecture アーキテクチャ Part2第ⅴ部:clean architecture アーキテクチャ Part2
第ⅴ部:clean architecture アーキテクチャ Part2
 
第ⅴ部:clean architecture アーキテクチャ Part1
第ⅴ部:clean architecture アーキテクチャ Part1第ⅴ部:clean architecture アーキテクチャ Part1
第ⅴ部:clean architecture アーキテクチャ Part1
 
第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則
 
第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則
 
第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ
 
第ⅰ部:Clean Architecture イントロダクション
第ⅰ部:Clean Architecture イントロダクション第ⅰ部:Clean Architecture イントロダクション
第ⅰ部:Clean Architecture イントロダクション
 

Rust + web assemblyやってみた

  • 2. Rustとは? - 比較的新しい言語 - Stack Overflowで2016年から5年連続で1位 - とにかく速い - 機械語に直接コンパイル - ガベージコレクションを持たない - ゼロコスト抽象化を追求している - C/C++言語の代わりになると言われている - モダンな言語機能が一通り入っている - 安全性が高い - OSからWebまで幅広く実装できる - 他言語関数インターフェイスを用いている
  • 3. Rustの利用事例 - AWSはFirecrackerをRustで実装した - AWS Lambda が「カスタムランタイム」という機能を追加し、Rustをサポートし て - MicrosoftはRustをソフトウェア安全性を高く保つソリューションとして評価し、 実際に使用を開始している - MicrosoftはRustとWebAssemblyによってKrustletというプロダクトを実装した - Facebookは仮想通貨のコアLibraをRustで実装した - Googleは現在開発中のFuchasia OSのライブラリをRustで 公開している - IBMはRustを使ってNode.jsのプロジェクトを書き換えた - DropBoxがAWSからの移行でRustを採用 - ドワンゴがOSSとして公開したFrugalosでRustを採用
  • 5. Rustの基本文法、非同期処理、アトリビュート - 変数宣言 - 数値型 - 文字列型 - 配列 - 関数 - 制御構文 - 非同期処理(Future) - アトリビュート
  • 8. 文字列型 - str - コアライブラリ - 文字列スライスで扱える文字列データが固定 - UTF-8エンコード - String - 標準ライブラリ - 文字列のデータ変更や長さの変更が可能 - UTF-8エンコード - お互いに型変換が可能 - 型の名前に「&」をつけてその型を参照できる - ただし、&strをStringに変換するには、メモリの確保が行われるので、 長い文字列は注意が必要
  • 9.
  • 10. 配列 - 配列のサイズは固定でコンパイル時に決まっている必要がある - [要素の型; 要素数] - 内部の値にアクセスするときは、[ ]を使って指定する - 配列を参照する時は、自動的にスライスとして扱われるので、[start..end]の ような範囲指定ができる
  • 11.
  • 12. 増減できる配列 - 要素数が増減できる型はVec(ベクタ型) - vec![ ] と記述するとあらかじめ要素を詰めた状態を作ることができる - [ ] によって内部の要素にアクセスできる - 要素数以上の範囲にアクセスしようとするとパニックが起きてしまい、強制 終了してしまう - パニックをなくし安全にアクセスするにはget()メソッドがある - get()で範囲外へアクセスするとパニックせずにNoneを返す
  • 13.
  • 16. 非同期処理 - ランタイムが必要 - use futures::executor; で読み込む - Future = Promise の感覚 - L13 のexecutor::block_on()で実行
  • 17. アトリビュート - アトリビュートはモジュール、クレート、要素に対するメタデータ - 使用目的 - コンパイル時の条件分岐 - クレート名、バージョン、種類(バイナリか、ライブラリか)の設定 - リントの無効化 - コンパイラ付属の機能(マクロ、グロブ、インポートなど)の使用 - 外部ライブラリへのリンク - ユニットテスト用の関数を明示 - #![test] - ベンチマーク用の関数を明示
  • 18.
  • 19. Rust環境構築 - rustup - https://rustup.rs/ - 上記ページのコマンドを叩く - % curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - % rustup --version - その他便利なもの - % cargo install cargo-edit - % cargo install cargo -generate - VS Code - Rust RLS拡張機能のインストール
  • 20. WebAssemblyでの開発 - WebAssembly(略してwasm)とは - プログラミング言語やライブラリの名前ではない - ブラウザ上で動くバイナリコードの新しいフォーマット(仕様) - Google, Microsoft, Mozzila, Appleによって仕様が策定され開発が進められている - 高速化手段、あるいはJavaScriptの処理系にできないことをするといった目的で提案された - DOM操作はJSで行い、重い処理をwasmのモジュールに投げることを想定している - 2017年11月にFirefox、Chrome、Safari、Edge等の主要なブラウザの全てに対応したと発表 された - C/C++やRust、Golang、TypeScriptなどからコンパイルが可能
  • 21. Rust + WebAssemblyでの開発準備 - 必要な環境 - npm - cargo-generate - wasm-pack - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
  • 22. create - cargo generate --git https://github.com/rustwasm/wasm-pack-template - PJ_nameの入力 - Cargo.toml - パッケージマネージャーとビルドツールの依存関係 - build - cd PJ_name - wasm-pack build - Web page - npm init wasm-app www - cd www - npm i - npm audit fix 絶対にしない - npm run start - http://localhost:8080/ - アラートが出たらOK
  • 23. - https://rustwasm.github.io/docs/book/game-of-life/introduction.html - src/lib.rs へ記述 - index.html/index.js へ記述 - www/package.jsonへ追加 - wwwでnpm run start https://github.com/tak002/wasm-game-of-life チュートリアル
  • 24. まとめ - Rustとは? - 比較的新しい言語 - とにかく速い - C/C++言語の代わりになると言われている - モダンな言語機能が一通り入っている - 安全性が高い - OSからWebまで幅広く実装できる - WebAssembly(略してwasm)とは - ブラウザ上で動くバイナリコードの新しいフォーマット(仕様) - DOM操作はJSで行い、重い処理をwasmのモジュールに投げることを想定している - C/C++やRust、Golang、TypeScriptなどからコンパイルが可能 - 所感 - なれない記述や概念が多いので難しい - コンパイルエラーが出まくる(安全性が高い)のがエラーが読み慣れない - 日本語のドキュメントまだまだ少ない - 新しい言語は面白い

Editor's Notes

  1. まず、Rustとは何か?から学びたいと思います。 比較的新しい言語で、2015年に正式リリースされています。 元々はMozilla社にいた人で現在はSwiftの開発に携わっている、Graydon Hoare氏と、 JavaScriptの作者である、Brendan Eich氏が中心となって設計された言語で、 それまではMozillaが開発するブラウザエンジンに採用され、大規模なappの開発に耐えうる言語へと進化してきました。 Rustは近年注目されている言語で、Stack Overflowでは「最も愛されている言語」で2016年から5年連続で1位を獲得しています。 そして、図を見て頂くとわかるように、パフォーマンスを非常に重視した言語で、一般にプログラミング言語の中で最速と言われている、C/C++に匹敵する速さを誇っており、その実行速度と安全性からC/C++の代わりとなる言語と言われています。 この要因は3点あります。 1、Rustは機械語に直接コンパイルされます ちなみに、Rustはインタプリタ言語ではなく、コンパイラ言語とされています。 2、ガベージコレクションを持たない  ガベージコレクションとは、普段プログラミングでコンピュータのメモリ領域を使っていますが、不要なメモリ領域を解放する瞬間に、数m秒から数秒間計算処理を止めてしまう可能性があるのですが、Rustはこのガベージコレクションを持たずに「所有権」「借用」「ライフタイム」という仕組みで実現したため実行速度が速くなります。ガベージコレクションを持たないことに違和感を感じられる方もいらっしゃるかもしれませんが、所有権、借用、ライフタイムはRustの新しい概念で第三の手法としてRustが実現しています。 3、「ゼロコスト抽象化」を追求している ゼロコスト抽象化はもともとC++で追求されていた概念で、 プログラミング言語が持つ抽象化の機能を追加のコストを支払うことなく使用できるものになります。 コストとは実行速度の低下や、メモリ使用量の増加などです。 そして、プログラムを抽象化するとは、似たような処理やデータを共通化することを指しており、 Rustはこうした「抽象化」を「ゼロコスト」で行うことができます。 で、なぜゼロコストなのかというと、Rustは静的ディスパッチで、 メモリの確保を行なっており、既知のメモリしか確保しないため、 動的ディスパッチのように余分なメモリを確保する必要がありません。 つまり、「抽象化に対する追加のコストがゼロ」と言い換えができます。 あとは、新しい言語ということでモダンな言語機能が一通り入っています。 それは、 ・不変・可変を明示的に制御できたり、 ・filterやmapなどを使ってコレクションを操作できたり、 ・強力な型推論が働いたり、 ・switch文を強力にしたパターンマッチングと呼ばれる機能や ・トレイトによるポリモーフィズムなどがあります。 トレイトは型が持つべき性質(実装するメソッド)を定義するのですが、 Javaのinterfaceに似ていますが公式には違いがあると記述されており柔軟性が高いとされています。 例えば配列のようなコンテナ型をジェネリクスとして定義する際、 大小比較が可能な値を格納している時に限りsortメソッドを追加で提供するといった制御が可能です。 https://doc.rust-jp.rs/book-ja/ch10-02-traits.html また、安全性が高いというのも特徴の1つです。 これは、「メモリ安全ではない操作」や「スレッド安全でない操作」を未然に防ぐように設計されています。 Rustではコンパイル時に、メモリ安全やスレッド安全であるかを検査し、 安全でなければコンパイルエラーを返すようにできています。 さらに、マルチスレッドによる並列実行時のデータ競合もコンパイル時に 発見できます。 そして、C/C++が扱う領域とほぼ似たような領域を扱うことができ、 いわゆる低レイヤーと呼ばれる、OSやネットワーク関係から Webアプリのバックエンドにも利用できます。 後は、他言語関数インターフェイスを用いており、 他のプログラミング言語との間で相互に関数を呼び出せるため、 全てをRustで開発するのではなく既存のソフトウェアの資産を生かしながら、 重い処理のみをRustで書き換えることもできます。 例えば、Python/Ruby/Node.jsなどのランタイムからでもRustの関数を呼び出せたり、 Pythonなど特定の言語との連携に便利なデータ型やマクロを定義したRustパッケージなども用意されています。
  2. Rustは多くの大企業も注目している言語のため、 様々な利用事例がございます。 このように多くの企業がRustを採用し始めています。 これら採用理由を見ると、Rustのパフォーマンスの良さや、安全性の高さ、 ツール周りの充実による生産性の高さなどに魅力を感じて採用しているケースが多いようです。 日本でも広く知られるようになって来たのは2019年頃と言われています。
  3. ちなみにRustには気軽に動かせる playgroundが存在します。 興味を持たれた方は是非遊んでみてください。 https://play.rust-lang.org/
  4. ではここからRustの基本文法について触れていきます。 Rustには、コアライブラリと標準ライブラリという2つのライブラリが存在します。 コアライブラリは、ライブラリの中でも最も根幹にあるもので、 他のシステムライブラリやプラットフォームに依存しない最小限の機能を備えたものです。 今回は、コアライブラリの最低限の文法に絞っています。
  5. 続いては、数値型です。 数値型の名前は、アルファベット1文字とその大きさ(ビット)の数値でできています。 符号あり整数型はi、符号なし整数型はu、浮動小数点型はfで表します。 また、変数の大きさは8ビット、16ビット、32ビット、64ビット、128ビットが用意されています。 例えば、符号ありの整数型で32ビットの大きさの場合は、i32となります。 ただし、浮動小数点型は32ビットと64ビットだけなので注意が必要です。
  6. 続いては文字列型です。 Rustのコアライブラリの中で定義されている文字列は、strという1つのみです。 ただし、strは扱える文字列データが固定サイズで文字列そのものの変更ができません。 一方、標準ライブラリにあるStringは、文字列データの変更や、 長さの変更が可能で文字列操作を行う場合にはこちらが一般的です。 strとStringはどちらもUTF-8エンコードされた文字列データを格納します。 そして、お互いに型変換が可能です。 型の名前に「&」を付けることで、その型の参照を表すようになります。 ただし、&strをStringに変換するときは、ももりを圧迫してしまうので、 長い文字列は注意が必要です。
  7. 文字列を変数へ格納するとこのようになります。 1つ目のs1は標準ライブラリのStringで格納しています。 2つ目のs2はコアライブラリのstrで格納しています。 3つ目のs3はStringからstrへ変換しています。 4つ目のs4はstrからStringへ変換しています。 これを出力すると、ちゃんと文字列がそれぞれ格納されていることがわかります。
  8. 1つ目のaは32ビットの整数が3つ入る配列で、0~2が入っています。 2つ目のbは32ビットの整数が5つ入る配列で、1が5個はいっています。 3つ目のcは可変にして上書きしています。
  9. こちらはコアライブラリではなく標準ライブラリになりますが、 使用頻度が高いため掲載いたしました。 https://qiita.com/Tamamu/items/6fd8f344cd9b4a20b7c2 https://tomoyuki-nakabayashi.github.io/book/start/panicking.html https://doc.rust-jp.rs/book-ja/ch09-01-unrecoverable-errors-with-panic.html
  10. getした後にSomeと表示されていますが、 これはOption<T>型になります。 取得できないかもしれない値 を表現する列挙型で、 値が無いことを示すNoneとあることを示すSome(T)のどちらかをとります。
  11. 左側図が代表的なFizzBuzzを作った時のコードです。 fizz_buzzというメソッド内に 1から100までの数字を繰り返すfor文があり、 その中でif文で ここまでで最低限の基本的な構文を学んだので、次は環境構築をしていきます。
  12. 非同期処理にはランタイムが必要です。 ランタイムとは、プログラムを動かすときに必要な部品のことです。 use futures::executor; がJSのimportのようになっており、 必要なモジュールだったり部品を読み込んでいます。 このFutureは乱暴なイメージですが、 Promiseのようなものです。 L13 のexecutor::block_on()ですが、これは非同期関数を実行するのに必要な関数です。 記述方法は、JSのasync/awaitに似ているので、直感的に分かりやすいと思います。 ※スレッド処理
  13. Rustにはアトリビュートと呼ばれる概念が存在します。 アトリビュートはモジュール、クレート、要素に対するメタデータで、 以下のような使用目的があります。 ・コンパイル時の条件分岐 ・クレート名、バージョン、種類(バイナリか、ライブラリか)の設定 ・リントの無効化 ・コンパイラ付属の機能(マクロ、グロブ、インポートなど)の使用 ・外部ライブラリへのリンク ・ユニットテスト用の関数を明示 例えば、#![test]を記述すると、--testオプションを渡した時だけコンパイルされるようになります ・ベンチマーク用の関数を明示 https://doc.rust-jp.rs/rust-by-example-ja/attribute.html https://qiita.com/jin237/items/91eafe801d29d56c2cc2
  14. 画像は条件によってコンパイルするかどうかを決めることができる アトリビュートです。 https://developer.mozilla.org/ja/docs/WebAssembly/Rust_to_wasm https://qiita.com/legokichi/items/5d6344314ab6d6633554#wasm-bindgen-%E7%B3%BB%E7%B5%B1 https://qiita.com/8pockets/items/0b6bb582a1bfa995559e
  15. 続いては、Rustの環境構築ですが、rustupという専用のインストーラを使用します。 その他必要なものをインストールします。 cargo(カーゴ)はRustのパッケージマネージャです。 VS Codeを使用する場合は、Rust用の Language Serveです。 コードの自動補完や、変数関数の定義参照、コードの自動フォーマット、 コードのエラー分析や修正案の提示などの機能があります。 Rustで検索すると一番最初に出てきますので、 是非インストールしておきましょう。 上記コマンドでRustの環境構築は完了です。
  16. WebAssemblyが生まれた経緯ですが、一番の理由は「JavaScriptに実行速度が求められる時代になった」からです。 JSは動的型付けをしており解析に時間がかかることや、 近年では「複雑なアニメーション」「PCより劣るモバイル端末への対応」 など用途が広がり実行速度が求められるようになってきました。 この課題を解決すべくWebAssemblyが開発されました。 このWebAssemblyですが、プログラミング言語やライブラリの名前ではなく、 ブラウザ上で動くバイナリコードの新しいフォーマット(仕様)にすぎません。 バイナリコード・・・コンピューターに処理を依頼する命令を、CPUが理解できるように2進数で表したコードのこと をブラウザが扱えるようになることで、JSに比べてファイルサイズを大幅に小さくでき先程の課題を解決できます。 これにより最大で3倍速くなると言われています。 将来的には、JavaScriptを書かずにGC, DOM, Web API操作を目標としていますが、 現時点では、JSの置き換えではなく、性能が必要な処理を肩代わりする立ち位置になります。 また、コンパイル可能な言語としては、C/C++やRustなどからコンパイル可能となっています。
  17. ここからはRustでWebAssemblyを使ったアプリケーション開発のための、環境構築を行います。 まずは定番のnpm、そして、先程の環境構築でインストール済みですが、 cargo-generate、 このcargo-generateですが、 wasmプロジェクトは定型ファイルが多いため、テンプレートリポジトリからプロジェクトを始めるためのもので、 wasm開発に必要なファイル群を簡単に作ってくれます。 続いては、wasm-packです。 右下のカニの画像がアイコンになっているのですが、 Rustからwasmへのビルドを目的としたタスクランナーです。 wasmプロジェクトの作成、Rustのプログラムからwasmのパッケージをビルドし、 テスト、npmレジストリへの公開を一気に行うことができるツールです。 下のコマンドでインストールできます。
  18. https://github.com/tak002/wasm-game-of-life
  19. では、最後にまとめです。 「Rustとは?」 比較的新しい言語で、2015年に正式リリースされています。 その実行速度と安全性からC/C++の代わりになる言語とされています。 モダンな言語機能が一通り入っています。 「WebAssemblyとは?」 プログラミング言語やライブラリの名前ではなく、ブラウザ上で動くバイナリコードの新しいフォーマットです。 バイナリコードのため、非常に高速で、現時点では、JSの置き換えではなく、性能が必要な処理を肩代わりする立ち位置になります。 現状では、C/C++やRust、Golang、TypeScriptなどからコンパイルが可能です。 「触ってみた所感」 慣れない記述や概念が多いので難しいというのは、 「所有権や借用規制」や「トレイトやムーブセマンティクス」という概念だったり、 覚えることが多い印象。 安全性が高いことの裏返しですが、コンパイルエラー出まくって エラー内容がまだ読み慣れないので大変。 あと、まだまだ充実した日本語ドキュメントは少ないように思います。 それから、やっぱり新しい言語は学ぶのは刺激が多くて楽しいです。