C#とJavaが言語の半分であるというこの声明はどういう意味ですか?[閉まっている]


32

記事:Why POCOには、次の文があります。

Maciej Sobczak氏は、「誰かが私に言語の半分を教えてくれて、それが自分自身の保護のためだと言っているのが好きではない」と言います。

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


12
私は、プログラマーに自由にメモリを割り当てたり解放したり、そのような「保護」のようなことをさせることに対する批判として解釈しましたが、それが彼がしようとしていたポイントであったかどうかはわかりません。
カヤマン

15
彼が引用している記事は死んでいるように見えるので、私は正確にはわかりませんが、JavaとC#には、多重継承やテンプレートメタプログラミングなど、C ++の多くの「危険な」または物議を醸す機能が欠けていると言っているようです。
GoatInTheMachine

3
引用のコンテキストが欠落しているため(リンクは404です)、ここで得られる唯一のものは、おそらく彼が意味することを推測する人々、または(より可能性の高い)自分の意見を提示する人々です。実際にコンテキスト、つまり失われたページの内容を知りたい場合は、おそらく著者を直接書くか、ウェイバックマシンなどで失われたページを見つけてみることをお勧めします。
ジャックB

2
このステートメントは、たとえそれを処理できたとしても、言語でソフトウェア開発のあらゆる可能性を常に公開したいとは限らないという点で欠落しています。確かに、メモリ管理コードの読み取りに問題はないかもしれませんが、他の開発者はそのコードを維持することにあまり興奮していないかもしれません。 カプセル化の概念に似ています。また、C#を使用すると、コンパイラディレクティブ、特別な属性、リフレクションを介してかなり多くのものにアクセスできますが、それらを使用する必要はありません。
マークロジャース

32
あなた自身のために、言語が「本物」および「完全」と見なされるにはC ++のすべての機能を持たなければならないと考える人々には注意を払ってはいけません。型の安全性、メモリの安全性、明確に定義された動作が「トレーニングホイール」であると考える人々には注意を払ってください。正確性は、ほとんどの業界でソフトウェアの最も重要な側面になりつつあり、それを気にしないことに誇りを持つ人々はすぐに無関係になります。
セオドロスチャツィジアンナキス

回答:


162

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

問題は、これらの制限はすべて、何らかの理由でプログラミング言語に適用されたことです。我々はなかった、このすべてを許可の言語を持っています。時間が経つにつれて、平均的なプログラマーは、ある程度の制限と手持ちの方が良いことがわかりました。なぜなら、本当に悪いエラーを起こす可能性は、追加のパワーと表現力に値するには大きすぎるからです。

(もちろん、これは時々彼らの苦情が時々正当なもの。本当に多くの手で保持することを必要としないだろうプログラマーを悩ませる。しかし、人々は悪名高く、自分のスキルを評価する時、悪い、と彼らは安全策を必要としないと思う多くの人々はで、やります高レベル言語の制限に抵抗されていると感じている実際の優れた知性と、不平を言うと優れているように見える、または知らない平均的なコーダーを区別することは、必ずしも容易ではありません。より良い。)


67
これは私の後藤の答えです。
ニール

71
また、制限を必要としない優れた知性のようなものは存在しないと付け加えます。誰もが遅かれ早かれ台無しになると仮定することは常に安全です。そして、通常、知性が優れているほど、失策は大きくなります。
ニール

29
JavaとC#には、人々が足で自分自身を撃つことを単に防止する以上のことがあります。たとえば、メモリの管理には、ガベージコレクションが登場するまで開発者の多大な時間と労力が必要でした。また、手動のメモリ管理を正しく行うことは困難です。ガベージコレクションにより、プログラマの生産性が向上します。
ロバートハーヴェイ

12
@RobertHarvey私は100%同意します。長い間C ++プログラマーだった私は、C#に移行する際に自動メモリ管理に懐疑的でした。私がそれを乗り越えた後は、99%の時間を心配する必要がないだけで信じられないほど解放されました。代わりに、他の問題について考えるために私の頭脳を解放しました。
17年

8
「割り当てタイプの制約なしに、他の任意のオブジェクト。」...だから、dynamic
アルトゥーロトーレスサンチェス

34

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

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

[…]

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

[…]

忘れました ある日、Javaを学ばないと誓った。しかし、私はやりました。まあ、作業コードを読み書きできる範囲で。「Thinking in Java」(オンラインで利用可能、無料)と「Core Java」(オンラインではなく、無料ではありません)を読んだことがありますが、Java開発にも間接的に関与していました...そして、私は購入しませんそれ。誰かが私に言語の半分を教えてくれて、それが私自身の保護のためだと言ったとき、私はただ好きではありません。これはペーパーハンマーのようなもので、指を打ったときにだれも傷つけないように軽くしました。C#にも同じことが当てはまります。スチール製のスレッジハンマーを選択します。これにより、マッチョをプレイしたいときに耐えることができます。
問題は、なぜそれほど多くの人々がそれを使用するのか(Java、C#など)?うーん...多分それはいくつかの場所で非常に良いからです。しかし、言語とライブラリの両方が、それらがすべてをユーティリティにすることよりもむしろ(最初は)アプレット用に設計されていることを示す状況があります。約束しすぎであり、キャッチオールテクノロジーに関してはあまり多くはありません。または、あらゆる競争に打ち勝つことができるソリューションとして。

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

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


18
皮肉なことに、彼はC ++が好きな理由とまったく同じ理由でCを嫌っています。
GreySage

8
彼はC ++がPythonよりも表現力があると考えています
-benxyzzy

12
@GreySageそれも私の目を引いた... Cはエラーが発生しやすいですが、C#はあなたに十分な力を与えませんか?CはC ++から遠く離れていますか?C#には、より安全に制御できる「安全でない」コーナーはありませんか?確かな意見の興味深いミックス
...-WernerCD

10
@WernerCDは安全でないC#については実際に語ることはできませんが、CとC ++には共通点はほとんどありません。ただし、基本的なC90スニペットを、コンパイラがチョークしない有効なC ++風のスニペットに打つことができます。
クエンティン

23

投稿したブログにリンクされている記事は削除されているため、確実ではありませんが、Kilianが言うように、「言語の半分」と言うと、C#とJavaはC ++のように感じますが、使いやすく、または安全にするために、機能と構成が削除されました。

2006年、これが書かれたとき、C#が比較的若く、Javaが多くの点で未熟であり、パワーと安全性は1つしか選択できないトレードオフのように思われたとき、これは取るに足りない立場ではありませんでした。

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

誰かがあなたの手を握って言語を軽looksしている、または使用するのが難しい言語がなんとなく良いことだと言ったら、私は彼らが言ったことを一粒の塩で取ります。私たちが毎日依存しているコードで見つかった、業界で最も優秀な頭脳によって書かれた、「安全な」言語を使用することで簡単に避けられたはずの恥ずかしいバグを見れば、その理由がわかります。


6
最後の段落でのあなたの立場に同意します。C ++は「Fountain of Exploits」と呼ばれるべきです。
カレブマウアー

3
また、2番目の段落を補完するために、JavaとC#の両方は、既存のC / C ++開発者をより低い学習曲線の約束で誘引するなど、さまざまな理由でCおよびC ++構文を大幅に制限しました。成熟するにつれて、独自の機能を追加し、独自のフレーバーを持ちますが、初期の頃は、C ++の代替としてより直接的に位置付けられていたため、「C ++であるがそれほど強力ではない」と見なす方が簡単でした。
ハリソンペイン

12

アーカイブを振り返ってみると、この引用は2003年からのものであるように見えます(2006年から引用されているにもかかわらず)。当時、C#はバージョン1でした。xには、多くの最新機能が欠けていました

新機能

C#2.0

  • ジェネリック
  • 部分型
  • 匿名メソッド
  • イテレータ
  • Nullable型
  • ゲッター/セッター別のアクセシビリティ
  • メソッドグループの変換(デリゲート)
  • デリゲートの共分散および反分散
  • 静的クラス
  • デリゲート推論

C#3.0

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

C#4.0

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

C#5.0

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

C#6.0

  • コンパイラーとしてのサービス(Roslyn)
  • 静的型メンバーの名前空間へのインポート
  • 例外フィルター
  • catch / finallyブロックで待機
  • 自動プロパティ初期化子
  • ゲッターのみのプロパティのデフォルト値
  • 表現力豊かなメンバー
  • ヌル伝播関数(ヌル条件演算子、簡潔なヌルチェック)
  • 文字列補間
  • nameof演算子
  • 辞書初期化子

C#7.0

  • アウト変数
  • パターンマッチング
  • タプル
  • 脱構築
  • ローカル機能
  • 数字区切り
  • バイナリリテラル
  • Refの戻り値とローカル
  • 一般化された非同期戻り型
  • 式本体のコンストラクターとファイナライザー
  • 表現型のゲッターとセッター

C#7.1

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

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

C#が現在のC#の多くを欠いているため、C#がその文脈では半分の言語のように見えることはおそらくより理解しやすいでしょう。staticクラスさえ持っていなかったと考えるのは奇妙です!

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


静的クラスは、Javaにはまだ存在しないため(C#の種類)、不足している機能の選択肢としては適切ではありません。これがJavaのジャブでない限り?
user253751

1
@immibis Javaを意図的に突き刺したのではありませんが、本当にそうですか? staticクラスはそのような原始的な機能のように見えます。私は、彼らがインスタンス化されたクラスよりも前のものであると想像しました。
ナット

2
ピストンエンジンジェットはジェットエンジンジェットよりも古いと言っているようです。「インスタンス化されていないクラス」は、すべてのコードがクラス内になければならない言語を除き、一般にモジュールまたは名前空間と呼ばれます。(または自転車を手動自動車と呼ぶ、または固定電話を固定携帯電話と呼ぶ、または...)
user253751

@Nat-静的クラスを持つことは素晴らしいことですが、それらを持たないことは絶対に何も変わりません。クラスのすべてのメンバーを静的にすることができます。クラスが静的のままであることを忘れた場合、失うのは数種類のコンパイラエラーだけです。
ジルカハニカ

@JirkaHanikaええ、私はstaticほとんどの場合、クラスの大ファンではありません。正直なところ、C#の非常にシンプルで原始的な部分に思えたため、これを呼び出す機能として選択しました。私は彼らがJavaにいないとは考えませんでした。
ナット

3

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

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

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

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

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

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

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


5
これは非常に混乱しています。ポインター(論理的な意味ではJavaに存在します)は、それらに煩わされることはできません。モデルを単純化する全体のポイントは、より多くの保証を可能にすることです。言語のコードについてより多くの制限を緩和できると想定できるロジックは、逆向きです。より多くの制限->より多くの保証。
ジミージェームズ

1
@JimmyJamesというフレーズは、すべてのJavaクラスが暗黙的な(yuck、btw)参照セマンティクスを持っている場合でも、実際のポインターを使用できないことを意味します。たとえば、参照への「参照」を取得する方法はありません。これにより、いくつかの場所で言語に障害が発生し、ときどき異常な回避策が必要にMap.mergeなります(マップ内の値を単に更新したい場合を参照してください)。
クエンティン

3
@JimmyJames:ある種の有用な保証は、特定の制限を課さずに実際に提供することはできません。さらに、いくつかの有用な最適化には、いくつかの制限を課すことが必要になる場合があります。ただし、一部の言語では、プログラマに有用な保証を提供しない無意味な制限が課せられ、有用な最適化を実行する必要はありません。いくつかの制限は単に悪いものです。
-supercat

3
@JimmyJames:一方、Javaと「セーフモード」C#のより基本的な制限のいくつかは、C ++ができないという非常に有用な保証を提供します:これまでにない参照(C ++でのポインタ)特定のオブジェクトを特定するために観察されたものは、他の何かを特定するために決して観察されません
-supercat

3
あなたの答えをサポートするためにいくつかの引用を提供できますか?たとえば、私の知る限り、ページには言及されていませんconst。「関数型プログラミング」に言及してますが、彼が例として使用している言語はSchemeであり、純粋な関数型言語ではありません(実際、Schemeの設計者は「function」という言葉の使用を避け、「そのため、彼は「参照透過性」ではなくFPの「ファーストクラスサブルーチン」の解釈を使用しているようです。
ヨルグWミットタグ

1

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

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

JavaとC#は仮想マシンを介して実行されているため、VM内の何かを破損する可能性が高いため、OSを直接操作しているときは希望どおりに正確に実行できないことが論理的に予想されます。さらに、Javaはプラットフォームにとらわれないものとして指向されているため、さらにロジックになります。

2トンのアプリケーションでは、こうした種類のものは必要ありません。

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

  • これらの不必要なものが原因でバグが発生するリスクが増えます。
  • より多くの開発コスト、メモリの管理、テストには時間とお金がかかります!

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

C ++を使用すると、ほとんど何でもできます。それがC ++の人々の選択です。ただし、存在するほど、より多くの処理が必要になります。

したがって、多重継承のようなものは、それらが危険であるという事実だけでgivenめられず、それらを実装するのにコスト(開発、保守)があるためgivenめられます。一般に、別の方法で書き換えられます。


多重継承の実際のコストは、次の両方の保証を維持することができないという事実にあります:(1)base-classのメンバーがBmiddle class Mでオーバーライドされる場合、BそのメンバーのバージョンはM'オーバーライド。(2)typeの参照が与えられた場合T、それをスーパータイプに変換してから元に戻すTと、元の参照と同等の参照が生成されます。これらの保証はどちらも有用であり、多重継承をサポートするには少なくとも1つを放棄する必要があります。
-supercat

-1

プログラマーを保護するために、C#やJavaのような高レベル言語にすべての制限を置くだけです。プログラマを自分から守るためではなく、プログラマを他のプログラマから守るために存在します!

プログラマーとしての私たちは、コーディングの実践と設計は実に恐ろしいが、何らかの理由で使用を余儀なくされたライブラリに何回遭遇しますか?

これらのプログラムは通常、古い手続き型のプログラミング方法の特徴を備えており、カプセル化がなく、エラーをキャッチまたは処理することなく、メモリを直接書き込みます。Segfaultは、大規模プロジェクトでそれらを使用しようとすると、大量に追跡します。

そこでJavaやC#などの言語が非常に役立ちます。他の言語が行うすべてのきちんとしたことを私たちにさせないという事実を彼らが楽しんでいるということではありません。行う。

インターフェースは、記憶力や実行速度の点で、あらゆる種類のトレードオフの価値があります。時間制限のあるミッションクリティカルなアプリケーションでは、これらの保護、適切なエラー処理、および一般的にメモリが使い果たされていないことを確実に確認することは良いことです。


これは、前の5つの回答で作成され説明されたポイントに対して実質的な何かを提供していないようです
-gnat

1
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!それとも、プログラマから他のプログラマを保護するためですか?
トビアテサン

@TobiaTesanそれも:)
アクマバーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.