飽きっぽい人のブログ

プログラマとしてもテスターとしても中途半端な人のブログ

.NET Nativeについていろいろ

.NET Native公開

.NET Nativeが公開されましたね
すでに岩永さんのブログでも紹介されていますが、ブログの記事を書く練習がてらにうちでも紹介したいと思います
いちおう公式のビデオ見たりヘルプを見ていますが、何分俺の英語能力あれなものでして・・・
疑わしいと思われたら公式ページを参照してください

公式の紹介ビデオをもとに、推定ですが.NET Nativeのアプリ配布の流れを図にしてみました
が、はてぶの画像アップロード機能だとぼやけて見れたもんじゃない。ブログって難しいね
かわりにOneDriveに上げときました

クライアントに.NETフレームワークインストールは不要

らしいですね。これはフレームワークも含めてILで書かれたものはアプリストア上で静的にリンクされるためだと思います
公式のビデオの内容だと正確にはIL実行ファイルと参照ライブラリを一度単一のC#ファイルに逆コンパイルしてから再コンパイルしているっぽいです
ILマージするだけでいいだろって思ったんですが、構文解析レベルでできる最適化があるのかもしれませんね
public static readonlyな変数をconst変数として解釈する、とかやってるのかもしれません

配布するときはdllで配布される?

公式ビデオだと最終的には10kbの呼び出し専用exeとアプリ本体のコードが入ったdllになるようなのですが、どのタイミングでなるかの裏はとれませんでした。多分配布されるときはネイティブのdllのみで、クライアント側でそのdllを実行可能にするexeが割り当てられるのかなと思います
解説の人がいろいろ説明してたんですが、ヒアリング能力0なんでわかりません
おまけにその人字が汚くてホワイトボードの内容を見るのも一苦労でした

C++/CXと比べてどうなのか

ネイティブということでちょっと考察してみます
OSのAPI呼び出しに関してはほぼ同等の速度ではないかと思います
ただ上にも書いたようにILのライブラリは静的にリンクされるため実行時にdllロードコストがなくなります(逆にC++/CXで書いたライブラリだと現状COMであるためdllのロードコストが避けられないかと思います)
じゃあ全てC#で書けばよいかというとそんなことはなくて、そもそもILの仕様だとどうしても最適化できないところが結構あるらしいです。また、言語仕様的にもC++のが最適化しやすいです
あとはまあ、メモリ管理にGC使いたいか参照カウント使いたいかが選ぶポイントになりますかね
とはいえ、C++/CXで提供されたライブラリにdllロードコストがかかってしまうのは問題なので今後MSからなんらかの解決策が提示されるのではないでしょうか

とりあえずこんなところですかね
記事の内容に問題がなければ次回はこの情報をもとにWindowsの今後を占ってみたいと思います