C ++の深い知識は、他の言語をより速く/より簡単に学ぶのに役立ちますか?[閉まっている]


9

C ++のすべての主要な側面を学び、言語の基礎をよく知っている人が、他の言語(Python、Perl、Javaなど)をより速く簡単に学ぶ可能性はありますか?


9
C ++は他のほとんどの言語とは十分に異なっているため、他の言語を選択するのがさらに難しくなります(知っている唯一の言語の場合)。多くの言語はC ++の構文を共有していますが、まったく同じ方向に進化した言語はほとんどありません。C ++には、C ++にのみ固有の多くの歴史的な残骸があります。新しい言語をすばやく習得する最善の策は、さまざまなパラダイムからさまざまな言語を学ぶことに集中することです。慣れ親しんだパラダイムが多ければ多いほど、それらのパラダイムから他のものをより速く拾うことができます。
KChaloux、2015年

3
C ++を知っていることで他の言語全般を学ぶ上で有利になるとは思いません。それはあなたがこれから学ぶ他のどの言語に依存します。私のプログラミング言語の教授は、一般的な概念の理解に集中する必要があると言っていました。これにより、個々の言語の学習がはるかに容易になります。
Giorgio

9
言語固有のノウハウと一般的な知識を混同する可能性があることを除いて、1つの言語を深く学ぶことは、プログラミング一般を学ぶ上での良い出発点です。現代のC ++は素晴らしい言語ですが、中級レベルに到達すると、他の既知の視点に到達することで多大な利益が得られます。OCamlとRubyを真剣に使用しない場合でも、おそらく見てみてください。安定したプログラマになり、言語固有のものと一般的なものを区別できるようになると、習得には常に時間がかかりますが、新しい言語で生産性を上げることはかなり簡単になります。
2015年

1
何と比べて?他の言語をよく学び、C ++をよく知っているが、深くはなく、まったく何も知らない?
Telastyn、2015年

2
はい、しかし逆もまた同様です。OcamlまたはSchemeを知っていると、C ++ 11の多くの新機能が理解しやすくなります
Basile Starynkevitch

回答:


12

一般的な条件で

プログラミング言語に関する深い知識があれば、他の言語をすばやく習得するのに役立ちます。それは部分的にそうです。なぜなら、プログラミングは構文を学ぶことよりも思考する方法だからです。ほとんどのプログラミング方法は、他のほとんどのプログラミング言語に当てはまります。そのため、常に2番目のプログラミング言語を最初のプログラミング言語よりも早く習得すると人々は言っています。

特定の条件で

C ++は、他の言語よりもはるかに優れた「制御」を可能にする言語です。これは良いことも悪いこともあります。 たとえば、実際の銃は森に行くときはエアガンよりも優れています(実際にそれを使って何かを撃ち落とすことができるためです)が、あなたやあなたの周りの人々にとっても危険です。C ++には、メモリ管理などの概念があり、他のほとんどの言語では心配する必要はありません。ただし、これらの概念をしっかりと把握することは、自動メモリ管理言語を使用する場合でも、無意味なことはありません。また、ビット単位の演算を実行して、C ++のような言語で「金属」まで下げることもできます。これらの分野の基本的な理解さえも、あらゆる言語のプログラマーとしてあなたを助けることができます。

個人的な意見

私はC ++を学ぶ前に、ほぼ3年間最初にJavaを個人的に学びました、そして私はそれを一種の後悔と言うべきです(単一コース...)。これにより、C ++の学習(私はまだ学習中-「深い」知識からはほど遠い:D)は、私が望むほど単純ではありませんでした。もし私が他の方法でそれをしたなら、私にとってはずっと簡単だったと言えるでしょう。あなたが知っている場合は特にWHY何かが特定の方法で行われ、そしてちょうど言語の自動magicnessに安心ではありません。私が意見を述べることが許可されている場合、私は提案します:C(基本的で普遍的なプログラミングパラダイムの場合)-> C ++(OOPの基本的な理解とメモリ管理の場合)->次に、優れた基盤またはC ++でより高度なトピックを続行できます。


3
私の大学がパスカルから始めてくれてうれしいです。次に、Cに進み(メモリ管理とビット操作の部分)、最後にoopのJavaに進みました(もちろん、これは他のoo言語でも可能でしたが)。正直に言うと、javaで始まる大学の数はかなり気になります。実際のOOPはORAND
Lovis

2
@Doval:ガベージコレクションはメモリ管理について心配する必要ないように錯覚させます。マネージコードプログラムがメモリリークを取得する頻度を確認してください。参照が予期しない場所で有効なままであったため(コレクションは永続的な違反者です)、これがどれほど幻想であるかを確認します。
メイソンウィーラー、2015年

1
@Doval:間違ったサイズ、配置、配置:適切なサイズがコンパイラーに認識され、アロケーターが配置と配置を処理する場合、オブジェクト指向言語でこれらのことをどのように正確に実行しますか?早い段階での解放:これはまさにGCが防ぐことになっていることなので、この議論に関係がないと言っても正直ではありません。しかし、すべての割り当てをメモリリークに変えるという犠牲を払って、そのようにします。 また、他のオブジェクトのデータを踏みつけないことは、境界チェックの問題であり、ガベージコレクションの問題ではありません。
メイソンウィーラー、2015年

2
C ++は、C ++実装固有の多くの学習を必要としますが、C ++の無限の癖、ライブラリ、およびさまざまなシステムのため、C ++の外部では使用されません。私の経験では、C ++を書くすべての人は、基本的にすべてのC ++が不十分に書かれており、ほとんどC ++固有の癖や奇妙さに満ちていることに同意します。ほとんどの言語にC ++のほとんどの問題が欠けている場合、その地雷原を回避する方法を学習しても、他の言語で役立つものはありません。
ジミーHoffa

2
@Doval:はい、それが私の要点です。これらのことは、一般的なケースではアルゴリズム的に決定不可能です。そのため、正しく処理するために、アルゴリズムではなくインテリジェントな人が処理する必要があります。そして、「それはリークではない、それは非効率的なプログラムです」と言うことは、単なる意味論的な髪の分割です。外部の観察者にとって、プログラムの動作は、特にメモリがリークしているマルチタスクシステムのコンテキストで、メモリをリークしているプログラムの動作と同じであり、深刻な問題を引き起こす可能性があります。
メイソンウィーラー

9

残念だけど違う。これは、プログラミングクラス、特に初心者レベルのクラスでC ++を教えるときに実際に大きな問題になります。プログラミングの原則を学ぶことも、C ++言語を学ぶこともできますが、C ++言語には落とし穴が多く、愚かなことで両方を効果的に学ぶことはできません。 1学期クラスの範囲!

C ++で試され、最終的には純粋な慣性によってその言語で慣用的になったものがたくさんあります。それは、他のほとんどすべての言語が、それが大きな間違いであることが判明したために調べて拒否したからです。主なものは、C ++のテンプレートとC ++のオブジェクトモデルです(値型としてのオブジェクトは、Liskov置換と多数のOOP自体を壊すため、決して良いことではありません)。

したがって、最初にC ++の深い知識を得てから、他のプログラミング言語を学びたい場合、他のプログラミング言語で効果を発揮するために、学習しなくてはならない有害で逆効果のクラッドがたくさんあります。


4
JavaとC#のテンプレートシステムが厳密に弱い理由はいくつかありますが、それはすべてについて完全なメタデータが必要だからです。そして、値としてのオブジェクトがどのように物事を壊すかについての説明に興味があります。特に参照があることを考慮して...
デデュプリケータ2015年

3
@Deduplicator:JavaとC#では、ジェネリックシステムがまったく異なります。これは、テンプレートによってあらゆる種類の深刻な問題が発生することが経験上わかっているためです。その多くは、最初はテンプレートシステムが十分に計画されていなかったために発生します。(1つの明らかな例を示すと、偶然に調整が完了ます!)そして、親がBaseであるDerivedクラスがあり、それがBaseの仮想メソッドをオーバーライドし、デフォルトでそれを渡すと、 Baseを取り、仮想メソッドを呼び出す関数。派生バージョンは呼び出されません。
メイソンウィーラー

2
@MasonWheeler:ああ、あなたはスライスについて言及しています。
Fred Larson

2
@FredLarson:私は、このような蔓延している悪質な問題には特定の名前があると推測していたはずです。(そして、これはC ++であり、馬鹿げた名前です。C++の世界の外にいるプログラマーが「スライス」を聞いたとき、彼は配列のスライスについて考えがちです!:P
Mason Wheeler

4
私はあなたが書いた多くのことに同意しますが、あなたは非常に偏った見方をしていると思います;-) C ++を学ぶ私見は人々を面倒にしません。
Doc Brown

8

いいえ。C++をよく理解していると、C ++のような他の言語を簡単に学ぶことができます。しかし、それは退屈です。同じ2つの言語を知りたいのはなぜですか?それはあなたを何も買いません。(これはC ++に固有のものではないことに注意してください。これはすべての言語に適用されます。自然言語と比較してください:イタリア語を学ぶことは他の言語を学ぶことを容易にしません。スペイン語、フランス語、ポルトガル語を学ぶことを容易にします。そのうちの4つ目は4つ目の学習が容易になりますが、すべてのロマンス言語を学習ても、フィンランド語、中国語、ヒンディー語、ヘブライ語、アラビア語、パシュトゥ語、ギリシャ語などを少し学ぶことはできません。)

プログラミング言語はパラダイムを実装しています。Peter van Royは、34の主要なプログラミングパラダイムのポスターを集めまし

同様に、パラダイムは概念で構成されています。そのポスターには約18の概念がリストされています。

すべてのパラダイム(または少なくともポスターのパラダイム)は、これらの概念から構成されています。すべての言語は、それらの概念で構成される1つ以上のパラダイムを実装します。したがって、これらの概念を学習すると、(ある意味で)すべてのプログラミング言語を一度に学習することになります。

もちろん、まだ言語固有の癖がたくさんあります(それらの間の構文)。また、そのポスターは型付けを完全に無視しています。もちろん、依存型システムは言うまでもなく、システムF <:ωスタイルの型システム、Scalaスタイルの型システム、または動的ダック型の型システムの間には大きな違いがあります。イドラ、アグダ、コック、グル、またはATS。


ヒンディー語ではなく、ヒンドゥー教。イタリア語やC ++はもちろんのこと、「ヒンドゥー教の学習」に役立つことは何もありません ;-) +1。
PKG、2015年

実際、異なる言語を学ぶことは、本当に似ていますが、それでもあなたの心を広げ、したがって、より遠く離れた言語のためにあなたをわずかに助けます。
dyesdyes

C ++は自然言語とは異なりマルチパラダイム言語であるため、自然言語との比較に同意する必要があります。また、言語機能を詳しく学ぶことで、その機能の設計上​​の決定を理解し、他の実装の長所と短所を理解することができます。たとえば、動的ジェネリックと比較した場合の利点と欠点を学習せずに、c ++テンプレートを詳しく学習してみてください。C#の言及に遭遇しなくても(今日は難しい)、動的ジェネリックとは何かを知っていて、C#ジェネリックの制限を後で知るときにすぐにわかる
Rado

5

私が知っていることを言うだろう任意の深くプログラミング言語は、同じ家族の中で少なくとも他の言語で、他の人を学習に役立ちます。たとえば、C ++の知識はLISPやHaskellではあまり役に立ちませんが、オブジェクト指向の手続き型言語では役立ちます。私のアプローチは、言語のさまざまなファミリ(手続き型、関数型、オブジェクト指向など)から言語をうまく学習して、その知識をそのファミリの他の言語に引き継ぐことでした。一方、APLの深い知識は他には何の助けにもなりません...


3
第一言語としてC ++を学んだ人が書いたSelf、Smalltalk、またはRubyのコードがどのように見えるかを見てきました。実際には、C ++を知っているとOOを学習するのはかなり有害です。SelfまたはNewspeakの方がはるかに適していると思います。ところで、APLの深い知識は、少なくともJやKなどの言語に役立ちます。また、高レベルのコレクションの抽象化とリフトについて考えるのにも役立ちます。これは、おそらくMapReduceまたはHadoopスタイルのプログラミングに役立ち、Functorsについても考えます。 、Applicatives、モナド、およびカテゴリ。
イェルクWミッターク

1
@JörgWMittag:COBOLを任意の言語で記述できることはよく知られています...要点は何ですか?
Deduplicator

@Deduplicator最初の言語がCOBOLの場合、他の言語でCOBOLを書く可能性がはるかに高くなります。
ドヴァル2015年

実際、私はCOBOLの事柄に同意しなければなりません。PascalでCOBOLを書いた人が何年も前に働いていました...
Jim Nutt

5

ここでは別の解釈をします。

C ++は、オブジェクトの所有権や寿命などの概念について慎重に考える必要があるため、メモリとデータ構造について学ぶのに適した言語です。また、メモリとデータ構造について学ぶことは、ソフトウェアエンジニアリングのカリキュラムの重要な部分の1つです。

ただし、データ構造について学習する必要があります。「C ++を学ぶ」だけではあまり効果がなく、短期的には他の言語を学ぶプロセスが遅くなる可能性があります。

私が大学にいたとき、データ構造はCS1(少なくともクラスの半分が出ていた)の後に取られた必須の新入生レベルのコースでした。大変でした。コースの形式は基本的には「これまで見たことのないデータ構造です[例:左側のヒープ ]。1週間でC ++に実装し、出力をバイト単位で期待される出力と正確に一致させます。自動的に採点できます。」次に、来週、新しいデータ構造と新しい割り当てを取得します。その1つのコースでは、他のすべてのコースを組み合わせたときよりも多くのことを学んだと思います。

これは、C ++を価値あるものにするために必要な学習です。


2

あなたが学ぶすべての言語は、特に同じパラダイムの中で、次の言語を学びやすくします。彼らは互いに借用し合い、しばらくすると新しい言語が他の言語からの機能の集まりのように見え、いくつかのユニークなひねりを加えたものになりました。

その点では、C ++が他のどの言語よりも優れているとは思いません。それは私が知っているより冗長な言語の1つであり、他のほとんどの言語では簡単であるいくつかのことを難しくしますが、必ずしも次の言語を学習しやすくすることにはなりません。これは、一般的に次の言語がより簡単に感じさせるん使用ものの、。違いがあります。


0

いいえ。C、または「基本的にはC」であるC ++のサブセットに関する深い知識は、他の言語を学ぶときに、少なくともそれらの実装が何をしているのかを描くときに役立ちます。一方、C ++の深い知識は、他の言語を学習するときに混乱したり関連のない情報になることがほとんどです。C ++のオブジェクト指向を表面レベル以上で学習する場合、たとえば、Perl / Python / Rubyに移動すると、それらを使用するよりも、知っていることの学習に多くの時間を費やすことになります。完全に異なる方法C ++よりも。同じことが多かれ少なかれ他のほとんどの言語と他の言語機能にも当てはまります(たとえば、C ++テンプレートとHaskellポリモーフィズムは基本的に同じ機能ですが、実装もまったく異なります)。したがって、C ++に関する深い知識は、主にC ++固有のものになります。


この投稿は読みにくいです(テキストの壁)。より良い形に編集していただけませんか?
gnat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.