- PR -

型の矛盾

投稿者投稿内容
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-04-27 16:44
objectです。

「件名:VB2005の言語仕様の落とし穴について(ソース付き)」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38029&forum=7&26
で既に問題として浮上しているのですが、
「問題のレベルが、かなり深刻」
だと、私は考え、別スレッドにしました。

「.NET」上のCTSに於いて、
コード:

C#:
char ≡ System.Char
string ≡ System.String
char ≠ String

VB:
Char ≡ System.Char
String ≡ System.String
Char = String



つまり、「.NET」上で
コード:

(System.Char ≠ System.String) and (System.Char = System.String)


という事態が生じていると思います。

これは、許される事項なのでしょうか?

皆さんは、どう思われますか?
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-04-27 17:22
こんにちは。

ちょっと実験してみました。

元ソース
コード:

Dim s1 As String = "a"c
Dim c1 As Char = "b"
Dim c2 As Char = "xyz"
Dim c3 As Char = s1
Dim s2 As String = c1



コンパイル後、逆アセンブルしたソース
コード:

Dim s1 As String = "a"
Dim c1 As Char = "b"c
Dim c2 As Char = "x"c
Dim c3 As Char = CharType.FromString(s1)
Dim s2 As String = StringType.FromChar(c1)




引用:

objectさんの書き込み (2007-04-27 16:44) より:
つまり、「.NET」上で
コード:


(System.Char ≠ System.String) and (System.Char = System.String)


という事態が生じていると思います。

これは、許される事項なのでしょうか?



VB.NETの文法上、区別されていないように見えるだけで
コンパイラはちゃんとSystem.CharとSystem.Stringの型の違いを区別していると思いますけれども…?


※ソースを修正


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2007-04-27 17:29 ]
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2007-04-27 17:31
元スレも読んだ上で。

引用:

「問題のレベルが、かなり深刻」
だと、私は考え、別スレッドにしました。



Tdnr_Symさんも書かれていますが、
結局の所最終的には.NET Frameworkを使ってる訳ですから
コンパイラはきちんと解釈しますよ。

要するに何を問題にしたいんですか?

(1)VB.Netで書いた時にコンパイラがエラーを出さないのは問題だ
(2)こんな書き方を許してしまうVB.Netが問題だ
(3)書き方を意識しないで書く人間が問題だ
(4)暗黙の型変換をしてしまう言語仕様が問題だ((2)と似てる話ですが)

この中のどれを問題として提起したいんですか?

私から言わせてもらえれば。
そういった事を意識しないで
頭の中でロジックやメモリを意識せずに
インテリセンスに任せている人間が悪い
の一言で終わる話なんですが。

[ メッセージ編集済み 編集者: NAO 編集日時 2007-04-27 17:32 ]
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-04-27 17:45
objectです。

>Tdnr_Symさん
>NAOさん

一応私も処理系の動作は確認して書いています。

>VB.NETの文法上、区別されていないように見えるだけで
>コンパイラはちゃんとSystem.CharとSystem.Stringの型の違いを区別していると思いますけれども…?
少し表現を変えれば、
「System.CharとSystem.Stringと、型の違うものに対して、VB.NETの文法上、同じものの様に動く事」
の問題を言っている訳です。

それから「VB.NETの文法上」というのは、とても大きい訳です。
プログラマは、
「VBの書式としてしか表現出来ない」
訳ですから。
#型とそれに対する言語の動作が違うのはとても大きな問題ではないでしょうか?

「件名:VB2005の言語仕様の落とし穴について(ソース付き)」
に於いても、最終的に致命的なのは、この問題だと思います。

勿論、VBが考えている趣旨は理解しているつもりですが、
このスレ自体は、
この問題を一度、皆さんそれぞれに考えて欲しいという意味で起こしました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-27 18:40
引用:

objectさんの書き込み (2007-04-27 17:45) より:

「件名:VB2005の言語仕様の落とし穴について(ソース付き)」
に於いても、最終的に致命的なのは、この問題だと思います。


例としてあがったソースでは、ですよね。

あの問題は、インデクサ (デフォルト プロパティ) の戻り値が
System.String であっても "意図しない実装' としては発生しうるものです。

というより、あのスレッドではそちらを問題視していたのであって、
今回 object 氏が問題にしているものとは別だと思います。
(あのソースでは '誤り' に気付かない原因になっているだけで)

object 氏が挙げているのは 「型が主役であるハズの .NET CLR でこれを許すのか?」 ですよね。
しかし、MSIL を見てわかるとおり、その前の段階の問題ですね。

ですので、

引用:

つまり、「.NET」上で

(System.Char ≠ System.String) and (System.Char = System.String)

という事態が生じていると思います。


この言い回しには御幣があると思います。

# あ、Tdnr_Sym さんがすでに書かれていますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-04-27 18:49
うまぁく問題をすり替えていますが、
VBはもともと開発のプロではない人向けです。言語仕様の細かい所は気にせず、手軽に作れることを目標にした開発“環境”です(IDEとしてはじめて意味があり、言語単独では成り立たない)。

よく、「プログラムは、思った通りには動かない。書いた通りに動く」といいますが、VBに関しては、思った通りに動くことが目標です。だからデザイナを含めたIDEとしてでないと成り立たない。

思った通りに動くように、あれこれ手を尽くしてくれる。
仕様上、問題ありません。
_________________
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-04-27 21:54
いつもどおりの展開。学習したら?
でも。それがobject(reject)思考クォリティ。
ゴングラッチェ
常連さん
会議室デビュー日: 2006/03/03
投稿数: 36
投稿日時: 2007-04-27 21:56
Jittaさんと同じに考えてます。
私の場合こうも思います。

C#やVBは、.NET上で動作する実行モジュールを作るための手段であって
.NETそのものではない。それぞれに言語仕様上の特徴があるから指摘され
た事例も発生する。
その事例が問題であるかどうか。それは問題ではない。各言語が.NET上で
動作する実行モジュールを構築するかは、各言語の言語仕様に基づくもの
であるのだから。

引用:

objectさんの書き込み (2007-04-27 16:44) より:
つまり、「.NET」上で
コード:
--------------------------------------------------------------------------------


(System.Char ≠ System.String) and (System.Char = System.String)

--------------------------------------------------------------------------------


という事態が生じていると思います。

これは、許される事項なのでしょうか?



というのは、C#とVBの言語仕様が異なるだけのことで、全く問題ありません。
問題なのは、C#とVBが.NETフレームワークを扱う言語であるからといって、
System.Char、System.Stringという定義が「同一であると思い込む」ことだ
と思うのです。
C#にとってのSystem.Char、System.Stringが存在し、
VBにとってのSystem.Char、System.Stringが存在する。
メイクし実行モジュールとなったことによって、初めて共通のSystem.Char、
System.Stringとなる。

暗黙的な型変換を嫌うのはわかりますが、暗黙的な型変換は言語仕様として
特徴といえるものです。暗黙的な型変換を許容する言語仕様は、相互の対応
付けが言語仕様としてなされているという点において、それを許容しない
言語仕様よりも進んだ言語仕様という見方ができます。
※VBの方が優れているということを言っているわけではありません。
 VBの言語仕様に目くじらを立てるのはナンセンスだと思うのです。

VBは元々インタプリタ言語。CやJavaのようなコンパイラ言語とは根本的な
言語仕様が異なります。
言語仕様の落とし穴というよりも、言語仕様の混同がそもそもの原因であり、
混乱を招いただけなのではないかと思います。

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