web-dev-qa-db-ja.com

Cを知りません。なぜそれを学ぶ必要があるのですか。

私の最初のプログラミング言語はPHP(gasp)でした。その後、 JavaScript。最近、C#で作業を行いました。

Cのような中低レベルの言語を一度も見たことがありません。

一般的なプログラミングコミュニティ全体のコンセンサスは、「率直に言って、Cのようなものを学んでいないプログラマは、ポインタ、データ型、参照による値の受け渡しなどのプログラミング概念を処理できない」です。

私は同意しない。私はそれを主張します:

  1. 高水準言語に簡単にアクセスできるため、より多くの「非プログラマー」が飛び込んで混乱を招く
  2. 高水準言語で実際に何かを実行するためには、「learn-low-level-first」のほとんどの支持者が伝道するのと同じ同様の概念を理解する必要があります。

Cを知る必要がある人もいます。それらの人々は、低レベルから中レベルのコードを書くことを要求する仕事をしています。 Cは素晴らしい人だと私は確信しています。Cを知っている悪いプログラマーも何人かいると思います。

なぜバイアス?素晴らしく、正直で、空腹なプログラマーとして、もし私が(予期しない理由で)Cを学ばなければならなかったなら、私はCを学ぼうと思います。興味のあることを学ぶべきではないでしょうか。有限時間移動forwardを利用すべきではありませんか?なぜ一部のプログラマはこれに同意しないのですか?

私はあなたがしていることの卓越性のために努力することは、良いプログラマーと悪いプログラマーの間の根本的な決定論的な特性であると信じています。

高レベル言語(Java、Pascal、PHP、JavaScriptなど)で書かれたものがCの事前知識から本当に恩恵を受けた実例はありますか?例をいただければ幸いです。

58
Stephen

Cを知っていることの利点は、コンピューターの動作について非常によく理解できることです。プログラミングモデルの動作だけでなく、メモリのレイアウトなども同様です。

Cの下の唯一のレベルは、特定のCPUが話すアセンブリです。

(Cを知っていると、より高いレベルの言語で行う必要のある作業がはるかに少なくなることを認めることができることを付け加えます。うまくいけば、そのより高いレベルの言語での作業に関与するcostの評価。)

113
Frank Shearar

ここでの答えは、OPが求めていたものではないと思いますので、私は自分の意見を述べます。

見てください、私は申し分のないCスヌーブです。私の態度は、あなたがCを知らなければ、ある程度は知らないということです本当にプログラマとして何をしているのかを知っています。だから、私はあなたがここで話している一種の「偏見のある」人だと思います。

ただし、実際には、あなたがreallyであるかどうかに関係なく、プログラマーとして何をしているのかを知っていても、高レベルのツールを使用して本当に素晴らしい便利なソフトウェアを開発することは必ずしもできません。つまり、Stack Overflowの作成者であるJeff Atwoodは、Cさえ知らないようですが、Stack Overflowは非常に優れたWebアプリケーションだと思います。

C(またはC++、またはアセンブリ)を学ぶかどうかは、どのタイプのプログラマになりたいかによって異なります。クールなWebアプリやビジネスアプリを開発したいだけの場合は問題ありません。Cを習得する必要はありません。しかし、実際にやりたい場合Excel自分がしていること-実際に取り組みたい場合cool最先端技術をプッシュするプロジェクト、それからプログラマーとして真剣に取り組む必要があります理解コンピューターのしくみCは本質的にはOSの共通語であり、他のほぼすべての機能を備えた言語です(LinuxカーネルからほとんどのJava VMs、Python =およびRubyインタプリタ、SQLデータベース、Webサーバー、およびほぼすべてのデバイスドライバ)、言語の親密な理解は長い道のりです。

言うまでもなく、C(またはC++)を知ることは、数百万(または数億)の人々に影響を与える大規模なオープンソースプロジェクトに貢献する大きな機会を開きます。 Pythonインタプリタ、またはChromium Webブラウザの改善に取り組みたいですか?さて、最初のCと後者のC++を知っている必要があります。

そのため、Cをラテン語のような死んだ自然言語や、馬や馬車のような古いテクノロジーと比較することは完全に間違っています。 21世紀のソフトウェアインフラストラクチャの大部分はCコードを使用しています。そのため、Cは今でも相変わらず関連性があります。

したがって、Cを学ぶべきかどうかは、プログラマーとしてのキャリアに何を求めているかにかかっています。

72
Charles Salvia

実際の経験則では、通常使用する抽象化の少なくとも1つのレベルを理解する必要があります。PHPまたはJavaScriptインタープリターは、実際にはCまたはC++で実装されている場合があります。最終的には、インタプリタのバグまたはCランタイムエラーにぶつかるでしょう。Cが理解できない場合は、バグレポートをメンテナに送信することに限定され、メンテナがそれを再現して気にかけることができると期待しています。 Cを知っている場合は、問題の場所と問題を正確に伝えることができます。

これは、C/C++で作業している場合、少なくともプラットフォームでアセンブリを読み取ることができる必要があることも意味します。

必要なときにCを学習する場合について:私の観察では、ほとんどのプログラマーはPerl/Python/Javascriptをオンデマンドで学習できますが、アセンブラー/ C/LISPはもっと多くの時間を必要とするようですので、必要になる前に少なくともいくつかの基本を学ぶ価値があります発生します。

12

C firstを学ぶ必要があることに同意しませんが、C 最終的にを学ぶべきだと思います。すべての抽象化には漏れがあり、Cを理解すると、豪華な高水準の抽象化を使用したときに実際に何が起こっているかを理解しやすくなります。そうは言っても、同じ理由で、すべての真面目なプログラマーは少なくともアセンブラーを読むことを最終的に学ぶべきだとも思います。

これらの低レベルの概念を学ぶことは、高レベルのものについて推論する驚くべき能力を与えます。たとえば、C++およびDでは、仮想関数へのデフォルトの引数は、動的(実行時)タイプではなく、オブジェクトの静的(コンパイル時)タイプによって決定されます。 vtablesと呼び出し規約がどのように機能し、仮想関数を逆の方法で実装することが非常に難しいのかを理解していない限り、これは意味がありません。

7
dsimcha

バイアスは現状維持の1つです。昔(1980年代以前)では、C/C++はパフォーマンスアプリケーションの要件のほとんどでした。それは変更されましたが、上級開発者は一般にその古いスキルの背景から来て、そのコンテキストで物事を表示します。

実際の開発では他の言語areが使用されています-C#はJavaと同様に人気がありますが、PHPおよびPythonは内部プロジェクトであり、オープンソースを選択する場合に備えて、少なくともその分野で少なくとも基本的な知識を持っている人がいると便利ですPHPプロジェクト、たとえば、バグ追跡システム。ただし、ジョブスペックは、25年前に作成されたその標準テンプレートに由来するようです。

7
JohnL

なんと素晴らしいナメクジ祭! (おそらく彼らが言うように:これは私的な戦いですか、誰か参加できますか?)

私は教授でしたが、(ある程度の試行錯誤の後に)コンピュータが行っていることを基本レベルで理解すれば、プログラミングの複雑な概念を通して学生を導く方がはるかに簡単であることがわかりました。すべての重要な詳細ではありませんが、メモリとは何か、命令は何かなどの基本的な原則です。Cの私が好きなのは、マシンに近いことです。

だからといって他の先生が同じところに来たわけではありません。彼らは高級言語(BASIC :-)で始まり、そこから前進しましたが、明らかな悪影響はありませんでした。

結論として、スティーブン、あなたは正しいかもしれません。私はそうは思いませんが、以前は間違っていました。

6
Mike Dunlavey

義務的なJoelブログ投稿を投稿するのは嫌いですが、私は彼に同意します here 。 Cはプログラミングの共通語です。どういうわけかそれとやり取りできない高級言語は考えられません。そのため、Cはまだシステムプログラミングタイプのものの人気のある選択肢です。 Cがないと、OSレベルの機能とはインターフェイスできません。

それ以外に、高水準言語が十分に高速でない場合はどうするつもりですか? Ruby、Python、PHPなどの高水準の動的型付け言語を使用している場合は、Cの記述方法を知ることが特に重要です。しかし、JavaおよびC#プログラマでさえ、時々Cにドロップダウンする必要があります。

6
Jason Baker

これは進歩だと思います。

20年前の常識では、Cなどの高水準言語から得られるものを理解するためにアセンブラーを学ぶ必要がありました(そのため、VAXマクロを使用して大学でアセンブラークラスを受講する必要がありました推測卒業するとどうなるかわかりました)。

Cの学習はやや難しく、ほぼno抽象化(ポインターとバイトストリームはほぼそれです)を提供するという迷信があるので、学習すると、どういうわけか、より優れたプログラマーになったり、洞察力が高まったりします物事がハードウェアレベルでどのように機能するかについて。

これは(必ずしも)真実ではありません。標準Cでは、他の3GL(Pascal、Fortranなど)よりも金属に近づくことはありません。一部のC implementationsは、一部の領域へのアクセスを向上させるフックを提供する場合がありますが、一般に、ネイキッドポインターは、取得するのとほぼ同じです。たとえば、レジ​​スタやステータスワードに直接アクセスすることはできません。

結局のところ、それはすべてオペコードとアドレッシングモードに帰着するので、もしあなたが本当により低いレベルでの物事の仕組みに興味があるなら、Cよりもアセンブラーの学習に役立つでしょう。

それ自体では、Cを学習しても(必ずしも)優れたプログラマーになるわけではありません。ただし、実際の文字列型と標準化されたコンテナライブラリについては、理解できるはずです。

4
John Bode

Procoatively尋ねました:あなたはCを学ぶ必要がないことの確認を求めていますか? pureC(必ずしもC++ではない)を習得すると、コンピュータの実行モデルを完全に理解できます。特にメモリと割り当てについて。このことは、より高いレベルの言語でプログラミングする人々にとっても重要です。

PHPプログラマーの場合、特定のマシンでコードがどのように実行されるかについての透過性が低くなります。ネットワーク転送がボトルネックであるため、PHPプログラマーにとっては問題ではないかもしれませんアプリケーションなどで.

プレーンなPHP/Python/C#には、言語とCPUの間に多くの抽象化レイヤーがあります。これらの層は非常に厚いため、中を見ることができません。 Cを習得すると、CPUとオペレーティングシステムの間に薄いシートができます。それはプログラミングを容易にしません(そしてそれはより良くないかもしれません)。しかし、実際にはCPUがどのように機能するかを学ぶことができます。 「中級」のCがわかったら、実際にその知識を上位レベルの言語にリンクし始めることができます。これは、あなたが得る直接の利益です。

私の意見では、プログラマーは常に、プログラミングのさまざまな概念を学ぶのにある程度の時間を費やす必要があります。 Cを確認することは間違いなく価値がありますが、Clojure、Haskell、Prologなどのさらに高いレベルのプログラミング言語を確認することもできます

これらの達人になる必要はありません。彼らは、プログラミング言語の「レベル」はバイナリではなく、多くのレベルがあるという教訓を教えるだけです。上から下まで(アセンブラー)それらを理解します。それはあなたをより良いプログラマーにするでしょう。

2
wirrbel

言語で書かれた非常に重要なコードが大量にあるため、Cで書かれたコードを読み取るのに十分なCを知る必要があります。いずれにせよ、実際に言語でコーディングする必要なく、この件に関する完全なマニュアル(私はKochanの「プログラミングin C」を使用しました)を順調に進んでいくのはこれですべてです。言語を広範囲に使用する必要がある状況に陥った場合は、上に構築するための良い基盤があります。あなたがマシンがあなたにとって抽象化されたブラックボックスであるならば、あなたはおそらくダンテマンズアセンブリ本のようなものを勉強したいでしょう。ペツォルドの「コード」もおすすめです。

それ以外の場合-Cの基本的なリテラシーと基礎となるマシンの基本的な知識-SICP、TCP/IP Illustrated、具体的な数学、アルゴリズム、またはデータ構造に関する本など、実際のものに学習時間を費やすのが最善です。本物。

PHP=でコーディングしながらCの学習に多くの時間を費やすことは、機会費用に見合うだけの価値はありません。学ぶためにもっと役立つことはたくさんあります。Cは本当に、勉強しなければ学べない別の言語にすぎません使用しますが、必要なときにピックアップできます。

固いものを汗でかく。

2
naftalimich

言語はツールです。 Webページなどを作成するだけでよい場合は、Cを習得しなくても逃げることができると思います。プラスチックモデルのキットを作成するだけの場合と同じように、鋭いナイフと接着剤だけが必要です。スパナは通常必要ありません。

非常に制限されたメモリリソースを備えた組み込みシステム用のコードを書いています(最近行った最大のものは16kバイトで、それは巨大でした)この市場では、Cまたはアセンブラーが唯一のオプションであり、ふわふわした高水準言語はどれも機能しません。

2
uɐɪ

私の経験では、しばらくの間、C/C++は優れたプログラマーをVB6プログラマーから分離する優れたバッファーでした。奇数年のC/C++を5年間行った後、VB6で働く仕事を得ました。コーダーの質(またはその欠如)に驚きました。彼らは言語の根本、デザイン、またはパフォーマンスについてはほとんど興味を持っていませんでした。残念ながら、同社が.Netに移行したとき、C/C++コーダーと.Netコーダーは同じツールを使用していました。 VBコーダーはさらに悪いVB.Netコーダーでした。すべての開発がASP.NETに進むと状況はさらに悪化しました。突然、コントロールをドラッグアンドドロップできる誰もがプログラマーになりました。

しかし、求人市場では、ハードコアのコーダー(C/C++など)と観光客を区別することはあまりありませんでした。

そのため、履歴書にCまたはC++を含めると、リフラフとの違いがわかる場合があります。

2
dave

C(そしておそらくC++)は、あなたが泳いでいる海です。コードを実行するOSは、おそらくC(およびC++)でコーディングされています。したがって、OSサービスにアクセスするためのネイティブAPIはCになります。

以下が何であるかを知らずに実行できる場合は、Cを知る必要はありません。しかし、ほとんどのプログラマーは、自分の人生のある時点で、より低いレベルに飛び込む必要があります。

また、開発分野の専門化にも基づいています。たとえば、HTML、Javascript、および一部のサーバー側スクリプトを作成するWeb開発者は、Cについて何も知る必要はないかもしれませんが、分散システムまたはゲーム開発者は知っています。

数週間をかけて、あなたの職業に欠かせないものを学ぶことは決して害にはなりません。

1
Mert Akcakaya

Cは、他の言語の記述に使用される言語です。それはあなたが好きなだけCPUと他のハードウェアと親密になることができます。

Cがわからない場合は、他の言語がCの結果をどのように達成するかはわかりません。

もちろん抽象化は重要な概念であり、選択したフレームワークが約束した結果をどのように達成しているかを誰もが知る必要はありません。優れたコードを作成するために、Cの記述に20年を費やす必要はなく、実際に多重継承を使用したときにvtableに何が起こるかについて考える必要もありません。

これで、4ストロークエンジンの仕組みを理解せずに、または実際にスティックシフト(手動ギアボックス)を使用できなくても、車を運転できます。

ただし、内部で何が行われているのかを理解していれば、その知識のない人が再現に苦労するという例外的な結果を時々得ることができます。

1
Bill Michell

Cには多くの利点があります。

  1. Cは低レベル言語です。Cを使用してカーネルとドライバーを開発できます。
  2. Cは最速の言語です。多くのパワーソフトウェアがcによって開発されます。例:memcached、redis、nginx、Apache、mysqlなど。
  3. Cはクロスプラットフォーム言語です。 cによって開発されたプログラムは、すべてのプラットフォームで実行できます。他のクロスプラットフォーム言語はこれを行うことができません。 Java、python、phpなどはiOSプラットフォームでは実行できません。
  4. C++は多くの組み込みシステムでは実行できません。
1
Edward Shen