C#の歴史を見ると、C#はCやC++のアップデートと見なされていたことがわかりました。これは私にとって少し驚きでした。表面的には、C#とJavaの間ではるかに一般的なアイデアが見られます(ガベージコレクションが思い浮かびます)。私はJavaでコードを書いていませんが、通常はJavaコードを理解するのに問題はなく、C#で簡単に転置できるJavaのパターンに関する本を日常的に読んでおり、C++については正直言って同じことは言えません。
だから私の質問は、C#はJavaよりもC++にどのように近いのかということです。これは単にJavaを認めることを拒否するだけですか、それとも私は何かを見逃したり誤解したりしていますか?
18 に答える
その名前は文字Cで始まります。
IMO、C#はJavaよりもC ++からインスピレーションを得ているという考えは、マーケティングのみです。Javaでは不可能だった方法で、頑固なC++プログラマーをマネージドワールドに持ち込もうとする試み。C#は主にJavaから派生しています。歴史、特にSunとMicrosoftの間の90年代半ばのJava VM戦争を見ると、Javaが主要な親であることがわかります。
C#の構文は、ポインター操作(Javaにはない)、派生宣言(つまり、public class Foo : Bar, IBaz
ではなくpublic class Foo extends Bar implements IBaz
)、および演算子のオーバーロードなど、特定の領域でのみC++に近くなっています。
他のすべては、Java(クラス宣言で宣言された静的メイン、ヘッダーファイルなし、単一継承、その他多数)、JavaとC ++(基本構文)の両方、または一意のC#(プロパティ、デリゲート、その他多数)のいずれかです。 。
C#は、JAVAのように単一のパラダイム(OOP)を強制するのではなく、マルチパラダイム言語であるという意味で私は思います。それはプログラマーにより多くの自由を与えるので、実際には良いことです。
歴史を覚えているなら、Microsoftは実際にJavaで「Embraceand Extend」方法論を使用しようとしましたが、Windowsでのみ機能するように追加され、「J++」と呼ばれていました。
Sunは彼らを訴えたので、彼らはJavaに非常に近いJ#を一時的なギャップとして出し、独自の言語(C#)を開発する時間を与えました。
その時点で、それは当時利用可能なすべての言語からの最高の概念の組み合わせでした-それが他のものよりも1つに基づいていたと言っても意味がありません、それは選択された機能の単なる集合体です。
しかし、ゼロから始めて、これまでの言語のすべての最高の機能を操作するというこのアイデアが好きな場合は、必ずScalaにチェックインしてください。大きな機能革命があっても、JavaやC#でできることをはるかに超えています。
C ++に触発された構文、Javaに触発されたVM、およびライブラリ(.net 1.1内)は、Delphiライブラリとほぼ1対1の相関関係がありました。
Java-> C#接続はC ++-> C#よりもはるかに強力だと思います。これは主に、指摘されているように、C#はMSVMのJava仕様違反の申し立てに対するSunの訴訟の結果であるためです。特に、Sunの主な不満の1つである、C#の主な特徴の1つとなった「デリゲート」のような追加のキーワード/機能のJ++の使用でした。
@dllや@comディレクティブ(JavaとC#の両方で事前設定された属性)のような他の関数も苦情の一部でした。C#のCOMPIAディレクティブとJ++の@comディレクティブの類似性に注意してください。J ++のJDirectをC#のネイティブ相互運用機能と比較します。(訴訟のもう1つの理由は、MSがJavaのJNIを完全に無効にしてWindows固有のJDirectを支持したという事実でした。)
最後に、AndersHejlsbergはJ++とC#の両方の責任者であるため、Java / J ++とC#の間の接続はかなり堅固です。間違いなく、HejlsbergはC ++マインドの多くの側面を持っていました(特に、彼が最初にJ ++でフロートしたメソッドポインター/デリゲート機能)が、Javaが最前線になければならなかったと言っても過言ではありません。
多くの点で、Microsoftの変更されたバージョンのJava、J ++をC#0.1として見ることができます。
手始めに、それは(安全でないブロックでの)ポインター操作を可能にします。
個人的には、C ++よりもJavaに近いと思いますが、メルティングポットにはいくつかの追加機能があります。
- デリゲート(おおよそ関数ポインタ)
- ユーザー定義の値型
ジェネリックは3つすべてで異なりますが、Javaの型消去ジェネリックはおそらく(奇妙な比較ですが)C#ランタイムベースのジェネリックよりもC++テンプレートに近いです。
さて、あなたはこれについて少し議論を始めると思います。
JavaもC++の一種のアップデート/進化だと思うので、これはもちろんある程度の類似性を説明するでしょう。真実はもちろん、C#はJavaとC ++の両方に触発され、両方の言語から概念を取り入れたということです。そしてもちろん、関数型プログラミングと動的計画法の分野では、C#に適応することがたくさんあります。
したがって、C#がC++よりもJavaに「近い」と言うのは間違っていると思います。それはある意味で両方に近いです。
あるインタビューで、C#がモデル化されている言語を尋ねたところ、すぐにC ++またはJava(C--)の方が優れていると答えました。インタビュアーは「間違った!」と言った、それはデルファイだ。デルファイを知らないので...
OOと継承の側面では、C#はC++に似ています。例えば:
class MyClass : MyInterface
それ以外の
class MyClass implements MyInterface
と
public MyClass() : base()
それ以外の
public MyClass() { super(); }
また、C#は仮想関数の概念を使用して、オーバーロードを許可します。Javaでは、継承とオーバーロードは、ロックダウンする必要のあるオープンな問題です。C ++およびC#では、デフォルトでよりロックダウンされており、開く必要があります。
その他の類似点は次のとおりです。
- 参照による通過
- 演算子のオーバーロード
- 関数ポインタ/デリゲート
それはマーケティングです。マイクロソフトは確かに「ねえ、私たちはJava 1.1を作っている!」と認めたくありませんでした。まず、Javaが実際にコピーする価値があることを認めるのと同じです。これは、Javaを打ち負かそうとしている場合は悪い動きです。
そして第二に、Javaの不器用さと初期のパフォーマンスの問題に怖がっていたすべてのネイティブC++開発者を怖がらせるでしょう。
つまり、彼らはC ++に基づいて構築しており、誰もが幸せだと言っています。
もちろん、実際には、真実から遠く離れることはできません。
C#とJavaに共通の祖先がある場合、それはC ++ではなく、「Cwithclasses」です。具体的には、C ++の非常に初期のバージョンであり、標準化されるずっと前、そして今日それを有用にするもののほとんどが追加される前のことです。
これは、いくつかのOOP機能をCにボルトで固定する試みにすぎませんでした。
それ以来、C ++は完全に異なる方向に進み、OOPの執着を手放し、コンパイル時のダックタイピングを使用してジェネリックプログラミングを作成することで、はるかに機能的なスタイルを模索しています。いくつかの信じられないほど強力でエレガントなライブラリが言語に追加されました。そのどれもJavaやC#ではまったく表現されていません。
C#は間違いなくJavaに触発されています。また、C ++に触発されている場合は、最新のC ++に似たものではなく、この初期の「Cwithclasses」バリアントに触発されています。
しかし、C ++は、多くの人から「クールな」言語と見なされていました。Microsoftは、その「クール」を利用して.NETに導入したいと考えていました。
個人的には、C ++、C#、Javaは兄弟だと思います。それらはすべて、同じ「Cwithclasses」祖語から派生しています。C#とJavaは、C ++よりも直接的なルートをたどりませんでしたが、それでも彼らのインスピレーションのほとんどはそこから生まれました。そこで彼らは、Alan Kay / Smalltalkが提案したものとは実質的に関係のないOOPの奇妙な概念を継承し、不器用なCのような構文を継承しました。
私たち人間は類人猿から進化したと言っているようなものです。そうではなかった。私たちには共通の祖先がいるだけで、その共通の祖先はやや類人猿のようでした。C#はC ++から派生したものではなく、わずかにC++に似た共通の祖先を持っているだけです。
私はおそらくこれに失敗するでしょうが、そうです、C#は概してMicrosoftのJavaに対する答えです。その言語は、選択した方法で拡張できます(承認されていない方法で拡張したことで非難されたJavaとは異なります)。これには、Javaの重要な機能であるメモリ管理と大規模なシステムライブラリがあります。まだJavaのファンではないC++およびC開発者を誘惑するために必要な限り、C++のようなものまたはCのようなものです。
1つの例は、文字列の比較演算子==です。C#はC ++アプローチを採用し、文字列に対して字句比較を行います。Javaは文字列参照を比較します。
これは、C#とJava、およびC#とC++の比較を紹介するMSDNの優れた記事です。
C#のフォームは、JavaのSwingと非常に密接に関連しています。C ++のGuiライブラリは、ほとんどの場合、まったく異なります。
FWIW:歴史的な観点から、以前のC#が登場したMSFTは、Windows固有の機能を利用できるようにするためのいくつかの拡張機能を備えたJavaの実装であるVisualJ++を宣伝していました。
Sun Microsystemsは、Javaでの目標は、どこでも実行できる書き込みであり、Visual J ++は、Windowsでのみ実行され、SunのUnix実装では実行されないアプリケーションになると訴えました。
Sunは法廷で勝訴し、MSFTはVisual J ++を市場から撤退させ、まもなく、撤回されたばかりのVisual J++言語と構文的および機能的にわずかに異なるVisualC#を発表しました。
3つはすべて近親者です。
その母親はsmalltalkでした。
各言語の父は誰ですか?
Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#
私は、C#をJavaの書き直しではなく、C++の管理されたバージョンと見なしています。そのような言語を作成する際に、それは自然にJavaの形を取りましたが(構文的に)、信じられないほど強力なC++の要素を保持しています。