Une connaissance approfondie du C ++ vous aidera-t-elle à apprendre d'autres langues plus rapidement / plus facilement? [fermé]

9

Existe-t-il une possibilité que quelqu'un qui a appris tous les aspects clés du C ++ et qui connaît très bien les principes fondamentaux du langage, apprenne d'autres langages (tels que Python, Perl, Java) plus rapidement et plus facilement?

l ..
la source
9
Je dirais que le C ++ est suffisamment différent de la plupart des autres langages pour rendre plus compliqué le choix de quelque chose d'autre (si c'est le seul langage que vous connaissez). De nombreux langages partagent la syntaxe du C ++, mais peu ont évolué dans la même direction. C ++ a beaucoup de fossés historiques qui ne sont spécifiques qu'à C ++. Votre meilleur pari pour choisir rapidement de nouvelles langues est de vous concentrer uniquement sur l'apprentissage de différentes langues à partir de différents paradigmes. Plus vous vous familiariserez avec les paradigmes, plus vous serez rapide à prendre d'autres choses dans ces paradigmes.
KChaloux
3
Je ne pense pas que la connaissance de C ++ vous donne un avantage pour apprendre d'autres langages en général. Cela dépend vraiment des autres langues que vous allez apprendre. Mon professeur de langages de programmation avait l'habitude de dire que nous devrions nous concentrer sur la compréhension des concepts généraux: cela rendra certainement l'apprentissage des langues individuelles beaucoup plus facile.
Giorgio du
9
Apprendre une langue en profondeur est un bon début pour apprendre la programmation en général, sauf que vous pouvez confondre le savoir-faire spécifique à la langue avec les connaissances générales. Le C ++ moderne est un excellent langage, mais une fois que vous aurez atteint un niveau intermédiaire, vous profiterez massivement de l'accès à d'autres perspectives connues - jetez peut-être un œil à OCaml et Ruby même si vous ne les utiliserez jamais sérieusement. Une fois que vous êtes un programmeur régulier et que vous pouvez faire la différence entre les choses spécifiques à une langue et les choses générales, devenir productif dans de nouvelles langues est assez facile, bien que la maîtrise prenne toujours du temps.
amon
1
Comparé à quoi? Apprendre bien un autre langage, bien connaître le C ++ mais pas profondément, ne rien savoir du tout?
Telastyn
2
Oui, mais aussi l'inverse. Connaître Ocaml ou Scheme rend beaucoup de nouvelles fonctionnalités C ++ 11 plus faciles à comprendre
Basile Starynkevitch

Réponses:

12

De façon générale

Une connaissance approfondie de tout langage de programmation est susceptible de vous aider à choisir plus rapidement d'autres langages. C'est en partie parce que la programmation est une façon de penser plus que d'apprendre la syntaxe. La plupart des pratiques de programmation s'appliqueraient à la plupart des autres langages de programmation. C'est pourquoi les gens disent que vous apprenez toujours le deuxième langage de programmation plus rapidement que le premier.

En termes spécifiques

C ++ est un langage qui permet un «contrôle» beaucoup plus important que les autres langages. Cela peut être bon et mauvais à la fois. Par exemple, un vrai pistolet est meilleur qu'un pistolet à air comprimé lorsque vous allez dans la forêt (car vous pouvez réellement abattre quelque chose avec), mais il est également plus dangereux pour vous et ceux qui vous entourent. C ++ a des concepts tels que la gestion de la mémoire, dont vous n'avez pas à vous soucier dans la plupart des autres langages. Cependant, avoir une bonne compréhension de ces concepts est loin d'être inutile même lorsque vous travaillez avec des langages de gestion de mémoire automatique. Vous pouvez également effectuer des opérations au niveau du bit et descendre beaucoup plus bas dans le «métal» avec un langage comme C ++. Même une compréhension de base dans ces domaines peut vous aider beaucoup en tant que programmeur dans n'importe quelle langue.

Opinion personnelle

J'ai personnellement appris Java d'abord pendant près de 3 ans avant d'apprendre le C ++, et je dois dire que je le regrette en quelque sorte (cours uni ...). Cela a rendu l'apprentissage du C ++ (j'apprends toujours - loin de la connaissance «profonde»: D) pas aussi simple que je le souhaiterais. Si je l'avais fait dans l'autre sens, je dirais que cela aurait été beaucoup plus facile pour moi. Surtout quand vous savez POURQUOI quelque chose est fait d'une manière spécifique, et pas seulement soyez assuré de l'auto-magie de la langue. Si je suis autorisé à donner un avis, je suggère: C (pour les paradigmes de programmation de base et universelle) -> C ++ (pour une compréhension de base de la POO avec la gestion de la mémoire) -> Ensuite, vous pouvez entrer dans n'importe quel langage de POO 'réel' avec un bonne base ou vous pouvez continuer avec des sujets plus avancés en C ++, tout dépend de ce que vous '

G.Rassovsky
la source
3
Je suis content que mon université nous ait fait commencer par Pascal. Ensuite, nous avons progressé en C (pour la partie de la gestion de la mémoire et des opérations sur les bits) et finalement avancé en java pour oop (bien que cela puisse bien sûr avoir été n'importe quel autre oo-langage). Pour être honnête, je trouve assez inquiétant le nombre d'universités qui commencent par Java. Vous apprendrez inévitablement mal java (et plus important encore, OOP), car la vraie OOP est trop compliquée pour les débutants qui luttent toujours avec la différence entre ORetAND
Lovis
2
@Doval: Garbage collection vous donne l'illusion de ne pas avoir à vous soucier de la gestion de la mémoire. Il suffit de regarder à quelle fréquence les programmes de code managé obtiennent des fuites de mémoire, car certaines références sont restées valides dans un endroit inattendu (les collections sont un délinquant perpétuel) pour voir à quel point c'est illusoire.
Mason Wheeler
1
@Doval: Taille, emplacement, alignement incorrects: comment faire exactement l'une de ces choses dans un langage orienté objet lorsque la taille appropriée est connue du compilateur et que l'allocateur gère le placement et l'alignement? Libérer tôt: c'est exactement ce que GC est censé empêcher, donc dire que ce n'est pas pertinent pour cette discussion n'est pas vrai. Mais cela se fait au prix de transformer chaque allocation en une fuite de mémoire. Et ne pas écraser les données d'autres objets est un problème de vérification des limites , pas un problème de récupération de place.
Mason Wheeler
2
C ++ demande tellement d'apprentissage qui est spécifique à l'implémentation C ++ mais ne sera jamais utilisé en dehors de C ++ en raison de ses caprices sans fin, de ses bibliothèques et de divers systèmes. D'après mon expérience, tous ceux qui écrivent du C ++ conviennent que tout C ++ est mal écrit et plein de bizarreries et de bizarreries qui sont principalement spécifiques au C ++. Apprendre à contourner ce champ de mines ne rendra rien utile dans d'autres langues lorsque la plupart des langues n'ont pas la plupart des problèmes rencontrés par C ++.
Jimmy Hoffa
2
@Doval: Oui, c'est tout mon argument: ces choses sont algorithmiquement indécidables dans le cas général , c'est pourquoi elles doivent être gérées par une personne intelligente, pas un algorithme, pour être gérées correctement. Et dire "ce n'est pas une fuite, c'est un programme inefficace" est juste une épilation sémantique; pour un observateur extérieur, le comportement du programme est le même que celui d'un programme qui fuit de la mémoire, en particulier dans le contexte de systèmes multitâches où la compression de la mémoire sous charge peut provoquer de graves problèmes.
Mason Wheeler
9

Malheureusement non. C'est en fait un gros problème lors de l'enseignement du C ++ dans les classes de programmation, en particulier les classes de niveau débutant: vous pouvez apprendre les principes de programmation, ou vous pouvez apprendre le langage C ++, mais le langage C ++ a trop d'embûches et de petits trucs stupides pour apprendre les deux efficacement dans la portée d'une classe d'un semestre!

Il y a beaucoup de choses qui ont été essayées en C ++ et qui sont finalement devenues idiomatiques dans le langage par pure inertie, que pratiquement tous les autres langages depuis ont examinés et rejetés parce que cela s'est avéré être une énorme erreur. Les principaux sont les modèles de C ++ et le modèle d'objet de C ++ (les objets en tant que types de valeur ne sont jamais une bonne chose, car ils cassent la substitution Liskov et mille OOP lui-même.)

Donc, si vous avez d'abord une connaissance approfondie du C ++, puis que vous voulez apprendre d'autres langages de programmation, il va y avoir beaucoup de conneries nuisibles et contre-productives que vous devrez désapprendre pour être efficace dans d'autres langages de programmation.

Mason Wheeler
la source
4
Il y a des raisons pour lesquelles Java et C # ont un système de modèles strictement plus faible, mais c'est parce qu'ils ont besoin de métadonnées complètes sur tout. Et je serais intéressé par une explication sur la façon dont les objets en tant que valeurs cassent les choses. Surtout vu qu'il y a des références ...
Déduplicateur
3
@Deduplicator: Java et C # ont un système générique complètement différent , car l'expérience montre que les modèles causent toutes sortes de problèmes graves, dont beaucoup surviennent parce que le système de modèles n'était pas bien planifié au départ. (Turing-complete par accident , pour donner un exemple évident!) Et les objets en tant que valeurs rompent la substitution Liskov parce que si vous avez une classe Derived dont le parent est Base, et qu'elle remplace une méthode virtuelle sur Base, et que vous la transmettez par défaut en passant à une fonction qui prend une base et appelle la méthode virtuelle, elle n'invoquera pas la version dérivée.
Mason Wheeler
2
@MasonWheeler: Ah, vous parlez de découpage .
Fred Larson
2
@FredLarson: J'aurais dû deviner qu'un problème aussi répandu et pernicieux aurait un nom spécifique. (Et, ceci étant C ++, un nom stupide à cela. Quand un programmeur en dehors du monde C ++ entend "découpage", il pense probablement au découpage de tableaux !: P
Mason Wheeler
4
Bien que je sois d'accord avec beaucoup de choses que vous avez écrites, je pense que vous avez un point de vue très biaisé ;-) IMHO apprendre C ++ ne rend pas les gens plus stupides.
Doc Brown
8

Non. Une bonne connaissance du C ++ facilitera l'apprentissage d'autres langages comme le C ++. Mais ce serait ennuyeux. Pourquoi voudriez-vous connaître deux langues qui sont identiques? Cela ne vous rapporte rien. (Notez que ce n'est pas spécifique au C ++. Il s'applique à n'importe quelle langue. Comparez avec les langues naturelles: l'apprentissage de l'italien ne facilitera pas l'apprentissage d'autres langues. Cela facilitera l'apprentissage de l'espagnol, du français ou du portugais, et l'apprentissage de trois de ceux-ci, il sera plus facile d'apprendre la quatrième, mais même apprendre toutes les langues romanes ne vous aidera pas du tout à apprendre le finnois, le chinois, l'hindi, l'hébreu, l'arabe, le pachtou, le grec, etc.)

Les langages de programmation implémentent des paradigmes. Peter van Roy a collecté une affiche des 34 principaux paradigmes de programmation .

Les paradigmes, à leur tour, sont composés de concepts. Cette affiche répertorie environ 18 concepts.

Tous les paradigmes (ou du moins ceux de l'affiche) sont composés de ces concepts. Toutes les langues implémentent un ou plusieurs paradigmes composés de ces concepts. Donc, si vous apprenez ces concepts, vous apprendrez (dans un certain sens) tous les langages de programmation à la fois.

Il y a bien sûr encore beaucoup de bizarreries spécifiques à la langue (la syntaxe entre elles). De plus, cette affiche ignore complètement la saisie, et il y a bien sûr une différence significative entre un système de type System F <: ω , un système de type Scala ou un système de type dynamique de type canard, sans parler d'un système de type dépendant à la Idris, Agda, Coq, Guru ou ATS.

Jörg W Mittag
la source
Hindi , pas hindou . Rien du tout ne vous aidera à "apprendre l'hindou", encore moins l'italien ou le C ++ ;-) +1.
PKG
En fait, l'apprentissage de différentes langues, bien que très similaires, élargit encore votre esprit et vous aide donc légèrement pour les langues plus éloignées.
dyesdyes
Je serais en désaccord avec la comparaison avec les langages naturels car le C ++ est un langage multi-paradigme contrairement aux langages naturels. En outre, en apprenant une fonctionnalité de langue en détail, vous connaissez les décisions de conception de cette fonctionnalité et comprenez très probablement les avantages et les inconvénients des autres implémentations. Par exemple, essayez d'apprendre les modèles c ++ en profondeur sans connaître leurs avantages et inconvénients par rapport aux génériques dynamiques. Même si vous ne tombez sur aucune mention de C # (difficile de nos jours), vous savez toujours ce que sont les génériques dynamiques et connaissez instantanément les limites des génériques C # lorsque vous en apprenez plus tard
Rado
5

Je dirais que connaître profondément n'importe quel langage de programmation aidera à apprendre les autres, au moins d'autres langages de la même famille. Par exemple, la connaissance C ++ n'aidera pas beaucoup avec LISP ou Haskell, mais pour les langages procéduraux orientés objet, cela le sera. Mon approche a été d'essayer d'apprendre une langue de chacune des différentes familles (procédurales, fonctionnelles, orientées objet, etc.) de langues, puis cette connaissance peut être transférée dans d'autres langues de cette famille. D'un autre côté, une connaissance approfondie de l'APL n'aidera à rien d'autre ...

Jim Nutt
la source
3
J'ai vu à quoi ressemble le code Self ou Smalltalk ou Ruby écrit par quelqu'un qui a appris le C ++ comme première langue. En fait, je dirais que connaître le C ++ est plutôt dangereux pour l'apprentissage de l'OO. Je pense que Self ou Newspeak seraient bien mieux adaptés à cela. BTW, une connaissance approfondie de APL aidera au moins avec des langages comme J et K. Cela aidera également à penser aux abstractions de collection de niveau supérieur et à liftig, ce qui aidera probablement avec la programmation de type MapReduce ou Hadoop, et pensera également aux Functors , Applicatifs, Monades et Catégories.
Jörg W Mittag
1
@ JörgWMittag: C'est bien connu, on peut écrire COBOL dans n'importe quelle langue ... à quoi ça sert?
Déduplicateur
@Deduplicator Si votre langue maternelle est le COBOL, vous êtes beaucoup plus susceptible d'écrire le COBOL dans d'autres langues.
Doval
En fait, je dois être d'accord avec le truc COBOL. J'ai eu un gars qui travaillait pour moi il y a des années et qui a écrit COBOL en Pascal ...
Jim Nutt
5

Je vais prendre une interprétation différente ici.

Le C ++ est un bon langage pour apprendre la mémoire et les structures de données, car il vous oblige à réfléchir soigneusement à des concepts tels que la propriété et la durée de vie des objets. Et l'apprentissage de la mémoire et des structures de données est l'une des parties essentielles de tout programme de génie logiciel.

Mais vous devez vous renseigner sur les structures de données. Si vous "apprenez simplement le C ++", vous ne gagnerez pas vraiment grand-chose, et cela pourrait ralentir le processus d'apprentissage d'autres langues à court terme.

Quand j'étais à l'université, Data Structures était un cours de première année obligatoire, suivi après CS1 (dont au moins la moitié de la classe avait abandonné). C'était difficile. Le format du cours était essentiellement "Voici une structure de données que vous n'avez jamais vue auparavant [par exemple un tas de gauche ]. Implémentez-la en C ++ en une semaine et faites en sorte que votre sortie corresponde exactement à notre sortie attendue, octet par octet, donc nous peut le noter automatiquement. " Ensuite, la semaine prochaine, vous obtiendrez une nouvelle structure de données et une nouvelle affectation. J'ai probablement appris plus dans ce cours que dans tous mes autres cours combinés.

C'est le genre d'apprentissage que vous devez faire pour que le C ++ soit utile.

Kevin
la source
2

Chaque langue que vous apprenez facilite l'apprentissage de la suivante, en particulier dans le même paradigme. Ils empruntent beaucoup les uns aux autres, et après un certain temps, vous arrivez au point où un nouveau langage ressemble simplement à une collection de fonctionnalités d'autres langues, avec quelques rebondissements uniques.

Je ne pense pas que le C ++ soit meilleur ou pire que tout autre langage à cet égard. C'est l'une des langues les plus verbeuses que je connaisse, et rend certaines choses difficiles qui sont faciles dans la plupart des autres langues, mais cela ne se traduit pas nécessairement en rendant la langue suivante plus facile à apprendre . Cependant, cela rend généralement la langue suivante plus facile à utiliser . Il y a une différence.

Karl Bielefeldt
la source
0

Non. Une connaissance approfondie de C , ou du sous-ensemble de C ++ qui est "fondamentalement C", sera utile lors de l'apprentissage d'autres langages, au moins pour imaginer ce que leurs implémentations doivent faire. Une connaissance approfondie du C ++ , d'autre part, sera principalement constituée d'informations qui prêtent à confusion ou ne sont pas pertinentes lors de l'apprentissage d'autres langues; si vous apprenez l'orientation des objets de C ++ à plus d'un niveau de surface, par exemple, lorsque vous passez à Perl / Python / Ruby, vous passerez plus de temps à apprendre ce que vous savez qu'à l'utiliser, car les objets de ces langages sont implémentés dans d'une manière complètement différentequ'en C ++. La même chose est vraie dans une plus ou moins large mesure pour la plupart des autres langages et pour d'autres fonctionnalités de langage (par exemple, les modèles C ++ et le polymorphisme Haskell sont fondamentalement la même fonctionnalité, avec, encore une fois, des implémentations complètement différentes). Une connaissance approfondie du C ++ sera donc principalement spécifique au C ++.

Jonathan Cast
la source
ce post est assez difficile à lire (mur de texte). Pourriez-vous le modifier sous une meilleure forme?
moucher