私はCを知りません。そして、なぜそれを学ぶ必要がありますか?[閉まっている]


58

私の最初のプログラミング言語はPHP(gasp)でした。その後、JavaScriptの使用を開始しました。私は最近C#で仕事をしました。

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

大規模なプログラミングコミュニティの一般的なコンセンサスは、「Cのようなことを率直に学んでいないプログラマーは、ポインター、データ型、参照による値の受け渡しなどのプログラミング概念を扱うことができない」ということです。

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

  1. 高水準言語は簡単にアクセスできるため、より多くの「プログラマーではない」人が飛び込んで混乱する
  2. 高レベルの言語で実際に何かを成し遂げるためには、「学習-低レベル-最初」の福音伝道者のほとんどの支持者と同じ概念を理解する必要があります。

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

なぜバイアスなのか?良い、正直、空腹のプログラマーとして、Cを(何らかの予期しない理由で)習得しなければならなかった場合、私はCを習得します。私たちが何に興味があるのか​​を学ぶべきではないでしょうか?有限の時間を利用して前進すべきではないでしょうか?なぜ一部のプログラマーはこれに同意しないのですか?

優れたプログラマーと悪いプログラマーとの間の基本的な決定論的特性は、あなたがしていることの卓越性を追求することだと思います。

Java、Pascal、PHP、JavaScriptなどの高水準言語で記述されたものが、Cの事前知識から実際にどのように恩恵を受けたのか、実世界の例はありますか?例をいただければ幸いです。


@スティーブンああ、ごめん...私は誤解した。(しかし、c / c ++を正しく学習する必要がある理由はわかりますか?)
ApprenticeHacker

1
@burningprodigyはい、C / C ++が必要な場合、または最も理にかなっていることをする必要がある場合、もちろんCを学習します。私の牛肉は、効果的にCを学習する必要があると言う人々と一緒です。高水準言語で開発する。そしてそれはばかげている。
スティーブン

私たちは聞かせて@burningprodigy チャットでこの議論を続行
スティーブン

「ポインタのようなプログラミングの概念を処理できない...」のコンテキスト(URL)を教えてください。
k3b

習いたい言語が1つあれば、それはCではなくCommon Lispになります。主にC#開発者として、私はそれからより多くの利益を得られると確信しています。C#には既にポインターがあります。ほとんどの場合、同じソリューションをより困難な方法で実装しようとするよりも、問題にアプローチする方法を多く学びたいと思います。(メモとして、私は半分うそをついています。Cをやったことがあり、その利点があることを知っています。Cを10年前にさかのぼる信じられないほど強力で表現力豊かな言語を信用したかっただけです。)
Magus

回答:


113

Cを知ることの利点は、コンピューターがどのように機能するかを非常によく理解していることです。プログラミングモデルの仕組みだけでなく、メモリのレイアウトなども同様です。

Cの下の唯一のレベルは、特定のCPUによって話されるアセンブリです。

(Cを知ることで、より高いレベルの言語で行う必要のある作業がどれだけ少なくなるかを評価できることを付け加えます。そして、その高いレベルの言語での作業にかかるコストを高く評価することを望みます。)


12
フランク:あなたは頭に釘を打ちました。Cを学習する理由は、コンピューターの仕組み、メモリ管理、割り当てを理解し、さらに高レベルの言語をさらに理解できるという考えです。 。
クリス

12
私はこれに同意しますが、Cは草の根にほんの数歩近づきますが、地面にずっと行くことはできません。OK、メモリレイアウトと呼ばれるものがあります。しかし、それは物理的にどういう意味ですか?エレクトロニクスを理解していない場合、コンピューターの仕組みを理解していますか?量子力学?等々。世界に、Cを介して量子力学に至るまで、高級言語から食物連鎖全体を深く理解している単一の心があるかどうかはわかりません。
ジョナスプラッカ

14
私の質問は、コンピューターが内部でどのように機能するかを知ることからどのように利益を得ることができるのでしょうか?あなたは何を得ていますか?あなたが今持っているものの鑑賞私は私が今持っているものに感謝するのFortranを学ぶべきであると言っようなC.そのような非常に低レベルの言語を学ぶための非常に良い理由ではありません
TheLQ

18
@TheLQ私は言葉がありません。コンピューターが内部でどのように機能するかを知ることで、どのようなメリットが得られますか?あなたがしていることのより明確な理解を得ている、あなたが得ているものです。むしろ:そもそも実際にマシンに対して何をしているのかを学んでいます。
フランクシェラー

15
これが正しい答えだと思われるので、これを正しいとマークします。とは言っても、基本的なレベルでは「コンピューターの動作」はあまり気にしません。アプリケーションの次のクールな機能を開発するのには役立たないからです。それは車を運転するようなものです。私は非常に得意ですが、ブレーキ液圧がどのように機能するかを気にする必要はありません。ブレーキを踏むと止まります。また、最初に5年間馬車に乗って走らなければならなかったなら、もっと車を運転したほうがいいと思います。バギーよりも車のほうがどれだけ良いかを仮定できないわけではありません。
スティーブン

72

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

ほら、私は非妥協的なCスノブです。私の態度は、あなたがCを知らない場合には、ある程度、あなたがいないということです本当にあなたがプログラマとしてやっているか知っています。だから、私はあなたがここで話している「偏った」人のようなものだと思う。

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

C(またはC ++、またはアセンブリ)を学習するかどうかは、どのタイプのプログラマになりたいかによって異なります。クールなWebアプリやビジネスアプリを開発したいだけなら大丈夫です-Cを学ぶ必要はありません。しかし、本当に自分の仕事に秀でたい場合は- の状態を後押しする本当にクールなプロジェクトに取り組みたいならそれから、コンピューターとしての仕組みを本当に理解するには、プログラマーとして真剣に取り組む必要があります。Cは基本的にOSの共通語であり、他のすべて(LinuxカーネルからほとんどのJava VM、PythonおよびRubyインタープリター、SQLデータベース、Webサーバー、およびほぼすべてのデバイスドライバーまで)を駆動する言語であるため、言語の親密な理解は大いに役立ちます。

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

だから、Cをラテン語のような死んだ自然言語や馬や馬車のような時代遅れのテクノロジーと比較するのは完全に間違っている。21世紀のソフトウェアインフラストラクチャの大部分はCコードによって強化されています。そのため、Cは今でも相変わらず重要性を保っています。

したがって、Cを学ぶべきかどうかは、プログラマとしてのキャリアから何を望んでいるかに大きく依存します。


5
あなたはそのうんざりするように聞こえません。多分少し。:)
スティーブン

7
素晴らしい答え。私はCとC ++を学習せずに10年間正常にプログラミングし、それまで学習しなくても残りのキャリアを過ごすことができました。しかし、昨年それを学んだので、C ++だけでなく、他の言語でもより良いソフトウェアを書きました
ジョンMガント

3
SOの他の作成者がCについて知っておく べきことを 次に示し
アイザッククラインマン

3
Cをラテン語と比較するのが「完全に間違っている」のはなぜですか?それは素晴らしい類推だと思います。ラテン語は私たちの周りのいたるところにあります。英語の語彙の58%はラテン語の影響を受けています(直接または他のロマンス言語を使用)。ラテン語はまた、私たちの文化を理解する鍵を握っています。法律、民主主義、宗教、インフラ、都市計画、その他のさまざまな分野は、ローマ帝国にまでさかのぼることができます。ラテン語を無視できるのと同じ方法でCを無視することを選択できますが、それらを避けることはできません。「ラテン語とギリシャ語は死んだ言語ではありません。彼らは単に人間であるのをやめただけです。」(JWマッケイル)
アンデルスシェークヴィスト

2
@AndersSjöqvist、それは現代言語の開発に大きな影響を与えたにもかかわらず、もはやラテン語を話せないので間違っています。一方、Cはあらゆる場所、つまりほぼすべてのOS、VM、データベース、またはインタープリターで積極的に使用され、使用されています。ラテン語はもっと似ています。たとえば、Simula-生きている言語に深く影響を与えたが、学外では使用されていない、ほとんどが死んだ言語です。
チャールズサルビア14

12

実用的な経験則は、通常作業しているレベルよりも少なくとも1レベル抽象化を理解する必要があるということです。PHPまたはJavaScriptインタープリターが実際にCまたはC ++で実装される場合があることを考慮してください。最終的には、インタープリターのバグ、またはCランタイムエラーにぶつかるでしょう。Cがわからない場合は、バグ報告をメンテナーに送信し、彼らがそれを再現して気にかけられることを望み、親指をいじるだけです。Cを知っていれば、問題の場所と内容を正確に伝えることができます。

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

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


9
わかりました、「C / C ++」と一緒に暮らすことができます(言語弁護士は気の毒になります)。そして、「Perl / Python / Javascript」は完全に合理的です。しかし、神の愛のために、なぜ「アセンブラー/ C / Lisp」なのでしょうか?それは「リンゴ/オレンジ/バラック・オバマ」と言っているようなものです。これらの3つの言語は互いに関係ありません。
ジェイソンベイカー

@Jason、私が提案した唯一の共通点は、ほとんどの人々がその3つの言語をその場で拾うのが難しいことを発見することです。したがって、すぐにそれらを使用する必要が生じる前にOPと時間を過ごす価値があるかもしれません。ポインター算術プログラミングと関数型プログラミングは、人々が意味を成すまでにもっとじっと見つめなければならないように見えることを除いて、あまり共通点はありません。
チャールズE.グラント

私はこれ以上同意できませんでした。逆に、抽象化のレベルを上げると、少なくともいくつかのプログラミングを実行できる「オフィスIT担当者/ギャル」は、通常、できないものよりも優れています。
エメット14

7

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

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


2
多分ANアセンブリ言語を読むことを学ぶ。問題は、10種類以上のプロセッサフ​​ァミリを使用していることです。非常に異なるバリアントをすべて学習することは、混乱と混乱のレシピです。AMD SHARCとAtmel AVR32およびTI MSP430を比較してみてください。
uɐɪ

@イアン:そう。理想的には、あなたが最も開発するアーチのアセンブリ言語を学ぶべきです。ほとんどの人にとって、これはx86またはARMのいずれかになると思います。
dsimcha

3
「すべての真面目なプログラマーは、最終的に少なくともアセンブラーを読むことを学ぶ必要があります」この質問から始めたきっかけは、このようなコメントです。君は単純に偏見があると思う。しかし、私はあなたが漏れやすい抽象化について言ったことを気に入っています。それは理にかなっている。一方、これらのことは、私のアリーナで「現実世界」に大きな違いをもたらさない。私はまだ、高レベルの抽象化を使用しています。漏れがあるかどうかは関係ありません。
スティーブン

1
@Stephen、アセンブラー言語を作成してみてください。8ビットCPUは難しくなく、6502(C64など)とZ80(CP / Mビジネスマシンなど)の両方に同じ小さなものを実装しようとすると、実際に非常に教育的ですいくつかの非常に基本的な設計の違い(インデックスページとレジスタ)による経験。

露骨に虚偽のAll abstractions are leaky陳述にもかかわらず+1 。
トーマスエディング

7

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

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


6
「ジョブの仕様は、25年前に作成された標準テンプレートに基づいているようです。」あなたはこれ以上正しいことはできませんでした。
スティーブン

おめでとう、ジョン!
マークC

6

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

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


笑。リンクされたコラムのJoelsのアドバイス:「私がここで言っていることを無視し、代わりに、他の学生がデートに出かける人を見つけることができるオンラインソフトウェアを構築する方が良いでしょう。」
スティーブン

3
@Stephen:人々に本当にあなたに気づいてもらいたいなら、彼らに寝かせるか、支払いをしてもらいましょう。
フレッドナーク

@フレッド素晴らしいアドバイス、笑
スティーブン

6

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

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

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

要するに、スティーブン、あなたは正しいかもしれません。私はそうは思わないでしょうが、以前は間違っていました。


4

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

20年前、従来の知恵はあなたが私はVAXマクロを使用して、大学にアセンブラクラスを取らなければならなかった理由であるC(のような高級言語から獲得したかを理解するために、アセンブラを学ばなければならなかったということでした。推測することどのように便利卒業時であることが判明した)。

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

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

最終的には、すべてオペコードとアドレッシングモードになります。したがって、下位レベルでの動作に本当に興味がある場合は、Cよりもアセンブラーの学習に役立ちます。

Cを学習するだけでは、(必ずしも)より良いプログラマーになることはありません。ただし、実際の文字列の種類と標準化されたコンテナライブラリを正しく理解できます。


「感謝」はそれを表す一つの方法だと思います。高校のプログラミングクラスでは、ほとんどの場合、「この関数を使用する必要があります。LOLOMGCHAR*をWTFBBQCHAR *に変換するにはどうすればよいですか?」という質問だけでした。
Katana314

Cは簡単に習得できたと思います。少なくとも私にとっては、カーニハンとリッチーを読んだだけでした。
ロバートブリストージョンソン14

2

言語はツールです。あなたがウェブページなどを書くだけなら、Cを学ぶことなく逃げることができると確信しています。プラスチックモデルキットを作るだけで鋭いナイフと接着剤だけが必要なのと同じように、スパナは通常必要ありません。

私は、非常に制限されたメモリリソースを備えた組み込みシステム用のコードを記述します(最近行った最大のサイズは16kバイトで、それは巨大でした)。


1
それは素晴らしいです...しかし、誰もがそれを行うわけではありません。組み込みシステム向けに書いていない人は、ただ遊んでいるだけで、深刻な開発を行っていない、つまり、少なくとも、組み込みシステムのポイントのコンテキストでモデルを例に取っているということです。これは明らかにそうではないですし、それは今までC.に触れることなく、大規模な生産アプリケーションを作成することが可能です
JohnL

もちろん、Cの近くに行かなくても大規模なプロダクションアプリケーションを書くことができます。Cを使用する前に10年間コードを書きました。PL/ M、Pascal、ADA、およびアセンブラを使用しました。これらは、マシンの基礎となるメカニズムを学習するのにCと同じくらい簡単で、多くの場合、エラーのないコードを生成するのに適していました。
uɐɪ

グレート-上記のあなたの答えは...私はあなたがそのように思った印象、それゆえ私の返事を得られなかったものの
JohnL

組み込みの使用を対象としたJavaエンジンの経験はありますか?

2

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

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

そのため、履歴書にCまたはC ++があると、riff-raffとの差別化に役立つ場合があります。


2

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

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

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

私の意見では、プログラマーは常に異なるプログラミングの概念を学ぶのにある程度の時間を費やすべきでした。Cを見るだけでなく、Clojure、Haskell、Prologなどのより高いレベルのプログラミング言語を見るのも当然です。

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


2

言語で書かれた非常に重要なコードが大量にあるため、Cで書かれたコードを読むのに十分なCを知る必要があります。とにかく、実際に言語でコーディングする必要なく、このテーマに関する徹底的なマニュアル(私はKochanの「Cでのプログラミング」を使用しました)を順調に進めることで保持できることはこれだけです。言語を広範囲に使用する必要がある状況に陥った場合、構築するための優れた基盤が得られます。機械がブラックボックスである場合は、おそらくダンテマンの組立書のようなものを勉強したいと思うでしょう。Petzoldの「コード」もお勧めします。

それ以外-Cの基本的なリテラシーと基礎となるマシンの基本的な精通度-SICP、TCP / IP Illustrated、またはコンクリート数学、アルゴリズム、データ構造に関する書籍など、本物の学習時間を過ごすのに最適です。本物。

PHPでのコーディング中にCの学習に多くの時間を費やすことは、機会費用に見合うだけの価値はありません。学ぶべきもっと役立つことがあります。Cは、学習と使用を通してのみよく学習できるが、必要なときに習得できる別の言語です。

硬いものに汗をかきます。


1

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

Cを知らなければ、他の言語がどのように結果を達成するのかわかりません。

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

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

ただし、フードの下で何が起こっているかを理解すれば、その知識を持たない誰かが複製するのに苦労するという例外的な結果を達成することができます。


1

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

以下に何があるかわからなくてもできるなら、Cを知る必要はありません。しかし、ほとんどのプログラマーは人生のいつか下のレベルに飛び込む必要があります。

また、開発分野の専門化にも基づいています。たとえば、HTML、Javascript、およびサーバー側のスクリプティングを記述するWeb開発者は、Cについて何も知る必要はないかもしれませんが、分散システムまたはゲーム開発者はそうするでしょう。

あなたの職業にとってこれほど基本的なことを学ぶのに数週間費やすことは決して痛くない。


1

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

  1. Cは低レベル言語です。cを使用してカーネルとドライバーを開発できます。
  2. Cは最速の言語です。多くのパワーソフトウェアはcによって開発されます。例:memcached、redis、nginx、apache、mysqlなど。
  3. Cはクロスプラットフォーム言語です。cが開発したプログラムは、すべてのプラットフォームで実行できます。他のクロスプラットフォーム言語ではこれができません。Java、python、phpなどはiOSプラットフォームで実行できません。
  4. C ++は多くの組み込みシステムで実行できません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.