Cプログラミング言語はまだ使用されていますか?


96

私はC#プログラマーであり、開発の大部分はWebサイトといくつかのWindowsアプリケーション用です。Cに関する限り、必要がないので、私は長い間使用していません。友達がC#の学習を手伝っている間に、仕事をテストするためにCを学ぶ必要があると言ったのは驚きでした。

私は、Cで開発が行われている場合にのみ、誰かがテストのためにCを学習するだろうと考えました。私の知識から、COMおよびハードウェア設計に関連するすべての開発もC ++で行われます。したがって、C ++を使用する必要がある場合、Cの学習は意味がありません。私も歴史的な重要性を信じていないので、なぜCを学ぶのに時間とお金を浪費するのですか?

Cは、新しいソフトウェア開発やその他の何かでまだ使用されていますか?


46
PIC用のC ++コンパイラを見たことがありますか?
SKロジック

195
誰かが学習を時間とお金の浪費と同一視することを悲しいのは私だけですか?
ジェッティ

37
私の知る限り、COMとハードウェア設計に関連するすべての開発もC ++で行われます」-実際にハードウェアインターフェイスの設計を行っていないように聞こえます。
エドS.

32
人々は、私たち全員が大好きな高級で高レベルの言語がCでしばしば実装されることを忘れています。
David Cowden

13
@ThomasEding Dead言語?Cを死んだ言語と見なす場合、プログラミング言語の知識は非常に限られています。
JesperE

回答:


214

Cには比較的小さな言語であるという利点があります。これにより、Cコンパイラの実装が容易になり(C ++コンパイラは書くのが面倒です)、言語の学習が容易になりますTIOBEインデックスも参照してください。これは、CがC ++より少し先になっていることによるものです。

(IMO)正当化の降順では、Cは依然として多くの場合に使用されます

  • 組み込みのもの
    C ++コンパイラを移植するよりも、Cコンパイラを小規模なプラットフォームに移植する方が簡単です。また、Cの支持者は、C ++が「彼らの背後でやり過ぎ」と主張しています。ただし、IMOはFUDです。

  • システムプログラミング
    繰り返しますが、これは通常、「コンパイラが何をしているのかを知る」方が簡単だという主張が原因です。ただし、多くの組み込みプログラムは、たとえばテンプレートやその他のC ++の主要な機能から恩恵を受けます。

  • オープンソースソフトウェア
    それは、ほとんどが態度の問題ですが、OSSは常にC ++よりもCを好んでいます(一方、業界の大部分では反対です)。トーバルズの不合理な憎しみは、実際にはLinux上でこれの最も重要な理由かもしれません。


16
それは態度よりも歴史です。「コア」オープンソースパッケージとみなされるものの多くは、C ++が現在ほど広く利用できず、リソースがまだ不足していたときに最初に開発されました。
Blrfl

65
TIOBEインデックスは冗談です。検索エンジンのヒットは無意味です。
DeadMG

29
@Sedate:テンプレートが一般にコードの膨張を引き起こすというのは神話であり、古代のC ++コンパイラの時代から来ています。最新のコンパイラは、同一のテンプレートインスタンスを折りたたみます。OTOHテンプレートを使用すると、テンプレートのメタプログラミングが可能になります。これにより、実行時ではなくコンパイル時にコードが実行され、生成されるコードが少なくなります。また、はるかに安全なプログラム(キャストが少ない)を実現します。これは、組み込みドメインで非常に重要になることがよくあります。EC ++は、C ++の専門家によって(とりわけ)テンプレートを捨てるというまったくの愚かさで殺されました。
-sbi

18
@James:効率的な抽象化、汎用プログラミング、型安全性などのことですか?ええ、それが欲しい人。
Xeo

11
@JesperEたまたま、私はそれを書いてから仕事を変えました。そして今、組み込みデバイス用のプログラミングをしています。私たちはC ++を使用していますが、ハードウェアが弱く、リアルタイムの制約が厳しく、信頼性が必要な場合にSTLとテンプレートメタプログラミングができることは注目に値します。(私たちは、発電所をやっている。)はい、あなたが使用する必要があるかどうかを知っている必要がstd::vectorまたはstd::mapコードの特定の部分のために- 、しかし、あなたはそれを自分で実装する必要はありませんが、十分にテストされた頼りにすることができ、非常にパフォーマンス高度な抽象化を提供する信頼性の高いライブラリ実装。
SBI

119

Cは、リソースが不足している組み込みハードウェアプログラミングで多く使用されています。

Linus Torvaldsによれば、C ++は恐ろしい言語だからです。


14
Windowsカーネルの大部分もCであると思います。そして、多くのレガシーシステムです。
コーダー

14
完了するために、LinusはカーネルでC ++を試しました。それはプラスよりも問題でした。とにかく、カーネル開発は本当に特定のトピックであり、C ++が一般的に悪いことを意味するものではありません。
-deadalnix

75
他の人によると、Linusの議論は恐ろしい。
-sbi

36
Linusの引数は有効である場合と無効である場合がありますが、LinuxカーネルはまだプレーンCで記述されています:-)
Joonas Pulakka

15
Linusはgitです。
ubiyubix

94

私が見たすべての現代言語は、Cと対話する可能性があります。

  • C ++
  • Java
  • C#
  • Python
  • ハスケル
  • 客観的C

Cと対話する必要性は、以下から派生します。

  • 単純なABIを持つC
  • Cは長い間存在しています

つまり、これらの言語はCと通信できるため、次のことが可能です。

  • ライブラリを活用する
  • C を介して相互に通信します(たとえば、ClangはC ++で記述されていますが、CインターフェースにフックされたPythonバインディングを提供します)。

そして、私は彼ら全員が彼らのランタイムのためにCに依存しているに違いないと思います(彼らが完全なアセンブリを行ったのでない限り?疑わしい)。

Cはプログラミング言語のLingua Francaであり、特定のアーキテクチャ(アセンブリのような)に結び付けられていない最も単純な(ABIの)ものの1つであり、それを取り除くには大きな変化が必要です。


45

私の意見では、これは「私の友人と私はレゲエを聴いています。実際に誰かがまだラップを聴いていますか?」に似た非常に近視眼的な質問です。

そこにあるすべての言語には用途があります。異なる言語には間違いなくニッチがあります。しかし、Cについて尋ねる!誰もC#を使用していないショップで働くという完全に偏見の観点から、毎日CよりC#を使用する人の方が少ないと確信しています。

言語の相対的な人気度を調べるクイックグーグル。
これは信頼できるものではありませんが、トレンドを確認するために使用できます。

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

タグに関する質問のSO比を見ても:https :
//stackoverflow.com/tags

  • C#:209845
  • 16その他のタグ
  • C:38790

したがって、CはSOで最も人気のある18のトピックです(他にも多くの言語があります)。

注:上記のTIOBEインデックスは10年以上にわたって絶えず更新されており(また、30年前のデータもあります)、各言語で働くエンジニアを測定することになっています(正確さはわかりませんが)。Java / Visual Basicを除く上位10言語のうち、私のショップの人々が知っていることを反映しています(ただし、サンプルサイズがはるかに小さいため、比率はわずかに異なります)。


1
この答えは私を混乱させます...あなたはC#について続けて、SO質問タグを表示しますが、それはCが使用されていることとは何の関係もありません。人気(特にlangpopでは、検索エンジンクエリを使用して人気を判断します)は、言語の現代の使用状況を実際に示しているのではなく、言語の現代の検索だけを示しています。検索では、クエリの数とSO投稿の数を増やすことができるように、Cが下位クラスの大学で頻繁に使用されることを考慮する必要があります。
ジェッティ

3
@ジェッティ:だから私が明示的に言う理由:I am sure none of this is authoritative but we can use it to see trendsしかし、私はあなたの2番目の声明に同意しません。Cはもはや高等教育機関で教えられている主要な言語ではありません(もしそうであれば、卒業生の新しいバッチは役に立たないでしょう)。最近、人々はJava / C#をよく学んでいます。また、Tiobeレポートはクエリではなくジョブに関するものです。
マーティンヨーク

振り返ってみると、私の側には不適切な単語の選択があるようです。少人数クラス(開始クラス)を意味するのではなく、Cが使用されるシステムクラス(コンピューターアーキテクチャ)を意味します。
ジェッティ

4
SOタグカウントは一般に言語の人気を定義するものではなく、単にSOのユーザー間の言語の人気を示します。
エドS.

4
@エドS。明らかに。しかし、問題は人気についてではありません。言語としてのCの存在について。SOタグ数は、それが間違いなく死んだ言語ではないことを示しています。Cが他のサイトの上位2位にあるという事実は、Cを最初/ 2番目に使用頻度の高い言語にしません。しかし、トップ10に存在することは、死んでいないという重要なマーカーです。もちろん、これはCがまだ積極的に使用されていることを示す強力な指標にすぎません。
マーティンヨーク

23

リソースが少なく、オブジェクト指向の機能が必要ない場合は、Cを使用する必要があります。

現在使用されている多くのソフトウェアは、ハードウェアドライバーはもちろんのこと、C言語で記述されています。

Tiobeのインデックスによると、Cは依然として最も使用されている言語です。


tcrosleyが示唆したように、この関連する質問をご覧ください。


また、このwikiこのような、CとC ++の違いに関するいくつかの関連記事も確認する必要があります


4
ああ!それは素晴らしい点です。「OOP機能が実際に言語のオーバーヘッドを追加する」とは考えませんでした。この有効なポイントを明確にしてくれてありがとう。今、私はCが先に他人のであり、理解することができます
パンカジUpadhyay

7
@Pankaj C ++は通常、実行時のオーバーヘッドを必ずしも追加しません。言語の複雑さの多くは「使用しないものにお金を払わない」という原則です-例外を使用しない場合、例外は使用しませんスローダウンするか、コードにサイズを追加します。ただし、コンパイラはより大きく、より複雑です
マーティンベケット

2
:組み込み分野でのC再、またこの質問と回答を参照programmers.stackexchange.com/questions/84514/...
tcrosley

6
実際にOOP機能を必要とすることはありません。いくつかのシナリオでうまく機能します。
エドS.

2
@Jose Faeti:私の上司は経験豊富で合理的な人だから同意します。彼はプログラミングの宗教には賛同しません。
エドS.

20

Cは役に立たないので無視できると自分自身に納得させようとしているように思えます。質問を分けましょう:

「私は、Cで開発が行われた場合にのみ、テストのためにCを習得するだろうと考えました。」

いいえ、Cを学習する理由はたくさんあります。たとえそのようなブランケットステートメントを、特に循環ロジックと組み合わせて使用​​することを避けることを知らなかったとしても。明らかに、適切にテスト/修正できるようにコードが記述されている言語を知る必要がありますが、それは言語がまだ与えられたものとして使用され、Cだけでなくあらゆる言語に当てはまることを前提としています。

「私の知る限り、COMおよびハードウェア設計に関連するすべての開発もC ++で行われています。」

それは間違っています。

「したがって、C ++を使用する必要がある場合、Cを学習することは理にかなっていない。また、歴史的な意義も信じていない。

これは、最も疑わしいロジックです。何よりもまず、歴史的な重要性信じる必要があります。CがC ++のサブセットであることを知っていれば、Cを知っているとより良いC ++プログラマになることができるからです。もちろん、Cはその後に来るほとんどの言語にも影響を与えたため、利点はそれだけではありません。さらに、Cは非常に重要であるため、Cは歴史的な意味のみを持つとは見なされません。まだ広く使用されているため、そのような二次的な地位に追いやることはできません。すべてのプログラマーが使用する必要がある言語であり、十分な知識を持っていることは間違いないでしょうが、本当のメリットを最初に調べずに何かを信じないと言って議論をしないでください。


7
CはC ++のサブセットですが、それはあなたが意図したものですか?? 。CはC ++のサブセットではありません。実際、それらはかなり異なっています。はい、C ++はCの拡張機能である、または、時にはと呼ばクラスとOOPとCが、Cはサブセットであると言って、正当化しない
パンカジUpadhyay

7
C ++は主に古いバージョンのCのスーパーセットであり、それ以降、Cは多少異なる方向に進んでいます。言語の一部の側面はほぼ平行な方向に進んでいますが、他の側面はそうではありません(C ++には他にも多くのものがあります)。
ドナルドフェローズ

すべての有効なCプログラムが有効なC ++プログラムであるわけではない、つまり、C ++はCのスーパーセットではないという事実の明確化に賛成します。ただし、それは、Cが決定する時点でのCのスーパーセットですDonal Fellowsが述べたように、スーパーセット。しかし、それがもはや真実ではなくなったとき、それはもはやそれであると言うのは意味がありません。
ジョシュアヘッジズ

16

組み込みシステムに加えて、ほとんどの新しい言語にはCとのインターフェースがあります。これらのすべての言語で簡単に使用したいライブラリを作成する場合、Cが当然の選択です。C ++は、一部の言語(Python(CPythonのみ)など)とのインターフェイスも可能ですが、C ++はその機能の一部のために、より多くの言語とインターフェイスできません(特に名前のマングリングですが、テンプレートは問題を解決しません)。C ABIは、最も簡単なインターフェイスの1つです(C ++を記述し、インターフェイスにextern "C"を使用できることは知っています。気にしません)。

また、CおよびC ++がシステムプログラミングに最適な言語であり、Cのコンパイル時間がはるかに速いという利点もあります。C ++のコンパイル時間は、私が使用した言語の中でも最悪です。

現在、他の言語で人気のあるシステム言語になりたいと思っていますが(特にDについて知っています)、ソフトウェアの大部分はC / C ++で書かれています。Dのような言語では、Cライブラリを直接使用するのではなく、Cライブラリのラッパーを作成する必要があります(C ++の場合のように)。


Dは、C ++と同様に、Cコードを直接呼び出すことができます。関数プロトタイプの場合に必要なものすべて(これも、C ++と同じです)。あなただけの書き込みextern(C)Cであなたが書い++のに対し、Dにextern "C"
ピーター・アレクサンダー

@Peter Alexander Dのextern(C)を知っています。これは、ラッパーファイルを言ったときに言及したものです。Cヘッダーを直接含めることはできません(C ++で実行できます。Cヘッダーがextern "C"を使用し、ほとんどの場合#ifdef __cplusplusブロックがあると仮定します)。extern(C)を使用するだけで他の非互換性があります(特に文字列の処理方法。私の知る限り、Dにはnullターミネータがありません。したがって、Cに渡すときに配列を特別に変更する必要があります)。
jsternberg

11

langpop.com、特にFreshmeatとGoogle Codeのグラフをご覧ください。Cがまだ先を進んでいることを示しています。

Cは、金属(つまり、組み込みシステム)に近づける必要があるシステムや、パフォーマンスを重視するアプリケーションで依然として人気があります。


4
このURLを開かないでください!Webサイトはもう存在せず、URLは迷惑なスパムページにリダイレクトされます。
ニコライスワンジエフ

11

私はiPad / iPhone向けの開発でほぼ毎日使用しています。多くのライブラリはCで記述されており、Objective-Cに相当するものはありません。はい、それはまだ使用されており、市場で最も新しいデバイスの1つによって使用されています。

Cを使用すると、多くの組み込みシステムをプログラミングできます。小さくて便利で、おそらく今後何年も使用されます(時間を無駄にせず、学習にお金を費やすこともありません)。


2
「Objective-Cはまだ若い」というのは、実際には1980年代半ばからのもので、C ++とほぼ同じくらい古いものです。しかし、それを使用するほとんどの人は、2007年までそれを見つけませんでした。

確かに、私が言いたかったことは、基本的に、iOS向けのObjective-Cに相当するものを持たないCライブラリがたくさんあるということです。実際、言語自体はまったく新しいものではありません(Wikiで確認)。それを指摘してくれてありがとう。
バレンティ

7

一般に、組み込みシステムCでは、依然として広く使用されています。

この質問は他の例を示します。

TIOBEインデックスによって言語を分類しようとし、人気 / 使用方法は、一貫して最初の場所にCを置きます。


2位(Javaに続く)。
マーティンヨーク

7
興味深いことに、C ++とJavaはどちらも過去10年間で人気が低下しているように見えますが、Cは多かれ少なかれ静的なままです。
ポールR

7

移植性。

Cコードを実行すると思われるすべてのシステムのリストを作成し、次に他のすべての言語について同様のリストを作成します。

あなたが私と同じ答えを思いついたなら、結論はイエスです。


5

次の理由により、Cは最も強力な言語だと思います!

1)最初のCでは、システム言語です(つまり、最小限のランタイムまたはランタイムなしで低レベルのプログラミングを行うために使用できます)。

2)結果のアプリケーションの速度。言語セットは比較的小さく、非常に効率的であるため、Cソースコードは高レベル言語よりもはるかに最適化できます。これは、アセンブリ言語でのプログラミングをせずに、アセンブリ言語でのプログラミングにほぼ匹敵します。アセンブリとCを一緒に使用することもできます!

3)Cには、ファームウェアプログラミング(ハードウェア)でのアプリケーションがあります。それは、アセンブリを使用/操作し、コントローラ、プロセッサ、およびその他のデバイスと直接通信できるためです。

4)Cは、現在知られている他の多くの言語の構成要素です。Cの歴史を調べてみてください(プログラミング言語がとにかく進んでいるので)。完全にオブジェクト指向の高レベルプログラミング言語の例として、Pythonを見てください。Cで書かれています(おそらくC ++も)。他の言語の内部で何が起こっているのかを知りたい場合は、それがわかります。Cとその動作を理解することが不可欠です。

アプリケーション言語は、ワードプロセッサやゲームの作成など、高度なプログラミングに使用されます。アプリケーション言語の例は、Java、C#です。その理由は、ガベージコレクション、自動入力、実行時検証などが含まれているためです-焦点は生産性です。

低レベルのプログラミングにはシステム言語が使用されます。例:マイクロコントローラー、ドライバー、OSカーネル。例には、アセンブリ、Cが含まれます。ハードウェア上でコードを直接実行するためのランタイムはほとんど必要ありません。

全体として、アプリケーション言語としては減少していますが、システム言語としては依然として強力です。


1

ああ、それは使用されます。私はネットワークパケット処理の分野で働いています。私は、ネットワークパケットを処理する2つの異なる会社に勤務しました。そのため、TCPより上のレベルではなく、イーサネットまたはIPレベルで動作しています。

興味深いことに、両方の会社でCがC ++よりも選択されました。ある企業では、2つの製品のうち1つがLinuxカーネル上に構築され、もう1つの製品はLinuxユーザースペースに構築されました。LinuxカーネルはCでプログラムされているため、カーネル製品は明らかにCを使用しましたが、ユーザー空間製品にもCを使用することを選択しました。どちらの製品も2000年頃から開発されました(2000年より少し前のカーネル製品と2000年より少し後のユーザースペース製品)。

その後私が行った会社では、製品はC ++ではなくCで構築されていました。実際には、1990年代半ばからのプロジェクトの継続ですが、最近のパフォーマンス改善の要求により、本質的にすべてを書き換えることが決定されました。この書き換えのためにC ++を選択するオプションがありましたが、選択しませんでした。

ネットワークパケット処理の分野では、パフォーマンスが非常に重要です。そのため、既存のハッシュテーブルよりも高いパフォーマンスを持つ独自のハッシュテーブルを実装したいと思います。ハッシュテーブルの作成者ではなく、私は使用するハッシュ関数を選択します。おそらくパフォーマンスが必要で、MurMurHash3に行きます。おそらくセキュリティが必要で、SipHashに行きます。メモリアロケータは明らかにカスタムです。実際、使用するすべての重要なデータ構造は、可能な限り最高のパフォーマンスを実現するためにカスタム実装されています。

C ++の使用を妨げるものは何もありませんが、通常は悪い考えです。パケットごとに1つの例外がスローされると、パケット処理速度が許容できないレベルに低下します。したがって、C ++の例外を使用することはできません。遅すぎる。データ構造を構造体として実装し、それらの構造体で動作する関数を実装することにより、すでに一種のオブジェクト指向Cコードを使用しています。C ++では仮想関数を使用できますが、仮想関数呼び出しはどこでも使用するとパフォーマンスが低下します。そのため、仮想関数呼び出しが必要な場合は、明示的で関数ポインタを使用する方が適切です。

C ++は、メモリ割り当てなど、背後で多くのことを行います。一方、Cでは、通常は発生しません。メモリを割り当てる関数を作成できますが、通常、関数のインターフェイスから割り当てが行われていることがわかります。

Cでプログラミングするときにできるマイクロ最適化の種類の例として、Linuxカーネルのcontainer_ofマクロを見てください。もちろん、C ++コードでcontainer_ofを使用できますが、だれがそれを行いますか?つまり、ほとんどのCプログラムでは完全に受け入れられますが、典型的なC ++プログラマは、リンクノードを個別のブロックとして割り当てるリンクリストなど、すぐに別のものを提案します。割り当てられたすべてのメモリブロックはパフォーマンスに悪いため、これは望ましくありません。

おそらく、C ++でメリットがあるのは、C ++がテンプレートメタプログラミングを許可することだけです。つまり、関数パラメーターを保持しながら仮想関数呼び出しを回避し、コンパイラーが関数をインライン化できる場合があります。しかし、テンプレートのメタプログラミングは複雑であり、Cのすべての要件を満たすことができたため、C ++のこの機能の利点はそれほど重要ではありません。

ある会社では、機能の一部が実装されたカスタムコンパイル言語が実際にありました。コンパイラのターゲット言語はどれでしたか?アセンブリ?いいえ、32ビットと64ビットの両方のアーキテクチャをサポートする必要がありました。C ++?きっとあなたは喜びます。明らかに、GCCの計算されたgotoを使用したC でした。そのため、カスタム言語はC(または実際には計算gotoをサポートするCのgccバリアント)にコンパイルされ、Cコンパイラはアセンブリを生成しました。


0

私は今でも日常的にCを使用していますが、主な理由の1つは、他の言語との相互運用性と、さまざまな言語のあらゆる種類のコンパイラーによって作成されたプラグインによって使用されるように設計されたSDKによるものです。

Lua、C#、Python、Cなどから使用できるコンストラクターとデストラクターおよびvtable、関数のオーバーロード、例外のスローなどを含むクラスを使用するC ++ APIを書くことはできません。および独自の設定。

たとえば、Pythonから呼び出すことができるC#SDKや、C#から呼び出すことができるPython SDKを書くことはできません。

Cは、これらの言語のいずれかから呼び出すことができるAPIを作成できる唯一の言語です。つまり、C ++を使用してこれらのCインターフェイスを実装することがよくあります(ただし、Cで実装することもあります)。

それに加えて、Cは、低レベルのデータ構造やメモリアロケータのようなものを扱うのに最も簡単な言語であることがあります。整列されたビットとバイトをプールするように設計されたメモリアロケータを作成している場合、C ++で得られる余分な型安全性はすべて役に立ちません。また、C ++の豊富な型システムと例外処理に対して、独自のデータ構造をロールバックするのは簡単ではありません。データ構造を書くのにどれだけの労力が必要かを見てstd::vectorください。コンテナに挿入しなかった要素のctorとdtor(私は、C ++標準ライブラリ全体を実装した人と言っています)。成長可能な配列だけをうまく実装するのが非常に難しい場合、実動品質のBVHを実装するために必要な作業を想像してください。

既存のデータ構造を使用たり、既存のデータ構造を使用してより高レベルのデータ構造を実装したりする場合は、C ++よりもC ++を使用しますが、低レベルのデータ構造を実装する場合は、既存のデータ構造、Cは間違いなく、コンストラクタ、デストラクタ、および例外がスローされることを心配せずに、memcpyこことmemmoveそこにmallocあるもの、連続するブロックとreallocそこにあることを可能にする、その非常に単純な型システムで、それをはるかに簡単にします。

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