- PR -

intは何でできてるの?

投稿者投稿内容
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-24 14:25
 もしや
引用:

Predefined value types such as int are treated specially in a few ways but are for the most part treated exactly like other structs.


 という部分から、System.Int32の定義の中でintを使っても問題ないという意味を読みとれ、とおっしゃるのですか?
 それは、相当つらい注文のような気が。
 私の解釈では、C#言語仕様の日本語訳の
引用:

単純型は予約語を使って示されますが、これらの予約語は、System 名前空間で定義済みの構造体型に対するエイリアスでしかありません。


 という説明は実は実は誤訳だというものです。
 この文章の下の表を見ると日本語訳では「予約語」と「エイリアスの元になっている型」という見出しが付いていますが、原文を見ると、「Reserved word」と「Aliased type」です。つまり、後者は、エイリアスの元になっている方ではなく、エイリアスされたタイプではないかと思います。
 ですので、intがSystem.Int32の別名なのではなく、System.Int32がintの別名なのではないかと。
 すると、System.Int32が定義されていない状況で、intを使うことは正当になります。
 もちろん、System.Int32の定義の中で、intを使っても循環参照にはなりません。もっとも、System.Int32を、intと違う機能に実装してしまうと、C#言語仕様に反してしまいますが。

 ちなみに、これはC#の文法上の問題で、CLRは関係ありません。CLRベースで考えれば問題ないコードが生成可能なのは明らかです。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-05-24 14:51
引用:

autumnさんの書き込み (2002-05-24 14:25) より:
ちなみに、これはC#の文法上の問題で、CLRは関係ありません。CLRベースで考えれば問題ないコードが生成可能なのは明らかです。



すみません、議論がかみ合っていませんので、まずCLRベースで明らかであるにもかかわらず、C#の文法上は明らかでない理由を説明していただけませんか?
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-24 16:00
 この話は、int32.csが循環参照になっているのではないか?という疑問に対するものです。この疑問が出た理由は、intはSystem.Int32のエイリアスだとC#言語仕様に書いてあるためです。
 CLRのレベルだと組み込み型のint32の変数を宣言するだけでは、System.Int32構造体を参照するわけではないので、問題は出ないと思います。
 データ型としての意味は等価でも、構文上の制約は、各言語が独自に課すことはあり得る話です。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 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を型システムとして採用した結果です。ですから、

>データ型としての意味は等価でも、構文上の制約は、各言語が独自に課すことはあり得る話です。

という話は、ことこの議論に限ってはあたりません。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-24 18:01
 この議論は続けると面白そうですが、ここで終わりにします。
 (仕事しなきゃ、遅れてしまう〜〜〜)
 とりあえず、私は循環参照は起きていないという解釈ですので、どのレベルで解釈しても矛盾は起きていないと思います。
 特にCTSに矛盾する主張をC#言語仕様は述べておらず、一見矛盾があるかのように見えるのは、日本語訳の問題と解釈します。
Muse
常連さん
会議室デビュー日: 2002/03/08
投稿数: 34
投稿日時: 2002-05-24 18:37
autumnさん、NothingBut.NETFXさん、ありがとうございます。
ひとつ、確認させて下さい。
System name spaceにもしも、Int32というタイプが存在しなかったら、このような場合であっても、C#のプログラムは依然として、

int i;
i = 0;

のようなコードをコンパイル、実行できるのでしょうか?

#autumnさん、お仕事、頑張って下さい
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-24 18:57
 たぶん、できると思います。
 ただ、世の中に存在するすべてのC#コンパイラができるかどうかは分かりません。
 intというキーワードを見た瞬間に、System.Int32を調べに行くような実装が無いとも言いきれないので。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 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#の機能として「マッピング」されると考えた方が良いのではないでしょうか?

スキルアップ/キャリアアップ(JOB@IT)