JIS X 3015:2008 とか互換性とか

JIS X 3015:2008 の PDF 版を購入した

JIS X 3015:2005 が改訂されて JIS X 3015:2008 になりました.

ウェブストアでも販売が開始されてます.

いずれ記事執筆等で必要になるので,私はさっさと PDF 版の規格票を購入しました.以前の JIS X 3015:2005 *1 と比べて若干値上がりしている模様(15,120円→17,430円).

JIS X 3015:2008 のセールスポイント

JIS X 3015:2008 は ISO/IEC 23270:2006 と 技術的内容において一致している とのことですが,実際には多数の「注記」が追加されています.
この「注記」は,ISO/IEC 23270:2006 で分かりにくかったり曖昧だったりした部分や,ISO/IEC 23270:2006 の後に判明した仕様上の問題点等を補足するもので,技術的にも大変興味深い資料となっています.「注記」そのものは「規定」ではありませんが,「注記」部分を選択的に読むことで,C# への理解がより深まることでしょう.
また,いくつかの errata については JIS X 3015:2008 で修正を取り込んでいるようです*2
実際の作業にあたられた「プログラム言語 C# JIS 原案作成委員会」の方々に感謝を.

無償公開されている ISO/IEC 23270:2006

ISO/IEC 23270:2006 は一般向けに無償公開されています.Common Language Infrastructure (CLI) 規格も同様.

ちなみに以前某氏から聞いた話では,.NET 関係のとある規格 (CLI かな) の JIS 版を, Microsoft としては無償公開ということにしたかったものの,JIS 側の都合で結局有償頒布になってしまったことがあるとかなんとか……あー,あくまでうわさですようわさ.

C# は○○○○(←好きな言語名を入れる)と違って国際的な標準規格なので云々」といううたい文句について

この手のうたい文句を見ると,国際的な標準規格が存在することにより期待される理想の状態をつい思い浮かべてしまい,それが既に実現されているような印象を受けますが,実際にはそうでもないです.というのがエンジニア向けの実情.
もちろん,規格化はエンジニアにとっても役立っています.多くの方々の多大なる努力により,規格制定プロセスの間に,仕様のミスや曖昧な文章が多数発見・修正されています.これらの作業は C# コンパイラ間の互換性を高める方向に作用するでしょうし,ひいては Microsoft の C# コンパイラの品質改善にもつながるでしょう.

Visual C# 2008 のコンパイラオプション langversion は割と手抜き

Visual C# 2008 には langversion というコンパイラオプションがあって,ISO-1/ISO-2/default のうちからひとつを指定できます.ISO-1/ISO-2 という名前がついていると,過去の規格でコンパイルできそうな気がしてきます.

引数

  • option
    • option が ISO-1 の場合、コンパイラは ISO/IEC 23270:2003 C# の言語仕様に含まれていない構文に対してエラーを生成します。
    • option が ISO-2 の場合、コンパイラは ISO/IEC 23270:2006 C# の言語仕様に含まれていない構文に対してエラーを生成します。
    • option が default の場合、コンパイラは有効なすべての構文を受け入れます。既定値は /langversion:default です。

が,実はこの ISO-1/ISO-2,そんなに厳密なものではありません.

Language versionはコンパイラの解析ツリーレベルで動作し、言語構文の中に表現された言語機能をコントロールします。これは意味的な違いといったような、言語に対する他の変更に関連するISO仕様への適合までも含むわけではありません。デフォルトのオプションでは常にその言語の最新バージョンが指定されるようになっています。

型システムが絡むあいまいさ/非互換性

型システムが絡むあいまいさ/非互換性はまだまだ散発的に見つかっています.なかなか枯れません.
たとえば,以前お伝えした以下のケース,最終的に言語仕様のアップデートで解決するそうです.

C#言語仕様」には、この状況に関する適切な説明が欠けています。このコンパイルエラーは仕様(by design)ですので、それに合わせて「C#言語仕様」をアップデートする予定です。

私どもではジェネリックを通して変換の制限の回避を可能にすることは望んでおりません。

型推論と互換性

型システムが絡むあいまいさ/非互換性の中でも特に最近特に問題が頻発しているのが,型推論に関してです.

さて,C# Generics で,同様の推論が可能かどうかについてですが,まず Visual C# 2008 に付属する C# コンパイラでは不可能です.じゃあ仕様的に不可能かというと,実はこのあたり結構ごたごたしていてよく分からないんですよね.

上に挙げたリンクで問題にされているのは,主に,(左辺の) デリゲートの戻り値型から (右辺の) ジェネリックメソッドの戻り値の型を推論するというケースです.このケースの中で,言語仕様では出来ると書かれているものが,Visual C# 2008 の C# コンパイラでは出来ないことがあるけどなんで?というお話です.ちなみに結論は,仕様も実装も Errata があったとのこと.

いずれ出版済みの言語仕様も修正するそうです.結局この辺の事情がどなっているのか・今後どうなるかは私にもよく分かりません.新しい実装は C# 4.0 で入りそうなので,もしかしたら上記 Java のような型推論が可能になっているんじゃないかと密かに期待しています.

複雑な式をひとつ与えられたときの,「C# の仕様上,この式は (推論が成功して) コンパイルできますか?」という質問,結構厄介です.仕様から実装まで含めて完全に落ち着くにはあと数年を要するんじゃないでしょうか.そして,その頃にはまた新しい推論ルールが追加されようとしているやもしれません.

C# 3.0 以降の標準化はどうなっているの?

先日行われたインタビューで,Anders Hejlsberg が C# 3.0 以降の標準化について述べています.

Do you expect C#3.0 to become an ECMA and ISO standard, as previous versions have?

We’re certainly open to that. There’s no ongoing work in the standards committee at the moment, but it’s really more a question of whether the community of industry partners out there would like to continue with that process. I should also say that the standards for C# explicitly do permit implementers to have extensions to the language, so though C# 3.0 is not standardized, it is certainly a complete implementation of the C# 2.0 standard. It is 100% backwards compatible, as all versions are.

今のところ C# 3.0 を ECMA や ISO に提出する動きはないんだとか.

*1:JIS X 3015:2005 規格書ダウンロード販売 - NyaRuRuの日記

*2:例えば §25.7.1「制約の充足」の,『制約が値型制約の場合~』に書かれている 3 つ目の条件.公開されている ISO/IEC 23270:2006 には書かれていない条件「A が,構築子制約new()をもつ型仮引数になっている。」が追加されている