- - PR -
intは何でできてるの?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-05-24 14:25
もしや
という部分から、System.Int32の定義の中でintを使っても問題ないという意味を読みとれ、とおっしゃるのですか? それは、相当つらい注文のような気が。 私の解釈では、C#言語仕様の日本語訳の
という説明は実は実は誤訳だというものです。 この文章の下の表を見ると日本語訳では「予約語」と「エイリアスの元になっている型」という見出しが付いていますが、原文を見ると、「Reserved word」と「Aliased type」です。つまり、後者は、エイリアスの元になっている方ではなく、エイリアスされたタイプではないかと思います。 ですので、intがSystem.Int32の別名なのではなく、System.Int32がintの別名なのではないかと。 すると、System.Int32が定義されていない状況で、intを使うことは正当になります。 もちろん、System.Int32の定義の中で、intを使っても循環参照にはなりません。もっとも、System.Int32を、intと違う機能に実装してしまうと、C#言語仕様に反してしまいますが。 ちなみに、これはC#の文法上の問題で、CLRは関係ありません。CLRベースで考えれば問題ないコードが生成可能なのは明らかです。 | ||||||||
|
投稿日時: 2002-05-24 14:51
すみません、議論がかみ合っていませんので、まずCLRベースで明らかであるにもかかわらず、C#の文法上は明らかでない理由を説明していただけませんか? | ||||||||
|
投稿日時: 2002-05-24 16:00
この話は、int32.csが循環参照になっているのではないか?という疑問に対するものです。この疑問が出た理由は、intはSystem.Int32のエイリアスだとC#言語仕様に書いてあるためです。
CLRのレベルだと組み込み型のint32の変数を宣言するだけでは、System.Int32構造体を参照するわけではないので、問題は出ないと思います。 データ型としての意味は等価でも、構文上の制約は、各言語が独自に課すことはあり得る話です。 | ||||||||
|
投稿日時: 2002-05-24 17:26
ありがとうございます。
私の主張も明確にしなければなりませんね。私の主張の根本にあるものは、 「C#には型システムがない。あるのは共通型システム(CTS)であり、これはC#ではなくCLRの範疇に属する。C#には文法はあるが型システムはない。」 です。 構造体の定義方法というのは型システム仕様の問題ですから、C#レベルの話ではなく、CLRの(CTSの)レベルの話であると考えます。 さて、構造体はCTSでは値型です。一般に値型の循環参照がコンパイルできないのは、CLRが値型を利用時に即時確保するためです。即時確保するためにはサイズがわからなければなりません。循環参照するとサイズが不定になります。 ですが、System.Int32(C#においてはint)は値型の中に定義できます。理由は、CLR(それゆえC#コンパイラも)がSystem.Int32のサイズを知っているからです。つまり、これは値型としては特殊な扱いを受けています。 構造体の循環参照というのはC#の構文上の制約ではありません。C#がCTSを型システムとして採用した結果です。ですから、 >データ型としての意味は等価でも、構文上の制約は、各言語が独自に課すことはあり得る話です。 という話は、ことこの議論に限ってはあたりません。 | ||||||||
|
投稿日時: 2002-05-24 18:01
この議論は続けると面白そうですが、ここで終わりにします。
(仕事しなきゃ、遅れてしまう〜〜〜) とりあえず、私は循環参照は起きていないという解釈ですので、どのレベルで解釈しても矛盾は起きていないと思います。 特にCTSに矛盾する主張をC#言語仕様は述べておらず、一見矛盾があるかのように見えるのは、日本語訳の問題と解釈します。 | ||||||||
|
投稿日時: 2002-05-24 18:37
autumnさん、NothingBut.NETFXさん、ありがとうございます。
ひとつ、確認させて下さい。 System name spaceにもしも、Int32というタイプが存在しなかったら、このような場合であっても、C#のプログラムは依然として、 int i; i = 0; のようなコードをコンパイル、実行できるのでしょうか? #autumnさん、お仕事、頑張って下さい | ||||||||
|
投稿日時: 2002-05-24 18:57
たぶん、できると思います。
ただ、世の中に存在するすべてのC#コンパイラができるかどうかは分かりません。 intというキーワードを見た瞬間に、System.Int32を調べに行くような実装が無いとも言いきれないので。 | ||||||||
|
投稿日時: 2002-05-24 19:41
少し見ない間に、話が大変進んじゃいましたね。
結局「エイリアス」という言葉がいけないと、私も思います。 私は、「System.Int32」を実装しているC#と「.NET FrameWork」上のC#を同じレベルで扱うべきではないと思います。 C#に於いて、「int」は実質的に構造体「System.Int32」として機能しているという事だと思います。 「int」は、所謂「integer」として、したがって演算も、メソッド呼び出しでなく、C#によって直接演算処理に展開されているという事だと思います。 当然、「integer」を越える機能に関しては、メソッド呼び出しがあるんだろうと思いますが…。 だから、C#のユーザーとしては、「int」はC系の「int」として扱って良いと私は思います。 (ただC#が簡単に「object」に対する変換をサポートしてくれてる) 要約すると 1)「System.Int32」に対するC#の内部処理として「int」が使われている。 2)そのサポートはC#の処理系が負っている。 (C#の処理系と言っても結局「CLR」になると思いますが。) だから、C#によって、「int」が「System.Int32」にC#の機能として「マッピング」されると考えた方が良いのではないでしょうか? |