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

数字で見る IronRuby + DLR

.NET

IronRuby + DLR ソースコードクイズ 解答編.

問1 C# のコード部分に出現する ?? 演算子の回数と yield return の回数,どちらが多いでしょう?

答え: ?? 演算子の方が多い
かなり微妙な差なのですが,若干 ?? 演算子の方が多いです.以下ディレクトリと登場回数の対応表.

ディレクトリ yield return 登場回数
Utils\RubyTestHost\ 3
Src\Microsoft.Scripting\ 28
31
ディレクトリ ?? 演算子登場回数
Src\Ruby\Compiler\AST\ 2
Src\Ruby\Compiler\AST\Declarations\ 1
Src\Ruby\Compiler\Parser\ 1
Src\Ruby\Runtime\ 1
Utils\ClassInitGenerator\ 1
Src\Microsoft.Scripting\Actions\ 5
Src\Microsoft.Scripting\Ast\ 2
Src\Microsoft.Scripting\Generation\ 4
Src\Microsoft.Scripting\Hosting\ 3
Src\Microsoft.Scripting\Types\ 1
Src\Microsoft.Scripting\ 12
33

これを見ると ?? 演算子は意外と使われている,という印象です.
関連話題としては

でも個人的には null だと何もしないという演算子が欲しいです.Built-in な Maybe.
一方 yield return は,まあこんなものかという感じ.イテレータは単なるシンタックスシュガーなので,登場数 0 でも不思議ではないのですが,ということで多くても少なくても結果がすべて,みたいな.
ちなみに LINQ の登場によって半分ぐらいにできそうでした.

問2 C# 2.0 で導入された,Nullable (あるいは T?) ですが,ソースコード中で出現する T は何種類だったでしょう?

答え: (C) 以下の 2 種類

  • SymbolId?
  • int?

これは意外に少なかったという印象です.まあデータベースが絡まないとこんなものでしょうか.経験的には,バイナリフォーマットで「省略可能」という値の表現によく使う Nullable ですが,参照型のツリーが主役の言語実装では null を使えば良いのであんまり出番はないのかもしてません.
これぞ Nullable というプロジェクトを見てみたい今日この頃.

問3 C# 2.0 では partial type を用いることで,ひとつの型の記述を複数の場所に分散させることができますが,もっとも多くの場所に分散されていた型の,分割数はいくつだったでしょう?

答え: (D) 60 分割

Microsoft.Scripting.Ast.Ast クラスが,圧倒的大差で勝利です.なんと 60 ものファイルに分割記述されています.ここまで使い倒してもらえればきっとヘジたんも満足でしょう.こうなると,partial type は GUI 開発や IDE 連携の専用技術とも言えないですね.

参考 (読むべし)

id:siokoshou:20070723#p2 で紹介されている The Expression Problem: Part IV - Layers

おまけ: #if SILVERLIGHT または #if !SILVERLIGHT の数 : 167 個

一致した行: 167 一致したファイル: 67 検索ファイル総数: 511

全ファイル数に対して 10 % 程度のファイルに存在し,登場するファイルについて平均 2.5 回も使用されています.これを多いと見るか少ないと見るか.
#ifdef usage in Rotor というエントリに,Rotor で使われている #ifdef の数が出ていて,比べてみるとおもしろいです.

Here were the top usages:

2249 _DEBUG
1266 DACCESS_COMPILE
389 _X86_
302 _MSC_VER
220 DECLARE_HELPERS
133 DEBUGGING_SUPPORTED
125 PROFILING_SUPPORTED
118 PLATFORM_UNIX
98 LOGGING
89 _PPC_
78 _DEBUG_IMPL
75 CHECK_APP_DOMAIN_LEAKS
74 __cplusplus
71 BIGENDIAN
59 _WIN64

Rotor では圧倒的多数がデバッグ用ということが分かります.一方 IronRuby + DLR での #if DEBUG の数は 39 個で,Conditional 属性によって #if が削減できていると見てよいでしょう.
mono の方でも id:atsushieno:20070706:p1 に "#if NET_2_1" といったキーワードが見えますし,ある程度の数のプロジェクトを一覧にしてみると,おもしろいものが見えてくるかもしれません.

とまあ以上,数字で見る IronRuby + DLR でした.