SlideShare a Scribd company logo
コンパイルターゲット⾔語としての

WEBASSEMBLY、

そしてLINEでの実践
Jun, LINE Corp.
kawasako, LINE Corp.
⾃⼰紹介
@uta_tti
https://github.com/utatti
•プログラミング⾔語を作る、とは
•Wasmをターゲット⾔語*にする

WEB⾔語の設計
•Wasmバイトコードを⽣成する

コンパイラの作成
•LINEでの実践
Agenda
*コンパイルターゲット⾔語: コンパイラがコードジェネレーションで吐き出す⾔語
e.g. TypeScriptのターゲット⾔語はJavaScript
プログラミング⾔語を作る
● Wasmのコンパイルターゲット⾔語としての可能性を調査

● Wasmに直接コンパイルする (v.s. LLVM IR)
● 容量をへらす
● ユースケースを考慮した設計
なぜ作る必要があるのか
● https://github.com/utatti/kou
● A minimal language compiled into wasm bytecode
The kou Programming Language
● ⾔語を設計する
● ⾔語のコンパイラを書く
プログラミング⾔語を作る
● 機能と⽂法を決める

● 想定しているユースケース
● 好み
プログラミング⾔語の設計
● どういう⾔語を作りたいのか
● 他の⾔語のいいところを考えてみる
好みは重要
let fac = fn (n int) int {
let res = if n == 1 {
1
} else {
n * fac(n - 1)
};
res
}
Example
let fac = fn (n int) int {
let res = if n == 1 {
1
} else {
n * fac(n - 1)
};
res
}
好み1: 型安全性
let fac = fn (n int) int {
let res = if n == 1 {
1
} else {
n * fac(n - 1)
};
res
}
好み2: Braces over indents
Easier to parse
let fac = fn (n int) int {
let res = if n == 1 {
1
} else {
n * fac(n - 1)
};
res
}
好み3: Expression-oriented
From Rust
● Wasm: 現在仕様で作りやすいように

● WEB上動く: バイトコードの容量を⼩さく

● 想定ユーザー: JS開発者
ユースケース
let arr = [1, 2, 3, 4, 5];
let i = 0;
while i < len(arr) {
...
i = i + 1;
}
ユースケース1: Wasm
Smaller bytecode output
let arr = [1, 2, 3, 4, 5];
let i = 0;
while i < len(arr) {
...
i = i + 1;
}
ユースケース2: ⽂法
C-like
● ⾔語仕様書を書く
● EBNF (Extended Backus-Naur Form)
● | alternation
● () grouping
● [] option (0 or 1 times)
● {} repetition (0 to n times)
● 他の⾔語の仕様書を参考にすると良い
● The Go Programming Language
● https://golang.org/ref/spec
設計を形にする
いったんDEMO
kouのリポジトリでも⾒れます!

https://github.com/utatti/kou
● The real work starts here...

● 😇
コンパイラを書く
Optim.
Code gen.
コンパイラの構造
ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
Optim.
Code gen.ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
● Lexical analyzer
● Source code → Token* stream
● *Token: プログラミング⾔語のalphabet
● e.g. "hello", 1234, if, else, {, }
Lexer
Optim.
Code gen.ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
● Syntactic analyzer
● Token stream → *AST
● *AST: Abstract syntax tree
● コードをツリー化したもの
Parser
Example: AST
main
Declaration ...
Module
Identifier
Params FunctionExpr
let main = fn () void {
..
}
● Parser generator
● EBNF → Parser

● Parser combinator
● e.g. Parsec in Haskell
● DSL for parser
● kou uses this

● Or just write from scratch
How to write parser
Optim.
Code gen.ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
● Syntactic sugarの解除

● 難しくいうと: Isomorphismの適⽤
● 簡単にいうと: あれとこれって同じっしょ、の適⽤
Desugarer
● Unary +の解除
● +1234 == 1234
● 1-tupleの解除
● (1234) == 1234
Example: Desugarer
Optim.
Code gen.ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
● Semantic analyzer
● Hindley-Milner type system
Type checker
● App for function application 

let x: A
function f(x: A): B
f(x): B
Example: Hindley-Milner type system
Optim.
Code gen.ParserLexer
Source
code
Target
code
コンパイラ

フロントエンド
コンパイラ

バックエンド
Desugarer Type
● AST → Target code (Wasm bytecode)
● 実際Wasmバイトコードを⽣成する部分
Code generator
Wasm

bytecodeWATASTkou
kou compiler
Source
code
Target
code
● Specification
● https://webassembly.github.io/spec/core/

● Stack machine
WebAssembly bytecode
● Use stack to pass/return values
● v.s. Register machine

● e.g. WebAssembly VM, JVM
Stack machine
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
1
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
1
2
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
1
2
3
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
1
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
1
6 ← 2 * 3
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
7 ← 1 + 6
Example: Stack machine
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
7
Example: Value types
1 + 2 * 3
!
i32.const 1
i32.const 2
i32.const 3
i32.mul
i32.add
Stack
7
● Integer
● i32, i64
● Floating-point number
● f32, f64
● kou uses i32 and f64
● i64 cannot be used directly in JS
WebAssembly value types
● Tuple
● (1, true, 1.5)

● Array
● [1, 2, 3, 4, 5]

● WebAssembly Memory
Complex types
● Linear

● Virtual

● JS⼜はWasmでメモリを宣⾔
● (memory 1)
WebAssembly Memory
● Wasm has no high-level support for memory allocation
● ⼿動で管理するしか無い
Memory allocation
Memory allocation
4
…
4 because the pointer itself uses i32
● Wasm has no high-level support for memory allocation
● ⼿動で管理するしか無い
Memory allocation
4
…
16バイトください‼
● Wasm has no high-level support for memory allocation
● ⼿動で管理するしか無い
Memory allocation
20
16 bytes …
● Wasm has no high-level support for memory allocation
● ⼿動で管理するしか無い
● Array
Complex type (again!)
[1.0, 2.0, 3.0, 4.0, 5.0]
!
"###$#######$#######$#######$#######$#######%
& 5 & 1.0 & 2.0 & 3.0 & 4.0 & 5.0 &
'###(#######(#######(#######(#######(#######)
4 + 8 * 5 = 44 bytes
● Tuple
Complex type (again!)
(9, false, 5.35)
!
"###$###$########%
& 9 & 0 & 5.35 &
'###(###(########)
4 + 4 + 8 = 16 bytes
● しない
● Garbage collection: runtime overhead
● Reference counting: memory (and operation) overhead
● Handling memory fragment

● ユースケース: そこまでは必要ない
Memory freeing
もう1回DEMO
kouのリポジトリでも⾒れます!

https://github.com/utatti/kou
● AssemblyScript
● https://assemblyscript.org
● A TypeScript to WebAssembly compiler

● WebAssembly Studio
● https://webassembly.studio
Wasm Code gen. tip
つづく
後編
LINEでの実践について @kawasako より
FRONT-END
STANDARDIZATION
組織横断的にフロントエンド開発を標準化する
IN
技術調査/実践
内製ツール開発
OUT
OSS活動
技術イベント協賛
イベント運営
ブログ執筆
LINE の Front-end Standardization Team における標準化とは
WHAT IS STANDARDIZATION
社内だけでやっていること
社内でできていないこと
社内の均⼀化 ×
社内外がシームレスな組織になること ○
本題
WASMをどう使っていくか?
⼤量の演算が必要な時
UIの利⽤状況をヒートマップ形式で可視化するツール
YAKIMOCHI
[{"x":0,"y":55,"value":42},{"x":0,"y":65,"value":36},{"x":0,"y":75,"value":17},{"x":
0,"y":85,"value":25},{"x":0,"y":95,"value":31},{"x":0,"y":105,"value":19},{"x":0,"y":
115,"value":27},{"x":0,"y":125,"value":41},{"x":0,"y":135,"value":30},{"x":0,"y":
145,"value":33},{"x":0,"y":155,"value":44},{"x":0,"y":165,"value":58},{"x":0,"y":
175,"value":91},{"x":0,"y":185,"value":64},{"x":0,"y":195,"value":97},{"x":0,"y":
205,"value":81},{"x":0,"y":215,"value":249},{"x":0,"y":225,"value":103},{"x":0,"y":
235,"value":114},{"x":0,"y":245,"value":63},{"x":0,"y":255,"value":64},{"x":0,"y":
265,"value":79},{"x":0,"y":275,"value":26},{"x":0,"y":285,"value":33},{"x":0,"y":
295,"value":9},{"x":0,"y":305,"value":29},{"x":0,"y":315,"value":6},{"x":0,"y":
325,"value":20},{"x":0,"y":335,"value":8},{"x":0,"y":345,"value":8},{"x":0,"y":
355,"value":38},{"x":0,"y":365,"value":19},{"x":0,"y":375,"value":5},{"x":0,"y":
385,"value":13},{"x":0,"y":395,"value":27},{"x":0,"y":405,"value":20},{"x":0,"y":
415,"value":8},{"x":0,"y":425,"value":19},{"x":0,"y":435,"value":7},{"x":0,"y":
445,"value":181},{"x":0,"y":455,"value":23},{"x":0,"y":465,"value":16},{"x":0,"y":
475,"value":29},{"x":0,"y":485,"value":63},{"x":0,"y":495,"value":34},{"x":0,"y":
505,"value":24},{"x":0,"y":515,"value":8},{"x":0,"y":525,"value":35},{"x":0,"y":
画⾯に対して⼤量のデータが必要
解決したい課題
mb単位のデータがカジュアルに通信されてしまう = 遅い
データ圧縮/解凍をWASM(kou)で実装
ENCODED DATA
ENCODER / DECODER
ENCODER
(WASM)
DECODER
(WASM)
RAW DATA
API SERVER (NODE.JS) CLIENT (BROWSER)
RAW DATA
圧縮された⼩さいデータ元データ 復元されたデータ
Step-1
やること
pixel毎にどのくらいtapされているかというデータがたくさんある
Step-1
やること
X: 4
Y: 1
VALUE: 5
ひとつひとつは x座標, y座標, その座標のtap数のデータ
Step-1
やること
X: 4
Y: 1
VALUE: 5
もしXとYを省略できればデータ量は1/3にできる
Step-2
やること
実はX,Yの座標は⾏列に変換すると必要なくなる
5
4px, 1px

value: 5
4px
1px
Step-2
やること
そのデータが何番⽬にあるかで座標がわかる 2x3の場合は12番⽬のデータになる
5
1
2px, 3px
value: 1
2px
3px
Step-2
やること
データを⾏列に埋めていくとデータの⼊らない場所ができる
0 1 2 3 5
5 6 7 8 9
10 1 12 13 14
15 16 17 18 19
20 21 22 23 24
Step-3
やること
連続したデータは何回連続するかという情報に変換して詰めちゃう(圧縮しちゃう)
*4 5 *6 1 *2 14 *4 19 21*1 *3
Step-4
やること
この⼩さいデータをブラウザで受け取って逆の処理をする (decode)
0 1 2 3 5
5 6 7 8 9
1 1 1 1 1
1 1 1 1 1
2 2 2 2 2
圧縮済データ
⾏列データ
元データ
の場合
WAT
全662⾏ 半年ほど前にflood-fillという簡単なアルゴリズムを実装したが苦⾏だった..
の場合
kou
全79⾏
let zip = fn (a [int], col int, row int) ([int], int) {
~ 中略 ~
while (i < l) {
if (a[i - 1] == a[i]) {
ct = ct + 1;
} else {
res = next(res, a[i - 1], ct);
ct = 0;
};
if (i == l - 1) {
res = next(res, a[i], ct);
} else {};
i = i + 1;
};
~ 中略 ~
res
}
の場合
kou
JSerであれば直感的に書ける
成果
じゃんじゃかじゃん
すごい
成果
約1/5まで圧縮 encode処理もJSで書くよりも3-4倍⾼速
1.4mb > 255kb
● ⾼階層な⾔語ではないので中で何をやっているかは想像しやすい
● わからなくても作者が近くにいたので最強になれる
● それは普段あまりない経験

● wat書くよりはるかに楽で感動すら覚える
● しかしlog関数がないのはしんどい (⾃分で追加しようとした)
● 型の問題があってちゃんとやろうとするとそこそこ⼤変

● 全てがUint32Array問題
● ⼤きな動画や画像データなど扱いたい時メモリを⾷いすぎる
● wasm使いたいモチベーションと相反する

● いつも⽂句いいながら書いてたけどJavaScriptって便利だな...なんでもあるやんけ...
所感
kou
● LINEでは実験的な社内プロダクトがいくつかありその中では様々な挑戦をしている
● wasmもその中のひとつ

● wasmを直接触ることになるエンジニアの数は少ないと思う
● しかし、間違いなくライブラリやフレームワークで利⽤することになる

● 今後こんなことができるようになるかも と可能性を⾒据えて置くことは⼤事
● 「これって実現可能なの?」を判断するのは開発者の⼤事な仕事

● それはwasmで⾔えば今まで扱えなかったような巨⼤なデータや処理を扱うことだっ
たりするかもしれない webp, webm
⾔いたいこと⾔う
まとめ
THANK YOU

More Related Content

What's hot

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
LINE Corporation
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
Takateru Yamagishi
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境
KiyotomoHiroyasu
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
Mr. Vengineer
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
MITSUNARI Shigeo
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
 
LTを支える技術(LLD'11 Winter)
LTを支える技術(LLD'11 Winter)LTを支える技術(LLD'11 Winter)
LTを支える技術(LLD'11 Winter)
masayoshi takahashi
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
正しいものを正しくつくる
正しいものを正しくつくる正しいものを正しくつくる
正しいものを正しくつくる
toshihiro ichitani
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
 
ElixirでFPGAを設計する
ElixirでFPGAを設計するElixirでFPGAを設計する
ElixirでFPGAを設計する
Hideki Takase
 

What's hot (20)

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
No skk, no life.
No skk, no life.No skk, no life.
No skk, no life.
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 
llvm入門
llvm入門llvm入門
llvm入門
 
LTを支える技術(LLD'11 Winter)
LTを支える技術(LLD'11 Winter)LTを支える技術(LLD'11 Winter)
LTを支える技術(LLD'11 Winter)
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
正しいものを正しくつくる
正しいものを正しくつくる正しいものを正しくつくる
正しいものを正しくつくる
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
ElixirでFPGAを設計する
ElixirでFPGAを設計するElixirでFPGAを設計する
ElixirでFPGAを設計する
 

Similar to コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践

第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
Akineko Shimizu
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
mitim
 
卒研発表
卒研発表卒研発表
卒研発表
yayugu
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
Hiro Yoshioka
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているpocketberserker
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Koichi Sakata
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
daiki hojo
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
信之 岩永
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
Hiro Yoshioka
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
koturn 0;
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
Hiro Yoshioka
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
Ken Morishita
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Kei IWASAKI
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49shoma h
 
Evolution Of Enumerator
Evolution Of EnumeratorEvolution Of Enumerator
Evolution Of Enumerator
Akinori Musha
 

Similar to コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践 (20)

第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
卒研発表
卒研発表卒研発表
卒研発表
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
Cli mini Hack!#1 ~Terminalとの親睦を深めよう~
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
Evolution Of Enumerator
Evolution Of EnumeratorEvolution Of Enumerator
Evolution Of Enumerator
 

More from LINE Corporation

JJUG CCC 2018 Fall 懇親会LT
JJUG CCC 2018 Fall 懇親会LTJJUG CCC 2018 Fall 懇親会LT
JJUG CCC 2018 Fall 懇親会LT
LINE Corporation
 
Reduce dependency on Rx with Kotlin Coroutines
Reduce dependency on Rx with Kotlin CoroutinesReduce dependency on Rx with Kotlin Coroutines
Reduce dependency on Rx with Kotlin Coroutines
LINE Corporation
 
Kotlin/NativeでAndroidのNativeメソッドを実装してみた
Kotlin/NativeでAndroidのNativeメソッドを実装してみたKotlin/NativeでAndroidのNativeメソッドを実装してみた
Kotlin/NativeでAndroidのNativeメソッドを実装してみた
LINE Corporation
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extension
LINE Corporation
 
The Magic of LINE 購物 Testing
The Magic of LINE 購物 TestingThe Magic of LINE 購物 Testing
The Magic of LINE 購物 Testing
LINE Corporation
 
GA Test Automation
GA Test AutomationGA Test Automation
GA Test Automation
LINE Corporation
 
UI Automation Test with JUnit5
UI Automation Test with JUnit5UI Automation Test with JUnit5
UI Automation Test with JUnit5
LINE Corporation
 
Feature Detection for UI Testing
Feature Detection for UI TestingFeature Detection for UI Testing
Feature Detection for UI Testing
LINE Corporation
 
LINE 新星計劃介紹與新創團隊分享
LINE 新星計劃介紹與新創團隊分享LINE 新星計劃介紹與新創團隊分享
LINE 新星計劃介紹與新創團隊分享
LINE Corporation
 
​LINE 技術合作夥伴與應用分享
​LINE 技術合作夥伴與應用分享​LINE 技術合作夥伴與應用分享
​LINE 技術合作夥伴與應用分享
LINE Corporation
 
LINE 開發者社群經營與技術推廣
LINE 開發者社群經營與技術推廣LINE 開發者社群經營與技術推廣
LINE 開發者社群經營與技術推廣
LINE Corporation
 
日本開發者大會短講分享
日本開發者大會短講分享日本開發者大會短講分享
日本開發者大會短講分享
LINE Corporation
 
LINE Chatbot - 活動報名報到設計分享
LINE Chatbot - 活動報名報到設計分享LINE Chatbot - 活動報名報到設計分享
LINE Chatbot - 活動報名報到設計分享
LINE Corporation
 
在 LINE 私有雲中使用 Managed Kubernetes
在 LINE 私有雲中使用 Managed Kubernetes在 LINE 私有雲中使用 Managed Kubernetes
在 LINE 私有雲中使用 Managed Kubernetes
LINE Corporation
 
LINE TODAY高效率的敏捷測試開發技巧
LINE TODAY高效率的敏捷測試開發技巧LINE TODAY高效率的敏捷測試開發技巧
LINE TODAY高效率的敏捷測試開發技巧
LINE Corporation
 
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
LINE Corporation
 
LINE Things - LINE IoT平台新技術分享
LINE Things - LINE IoT平台新技術分享LINE Things - LINE IoT平台新技術分享
LINE Things - LINE IoT平台新技術分享
LINE Corporation
 
LINE Pay - 一卡通支付新體驗
LINE Pay - 一卡通支付新體驗LINE Pay - 一卡通支付新體驗
LINE Pay - 一卡通支付新體驗
LINE Corporation
 
LINE Platform API Update - 打造一個更好的Chatbot服務
LINE Platform API Update - 打造一個更好的Chatbot服務LINE Platform API Update - 打造一個更好的Chatbot服務
LINE Platform API Update - 打造一個更好的Chatbot服務
LINE Corporation
 
Keynote - ​LINE 的技術策略佈局與跨國產品開發
Keynote - ​LINE 的技術策略佈局與跨國產品開發Keynote - ​LINE 的技術策略佈局與跨國產品開發
Keynote - ​LINE 的技術策略佈局與跨國產品開發
LINE Corporation
 

More from LINE Corporation (20)

JJUG CCC 2018 Fall 懇親会LT
JJUG CCC 2018 Fall 懇親会LTJJUG CCC 2018 Fall 懇親会LT
JJUG CCC 2018 Fall 懇親会LT
 
Reduce dependency on Rx with Kotlin Coroutines
Reduce dependency on Rx with Kotlin CoroutinesReduce dependency on Rx with Kotlin Coroutines
Reduce dependency on Rx with Kotlin Coroutines
 
Kotlin/NativeでAndroidのNativeメソッドを実装してみた
Kotlin/NativeでAndroidのNativeメソッドを実装してみたKotlin/NativeでAndroidのNativeメソッドを実装してみた
Kotlin/NativeでAndroidのNativeメソッドを実装してみた
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extension
 
The Magic of LINE 購物 Testing
The Magic of LINE 購物 TestingThe Magic of LINE 購物 Testing
The Magic of LINE 購物 Testing
 
GA Test Automation
GA Test AutomationGA Test Automation
GA Test Automation
 
UI Automation Test with JUnit5
UI Automation Test with JUnit5UI Automation Test with JUnit5
UI Automation Test with JUnit5
 
Feature Detection for UI Testing
Feature Detection for UI TestingFeature Detection for UI Testing
Feature Detection for UI Testing
 
LINE 新星計劃介紹與新創團隊分享
LINE 新星計劃介紹與新創團隊分享LINE 新星計劃介紹與新創團隊分享
LINE 新星計劃介紹與新創團隊分享
 
​LINE 技術合作夥伴與應用分享
​LINE 技術合作夥伴與應用分享​LINE 技術合作夥伴與應用分享
​LINE 技術合作夥伴與應用分享
 
LINE 開發者社群經營與技術推廣
LINE 開發者社群經營與技術推廣LINE 開發者社群經營與技術推廣
LINE 開發者社群經營與技術推廣
 
日本開發者大會短講分享
日本開發者大會短講分享日本開發者大會短講分享
日本開發者大會短講分享
 
LINE Chatbot - 活動報名報到設計分享
LINE Chatbot - 活動報名報到設計分享LINE Chatbot - 活動報名報到設計分享
LINE Chatbot - 活動報名報到設計分享
 
在 LINE 私有雲中使用 Managed Kubernetes
在 LINE 私有雲中使用 Managed Kubernetes在 LINE 私有雲中使用 Managed Kubernetes
在 LINE 私有雲中使用 Managed Kubernetes
 
LINE TODAY高效率的敏捷測試開發技巧
LINE TODAY高效率的敏捷測試開發技巧LINE TODAY高效率的敏捷測試開發技巧
LINE TODAY高效率的敏捷測試開發技巧
 
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
LINE 區塊鏈平台及代幣經濟 - LINK Chain及LINK介紹
 
LINE Things - LINE IoT平台新技術分享
LINE Things - LINE IoT平台新技術分享LINE Things - LINE IoT平台新技術分享
LINE Things - LINE IoT平台新技術分享
 
LINE Pay - 一卡通支付新體驗
LINE Pay - 一卡通支付新體驗LINE Pay - 一卡通支付新體驗
LINE Pay - 一卡通支付新體驗
 
LINE Platform API Update - 打造一個更好的Chatbot服務
LINE Platform API Update - 打造一個更好的Chatbot服務LINE Platform API Update - 打造一個更好的Chatbot服務
LINE Platform API Update - 打造一個更好的Chatbot服務
 
Keynote - ​LINE 的技術策略佈局與跨國產品開發
Keynote - ​LINE 的技術策略佈局與跨國產品開發Keynote - ​LINE 的技術策略佈局與跨國產品開發
Keynote - ​LINE 的技術策略佈局與跨國產品開發
 

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 

Recently uploaded (8)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 

コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践