web-dev-qa-db-ja.com

実際のアプリケーションに関して、C、C#、C ++の違いは何ですか

以前に投稿したように here 私はこれらのいずれかを試してみることにしましたが、Web開発者としての関心を考えて、実際のアプリケーションでの違いを知りたいと思います。

注の編集:

私はウェブ開発者ですが、答えを制限しないでください。私は30歳です...私は何年もキャリアを変えてきました。

38
jerebear

CとC++はどちらも抽象化のレベルが低く、複雑さが増すと、他の言語で必ずしも公開されない基礎となるマシン機能への幅広いアクセスを提供します。 Cと比較して、C++は、完全にオブジェクト指向の言語(開発時間の短縮)の便利さを追加し、潜在的に、追加のパフォーマンスコストを追加できます。実際のアプリケーションに関しては、これらの言語は次のドメインに適用されています。

C

  • カーネルレベルのソフトウェア。
  • ハードウェアデバイスドライバー
  • 古い安定したコードへのアクセスが必要なアプリケーション。

C、C++

  • メモリ管理を微調整する必要がある(および一般的なガベージコレクションソリューションに任せることができない)アプリケーションまたはサーバーの開発。
  • 最新のマネージ言語とうまくインターフェースしないライブラリへのアクセスを必要とする開発環境。
  • マネージC++を使用して.NETフレームワークにアクセスできますが、シームレスな移行ではありません。

C#は、より高いレベルの抽象化を再び追加するマネージメモリモデルを提供します。このレベルの抽象化により、利便性が向上し、開発時間が短縮されますが、低レベルAPIへのアクセスが複雑になり、特殊なパフォーマンス要件に問題が生じます。

マネージドメモリ環境で非常に高性能なソフトウェアを実装することは確かに可能ですが、その意味を認識することは不可欠です。

C#の構文は確かにC/C++よりも要求が少なく(エラーが発生しやすい)、初心者プログラマーにとっては学習曲線が浅いです。

C#

  • 迅速なクライアントアプリケーション開発。
  • .NETフレームワークの恩恵を受ける高性能サーバー開発(StackOverflowなど)。
  • 設計対象の言語で.NETフレームワークの利点を必要とするアプリケーション。

JohannesRössel は、C#ポインター、安全でないキーワード、およびチェックされていないキーワードの使用が、C#が構築される抽象化のレイヤーを突破するという有効なポイントを作成します。プログラミングの種類はほとんどのC#開発シナリオの例外であり、言語の基本的な部分ではないことを強調します(C/C++の場合のように)。

63
RedBlueThing

私は ASFAC++ B を話すことに留意してください。 :)最も重要な差別化要因を最初に置きました。

ごみ収集

ガベージコレクション(GC)は、これらの言語を区別するうえで最も重要な要素です。

CおよびC++はGCで使用できますが、ボルトで固定された後付けであり、同様に動作させることはできません( 最もよく知られている )-「保守的」である必要があることを意味します未使用のメモリをすべて収集することはできません。

C#はGCプラットフォームで動作するように一から設計されており、標準ライブラリもそのように設計されています。開発者の生産性は、信じられるために経験しなければならない絶対的な根本的な違いになります。

C/C++ユーザーの間では、GCは「パフォーマンスの低下」と同等であると考えられています。しかし、これは時代遅れの民間伝承です(C/C++のBoehmコレクターでさえ、ほとんどの人が期待するよりもはるかに優れたパフォーマンスを発揮します)。一般的な恐怖は、GCが何らかの作業を行えるようにプログラムが停止する「長い一時停止」です。しかし、実際には、これらの長い一時停止は非GCプログラムで発生します。これらは仮想メモリシステム上で実行されるため、物理メモリとディスク間でデータを移動するために中断することがあります。

また、GCは shared_ptr に置き換えることができると広く信じられていますが、できません。皮肉なことに、マルチスレッドプログラムでは、shared_ptrは、GCベースのシステムよりも低速です。

GCが実用的ではないほど質素な環境がありますが、これらはますます稀になっています。通常、携帯電話にはGCがあります。 C#が通常実行されるCLRのGCは最新技術のようです。

約18か月前にC#を採用して以来、プロファイラーを使用した純粋なパフォーマンスチューニングのいくつかのフェーズを経ており、GCは非常に効率的であるため、プログラムの動作中はほとんど見えません。

GCは万能薬ではありません。プログラミングの問題をすべて解決するわけではありません。メモリ割り当てを実際にクリーンアップするだけです。非常に大きなメモリブロックを割り当てている場合は、注意が必要です。十分に複雑なプログラムでのメモリリークに相当しますが、GCの生産性への影響により、万能薬に非常に近いものになります。

未定義の動作

C++は、未定義の動作の概念に基づいています。つまり、言語仕様は、言語機能の特定の狭く定義された使用法の結果を定義し、他のすべての使用法がundefined behaviourを引き起こすものとして説明します。まったく(実際には、これは明らかに非決定的なデータの破損を含む、診断が難しいバグを意味します)。

C++のほとんどすべては、未定義の動作に関係しています。ラムダ式のような非常に優れた今後の機能でさえ、スタックを破壊するための便利な方法として簡単に使用できます(参照によってローカルをキャプチャし、ラムダインスタンスがローカルより長く存続できるようにします)。

C#は、可能なすべての操作が動作を定義しているという原則に基づいています。起こりうる最悪の事態は、例外がスローされることです。これにより、ソフトウェア構築のエクスペリエンスが完全に変わります。

(ポインターがあり、したがって未定義の動作がある安全でないモードがありますが、一般的な使用には強くお勧めしません-組み込みアセンブリ言語に類似していると考えてください。)

複雑さ

特に、まもなく標準化される新しいバージョンを検討する場合は、複雑さの観点から、C++を選択する必要があります。 C++は、GCを想定することなく、それ自体を効果的にするためにできるすべてのことを絶対に行います。その結果、すばらしい学習曲線を持っています。言語設計者は、「これらの機能は通常のユーザーではなくライブラリの作成者専用である」と言いますが、どの言語でも真に効果を発揮するには、再利用可能なライブラリとしてコードを構築する必要があります。だからあなたは逃げられない。

プラス面として、C++はとても複雑で、オタクの遊び場のようなものです!私はあなたがそれがすべてどのように適合するかを学ぶことで多くの楽しみがあることを保証できます。しかし、主流プラットフォームでの生産的な新しい作業の基礎としてそれを真剣にお勧めすることはできません(ああ、無駄な年月です...)。

Cは言語を単純に保ちます(「コンパイラーは簡単に作成できる」という意味で単純です)が、これによりコーディング手法がより難解になります。

すべての新しい言語機能が追加された複雑さと同等ではないことに注意してください。一部の言語機能は、コンパイラーが自動的に展開する短縮形であるため、「構文糖」と呼ばれます。これは、近年のC#の多くの機能強化を考える良い方法です。言語標準は、翻訳を速記に与えることによって、いくつかの機能さえ指定しています。 usingステートメントは、try/finallyに展開されます。

ある時点で、同じ方法でC++テンプレートを考えることができました。しかし、それらは非常に強力になったため、独自の 熱狂的なユーザーコミュニティとイディオム で、言語のまったく別の次元の基礎を形成しています。

ライブラリ

CとC++の最も奇妙な点は、標準の交換可能な形式のプリコンパイルライブラリがないことです。他の人のコードをプロジェクトに統合することは常に少し面倒で、どのようにリンクするかについて不明確な決定が下されます。

また、標準ライブラリは非常に基本的です-C++には、データ構造の完全なセットと文字列(std::string)、しかしそれはまだ最小限です。ディレクトリ内のファイルのリストを見つける標準的な方法はありますか?驚くべきことだ! XMLの解析または生成のための標準ライブラリサポートはありますか?いいえ。データベースへのアクセスはどうですか?真剣になってください! Webサイトのバックエンドを作成しますか?ばかじゃないの?等.

ですから、あなたはさらに遠くへ狩りに行かなければなりません。 XMLの場合、 Xerces を試してください。ただし、std::stringは文字列を表しますか?もちろん違います!

そして、これらすべてのサードパーティのライブラリには、クラスと関数の命名に関する独自の奇妙な習慣がありますか?もちろんです!

C#の状況はこれ以上はありません。基本は最初から整っていたため、すべてが美しく相互運用されます(そして基本はCLRによって提供されるため、言語間のサポートがあります)。

すべてが完璧というわけではありません。ジェネリックは最初から適切に配置されるべきでしたが、そうではなかったため、一部の古いライブラリに目に見える傷跡が残ります。しかし、通常これを外部で修正するのは簡単です。また、多くの人気のあるライブラリがJavaから移植されていますが、これは最初に登場したほど良くありません。

Closures(ローカル変数キャプチャを使用した匿名メソッド)

JavaとCは、実際にはクロージャーを欠く最後の残りの主流言語であり、ライブラリーは、なしよりもきちんと設計および使用できます(これが、移植されたJavaライブラリーが時々不格好に見える理由の1つですC#user)。

C++の面白い点は、その標準ライブラリが、言語でクロージャが利用できるように設計されていることです(コンテナ型、<algorithm><functional>)。それから10年が経ちましたが、ついに追加されました!それらは大きな影響を及ぼします(上記のように、不十分な振る舞いを漏らします)。

C#とJavaScriptは、クロージャーが「慣用的に確立された」最も広く使用されている言語です。 (これらの言語の主な違いは、C#は静的に型付けされ、JavaScriptは動的に型付けされることです)。

プラットフォームのサポート

あなたが思うかもしれないほどこれらの言語を区別するように見えないので、私はこれを最後に置きました。これらの言語はすべて、複数のOSおよびマシンアーキテクチャで実行できます。 Cが最も広くサポートされ、次にC++、そして最後にC#です(ただし、C#は Mono と呼ばれるオープンソース実装のおかげで、ほとんどの主要プラットフォームで使用できます)。

WindowsとさまざまなUnixフレーバーの間でC++プログラムを移植した私の経験は不快でした。 C#の非常に複雑なものをMonoに移植しようとしたことはないので、コメントすることはできません。

69

Cは、すべてを自分で行うことができる、最低限のシンプルでクリーンな言語です。それはあなたの手を保持せず、あなたが自分自身を足で撃つことを止めません。しかし、それはあなたがやりたいことをするために必要なすべてを持っています。

C++は、クラスが追加されたCであり、他にもたくさんのものがあり、さらにいくつかのものがあります。それはあなたの手を保持しませんが、アドオンGC、またはRAIIとスマートポインターを使用して、あなた自身の手を保持することができます。達成したいことがある場合は、テンプレートシステムを悪用して比較的簡単な構文を与える方法がある可能性があります。 (さらにC++ 0xを使用)。また、この複雑さにより、誤って数十個のインスタンスを作成し、それらをすべて足で撃つことができます。

C#は、C++およびJavaの改善におけるMicrosoftのスタブです。多数の構文上の機能がありますが、C++の複雑さに近いところはありません。完全に管理された環境で実行されるため、メモリ管理が自動的に行われます。必要に応じて「ダーティ」になり、安全でないコードを使用できるようになりますが、これはデフォルトではなく、自分自身を撃つためにいくつかの作業を行う必要があります。

14
Eclipse

私の意見では、C#であり、ASP.NETは、Webバイアスのある開発の3つの中で最高のものです。

CやC++で新しいWebアプリを書く人はもういないでしょう。それは10年前に行われ、多くのレガシーコードがまだ使用されている可能性がありますが、それらは特に適切ではなく、それほど多くの(進行中の)ツールサポートがないようで、おそらく小さなアクティブがありますWeb開発を行うコミュニティ(おそらくWebサーバー開発を除く)。多くのWebサイトC++ COMオブジェクトを作成しましたが、C#の方がはるかに生産的です。必要がない限り、CまたはC++を(このコンテキストで)コーディングする説得力のある理由はありません。

必要に応じてC++を作成しますが、通常は小さな問題ドメイン用です。例えばC#からP/Invokeを介して古いCスタイルのdllに通信します。C#で実に不器用なことをいくつか行うのは、C++ COMオブジェクトをブリッジとして作成するのが簡単でした。

C#の良い点は、Windowsアプリとコンソールアプリの作成に簡単に移行して、C#にとどまることです。 Monoを使用すると、Windowsに制限されません(ただし、使用するライブラリに制限される場合があります)。

とにかく、これはすべてウェブバイアスの観点からです。組み込みデバイスについて尋ねたら、CまたはC++と言います。これらはいずれもWeb開発に適しているとは言えませんが、C#/ ASP.NETは非常に滑らかで、うまく機能します。オンラインリソースが豊富で、巨大なコミュニティがあり、無料の開発ツールがあります。

したがって、実際の観点からは、要求に応じてC#、C++、Cのいずれか1つだけを選択することを原則として、C#に固執することをお勧めします。

5
Robert Paulson

他の投稿から、新しいスキルを習得するために新しい言語を学びたいと思います。私のアドバイスは、言語は本当に重要ではないということです。重要なのは、そのコミュニティの質(アドバイスだけでなく、読み取りと学習が可能な既存のコード)と利用可能なライブラリ/フレームワークです。この点で、「Cファミリ」はあなたにとって最良の選択ではないと思います。Webライブラリとフレームワークは少数であり、移植性がなく、素晴らしくありません。また、学習できるコードのコーディングスタイルは大きく異なり、混乱を招く可能性があります。 (Cは私のお気に入りの言語ですが)

私はただCを学び、ポインターの概念を本当に理解しようとすることをお勧めします。そして、ウェブにもっと適合する他の言語に移動します(pythonやjavascriptが思い浮かびます-あるいはJavaさえ)。また、Cファミリでは、Objective-Cが私の意見ではパワーとシンプルさのベストミックスを持っていますが、ニッチプレーヤーです。

4
Colas Nahaboo

C-ハンズオンと呼ばれる古いプログラミング言語。プログラマーとして、プログラムにすべてを行うように指示する必要があります。また、この言語はほとんど何でもできるようにします。オブジェクト指向のコードはサポートしていません。したがって、クラスはありません。

C++-C自体の拡張言語。Cコードでは++はインクリメント1を意味します。したがって、C++はCよりも優れています。高度に制御されたオブジェクト指向コードが可能です。繰り返しになりますが、これは非常に詳細な言語です。

C#-C/C++コードのスタイルに似た完全なオブジェクト指向コード。これは本当にJavaに近いものです。 C#はCスタイル言語の最新バージョンであり、Webアプリケーションの開発に非常に適しています。

4
Anand Kuma Arya

生の速度の場合はCを使用します。電力の場合はC++を使用します。 .net互換性のために、C#を使用します。それらはすべて、言語が進むにつれてかなり複雑です。 Cは数十年にわたる漸進的付加によるもの、C++は長年にわたるより迅速な拡張によるもの、C#はMicrosoftの力によるものです。

1
MarkusQ

Cは、CPUマシンコードに最もよく似ており、直接変換されるコア言語です。 CPUは、移動、追加、論理結合、比較、ジャンプ、プッシュ、ポップの指示に従います。 Cは、はるかに簡単な構文を使用してこれを正確に行います。逆アセンブリを調べると、アセンブリと同じくらい高速でコンパクトなCコードを書くことができます。これは、メモリが限られている8ビットマイクロコントローラーでの私の優先言語です。 Cで大規模なPCプログラムを作成すると、その編成が限られているために問題が発生します。そこでオブジェクト指向プログラミングが強力になります。 C++およびC#クラスがデータと機能を一緒に含む機能により、組織が強化され、Cを介したより複雑な操作性が可能になります。今、C#を学び始めています。そのクラスのみの構造は、C++よりも高度な組織化を強制するようであり、最終的に開発の高速化とコード共有の促進につながるはずです。 C#はVBのように解釈されません。開発時に部分的にコンパイルされ、実行時にさらに翻訳されて、よりプラットフォームに適したものになります。

1
MikeZ