Werden Ihnen fundierte Kenntnisse in C ++ dabei helfen, andere Sprachen schneller / einfacher zu lernen? [geschlossen]

9

Gibt es eine Möglichkeit, dass jemand, der alle wichtigen Aspekte von C ++ gelernt hat und die Grundlagen der Sprache sehr gut kennt, andere Sprachen (wie Python, Perl, Java) schneller und einfacher lernt?

l ..
quelle
9
Ich würde argumentieren , dass C ++ unterschiedlich genug , um sich von den meisten anderen Sprachen ist es zu machen mehr verwirrend , etwas anderes zu holen (wenn es die einzige Sprache ist , Sie wissen). Viele Sprachen teilen die Syntax von C ++, aber nur wenige haben sich in die gleiche Richtung entwickelt. C ++ hat viele historische Cruft, die nur für C ++ spezifisch sind. Ihre beste Wahl, um schnell neue Sprachen zu erlernen, besteht darin, sich darauf zu konzentrieren, verschiedene Sprachen aus verschiedenen Paradigmen zu lernen. Je mehr Paradigmen Sie kennen, desto schneller können Sie andere Dinge aus diesen Paradigmen aufgreifen.
KChaloux
3
Ich glaube nicht, dass Sie mit C ++ einen Vorteil beim Erlernen anderer Sprachen im Allgemeinen haben. Es hängt wirklich davon ab, welche anderen Sprachen Sie lernen werden. Mein Professor für Programmiersprachen sagte immer, wir sollten uns auf das Verständnis allgemeiner Konzepte konzentrieren: Dies wird das Erlernen einzelner Sprachen definitiv viel einfacher machen.
Giorgio
9
Das gründliche Erlernen einer Sprache ist ein guter Anfang für das Erlernen des Programmierens im Allgemeinen, mit der Ausnahme, dass Sie sprachspezifisches Know-how mit allgemeinem Wissen verwechseln können. Modernes C ++ ist eine großartige Sprache, aber sobald Sie ein mittleres Niveau erreicht haben, werden Sie massiv davon profitieren, andere Perspektiven kennenzulernen - vielleicht werfen Sie einen Blick auf OCaml und Ruby, auch wenn Sie diese nie ernsthaft verwenden. Sobald Sie ein fester Programmierer sind und zwischen sprachspezifischen und allgemeinen Dingen unterscheiden können, ist es ziemlich einfach, in neuen Sprachen produktiv zu werden, obwohl die Beherrschung immer Zeit braucht.
Amon
1
Verglichen mit was? Eine andere Sprache gut lernen, C ++ gut kennen, aber nicht tief, überhaupt nichts wissen?
Telastyn
2
Ja, aber auch umgekehrt. Wenn Sie Ocaml oder Scheme kennen, sind viele neue Funktionen von C ++ 11 leichter zu verstehen
Basile Starynkevitch

Antworten:

12

Allgemein gesagt

Fundierte Kenntnisse in jeder Programmiersprache helfen Ihnen wahrscheinlich dabei, andere Sprachen schneller zu erlernen. Das liegt zum Teil daran, dass Programmieren eine Art zu denken ist, mehr als Syntax zu lernen. Die meisten Programmierpraktiken gelten für die meisten anderen Programmiersprachen. Deshalb sagen die Leute, dass Sie die zweite Programmiersprache immer schneller lernen als die erste.

In spezifischen Begriffen

C ++ ist eine Sprache, die eine viel größere Kontrolle als andere Sprachen ermöglicht. Dies kann sowohl gut als auch schlecht sein. Zum Beispiel ist eine echte Waffe besser als eine Luftwaffe, wenn Sie in den Wald gehen (weil Sie damit tatsächlich etwas abschießen können), aber es ist auch gefährlicher für Sie und Ihre Umgebung. C ++ verfügt über Konzepte wie die Speicherverwaltung, über die Sie sich in den meisten anderen Sprachen keine Gedanken machen müssen. Ein sicheres Verständnis dieser Konzepte ist jedoch alles andere als sinnlos, selbst wenn mit Sprachen für die automatische Speicherverwaltung gearbeitet wird. Sie können auch bitweise Operationen ausführen und mit einer Sprache wie C ++ viel tiefer zum 'Metall' gehen. Selbst ein grundlegendes Verständnis in diesen Bereichen kann Ihnen als Programmierer in jeder Sprache sehr helfen.

Persönliche Meinung

Ich persönlich habe Java fast 3 Jahre lang zuerst gelernt, bevor ich C ++ gelernt habe, und ich sollte sagen, dass ich es irgendwie bereue (Uni-Kurs ...). Dies machte das Lernen von C ++ (ich lerne immer noch - weit entfernt von 'tiefem' Wissen: D) nicht so einfach, wie ich es gerne hätte. Wenn ich es umgekehrt gemacht hätte, würde ich sagen, dass es für mich viel einfacher gewesen wäre. Besonders wenn Sie wissen, WARUM etwas auf eine bestimmte Art und Weise getan wird, und sich nicht nur auf die automatische Magie der Sprache verlassen können. Wenn ich eine Meinung abgeben darf, würde ich vorschlagen: C (für grundlegende und universelle Programmierparadigmen) -> C ++ (für das grundlegende Verständnis von OOP zusammen mit der Speicherverwaltung) -> Dann können Sie mit a in jede 'echte' OOP-Sprache wechseln Gute Grundlage, oder Sie können mit fortgeschritteneren Themen in C ++ fortfahren, je nachdem, was Sie tun.

G.Rassovsky
quelle
3
Ich bin froh, dass meine Universität uns mit Pascal beginnen ließ. Dann gingen wir zu C (für den Teil Speicherverwaltung und Bitoperationen) und schließlich zu Java für oop (obwohl dies natürlich jede andere oo-Sprache gewesen sein könnte). Um ehrlich zu sein, finde ich es sehr zu stören , wie viele Universitäten starten mit Java. Sie werden Java (und vor allem OOP) unweigerlich falsch lernen, da echtes OOP für Anfänger zu kompliziert ist, die immer noch mit dem Unterschied zwischen ORundAND
Lovis
2
@Doval: Garbage Collection gibt Ihnen die Illusion, sich nicht um die Speicherverwaltung kümmern zu müssen. Schauen Sie sich nur an, wie häufig Programme mit verwaltetem Code Speicherlecks bekommen, weil einige Referenzen an einem unerwarteten Ort gültig blieben (Sammlungen sind ein beständiger Täter), um zu sehen, wie illusorisch dies wirklich ist.
Mason Wheeler
1
@Doval: Falsche Größe, Ort, Ausrichtung: Wie genau macht man eines dieser Dinge in einer objektorientierten Sprache, wenn dem Compiler die richtige Größe bekannt ist und der Allokator die Platzierung und Ausrichtung übernimmt? Frühzeitig befreien: Genau das soll GC verhindern. Es ist also einfach nicht wahr, zu sagen, dass es für diese Diskussion nicht relevant ist. Dies geschieht jedoch auf Kosten der Umwandlung jeder Zuordnung in einen Speicherverlust. Das Nichtstampfen der Daten anderer Objekte ist ein Problem der Grenzüberprüfung und kein Problem der Speicherbereinigung.
Mason Wheeler
2
C ++ erfordert so viel Lernen, dass es für die C ++ - Implementierung spezifisch ist, aber aufgrund der endlosen Macken, der Bibliotheken und verschiedener Systeme niemals außerhalb von C ++ verwendet wird. Nach meiner Erfahrung stimmt jeder, der C ++ schreibt, grundsätzlich zu, dass C ++ schlecht geschrieben und voller Macken und Kuriositäten ist, die meistens C ++ -spezifisch sind. Wenn Sie sich in diesem Minenfeld zurechtfinden, ist dies in anderen Sprachen nicht hilfreich, wenn den meisten Sprachen die meisten Probleme in C ++ fehlen.
Jimmy Hoffa
2
@Doval: Ja, das ist mein ganzer Punkt: Diese Dinge sind im allgemeinen Fall algorithmisch unentscheidbar , weshalb sie von einer intelligenten Person und nicht von einem Algorithmus gehandhabt werden müssen, um richtig gehandhabt zu werden. Und zu sagen "das ist kein Leck, es ist ein ineffizientes Programm" ist nur eine semantische Haarspalterei; Für einen externen Beobachter ist das Verhalten des Programms das gleiche wie das eines Programms, bei dem Speicher verloren geht, insbesondere im Zusammenhang mit Multitasking-Systemen, bei denen Speicherknappheit unter Last schwerwiegende Probleme verursachen kann.
Mason Wheeler
9

Unglücklicherweise nicht. Dies ist tatsächlich ein großes Problem beim Unterrichten von C ++ in Programmierklassen, insbesondere in Anfängerklassen: Sie können Programmierprinzipien lernen oder die C ++ - Sprache lernen, aber die C ++ - Sprache weist zu viele Fallstricke und dumme kleine Fallstricke auf, um beide effektiv zu lernen der Umfang einer Ein-Semester-Klasse!

Es gibt viele Dinge, die in C ++ ausprobiert wurden und schließlich durch bloße Trägheit in der Sprache idiomatisch wurden, die so ziemlich jede andere Sprache seitdem betrachtet und abgelehnt hat, weil es sich als großer Fehler herausstellte. Die wichtigsten sind die Vorlagen von C ++ und das Objektmodell von C ++ (Objekte als Werttypen sind niemals eine gute Sache, da sie die Liskov-Substitution und tausend OOP selbst unterbrechen.)

Wenn Sie also zuerst ein tiefes Wissen über C ++ haben und dann andere Programmiersprachen lernen möchten, wird es eine Menge schädlicher und kontraproduktiver Probleme geben, die Sie verlernen müssen, um in anderen Programmiersprachen effektiv zu sein.

Mason Wheeler
quelle
4
Es gibt Gründe, warum Java und C # ein streng schwächeres Vorlagensystem haben, aber das liegt daran, dass sie über alles vollständige Metadaten benötigen. Und ich würde mich für eine Erklärung interessieren, wie Objekte als Werte Dinge brechen. Besonders wenn man bedenkt, dass es Referenzen gibt ...
Deduplicator
3
@Deduplicator: Java und C # haben ein völlig anderes Generika-System , da die Erfahrung zeigt, dass Vorlagen alle möglichen schwerwiegenden Probleme verursachen, von denen viele auftreten, weil das Vorlagen-System überhaupt nicht gut geplant war. (Turing-complete versehentlich , um ein offensichtliches Beispiel zu nennen!) Und Objekte als Werte unterbrechen die Liskov-Substitution, denn wenn Sie eine abgeleitete Klasse haben, deren übergeordnetes Element Base ist, überschreibt sie eine virtuelle Methode auf Base und übergeben sie standardmäßig an Eine Funktion, die eine Base verwendet und die virtuelle Methode aufruft, ruft die abgeleitete Version nicht auf.
Mason Wheeler
2
@ MasonWheeler: Ah, Sie beziehen sich auf das Schneiden .
Fred Larson
2
@FredLarson: Ich hätte vermuten sollen, dass ein so weit verbreitetes, schädliches Problem einen bestimmten Namen dafür hat. (Und dies ist C ++, ein alberner Name. Wenn ein Programmierer außerhalb der C ++ - Welt "Slicing" hört, denkt er wahrscheinlich an Array-Slicing !: P
Mason Wheeler
4
Obwohl ich vielen Dingen zustimme, die Sie geschrieben haben, denke ich, dass Sie eine sehr voreingenommene Sichtweise haben ;-) IMHO macht das Lernen von C ++ die Leute nicht dümmer.
Doc Brown
8

Wenn Sie C ++ gut kennen, können Sie leichter andere Sprachen lernen, die C ++ ähneln. Das wäre aber langweilig. Warum möchten Sie zwei Sprachen kennenlernen, die gleich sind? Das kauft dir nichts. (Beachten Sie, dass dies nicht spezifisch für C ++ ist. Es gilt für jede Sprache. Vergleichen Sie mit natürlichen Sprachen: Wenn Sie Italienisch lernen, wird es nicht einfacher, andere Sprachen zu lernen. Es wird einfacher, Spanisch, Französisch oder Portugiesisch zu lernen und drei zu lernen von diesen wird es einfacher sein, die vierte zu lernen, aber selbst das Erlernen aller romanischen Sprachen wird Ihnen kein bisschen helfen, Finnisch, Chinesisch, Hindi, Hebräisch, Arabisch, Paschtu, Griechisch usw. zu lernen .)

Programmiersprachen implementieren Paradigmen. Peter van Roy hat ein Poster der 34 wichtigsten Programmierparadigmen gesammelt .

Paradigmen wiederum bestehen aus Konzepten. Dieses Poster listet ungefähr 18 Konzepte auf.

Alle Paradigmen (oder zumindest die im Poster) bestehen aus diesen Konzepten. Alle Sprachen implementieren ein oder mehrere Paradigmen, die aus diesen Konzepten bestehen. Wenn Sie diese Konzepte lernen, lernen Sie (in gewissem Sinne) jede Programmiersprache gleichzeitig.

Es gibt natürlich noch viele sprachspezifische Macken (Syntax unter ihnen). Außerdem ignoriert dieses Poster die Eingabe vollständig, und es gibt natürlich einen signifikanten Unterschied zwischen einem System vom Typ F <: ω- Typ, einem System vom Typ Scala oder einem System vom Typ Typ mit dynamischer Ente, geschweige denn einem System vom abhängigen Typ à la Idris, Agda, Coq, Guru oder ATS.

Jörg W Mittag
quelle
Hindi , nicht Hindu . Nichts hilft dir beim "Hindu-Lernen", geschweige denn Italienisch oder C ++ ;-) +1.
PKG
Tatsächlich erweitert das Erlernen verschiedener Sprachen, obwohl es wirklich ähnlich ist, Ihren Geist und hilft Ihnen somit ein wenig bei weiter entfernten Sprachen.
Dyesdyes
Ich muss dem Vergleich mit natürlichen Sprachen nicht zustimmen, da C ++ im Gegensatz zu natürlichen Sprachen eine Multi-Paradigmen-Sprache ist. Wenn Sie eine Sprachfunktion im Detail lernen, kennen Sie die Entwurfsentscheidungen für diese Funktion und verstehen höchstwahrscheinlich die Vor- und Nachteile anderer Implementierungen. Versuchen Sie beispielsweise, C ++ - Vorlagen eingehend zu lernen, ohne deren Vor- und Nachteile gegenüber dynamischen Generika zu kennen. Selbst wenn Sie nicht auf Erwähnungen von C # stoßen (heutzutage schwierig), würden Sie immer noch wissen, was dynamische Generika sind, und sofort die Einschränkungen von C # -Generika kennen, wenn Sie danach davon erfahren
Rado
5

Ich würde sagen, dass eine gründliche Kenntnis einer Programmiersprache dazu beiträgt, andere zu lernen, zumindest andere Sprachen in derselben Familie. Zum Beispiel hilft C ++ - Wissen bei LISP oder Haskell nicht viel, bei objektorientierten prozeduralen Sprachen jedoch. Mein Ansatz war es, zu versuchen, eine Sprache aus jeder der verschiedenen Familien (prozedural, funktional, objektorientiert usw.) von Sprachen gut zu lernen, damit dieses Wissen auf andere Sprachen in dieser Familie übertragen werden kann. Auf der anderen Seite hilft ein tiefes Wissen über APL bei nichts anderem ...

Jim Nutt
quelle
3
Ich habe gesehen, wie Self- oder Smalltalk- oder Ruby-Code von jemandem aussieht, der C ++ als Muttersprache gelernt hat. Ich würde eigentlich sagen, C ++ zu kennen ist ziemlich schädlich für das Erlernen von OO. Ich denke, Self oder Newspeak wären dafür viel besser geeignet. Übrigens, ein tiefes Wissen über APL wird zumindest bei Sprachen wie J und K hilfreich sein. Es wird auch helfen, über übergeordnete Sammlungsabstraktionen und Liftig nachzudenken, was wahrscheinlich bei der Programmierung im MapReduce- oder Hadoop-Stil hilfreich sein wird, und auch über Functors nachzudenken , Bewerber, Monaden und Kategorien.
Jörg W Mittag
1
@ JörgWMittag: Es ist bekannt, dass man COBOL in jeder Sprache schreiben kann ... worum geht es?
Deduplikator
@Deduplicator Wenn Ihre Muttersprache COBOL ist, schreiben Sie COBOL viel eher in anderen Sprachen.
Doval
Eigentlich muss ich der COBOL-Sache zustimmen. Ich hatte vor Jahren einen Mann, der für mich arbeitete und COBOL in Pascal schrieb ...
Jim Nutt
5

Ich werde hier eine andere Interpretation nehmen.

C ++ ist eine gute Sprache zum Erlernen von Speicher- und Datenstrukturen, da Sie dazu gezwungen sind, über Konzepte wie Objektbesitz und Lebensdauer sorgfältig nachzudenken. Das Erlernen von Speicher- und Datenstrukturen ist einer der wesentlichen Bestandteile eines jeden Lehrplans für Softwareentwicklung.

Aber Sie müssen etwas über Datenstrukturen lernen. Wenn Sie nur "C ++ lernen", werden Sie nicht wirklich viel gewinnen, und es kann kurzfristig den Prozess des Lernens anderer Sprachen verlangsamen.

Als ich am College war, war Data Structures ein Pflichtkurs für Anfänger, der nach CS1 (von dem mindestens die Hälfte der Klasse abgelegt hatte) belegt wurde. Es war schwer. Das Format des Kurses lautete im Grunde genommen "Hier ist eine Datenstruktur, die Sie noch nie gesehen haben [z. B. ein linker Haufen ]. Implementieren Sie sie in einer Woche in C ++ und stellen Sie sicher, dass Ihre Ausgabe genau mit unserer erwarteten Ausgabe übereinstimmt, Byte für Byte, also wir kann es automatisch bewerten. " Nächste Woche erhalten Sie dann eine neue Datenstruktur und eine neue Zuordnung. In diesem einen Kurs habe ich wahrscheinlich mehr gelernt als in allen anderen Kursen zusammen.

Das ist die Art von Lernen, die Sie machen müssen, damit C ++ wertvoll ist.

Kevin
quelle
2

Jede Sprache, die Sie lernen, erleichtert das Erlernen der nächsten Sprache, insbesondere innerhalb desselben Paradigmas. Sie leihen sich stark voneinander aus, und nach einer Weile kommt man an einen Punkt, an dem eine neue Sprache mit nur wenigen Wendungen wie eine Sammlung von Funktionen aus anderen Sprachen aussieht.

Ich denke nicht, dass C ++ in dieser Hinsicht besser oder schlechter ist als jede andere Sprache. Es ist eine der ausführlicheren Sprachen, die ich kenne, und macht einige Dinge schwierig, die in den meisten anderen Sprachen einfach sind, aber nicht unbedingt dazu führen, dass die nächste Sprache leichter zu lernen ist . Es ist im Allgemeinen der nächste Sprache fühlen einfachen Gebrauch , though. Es besteht ein Unterschied.

Karl Bielefeldt
quelle
0

Nein. Eine gründliche Kenntnis von C oder der Teilmenge von C ++, die "im Grunde C" ist, hilft beim Erlernen anderer Sprachen, zumindest wenn man sich vorstellt, was ihre Implementierungen tun müssen. Grundlegende Kenntnisse in C ++ sind dagegen meist Informationen, die beim Erlernen anderer Sprachen verwirrend oder irrelevant sind. Wenn Sie die Objektorientierung von C ++ auf mehr als einer Oberflächenebene lernen, z. B. wenn Sie zu Perl / Python / Ruby wechseln, verbringen Sie mehr Zeit damit, das, was Sie wissen, nicht zu lernen, als es zu verwenden, da Objekte in diesen Sprachen in implementiert sind ein ganz anderer Wegals in C ++. Dasselbe gilt mehr oder weniger für die meisten anderen Sprachen und für andere Sprachfunktionen (z. B. sind C ++ - Vorlagen und Haskell-Polymorphismus im Grunde die gleiche Funktion mit wiederum völlig unterschiedlichen Implementierungen). Tiefes Wissen über C ++ wird also meistens C ++ - spezifisch sein.

Jonathan Cast
quelle
Dieser Beitrag ist ziemlich schwer zu lesen (Textwand). Hätten Sie etwas dagegen bearbeiten sie in eine bessere Form ing?
Mücke