net vnext

47
.NET vNext 岩岩 岩岩 ++C++; // 未未未未未 C

Upload: -

Post on 05-Dec-2014

5.907 views

Category:

Technology


0 download

DESCRIPTION

2014/8/23 こみゅぷらす にて

TRANSCRIPT

Page 1: NET vNext

.NET vNext

岩永 信之

++C++; // 未確認飛行 C

Page 2: NET vNext

自己紹介

• 日本 C #ユーザー会• 日本の C# ユーザーを応援するコミュニティです

• codeseek• 「システムの品質はコードに宿る」をポリシーに

活動をしています

• 毎月何かしら勉強会をやっています

Page 3: NET vNext

今日の内容

• 最近の Microsoft• .NET の近い将来• .NET Native• .NET vNext Cloude Mode

主に .NET プログラムの実行方式の話

Page 4: NET vNext

最近の MicrosoftOne Windows

Device First, Cloud First

Page 5: NET vNext

One

• One Microsoft• One Windows• 単一チームで全 Windows を開発• 単一のコア (NT カーネル )• 単一のストア• 単一 API (Windows Runtime)

今、すでにそうなってる / なりつつあ

要は、組織改編

Page 6: NET vNext

Device first, Cloud first

デスクトップクライアント アプリ

Phone/ タブレットクライアント アプリ

サーバー アプリ

既存資産

Mobile firstCloud first

Page 7: NET vNext

Mobile first, Cloud first

• “first” ( 優先して注力はするが、 only ではない )• 既存のデスクトップへの投資もまだ続く

• Mobile と Cloud• 改めてこれから注力すべき場所を強調

( この方針自体は前から変わってない )

Page 8: NET vNext

.NET にとっては

• Mobile first• ストア越し ( 審査付き ) のアプリ配布• 低消費電力を求められる

• Cloud first• サーバー上でのソースコード手直し• 共有ホスティング型のサーバーへの対応

.NET Native

.NET vNext Cloud Mode

Page 9: NET vNext

.NET Framework の実行方式これまでの .NET Framework

中間言語と JIT

Page 10: NET vNext

中間コードと JIT コンパイル

• .NET Framework の中間言語

• 中間言語があることで• 高級言語のコンパイラーを作る人と、 CPU ごとの

最適化する人の分業化• セキュリティ チェックしやすい• 動的リンク時に、コード修正の影響を吸収• 動的な実行 ( リフレクション )

高級言語(C# など )

中間言語(IL)

ネイティブコード

コンパイル コンパイル

問題は「いつやるか」

Page 11: NET vNext

中間言語の良し悪し

利点•動的リンク・部分更新しやすい•セキュリティ検証しやすい•(ソースコード配布よりは )高速

欠点•.NET Frameworkのランタイム インストール必須•(ネイティブ配布よりは)低速•(ソースコード配布よりは)デバッグ・修正が面倒

用途によっては…

Page 12: NET vNext

中間言語 : デスクトップでは

利点•動的リンク・部分更新しやすい•セキュリティ検証しやすい•(ソースコード配布よりは )高速

欠点•.NET Frameworkのランタイム インストール必須•(ネイティブ配布よりは)低速•(ソースコード配布よりは)デバッグ・修正が面倒

JIT とか Windows サービス巡回とかでないと保証しにくい

PC の性能的に許容範囲

なんだかんだいってJIT のメリットあり

JIT

そんなに頻繁な修正しない

Page 13: NET vNext

Just-in-Time

• 実行した瞬間にコンパイル

高級言語(C# など )

中間言語(IL)

ネイティブコード

コンパイル コンパイル

開発環境 実行環境

配布

ビルド時 Just-in-Time( 実行した瞬

間 )起動した瞬間が重い起動のたびに処理が走る

( 最初期からある )

Page 14: NET vNext

Ngen

• Ngen.exe (Native Image Generator)• IL を事前にネイティブ化するためのツール• 自前管理が必要

• アプリのインストーラー※とかを作って明示的に呼び出し

• 参照しているライブラリが更新された時には呼びなおす必要あり •かなり面倒なのでアプリを

Ngen することはめったにない• .NET 自体が標準ライブラリ

の高速化のために使ってる

※ 要するに、 JIT の負担を起動時じゃなくてインストール時に前倒しする

( 最初期からある )

Page 15: NET vNext

Auto-Ngen

• Ngen が Windows サービスとして常に動いてる• アイドル時に動作• 利用頻度の高いものを自動的に Ngen

• デスクトップ アプリの場合は GAC アセンブリのみ• Windows ストア アプリの場合はすべてのアセンブリ•よく使うアプリの起動はだいぶ早くなる•インストール直後の起動は相変わらず遅

(.NET 4.5)

Page 16: NET vNext

問題 : 実行環境の多様化

デスクトップクライアント アプリ

Phone/ タブレットクライアント アプリ

サーバー アプリ

既存資産

Mobile firstCloud first要件が変わる

Page 17: NET vNext

Mobile first携帯端末中心の .NET Framework

端末側の負担を減らす

Page 18: NET vNext

中間言語 : 携帯デバイスでは

利点•動的リンク・部分更新しやすい•セキュリティ検証しやすい•(ソースコード配布よりは )高速

欠点•.NET Frameworkのランタイム インストール必須•(ネイティブ配布よりは)低速•(ソースコード配布よりは)デバッグ・修正が面倒

ストア サーバー上でやればいい

ランタイム分のストレージ容量使いたくない

性能的に結構困る

ストア サーバー上でネイティブ化

.NET Native

Page 19: NET vNext

MDIL※

• 部分的に、事前ネイティブ化• 動的リンクに必要な情報だけ中間言語を残す

push ebp mov ebp,esp cmp dword ptr ds:[5011058h],0 je 00FE2A01 call 74B7AEA8 mov eax,dword ptr [ebp+8] lea edx,[ebp+8] imul eax,dword ptr [edx+4] lea edx,[ebp+8] imul eax,dword ptr [edx+8] pop ebp ret 0Ch

int32 Point::Xint32

Point::Yint32

Point::Z

型情報だけ残す( 動的リンクに必

要 )

※ Machine Dependent Intermediate Language

(Windows Phone 8)

ほぼネイティブ

Page 20: NET vNext

MDIL (Compile in the Cloud)• ストア サーバー上で MDIL 化までやっておく

C#コード

IL

MDIL

ネイティブ コード

C# コンパイラー

MDIL コンパイラー

リンカー

開発環境で IL にコンパイル

Windows ストア サーバー上で IL を MDIL 化

Windows Phone 実機上ではレイアウトの解決 ( リンク ) だけ行う

インストール直後の起動も高速

(Windows Phone 8)

Page 21: NET vNext

.NET Native

• ストア サーバー上でネイティブ化

C# コンパイラー 開発環境で IL にコンパイル

Windows ストア サーバー上でネイティブ化

ネイティブ化したものをデバイスに配布

C#コード

IL

事前コード生成

ILレベル最適化

MDIL

ネイティブ コード

crossgenコンパイラー

(vNext)

Page 22: NET vNext

.NET Native: in the Cloud

•基本的にストア アプリ用• セキュリティ保証などはサーバー上で

• アップロード時には IL 、審査付き• クライアント デバイス的には低コスト

• JIT のコストなし、ランタイムのインストール不要

• Visual Studio 上で直接ネイティブ化も可能• 通常版の .NET との差で問題が起きないかの確認

用• 特にパフォーマンス

(vNext)

Page 23: NET vNext

.NET Native: 最適化

• 「事前に JIT相当の処理」以上の最適化も• C++ 最適化コンパイラーと成果共有• シリアライズなどのコードを事前に展開

• 型情報を見たいからリフレクションを使ってただけで、実際にはビルド時に型が確定してることが多い

• 必要な分だけ静的リンク• ライブラリをまたいだ最適化が可能• 不要コードは残さないので実行可能ファイルのサイズは膨らまない

(vNext)

Page 24: NET vNext

.NET Native: リフレクション• リフレクションも使える

ただし…• XAML {Binding} など、推論が効く部分は自動判定してくれる• それ以外は、自分で「この型はリフレクションで

使ってる」という情報を書かないとダメ(Runtime Directive ファイル )• 動的コード生成は無理

• 式ツリーなどはインタープリター方式になるので遅い

(vNext)

Page 25: NET vNext

Cloud firstサーバー、特にクラウド中心の .NET Framework

手軽なソースコード更新side-by-side ランタイム

Page 26: NET vNext

中間言語 : サーバーでは

利点•動的リンク・部分更新しやすい•セキュリティ検証しやすい•(ソースコード配布よりは )高速

欠点•.NET Frameworkのランタイム インストール必須•(ネイティブ配布よりは)低速•(ソースコード配布よりは)デバッグ・修正が面倒

アプリ稼働時間が長くて、最初の 1 回だけのコストは無視できる ( 低速でもいい )

開発機とサーバー機でバージョンが違って困ることが

サーバー上で確認しつつその場でソースコードを修正したい

ソースコード配置自動パッケージ管理

Cloud Modeアプリごとに別バージョンを使えない

Page 27: NET vNext

.NET vNext Cloud Mode

• クラウド向けの実行形態• side-by-side インストール• ソースコード配布• パッケージ管理

(vNext)

Page 28: NET vNext

side-by-side インストール

• ( サーバーにインストールするんじゃなく )アプリごとに別 .NET ランタイムを使える• (同一サーバーで )

アプリごとにバージョンを変えれる• 共有ホスティング型のサーバーでも安心• バージョン更新するかどうかをアプリ単位で判断できる

• 開発時と完全に同じバージョンを使える• (.NET ではめったに見ないけども )

バージョン違いに起因する問題を回避できる

(vNext)

Page 29: NET vNext

ソースコード配置

• ビルドという工程不要• ソースコード書き替えて、ブラウザー更新するだけ• サーバー上で編集可能

• メモリ上で全部コンパイル• コンパイル結果を一時ファイルに残さない• ディスク I/O がネックになりにくい

• .NET Compiler Service (Roslyn) を利用

(vNext)

Page 30: NET vNext

補足 : .NET Compiler Platform†• C#/VB コンパイラーを再設計・再実装• .NET 実装 (C# 実装の C#/VB 実装の VB コンパイ

ラー )• コンパイラーの内部データを誰でも自由に使える

• 用途• C# スクリプティング• ソースコード配置

• .NET vNext (Cloud First)

• コード解析• IDE連携、静的解析ツール

† コードネーム“ Roslyn” って呼ばれてたやつの正式名称

Page 31: NET vNext

パッケージ管理

• 自動パッケージ管理開発機 アプリ サーバー パッケージ リポジトリ

例http://nuget.orghttp://myget.org

project.json

*.cs

"dependencies": { "Library.A": "", "Library.B": ""}

var c = new Configuration();c.AddJsonFile("config.json");a.UseServices(services => …);

ソースコードとパッケージ利用情報だけをアップ

ロード

サーバー上で編集可能

.NET ランタイムや、ライブラリの不足・更新

はクラウドから取得

利用するパッケージの情報ファイル

(vNext)

Page 32: NET vNext

kproj

• (Visual Studio 上の ) 新しいプロジェクト形式• 「プロジェクト」と「アセンブリ参照」と「パッケージ」を区別しない• プロジェクト : 同一ソリューション内の他のプロジェク

トを参照• アセンブリ参照 : 標準ライブラリなどの DLL を参照• パッケージ : NuGet を利用して Web公開されているラ

イブラリを参照• JSON で管理

(vNext)

Page 33: NET vNext

旧形式 (csproj)

アセンブリ参照 プロジェクト参照

パッケージ参照

Page 34: NET vNext

新形式 (kproj)

• JSON (project.json) でプロジェクト設定を管理"dependencies": { "Newtonsoft.Json": "", "System.Console": "", "Classlibrary1": ""}

パッケージ参照アセンブリ参照

プロジェクト参照

( 必要ならバージョンを明示的に指定 )

Page 35: NET vNext

ASP.NET vNext

• .NET vNext ( これまでのまとめ )• ソースコード配置• side-by-side インストール• パッケージ管理

• これに加えて• IIS( など、特定のアプリサーバー )依存脱却

• 脱 System.Web アセンブリ• OWIN (Open Web Inteface for .NET)

• Mono でのホストも可能

• ASP.NET MVC / Web API / Web Pages の統合• オープンソース、 GitHub公開

Page 36: NET vNext

その他補足

Page 37: NET vNext

RyuJIT

• JIT コンパイラーも新しくなる• 既存資産にも投資は続いてる• JIT 方式しなくなるわけじゃない ( 適材適所 )

• RyuJIT の大きな改善点• 起動時間短縮

• 今まで 64bit JIT コンパイラーはサーバー向けだったので、起動に重きを置かれてなかった

• SIMD演算対応

Page 38: NET vNext

補足 : SIMD演算

• Single Instruction Multiple Data

演算回路

入力

出力

普通の命令• 1命令 1 データ

演算回路

入力

出力

SIMD命令• 1命令複数データ

入力 入力 入力

出力 出力 出力

単純な累算処理※なら並列度の分だけ高速化

※ ↓こういうのfor (var i = 0; i < length; ++i) output[i] = F(input[i]);

Page 39: NET vNext

標準ライブラリ

• ランタイムが 3系統別実装 • JIT• .NET Native• Cloud Mode

• 1 つの“標準”ライブラリで保守するのは大変• どうしても事前ネイティブ化しにくい…• サーバーに GUI コンポーネント要るの?…• フットプリント的に余計なもの載せれない…

new!

new!

Page 40: NET vNext

1 つの標準にできるのか?

デスクトップクライアント アプリ

Phone/ タブレットクライアント アプリ

サーバー アプリ

既存資産

Mobile firstCloud first

共通部分

この共通部分だけを「標準」にすべき?

PCLみたいな仕組み必須

Page 41: NET vNext

PCL(Portable Class Library)

• 実行環境ごとに別の「標準ライブラリ」プロファイルを用意• ライブラリ側でどの

実行環境をターゲットにするか選ぶ

実行環境ごとに別メタデータを提供

ターゲット選択

Page 42: NET vNext

PCL の例

•例 : 2 環境

共通部分

Page 43: NET vNext

PCL の例

•例 : 3 環境

共通部分

Page 44: NET vNext

.NET vNext プロファイル

• 今のプロファイル• デスクトップ向け• Windows ストア アプリ向け• (Phone, Xbox, Silverlight, …)

• vNext のプロファイル• .NET Native向け

• ストア アプリ向け - 事前ネイティブ化しにくいところ• Cloude Mode向け

• GUI関連ごっそりない

Page 45: NET vNext

まとめ

Page 46: NET vNext

実行環境の多様化

デスクトップクライアント アプリ

Phone/ タブレットクライアント アプリ

サーバー アプリ

既存資産

Mobile firstCloud first

Page 47: NET vNext

Mobile first, Cloud first

• Mobile: .NET Native• ストア サーバー上でのネイティブ化• かなりアグレッシブな最適化付き• 一応、リフレクションも利用可能

• Cloud: .NET vNext Cloud Mode• side-by-side インストール• ソースコード配置• パッケージ管理