読者です 読者をやめる 読者になる 読者になる

dotNetConf 2015 Japan 参加レポート【後編】

asp.net cw_owashi roslyn .net core 5 event C#

クロスワープの大鷲です。

去る 4/11 の土曜日、日本マイクロソフト 品川本社にて開催された dotNetConf 2015 Japan に参加してきました。
前編では芝村さんのセッションまでについてレポートしました。
後編では岩永さんのセッションからお届けします。

なお、黄色の文字は、当日のセッション中で言及されなかった内容を私が補足したり、感じたことを述べたりしている部分です。

Deep Dive: C# 6

スピーカーは岩永信之さん(Blog/Twitter)。

www.slideshare.net
dotNetConf 2015 Japan with JXUG | ++C++; // 未確認飛行 C ブログ

潜伏期

C# の言語仕様として async/await が発表されたのが 2010 年のこと。
その後、2014 年に C# 6.0 の情報が出始めるまで、実に 4 年もの間、C# の言語仕様のバージョンアップはなかったことになります。
この間、マイクロソフトは Roslyn にかかりきりになっていて、C# の言語仕様に手を付ける余裕がなかったとのこと。

2014 年になって Roslyn が安定してきたので、そろそろ言語仕様の改善に着手したいわけですが、これまで待たせすぎたので、大規模な変更は次の C# 7.0 に回し、6.0 では低コスト低リスクで実現可能な、すぐにできるもののみを取り入れたようです。
テーマは「just do it」。

Roslyn の動機

現行の C# コンパイラーは C++ で書かれています。この保守が辛くなってきたというのが一つ目の理由。
さらに、コンパイラーはそれ単体として完結してしまっており、外部からの再利用ができないので、Visual Studio 内でコード分析等を行いたい場合には、コンパイラーとは別に独自実装しなければなりませんでした。
ReSharper のようなサードパーティ製品では、さらに独自実装が必要となり、C# のコードをパースするのに、3 重の実装が必要でした。

この状況を解消するために、コンパイラーを再利用できるようにしようということで出てきたのが Roslyn です。

C# 6.0

新機能としては以下のようなものが挙げられます。

  • 自動プロパティの改善
  • 式形式の関数メンバー
  • using static
  • null 条件演算子
  • 文字列挿入
  • nameof 演算子
  • ディクショナリ初期化子
  • 例外フィルター
  • catch/finally 内での await
  • 拡張メソッドでのコレクション初期化子

詳しくはスライドをご覧頂くとして、いくつか、個人的に思うところを書いてみたいと思います。

なお、以下のコードはスライド中で用いられているものと厳密に同じではありません。

readonly プロパティ

これまで、コンストラクターで値をセットしたら、あとは変更できないプロパティは、以下のように書く必要がありました(private set プロパティはクラス内からは書き換えができるので、厳密には readonly ではありません)。

class Immutable
{
  private readonly int _x;

  public Immutable(int x)
  {
    this._x = x;
  }

  public int X
  {
    get
    {
      return this._x;
    }
  }
}

これが、こう書けるようになったと。

class Immutable
{
  public Immutable(int x)
  {
    this.X = x;
  }

  public int X { get; }
}

だいぶ簡素になりました。

null 条件演算子

オブジェクトのメンバーにアクセスする際、そのオブジェクトが null の可能性がある場合、これまでは事前にチェックする必要がありました。

string name;

if (unit == null)
{
  name = "空欄"
}
else
{
  name = unit.Master.Name;
}

null 条件演算子を使うと、オブジェクトが null の場合、それ以上の処理をせず、自動的に null を返してくれます。
つまり、上記のコードが、以下のようになります。

string name = unit?.Master.Name ?? "空欄";

非常にスッキリしました。

nameof 式

変数名、メンバー名、クラス名等を文字列化できます。

if (x < 0)
{
  throw new ArgumentOutOfRangeException("x", "x must be positive");
}

この文字列中の "x" は、名前を y に変えても、VS のリファクタリングで検出されませんでした。
それが、

if (x < 0)
{
  throw new ArgumentOutOfRangeException(nameof(x), nameof(x) + " must be positive");
}

と書くことで、リファクタリング対象になります。
リフレクションでも威力を発揮しますね。

ただし、最も末端の名前を取得するので、例えば

nameof(model.Master.Name)

は "Name" になってしまいます。
ASP.NET MVC でメンバーを参照する際に

@Html.DisplayFor(x => x.Master.Name)

のように Expression Tree を用いた記述を行いました。
ただメンバー名を取得するためだけに Expression Tree を使うのは大げさだと思っていましたが、nameof をこの用途に用いることはできなさそうです。

catch/finally 内での await が可能に

これは、これまで組み合わせることができなかった言語機能が組み合わせられるようになったということで、素直に喜ぶべきことですね。
特に Windows Store アプリ等ではファイルアクセスが完全に非同期なので、これまで、例外のログ記録等では大きな問題になっていましたが、これが解消されることになりました。

C# 7.0

次の次のバージョンである C# 7.0 では、結構大規模な改良を目指しているようです。
大きなテーマは「working with data」だそうです。
以下のような機能が検討されているようです(が、実現されるかどうかはわかりません)。

  • データ
    • タプル型
    • レコード型
    • light weight dynamic
  • null の扱い(null 禁止型など)
  • パフォーマンスと信頼性
  • コンポーネント化
  • 分散コンピューティング
  • メタプログラミング
  • パターンマッチング

この他にも、細かな改善や破壊的な変更点などがあります。詳細はスライドをご覧ください。

こういった言語機能に対する要望やフィードバック等も GitHub の Issues で管理されているようで、この点もオープン化の大きなメリットですね。

Deep Dive: Roslyn

スピーカーは竹原貴司さん(Blog/Twitter)。

github.com
発表スライドもこちらのリポジトリにあります。

コンパイラーとは

竹原さんのセッションは、コンパイラーとは何で、どういう内部構造になっているのかといったアカデミックな話に始まり、徐々に Roslyn にシフトして行きました。

コンパイラーは原始プログラム(ソースコード)を目的プログラム(バイナリコード、.NET の場合は MSIL)に変換するもの。
内部処理はフロントエンドとバックエンドに大別できます。

  • フロントエンド
    字句解析
    変数名、定数値、演算子などをなす文字列をまとめて一つの単位とし、字句という。
    構文解析
    字句の列に対して、言語の構文規則に従ってプログラムの構文的な構造をしらべ、構造を表す解析木を作る。
    意味解析
    変数名などの名前を記号表に登録し、型の一貫性の検査などをする。
  • バックエンド
    コード最適化
    コード生成
    解析木を機械命令の列に置き換える。コード生成の前または後においてコード最適化が行われることもある。

Roslyn で変わったこと

Roslyn において大きく変わったのは、これまではアウトプロセス コンパイラーであったのが、Roslyn ではインプロセス コンパイラーになったことでした。
これまでも CodeDOM という機能を使って、プログラム中で C# のコードをコンパイルすることはできましたし、ASP.NET のビューのコード等はそのようにしてコンパイルされていました。
しかし、CodeDOM は内部で C# コンパイラーである csc.exe を呼び出しています。
コンパイラーが独立したプロセスであり、呼び出し元プロセスの外にあることから、これを「アウトプロセス コンパイラー」と呼びました。
一方 Roslyn はライブラリなので、呼び出し元プロセスの内部で動作します。だから「インプロセス コンパイラー」。
大きな違いは、プロセス起動のコストです。
Windows は、プロセスを起動するのが遅い OS らしく、CodeDOM を使ったコンパイル処理時間の多くを、プロセス起動のコストが占めます。
Roslyn であれば、そのコストをカットすることができるわけです。
純粋なコンパイル処理自体の時間は、これまでは C++ で書かれていたものが C# 製になったので、若干遅くなっていますが、プロセス起動のコスト削減は、それを補って余りあります。

ASP.NET 5 では、ビューのコードも Roslyn を使ってコンパイルされるようになるため、CodeDOM を使っていたこれまでのものより速くなります。
特にコードを変更しなくても、プラットフォームを変えるだけで速くなるというメリットがあるわけです。

TAKERATCH

後半は Scratch の紹介に始まって、コンパイラーを作ってみたという内容でした(竹原版 Scratch で "TAKERATCH" だそうです)。
と言っても、入力はソースコードではなく抽象構文木(AST)です。抽象構文木というのは、コンパイラーのフロントエンドの処理のうち、構文解析が終わった時点で生成されているものです。
.NET においては Expression Tree として扱うこともできますね。

GUI で構文木を選択すると、それに対応する C# と JavaScript のコードが生成され、C# は Roslyn で、JavaScript はブラウザーで実行するというものでした。

最後に、「プログラムにコンパイラーを組み込んでみる」という提案で締めくくられました。
そうすることで、処理をコードではなくデータとして扱うことができるので、アプリケーションをデプロイし直すことなく、処理を差し替えることが可能になります。
これは現在取り組んでいるプロジェクトで採用していきたいと思います。

Panel Discussion: .NET Core 5 の将来像 ~ 誰が、いつ、何に使うべきか ~

本日の登壇者全員によるパネルディスカッション。マイクロソフト井上さんが進行役を務めました。

オープンソース化について

最初に、芝村さんが過去に ASP.NET のコードにプルリクエストを出した時のことについて質問されました。
当時は GitHub ではなく Codeplex でしたが、ASP.NET はマイクロソフトの製品の中ではオープンソース化の先駆けになったと記憶しています。

ASP.NET のコードにバグを発見し、それが実害のあるものだったので、イラッとなってプルリクエストしたもので、オープンソースへの貢献といった思いはなかったとのことでした。
マイクロソフトの中の人というと、何か超人的なエンジニア像を想像しますが、そういった人たちでも、結構泥臭いコードを書いていたり、ポカミスをやらかしたりするんだと思ったそうです。

以前から、フォーラムや Microsoft Connect といったサイト経由でバグ報告はできましたが、フィードバックが見られているかどうかわからないという不安はありました。
オープンになることで、プロセスが透明化されたのは大きいようです。

一方で、オープンソースに対する不信感のようなものもあるようです。
岩永さんはゲーム業界で、オープンソースのライブラリも積極的に活用されているとのことでした。
会場からは、「GPL はライセンスの関係で使えない」「『買ったもの』というところに信頼を置いている」等といった理由から、オープンソース ソフトウェアを採用できない場合もあるとの声が上がりました。

クロスプラットフォーム化について

ASP.NET の公式サイトで行われたアンケートによれば、「ASP.NET が Linux で動いた場合、使いたいと思いますか?」という質問に対し、63% が Yes と回答したそうです。
…微妙な数字ですね。

「Linux/Mac OS で .NET Core 5 を使う意味とは?」という質問に対しては、

  • Linux が得意な会社に開発を任せることができる(岩永さん)
  • 開発者の幅が広がる(芝村さん、竹原さん)

といった意見がありました。
昨今は iOS との親和性から若い人は Mac を選ぶ傾向があり、そうした人たちにもリーチできそうです。

芝村さんは「あのアンケートは信用しちゃいけないと思う」とも発言されていました。

また、マイクロソフトは特に日本では過去の悪印象を引きずっているため、Windows は負の先入観を持たれているようで、「Linux で動かないというだけで採用の選択肢に入らない」というケースもあるようです。

現在 Windows 上で ASP.NET を動かしている人が、敢えて Linux に移行するメリットは薄そうですね。

.NET Core 5 / ASP.NET 開発における Visual Studio の意義

Mac での開発環境については、

  • Mac で楽に開発できるなら VS でなくてもいい(矢後さん)
  • マイクロソフトが Mac 版 VS を無償で出すとは思えない。Xcode のアドインのような形が良いのではないか(芝村さん)
  • マイクロソフトが VS に投入しているのと同じコストを Mac に投入するとは思えない(岩永さん)

といった声がありました。

竹原さんは「Visual Studio を使っている理由は最強のデバッガーがあるから」と語っていました。
JetBrains のツールは VS 的なデバッガーを持っているそうです。IntelliJ IDEA 等が有名ですね。また、Eclipse もそれなりのデバッガーを持っているのではないでしょうか。
竹原さんから「PHP はどうやってデバッグしているの? printf?」という質問が出ると、会場からは「Linux 畑の人は VS のようなデバッグを知らないのでは」という衝撃的な発言もありました。

個人的には、JavaScript に関しては、IE や Chrome といったブラウザーが結構進んだデバッガーを搭載しているので、そういうのを知った人が「何故これがサーバーサイドで出来ないのか」と思うのではないかと思ったのですが、

twitter.com
という報告もあり、驚きを隠せません。

.NET Core5 の将来像 ~誰が、いつ、何に使うべきか?

芝村さんは「まだベータ版なので何とも評価できない、RTM になったら考えたい」とのことでした。
竹原さんは「重厚な HttpContext から脱却したり、CodeDOM が Roslyn になることで、アプリケーションを変えなくてもプラットフォームをアップグレードするだけでパフォーマンスが上がるので恩恵がある」。
岩永さんは「.NET 4.6 と Core 5 という 2 つのフレームワークがある現状は明らかに過渡期で、MS もいずれは統一したいはず。いつになるかはわからないけれど」。

また、会場からは、Roslyn がマルチプラットフォームに対応することで

  • PowerShell がマルチプラットフォームになる
  • ブラウザー上で C# スクリプトが動くようになる

といった期待も聞かれました。
後者については「Dart が Chrome に乗らなかったんだから厳しいのでは」(岩永さん)と切り返されていましたが。

また、IoT 方面では「.NET Micro Framework はビジネス的には失敗で、デバイスが高性能化してきた。.NET Core なら組み込み用にも使えるのでは」という意見も聞かれました。
実際、芝村さんはセッション中で Raspberry Pi 上で DNX を動かすデモを行っており、期待が持てそうです。

まとめ

  • .NET Framework と .NET Core があることでしばらくは混乱すると思うけれど、なるようになると思う(矢後さん)
  • 子供がプログラミングするときに .NET が選択肢になるといいねって Scott Hanselman が言ってた(矢後さん)
  • 日本では動的言語のほうが人気があるので、ASP.NET にももっと目を向けてほしい(芝村さん)
  • かつては悪の帝国だったマイクロソフトがずいぶん変わったのを感じる(芝村さん)
  • Roslyn が一段落したので一息ついてる(岩永さん)
  • .NET Core はまだ潜伏期なので、今後楽しくなる(岩永さん)
  • 今後どう変わっていくかわからない。出たとこ勝負だけど楽しい(竹原さん)
  • 新しい技術にはいつもワクワクする(井上さん)
  • 業務には使わなくても触れていくのはエンジニアの醍醐味(井上さん)
  • Contribute してください(井上さん)

といった感じで本会はお開きとなりました。

個人的には、確かに今は過渡期で、.NET Framework 3.0 が出たときに、2.0 の機能はそのまま、その上に 3.0 の層が被さったように、いずれ .NET Core の上に WPF のような Windows 専用の層が乗ってくるのではないかと思います。

懇親会

部屋を移動してピザパーティーが開かれました。

じゃんけん大会が開かれ、井上さんから賞品として 2 冊の本が提供されました。残念ながら早々に負けてしまい、どちらもゲットできませんでした。www.amazon.co.jp
www.amazon.co.jp

当日は井上さんの誕生日ということで、井上さんの顔写真入りバースデーケーキがサプライズでプレゼントされる一幕もありました。

twitter.com

イベントの詳細および当日の Twitter まとめは、以下のリンクからご覧ください。

atnd.org
togetter.com