OOPの時代にCがこれほど人気が​​あるのはなぜですか?[閉まっている]


91

私はCとC ++の両方で多くのコードを記述しましたが、CがJavaにやや遅れて2番目に人気のある言語になるとは思いませんでした。

TIOBEプログラミングコミュニティインデックス

私は、OOPのこの時代に、Cがまだとても人気がある理由について興味がありますか?人気のあるプログラミング言語の上位5つのうち4つは、「現代の」オブジェクト指向対応言語です。

さて、CでOOPをある程度使用できることに同意しますが、それはある種の苦痛で洗練されていません(少なくともC ++とはかなり違います)。それでは、何がCをそんなに人気にしているのでしょうか?効率ですか?低レベルである; すでに存在するライブラリの大部分または他の何か?


18
ビデオゲーム、組み込みシステム、ハードウェアプログラミング(ファームウェア)、オペレーティングシステムなど

25
あなたが測定するものだけを取得することに注意してください-TIOBEの場合、+"<language> programming"人気のある検索エンジンでのヒット数。ブログ投稿「なぜ誰もCプログラミングを行わないのか」は、このインデックスのCに当てはまります。ちなみに、この質問でさえ、グーグルが拾い上げるとすぐにそうなるかもしれません。

40
OOPの時代?それはかなり大胆な声明です。
マフムードホッサム

57
OOPは特効薬であるという幻想がありますが、すぐにそれを失うべきです。OOPには特別なものも「良い」ものもありません。これは多くのコード編成戦略の1つにすぎません。
-Raynos

23
@DeadMG:ポット、ケトルに会え。TIOBEのデータは信頼できない可能性がありますが、「人気がない」という "げた主張には、出典や引用は一切ありません。質問の背後にある仮定に挑戦する場合、少なくともそれを裏付ける証拠を提供してください。
ダニエル・プライデン

回答:


142

貢献するいくつかの要因:

  • Cは遍在しています。プラットフォームが何であれ、Cはおそらく利用可能です。
  • Cは移植可能です。きれいなCを作成し、他のプラットフォームで最小限の変更を加えてコンパイルします-すぐに使用できる場合もあります。
  • Cはしばらく前から存在しています。UNIXが世界を征服した頃、C(UNIXプログラミング言語の選択)がその世界支配を共有し、プログラミング世界の共通語になりました。本格的なプログラマなら誰でも、少なくともCの塊をある程度理解することが期待できます。他のほとんどの言語についても同じことが言えません。
  • Cは、UNIXおよびUNIXフレーバーシステムのデフォルト言語のままです。ライブラリをオープンソースの土地で成功させたい場合は、Cを使用しないかなり良い理由が必要です。これは部分的には伝統によるものですが、CはUNIXライクでサポートされると安全に仮定できる唯一の言語であるためシステム。ライブラリをCで作成すると、依存関係を最小限に抑えることができます。
  • Cは簡単です。洗練されたOOPや関数型言語の表現力はありませんが、そのシンプルさはすぐに理解できることを意味します。
  • Cは汎用性があります。組み込みシステム、デバイスドライバー、OSカーネル、小さなコマンドラインユーティリティ、大規模なデスクトップアプリケーション、DBMS、他のプログラミング言語の実装など、考えられるあらゆるものに適しています。
  • Cは高速です。ほとんどのC実装は、マシンコードに直接コンパイルされ、プログラマはマシンレベルで発生することを完全に制御できます。インタプリタ、JITコンパイラ、VM、ランタイムはありません。コード、コンパイラ、リンカ、ベアメタルだけです。
  • Cは「ビール」と「音声」の両方で「無料」です。標準を所有および管理する単一の会社は存在せず、選択できる実装はいくつかあり、Cを使用するための著作権、特許、または商標の問題はなく、最良の実装のいくつかはオープンソースです。
  • Cには多くの勢いがあります。この言語は何十年もの間普及しているため、言語をサポートするための膨大な量のアプリケーション、ライブラリ、ツール、そしてとりわけコミュニティがあります。
  • Cは成熟しています。大きな変更を導入した最後の標準はC99であり、以前の標準との下位互換性がほとんどです。新しい言語(Pythonなど)とは異なり、すぐに変更を壊す心配はありません。
  • Cは互換性があります。ほとんどの言語には、Cと通信するためのバインディングがあります。これは、標準の呼び出し規則を使用してCでライブラリを開発でき、他のほとんどの言語がそのライブラリに対してリンクできると確信していることを意味します。広く使用されているいくつかの一般的な言語に名前を付けると、C#、Java、Perl、Python、PHPはすべて、Cライブラリとリンクできます。
  • Cは強力です。言語が何かを実行できない場合、すべての一般的なコンパイラは、ハードウェアが実行できるすべての処理を実行できるアセンブラコードを埋め込むことができます。互換性に関する上記のポイントと推移的に組み合わされて、これはCがより高いレベルの言語とアセンブリの「ベアメタル」の間の連絡役として機能できることを意味します。

9
すべての議論が正しいとは限りません。1)Cはユビキタスです。C ++からCへのコンパイラがあるので、C ++はCと同じくらいユビキタスです。2)Cは移植可能です。C ++でも同じです。3)。Cはしばらく前から存在しています。C ++でも同じです。4)。Cは汎用性があります。C ++でも同じです。5)Cは高速です。C ++でも同じです。6)。Cは「無料」です。C ++でも同じです。7)。Cには多くの勢いがあります。C ++でも同じです。8)Cは成熟しています。C ++でも同じです。あなたは実際に質問に答えません。
コンスタンチンソロマトフ

19
C11はC99ではなく、最新の標準です。誰もが'89を使用しているので、それは本当に重要なことではありません。
パビー

53
@KonstantinSolomatov:他の人が使用するライブラリを作成する場合は、世界を支援して、C ++ではなくCで作成してください。それができない場合は、少なくともC APIを作成してください。 宇宙のすべてのものは、通常は最小限の労力で、何らかの形でCコードにリンクできます。対照的に、他の言語からはもちろん、他のC ++コードからC ++コードを呼び出そうとすると、主要なABIの問題が発生します。
ダニエル・プライデン

37
@KonstantinSolomatov-C ++からCへのコンパイラが必要であるという事実は、Cが遍在するものであることを証明しています。
確実に

11
@KonstantinSolomatov:CがC ++だと考えるのをやめてください。Cにはクロージャはありません。Cの一部の拡張機能(gccファミリーのコンパイラーによって実装される拡張機能など)は機能しますが、C 自体は機能しません(つまり、元のK&R仕様または最終的なC標準のいずれにもありません)。
ドナルフェローズ

88

私は、普遍的なアセンブリ言語の必要性について、Cの人気を常に非難する傾向がありました。マシンレベルでの特異性、標準化、および極度の移植性の組み合わせにより、Cは事実上のユニバーサルアセンブリ言語として機能します。そのため、その役割は無限に続くと思います。

プログラミングコースで、優れたプログラミングの唯一の可能なエンドポイントである一種の「最終モデル」としてOOPが提示されるとき、私はいつも少し驚いていることに言及する必要があります。プログラミングの他の多くの側面と同様に、OOPの価値は、人間の脳が情報を整理する方法、社会グループが長期にわたってソフトウェアをサポートする方法、オブジェクト指向プログラミングの場合はかなり深い側面など、多くの競合する要素間の妥協です宇宙自体の仕組みの

そして、その最後の点は少し打ち込む価値があります。特定のプログラミングスタイルが存在する理由、それらがどのように連携するのか、そしてこのような概念をさらに拡大するにつれて、将来世界がどこに向かっているのかについての物理レベルの調査に興味がある場合は、さらに読んでください...

物理学のオブジェクトは、時間の経過とともに認識可能な一貫性を維持するものです。その結果、私たちのような単純な生き物は、私たちの生存をひどく危険にさらすことなく、少数のビットのみを使用してオブジェクトを表現することで逃げることができます。しかし、大規模な物理学の観点から見ると、この種の単純化を簡単かつ一般的にするために正確に取得しなければならないものの数は非常に多くなります。人間として、私たちはそれほど率直に言って、それについてすべてを考えません。それが真実でなければ、私たちはここにいないでしょう。

あまりにも抽象的な音?そうではありません。たとえば、車の代わりに急速に振動するプラズマ場や、巨大な速度範囲で移動する物質の瞬間的な凝縮に遭遇した場合、友人の家への道をナビゲートしようとすることを想像してください。そのようなシナリオは、社会化の機会にかなり深く入り込むかもしれません。我々は、オブジェクトを必要としているオブジェクト、およびオブジェクトの存在は、私たちの周りの環境の簡素化の巨大かつ非常に重要なレベルを提供してくれます。

それでは、すべてをソフトウェアに戻しましょう。プログラミングの観点から、現実世界のオブジェクトはオブジェクトについて何と言っているのでしょうか?

まあ、一つには、ソフトウェアで「良い」オブジェクトを定義するのは、処理しているデータのタイプが、時間の経過とともに認識可能な永続性のアイデアを容易にサポートするかどうかであるということです。

定義により、OOPの最も簡単な形式は簡単に認識できます。これらは、すでに「添付」されているか、人、家、車などの現実世界の真に物理的なオブジェクトによって定義されているデータのみを使用することで、わずかに対処します。今日でも、これは人々がソフトウェアコースで取得するオブジェクトの唯一の定義であることが多すぎます。些細なオブジェクト指向プログラムでさえ、それよりも広い定義が必要だからです。

オブジェクトの2番目のはるかに興味深いカテゴリは、不滅の実世界のイベントと呼ぶもので構成されます。「不滅」とは、現実世界では明確に定義されたエンティティまたはコレクションとして少なくとも一時的に存在するものの、分散して物理的に意味のあるコレクションとして存在しなくなるものを意味します。シンポジウムは素晴らしい例です。シンポジウムは、しばらくの間、場所と人々のきちんと定義されたコレクションとして存在します。しかし悲しいかな、最高の会議でさえ終わらせなければならず、それらを構成した個々の部分は他の活動に移ります。

しかし、コンピュータとネットワークを使用することによって、私たちは、このような過渡的なシンポジウムを作ることができるように見えるソフトウェアオブジェクトとしてのメモリをキャプチャし、維持することによって、長期的なオブジェクトのように。私たちがコンピューターやデータベースで行うことの多くは、この種の一時的なイベントの不滅化に相当します。実際には、物理​​的には存在しない方法でそれをキャプチャして拡張することで、実際の宇宙をより豊かにしようとしています。たとえば、最近、本物のパンドラを見ましたか?このような実世界の作品のキャプチャと拡張は、私たち自身の生活、経済、選択肢を驚くほど豊かにし、拡張するのに役立ちます。私にとってこれは、オブジェクト指向プログラミングの中心地であり、最も顕著な影響を与えてきた場所であり続けています。

OOPの最後のカテゴリは、外部イベントへの密接な接続を持たないオブジェクトで構成されますが、代わりにインフラストラクチャです現実世界からの不滅のオブジェクトを使用して、現実の継続的な拡張をサポートする必要がありました。これは、コンピューターの(半)金属までずっと降りることができ、現実世界の化学要素のように、新しい内部世界を構築する興味深い方法で素早く結合できる永続的な現実の断片を作成します。モバイルコンピューティングは、この種の高度なリコンビナトリアルアプローチの成長を促進するのに役立ちました。このアプローチは、多くの点で物理世界のリコンビナトリアル機能を模倣しています。難しいことでもあります。良い選択のように思えるかもしれませんが、通常、サポートする代わりに多様性と拡大をブロックするため、予想外に悪いものであることが判明する可能性があります。

ただ、現実の世界と同じように、プログラムされた世界はまた、プロセスの必要があるので、この最後のカテゴリーはまた、プログラミングのためのただ一つのモデルを使用しての危険性を指摘しませんが比較的変化しないオブジェクトによく対応します。地球はオブジェクトでいっぱいですが、太陽は、エネルギーの低い地球でオブジェクトと活動を「駆動」するために最終的に必要とされる非常に動的なエネルギーの流れでいっぱいです。同様に、コンピューティングの世界を作成する際には、フローや変換、および急速に変化するコンテキストに対処する必要がある場合があります。 。カーネルレベルで行われるプログラミングの多くがオブジェクトのように目立たないことや、Cのようなより処理指向の言語に大きく依存する傾向があることは偶然ではありません。これらは、コンピューター生成の世界で私たちが見ている魅力的な多様性を補完するより深い領域です。

OOPがうまくいかないもう1つの領域は、古いオブジェクトの概念に焦点を合わせすぎています。

現実世界のオブジェクト、特に生きているオブジェクトは、複雑で微妙な方法で環境と対話する絶対的に驚くべきレベルの能力を持っています。お互いを見渡し、互換性と健全性のチェックを行い、おそらく相互作用するいくつかの新しい方法を見つけ出す構成可能なウィジェットは、単純なフレームワークと単純な継承スキームよりも、オブジェクトの現実世界の生物学的概念に非常に近いコードレベルで(通常は必要に応じて!)に集中する。これは、サイバー世界におけるオブジェクトの成長分野の1つであり、環境への反応性がプログラミング自体の中でも当たり前の「エージェントのような」アプローチです。

そして、OOPに対する私の「批評」はこれで終わりです。それでも、より豊かなサイバーワールドを作成すること、「1つだけ」で十分であると仮定するのではなく、プログラミングスタイルの多様性を網羅すること意味する理由を指摘したいと思います。私が感じているのは、私たちが今やっていることがどれほど平凡であるにせよ、本当に面白いものはまだ来ていないということです!


18
「物理レベルの探査に興味がある場合にのみ、さらに読む」の部分でかなりの数の人々が脱落したと確信しています。しなかったことがうれしいです。これは私たちの理解の基礎を揺るがすような考え方であり、おそらく私たちが顕著な進歩を遂げる唯一の方法です。読んでくれてありがとう。
マット・エッシュ

@ Raynos、$ MattEsch、お二人の親切な言葉に感謝します。おもしろいと思いました。
テリーボリンジャー

1
この深く考え抜かれた素晴らしい答えに投票するためだけにサイトにサインアップしました。=)
sgorozco

2
あなたの考えに沿って、私はかなり長い間プログラミングをしていて、OOPの熱狂者になりました。それを採用すると、コーディングスキルが劇的に向上するのを本当に見たからです。しかし、経験から、すべてを強制的にオブジェクトにすることは本当に有害であることがわかりました。私は今、オブジェクトからリレーショナルへのマッピングツール(混乱)や、必要な適切な量のバイナリデータを有線で送信する単純なバイナリプロトコルと比較して、帯域幅を1000%消費する完全なオブジェクトグラフシリアル化スキームに挑戦しています瞬間。読んでくれてありがとう。
スゴロスコ

2
この答えは、なぜまだSQLが必要なのかに対する答えでもあります!
HLGEM

25

第一に、これに関するドグマが普及しているにもかかわらず、すべてにOOPは必要ありません。Javaとは異なり、Cでは関数ポインターやクロージャーを使用して、関数型プログラミングへの扉を開き、OOPハンドルの問題空間のかなりの部分を解決できます。依存性注入の手段を提供するためです。また、sglibが証明しているように、マクロを慎重に使用すると、実際に非常に優れたものを作成できます。

奇妙な方法で、CはJavaとC ++の間の良い妥協案と見ることができます。Cが何らかの形で両方の組み合わせであると言っているのではないことに注意してください。ただし、Javaとは対照的に、かなり強力な言語であり、C ++とは対照的に管理が複雑です。

これは古い言語であり、信頼性と一貫性が増しましたが、実際にはそれほど複雑ではありません。それ以外にも、巨大なエコシステムがあり、どこでも簡単に実行できます。


11
関数型プログラミングは素晴らしく、それに異議はありません。しかし、Cは関数型プログラミングにとってはやや悪い言語です。クロージャー/ブロックは移植性のないハックであり、見苦しい構文もあります(もちろん、落とし穴もあります)。それをすべて無視しても、メモリ管理に注意する必要があります。Cは便利な言語ですが、他の言語と同様に、C言語を悪用してパラダイムを使用しないと、人生が困難になります。Javaで関数型プログラミングをエミュレートすることもできます(Guavaを参照)が、どちらかというと良くありません。

7
ガベージコレクタなしで機能的なスタイルでプログラムすることは非常に困難です。
コンスタンチンソロマトフ

@KonstantinSolomatov:まず、それは非常に主観的です。次に、必要に応じてガベージコレクションをCに追加できます。
back2dos

JavaとC ++の間の妥協が必要な場合は、Obj-Cを試してください:)すべてのC / C ++プログラマーが試してみるべきことは間違いありません。
スルタン

21

CにはABI(Application Binary Interface)C ++にはありません。これにより、特定のインスタンスではCがC ++よりも便利になります。ライブラリを作成し、他の人が使用するためのバイナリを出荷できるようになるとしたら、C ++はこの仕事に適したツールではありません。他の言語で再び使用されるライブラリを作成する場合は、Cが適切なツールです。CへのFFI(Foreign Function interface)をサポートしていない言語を聞いたことはありませんが、一方で、異なるコンパイラーを使用すると、C ++はC ++で作成されたライブラリーで動作しません。

基本的には、C ++が不適切な役割を満たすCに要約されます。


2
うーん、C、トマト、チーズロール!
-DeadMG

3
C ++にはABIがあります。C ABIが岩のように堅固であるのに対し、C ++の方が頻繁に変更されるだけです。さらに、C ++の多くは使用アプリケーションにコンパイルされたテンプレートなので、更新することはできません。すべての機能が関数呼び出しの背後に隠れている場合、ライブラリを修正し、アプリケーションを動作させ続けることができます。
Jan Hudec

12

C ++やJavaのような言語よりもCを使用する利点の1つは、内部で多くの魔法が発生しないことです。アイテムが割り当てられるとき、コンストラクターは実行されません。また、オブジェクトがスコープ外に出るとき、デストラクターは実行されません。名前のマングリングやvtableはありません。パフォーマンスの予測は簡単です。ガベージコレクターがルーチンを中断し、そのタイミングをスローすることを心配する必要はありません。

コンストラクタ、デストラクタ、名前マングリング、vtable、ガベージコレクタなどは、作成するコードの複雑さの一部を緩和することができますが、その複雑さは言語自体の一部となり、ほとんど制御できません。ビルド時間が長くなる(煩わしいが許容できる)、実行時のメモリフットプリントが大きくなる(許容される場合と許容されない場合)、またはパフォーマンスが低下する可能性があります。Cを使用すると、必要な機能が残るまで、その複雑さの一部を取り除くことができます。

例えば、C ++ stringのデータ型がある光年 Cスタイルの文字列よりで動作するように簡単に、それは、コードのかなりヘビー級作品だし、自分の画像サイズにいくつかのHeFTが追加されます。string1つのプログラムでの機能をフルに活用する人はほとんどいません。Cスタイルの文字列は、作業が難しくなりますが、実行時間と画像サイズの点でペナルティが少なく、特定の問題に対してはその理由により魅力的です。


2
実行時のペナルティはナンセンスです。Cストリング(ヌル終了)は、C ++ストリングよりもはるかに効率が低くなります。また、文字列クラスは、全体stdをドラッグしない限り、Cと同じくらいコンパクトにすることができます
。– Pubby

1
stringCRTを静的にリンクする場合に使用されない未使用の関数を削除しないツールチェーンは、価値のないツールチェーンです。
ビリーONeal

10
愚かなことは、私std::string十分に洗練されていない図書館で働いています。パフォーマンスと機能の両方の点で文字列に真剣に取り組んでいるのであれば、Cを使用してすべてを自分でやり直すことになりますchar*。(文字列は複雑であると予想していても、驚くほど複雑です。)
ドナルフェローズ

1
@DonalFellow興味深い。これがまさにC標準が文字列やハッシュテーブルのようなものを常に無視している理由です。
エンジニア

@ArcaneEngineer:Cの基本的な欠損データ型は、T *とsize_tを組み合わせた「T []のスライス」型であり、配列のようにインデックス付けでき、T *に分解でき、暗黙的に次のように変換できます。任意のT [n]型(サイズはコンパイラーによって自動的に提供されます)。そのような型は、そうでなければ不可能な多くの場合に自動境界チェックを可能にし、多くの種類のコードをよりクリーンで読みやすくします。
-supercat

11

組み込みシステムとドライバーは通常Cでプログラムされます。それ以外にも、まだ維持および拡張されているレガシーCシステムがたくさんあります。


2
はい、Cはすべてで実行されます。そして、言語を習得するのは非常に簡単です(c ++と比較)。
ベンジャミン

10

空気圧ハンマー(空気ハンマー)の時代に手動ハンマーを普及させたのと同じこと:Cは特定の仕事に適したツールです。


6

シンプルさ、一貫性、精度。

簡単です-複雑な開発環境、大規模なライブラリ、または仮想マシンは必要ありません。

一貫性があります-10年前に書かれたほとんどのCは今日コンパイルできます。

精度-必要に応じてメモリの場所を把握し、マシンのレベルまで下げましょう。これは、パフォーマンスと組み込みハードウェアに最適です。

それはすべてのためではありませんが、ビットはまだ有用なツールです。


5
さらに良いことに、10年前にコンパイルされたコードが今日実行される可能性はかなりあります。
ドナルフェローズ

@DonalFellows:そして、プラグインを使用するアプリケーションの場合、今日作成され、ビルドされ、リリースされた(実行可能形式で)アプリケーションが、今までにないビルドツールでコンパイルされたプラグインを使用できる可能性がかなりありますまだ設計されています。
-supercat

6

私は別の答えから2つの点を引用します、それは私がCを時々使用する理由を正確に捉えているからです(しかし、それは私の主な言語ではありません):

  • Cは簡単です。洗練されたOOPや関数型言語の表現力はありませんが、そのシンプルさはすぐに理解できることを意味します。
  • Cは成熟しています。大きな変更を導入した最後の標準はC99であり、以前の標準との下位互換性がほとんどです。新しい言語(Pythonなど)とは異なり、すぐに変更を壊す心配はありません。

これは非常に真実だと思います。私は早朝にCを学びました。それはシンプルで、キーワードと構造がほとんどなく、ほとんどの仕事は図書館で行われました。それから私はCを数年間使用しませんでした。2002年頃、アルゴリズムの高速実装が必要になり、Cコンパイラをインストールして実装しました。私は言語を知っており、それが何のために、何が良くないかを知っています(CでWebアプリケーションを実装することは決してありません!)、そして必要なときにすぐそこにあります。驚く様な事じゃない。

C ++では、別の経験がありました。1995年頃にそれを学びましたが、それは命令型からOOPへの大きなパラダイム切り替えを意味していました。すばらしいです!1999年までいくつかのプロジェクトで使用していました。数年の間、C ++を使用しませんでした。再び取り上げたとき(2008年) 11)。私は再び言語を学ばなければならないと感じました。

開発者として、私は成熟した安定した言語を好みます。私は言語を一度学び、その設計原理、それが何のために良いのかを理解し、それが仕事にふさわしいツールだと思うときにそれを使うのが好きです。また、さまざまな言語を学び、自分のニーズに合った言語(C、C ++、Java、Scala、Haskellなど)を選択することも好きです。私が嫌いなのは、同じ言語を何度も何度も学ばなければならないことです。

プログラミング言語であるIMHOは、明確で一貫性のある安定した設計でなければなりません。Niklaus Wirthのようなデザイナーのアプローチが好きです。異なる言語の必要性を感じるたびに、新しい言語(Pascal、Modula-2、Modula-3、Oberon)を設計しました。私は5-10年ごとに重要な変化を遂げる言語が好きではありません:それらは動く標的のようなものであり、私が今学んでいるバージョンはおそらくいくつかの時代遅れになるので、それらを深く学ぶために私の時間を費やす価値はないと思いますとにかく年。

この意味で、CはIMOの勝者です。特定のアプリケーションには適していますが、他のアプリケーションにはあまり適していませんが、シンプルで比較的安定しているという利点があります。


4

Worse Is Betterについて誰もまだ言及していないことに驚いています。この時点で20年以上が経過していますが、それでも読む価値は十分にあります。Cを中心的な例の1つとして(LISPに対してピット)使用することで、時として少し口調が悪くなりますが、この方法が理想に勝つ方法と理由を概説する非常に良い仕事をします。


「悪いが良い」のカテゴリに入れたもの:英語、PHP、Windows。..マクドナルドかもしれません。私は今でもスペイン語、Python、Linux、および職人のフランス料理がうらやましいです。一般的に可能でない場合は可能な限り。
ThorSummoner

1

Cコンパイラを使用している場合、通常はC ++コンパイラも使用するという事実にもかかわらず、なぜ人々がC ++の代わりにCを使用するのかを尋ねたいと思うでしょう。

  • C言語はC ++よりもはるかに単純です。コーディング規約で完全なC ++標準を使用している会社は知りません。例として、GoogleのC ++コードスタイルをご覧くださいhttp : //google-styleguide.googlecode.com/svn/trunk/cppguide.xml
  • Cはコンパイルがはるかに高速です。コンパイルするのが難しいコンストラクトがないためです。

このリンクは壊れています。
ar2015

0

なし。TIOBEは価値のないインデックスです。実際に彼らの測定値を見ると、それはせいぜい絶対的な推測です。


10
TIOBEが役に立たないという事実は、Cが人気がないことを意味するものではありません
-Raynos

ただし、Cが一般的であり、したがって何らかの使用が必要であるというOP-で提示された議論を確実に無効にします。
-DeadMG

2
Cの人気のより良い尺度は、ほぼすべてのプラットフォームにCコンパイラがあることです
-Raynos

@Raynos:それはまったく測定値ではありません。意味するのは、実装が簡単なことだけです。何人がそれを使用するか、またはその理由については何も述べていません。
-DeadMG

2
完全ではありませんが、私は喜んで反対の視点を受け入れます。あなたの1行の答えにはほとんど考えが適用されていないように見え、あなたはあなたの応答に対して議論的で非建設的です。
マッテンツ

0

レガシーソフトウェアがたくさん

多くの企業は、すべてのコードを即座にC ++などに変更することはできません。

多くの企業は、コードを変更する余裕がありません。

多くの企業はコードを変更する余裕がありますが、気にしない、または「安い」です。

多くの企業が移行中ですが、まだ完了していません。

隠しオブジェクトの向き

(非オブジェクト指向)オブジェクト指向Cソースコードとして設計されたCソースコード、オブジェクト指向でモデル化され、「純粋なC」でコーディングされたアプリケーション、または「C ++」またはその他のオブジェクト指向プログラムから変換するツール Cへの言語

いくつかのビデオゲームがそのように行われていると聞きました。一部のクロスプラットフォームツール、およびGNome Linux OSディストリビューション用のGTK(GObject、GLibrary)ビジュアルインターフェイスライブラリ。


3
この答えの後半は、難読化を解除する必要があります。
アラミス

@aramis。2番目の部分は、多くのコードが「C」で直接ドンデされているようですが、実際には他の言語で「C」に
翻訳されているようです-umlcat

0

なぜCが最も人気があるのか​​、長い間登場している、ほとんどのプラットフォームで利用できる、無料などについて、回答者の何人かが見ているようです。

しかし、他の言語、たとえば無料のPascalでも同じことが言えます。これは無料で、ほぼすべてのプラットフォームでサポートされています。

パスカルは1970年ごろに発明され、Cは1972年ごろに発明されたので、パスカルはCと同じくらい長い間存在していたと思います。

個人的には、Cが最も人気のある言語だと思います。なぜなら、誰でも再利用できるオープンソースコードが他にもあるからです。そして、はい、Pascalよりも低いレベルなので、アセンブリに近づいていますが、アセンブリよりもずっと読みやすくなっています。

プログラミング言語はあまりにも多すぎると思います。プログラマーとして、私たちは重要なもののほとんどを知る必要がありますが、最終的にはその必要はないはずです。1つのプログラミング言語を実装して、Webサイトの構築からiOSコンピューターゲームまですべてを実行できます。

Cはそのグローバル言語のように見えますが、Object Pascalのようなものになりたいと思います。Object Pascalが読みやすいプログラミング言語である理由、OOPコードはCよりも再利用可能であり、バグが発生しにくい傾向がある(私の意見では)

非常に大規模なアプリケーションは、C / C ++よりもObject Pascalで管理する方が簡単です。

70年以降、プログラミング言語がいくつかあり、5年または10年ごとに変わる言語が好きではありません。時間が経つにつれて、技術が進歩し、プログラミング方法が改善されます。言語が数年ごとに劇的に変化する場合、そのデザイナーはおそらく十分に考えていませんでした。しかし1970年から2012年はほぼ半世紀であり、その間に言語を変更してソフトウェア開発で使用される進歩を組み込むことは問題ありません。

C自体は数回改訂されています。ですから、その観点から他の言語よりも優れているわけではありません。


3
Pascalの問題の1つは、言語の「公式」バージョンが非常に必要な機能をいくつか省略したことです。かなり長い間、PCとMacintoshの両方には、当時存在していたCコンパイラよりもはるかに使いやすいPascalコンパイラがありましたが、そのようなコンパイラは「公式」標準でサポートされていない言語拡張機能を追加しました。そのような拡張を成文化する公式標準を作成する努力があったなら、Pascalは「C」として知られる言語のハックを置き換えたかもしれないと思います。
supercat 14

0

Cには膨大なユーザーベースがあるためです。はい、ちょっとしたキャッチ22ですが、StackOverflowでC overに関する質問をすると、ほぼ瞬時に答えが得られます。Pythonに関する同じ質問に答えるには数時間かかる場合があります。

C ++に関しては、IMOの学習はより複雑です。さらに、10年間OOPを試した後、それが常に有用であるとは限らず、多くの場合、代わりに手続き型プログラミングを使用する方が簡単です。


C#またはJavaのSO質問を比較しましたか?
-gnat

@gnatは、C v Pythonの孤立した例でした(ところで、さらに質問があります!)。私はC#の経験がありません(C#またはjavについてSOの質問をしていないことに気付きましたか?)
puk

Heh、StackOverflowの#pythonコミュニティはほとんどの場合非常に高速です。Cコミュニティが回答の速さでjavascriptコミュニティを上回っていたら驚いたでしょうが。(主にボリュームのため)
ThorSummoner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.