ものがたり(旧)

atsushieno.hatenablog.com に続く

The Root of .NET Framework を読んだ

The Root of .NET Framework

The Root of .NET Framework

書評はそのうちいくらでも詳しく書く人が出てくると思うので(でもまだそんなにいないねえ)、僕は書評というよりは、僕の視点で書けることを書こうと思う。

まず、この本は.NET Frameworkのランタイムの部分について(のみ、と言ってもいいかもしれない)詳しく説明されている本だ。この本ではMonoについての言及はほとんど無いが、Monoで言えば、Cで書かれたランタイムの部分について説明している本だと思えばいい。この本をリファレンスとして利用できる人は、いないか、いてもかなり限られているだろう。

個人的な印象としては、他人に読ませるための本というよりは、個人的にいろいろ調べてみた結果やその手法を、書籍という形でまとめてみた、というものに見える。だから、実験の参考資料というより、読み物なのかなと思っている(と言っても僕はこういう「実験」をほとんどしない人間なので、もしかしたら実験の参考資料としても有用なのかもしれないけど)。.NETの読み物としては、これは他に類を見ない萌え本だと思う。

プログラミング.NET Frameworkとはだいぶ色合いが異なる。

プログラミングMS .NET FRAMEWORK 第2版 (マイクロソフト公式解説書)

プログラミングMS .NET FRAMEWORK 第2版 (マイクロソフト公式解説書)

お互いに代わりにはならない。たとえば、mscorlibについても、String型の扱い(Unicodeとか、文字列のinternとか)については、the Root of .NET Frameworkには言及が無い。自宅に帰らないとこの本が無いので、とりあえず思い出せるところだけ。

この本はECMA/ISO CLIについて語ることを主な着眼点のひとつとして書かれていて、どこがCLIの守備範囲でどこがCLRの実装なのかを区別するように記述されている。ただし、CLIでない部分については、.NET Frameworkの実装についてのみ書かれている。その内容については僕が特に書くことでもないので、ここではこの本について、Monoを念頭に置いて(手短に)言及していこうと思う。

第1章の、Windows APIからCOMを経て.NET Frameworkに至るという部分だが、実のところMonoについても類似の背景がある(GNOMEにおけるBonobo)。その辺はMSDNにある大昔のMiguelのインタビューが参考になると思う(内容は古いけど)。実は最近余所でmonoについて記事を書いた時、最初はこの辺の事情も語っていたのだけど、紙面の都合でばっさり削ってしまった。

第3章の部分は、.NET FrameworkとMonoでは多少異なる。.NETでmscoree.dllが呼び出されるまでの部分(OSローダ)は、Monoには存在しない。PEヘッダを見つけたらmonoを呼び出すよう、binfmtを設定することは出来るが、標準ではない。monoランタイムのエントリポイントとしては、JITであるminiと、.NETには無いインタプリタmintとがある(mintはもう過去の遺産になりつつあるし、よくビルドできない状態で放置されているが)。fusion.dllに相当する部分は、monoランタイムでmetadata APIとして実装されている。

PEファイルのメタデータ部分について説明している部分は、Mono.Cecil.dllみたいなライブラリを作る人には参考になるかもしれない(でもcecilほど本格的に作るなら、むしろCLI仕様書を眺めるだろうな)。ただし内容をSOSデバッガでダンプしている部分は、もちろんmonoでは異なる。monoランタイムがこれらをどのようにメモリ上に配置しているかを知るには、単にgdbを使えば良いだろう。

アセンブリのロードについては、インサイド .NET Frameworkとかぶっていると思う。

第4章のGCについては、昔Mono Summitで大変細かいsgen-gcのプレゼンテーションを見た(その片鱗はmonoのサイトでも見られる)のと、.NET 1.0が出た頃のムックに載っていたGCに関する記事(これこれ)があったので、実はそんなに驚かなかった。もちろんMSDNの記事は.NET 1.0の頃の内容なので、2.0とは多少異なるけど。sgen-gcは、未だに完成していないけど(というより作業が行われていない気がする)、ラージオブジェクトのコンパクション回避などは実装されていたようだ。

第5章のCLRホスティングについては、ほとんどMonoと共通する部分が無い。monoランタイムには組み込みAPIがあるので、これを使ってCのコードから呼び出すことが出来る。RCW/CCWは無い(そもそもCOMが無いし)。

さて。

著者の荒井さんというと、その昔TechEdか何かで見た、VisualStudioのedit & continueについてのトークが記憶に残っている(今調べたらCLRの詳細だったようだ)。edit & continueを実装するためには、この本に書かれているような内容を調べることになるだろうなあと思う。まあ、monoでは通じない内容だけど。

.NETでこういう「萌え本」の類が出ることはこれまで無かったと思うので、こういう本が他にも出てくると楽しいかもしれない。