- PR -

特集「私がJavaからC#に乗り換えた10の理由」について

投稿者投稿内容
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-07-09 17:46
こんにちは。

起動時間や、キーを押しっぱなしにした場合の応答は、かなり C# のパフォーマンスがいいです。Java は1.4.1以降、大幅に GC が改良されましたが、それでもキーを押しっぱなしにすると、大量のイベント関連のオブジェクトが GC に負荷をかけるようです。struct の恩恵と言えるのかもしれませんが、ソースには表さずに VM で改善する方が望ましいので Java に期待しています。ただ現時点では C# の方が起動がはやいので、そちらをメインに使おうと思っていますが・・・

開発効率の点では、Java のような catch 節を強制する例外がないので、コードが単純になりました(堅牢性は落ちているのかもしれませんが・・・)

ただ、Microsoft 独自の設計には、まずさが目立ちます。struct と class における = の混乱は前に述べました。そして、Graphics#DrawImage() に顕著だったのですが、意味のないオーバーロードが多すぎます。( DrawImage(Rectangle) と同じ動作をする DrawImage(int, int, int, int) とか用意する)Rectangle は struct なのだから、生成コストはほとんどゼロのはずで、オーバーロードはいらないはずです。また、Java にはない DrawImage() の部分矩形描画バージョンは、おそくて使い物になりません。将来は高速化されるのかもしれませんが、現時点では遅いのだから、ないほうが単純だと思います。また、DateTime.Now.Ticks は 100ns 単位なのに、Thread.Sleep() は 1ms 単位で、型も異なります。Java では、両方 1ms 単位で、型は long です。


[ メッセージ編集済み 編集者: ocean 編集日時 2003-07-10 10:02 ]
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-07-09 18:21
このページがなかなか参考になります。



[ メッセージ編集済み 編集者: ocean 編集日時 2003-07-09 18:28 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-07-09 19:20
どうも、Wataです。
引用:

autumnさんの書き込み (2003-07-09 14:59) より:
 まず、例外クラスは.NET Frameworkクラスライブラリに含まれるものであって、C#に含まれるものではありません。ご注意下さい。
 私自身は、.NET Frameworkクラスライブラリのプロフェッショナルというわけではないので、確実な断言はできませんが。(かといってC#のプロフェッショナルでもないですが)
 JavaのRuntimeExceptionに対応する概念は.NET Frameworkクラスライブラリには存在しないと思います。私自身、Javaは詳しくありませんが、もし、RuntimeExceptionがthrows節に記述する必要があるかどうか判断する機能を持っているとするなら、throws節に該当する機能の無いC#では構文上意味を持たない概念かもしれません。


レスありがとうございます。やはりC#には検査例外の機能はないようですね。
確かに、プログラムに登場するほとんどの例外は、クライアントにハンドリングを強要しない例外であるべきですが、IO例外やjavaでのSQLExceptionなどはやはり確実にチェックされるべきだと思います。
C#が他の機能を貪欲に取り込んでおきながら、検査例外を省略した理由はなぜでしょうね。
実装効率?.NET Frameworkの実装上の問題?まさか実行効率?
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-07-09 20:33
記事を読まさせていただきました。個人的には「それほど大げさかな?」とは思いましたが...

私はJava言語は好きでも嫌いでもありません(仕事では良く使います)が、Java信者は嫌いです。
Java普及の一つに、書き方の手本的な側面があるような気がします(デザインパターンやUMLといった研究もそのひとつかな)。これは、コーディングの生産性を底上げするのに効果的だと思います。
私は、その利点を理解しつつも「余計なおせっかい」に感じてしまうので、そこのところがいまいちJavaを好意的に見れない原因かもしれません。

#デザインパターンなどがC#に適用しないという意味ではありません。念のため。

元々はC++使いです。C#は、構文がC++に似ているということがよく言われていますが、私はそれよりも「思想」がC++に似ているという点で、スムーズに入っていくことが出来ました。

以下の記事はC++の例外処理についての記事です。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep02172000.asp

(蛇足ですが、まだC++を使う人は、この連載を隅々まで読むことをお勧めします。大変貴重な解説です)

この記事の「C++ の精神」という項で仮説を述べていますが、C#に同じような思想を感じます。つまるところそれは、「プログラマを信じろ」というものなのですが、プログラマにもレベルがあるわけで、ダメな人が自由度の高い言語でコードを書くとダメプログラムが出来るのは真実です。が、だからといってあれやこれやで縛られるのも嫌だと感じる人種もいるということです。

C#はC++ではあまりに危険なコードが書けてしまう点を改善しています。そして、オブジェクト指向を軽視している(言語は道具でしかない)ところも良いなと思います。

そういう意味で今回の記事は C# と Java を比較している人たちには面白い読み物になったとは思いますが、深さが足りなくて残念です。機会があるなら、Javaと比較するのはやめて、C#だけで利点・欠点を解説出来る記事があると良いと思います。

#それでは記事として集客できないかな? (^^;
#あるいはすでにあるか (^^;;
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-09 22:30
引用:
andyさんの書き込み (2003-07-09 09:33) より:
まさに言語議論(趣向)って、理論と感覚、理想と現実が融合したところが
あると思うんです。(だから白熱しちゃう)



明らかに誤解を受ける書き方をしているような気もしないではないので仕方はないのですが、私の書き込みの意図は言語議論にはありません。

私が指摘したかったのは、
おじま氏の記事は事実に基づいて書かれていないし、センスも悪い
ということです。

私自身はどちらかといえばJavaよりの立場ですが、.Netでの開発にも多くの利点があると思っています。特に現状の開発環境で比較すれば.Netが圧勝するでしょう。言語仕様という面で見ればJavaとたいして変わることのないC#を比較したところで、開発環境やプラットフォームの違いによる生産性や実行速度の差の方がよほど大きいと思います。delegateやstructの例も別にJavaが優れていることを主張したわけではなくて、C#の方が優れているという主張には根拠がないと言っているだけのことです。

書き込みを読んでいるとおじま氏本人が誠実な人であるのは疑いありませんが、記事の内容は欠陥だらけです。

・挙げられているJavaの欠点は別に欠点ではない(欠点は他にある。例えば、スレッド)
・挙げられているC#の利点は別に利点ではない(利点は他にある。例えば、コンポーネント指向やvirtual)
・言語仕様だけを持ち出して「開発効率」や「実行速度」を問題とするなんてセンスが悪すぎる

# 今、巷で.Netでの開発は生産性が高いといわれているのはC#の言語仕様によるもの
# ではないですよね? それとも私が知らないだけか?

引用:
objectさんの書き込みより:
「delegate」は、C#では「イベント」という、言語としての実体、基本要素を定義しているんです!
Javaの場合、「無名Inner Class」は言語に対してどんな位置付けになるのでしょうか?
言語に於いては、一部だけを取り出して比較しても、殆ど意味が無い場合があると思います。



すみません、誤爆だったようです
> C#で「イベント」という、言語としての実体、基本要素を定義しているんです
というのには、同意します(というより、これこそがJavaに対するC#の数少ない優れた点のひとつだと思います)。
ただ、それを言うのに「delegate」を持ち出すのは適切ではないのではないですか。別に無名Inner Classでも、
コード:
public class EventTest {

public event ActionListener action;

public void Main(String[] Args) {
EventTest et = new EventTest();

et.action += new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//ここに処理を書く
}
};
}
}


と、書けばいいだけでdelegateである必然性はないでしょう。delegateは「関数ポインタ」に類する概念を導入する必要があり、オブジェクトの管理とは別にメソッドの参照管理が必要になるという欠点があります。結果的に、おじまさんのお好きな「速度の低下」がC#にもたらされる可能性がありますし、たったイベントひとつのためにオブジェクト指向とは馴染まない新たな概念を持ち込むことにもなります。

引用:
andyさんの書き込み (2003-07-09 14:10) より:
それよりもMS的には
「私がBasicからC#に乗り換えた10の理由」っていう記事が
きっとほしいはず!



Sunも対抗して「私は如何にしてハンドアセンブルするのを止めJavaバイトコードをいじるようになったか」という記事を出してくれ……るわけないか

[ メッセージ編集済み 編集者: 英-Ran 編集日時 2003-07-09 22:39 ]
andy
会議室デビュー日: 2002/11/22
投稿数: 13
投稿日時: 2003-07-10 01:02
もう英-Ranさん、挑発してるでしょ!

引用:

英-Ranさんの書き込み (2003-07-09 22:30) より:

私が指摘したかったのは、
おじま氏の記事は事実に基づいて書かれていないし、センスも悪い
ということです。



これってモロ論理的な記述と感覚的な記述の組み合わせですよね(^^)
(わざと書いていらっしゃるんでしょうから、これ以上コメントしません)

引用:

英-Ranさんの書き込み (2003-07-09 22:30) より:

# 今、巷で.Netでの開発は生産性が高いといわれているのはC#の言語仕様によるもの
# ではないですよね? それとも私が知らないだけか?



私も同感です。
(正確にはC#の言語仕様によるもの <だけ> ではない)

引用:

英-Ranさんの書き込み (2003-07-09 22:30) より:

・言語仕様だけを持ち出して「開発効率」や「実行速度」を問題とするなんてセンスが悪すぎる




でもおじまさんも理由の9番目で少し述べているので
(英-Ranさんの基準では圧倒的に足りないかもしれませんが)
言語仕様だけを持ち出して と言い切るのはちょっと可哀相な
気がするんですが...

英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-10 08:59
引用:

andyさんの書き込み (2003-07-10 01:02) より:
もう英-Ranさん、挑発してるでしょ!

これってモロ論理的な記述と感覚的な記述の組み合わせですよね(^^)
(わざと書いていらっしゃるんでしょうから、これ以上コメントしません)



挑発してるわけじゃなくて地です

単にもういい加減、具体的記述や論点のずれたJavaとC#の比較記事にうんざりしているだけのことです。無視すればいいだけのこととは思いますが、いつまで経っても誤解だらけの記事や掲示板での書き込みを読まされる。

C#が巷で実際に運用されるようになってからしばらく経ちましたし、Javaもむしろ枯れた年代に入りつつあるわけですから、もうそろそろ的確で「なるほどC#にはこんな利点があったのか」と思わせる記事を期待したいのです。

# 私が@ITに過剰な期待を抱きすぎてるだけかもしれないけれど

引用:

でもおじまさんも理由の9番目で少し述べているので
(英-Ranさんの基準では圧倒的に足りないかもしれませんが)
言語仕様だけを持ち出して と言い切るのはちょっと可哀相な
気がするんですが...



たしかにキーボードが滑りすぎましたね。あの十番目の理由のせいで九番目の理由が記憶からすっとんでいたようです。でも、あれだけではあまりにも不十分ではありませんか(だってsetupが楽だからというだけの理由しか書いてませんよ)。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-07-10 10:09
WisdomSoftというページも、C#とJavaの言語特徴を詳しく説明していて、参考になりました。

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