hello, c++ + javascript world! - boost.勉強会 #11 東京

151
++ + C++ JavaScript で広がる世界 @hecomi Boost.勉強会 #11 東京

Upload: hecomi

Post on 25-Jun-2015

6.820 views

Category:

Technology


6 download

DESCRIPTION

Boost.勉強会 #11 東京(http://partake.in/events/e75cde86-75c8-47ce-b647-2dbd0495b053)で発表した資料です。補足資料はこちら: http://d.hatena.ne.jp/hecomi/20130604/1370356501

TRANSCRIPT

Page 1: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

++ + C++ と JavaScript で広がる世界

@hecomi

Boost.勉強会 #11 東京

Page 2: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  C++ と JavaScript が関連するお話について、 広く浅く簡単に世界観を紹介したいと思います

Page 3: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  対象者

–  C++, JavaScript 知ってる人・興味がある人

•  内容

–  C++ と JS が関連した技術群それぞれについて、 

Hello world に毛が生えたくらいの内容を紹介します

– ちなみに Boost 成分 1 ㍉ もありません…

Page 4: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

自己紹介 •  Name : @hecomi

•  Blog : http://d.hatena.ne.jp/hecomi/

Page 5: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

自己紹介 – 未来っぽいお部屋

Node.js 上で動作する自作 C++ モジュールと組み合わせて作った未来っぽいお部屋

Page 6: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

目次 •  C++ + JS の世界感

•  V8

•  Node.js

•  Qt Quick

•  Native Client

•  Emscripten

Page 7: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript と言えばブラウザ…

Page 8: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

C++ で書かれている!

Page 9: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

ブラウザ以外でも…

Page 10: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

他にも有名ドコロで…

Page 11: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

他にも有名ドコロで…

Page 12: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

NativeClient

ネイティブアプリをブラウザ上で動かす

ブラウザの話に戻ると…

Page 13: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

NativeClient

ネイティブアプリをブラウザ上で動かす

Emscripten

C++ を JS に変換

ブラウザの話に戻ると…

Page 14: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

mobile

JavaScript

Java

C++

JNI

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

NativeClient

ネイティブアプリをブラウザ上で動かす

Emscripten

C++ を JS に変換

モバイル周りは更に色々ありますが省略

ex.) Android

Page 15: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

NativeClient

ネイティブアプリをブラウザ上で動かす

Emscripten

C++ を JS に変換 mobile

JavaScript

Java

C++

JNI

ex.) Android

Page 16: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ + JS の世界感

Browser Browser

JavaScript

エンジン

ゲーム用途

例: SimCity (WebKit + v8 で UI

を記述)

サーバサイド

JavaScript

アプリケーション開発

フレームワーク

NativeClient

ネイティブアプリをブラウザ上で動かす

Emscripten

C++ を JS に変換 mobile

JavaScript

Java

C++

JNI

ex.) Android

Page 17: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

V8 Chrome でおなじみの JavaScript エンジン

Page 18: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

内容 •  Introduction

•  V8 を使った JS の実行

•  C++ の関数 à JavaScript の関数

•  C++ のクラス à JavaScript のクラス

Page 19: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  V8 は、Chrome にも搭載されている C++ で書かれた JavaScript エンジン

その他のオープンなエンジンには SpiderMonkey (C),

Rhino (Java), JavaScriptCore (C++) 等があります

Page 20: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction - インストール

                       h#ps://github.com/v8/v8

or

                   %  brew  install  v8  

                   %  sudo  ap;tude  install  libv8-­‐dev

Page 21: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

動かしてみる

Page 22: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

V8 を使った JS の実行

※ 最近は Context.Dispose で‘ Isolate を引数に指定しない場合は Warning が出るようになったようです

Page 23: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Sample Code

この辺りは何となく 分かるけど…

Page 24: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

V8 を使った JS の実行

Context??

Page 25: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

•  独立した JS をある V8 インスタンスの中で実行する環境

•  JS は built-in 変数/関数も書換可能なのでグローバル空間を分離

•  2 つ目以降の Context の生成はローコストで可能

•  iframe とかイメージすると分かりやすいです

Context

Context A

Built-in func / obj

Custom func / obj

Context B

Built-in func / obj

Custom func / obj

Page 26: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

V8 を使った JS の実行

Handle??

Page 27: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Handle •  ヒープ内の JS オブジェクトの位置の参照

–  GC する度に JS オブジェクトの実体のヒープ位置は変わってしまうので

–  JS の世界の変数とのやり取りはこの Handle を通じて行う

•  Local Handle と Persistent Handle の 2 種類がある –  Local の寿命は Handle Scope で決定

–  Persistent は明示的に Dispose するまで破棄されない

Heap

“hogehoge” 100

Function Handle Scope

Local<String>

Local<Number>

Persistent<Function>

Page 28: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

V8 を使った JS の実行

Persistent ハンドルを返す

Local ハンドルを返す

Page 29: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

関数を追加したい!

Page 30: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

Page 31: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

この戻り値、引数で関数をつくります

Page 32: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

Value は JS の基本型(Number, Array, Object…) の基底クラスで、IsNumber() 等で型を確かめ、ToNumber() 等でアップキャスト出来ます。

Arguments は各引数(Value 型)に [ ] 演算子でアクセスでき、This や Callee などを参照できます。

Page 33: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

Context 生成時に global オブジェクト を指定することができます。

Page 34: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

“print” という関数を JS で呼ぶと、 ↑の print が実行されるように global オブジェクトにセットします

Page 35: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にやります

$ clang++ print_test.cpp –o print_test$ ./print_test100 + 200 = 300

実行 :

Page 36: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

lambda 版

Page 37: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

クラスを追加したい!

Page 38: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

クラスの追加 概要

myClass の internal field に void* で保存 が呼ばれ、

C++ 側であらかじめ登録しておいた関数内で、

プロパティの読み書きやメソッド呼び出しのタイミングで、

事前に登録しておいた C++ の関数が呼ばれる。その内部では、 void* から my_class* へキャストして、メンバ変数 hoge の 読み書きや、メンバ関数 piyo() の呼び出しをする。

Page 39: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

例えばこんなクラスを…

Page 40: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

例えばこんなクラスを…

メンバ変数

setter / getter

Page 41: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

例えばこんなクラスを…

なんか凄いことするメンバ関数

Page 42: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にします

Page 43: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にします

クラス内部の static 関数経由でのみ 呼ばれるようになるので private 化

setter / getter を JS 側から 呼ばれる形に変換

Page 44: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

こんな風にします

JS の世界へ送り出す処理を記述

JS 側で new された時と GC された時の処理

piyo を JS 側から 呼べるようにする

Page 45: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

my_class::ctor を元にした関数を作成

Page 46: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

JS のインスタンス変数、プロトタイプ変数 に相当する変数を取得

Page 47: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

そこへプロパティや そのアクセサをセットしたり

メソッドをセット したりします

Page 48: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

この関数をグローバル空間に追加します

Page 49: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

さっきは飛ばしましたが、ここでは 内部に JS からは見えない フィールドを 1 個作成しています

new 時に呼ばれるコンストラクタを見てみます

Page 50: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

こんな風 this オブジェクトに インスタンスを埋め込みます

( 0 はインデックス )

Page 51: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

参照されなくなったら削除する処理を書きます

Page 52: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

getter / setter では内部に保存した インスタンスを取り出して使います

Page 53: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

getter / setter では内部に保存した インスタンスを取り出して使います

Page 54: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

メソッドでも同じです

Page 55: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

JS の世界とつなぐ処理

$ ./hellohogehoge から fuga に書き換えられました fugapiyopiyo

実行 :

Page 56: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

参考文献 •  Chrome V8 Embedder’s Guide

–  https://developers.google.com/v8/embed?hl=ja

Page 57: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

NODE.JS サーバサイド JavaScript 環境

Page 58: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

内容 •  Introduction

•  Node.js の世界観

•  C++ モジュールの作成

Page 59: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  V8 をエンジンとして利用したサーバサイドの

JavaScript プラットフォーム

•  ブラウザの JavaScript では出来なそうなことが色々簡単に出来る環境です

Page 60: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  ファイルを読み込んだり…

Page 61: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  HTTP サーバを立てたり…

Page 62: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  HTTP サーバを立てたり…

Page 63: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

                                             h#p://nodejs.jp/nodejs.org_ja/

Introduction - インストール

                       h#ps://github.com/hokaccha/nodebrew

or

バージョン指定出来るのでこっちがオススメ

Page 64: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

JS  でつくりたいもの

Page 65: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

JS  でつくりたいもの

コアモジュール

fs,  h#p  などの組み込みモジュール

Page 66: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

JS  でつくりたいもの

コアモジュール

npm  モジュール

$  npm  install  hoge  で追加できるモジュール

fs,  h#p  などの組み込みモジュール

※ Node Packaged Modules

31,184 個 (2013/05/31 時点) も

登録されている。

WebSocket を使ったり、DB とつないだり、各サービスにアクセスしたり…

Page 67: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

JS  でつくりたいもの

コアモジュール

npm  モジュール 自作モジュール

$  npm  install  hoge  で追加できるモジュール

fs,  h#p  などの組み込みモジュール

Page 68: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

未来っぽいお部屋

コアモジュール

npm  モジュール 自作モジュール

twi#er,  socket.io,  express,  serialport,  …  

fs,  h#p  などの組み込みモジュール

音声認識、発話、各種ガジェット操作、…

例えば冒頭紹介した

Page 69: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Node.js の世界観

未来っぽいお部屋

コアモジュール

npm  モジュール 自作モジュール

twi#er,  socket.io,  express,  serialport,  …  

fs,  h#p  などの組み込みモジュール

C++ と組み合わせれば 出来ることの幅が拡がる!

音声認識、発話、各種ガジェット操作、…

例えば冒頭紹介した

Page 70: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

どうやって作るの?

Page 71: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

Page 72: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

JS の世界へ送り出す関数

Node.js の世界へ C++ の 関数を送り出す処理

Page 73: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

v8 で global に関数をセットした時と 同じ形に展開

Page 74: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

hello という名前のモジュールを作成 & JS 側へ変数/関数をセットする関数を指定(init)

Page 75: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

hello という名前のモジュールを作成 & JS 側へ変数/関数をセットする関数を指定(init)

Page 76: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

$ npm install node-gyp -g$ node-gyp configure build

binding.gyp

コンパイル :

先ほどと同じモジュール名

gyp (generate your projects) 用の 設定を json 形式で記述

ビルドは node 用の gyp (node-gyp) を用いる

Page 77: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

$ node helloworld

hello.js

実行 :

Page 78: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ モジュールの作成

$ node helloworld

hello.js

実行 :

Page 79: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

参考文献 •  Node.js マニュアル & ドキュメンテーション

–  http://nodejs.jp/nodejs.org_ja/api/addons.html

Page 80: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QT QUICK UI 記述言語 QML でクロスプラットフォームアプリを簡単に作成

Page 81: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

内容 •  Introduction

•  QML の例

•  C++ バインディング

Page 82: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  Qt

–  C++ で書かれたクロスプラットフォーム対応のアプリケーション開発フレームワーク

•  実績: Skype / Google Earth / Photoshop Elements

•  Qt Quick

–  C++ でなく QML という JavaScriptをベースにした言語で

UI 周りを記述する環境

•  Qt 4.x (Qt Quick 1) では WebKit の JavaScriptCore がエンジンだったが、Qt 5 (Qt Quick 2) からは V8 がエンジンになりました

Page 83: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  インストール

– 開発には C++ と JS の世界をまたがってコード補完してくれる Qt Creator が便利です

•  http://qt-project.org/downloads

Page 84: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の例

ProgressBar.qml main.qml

Page 85: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の例

ProgressBar.qml main.qml

JS が使える!

Page 86: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の例

ProgressBar.qml main.qml

プロパティの値でも!

Page 87: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の例

ProgressBar.qml main.qml

プログレスバーつき WebView

Page 88: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の例

ProgressBar.qml main.qml

プログレスバーつき WebView 簡単!

Page 89: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ バインディング

•  QML だけでは込み入ったことは出来ない

– 例えばローカルファイル IO とか

•  そこで C++ バインディング!

Page 90: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ バインディング

•  色々な方法がある

–  QML の要素を C++ で使う

–  QML の関数を C++ から呼ぶ

–  C++ のクラスを QML から使う

–  C++ で QML で使える型を定義する

Page 91: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ バインディング

•  色々な方法がある

–  QML の要素を C++ で使う

–  QML の関数を C++ から呼ぶ

–  C++ のクラスを QML から使う

–  C++ で QML で使える型を定義する

その他の方法については以下を参照!:

http://d.hatena.ne.jp/hecomi/20130503/1367594609

JS に関係する所

Page 92: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

C++ QML

Page 93: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

arr と obj を受け取り output に出力する関数

C++ QML

Page 94: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

QMLを表示 C++ QML

Page 95: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

配列と オブジェクト を作成

C++ QML

Page 96: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

setText を呼ぶ!

C++ QML

Page 97: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

setText を呼ぶ!

C++ QML

Page 98: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

QML の関数を C++ から呼ぶ

setText を呼ぶ!

簡単!

C++ QML

Page 99: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ のクラスを QML から使う

myclass.h

main.qml

main.cpp

Page 100: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ のクラスを QML から使う

myclass.h

main.qml

main.cpp

my という名前で MyClass をセット

Page 101: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ のクラスを QML から使う

myclass.h

main.qml

main.cpp

my という名前で MyClass をセット

そのまま使える!

Page 102: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ のクラスを QML から使う

myclass.h

main.qml

main.cpp

超簡単!

Page 103: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

C++ のクラスを QML から使う

myclass.h

main.qml

main.cpp

超簡単!

このオマジナイは何?

Page 104: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

moc

•  Qt には Meta Object Compiler (moc) というツールがある

•  qmake すると C++ から C++ を吐き出す

–  Q_INVOKABLE や signal / slot などのキーワードをアノーテーションとして解釈してコードを生成 •  キーワードは C++ に影響を与えないよう define されている

–  Q_OBJECT はそこに必要な幾つかのメンバを展開する

•  例えば qt_static_metacall という静的なメンバ関数を展開、この中で Q_INVOKABLE のついたメンバ関数を呼ぶ

Page 105: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

自動生成されたコード例

moc_myclass.cpp

myclass.h 内の Q_OBJECT で qt_static_metacall の宣言が生成され、

定義は別途生成された moc_myclass.cpp にて行われる。

ここで呼ばれる

Page 106: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

参考文献

•  Using QML Bindings in C++ Applications

–  http://harmattan-dev.nokia.com/docs/platform-api-

reference/xml/daily-docs/libqt4/qtbinding.html

•  QtQuick での C++ × QML バインディングについてまとめてみた

–  http://d.hatena.ne.jp/hecomi/20130503/1367594609

Page 107: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

NATIVE CLIENT ブラウザ上でネイティブアプリを動かす

Page 108: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

内容 •  Introduction

•  Hello World を動かしてみる

Page 109: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  Native Client (NaCl: 塩) はブラウザ上で安全にネイティブコードを実行

– サンプル: https://developers.google.com/showcase/

•  JS とやり取りも出来る!

Chrome extension としても利用可能

(↑ SSH Client が動く Secure Shell)

Page 110: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Install •  参照

–  Native Client の導入と Hello World までのまとめ

•  http://d.hatena.ne.jp/hecomi/20130128/1359372772

Page 111: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Native Client の世界観 ①

HTML

nmf

C++

nexe

make

アーキの振り分け

embed タグを起点としてロード

Page 112: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Native Client の世界観 ②

NaCl Pepper API JavaScript

ローカルファイル IO

2D/3D グラフィックス (OpenGL ES 2.0)

オーディオ

マウス/キーボード/

ゲームパッド

等々…

Pepper Plugin API (PPAPI) を経由して

ブラウザを超えた機能にアクセスする

Page 113: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Native Client の世界観 ②

NaCl Pepper API

NaCl (塩) に対し Pepper (胡椒)

JavaScript

ローカルファイル IO

2D/3D グラフィックス (OpenGL ES 2.0)

オーディオ

マウス/キーボード/

ゲームパッド

等々…

Pepper Plugin API (PPAPI) を経由して

ブラウザを超えた機能にアクセスする

Page 114: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Native Client の世界観 ③

JavaScript C++

PostMessage()

postMessage()

HandleMessage

‘message’ Event Listener

Page 115: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

Page 116: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

まず embed タグ生成時に pp::CreateModule が呼ばれる

pp::Module* を返すので継承したクラスを作成

Page 117: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

pp::Module::CreateInstance が呼ばれる

Page 118: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

pp::Instance* を返すので 継承したクラスを作成する

Page 119: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

Page 120: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

JavaScript からのメッセージを受け取る

Page 121: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

渡されたメッセージの処理

Page 122: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

JS からのメッセージを受け取ったので 今度は JS 側へメッセージを送ってみる

Page 123: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

Page 124: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

読み込まれたら ‘hello’ を C++ 側へ送る (HandleMessage が呼ばれる)

Page 125: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

C++ 側からのメッセージを受け取る (HandleMessage 内の PostMessage)

Page 126: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello World を動かしてみる

C++ 側からのメッセージを受け取る (HandleMessage 内の PostMessage)

Page 127: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

参考文献 •  Native Client の導入と Hello World までのまとめ

–  http://d.hatena.ne.jp/hecomi/20130128/1359372772

•  Native Client — Google Developers

–  https://developers.google.com/native-client/

Page 128: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

EMSCRIPTEN C++ のコードを JavaScript へ変換

Page 129: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

内容 •  Introduction

•  変換して動かしてみる

Page 130: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  LLVM-IR を JavaScript に変換!

–  LLVM … Clang のバックエンドにもなっているコンパイラ基盤

–  LLVM-IR … LLVM の中間表現

LLVM のロゴかこいい

Page 131: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction

C++ LLVM-IR JavaScript Clang Emscripten

Page 132: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  色々なものが変換されています

–  https://github.com/kripken/emscripten/wiki

Page 133: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  色々なものが変換されています

–  https://github.com/kripken/emscripten/wiki

mruby

Page 134: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  色々なものが変換されています

–  https://github.com/kripken/emscripten/wiki

mruby

gnuplot

Page 135: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  色々なものが変換されています

–  https://github.com/kripken/emscripten/wiki

mruby

gnuplot

unreal engine

Page 136: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Introduction •  色々なものが変換されています

–  https://github.com/kripken/emscripten/wiki

mruby

gnuplot

unreal engine

Qt

Page 137: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

インストール •  参照

–  Emscripten で C++ の Hello World を JavaScript に変換してみた

•  http://d.hatena.ne.jp/hecomi/20130416/1366124901

Page 138: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

hello.cpp

Page 139: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

hello.cpp

Page 140: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

hello.cpp

Page 141: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

hello.cpp

Page 142: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

hello.cpp

( ^ω^)

⊃ cpp ⊂ ここに cpp があるじゃろ?

Page 143: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

hello.cpp

( ^ω^)

≡⊃⊂≡ これを em++ すると…

Page 144: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

main 関数

hello.cpp hello.js

( ^ω^)

⊃ ⊂ こうじゃ

Page 145: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

Hello world を変換してみる

$ em++ hello.cpp –o hello.js$ node hello.jsHello, world!

$ em++ hello.cpp –o hello.html$ open hello.html

main 関数

123536  行!

hello.js hello.cpp

( ^ω^)

⊃ ⊂ こうじゃ

Page 146: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

速度どうなの? •  普通に JS 書くよりは数倍程度遅い…、が、

Page 147: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

速度どうなの? •  Emscripten は asm.js 形式の js を吐き出す

–  asm.js は JavaScript を拡張せずに型付をして高速化をはかる JavaScript のサブセット

–  ex.

(x + y) | 0 // int32

•  asm.js 実装した JS エンジン OdinMonkey を積む Firefox (nightly) でデモ動かすとヌルヌル

–  http://www.unrealengine.com/html5/

Page 148: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

速度どうなの?

Page 149: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

参考文献 •  “実戦”Emscripten

–  http://www.mozilla.jp/static/docs/events/vision/2012/06-ushiroad.pdf

•  asm.js spec

–  http://asmjs.org/spec/latest/

•  BIG WEB APP? COMPILE IT!

–  http://kripken.github.io/mloc_emscripten_talk/

Page 150: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

まとめ •  C++ と JavaScript が関連する世界を幾つか紹介

–  V8

–  Node.js

–  Qt Quick

–  NaCl

–  Emscripten

•  コレ以外にも色々あると思いますのでご存知でしたら教えて下さい m(_ _)m

Page 151: Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京

++ + C++ と JavaScript で広がる世界

@hecomi

Boost.勉強会 #11 東京