SlideShare a Scribd company logo
.NET vNext
岩永 信之
自己紹介
• 日本C#ユーザー会
• 日本のC#ユーザーを応援するコミュニティです
• codeseek
• 「システムの品質はコードに宿る」をポリシーに活
動をしています
• 毎月何かしら勉強会をやっています
今日の内容
• 最近のMicrosoft
• .NETの近い将来
• .NET Native
• .NET vNext Cloude Mode
主に.NETプログラムの
実行方式の話
最近のMicrosoft
One Windows
Device First, Cloud First
One
• One Microsoft
• One Windows
• 単一チームで全Windowsを開発
• 単一のコア(NTカーネル)
• 単一のストア
• 単一API (Windows Runtime)
今、すでにそう
なってる/なりつつある
要は、組織改編
Device first, Cloud first
デスクトップ
クライアント アプリ
Phone/タブレット
クライアント アプリ
サーバー アプリ
既存資産
Mobile firstCloud first
Mobile first, Cloud first
• “first” (優先して注力はするが、onlyではない)
• 既存のデスクトップへの投資もまだ続く
• MobileとCloud
• 改めてこれから注力すべき場所を強調
(この方針自体は前から変わってない)
.NETにとっては
• Mobile first
• ストア越し(審査付き)のアプリ配布
• 低消費電力を求められる
• Cloud first
• サーバー上でのソースコード手直し
• 共有ホスティング型のサーバーへの対応
.NET Native
.NET vNext Cloud Mode
.NET Frameworkの
実行方式
これまでの.NET Framework
中間言語とJIT
中間コードとJITコンパイル
• .NET Frameworkの中間言語
• 中間言語があることで
• 高級言語のコンパイラーを作る人と、CPUごとの最
適化する人の分業化
• セキュリティ チェックしやすい
• 動的リンク時に、コード修正の影響を吸収
• 動的な実行(リフレクション)
高級言語
(C#など)
中間言語
(IL)
ネイティブ
コード
コンパイル コンパイル
問題は「いつやるか」
中間言語の良し悪し
利点
• 動的リンク・部分更新しやすい
• セキュリティ検証しやすい
• (ソースコード配布よりは)高速
欠点
• .NET Frameworkのランタイム インストール必須
• (ネイティブ配布よりは)低速
• (ソースコード配布よりは)デバッグ・修正が面倒
用途によっては…
中間言語: デスクトップでは
利点
• 動的リンク・部分更新しやすい
• セキュリティ検証しやすい
• (ソースコード配布よりは)高速
欠点
• .NET Frameworkのランタイム インストール必須
• (ネイティブ配布よりは)低速
• (ソースコード配布よりは)デバッグ・修正が面倒
JITとかWindowsサービス巡回
とかでないと保証しにくい
PCの性能的に
許容範囲
なんだかんだいって
JITのメリットあり
JIT
そんなに頻繁な
修正しない
Just-in-Time
• 実行した瞬間にコンパイル
高級言語
(C#など)
中間言語
(IL)
ネイティブ
コード
コンパイル コンパイル
開発環境 実行環境
配布
ビルド時 Just-in-Time
(実行した瞬間)
起動した瞬間が重い
起動のたびに処理が走る
(最初期からある)
Ngen
• Ngen.exe (Native Image Generator)
• ILを事前にネイティブ化するためのツール
• 自前管理が必要
• アプリのインストーラー※とかを作って明示的に呼び出し
• 参照しているライブラリが更新された時には呼びなおす
必要あり
• かなり面倒なのでアプリを
Ngenすることはめったにない
• .NET自体が標準ライブラリの
高速化のために使ってる
※ 要するに、JITの負担を起動時じゃなくてインストール時に前倒しする
(最初期からある)
Auto-Ngen
• NgenがWindowsサービスとして常に動いてる
• アイドル時に動作
• 利用頻度の高いものを自動的にNgen
• デスクトップ アプリの場合はGACアセンブリのみ
• Windowsストア アプリの場合はすべてのアセンブリ
• よく使うアプリの起動はだいぶ早くなる
• インストール直後の起動は相変わらず遅い
(.NET 4.5)
問題: 実行環境の多様化
デスクトップ
クライアント アプリ
Phone/タブレット
クライアント アプリ
サーバー アプリ
既存資産
Mobile firstCloud first
要件が変わる
Mobile first
携帯端末中心の.NET Framework
端末側の負担を減らす
中間言語: 携帯デバイスでは
利点
• 動的リンク・部分更新しやすい
• セキュリティ検証しやすい
• (ソースコード配布よりは)高速
欠点
• .NET Frameworkのランタイム インストール必須
• (ネイティブ配布よりは)低速
• (ソースコード配布よりは)デバッグ・修正が面倒
ストア サーバー上で
やればいい
ランタイム分のストレージ
容量使いたくない
性能的に結構困る
ストア サーバー上で
ネイティブ化
.NET Native
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::X
int32 Point::Y
int32 Point::Z
型情報だけ残す
(動的リンクに必要)
※ Machine Dependent Intermediate Language
(Windows Phone 8)
ほぼネイティブ
MDIL (Compile in the Cloud)
• ストア サーバー上でMDIL化までやっておく
C#コード
IL
MDIL
ネイティブ コード
C#コンパイラー
MDILコンパイラー
リンカー
開発環境でILにコンパイル
Windowsストア サーバー
上でILをMDIL化
Windows Phone実機上では
レイアウトの解決(リンク)だけ行う
インストール直後の起動も高速
(Windows Phone 8)
.NET Native
• ストア サーバー上でネイティブ化
C#コンパイラー
開発環境でILにコンパイル
Windowsストア サーバー
上でネイティブ化
ネイティブ化したものを
デバイスに配布
C#コード
IL
事前コード生成
ILレベル最適化
MDIL
ネイティブ
コード
crossgen
コンパイラー
(vNext)
.NET Native: in the Cloud
• 基本的にストア アプリ用
• セキュリティ保証などはサーバー上で
• アップロード時にはIL、審査付き
• クライアント デバイス的には低コスト
• JITのコストなし、ランタイムのインストール不要
• Visual Studio上で直接ネイティブ化も可能
• 通常版の.NETとの差で問題が起きないかの確認用
• 特にパフォーマンス
(vNext)
.NET Native: 最適化
• 「事前にJIT相当の処理」以上の最適化も
• C++最適化コンパイラーと成果共有
• シリアライズなどのコードを事前に展開
• 型情報を見たいからリフレクションを使ってただけで、
実際にはビルド時に型が確定してることが多い
• 必要な分だけ静的リンク
• ライブラリをまたいだ最適化が可能
• 不要コードは残さないので実行可能ファイルのサイズは
膨らまない
(vNext)
.NET Native: リフレクション
• リフレクションも使える
ただし…
• XAML {Binding}など、推論が効く部分は自動判定し
てくれる
• それ以外は、自分で「この型はリフレクションで
使ってる」という情報を書かないとダメ
(Runtime Directiveファイル)
• 動的コード生成は無理
• 式ツリーなどはインタープリター方式になるので遅い
(vNext)
Cloud first
サーバー、特にクラウド中心の.NET Framework
手軽なソースコード更新
side-by-sideランタイム
中間言語: サーバーでは
利点
• 動的リンク・部分更新しやすい
• セキュリティ検証しやすい
• (ソースコード配布よりは)高速
欠点
• .NET Frameworkのランタイム インストール必須
• (ネイティブ配布よりは)低速
• (ソースコード配布よりは)デバッグ・修正が面倒
アプリ稼働時間が長くて、
最初の1回だけのコストは
無視できる(低速でもいい)
開発機とサーバー機でバー
ジョンが違って困ることが
サーバー上で確認しつつ
その場でソースコードを修正したい
ソースコード配置
自動パッケージ管理
Cloud Mode
アプリごとに別バー
ジョンを使えない
.NET vNext Cloud Mode
• クラウド向けの実行形態
• side-by-sideインストール
• ソースコード配布
• パッケージ管理
(vNext)
side-by-sideインストール
• (サーバーにインストールするんじゃなく)
アプリごとに別.NETランタイムを使える
• (同一サーバーで)
アプリごとにバージョンを変えれる
• 共有ホスティング型のサーバーでも安心
• バージョン更新するかどうかをアプリ単位で判断できる
• 開発時と完全に同じバージョンを使える
• (.NETではめったに見ないけども)
バージョン違いに起因する問題を回避できる
(vNext)
ソースコード配置
• ビルドという工程不要
• ソースコード書き替えて、ブラウザー更新するだけ
• サーバー上で編集可能
• メモリ上で全部コンパイル
• コンパイル結果を一時ファイルに残さない
• ディスクI/Oがネックになりにくい
• .NET Compiler Service (Roslyn)を利用
(vNext)
補足: .NET Compiler Platform†
• C#/VBコンパイラーを再設計・再実装
• .NET実装 (C#実装のC#/VB実装のVBコンパイラー)
• コンパイラーの内部データを誰でも自由に使える
• 用途
• C#スクリプティング
• ソースコード配置
• .NET vNext (Cloud First)
• コード解析
• IDE連携、静的解析ツール
† コードネーム“Roslyn”って呼ばれてたやつの正式名称
パッケージ管理
• 自動パッケージ管理
開発機 アプリ サーバー パッケージ リポジトリ
例
http://nuget.org
http://myget.org
project.json
*.cs
"dependencies": {
"Library.A": "",
"Library.B": ""
}
var c = new Configuration();
c.AddJsonFile("config.json");
a.UseServices(services => …);
ソースコードとパッ
ケージ利用情報だけ
をアップロード
サーバー上で
編集可能
.NETランタイムや、
ライブラリの不足・更新
はクラウドから取得
利用するパッケージ
の情報ファイル
(vNext)
kproj
• (Visual Studio上の)新しいプロジェクト形式
• 「プロジェクト」と「アセンブリ参照」と「パッ
ケージ」を区別しない
• プロジェクト: 同一ソリューション内の他のプロジェクト
を参照
• アセンブリ参照: 標準ライブラリなどのDLLを参照
• パッケージ: NuGetを利用してWeb公開されているライブ
ラリを参照
• JSONで管理
(vNext)
旧形式(csproj)
新形式(kproj)
• JSON (project.json)でプロジェクト設定を管理
"dependencies": {
"Newtonsoft.Json": "",
"System.Console": "",
"Classlibrary1": ""
}
パッケージ参照
アセンブリ参照
プロジェクト参照
(必要ならバージョン
を明示的に指定)
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公開
その他補足
RyuJIT
• JITコンパイラーも新しくなる
• 既存資産にも投資は続いてる
• JIT方式しなくなるわけじゃない(適材適所)
• RyuJITの大きな改善点
• 起動時間短縮
• 今まで64bit JITコンパイラーはサーバー向けだったので、
起動に重きを置かれてなかった
• SIMD演算対応
補足: SIMD演算
• Single Instruction Multiple Data
演算
回路
入力
出力
普通の命令
• 1命令1データ
演算
回路
入力
出力
SIMD命令
• 1命令複数データ
入力 入力 入力
出力 出力 出力
単純な累算処理※なら
並列度の分だけ高速化
※ ↓こういうの
for (var i = 0; i < length; ++i)
output[i] = F(input[i]);
標準ライブラリ
• ランタイムが3系統別実装
• JIT
• .NET Native
• Cloud Mode
• 1つの“標準”ライブラリで保守するのは大変
• どうしても事前ネイティブ化しにくい…
• サーバーにGUIコンポーネント要るの?…
• フットプリント的に余計なもの載せれない…
new!
new!
1つの標準にできるのか?
デスクトップ
クライアント アプリ
Phone/タブレット
クライアント アプリ
サーバー アプリ
既存資産
Mobile firstCloud first
共通部分
この共通部分だけを
「標準」にすべき?
PCLみたいな仕組み必須
PCL(Portable Class Library)
• 実行環境ごとに
別の「標準ライブラリ」
プロファイルを用意
• ライブラリ側でどの
実行環境をターゲットに
するか選ぶ
実行環境ごとに
別メタデータを提供
ターゲット選択
PCLの例
• 例: 2環境
共通部分
PCLの例
• 例: 3環境
共通部分
.NET vNextプロファイル
• 今のプロファイル
• デスクトップ向け
• Windowsストア アプリ向け
• (Phone, Xbox, Silverlight, …)
• vNextのプロファイル
• .NET Native向け
• ストア アプリ向け - 事前ネイティブ化しにくいところ
• Cloude Mode向け
• GUI関連ごっそりない
まとめ
実行環境の多様化
デスクトップ
クライアント アプリ
Phone/タブレット
クライアント アプリ
サーバー アプリ
既存資産
Mobile firstCloud first
Mobile first, Cloud first
• Mobile: .NET Native
• ストア サーバー上でのネイティブ化
• かなりアグレッシブな最適化付き
• 一応、リフレクションも利用可能
• Cloud: .NET vNext Cloud Mode
• side-by-sideインストール
• ソースコード配置
• パッケージ管理

More Related Content

PPTX
広がる .Net
PPTX
C# design note sep 2014
PPTX
Modern .NET
PPTX
Net fringejp2016
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PPTX
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
PPTX
C#/.NETがやっていること 第二版
PPTX
dotnetconfJP2017_netcore2
広がる .Net
C# design note sep 2014
Modern .NET
Net fringejp2016
今から始める、Windows 10&新.NETへの移行戦略
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
C#/.NETがやっていること 第二版
dotnetconfJP2017_netcore2

What's hot (20)

PDF
.NET Coreから概観する.NETのOSSへの取り組み
PDF
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
PPTX
.NET Core とマルチプラットフォーム
PDF
パターンでわかる! .NET Coreの非同期処理
PDF
Introduction to VSCode
PDF
Bluetoothでgo!
PDF
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
PDF
Win32 APIをてなずけよう
PDF
Javaで1から10まで書いた話(sanitized)
PPTX
Deep Dive C# 6.0
PDF
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
PDF
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
PPTX
Visual studio 2015 update1 ctpとcsi
PDF
Introducing Fluent Design
PDF
動的なILの生成と編集
PDF
Pythonで始めるWebアプリケーション開発
PPTX
わんくま名古屋 #37 (20151114) TDD道場 #25
PDF
Async deepdive before de:code
PDF
.NET Conf 2017 Japan Keynote ".NET Everywhere!"
PDF
Visual Studioで始めるTypeScript開発入門
.NET Coreから概観する.NETのOSSへの取り組み
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET Core とマルチプラットフォーム
パターンでわかる! .NET Coreの非同期処理
Introduction to VSCode
Bluetoothでgo!
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Win32 APIをてなずけよう
Javaで1から10まで書いた話(sanitized)
Deep Dive C# 6.0
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Visual studio 2015 update1 ctpとcsi
Introducing Fluent Design
動的なILの生成と編集
Pythonで始めるWebアプリケーション開発
わんくま名古屋 #37 (20151114) TDD道場 #25
Async deepdive before de:code
.NET Conf 2017 Japan Keynote ".NET Everywhere!"
Visual Studioで始めるTypeScript開発入門
Ad

Similar to .NET vNext (20)

PDF
~ Cloud First から Cloud Optimized へ ~ .NET on Cloud が描くモダナイゼーション
PDF
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
PDF
Visual Studio 2019 GA ! ~ 最新情報 & これからの開発スタイル
PPTX
Dot netcore multiplatform 2
PPTX
About .Net vNext
PPTX
About .Net vNext
PDF
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
PDF
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
PDF
Visual Studio 2019 GA ! ~ 最新情報 & これからの開発スタイル
PPTX
CLI と BCL
PDF
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
PDF
.NET の今とミライ (.NET Conf 2018 Japan Keynote)
PDF
20140830 2014年版 C #でできること
PDF
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
PDF
The Next Generation for C# Developers
PDF
.NET Coreとツール類の今
PDF
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
PDF
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
~ Cloud First から Cloud Optimized へ ~ .NET on Cloud が描くモダナイゼーション
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
今から始める、Windows 10&新.NETへの移行戦略
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Visual Studio 2019 GA ! ~ 最新情報 & これからの開発スタイル
Dot netcore multiplatform 2
About .Net vNext
About .Net vNext
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
Visual Studio 2019 GA ! ~ 最新情報 & これからの開発スタイル
CLI と BCL
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
.NET の今とミライ (.NET Conf 2018 Japan Keynote)
20140830 2014年版 C #でできること
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
The Next Generation for C# Developers
.NET Coreとツール類の今
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
Ad

More from 信之 岩永 (20)

PPTX
YouTube ライブ配信するようになった話
PPTX
C# 9.0 / .NET 5.0
PPTX
C# コンパイラーの書き換え作業の話
PPTX
Unicode文字列処理
PPTX
C# 8.0 非同期ストリーム
PPTX
C# 8.0 null許容参照型
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
async/await のしくみ
PPTX
.NET Core 2.x 時代の C#
PPTX
C# 7.2 with .NET Core 2.1
PPTX
C#言語機能の作り方
PPTX
Unityで使える C# 6.0~と .NET 4.6
PPTX
それっぽく、適当に
PPTX
.NET Compiler Platform
PPTX
Orange Cube 自社フレームワーク 2015/3
PPTX
Code Contracts in .NET 4
PPTX
Coding Interview
PPTX
非同期処理の基礎
PPTX
C#や.NET Frameworkがやっていること
PPTX
C#とILとネイティブと
YouTube ライブ配信するようになった話
C# 9.0 / .NET 5.0
C# コンパイラーの書き換え作業の話
Unicode文字列処理
C# 8.0 非同期ストリーム
C# 8.0 null許容参照型
C# 8.0 Preview in Visual Studio 2019 (16.0)
async/await のしくみ
.NET Core 2.x 時代の C#
C# 7.2 with .NET Core 2.1
C#言語機能の作り方
Unityで使える C# 6.0~と .NET 4.6
それっぽく、適当に
.NET Compiler Platform
Orange Cube 自社フレームワーク 2015/3
Code Contracts in .NET 4
Coding Interview
非同期処理の基礎
C#や.NET Frameworkがやっていること
C#とILとネイティブと

.NET vNext

Editor's Notes

  • #6: http://japan.zdnet.com/os/analysis/35051280/ いろいろな用途に対して一貫したモデルで開発できるのがMSの強みなのに、縦割りな仕事してどうすんだと。 社内競争で緊張感があったっていう利点もなくはなかっただろうけど。 チームというか、バルマーVSシノフスキー的対立がなかったらPhoneの立ち位置ももう少しましになってたかもしれず。 そういうところを改善しなきゃいけない。
  • #8: とはいえ。 今、MSの好調な部門はOffice 365とAzureで、 シノフスキー(Phone系やってた)がさって、ナデラ(Azureな人)がCEOになり 元ノキア従業員を中心に18000人のリストラがあり Azureは開発的にもScotGuっていうカリスマが率いてて 割とパワーバランスはCloudの方によってると思う。.NETのイノベーションもCloud方面からの方が多きそう。
  • #11: 一度中間言語を挟むってこと自体は、たいていの言語がやってる。 コンパイラーの内部でだけ中間言語使うものとか、実行時のだけ使うものとかもあるけども。
  • #15: http://msdn.microsoft.com/ja-jp/library/6t9t5wcf(v=vs.110).aspx インストールに時間がかかるってのもそれはそれで大問題。最初が肝心。いまどき、インストールってだけでも敬遠されるのに、さらに時間かかるとかかったるい。 ほんといまどきは「インストールしてください」ってあるだけでユーザーを9割失う。
  • #16: 逆に、使ってないもののネイティブ イメージを削除したりも自動 .NET Framework自体のインストールの遅さもかなり改善(.NET標準ライブラリ全部をNgenしない。Auto-Ngenのサービスに任せる)
  • #21: http://blogs.msdn.com/b/msgulfcommunity/archive/2013/03/16/compile-in-the-cloud-with-wp8.aspx http://channel9.msdn.com/Shows/Going+Deep/Mani-Ramaswamy-and-Peter-Sollich-Inside-Compiler-in-the-Cloud-and-MDIL
  • #22: http://blogs.msdn.com/b/msgulfcommunity/archive/2013/03/16/compile-in-the-cloud-with-wp8.aspx http://channel9.msdn.com/Shows/Going+Deep/Mani-Ramaswamy-and-Peter-Sollich-Inside-Compiler-in-the-Cloud-and-MDIL
  • #24: P/Invokeとかのマーシャリングもコード事前展開
  • #29: 言葉を選ばずに言えば、Node.js的な実行形態
  • #30: 言葉を選ばずに言えば、Node.js的な実行形態
  • #31: IDE連携が一番最初の大きな目的なんだけども、Cloud Firstな.NETでも大活躍
  • #32: ライブラリどころか、ランタイム自体もクラウドのリポジトリからとってくるのよねぇ。 あと、どうも、Phone向けのMDIL生成ツールと同名のexe (crossgen)がK Runtimeに入ってるんで、パッケージの分はいったんMDIL化してそう。 毎回parseとか、毎回JITはしたくないんじゃないかと。
  • #36: OWINは、デフォ状態で対応してるというよりは、ライブラリでUseOwin的な書き方したら対応できるって感じみたいだけども。