web-dev-qa-db-ja.com

C ++は第一言語として適していますか?

地元の大学では、プログラミングの経験がなく、初年度の大学生(16歳)にC++を教えています。

最初のプログラミング言語として、C++は適していますか?

26
Ed James

強調いいえ

あなたが学生のためにあなたが念頭に置いているどんな目標のためにでも、別の言語または言語のシーケンスはより速くより良いでしょう。

"学生は低レベルの概念を理解する必要があります。"

「低レベル」のコーディングは、newからオブジェクトを取得し、それらをdeleteにフィードバックすること、およびときどきポインタが適切でない場所を指すようにすることで構成されていません。関数、クラス、およびテンプレートは低レベルではありません。 RAII、conststd::ostream::operator<<protectednewの12の使用方法は低レベルの概念ではありません。これらのことは低レベルの影響があり、数か月間または将来のクラスまでそれらをスキップして、代わりにC++セマンティクスの山を教えています。

MIPSやMMIXのような環境と教材を備えたアセンブラをお勧めします。急いでいる場合は、Cに回り道を教えて、少なくともアセンブラの出力を確認してください。これにより、C++が行う低レベルの理解がすべて得られ、一部はより速く理解できます。

"学生はオブジェクト指向を理解する必要があります。"

C++に組み込まれているオブジェクト指向は、OOの概念、または他のほとんどすべての高レベルの概念を教えるために非常に複雑です。ニースの長いリストについては、 C++ FAQ を参照してください。潜在的な理由の理由です。新しいプログラマーの場合、非常に長い時間がかかるこれらすべてのものを打たなければならないか、そうでなければ、新しいプログラマーを暗闇に残して、多くのことをスキップする必要があります。 C++を本当に知っている!

C++をまったく教える必要がある場合は、まずオブジェクト(Python、Ruby、Squeak、Common LISP、Racket)を使用して、より単純な高水準言語を学習することをお勧めします。それ以上に、多型をOOとは別の概念として、関数型言語を訪問することで学びます。

"学生はテンプレートとテンプレートのメタプログラミングを理解する必要があります。"

誰もこれを実際に尋ねることはありませんが、私は彼らがそうすることを望みます。 C++には素敵なテンプレートがあり、STLは優れていますが、C++を最初に教えるほど優先度を高くするべきではありません。とにかく、OCamlまたはHaskellの型システムを教えてから、それらの概念を改良する方が速いかもしれません。

「学生は問題解決を学ぶ必要があります。」

ええ、あなたはこれを任意の言語で取得します。手荷物がはるかに少ないため、C++以外のほとんどすべての言語で取得するとさらに多く取得できます。繰り返しになりますが、問題解決スキルではなく、学生が学ぶすべてのことのリストについては、 C++ FAQ を参照してください。

"上記すべて、1つの言語のみを使用する必要があります。"または "雇用者はそれを望んでいます。" または "Cスタイルの言語が必要です。"または...

複数の言語を教える。

1つの言語だけを教育または学習することで時間やエネルギーを節約するという考えは、まったくばかげています。これは、特定の言語の学習にちょうどXか月( HINT!HINT! )がかかるという考えに基づいています。ここで、Xは単一の数値または言語ごとの1つの数値です。これは、「要件」と「テスト」のゴミをすべてスキップすることで時間と費用を節約できるという考えとほぼ同じです。

複数の構文については、他の言語に対して極端にバイアスをかけることにより、すべての言語でC構文を期待するように教えると、学生を危険なほどに不自由にさせます。

ほとんどすべてのパスは、C++で開始するよりも高速で優れています。単純な高水準言語を学習してからC++を学習する方が速くなります。アセンブラを学習してからC++を使用すると、より高速になります。 C++以外のものを使用すれば、学生はより速くそこに到着し、起動方法をより多く知ることができます。 最初にC++を教えないでください

61
Jesse Millikan

いいえ、C++は経験豊富なC++開発者にとっても難しい言語です。最も単純なアルゴリズムであっても、言語の微妙な点の多くを説明する必要があります。 Hello Worldの例を考えてみます。

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
}

#includeコマンドとは何ですか? std::coutとはなぜ::<<とは何ですか?ああ、それは過負荷の演算子です!オーバーロードされた演算子とは何ですか?だから、intsの場合はビットシフトしますが、std::coutが何であっても、コンソールに出力します。ああ、std::coutはストリームであり、ストリームには<<および>>演算子がオーバーロードされています。

Pythonで同じサンプルを見てみましょう。

print("Hello World!")

それだけです。いくつかのアルゴリズムをコーディングしてみましょう。

54
Marco Mustapic

それはおそらく良い第一言語ではありません:複雑な構文、多くのルール、古い言語、エラーが発生しやすいメモリ管理。学生にもっと多くのことを教える方が良いOO Smalltalkのように、Pythonのようにプログラムするのにもっと良いものや、Haskellのような機能的なもの。

彼らはより良い言語を学んだ後、彼らが人生の後半にC++を学ぶことができます(彼らがそれを助けることができない場合)。

21
Andres F.

短い答え:はい!

any言語は適切な出発点ですが、特にC++(または同等のもの)だと思います。最近のC#とJavaは、使用されている主要な言語であり、これらを使用してプログラミングすることで、APIとIDEをすぐに学ぶことができますが、C++を使用すると、パフォーマンスなど、プログラミングをゼロから学ぶ機会が得られます最適化など.

.Sort();に組み込まれた言語に盲目的に依存する前に、プログラミング、ループ、ソートの基本を学ぶことは決して悪い考えではありません。

18
Mantisen

実際には、非常に実用的な理由から、おそらくそれは第一言語としての良い選択だと思います。C++を学習した後、他の言語と出会うと、簡単に習得できるようになります。

14
ennuikiller

15歳から16歳のときにC++を学びました。

魔法を他の人に任せて、自分で物事の内部の仕組みを学ぶのが良いでしょう。


端的に言うと、エントリレベルのC++構文とセマンティクスを理解できない場合、コンピューターはそれほど上手ではありません。それほど難しくありません。 「C with Classes」を回避する正当な理由はありません。

生徒がテンプレートのメタプログラミング、多態性の呼び出しの推測、複数の継承階層の解明に取り組むことを期待している場合、これは、使用する言語の種類に関係なく、エントリレベルのクラスではとんでもないことです。

学生のためにプログラミングの複雑さを隠したいという非常に悪い傾向があります。それはうまくいきません(cf SpolskyのJava学校のエッセイ)。それらの人々は、彼らの頭がまっすぐにならない場合、DailyWTFに行き着きます。リーク、それを処理する必要があるよりも悪いです。私はworkedをエントリレベルのC++学生用のTAとして使用しました。すべてを完全に非表示にするか、または明かりを入れなければなりません。マジックは学習者の敵です。

マシンコードにコンパイルする開始言語を推奨する必要がある場合、Pascalバリアントがおそらく最良のアプローチでしょう。私が覚えていることから、それはCファミリーよりも規則的で構造化されたアプローチを持っています。

10
Paul Nathan

番号。

教育言語として、C++はCよりもわずかに優れています。Cは、最悪の教育言語の1つです。それは多くの複雑さを前もって導入します、言語のいくつかの部分は深く直感的ではありません、そしてほとんどの時間は一般的なプログラミングよりもC++についてより多くを学んでいます。

C++(またはC)が悪い言語である、または学ぶ価値がないと言っているのではありません。 Pythonなど、より優れた教育言語が利用できることだけです。

8
John Bode

私は「いいえ」と言います。プログラミングを学びたいという熱意と欲望があり、大学での最初の年にC++をすぐに使い始めました。 C++を別の言語であるかのように教えていた教師(言語や実際のアプリケーションの概念ではなく、彼らにとって意味のある概念)と結合し、毎週すぐにプロジェクトがスローされて、私はクラッシュし、クラスの半分。教えられたことを消化し、実験し、適用することさえできるようになるまでに、私はテストを兼ねたプロジェクトの宿題に苦労しました。 100レベルではなく200レベルのコースだったと思います。

私は本当に最善を尽くしました。私は同情を求めなかった、それが挑戦であることを知っていた、しかし先生は私を助けさえしなかった。私がしていたように、ちょうど私に教科書を読みに行くように言った。

私は、RubyまたはPythonは、誰かをプログラミングの世界に引き込むためのはるかに優れた言語です。 、より明確な構文。

8
Kevin

高等教育には、大学と専門学校の2つの基本的なタイプがあります。違いは、卒業後の準備をしたいということです。自動車分野では、あなたがメカニックになるかメカニカルエンジニアになるかです。

とはいえ、エンジニアになりたい場合はC++が優れた第一言語であり、メカニックに相当するプログラミングになりたい場合はお粗末な言語です。

C++のイントロクラスは、データ型、定義、宣言、ポインタ、メモリ割り当てなどについて多くの時間を費やします。これらは、いくつかの学期を費やして有用なことができるようになるまでに費やしたいが、そこに着くと複雑さの度合いを処理するための基盤があることを知りたい場合に最適な基盤です。

一方で、何かもっと便利なことをすばやく実行したいが、ドメインと複雑さが制限されているかどうかを気にしない場合は、それらすべての時間を前にそれらの下位レベルの概念に費やすことは無駄になります。優れたhtmlフォームバリデーターを記述できるプログラマーはたくさんいますが、デバイスドライバーの設計方法の手がかりはありません。

7
Karl Bielefeldt

承知しました。私の最初の言語はCでしたが、それは本当にクラスをC++に簡単にするためだけのものでした。 Java大学に着くと、はるかに扱いやすくなりました。C++の学習曲線は少し急になるかもしれませんが、適切に教えられれば問題ありません。

いいえ、C++は第一言語としては適していません。ここに示すように、多くのプロのプログラマーがこの意見を共有していますが、これはプロの教師も持っている意見です。

カーネギーメロン大学の学部長からの report は、新入生向けのプログラミングの入門コースにC++を使用することについて述べなければならないものです。

CやC++などの標準言語は、その複雑さと欠陥が非公式な推論技法と機械化された推論技法の両方を妨げるため、このコースには適していません。

CMUには、必須コースと機能コースの2つの入門コースがあります。関数型プログラミングにはSMLが選択されました。命令型コースで何が選ばれたかはわかりませんが、レポートではCのサブセットの使用について言及しています。

4
Joh

いいえ、絶対にありません。

私のやり方があったら、それを学術的な設定で使用することをほぼ完全に拒否します。すでに作られたものに反する理由のためではなく、あまりに多くの人がC++(またはそのバリエーション)がほとんどすべての問題の答えであると考えているためです。プログラミングのドライバーです。

一部の人々は、仕事のための完全に合理的なツールであるネジを締めるためにそれを使用します。他の人はそれをこじり棒のように使用しますが、効果的ですが、実際には理想的ではありません。なぜなら、あなたの父親があなたに言ったかもしれませんが、ドライバーはこじり棒ではありません。こじりが遭遇するような力のために。さらに、パンチやチゼルとして試して使用する人もいますが、ほとんどの場合、ドライバーのハンドルはパンチやチゼルが耐えられるように設計されているような衝撃的な誤用のために作られていないため、問題が発生します。

私の意見では、プログラマーの仕事は、一般に実際の問題を自動化して、ある程度の効率(タスクへのリソースのコミットメントを減らす)、速度(タスクを実行する時間を減らす)、予測可能性(再現性を高める)を提供することですタスクの)、または組織(タスク間の関係の意識を高める)。

プログラムを実行するすべての人がコンピュータの低レベルの操作、特にデバイスIOとメモリ割り当て)に関する共通の知識を持っている必要があることは理解できますが、その知識を実際にあらゆる人に利用する必要があることは間違いなくまれです大部分のタスクでそれを活用することは言うまでもありませんが、問題のより広いコンテキストを理解せずに活用しようとすると、努力に不必要なリスクが生じます。

Cとその派生物が解決する問題のクラスは、現在および将来の問題の恣意的に大きな割合には適切ではないため、最初のプログラミング言語はC/C++または類似のバリアントである必要があります(救出する必要がある場合を除いて)以前は、ドライバープログラム)、そして実際には、次の問題のごくわずかなセットです。ほとんどのプログラマーは、相互接続された小型のモバイルデバイスの普及にかかわらず、コアOS機能や直接デバイスインターフェイスの開発に近づくことは決してありません。ほとんどの人が私たちのように働き、生活します。 2世代以上前のコードを修正して段階的に廃止するか、すでに時代遅れになっているテクノロジーに実装するか、killer(x + 1)アプリでテクノロジーの周辺で作業します。

第一言語として、軽量でありながら機能が豊富なLabViewのバリエーションであるLego NXTを見てみます。レゴNXTは商業ベンチャーではあまり使用されていませんが、「センサーリッチ」な方法でプログラミングすることの基本的な性質を示しています。 JavascriptやTCL/TKのようなプラットフォームに中立なスクリプト言語と組み合わせるかもしれません。どちらも、非常に基本的で効果的なタスクを実行するために発見する必要がある点で比較的影響が少なく、フィードバックループと高い柔軟性により、さまざまな程度の問題の複雑さを導入および解決できます。さらに、缶詰の環境で提供されるものを超える可能性を探求するために進む学生に良い機会を提供します。デバイスの暗い、湿った、低レベルの場所での作業を試す機会IOオーバーヘッドの少ないカスタムドライバ。

彼らが4気筒オートマチックを運転することを学んだ後、彼らが本当に興味があり、やる気があるなら、それらを大きなv8手動ホットロッドにステップアップします。ジョエルが足元の石の下にロックスターのプログラマーを見つけることができない場合、彼は他の場所を探し続けるか、ツールボックスにドライバーの束以上のものを必要とする理由を再考する必要があるかもしれません。

2
JustinC

承知しました。 1年生が理解しやすい他の言語もあります。ただし、教師がC++の概念をゆっくりと導入できる方法があります。

2
jzd

間違いなく、C++が最初の言語になる可能性があります。しかし、それはそれがいかによく教えられているかについてです。

誰もが言うには、第一言語は非常に理解しやすいものでなければなりません。しかし、私の要点は、ほとんどの人が学部レベルでプログラミングを始めるということです。だから、あなたは彼らが把握できるものを教えることができます。 C++を使用すると、プログラミングの低レベルから高レベルに移行できます。

2
Gulshan

私が大学にいたとき、C++は大学1年生を通して教えられた基礎言語でした。理論には、いくつかの複雑なプログラミング概念が含まれているため、それを習得できれば、他の言語を習得できるというものでした。それは私に良い土台として役立った。

そうは言っても、私は私の上級年に、委員会に参加してコア言語をJavaに切り替えるかどうかを決定しました。いくつかの著名な雇用主や学部の同窓生と話をした後、Javaへの切り替えが学生の最大の関心事であることが判明しました。私たちが話し合った雇用主は、人々に彼らを雇うために彼らが使っていた言語。私は今、10年経った今でもJavaをコア言語として使用していると思います。

同様に、C++の優れたスキルを備えた最近の大卒者を2名採用する予定です。見つかりませんでした。

1
SchwartzE

はい。しかし、どの言語も実際に第一言語になることができます。 C++は、複雑で時々難しいものの、本当に何ができるかを示している(制限が少ない)ため、良いと思います。また、他の言語に挑戦する準備をするのに役立つオブジェクト指向のデザインがいくつかあります。

C++が私の最初の言語でしたが、それが良かったと思います。 OOP=マインドセットの早い段階で考えさせられたので、私はそれを感謝しています。しかし、結局のところ、それは本当にあなたがやりたいことにかかっています。言語は重要ではありません。 1つの言語で上手くいけば、別の言語を選択するときに問題が発生しない可能性が高いからです。どうしますか?ゲームを作成しますか?携帯電話用のプログラム?それぞれに適したツールと言語を用意しますそれのための。

1
user16281

C++はエキスパート言語であり、初心者ではありません... JavaまたはC#またはPythonではなくCと最初に言います...なぜですか?Cはあなたの記憶といくつかに注意するようにあなたに教えるのでポインターがすべての言語に "非表示"であるにもかかわらず、どこにでも存在するなどのトリッキーな概念。メモリを解放する必要がある理由を理解できず、ガベージコレクターがクリーンアップする小さな小人ではないと信じている若い開発者がたくさんいます。すべてのコーディングのクラップ:XXXXGb RAMがあっても、インスタンス化し、インスタンス化して爆発します...しかし、ガベージコレクターが単にすべてを魔法のように掃除していない理由を理解していません!そして、この種の開発者がコーディングしているところを見てきました。 C++(およびCorbaではさらにおかしなこと)であり、それは虐殺でした!!!!!!!!!!したがって、Cでコーディングを学び、オブジェクトの概念とすべての砂糖についてPython/Java/C#に行くことをお勧めしますそれをすべて理解したら、C++に行き、C++の力を感じますが、そのすべての危険性とその理由も発見します誰も使用しないでください;)

1
mandubian

初心者がC++で間違いを犯しやすいポイントのいくつかは次のとおりです。

テストしたい場所で課題を作成する= vs ==

行方不明;

中括弧の読みやすさ対Pascalの始まりと終わり

そして、混乱するすべてのインクルードファイル、マクロ、メモリ管理などがあります。

だから私はC++が最初に最適な言語ではないと言います-しかし、あなたがそれを学んだとき、それが非常に役立つことができることは間違いありません。

私は-他の人も示唆しているように-C#、Javaまたは多分VB-そして良いIDEエラーからの回復を容易にするためのハイライト、デバッガーなど。

1
Rune Andersen

番号。 C++には非常に多くのものがあり、初心者が理解するのが難しくなっています。 「すべてのプログラミング言語は等しい」という誤解に陥らないでください。

BasicまたはPascalで開始し( "the are are deprecated"のものは無視してください)、後でC/C++/Java/C#/ Perlを使用します。または、機会があれば、まずLogo&Karel、次にBasicまたはPascalを使用します。

P.D.一部の大学や同僚には、プログラミング言語の使用法と比較のクラスがあり、私はそのクラスを教えたことがありました;-)

1
umlcat

私は中学校でC++から始めました。私はこの本のコピーを手に入れました: C++ How to Program by Deitel and Deitel 。この本はかなり良いです。

率直に言って、ここには正解も不正解もありませんが、C++は理解しやすいことが個人的にわかりました。 OOP(私は "this"につまずきましたが、どうしてそれがどうしてそれを手に入れることができなかったのかわからないのです)にたどり着きました。それを試してください。行き詰まった場合は、行き詰まった場合は、他の言語をチェックして、新しい言語を学習し続けてください。2〜3種類の形式で同じ概念を見ると、それらをよりよく理解できるという考え方です。先ほど述べたように、「この"ポインターは私を混乱させましたが、Python(代わりにselfと名付けられました)で同じものを見つけたとき、それはC++で理解していたのですぐに理解できました。学ぶことJavaできるだけ多くの大学で教えることができます。pythonまたはRubyこれは言語デュジャーであり、よりニッチな分野を探求できるため、/Clojure(および他のすべてのLisp)、Haskell、Scalaなどの新しいもの...

0
nkassis

「適切」が「可能」を表す場合、はい。 「良い」なら、間違いなく。

C++を好きになることも、愛することも可能ですが、いくつかの言語をよりよく学び、ティールライフの腐ったコードベースを数十年使って、「実際に機能する重要なソフトウェアの作成」の経験を積むと、C++に魅力が生まれます。

あなたが未経験で、小さくて単純な(しかし興味深いと思われる)問題をいじるときは、最初はそうではありません。

私はpythonから始めて、SICP(スキーム)、またはそれに似たものを続けます。多分逆転またはインターリーブされます。それらを使用すると、問題に対処することができます。システムと戦う代わりに、深い泥の中を歩き、あらゆる種類の非論理的な癖とその歴史的な理由を学びます。

後で、紙の袋から出す方法をすでにプログラムできるようになったら、ベアメタルに切り替えます。アセンブリの方法といくつかのアーキテクチャ、さらにはKnuthのミックスについて学習します。メモリ、レジスタ、ALU、キャッシュ、割り込みを理解し、読み取りレベルを取得するためだけに、オペコードを暗記したり、実際に多くのことをしたりするわけではありません。

その後、その基盤により、C++を含む他の言語に触れることができます。その間に「言語の歴史と進化」を加えるのは良い考えかもしれません。

0
Balog Pal

プログラミングの基礎を学ぶために任意の言語を選択できます。私はC/C++でいろいろなことを学びました。しかし、7年後、私の学校ではツールや言語が変更され、Java/C#を好むようになりました。言語は単なるツールです。あなたが良くなるために必要なのは基本です。例えばin MIT人々はpythonを使用してアルゴリズムの基礎を学びます。例えばJavaはWebプログラミングに適しているかもしれませんが、C/C++はサービスや高性能アプリケーションに適しています。したがって、状況によって異なります。

0
sarat