このブログの中を検索する

2012/04/09

C#とILコード(.NETの中間言語)の対比


title: C#とILコード(.NETの中間言語)の対比
url: http://csharptan.wordpress.com/2011/12/17/net%e3%81%ae%e4%b8%ad%e9%96%93%e8%a8%80%e8%aa%9e/

snippet:

-----引用-----
  • intなどのいくつかの型は、加減乗除など、専用の命令を持っています(プリミティブ型と呼ばれます)
  • ちなみに、decimalはプリミティブではないです。ただの構造体
  • デリゲート、列挙型は特別扱いを受けています
    内部的にクラスになったりするわけではなく、別定義
  • 一方、null許容型ただの構造体です
  • 配列も結構特殊な扱いを受けています
  • 文字列(stringクラス)は単なるクラスですが、リテラルの扱いが多少特殊です
    C#で、文字列だけは参照型なのにconstを付けれるのはそのため
  • ポインター型もあります
  • 加減乗除などの命令には、オーバーフローのチェックをするタイプとしないタイプとがあります
    チェックするタイプでは、オーバーフロー時に例外を発生させます
  • switchステートメント相当の専用命令があります
    状況に応じて、if-else的なコードにJITするか、ジャンプテーブル的なコードにJITするか選んでくれるそうです

C#にはあるけど、ILには直接はないもの:
  • インデクサー
    内部的にはプロパティ扱いです
  • ユーザー定義の演算子
    単なる静的メソッドになります
  • ループ(while, for, foreach)
    ifとgoto的なコードに展開されます
  • ラムダ式、イテレーター、非同期メソッド、dynamic
    かなり込み入ったコード生成してます
    イテレーターとかラムダ式に至っては、クラスが生成されたりしてます
  • クエリ式
    割かし単純なメソッド呼び出しへの置き換え
  • lockステートメント
    Monitorクラスに丸投げ
  • 拡張メソッドデフォルト引数、dynamicな引数
    属性が付くだけ

ILにはあるけど、C#にはないもの:
  • 本当の意味での可変長引数
    C#のものは、配列の自動生成で実装しています
    ILレベルでは、任意個数のスタックを消費してメソッドを呼び出す方法があります
  • 変数の間接参照
    C#だと、引数を参照渡しするときしか間接参照がおきませんが、ILレベルではもっといろいろ使える参照ロード/ストア命令があります
  • デリゲートとは別に、関数ポインターを持っています
-----引用-----

0 件のコメント:

コメントを投稿