Cの学習はコンピューターサイエンスに不可欠ですか?[閉まっている]


15

私はフロントエンドの開発者で、ファイルの拡張子.h.c拡張子をほとんど見ていません。私は基本的なC構文を知っています。Unrealityで学習しましたが、単純なことにはあまりにも多くのセットアップが必要だったため、このような低レベルのプログラミングには興味がありませんでした。

コンピューターサイエンスのすべての側面を学ぶことに非常に興味がありますが、コンピューターサイエンスの概念のほとんどを理解するために特定の言語を実際に知る必要はないと信じたいです。しかし、データ構造やアルゴリズム設計などのコンピューターサイエンスの基本的な概念に関する本や記事を読み始めると、すべての例とレッスンさえもC(そして時にはJava)で書かれているため、Cを学ぶ必要があるようです。

私の質問は、Cはコンピューターサイエンスに不可欠なプログラミング言語ですか、それともたまたまCで書かれたすべてのリソースをCで作成したのでしょうか?Cを学習せずにコンピューターサイエンスを学習できますか?


4
ここではそのことについてジョエル・スポルスキの意見は次のとおりです。joelonsoftware.com/articles/CollegeAdvice.htmlは、 それはdiscussableですが、私は彼が彼のポイントを持っていると思います。
Doc Brown

2
純粋主義者は、コンピューターサイエンスはコンピューターに関するものではなく、プログラミング言語が不要になると主張します。
Blrfl

1
「コンピューターサイエンス」とはどういう意味ですか?あなたが説明するのは、主にコンピュータサイエンスのソフトウェアエンジニアリングの部分です。また、すべてのリソースがCでどのように記述されているかを確認できませんでした。アルゴリズム/データ構造に関する本をかなり読みましたが、Cを使用したものはほとんどありませんでした。アセンブリを使用するTAOCPを除く...それは別の話です)
バクリウ

非現実?それは大学からの自動修正の奇抜であると考えられていましたか、それとも黒魔術の学校ですか?しかし、私は目に見えない大学を知っています:[
ディアハンター

回答:


31

私はここでフローに逆らって、はい、あなたはCを学ぶ必要があると言います。私は実際に他の多くの答えのポイントに同意しますが、あなたは非常に強い声明を出します

コンピューターサイエンスのすべての側面を学ぶことに非常に興味がありますが、コンピューターサイエンスの概念のほとんどを理解するために特定の言語を実際に知る必要はないと信じたいです。

(エンファシス鉱山)

オペレーティングシステムとネットワークスタックはコンピューターサイエンスの2つの大きな側面であり、すべての主要なオペレーティングシステムとネットワークスタックは主にCで記述されています。これらを理解するには、Cを学ぶ必要があります。 JavaのOSクラスですが、それは英語でホーマーを読むようなものです。

それに、Cはそれほど大きな言語ではありません。コンピュータサイエンスのすべての側面を本当に学びたい場合は、肩をすくめて「もう1つの言語は何ですか?」


私は一般的にこれに同意しますが、Cを「学習」するということは、私がその言語で自明ではないプログラムを支援なしで書くのに十分流fluentであることを意味します。そのレベルの理解がオペレーティングシステムとネットワークプログラミングの前提条件であるかどうかはわかりません。
テラスティン

3
@Telastyn:これは、オペレーティングシステムのコードとネットワークコード(Cが使用されているドメイン、それだけです)を理解し、修正するのに十分流であることを意味します。Cでゲームを書く方法、CできれいなUIとチャート作成アプリケーション、Cでグラフィックスまたはマシンインテリジェンスエンジンを作成する方法を知る必要があるという意味ではありません。CSの他のすべてのドメインには、他の言語の選択肢があるためです。
rwong

12

非常に長い間、職業としてではなく科学としてのコンピュータサイエンスの最盛期には、さまざまな大学が使用するすべてのシステムで実行される言語について、いくつかの限られた選択肢がありました。

大学ははるかに、Unixシステムを使用する傾向がありました。便利なことに、これはC.で、ホームでのUNIXのソースコードに取得し、最終的に任意のマシン上でCを学んで始まり、そして可能性C.一つにプログラムされた、学生たちは、ボーランドのTurbo Windows上のC、またはとしてCコンパイラを使用することができMPW上Mac-どこでも動作しました。

パスカルは別のオプションでしたが、プログラミングの特定の時点で、本当に必要なことを行うのに十分な言語ではないという問題がありがちでした(パスカルでOSをプログラミングするのは苦痛です)。

一部の古い学校ではFortranを学びましたが、多くの場合、より高いレベルのCSクラス(FortranのAI理論?実行可能だが痛みを伴う)を教えることができるほど強力な言語ではありませんでした。

そのため、長い間Cが選択されていました。

これが唯一の選択肢ではなく、メモリ管理などのさを扱うことなく、他の言語で内部の一部を磨き、より高いレベルの概念を学ぶことを教える多くの大学があります。これは良いと思う人もいれば、悪いと思う人もいます


いいえ、Cを学ぶことはコンピューターサイエンスを学ぶために必須ではありません。JavaまたはPythonからコンピューターサイエンスを教える他の多くの本を見つけることができます。まさにそれは長い間、Cが選択であり、学術書はゆっくりと動いていました。


記録のために、AIトレーニングは伝統的に70年代および80年代のCのエッグヘッドコンパニオン、LISPで行われましたが、答えは頭にあります。
jwrush

@jwrush私の答えは、当時の他の言語と比較して、CでAIの研究を行うことができるという線に沿っていました(LISPではなく、AIの90年代にLispクラスを取りました)。確かに、当時のMIT(eggheadsの本拠地)はLISPで多くのクラスを教えていました-それは確かに別のオプションでしたが、他の分野ではそれほど実用的ではありませんでした。授業では、各クラスで同じ基礎から学ぶことが重要でした。そのため、最初の1週間または2週間を学生にそのクラスに特化した別の言語を教える必要はありませんでした。

12

私はCに触れることなく給料の良い仕事を得て生産性を上げることができると認めますが、コンピューターサイエンスをしっかり理解すること真剣に考えている人にはCを学ぶことを強くお勧めします。

コンピューターサイエンスは、特定のプログラミング言語に関係なく学習できる概念に関するものですが、Cを学習するか、Cを使用してその分野を学習することで、よりよく理解できる分野があります。

  • アルゴリズムとデータ構造。標準Cにはこれらのほとんどがありません。これらを言語や標準ライブラリに既に実装していると、生徒にとって意欲を失わせる傾向があります。"Cのコードを見ると、Cのすべてが少数のマシン命令のみにコンパイルされるため、アルゴリズムのコストがすぐにわかります。高レベル言語(PerlやPythonなど)は、軽量構文の裏で高度なデータ構造を使用することがよくあります。コードは軽く感じますが、そうではありません。これらのコードは、アルゴリズムの複雑さについて正しく推論するために多くの知識をすでに必要としているため、これらの言語は、アルゴリズムやデータ構造の学習や、高水準言語では、パフォーマンスの問題に遭遇した場合、それらを処理できない傾向があります。

  • オペレーティングシステム。ほとんどのオペレーティングシステムはCで記述されています。呼び出しを行わずにプロセスの作成をどのように理解したいforkですか。Java VMの抽象化レイヤーはここでは役に立ちません。そして、プロセスを作成せずにそれについて話すことはさらに悪いことです...標準出力をそのウィンドウの1つにリダイレクトできるEclipseのようなソフトウェアをどのように書くことができますか?そのためのOSレベルの概念を理解する必要があり、Cでのみ直接それらに触れることができます。

  • 間接。ポインターを処理せずにCを実行することはできません。ポインターを使用すると、2つのレベルで考えるように強制されます。これにより、抽象化スキルが拡張されます。

Cの知識にはいくつかの技術的な利点もあります。

  • 言語間の相互運用性。Pythonプロジェクトに優れたRubyモジュールを統合する必要があります(ここでは2つの任意の言語に置き換えてください)。両方の言語にはCへの外部インターフェイスがあるため、それを行う唯一の方法はCを使用することです。

  • パフォーマンスが重要なソフトウェアの作成。これを行うために低レベルになることを省略することはできません。


すべてのプログラムはCで書かれるべきだとは言いません。しかし、Cは知識を助けることができます。


ポインター算術は、理由につながるため、オペレーティングシステムを理解するために重要です。たとえば、なぜヒープとスタックが異なるのか、仮想メモリのパフォーマンスが良いか悪いのか、いくつかのループが他のループよりも高速に動作するのか、など
Michael Shopsin

6

また、私はここで穀物に反して、Cの(少しユーモラスな)美的なケースを作成しようとします。一部の人々は、クラスやクラスのような高レベルの構成体の欠如など、ポインタに依存しているため、私には当てはまらないことがわかります

TL; DR:私の意見では、Cはシンプルで、良いCは読みやすく、バンギングビットに特定の喜びがあります。

Cは単純です

標準Cは、関数、ポインター、および配列からそれらを作成するためのいくつかの基本的なタイプとメカニズムのみを定義しています。その上、プリミティブからより複雑な型(構造体や共用体など)を作成するための少数の構成構造体があります。ほとんどの言語を2つの文で説明していることに注目してください。これは、コーディング中に頭の中にあまり多くの構文規則やフォームを保持する必要がないことを意味します。

シンプルは美しい

Cは不可解ではありません

多くの高レベル言語とは異なり、Cで多くの奇妙な、理解できない記号を見つけるのは難しいでしょう。Cの世界では、抽象化と「構文圧縮」の両方の主な機能は機能です。自明の構造。良いCスタイルは、ほとんど詩的で読みやすい美しさを助長します。説明のために、Linuxカーネルから次のスニペットを読んでみましょう。基礎となるデータ構造と実装の詳細を把握していなくても、次のことを理解できます。

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

関数の中央には、「電流が凍結するというまれなイベントでは、実際に凍結が起こったかどうか冷蔵庫に尋ねてください」と表示されます。スース博士はそれをもっとうまく書けなかったでしょう。

読みやすいは美しい

Cは透明です

Cステートメントに関数呼び出しが含まれていない限り、通常、実行時のコストと副作用について非常に良いアイデアを得ることができます。Cはプログラマーに制御権を与え、最終的に彼または彼女が正しいことをすることを信頼します。strlen()すべての演算子は明確に定義されたセマンティクスを持っているため、GNU Cライブラリーの実装のこのスニペット(SE用に少し再フォーマットされた)が実行されたときに何が起こるかを把握できます。Cにはオーバーロードはありません。

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

「最適化可能性」の目的のために、このプロパティは素晴らしいです。おそらく、一部の高レベル言語は高レベルアルゴリズムの簡潔な表現を簡単にします(クラスとオーバーロードを伴うC ++など)が、Cが設計された目的のために-ポータブルアセンブラーとして機能するために-Cは理想的です。場合によっては、低レベルのコードが正常に実行されると、プログラマーはある意味でマシン(またはゼロ-実装の詳細)に1つ感じます。これは、多くの正当な理由から、IMO Cが他の多くの言語がそうでないことを選んだ方法で興味深いことができるというだけで、他の言語が悪い、「十分な」、またはそのような愚かではないということではありません。

私の意見では、上記の3つのポイントは、Linuxによって私の心に具体化された複雑でありながら効率的なシステムの作成を管理可能にします。この世界は私の美的感覚に訴えるものであり、Cを次のターゲットとして検討している人には、これらの点を検討することをお勧めします。オペレーティングシステムとその他の議論は、プログラマーとして成功するためにカーネルを理解する必要はないので、明示的に述べることでよりよくサポートされると思いますが、これらの分野は主観的に説得力があるかもしれません。


3

コンピューティングの科学を議論するために使用するプログラミング言語は、コンピューティングの手段と科学を学習するタスクとはほとんど無関係です。

(ほぼ間違いなく)コンピューターサイエンスに関する独創的な研究、コンピュータープログラミングの技術は、既存の言語を使用して主題を通知しません。代わりに、ドナルドクヌースは、架空のコンピューターと架空の機械言語(および関連するアセンブリ言語)を定義し、すべてのトピックについて議論しました。

このテーマに関するもう1つの高く評価された研究である「コンピュータープログラムの構造と解釈」では、同様のアプローチを取り、LISPプログラミング言語の単純化された方言を独自のコンテキストとして機能させました。この言語は、現在Schemeとして知られています。

コンピューターサイエンスに関するもう1つの非常に優れた研究であるThe Elements of Computing Systems(実際にはコンピューターエンジニアリングとコンピューターサイエンスは同じ部分であり、非常に短い)は、デジタルロジックを教えるというより基本的なアプローチを採用しており、そこからマシン、ツールを構築します、初等のコンピュータサイエンスを教える前の言語。

だから、いいえ、Cはコンピューターサイエンスの理解に必要ではありません。重要なのは、アルゴリズムとそのアプリケーションのコア概念の理解です。


2

プログラミングのキャリアを始めたのは、vb3が付属したフロッピーディスクに付属のマニュアルからvb3を学ぶことでした。私はいくつかのJavaを学び、いくつかの立派なプログラムを作成することができましたが、大学でCを勉強するまで、「フードの下で」何が起こっているのかを本当に理解したとは感じませんでした。現在は.netのみで動作し、ポインター、無効なアドレス、またはオーバーフローについて本当に心配することはありません。 、ビット単位の演算、ブール論理、すべての強力なツールと非常に効率的です。

Cを学びましょう。それはあなたの代わりになります。私は何年もの間cプログラマーのハンドブックのコピーを保管し、KernighanとRitchieを最初から最後まで読みました。あなたがC言語を理解する上で最終的にどの言語が役立つかは問題ではありません。


1

Cを学習せずにコンピューターサイエンスを学習できますか?

答えは「はい」です。私はCSの学位を取得しており、CではなくJavaを学ぶ必要がありました。少なくとも私の学校では、オブジェクト指向プログラミングの学習に重点が置かれ、アセンブリ言語、データ構造、データベース設計に関するいくつかの教えがありました。


7
あなたの学位はCSの「すべての側面」をカバーしたと確信していますか?
SKロジック

私はすべての必要な側面を言うでしょう。学位プログラムのすべての側面をカバーする学位はありません。さらに、「すべて」は主観的です。
PhillyNJ

1
「必要」をどのように定義しますか?すべてがすべてです -つまり、可能なすべてのCSアプリケーションをカバーします。それは「主観的」ではなく、かなり定量化可能です。
SKロジック

私は、CSが元の質問に答えている特定の言語ではなく、計算とコンピューター技術、ハードウェア、ソフトウェアの研究をカバーするという文脈で「必要」を定義します。
PhillyNJ

さて、低レベル言語なしでハードウェアをどのようにカバーするのでしょうか?そのような重要な言語なしで、プログラミング言語(「すべて」のCSの非常に重要な部分)の歴史をどのようにカバーしますか?少なくとも1つの言語でポインター演算を使用しないプログラミング言語のセマンティクスをどのようにカバーしますか?何らかの形でCに似た言語が包括的なCSカリキュラムに存在している必要があります。
SKロジック

0

それは本当にあなたが学んでいることで何をしたいかによって異なります。多くのアルゴリズムがCまたはその子孫で提供されていることは間違いありません。しかし、長年にわたって、C ++、C#、およびJavaの例を見てきました。CSが教えることは、コンピューティングの一般的な理解であり、したがって、手元のタスクに適した言語を選択または作成する方法です。

ただし、最初と最後の言語がCまたはJavaのバリエーションである人はまだ多く、そのすべてがCS学位が提供する任意の言語を理解するためのトレーニングを受けているわけではありません。一部のCS卒業生でさえ、プログラミングに問題があります。そのため、キャリアパスに応じて、コミュニケーションをとることができるこれらの言語を十分に理解する必要があります。アカデミアに固執する場合、特に学際的な領域(人々がプロローグ、Lisp、ハスケル、数学などを使用する)で、コンテンツに対する言語障壁がさらに大きくなります。


-1

「コンピューターサイエンスのすべての側面」(野心的な計画!)を実際に学習する場合は、いくつかの異なるアセンブリ言語と少なくとも1つのHDLを処理する必要があります(そして、ネットリストレベルでコーディングを練習します)。

そして、これらの真に基本的なことにアプローチするためのより高いレベルのステップとして、CやPascalのようなものを選ぶ必要があります。抽象化の梯子でステップをスキップすると、逆効果になります。

とにかく、この質問は質問する価値さえありません。結局のところ、Cはほんの小さな言語です。Cを学習する必要があるかどうかを考えると、無駄に考えるよりも短い時間で基本を学習できたはずです。

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