++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

.NET Native

with 6 comments

.NET Nativeとかいうものが公開された模様。.NET言語(さしあたってはC#のみがサポート対象)からNativeコードを直接作る仕組み。

去年の暮ぐらいから噂にはなっていたもの。//build/ の初日キーノートでは出てこなかった(初日は OS 関連。WP8.1とかの話題)ので公開明日かと思ったらもう。

概要

以下のようなもの。

  • WP8が使ってるMDILに基いた技術
  • クライアントデバイスには完全にネイティブ化した状態で配布
  • クライアント上で余計な電力消費しないし、初回起動も早い
  • 当面のターゲットはストアアプリのみ。ただし、ターゲットは今後広げていきたい

前にプロ生勉強会で話した通り(C#とILとネイティブと)、ManagedコードからNativeコードに変換するタイミングをどうするかってのは意外と難しい話なんですけども。

以下、.NET Nativeのヘルプを読んでみた感じ、その辺りをどうしてるかとか、その他疑問として出そうなところを補足。

クライアントデバイスに.NET Frameworkのインストールは?

不要。

実行に必要なものは全部ネイティブ化、静的リンク。

C#のネイティブコンパイラーが出来たの?

やってることはMSILの事前コンパイル。C#からだと、C#→MSIL→MDIL→ネイティブという流れに。

仕組み上、.NET言語なら何でもネイティブ化できるはずだけど、現状のVisual Studioのプロジェクトテンプレート的にはC#のみ提供(ストア アプリ的に利用者が一番多いものから対応)。

ガベコレは?

あり。

メモリは管理されたまま。Nativeだけど、Unmanagedではない。

.NET Nativeでビルドすると、実行ファイルにMRT.dllっていうDLLが同梱されて、その中にガベコレ用コードが入ってる。

バイナリのサイズは膨らまない?

使っていない部分は除外してからネイティブ化、静的リンクするので大丈夫。

ライブラリが更新されたときには?

当面ストアアプリ限定になってる理由の1つだと思うけど、ストアのサーバー上でクラウドコンパイル(Compile in the Cloud)する。依存先のライブラリが更新されたら自動でバイナリ更新。

将来どうなるかわからないけど、Windowsストアを介さないのであれば、バイナリ更新は開発者の責任ではないかと。(ライブラリが更新されることって、アプリの更新と比べるとかなり低頻度のはずなので、それで十分な場合が多いし。)

リフレクションは?

一番制約がかかるのはもちろんここ。前述の通り、使ってないコードは残さない方針なので、「リフレクションで使ってる」ってことをコンパイラーに教える必要がある。

経験則的な方法で、ある程度自動的にリフレクションで使っているクラスを判定してくれるらしい。自動判定できるのは、例えば、XAMLのデータバインディングで使った型とか、DataContractSerializerのコンストラクターにtypeof(T)で渡した型。

それ以外は、自分で「参照定義ファイル」を書かなきゃいけない(プロジェクトを.NET Native対応に変換すると、rd.xmlってファイルが追加されるので、これを書き換える)。DataContractSerializer以外の、サードパティ製シリアライザー(例えばJson.NETとか)を使う場合には、この参照定義ファイルへの記述が必要。

逆にいうと、参照定義ファイルさえ書けばリフレクション使い放題。dynamicも使える。

ジェネリックとか平気?

古いバージョンのMono AOTで問題になってたみたいな、値型のジェネリックが一部実行出来ない問題は起こらないみたい。

ここ数ヶ月、MSの.NETチームとXamarineが協業してたみたいだし、色々成果共有してるのかも。

使える.NET標準ライブラリは?

現状、ターゲットがストアアプリなのもあって、ベースは.NET Core(ストアアプリ向け.NETプロファイル)。

そこからさらに、いくつかのクラス/メソッドが使えない。例えば以下のようなものが使えない。

  • DataAnnotations
  • Microsoft.VisualBasic
  • WCF
  • DelegateのBeginInvoke/EndInvoke
  • COM InteropでVARIANT

あと、DateTime.Parseでパースできる文字列に制限があるとか、そういう制限も。

結果、.NET Core以上に使えるクラス/メソッドが少ない「.NET Native」プロファイルができてる。

その他に制限とかは?

C#の言語的にも、ほとんど出くわさないような状況だと思うものの、いくつか制限あり。

  • 構造体の最大サイズが1M Byte
  • 3次元以上の多次元配列が使えない(jugged arrayなら使える)
  • ポインター型の配列が使えない

コードの最適化は?

JITと違ってコンパイルに時間かけれるので、ガチガチの最適化コードにしてくれる。コンパイラーはC++のものとコードを共有してるらしい。

MSのC++コンパイラーとコードベース共通ってことは、auto-vectorizationとかもやってくれるはず。

(現状対象になっているストアアプリ以外)期待される分野は?

ゲームとか、.NET Micro Frameworkとか。

Windowsデスクトップもまだまだ大事なターゲットだけども、ライブラリの更新に自動追従しない辺りがつらいかも。

Xamarinと成果共有されてiOSとかAndroid向けバイナリも作れると夢広がる。

追記: 4/5(土)

以下のセッションの資料が公開されたので。

6ページ前後、「Compiler in the Cloud」の文字がやたらと強調されてる。やっぱり、ストア上だからネイティブ化しやすいのよねぇ(上記の「ライブラリが更新されたときは?」的な意味で)。

11ページ目、やっぱりauto-vectorization効いてるらしい。実に素敵。というか、さらに、auto-parallelizedとかいう文字まである。

13ページ目、FAQへのリンクあり:

Written by ufcpp

2014年4月3日 @ 11:44

カテゴリー: .NET, C#

Tagged with

6件のフィードバック

Subscribe to comments with RSS.

  1. .NET Micro Frameworkとかに地味に効きそうというか、神仕様になりそう。

    はつね

    2014年4月3日 at 12:01

  2. […] Microsoft .NET Nativeの仕組みや制限に関して知りたい場合、「未確認飛行 C ブログ」に詳しく説明されています。現状ターゲットはWindowsストアアプリのみ、使える.NET標準ライブラリは.NET Coreということで、結構制限がある感じです。 […]

  3. インストールには「Visual Studio 2013 Update 2 RC 」が必要なそうです。

    naohiro19 (@naohiro19_)

    2014年4月7日 at 15:29

  4. […] 過去の記事: .NET Native […]


コメントを残す