C言語、C++、C#の違いを教えてください。 この手の質問の回答は多数ありますが 私のようなド素人には全くわかりません。 オブジェクト指向?コンパイラ?全くわかりません。 答えの例と

C言語、C++、C#の違いを教えてください。 この手の質問の回答は多数ありますが 私のようなド素人には全くわかりません。 オブジェクト指向?コンパイラ?全くわかりません。 答えの例と して、 例えば、麺には種類があって 和食では、 うどん、蕎麦 イタリアンでは、スパゲッティ 中華では、 ラーメン うどんラーメンは小麦粉 蕎麦は蕎麦の実 スパゲッティは強力粉 こんな例えで、何となくド素人に概念的な答えをくれると助かります。

補足

私の無知な質問に真摯にお答え下さりまして ありがとうございます 皆さんのご回答を拝見して日々勉強しております。 CとC++に共通点がある事がわかりましたが、 考え方として、 C言語は【単語】 C++は 【熟語・定型文】と捉えてもよろしいでしょうか?

C言語関連 | Linux系415閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

「漫画で学ぶ日本史」みたいなイメージで、例え話にしました。 日本史では、ありませんが。 [ハード処理系とインターネット系との役割分担について] レストランの料理を作るのは、コックさんの役目です。 しかし、素材となる野菜を作るのは、御百姓さんの役目です。 コックさんも、御百姓さんも重要で、どちらが欠けても、レストランの料理は作れません。 AAAAAAA ||||||| 例えの世界 ------------------------ ||||||| 本来のITの解説 VVVVVVV 上記の例のコックさんに該当するのが、Python、Ruby、Java、C#、JavaScriptです。 御百姓さんに該当するのが、C言語、C++です。 C言語とC++は、ハードを直接制御するのが得意です。 しかし、インターネット関係が苦手です。 これに対して、Python、Ruby、Java、C#、JavaScriptは、インターネット関係が得意です。 しかし、ハード処理が苦手です。 AAA ITの解説 ------------------------ VVV 例えの世界 ところで昔は、御百姓さんは、素材となる野菜だけのことを考えれば、それでよかった。 そして、コックさん達は、料理の作成だけを考えればよかった。 しかし、時代の流れで、より良い料理を作るため、御百姓さんは、料理人の立場を考えた野菜作りが要求された。 また、料理人達は、御百姓さん達に、より良い料理を作るための提案をして行く必要が出てきた。 しかし、実際はコックさん達と御百姓さん達は、トラブルの発生で、仲たがいをしてしまった。 そのため、本来は、もっと開拓されて行くべき料理界が、大幅に発展が遅れました。 AAA 例えの世界 ------------------------ VVV ITの解説 上記例えの「時代の流れで、より良い料理を作ることになった」とは、インターネットのことです。 「発展が大幅に遅れた分野」とは、IoT機器によるユビキタス(いつでも、どこでもコンピューターが活躍している世界)です。 また、VR の応用分野です。 他にも、様々なIT分野が、成長を止めてしまいました。 正確に言い直すと、成長自体は、行われていましたが、実用への展開が、大幅に遅れています。 ユビキタス関係(IoT機器)は、何十年も前から研究されていて、二十年前あたりに実用化されていても、おかしくはありません。 しかし、現時点(2019年)では、大手IT企業が実用レベルの製品は発表されていますが、広く普及している訳ではありません。 また、VR も古くから研究されていて、同じく二十年前あたりに実用化されていても、おかしくはありません。 しかし、現時点(2019年)では、VR 自体は普及しましたが、VR を使った様々な「応用」は、まだまだ普及していません。 AAA ITの解説 ------------------------ VVV 例えの世界(一部、実際のITの名称を使用) 料理人達と農家が、仲たがいになったきっかけは、料理界のオーナーであるSunとMicrosoftの対決です。 Sunは、新しい料理時代を作る主要的なリーダーである企業です。 これに対するMicrosoftは、昔から大きな力を持つ企業です。 Sunは、世論を味方にしたため、Microsoftをボコボコにして、Sunの圧勝となりました。 しかし、Microsoft自体は、もともと大きな力を持っているので、廃業することなく、料理界では存続しました。 ただし、新しい料理世界に、Microsoftは、口出しをすることを禁止されました。 これは、見せしめになったMicrosoftだけに限ったことではありません。 Microsoft以外の昔からの大手のオーナー達も、自社が持つ料理技術を、新しい料理世界に持ち込めなくなりました。 そこで、昔から力を持つオーナーのIBM、Oracle、HP等の企業達が、Microsoft側に味方となりました。 「Sunが、中心になって作ってきた新しい料理界よりも、もっと優れた料理界を作って対抗しよう」となりました。 2002年からスタートしましたが、これもSunの圧勝で、MicrosoftやIBM達が敗北しました。 オーナーSunを支持して来た料理人達や、その料理を好んで来た客達の反発が大きかったからです。 ただし、Microsoft達の新新料理技術のほうが優れているので、いったん保留となっただけです。 ここ最近、Microsoft達の新新料理技術のリベンジが始まっています。 「ここ最近」とは、2010以降にリベンジのきざしが始まり出して、特にここ数年(昨年の2018年や今年の2019年と、おそらく来年の2020年あたり)が大きく動き出しています。 AAA 例えの世界 ------------------------ VVV ITの解説 上記例えの「オーナーのSunが、リーダー的な立場の新料理世界」とは、前述しましたが、インターネットのことです。 「Microsoft、IBM、Oracle、HP等々のオーナー達が作った、さらに新しい新々料理世界」とは、SaaSと言うタイプのクラウドコンピューティングのことです。 ところで、2010年あたりからクラウドコンピューティングの普及が始まりました。 それよりも前からクラウドコンピューティングは存在しましたが、広く普及し始めたのは、2010年と、それ以降です。 ただし、2010年以降に普及し始めたクラウドコンピューティングは、「サーバーの運用管理の技術を持っていない人達でも、クラウドコンピューティングの運営会社と契約すれば、誰でもサーバの運用が可能」と言うタイプです。 これに対して、SaaSと言うタイプのクラウドコンピューティングは、様々なサービス(機能)を提供して行くタイプのクラウドコンピューティングです。 AAA ITの解説 ------------------------ VVV 本項目のコメント 上記の例えの説明で、補足する項目を以下に説明します。 [C言語とC++] 昔からのクワと言う農具で畑を耕す農家は、C言語と呼ばれています(あくまでも例えで、C言語と呼ばれる農家は実在しません)。 これに対して、畑を耕す小型自動車や、稲を刈りこむ小型自動車などの農業機械を使う農家が、C++です(あくまでも例えで、C++と呼ばれる農家は実在しません)。 便利な農業機械を使うC++は、優秀ですが、古くからの農家であるC言語も存続しています。 土の素材を活かしたり、根っからの農業技術を持っているのは、古くからの農家であるC言語だからです。 農家C++とC言語は、互いの長所を活かして今でも共存しています。 AAA ||| 例えの世界 ------------------------ ||| 本来のITの解説 VVV C++が持つ農業機械とは、オブジェクト指向のことを指します。 C++とC言語は、両者共に、ハード制御が得意です。 しかし、よりハード側なのが、C++よりもC言語のほうです。 C++の便利さと、C言語のよりハード側の技術を活かして、両者は共存しています。 大きな企業が持つ C系のシステムは、全体の大枠がC++で設計されていて、具体的な処理が、C言語で行われています。 [C++とJava] C++とJavaと言う職人達は、両者共に、「機械を使って便利にする」と言う意味では共通です。 しかし、C++は、古くからの農家であるC言語を活かして共存する道を選んでいます。 すなわち、C++は、最新機械を使うが、分類として農家です。 これに対して、Javaは、料理人側の団体です。 職人団体Javaとしては、「C++は、機械を使っているが、農家側で中途半端だ。農家自体を切り捨てるべきである」と言う立場です。 AAA ||| 例えの世界 ------------------------ ||| 本来のITの解説 VVV C++は、C言語との互換性を重視しました。 ところで、C++が普及し始めた当時にオブジェクト指向の主要であったのは、Smalltalkと言うプログラミング言語です。 Smalltalk側としては、C++に対して、「オブジェクト指向ではないC言語の仕様を取り入れているので、中途半端なオブジェクト指向だ」と批判しました。 しかし、C言語の重要性は高いので、C++がC言語との共存を選んだのは正解です。 C++は、Smalltalkに圧勝しました。 今、Smalltalkの存在を知っている人は少ないのですが、IT関係でC++の存在を知らない人はいません。 ただし、C++が中途半端なオブジェクト指向であることには、かわりありません。 オブジェクト指向の長所を活かすには、完全なオブジェクト指向にすることが望ましいです。 そこで、オブジェクト指向の長所を活かし切るには、不完全ではなく、完全なオブジェクト指向にする必要があります。 そこで、Javaが誕生しました。 Javaは、完全なオブジェクト指向を取り入れているだけではなく、インターネット仕様を取り入れているので、C++よりも人気があります。 人気勝負では、Java 対 C++ では、Javaの勝ちです。 ただし、C言語とC++の人気を合わせれば、Javaよりも完全にC++が勝っています。 すなわち、総合的には五分五分の状況が長く続いています。 [JavaScriptとJava] JavaScriptと呼ばれる料理人達によって、新しい料理世界が作られて行きました。 その新料理界は、特定のオーナーの技術に依存せずに、オープンにする方向性が、世間に高評価となりました。 ただし、その新世界は、職人C言語と職人C++の「素材を活かした食物」に比べれば、かなり御粗末です。 そこで、料理人Javaが、新料理界に加わりました。 Javaは、JavaScriptと同じ料理人側ですが、JavaScriptから見れば、だいぶC++側のように、素材を活かせる立場です。 Javaと呼ばれる料理人達を育てたのは、Sunと言うオーナーです。 Sunは営利企業ですが、料理人Javaをオープン路線にすることを約束したので、新料理世界に受け入れられました。 オーナーSunは、新料理世界でのリーダー的な立場まで、のぼりました。 また、Javaと呼ばれる料理人達を高く評価するオーナーも増えて行きました。 その中で特に目立ったのが、料理界のオーナーであるOracleです。 Oracleは、もともと調理器具のメーカーですが、レストランの経営でも成功しています。 そのレストラン経営で、Javaと呼ばれる料理人達を採用しています。 AAA ||| 例えの世界 ------------------------ (続く)

(続き) AAA ||| 例えの世界 ------------------------ ||| 本来のITの解説 VVVV インターネットの世界は、HTMLと言う言語とJavaScriptと言う言語で普及しました。 さらにJavaが加わって、大きく成長しました。 そしてJavaを支援する企業として、Oracle が加わりました。 Oracleは、もともとデーターベース(多量のデータを管理するプログラム)のメーカーで有名ですが、統合業務パッケージ(略称: ERP)と呼ばれるシステムでも活躍しました。 その手の大きなシステムは、それまでC++が使われていましたが、Oracleは、Javaを採用しました。

ThanksImg質問者からのお礼コメント

無知な私につき合ってくれてありがとうございます 皆さんに感謝です ホンのホンの少しですが解った気がします モヤモヤ感が少し吹き飛びました

お礼日時:2019/3/1 22:42

その他の回答(10件)

0

Cは、昔からある言語で、 いまでも機械側ではよく使われます 一番古いが、いまも現役です。 C++は、C言語を拡張したものです。 じゃあ、C++使えばいいじゃん? となりますが、ハードにC++が対応してない物があるので、使えないこともあるのです。 トースターに電子レンジ用の命令しても、ハード的に出来ないので、ムリですよね? そんな感じです。 C#は、CでもC++でもない、名前が同じだけで、全く別物です。 雨と飴くらい違います。 でも、名前の通り、書き方が似ているので、CやC++を扱える人には、扱いやすいでしょう。 C++より、更に使いやすくした結果、まだまだパソコンにしか使えないと言う点がデメリットですね。 CやC++は、先程お話しした機械よりを得意とするので、それこそ電子レンジやらなんやらの基盤制御にもよく使われます。 Cは機械より C++は機械~パソコンまで C#はパソコンのみ と言う感じです。 C++が一番めんどうですかね。 自由度が高い分、全てを人間が制御すると言う限界に挑むとも言えます。Cも同じですが、C++ほどは自由度は低いです。 個人的な難易度は C++ > C > C# でしょうか。

0

みんな頑張ってるな。 まず、C言語が作られました。 ほとんど最初の言語です。 難しい話をすると、CPUとアセンブラが、うんうんかんうんという話になります。 でも、こいつ、高速に何でもできるんですが、あとになって、いろいろと不便になってきたのですね。 再利用性とか、メモリ管理とか、いろいろと。 で、そこで、C++というものが作られました。 こいつは、C言語に、オブジェクト指向という概念をくっつけたものです。 (異論は認めます、はい。すいません。 オブジェクト指向によって、再利用性が高められました。 使い回しが楽にできるようになって、便利で、よかったよかった、という話です。 で、C#は、全く別でJavaというオブジェクト指向かつ、多くのOSで、ひとつのソフトで使える(ことが目標の)言語がありまして、このJavaにマイクロソフト社が勝手に、拡張をつけて、広めようとしたのですね。 勝手にやったものだから、当然揉めました。 ので、マイクロソフト社がJavaを真似て、新たに作ったのが、C#です。 だから、C、C++とは、全く別物です。 要するに、今数多くあるプログラミング言語は、「C言語より、こうしたら便利!」という理由で、歴史的に、時系列として、作られたものです。 まぁ、一部は趣味で作ったとか、いろいろな事情で作られたものもあるが。 で、こいつを何かに例えようとしたのですが・・・、無理じゃね?(苦笑 なにか、もっと聞きたいことある?と聞いたほうが良さそうな感じ。 一応ネタとして、言語擬人化を上げておきます。 わりと、ネタとしては良く出来てますよ。 Javaちゃんかわいいし。 https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002477 https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002412 用語としては、 オブジェクト指向は、クラスというものからオブジェクトを作ることで、再利用性を高めるための概念、手法、一部の人達の哲学、一部の人達の信仰のことです。 コンパイラは、プログラミング言語を、コンピュータが理解できる形のマシン言語に翻訳するための装置(ソフト)です。 「コンパイラー(Compiler)で、コンパイル(Compile)する。」とか使います。 このくらいわかっていれば、まぁ、いいんじゃね?

あえて例えるのなら、 C言語は、馬です。 移動手段として、馬が使われてきました。 ジャンプもでき、小回りが利き、人間が行ける範囲ならどこにでもいけます。 反面、飼育や扱うのも大変です。 突然死することすらあります。 そこで、その不便を解決したのが車が、C++です。 C++になる際に産業革命が起きました。 それがオブジェクト指向です 作る部品に分けて、作業効率をとにかく高めました。 そして、エンジンみたいな高度に専門的なものは、やはり難しい。 もっと、クリーンに簡単にならんのか? と生み出されたのが、電気自動車のC#です。 C#は、過去の教訓を生かし、色々と便利なんですが、電気を作るための大規模施設が必要になりました。 それが、フレームワークです。 それぞれにいい点があり、用途別に使われています。 つてかんじ。

0

C言語はUNIXと呼ばれるOSの移植性を高める為に開発された言語です。OSが作れる位ですから機械語に一番近い言語です。機械語はオブジェクト指向プログライング言語では無いので当然C言語も違います。機械語にも無い新たな考え方のオブジェクト指向プログライングが考え出されて訳ですが、機械語に無いので、プログラムにとっては特に価値のある物では無く、個人的には、ただ単にプログラムを複雑にするだけの困った存在と考えます。(オブジェクト指向プログラミングは簡単に言うと、鋳物です。鋳物は鋳型を作って置いて、鋳型から鋳物を沢山作れる訳で、鋳型をクラスと呼び、鋳物を作る行為をインスタンス化と言いますが、作られたプログラムを解読する場合、C言語の関数は変数名の読み替えが必要ですが、オブジェクト指向プログラミングは更に、インスタンス名からクラス名の読み替えが必要と成り、プログラムが複雑になる致命欠点を持ています、最大の問題は専門家がこれを致命欠点と認識していない事です)C言語にオブジェクト指向プログラミングの概念を取り込んで拡張した物がC++です。C++はオブジェクト指向プログラミングで無いC言語も扱えるので、仕様がやや複雑になってしまっているので、オブジェクト指向プログラミングに適した文法を0から再設計した物がC#です。尚、C++まではOS上で動くように作られていましたが、C#はOS上ではなく、.NET Framework上で動くので、コンパイラは機械語に翻訳するのではなく中間言語に翻訳し、実行時に機械語に翻訳しながら動くようになっているので、C#は別のOSでも.NET Framework互換ソフトのMONOを使えば同じプログラムをそのまま動かす事も出来るように成っています。

0

C++はCの構造体等の概念を拡張した言語なので便宜的にC/C++とします。 コンパイラ言語 →ファイル全体を一気に翻訳し、翻訳済みのものを実行します。 コンパイル時にエラーを吐くので実行前にある程度の記述ミスなどは見つかります。 (コンパイラ上ではエラーではない実行時のバグは残りますが…) 型については割愛 インタプリタ言語 →ファイルを一行ずつ翻訳実行するので コンパイラより遅い(実行するまでどこがエラーかわからない) C/C++、C#は全てコンパイラ言語でC#だけそのまま実行体(.exeみたいなもの)ではなく、バイトコードを生成し、実行時にCLRというバイトコードを実行するインタプリタを使用します。 (最近のはJITコンパイラと呼ばれ見かけはインタプリタだけど、何回も呼び出されるものはインタプリタでやるより実行体を通してやったほうが早いため、実行時に関数などをコンパイルしてしまうっていう機能もあります) C#ソースコード ↓ コンパイラ ↓出力 バイトコード ↓読み込み (OSごとに異なる)共通言語ランタイム ↓ 実行 まず、OSは(Linux、macOS、Windows)など、それぞれ、考え方や使ってる言葉が違うというイメージをしてください。 で、それをランタイムが翻訳機の役割をして、そのOSに特化した翻訳機さえあればどこでも動くっていう感じです。 あと、.NET Framework(とりあえず道具箱みたいなイメージでOK)のおかげで、GUI(ボタンやメニューバーみたいな動きが付いていて、直感で操作がわかるみたいなインターフェース)は作りやすい印象 C/C++はハードの深いところまでいじることができ、基本的に大抵の言語より一番早く動きます。ですがターゲットのOS特性をしっかり理解してないと、その性能を発揮できません。(基本的にOSごとに読み替えとかできないので) ゲームなど処理が激しいのにも向いていますね C# →クロスプラットフォーム対応力が強い C++ →早い などの理由によりメインC#で、速度必要なところはC++でっていう感じはよくゲーム開発言語で見かけます。 逆に、性能が限られている組み込みなどでもCは使えますよ。 ちなみにC++はデフォルトではGUIフレームワークやライブラリ(GUIやるための道具箱)がないので、MFCなどが必要です。ゲームなら OpenGLやdirectXかな (visual studioやUnity入れて設定いじれば自動で前提ライブラリは入れられますけどね) あと、macOSでC#いじる場合も、 .NET Core SDKってやつがいる =======まとめ========== C/C++ →使う人を選ぶ職人向け的な? (なんでもできるけど、エンジニアのスキルも、結構要求してくる) C# → Javaみたいにエンジニアのフォローもしつつ、多様性も受け入れた言語 (OSの違いやポインタ、メモリ管理[ガベージコレクション]などを抽象化して扱いやすくしたもの、でもポインタもいじろうと思えばいじれるよ的な) もちろんC/C++も、しっかり理解すれば、誰でも使えるとは思いますが、オブジェクトに対しての考え方は、 JavaとかC#やってから C++に戻るって形の方がわかりやすいかも

補足について Cが長男でC++が次男って考えたほうが楽じゃない? C++とC#は親戚とか言われてるみたい(考え方とかは一部引き継いでるため)

0

OSや.Net Frameworkなどの知識も必要になってきそうな気がします。8ビットCPUのパソコンが出現してから40年あまり、OSがWindowsになってから30年ぐらい。.net frameworkが出現してから20年弱ぐらい。現在のOSの仕組みは複雑で奇奇怪怪。それらを実現するためにオブジェクト指向が必要になってきた。 プラットフォーム、.Net Framework、マネージ、アンマネージなどの知識も必要になってきそう。