Beachhead implements new opcode on CLR JIT – .NET Fringe Japan 2016

10/1に、松竹スクエアのドワンゴセミナールームにて、「.NET Fringe Japan 2016」が開催され、そこで登壇してきました。

fringe2016

ニコニコ動画での配信も行われました。タイムシフト予約が必要だったので、今からは見れないかもしれません。
mov貰えないかと言う話をしているので、もしかしたらch9に転載するかも…

10時~20時までと、非常に長い一日で、かつ非常に濃い内容の一日。遠慮不要な題材を扱ったという点で、とても面白かったです。

私は主にtwitterで反応してました。こっちにまとめてあります。

上のニコニコのコメントですが、Roslynの赤いシャツはココで売っています。いいですよね、赤。私のパーソナルカラーです。また、「The Root of .NETの人」は、私の後の最後のセッションの荒井さんです。

この.NET Fringeは海外のコミュニティで、結構大規模に運営しているようです。ターゲットとしているのは.NETであってもOSS界隈のようで、HanselmanやSymeの顔がばーんと出てる辺りでも大きそうな感じです。

ただ、我々日本のコミュニティから見ると、.NETでありながらOSS寄りのコミュニティと言うのはあまりメジャーではない印象だったこともあり、.NET Fringeの日本開催の打診があった時には、どの程度人が集まるのか良くわからない、と言う所からスタートしました。

丁度2月初旬ごろだったと思うのですが、yukitosさんがtwitterで運営の声掛けをしていて、(私が名古屋にいると言う事もあり)一瞬迷ったのですがおもしろそうだと思って、運営に参加させていただきました。

まあ、それから上記の通り規模感が分からないのと、あまり大きくやろうとすると運営側の準備も大変になってしまうため、初回はOSS寄りと言う意向だけ本家からくみ取って、あとは自由にやる感じで進めて今日に至りました。

運営的な課題もあったのですが、開催してみたら人は集まるし、心配は杞憂でした。非常に有意義だったと思います。次回も是非やりたいですね。

このあたり、enoさんも詳しく感想書いて見えるので、参照お勧めします。


さて、私のセッションは、「Beachhead implements new opcode on CLR JIT」と言うタイトルでした。

セッションでもちょっと漏らしていましたが、このネタの準備が結構大変で (;´Д`) 無事にやりきることが出来たのは、自分自身も嬉しかったです。導入の事を詳しくしゃべれなかったので、この記事で書いておきます。

  • 去年のこみゅぷらすの時に、fujiwaraさんと初めて会って、その時にシリアライズ技術の話で盛り上がりました(ここはセッション中に軽く触れました)。で、シリアル化の高速化技術の手段として、ネイティブコードかそれに近い筋の最適化技術を適用できないか(特にデータのコピー)と考えていました。
  • 私は過去にx86のSSE命令などを駆使して、アセンブラで超高速なコピーコードを書いていた経験があったので、この時はネイティブコードでそれを実装して、シリアライザからDllImportとかでそれを呼び出すか、或いはC++/CLIかーみたいな事を考えていました。
  • しかし、それをやるとコードのマルチプラットフォーム対応をやりにくくなってしまう(特に、PCL化にも関心があった)ため、そのアイデアは途中で頓挫しました… まぁ、今回のネタでも解消したわけではありませんが。
  • 今回のネタのために、改めて資料やコードを読み返してみたりしていました。余談ですが、fujiwaraさんのMessagePack for CLIセッションを聞きながら、あーそう言えばアレがこうだったとかいろいろ思い出した…
  • もう一つ、Windows IoT Core側の話があります。「NETMFもう駄目じゃね?」みたいな話がいつぞやの勉強会で話題になったような気がするんですが(状況が芳しくない事には同意)、個人的にはIoT Coreの存在意義をあまり見いだせていなくて、やっぱりNETMFのように「.NET動いてくれて軽量な、良さげなランタイム欲しいな」と思ってました。RPiでLinux動くし、monoや.NET Coreが動くようになったので、ぶっちゃけそれでもいいわけですが、もっとOSカーネルコードが要らないような世界でも使えたら良いなと。ひょっとすると、coreclrがOSSになったことで、これをNETMFの後釜に出来る(ように改造できる)可能性があるかなと言う、淡い期待。で、果たして改造できるような見込みがあるのかどうか、感触を得てみたい(いつか)

このような(お話してない)バックグラウンドがあった上で、まぁRoslynもcorefxもアレだし、と言う所に繋がってきています。

で、難産だった部分の話も少し触れておくと:

  • 9月中は色々本業が忙しくて、思うように検証の時間が取れなくて焦っていた…
  • 最初に考えたネタがシリアライズの延長線として、JITでSSE2のPREFETCHNTA命令とかMOVNTDQとかを生成できないかなーと始めたのですが、これが最初にしては余りにネタの高望みし過ぎで、余計な改造をあっちこっちにした挙句、最後にプリフェッチヒント対象のアドレスをどう関連付けるのか、と言う所で(焦りと入り混じって)詰んでしまい、敢え無くボツ。
  • ベースキャンプに行って頭を冷やしながら、本業の仕事を少しこなしていた時に、たまたま名古屋方面で良く顔を合わす面々と昼飯食べながらボツネタの話をしていたら、新たなネタを思いついたので、そっちに方針転換。
    これは、coreclr上で全てのクラス内インスタンスメソッドを、強制的にvirtualとして扱うようにして、「本来オーバーライドできないメソッドがオーバーロード出来るようになりました、これでJava派の人たちに.NETでMockを扱いにくいとは言わせないぞ!!」という、これまた鬼畜で楽しそうなネタでした。
  • しかし、これは、coreclrの改造としてはすぐに実現したものの、一体どうやってこれを検証(Verifing tests)するのか?と言う所で詰み…
    メタデータ上はあくまでvirtualではないメソッドをvirtualとして扱うので、コンパイル時にもこれをだましてILを生成させないと、テストコードが実現出来ません。virtualなメソッドを呼び出すときには、callではなくcallvirtを使わなければならないからです。

ここまで来て詰んだ感かつ、他の発表者は全員題目発表済みだったので、かなり焦りがありました。

で、頭をひやして、とにかく「coreclrを改造可能であること」に重点をおいて、そういう「はしか」にかかった人たちへの道しるべとなる内容にして、全部自分でやろうとするのではなく、「コミュニティの力」を信頼することが大切じゃないのか? みたいな事を考えて、今回のネタに絞り込みました。

なので、今回のセッション内容の組み立ても、「まずは作ってみる(改造してみる)」「検証の方法も考える」という、自分でハマった点すらネタにして作り上げました (*´Д`) どうでしたか?実践的でしょ :)

実際になんとか動作検証出来たころには、狭めた範囲でも十分セッションの時間を使い切りそうだという事がわかり、やっぱり「やりすぎは良くない」「継続的に進めるのが重要」と言う事を改めて自覚できました。


さて、本家は分からないのですが、.NET Fringe Japanとしては、年一回のペースでやろうか、という話をしているところです。次回が何時で、どんな内容になるのかわかりませんが、ひょっとすると本家やF# foundationから誰かスピーカーをお願いしたり、と言う事があるかも知れませんね。ああ、すっかり忘れていましたが、OzCodeのFounderさんが、是非日本でOzCodeの解説をしたい、なんて言う話も貰ってました。

日本に閉じるのではなくて、もっと世界ともつながっていきたいと思います。

# スライドを全部(腐った)英語で書いたのは、そういう試みでもあります…

今回のセッションを生で聞いていただいた方、ニコニコ経由で聞いていただいた方、ありがとうございました。
それではまた。

投稿者:

kekyo

A strawberry red slime mold. Likes metaprogramming. MA. Bicycle rider. http://amzn.to/1SeuUwD