平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

C#は強い型付けの言語?それとも弱い型付けの言語?

Eric Lippert's Blogを勝手に翻訳。

C#は強い型付けの言語?それとも弱い型付けの言語?

そうだよ。

■その答えじゃ何もわからない。

そんなことはない。おもしろいことに、もしさっきの質問の「それとも」を「そして」に変えたとしても*1、答えは同じだ。

■へ?つまりC#は強い型付けの言語でもあり、弱い型付けの言語でもあるということ?

そう。C#は強い型付けの言語でもあり、弱い型付けの言語でもある。

■混乱してきた。

僕もね。思うにあなたは「強い型付け」と「弱い型付け」をどういう意味で使ったのかをちゃんと話すべきだよ。

■ううう。実はその言葉の意味をちゃんとは知らないから、その質問をするべきなのは私の方だね。ある言語が「強い型付け」または「弱い型付け」って実際どういう意味なの?

「弱い型付け」の方は「この言語の型検証システムが気に入らない」で、「強い型付け」の方は「この言語の型検証システムはいいね!」ってこと。

■何をバカな。

本気だよ。

■え、マジ?

これらの言葉に厳密な意味なんかないから使わない方がいいよ。Wikipediaには「強い型付け」の意味が11個*2も載っているし、それらの中にはお互いに矛盾しているものもある。ある2人がプログラミング言語の話をしている時に「強い型付け」と「弱い型付け」という言葉を使ったとしたら、そういうときはいつだって、お互いが想定している意味は多かれ少なかれ違っているに決まってて、だから会話は自動的にかみ合わないものになるんだ。

■いや、そうは言っても「気に入る」「気に入らない」のレベルよりはましでしょう。

そうだね、ちょっと盛ったかも。言いなおそうか。比較的強い型付けの言語には、比較的弱い型付けの言語にはないような型システム上の制約がある。これ以上のことは話の文脈がはっきりしない限り何も言えないよ。

■じゃあどうすれば、言語と型システムの話をまともにできるっていうの?

足りない文脈を埋めればいいんだ。「強い型付け」や「弱い型付け」を使わずに、想定している制約についてちゃんと説明すればいい。たとえば、C#ほとんどは静的に型が決まる言語だ。これはコンパイラがすべての式の型について事実を決定しているからだ。C#ほとんどは型安全な言語だともいえる。これは、ある静的な型の値を、互換性のない(とか同様の型エラーが起きるような)型の変数に格納できないからだ。そしてC#ほとんどはメモリ安全性のある言語だ。これは不正なメモリにうっかりアクセスできないようになっているからだ。

だから、「強い型付け」のことを「通常のプログラムのほとんどの場所で、静的型付けや型安全性やメモリ安全性を促進する言語」という意味にとっている人はC#のことを「強い型付け」に分類するだろう。確かに、型システムにこれらの制約を持たない言語よりは、C#は比較的強い型付けの言語だ。

でも注意点がある。C#実用主義の言語だから、これら3つのセーフティネットを回避する方法が存在する。キャスト演算子C# 4の"dynamic"はコンパイル時の型チェックを回避して実行時の型チェックに変えてしまう。"unsafe"ブロックは、型安全性やメモリ安全性をオフにしてしまうことができる。「強い型付け」のことを「どんな状況でも静的型付けや型安全性やメモリ安全性が完全に保障される言語」という意味にとっている人にしてみれば、C#を「弱い型付け」に分類してもおかしくないだろうね。C#はそれらの制約をいつでも強制するほど強く型付けされた言語ではないので。

で、どっちだと思う?強い?それとも弱い?これは話者の視点に依存するから何とも言えないんだよ。何と比べているかにもよるし、各種の言語機能についてどういう風に考えているかにもよる。だから、これらの単語は単に使わないでおいて、型システムの機能についてもっと正確に話をするのがベストだよ。

*1:訳注:質問者の「強い型付けと弱い型付けのどっち?」という意味のorを、わざと論理和のorと捉えて返事している。

*2:訳注:映画「スパイナル・タップ」の、「ボリュームの目盛りが11まであるアンプ」に引っ掛けた冗談。