web-dev-qa-db-ja.com

C#およびJava言語の半分であること)に関するこのステートメントはどういう意味ですか?

記事: Why POCO 、この文があります:

Maciej Sobczakはそれをうまく表現しています:「誰かが私に言語の半分を与えて、それが私自身の保護のためであると私に言ったとき、私はただ好きではありません。」.

C#はMicrosoftが所有JavaはOracleが所有 であっても、彼の意味がわかりません。言語の半分を保持しているという意味ではありません。それ?私はその文を証明する証拠を見つけられなかった、そして私はこれについて本当に興味がある。そして、「私自身の保護のため」の部分についてさらに興味があります。

32
123iamking

Sobczakは企業の所有権について話していません。彼が欠けている「半分」の言語は、教育を受けたコンピューターの専門家として知っているにもかかわらず、多くの現代の言語ではできないことです可能性がある可能になる:継承あなたが好きなだけ多くのクラス。タイプの制約なしで、オブジェクトを他のオブジェクトに割り当てます。コンパイラーとランタイムが信頼できる代わりに、割り当てとリソースの解放を手動で制御します。

問題は、これらすべての制限が理由のためにプログラミング言語に適用されたことです。私たちdidには、このすべてを可能にする言語があります。時間が経つにつれ、平均的なプログラマーはある程度の制限と手に負えたほうがよいことがわかりました。なぜなら、本当に悪いエラーを起こす可能性は、追加の力と表現力に見合うには大きすぎるからです。

(明らかに、これはそれほど多くの手持ちを必要としないプログラマーを時々悩ませます。彼らの不満は時々合法です。しかし、人々は悪名高く自分のスキルを評価するのが得意ではなく、多くの人がそうではないと考えていますセーフガードが実際に必要なのです。高水準言語での制限に阻まれていると感じる実際の優れた知性と、不平を言うだけで優れた見た目になると考える平均的なプログラマーを区別するのは必ずしも簡単ではありません。 、または何もよく知らない人。)

162
Kilian Foth

これは 引用の元のソース で非常にうまく説明されています:

私はC++についてさらに学ぶことを決心し、その忠実な情熱になりました-これには、この言語が進化する可能性が高い方法への私の興味が含まれています。さらに、実際のアプリケーションではなく、有用なライブラリを開発するには、最もハイエンドで最先端の手法が必要であることに気付きました。 。これを念頭に置いて、私はさまざまな目的で自分のライブラリをいくつか作成しようとしました(私のダウンロードページを参照)。また、C++ Boost開発者の肩越し(私のリンクページを参照)を調べて、それらの内容を理解しようとしています。ハイエンドのテクニックです。汎用的であると同時に役立つライブラリの開発に時間を費やすことは、本当に大変です。だからこそ、プログラマーは決して学習を止めません。

[…]

私はC++と、堅牢なソフトウェアを作成するための手法をいじっています。信頼性の高いソフトウェアの分野でより広い視野を得るために、Ada(および関連するもの)の学習に時間を費やすことにしました。システム。エイダを学ぶことは、自分の仕事や開発アプローチをより新鮮に見ることができるという意味で、私にとって本当に有益だったことを認めなければなりません。最も重要なのは、Adaの世界からのアイデアのいくつかは、多かれ少なかれ直接C++に適用でき、堅牢性と正確性の分野で優れた結果をもたらすことです。

[…]

はい、忘れました。私はある日Javaを学ばないことを誓った。しかし、私はやりました。まあ、私が作業コードを読み書きできる範囲で。 「Thinking in Java」(オンラインで利用可能、無料)と「Core Java」(オンラインではなく、無料ではありません)を読みましたが、一部のJava開発に間接的に関わっていました。 ..まあ、私はそれを購入しません。誰かが私に言語の半分をくれて、それが私の自分の保護具です。紙のハンマーのように軽くして、指を打ったときに怪我をしないようにしています。C#の場合も同じです。鋼のスレッジハンマーを選んだので、遊びたいときはマッチョ、それに耐えます。
問題は、なぜこれほど多くの人々がJava(C#など)を使用するのかということです。うーん...場所によってはとても良いのかもしれません。しかし、言語とライブラリの両方が、すべてを実行するユーティリティになるためではなく、(最初は)アプレット用に設計されていることを示している状況もあります。それは、多くの技術を約束しすぎて、ほとんど与えません。または、あらゆる競争を乗り越えることができるソリューションとして。

最大のパワーと広い視野が必要な場合、私はC++が好きです。 C++の表現力が必須ではない場所では、TclやPythonのような言語は法案に適合しているようです。それらは進化に関してオープンであるだけでなく、拡張して特定のニーズに応じてそれらを埋め込みます。これらのテクノロジーには多くの可能性が見られます。また、Cを通常のプログラミングの言語として放棄する傾向があります。これは、コード生成のターゲットとしてのみ妥当な選択のようですが、それ以外の場合もそうですエラーが発生しやすい今日、Adaは、私が自由に選択できる場合(残念ながら、ほとんどの場合そうではありません)、より深刻なプロジェクトの2番目に選択する可能性が高い選択肢となります。

つまり、言い換えると、その引用の作成者はC++が好きで、Javaは好きではなく、JavaにはC++の半分が欠けていると感じています。そして、それがすべてです。 。

34
Jörg W Mittag

あなたが投稿したブログにリンクされている記事は削除されたため、確信が持てませんが、キリアンが言うように、彼が「言語の半分」と言ったとき、C#とJavaがC++ですが、使いやすく、安全にするために多くの機能と構成が削除されています。

これが書かれた2006年、C#が比較的新しく、Javaが多くの点で未熟だったとき、そして電力と安全性のどちらかを選択することができるトレードオフのように思えたとき、これは取るのに全く不合理な立場。

最近では、その立場はまったく妥当ではありません。主流の言語について考えるだけで、C#とJavaは、他の言語(特に関数型)の機能を借用して非常に成熟し、安全なコードの作成を促進しています。 RustやSwiftのような言語もあり、これを行うためにゼロから構築されています。

誰かがあなたの手を握っているので言語を見下ろしたり、使いにくい言語がどういうわけか良いと言ったりしたら、私は彼らが言ったすべてを一粒の塩でとります。 「安全な」言語を使用することで簡単に回避できた、業界で最も明るい心で書かれた、私たちが毎日依存しているコードに見られる恥ずべき数のバグを調べれば、その理由がわかります。

23

archives を振り返ると、この引用は2003年のものであるように見えます(2006年のものであると引用されている記事にも関わらず)。当時、 C#はバージョン1。x であり、多くの モダン機能 が欠けていました。

新機能

C#2.0

  • ジェネリック
  • 部分型
  • 匿名メソッド
  • イテレータ
  • Null許容型
  • ゲッター/セッターの個別のアクセシビリティ
  • メソッドグループの変換(デリゲート)
  • デリゲートの共分散と逆分散
  • 静的クラス
  • 推論の委任

C#3.0

  • 暗黙的に型付けされたローカル変数
  • オブジェクトおよびコレクション初期化子
  • 自動実装プロパティ
  • 匿名型
  • 拡張メソッド
  • クエリ式
  • ラムダ式
  • 式の木
  • 部分的な方法

C#4.0

  • 動的バインディング
  • 名前付き引数とオプションの引数
  • 一般的な共分散と逆分散
  • 組み込み相互運用タイプ(「NoPIA」)

C#5.0

  • 非同期メソッド
  • 発信者情報属性

C#6.0

  • Compiler-as-a-service(Roslyn)
  • 名前空間への静的型メンバーのインポート
  • 例外フィルター
  • Catch/finallyブロックで待機する
  • 自動プロパティ初期化子
  • ゲッターのみのプロパティのデフォルト値
  • エクスプレッションボディのメンバー
  • ヌルプロパゲーター(ヌル条件演算子、簡潔なヌルチェック)
  • 文字列補間
  • nameofオペレーター
  • 辞書初期化子

C#7.0

  • アウト変数
  • パターンマッチング
  • タプル
  • 脱構築
  • ローカル関数
  • 桁区切り記号
  • バイナリリテラル
  • Refリターンとローカル
  • 一般化された非同期戻り型
  • 式ボディのコンストラクタとファイナライザ
  • 式ボディのゲッターとセッター

C#7.1

  • 非同期メイン
  • デフォルトのリテラル式
  • 推定されるタプル要素名

- "C Sharp" 、ウィキペディア(参照とリンクは削除されました)

今日のC#の多くに欠けていたため、C#はその文脈では半言語のように見えたほうが理解しやすいでしょう。 staticクラスさえなかったと考えるのは奇妙です!

C#は.NETに関連付けられているため、さらに多くのものが欠けていました。たとえば、 [〜#〜] wpf [〜#〜] は当時はありませんでした。すべてWinFormsでした。

12
Nat

彼はきめ細かな制御を可能にする言語機能の欠如に不満を言っていました。これらには、

  • 不変性の適用(C++ constキーワードなど)
  • オブジェクトの存続期間と所有権の制御
  • メモリ使用量、コピー、および割り当てスタイルの制御

これは、Javaに対する私の批判の1つを思い出させます。

すべてがポインタですが、ポインタは存在しません。

C++オブジェクトでは、ポインターと参照は明確なセマンティクスを持つ3つの異なる概念です。 Javaには、疑似オブジェクトポインタがあります。これらを統合し、真のポインタのセマンティクスを回避することにより、オブジェクトモデルは不明確になります。

明確に定義されたC++プログラムでは、プログラマーは参照が有効でnullでないことを期待できます。簡略化されたモデルのため、Javaは同じ保証を行うことができません。

このあまり明確でないモデルの症状には、 nullオブジェクトパターン5.equals(potentiallyNullIntegerReference)などのヨーダ条件が含まれます。

3
Wes Toleman

@Kilianの回答に同意しますが、いくつかの要素を追加します。

1-OSではなく仮想マシンに対して実行

JavaとC#は仮想マシンを介して実行されているため、OSで直接実行しているときは、希望どおりの操作を実行できないことが論理的に予想されます。 VM。さらにJavaはプラットフォームにとらわれないように方向付けられているため、さらに多くのロジックがあります。

2トンのアプリケーションでは、そのようなものを必要とする必要はありません。

多くの詳細を調べる必要のないアプリケーションがたくさんありますが、それを必要とする言語でそれを行うと、次のようになります。

  • これらの不必要なことにより、バグが発生するリスクが増加します。
  • より多くの開発コスト、メモリの管理とテストには時間と費用がかかります!

3-言語は、すべてのようないくつかの選択の重み付けコスト/使用量/リスクに基づいて作成されます。

C++を使用すると、やりたいことをほとんど行うことができます。それがC++の人々の選択です。ただし、その数が多いほど、より多くの処理が必要になります。

したがって、多重継承のようなものは、それらが危険であるという事実だけで放棄されるのではなく、それらを実装するとコスト(開発、保守)が発生するため、放棄されます。一般に、書き方が異なります。

1
Walfrat