C ++の父、Bjarne Stroustrup:C / C ++言語を学ぶ方法

C ++の使用の成長と性質は、C ++の学習方法に強く影響されています。このことから、C ++の教え方や学習方法を理解していないと、理解しにくい場合があることがわかります。この知識がないと、C ++の急成長のいくつかの側面を理解できない場合があります。

比較的初心者にC ++を効果的に教える方法、および学習したことを効果的に使用できるようにする方法に関して、これらの問題は長い間C ++の設計に影響を与えてきました。私は多くの教育作業を行いました。少なくとも、特定の研究者(専門教育者ではない)を教えるために多くの作業を行いました。私は常に自分の考えを広めようとしましたが、自分自身や他の人が教えた人々が書いた実際のプログラムを観察することには多くの成功と失敗があり、これらはC ++の設計に重要な影響を与えました。

数年後、方法が徐々に現れました。最初にいくつかの概念を強調し、次に概念と主要言語機能の間の関係を強調します。最初に各言語機能の詳細を書き留め、次に人々がそれらを知る必要があるまでそれを学びます。この方法が失敗する場合は、それをサポートするように言語を変更してみてください。この相互作用により、言語は徐々に設計に適したより良いツールに成長しました。

一緒に仕事をしている人や教えている人は、基本的にはプロのプログラマーやデザイナーです。彼らは仕事で学ぶ必要があります。新しいテクノロジーを学ぶために数週間または数か月を費やすことは不可能です。ここから、C ++を設計するための多くのアイデアも開発されたので、人々は徐々にそれを学び、徐々にその機能を採用できるようになります。C ++の構成により、その概念をほぼ直線的に学習し、その過程で実用的なメリットを得ることができます。さらに重要なことに、あなたの利益は費やされたエネルギーにほぼ比例することができます。

プログラミング言語、言語機能、プログラミングスタイルなどに関する多くの議論は、実際にはこれらの機能自体ではなく、プログラミング言語機能の教育に重点を置いていると思います。多くの人にとって、最も重要な質問は次のとおりです。

新しいテクノロジーや概念を学ぶ時間がないので、この状況でC ++を効果的に使い始めるにはどうすればよいですか?

言語がこの質問にC ++よりも十分に答える場合、このレベルのプログラマーは通常選択肢を持っているため(そして選択する必要があるため)、人々はその言語を選択します。1993年の初めに、lang.c ++でこの質問に次のように答えました。

「C ++の「最良の」使用法は、多くの概念とテクノロジーを深く理解し、特定のフリーホイーリング状態に達した後であることは明らかです。しかし、この状態を達成するには、数年間学習して実践する必要があります次の方法は通常は機能しません。つまり、初心者(一般的なプログラミングの初心者ではなくC ++の初心者)に伝え、最初にC、Smalltalk、CLOS、Pacsal、ML、Eiffel、アセンブリ言語、高性能にアクセスしますシステム、OODBMS、プログラム検証技術などを完全に理解し、学習したコースを次のプロジェクトのC ++に適用します。これらのトピックはすべて、学ぶ価値があり、長期的な観点からはそれは確かに役立ちますが、実際のプログラマー(および学生)は、プログラミング言語とテクニックを詳細に学習および研究するために、何年にもわたっています。

さらに、ほとんどの初心者は、「少しの知識は危険なこと」であることを知っており、保証が得られることを期待しています。次のプロジェクトの前/間に、時間をかけて小さなことを学ぶことができます。 (プロジェクトを混乱させたり妨げたりするのではなく)成功を手助けする。彼らはまた、すぐに吸収できるこの小さな新しいものは、孤立したスキルではなく、自分が本当に望んでいる完全な理解に導き、どこへでも行くことができるスムーズな道の一部であると確信したいと考えています。もういや。

当然、これらの基準を満たす方法は複数あるはずですが、どちらを選択するかは、個人の背景、現在のニーズ、および考えられる時間によって異なります。インターネットで意見を述べる多くの教育者や人々がこの問題の重要性を過小評価していると思います:一般に、個々の人々をケアする代わりに多数の人々を「教育する」ことには、コストがかかるようですはるかに効果的で簡単です。

以下のいくつかの一般的な問題を検討してください。

CやC ++がわかりません。Cを最初に学ぶ必要がありますか?OOPを実行したいので、C ++を学ぶ前にSmalltalkを学ぶべきですか?最初にOOPLとして、またはより優れたCとしてC ++を使用する必要がありますか?C ++の学習にはどのくらい時間がかかりますか?

私はこれらの質問に対する唯一の答えがあると言っているわけではありません。前述のように、「正しい」答えは状況によって異なります。ほとんどのC ++教科書の作成者、教師、プログラマーは、独自の答えを持っています。私の回答は、長年のC ++およびシステムプログラミング言語でのプログラミング、短いC ++設計およびプログラミングコース(主にプロのプログラマー向け)の指導、C ++の紹介とC ++の使用に関するコンサルティング、C ++言語の説明、および自分自身の回答に基づいています。プログラミング、デザイン、C ++言語の一般的な考え方。

CやC ++がわかりません。Cを最初に学ぶ必要がありますか?いいえ、まずC ++を学びます。C ++のCサブセットは、C / C ++の初心者にとって学習しやすく、C自体よりも使いやすいです。その理由は、C ++(厳密な型チェックによる)がCよりも優れた保証を提供するためです。さらに、C ++は演算子newなどの多くの小さな機能も提供します。これは、C言語の同等の機能よりも便利でエラーが発生しにくい機能です。このように、CとC ++(C ++だけでなく)を学習する予定がある場合は、Cの遠回りをしないでください。Cをうまく使用するには、多くのトリックやテクニックを知っている必要があります。これらはCの場合ほど重要ではなく、C ++のどこでも一般的に使用されるものではありません。優れたCの教科書は、将来的にCで大規模なプロジェクトを完了するために必要となるさまざまな手法を(合理的に)強調する傾向があります。優れたC ++教科書は異なり、データの抽象化とオブジェクト指向プログラミングを行うためのテクニックと機能を強調しています。C ++のさまざまな構造を理解し、それらを(下位レベルの)Cで置き換えることを学ぶことは非常に簡単です(必要な場合)。

私の好みについて話す:Cを学ぶには[Kernighan、1988]を使用し、C ++を学ぶには[2nd]を使用します。両方の本の利点は、2つの側面が組み合わされていることです。一方では、言語の機能と技法の説明的な説明であり、もう一方は完全なリファレンスマニュアルです。どちらも特定の実装ではなく、それぞれの言語を説明していません。また、特定の実装でリリースされた特別なライブラリについても説明していません。

いろいろなスタイルの良い教科書や資料がたくさんありますが、上記は関連する概念やスタイルを理解するための私の好みです。片側性または欠陥の可能性を補うために、少なくとも2つの情報源を慎重に選択してください。これは常に賢明な方法です。

OOPを実行したいので、C ++を学ぶ前にSmalltalkを学ぶべきですか?しない。C ++を使用する場合は、C ++について学習します。C ++、Smalltalk、Simula、CLOS、Eiffelなどのさまざまな言語はそれぞれ、抽象化や継承などの主要な概念について独自の見解を持っています。各言語はこれらの概念をわずかに異なる方法でサポートし、異なる設計概念もサポートしています。Smalltalkを学ぶことは、もちろん多くの貴重なことを教えることができますが、C ++でプログラムを書く方法を教えることはできません。実際、SmalltalkとC ++の概念と技術を学び、消化する十分な時間がなければ、Smalltalkを学習ツールとして使用すると、C ++の設計が不十分になります。

もちろん、C ++とSmalltalkを同時に学べば、幅広い分野で経験と例を得ることができますが、これはもちろん最も理想的です。しかし、すべての新しい概念を消化するのに十分な時間を費やせない人は、しばしば「C ++でSmalltalkを作成する」ことになります。つまり、C ++にうまく適合していないSmalltalk設計概念を使用することになります。この方法で作成されたプログラムは、CやFortranをC ++で作成するようなものであり、最良のものとはかけ離れています。

Smalltalkを学ぶ一般的な理由は、Smalltalkが「非常に純粋」であるため、人々が「オブジェクト指向」の方法で考え、プログラミングすることを余儀なくされることです。言及することを除いて、私は「純粋な」問題について深く議論したくありません。一般的なプログラミング言語は、複数のプログラミングスタイル(パラダイム)をサポートする必要があります。

ここでの問題は、Smalltalkに適しており、Smalltalkによって十分にサポートされているスタイルが必ずしもC ++に適していないことです。特に、Smalltalkスタイルを模倣すると、C ++プログラムをC ++で維持することが非効率的で醜く、困難になります。その理由は単純で、優れたC ++プログラムに必要な設計は、C ++静的型システムを利用するのではなく、それを利用できるはずです。Smalltalk(のみ)は動的型システムをサポートしており、このビューをC ++に変換すると、広範囲にわたる不安定性と醜い強制につながります。

C ++プログラムのほとんどのキャストは、デザインが悪いことを示しています。一部のキャストは非常に基本的ですが、ほとんどはそうではありません。私の経験では、従来のCプログラマーはC ++を使用しており、Smalltalkを介してOOPを理解しているC ++プログラマーが強制を最もよく使用します。使用される変換のタイプは、より注意深い設計によって回避できます。

さらに、Smalltalkは、継承を唯一の、または少なくとも最も基本的なプログラム編成方法と見なすことを人々に奨励し、1つのルートのみを持つ階層にクラスを編成することを奨励します。C ++では、クラスは型であり、プログラムを編成する唯一の方法ではありません。特に、テンプレートはコンテナークラスを表す最も基本的な方法です。

私はまた、人々がオブジェクト指向のスタイルでプログラムを書くことを強いられる必要があるという主張に非常に懐疑的です。人々が学びたくないなら、あなたは彼らを合理的な時間で教えることはできません。私の経験によれば、本当に学ぶ意欲のある人が不足することはなく、時間とエネルギーを費やすことが最善です。データ抽象化とオブジェクト指向プログラミングの背後にある原則をどのように表現できるかを理解できない限り、これらの概念をサポートする言語機能を不適切に、不適切な「バロック」で使用することしかできません'フォーム[2]-C ++、Smalltalk、その他の言語のいずれか。

「C ++プログラミング言語」(第2版)[第2版]、特に第12章を参照してください。C++言語の機能と設計の関係について詳しく説明されています。

最初にOOPLとして、またはより優れたC言語としてC ++を使用する必要がありますか?状況によります。なぜC ++を使い始めたいのですか?この質問に対する答えは、万能な真実がないC ++へのアプローチ方法を決定する必要があります。私の経験によると、最も安全な方法は、C ++をボトムアップで学習することです。つまり、最初にC ++が提供する従来の手続き型プログラミング機能(Cのより優れたサブセット)を学習してから、次に進むことを学びます。これらのデータ抽象機能を使用およびフォローし、後でクラス階層を使用して関連するクラスのセットを編成する方法を学びます。

私の意見では、初期段階を速すぎて通過することは非常に危険です。そのため、いくつかの重要な概念を無視する可能性が非常に高くなります。

たとえば、経験豊富なCプログラマーは、Cのより優れたCサブセットは「非常によく知られている」と考える可能性があるため、最初の100ページ、または教科書のこの側面を説明するページ数をスキップします。しかし、そうすることで、Cプログラマーは、関数のオーバーロード機能、初期化と割り当ての違いに関する説明、オペレーターnewによるストレージの割り当て、参照に関する説明、そしておそらく他のいくつかを見ることはできません。小さな機能。後の段階では、彼らは飛び出してあなたを巻き込み続け、現時点では、いくつかの真に新しい概念が複雑な問題で役割を果たしています。より優れたCで使用されている概念がわかっている場合、これらの100ページを読むのに数時間しかかからない可能性があり、詳細のいくつかは興味深く、有用です。読んでいない場合は、後で時間がかかる場合があります。

一部の人々は、この「段階的なアプローチ」が人々をC言語スタイルで永遠に物事を書くように導くだろうという懸念を表明しました。もちろん、これは起こり得る結果ですが、ある割合の観点からすると、そうすることは、教育において「純粋な」言語または強迫的な方法を使用するよりも確実に信頼性が低いとは言いがたいです。重要なのは、C ++をデータ抽象化言語やオブジェクト指向言語としてうまく使用するには、いくつかの新しい概念を理解する必要があり、それらがCやPascalなどの言語に正反対であることを理解することです。

 

C ++は、いくつかの古い概念を新しい構文で表現するだけのものではありません。少なくともほとんどのプログラマにとってはそうではありません。これは、トレーニングだけでなく、教育の必要性を暗示しています。新しい概念は、実践を通じて学び、習得する必要があります。試行錯誤した古い作業習慣を再評価する必要があります。「古い伝統的な方法」で急いで進むのではなく、新しい方法を考える必要があります。通常、新しい方法で物事を行うことは、古い方法よりも、特に初めての方が難しいはずです。また時間がかかります。

多くの経験から、ほとんどのプログラマーにとって、重要なデータの抽象化とオブジェクト指向のテクニックを学ぶために時間とエネルギーを費やすことは非常に貴重です。通常、3〜12か月という、メリットを生み出すのに長い時間をかける必要はありません。このエネルギーを費やさずにC ++を使用するだけでもメリットがありますが、最大のメリットは、新しいコンセプトの学習にエネルギーを費やした後です。私の質問は、このエネルギーを使いたくない人がいるなら、なぜ切り替えるかです。 C ++に来てください。

C ++との最初の接触、または初めての接触に多くの時間を費やした後、少し時間をかけて良い教科書またはいくつかのよく選択された記事を読んでください(C ++レポートとC ++ジャーナル)そのような記事はたくさんあります)。また、いくつかの主要なライブラリの定義とソースコードを確認し、それらで使用されている概念と手法を分析することもできます。これは、すでにC ++を使用したことがある人にとっても良いアイデアであり、これらの概念と手法を確認するプロセスでは、多くのことができます。C ++が最初に登場して以来、C ++言語とそれに関連するプログラミングおよび設計手法で多くのことが起こりました。「C ++プログラミング言語」の第1版と第2版を単純に比較するだけで、この発言を人々に信じさせることができます。

C ++の学習にはどのくらい時間がかかりますか?状況にもよります。それはあなたの経験とあなたが「C ++を学ぶこと」が何を意味するかによる。ほとんどのプログラマーにとって、構文を学び、より優れたCスタイルでC ++を記述し、さらにいくつかの単純なクラスを定義して使用するのに1〜2週間しかかかりません。これが最も簡単な部分です。主な困難は、新しい定義とプログラミング技術を習得することです。これは、最も興味深く、やりがいのある部分でもあります。私と話し合った経験豊富なプログラマーのほとんどは、C ++に本当に慣れ、それがサポートするデータ抽象化とオブジェクト指向テクノロジーを習得するまでに半年から1年半かかると述べています。彼らは通常、この期間中に仕事で生産を学び、維持していると想定され、プログラミングには特定の「それほど大胆ではない」スタイルのC ++も使用します。C ++の学習にすべての時間を費やすことができれば、より早くそれに適応できるでしょう。ただし、新しいアイデアやデザインが実際のプロジェクトに適用される前に、この適応は誤っている可能性があります。オブジェクト指向プログラミングとオブジェクト指向設計は、理論的なトレーニングではなく、基本的に実践的なトレーニングです。小さなおもちゃのような例に使用したり、使用しないでください。これらのアイデアは、盲目的にフォローする危険な傾向に発展する可能性があります。

C ++を学ぶために最も基本的なことは、言語の詳細ではなく、プログラミングと設計のテクニックを学ぶことであることに注意してください。教科書の勉強が終わったら、[Booch、1991] [4]のようなデザインに関する本を提案します。この本には、5つの言語を使用したより長い例がいくつかあります(Ada、 CLOS、CLU、C ++、Smalltalk、およびObject Pascal)、言語の狭さをある程度回避することが可能であり、狭さはデザインに関する多くの議論を台無しにしています。この本で、私のお気に入りの部分は、設計の概念と例を説明する章です。

設計方法に焦点を当てることは、C ++の定義の詳細(ARMなど、C ++でのプログラミング方法に関する情報が含まれていないARMなど)に細心の注意を払うこととは大きく異なります。詳細に焦点を合わせると、人々はめまいを起こしやすく、言語をまったく使用できなくなります。辞書や文法から外国語を学ぼうとは思わないでしょう?

C ++を学ぶ場合、最も基本的なことは、主要な設計概念を覚えて、言語の技術的な詳細に迷わないようにすることです。これが可能であれば、C ++の学習と使用は非常に興味深く、効果的です。Cと比較して、少しのC ++を使用すると多くの利点がもたらされる可能性があります。データの抽象化とオブジェクト指向テクノロジーの理解にさらに努力すると、さらに多くを得ることができます。

このビューは包括的ではなく、ツールとライブラリの現在の状態に影響されます。より保護された環境(たとえば、広範な自動ランタイムチェックを含む)と小さな明確に定義されたベースライブラリがある場合は、より早くC ++の大胆な使用に移行できます。これらは、C ++の言語機能に重点を置くことから、C ++でサポートされる設計およびプログラミング技術に重点を置くことへの大きなシフトをより適切にサポートします。

文法への関心を広め、言語の技術的な詳細に時間を費やすことも非常に重要です。一部のベテランプログラマーは、これらの詳細をいじるのが好きです。新しいプログラミング技法を学ぶことへのそのような関心と消極は、しばしば明確に区別することが困難です。

同様に、すべてのコースとすべてのプロジェクトで、常にこのような人々がいます。彼らは、C ++の機能が手頃な価格であるとは考えていないため、彼らはより慣れ親しんでおり、後の作業で信頼できるCのサブセットを使用することを強く求めています。個々のC ++機能とC ++で記述されたシステムの実行効率に関するデータはわずかしかありません(たとえば、[Russo、1988]、[Russo、1990]、[Keffer、1992])。これらの人々が長期的に揺さぶられる可能性は低いですそして確かに、Cよりも便利なメカニズムを提供することは不可能です。このプロパガンダの量を、言語またはツールの分野で満たされていない約束の量と比較すると、この主張には懐疑的であり、より明白な証拠を要求する必要があります。

どのコースやプロジェクトでも、効率は重要ではないと確信し、より一般的な方法でシステムを設計する傾向がある別の種類の人が常にいます。その結果、最先端のハードウェアでも観察可能な遅延があります。 。残念ながら、C ++の学習中におもちゃのプログラムを作成する場合、この遅延を観察することは難しいため、このような問題は、実際のプロジェクトに遭遇するまで取り残されることがよくあります。私はシンプルだが実用的な問題を探していました。それが過度に一般的な方法で解決された場合、それは優れたワークステーションを打ち負かす可能性があります。このような質問をすることで、極端な楽観主義者に抵抗する傾向のある設計の価値を証明できます。慎重に考えることで、パフォーマンスを大幅に改善でき、非常に慎重で保守的な人々に対応できます。

この記事は、最新の「C ++言語の設計と進化」からの抜粋です。

「C ++言語の設計と進化」

[アメリカ] Benjani Straustrup、[、Bjarne、Stroustrup、]、Qiu Zongyan訳

エディターズチョイス

1.この本の著者、Bjarne Stroustrup(Benjani Stroustrup)は「C ++の父」として知られており、この本は著者の最も重要なプロの作品の1つでもあります。

2.北京大学数学学部の情報科学学部の教授である翻訳者Qiu Zongyanは、著名なプログラミング専門家であり、「問題からプログラムへの導入-プログラミングとC言語」、「データ構造とアルゴリズム:Python言語記述」の著者でもあります。 "待つ;

3. C ++の包括的作業:C ++言語の開発履歴、設計概念、技術的詳細について説明します。C++言語メカニズムの設計と開発の解釈は非常にまれであり、貴重な情報です。

簡単な紹介

この本は、C ++言語に関するC ++デザイナーのBjarne Stroustrupの最も重要な著作の1つです(もう1つは「C ++プログラミング言語」です)。この本では、C ++の歴史と開発、C ++のさまざまな重要なメカニズムの性質、重要性、設計の背景、これらのメカニズムの基本的な使用方法と使用方法について包括的に説明し、C ++の応用分野と将来の開発について説明します。見込み。この本は、人々がC ++言語を理解するのを助ける上でかけがえのない立場にあり、C ++言語に関心を持ち、学び、使用するすべての専門家、研究者、教師、学生にとって一読の価値があります。この本では、プログラミング言語、システムプログラミング、オブジェクト指向の技術と方法、ソフトウェアシステムの設計と実装技術などに関連する多くの問題についても、実用的な観点から説明しています。現場のコンピュータワーカーと学生のための参考資料と関連する問題。

おすすめ

転載: blog.csdn.net/epubit17/article/details/108696115