J'envisage d'apprendre C
Il n'y a pas de raison spécifique de ne pas apprendre le C, mais je suggérerais le C ++. Il offre une grande partie de ce que fait C (puisque C ++ est un super ensemble de C), avec une grande quantité de "suppléments". Apprendre C avant C ++ n'est pas nécessaire - ce sont en réalité des langages séparés.
En d'autres termes, si C était un ensemble d'outils pour le travail du bois, ce serait probablement:
- marteau
- ongles
- scie à main
- perceuse à main
- ponceuse
- ciseau (peut-être)
Vous pouvez construire n'importe quoi avec ces outils - mais tout ce qui est bien nécessite potentiellement beaucoup de temps et de compétences.
C ++ est la collection d'outils électriques de votre quincaillerie locale.
Si vous vous en tenez aux fonctionnalités de base du langage, C ++ a relativement peu de courbe d'apprentissage supplémentaire.
Mais pourquoi les gens utilisent-ils C (ou C ++) s’il peut être utilisé «dangereusement»?
Parce que certaines personnes ne veulent pas de meubles IKEA. =)
Sérieusement, bien que de nombreux langages "plus élevés" que le C ou le C ++ puissent avoir des choses qui les rendent (potentiellement) "plus faciles" à utiliser dans certains aspects, ce n'est pas toujours une bonne chose. Si vous n'aimez pas la façon dont quelque chose est fait ou une fonctionnalité n'est pas fournie, vous ne pourrez probablement rien faire à ce sujet. D'autre part, C et C ++ fournissent suffisamment de fonctionnalités de langage "bas niveau" (y compris des pointeurs) pour que vous puissiez accéder directement à beaucoup de choses (matériel ou système d'exploitation) ou les construire vous-même, ce qui peut ne pas être possible dans d'autres cas. langues mises en œuvre.
Plus spécifiquement, C possède les fonctionnalités suivantes qui le rendent souhaitable pour de nombreux programmeurs:
- Vitesse - En raison de sa simplicité relative et des optimisations du compilateur au fil des ans, il est très rapide en mode natif. En outre, beaucoup de gens ont trouvé beaucoup de raccourcis vers des objectifs spécifiques lors de l'utilisation du langage, ce qui le rend potentiellement encore plus rapide.
- Taille - Pour des raisons similaires à celles indiquées pour la vitesse, les programmes C peuvent être très réduits (à la fois en termes de taille d’exécutable et d’utilisation de la mémoire), ce qui est souhaitable pour les environnements à mémoire limitée (intégrée ou mobile).
Compatibilité - C existe depuis longtemps et tout le monde a des outils et des bibliothèques pour le faire. Le langage lui-même n'est pas difficile non plus - il s'attend à ce qu'un processeur exécute des instructions et que la mémoire détienne des éléments, et c'est à peu près tout.
En outre, il existe quelque chose appelé une interface binaire d'application (ABI) . En bref, c'est un moyen pour les programmes de communiquer au niveau du code machine, ce qui peut présenter des avantages par rapport à une API (Application Programming Interface) . Tandis que d'autres langages tels que C ++ peuvent avoir une ABI, ils sont généralement moins uniformes (accord) que le C, donc C est un bon langage de base lorsque vous souhaitez utiliser une ABI pour communiquer avec un autre programme pour une raison quelconque.
Pourquoi les programmeurs n'utilisent-ils pas simplement Java ou Python ou un autre langage compilé tel que Visual Basic?
Efficacité (et parfois schémas de gestion de la mémoire impossibles à mettre en œuvre sans un accès relativement direct à la mémoire).
Accéder directement à la mémoire avec des pointeurs présente de nombreux trucs astucieux (généralement rapides) quand vous pouvez mettre vos pattes sales sur les petits et les zéros dans vos coffres de mémoire directement sans avoir à attendre que ce méchant professeur vous distribue les jouets au moment de la lecture, ramassez-les à nouveau.
En bref, ajouter des éléments crée potentiellement un décalage ou introduit une complexité indésirable.
En ce qui concerne les langages de script et autres logiciels similaires, vous devez travailler dur pour que les langages nécessitant des programmes secondaires s'exécutent aussi efficacement que C (ou tout autre langage compilé) le font de manière native. L'ajout d'un interpréteur à la volée introduit de manière inhérente la possibilité d'une vitesse d'exécution réduite et d'une utilisation accrue de la mémoire, car vous ajoutez un autre programme au mixage. L’efficacité de votre programme dépend autant de l’efficacité de ce programme secondaire que de la qualité (mal = =) de votre code de programme original. Sans parler de votre programme est souvent complètement dépendant du second programme pour même exécuter. Ce second programme n'existe pas pour une raison quelconque sur un système particulier? Code no go.
En fait, introduire quelque chose d’ extra ralentit ou complique potentiellement votre code. Dans les langues "sans indicateurs effrayants", vous attendez toujours que d'autres morceaux de code soient nettoyés ou que vous trouviez autrement des façons "sûres" de faire les choses, car votre programme effectue toujours les mêmes opérations d'accès à la mémoire qu'avec d'autres méthodes. pointeurs. Vous n'êtes simplement pas celui qui le gère (vous ne pouvez donc pas le faire, génie = P).
Par dangereux, je veux dire avec des pointeurs et autres choses similaires. [...] Comme pour la question du débordement de pile Pourquoi la fonction d'obtention est-elle si dangereuse qu'elle ne devrait pas être utilisée?
Selon la réponse acceptée:
"Cela restait une partie officielle du langage jusqu'à la norme ISO C 1999, mais il a été officiellement supprimé par la norme 2011. La plupart des implémentations C le supportent toujours, mais au moins gcc envoie un avertissement pour tout code qui l'utilise."
L'idée que, parce que quelque chose peut être fait dans une langue, il faut le faire est stupide. Les langues ont des défauts qui sont corrigés. Pour des raisons de compatibilité avec du code plus ancien, cette construction peut toujours être utilisée. Mais rien n'oblige (probablement) un programmeur à utiliser gets () et, en fait, cette commande a essentiellement été remplacée par des alternatives plus sûres.
Plus précisément, le problème avec gets () n'est pas un problème de pointeur en soi. C'est un problème avec une commande qui ne sait pas nécessairement comment utiliser la mémoire en toute sécurité. Dans un sens abstrait, tout est question de pointeur - lire et écrire des choses que vous n’êtes pas supposée faire. Ce n'est pas un problème avec les pointeurs; c'est un problème d'implémentation de pointeur.
Pour clarifier, les pointeurs ne sont pas dangereux tant que vous n'avez pas accédé accidentellement à un emplacement de mémoire auquel vous n'aviez pas l'intention. Et même dans ce cas, cela ne garantit pas que votre ordinateur va fondre ou exploser. Dans la plupart des cas, votre programme ne fonctionnera plus (correctement).
Cela dit, étant donné que les pointeurs fournissent un accès aux emplacements de mémoire et que les données et le code exécutable existent en mémoire, il existe un risque réel de corruption accidentelle pour que vous souhaitiez gérer correctement la mémoire.
Parce que les opérations d’accès direct à la mémoire offrent généralement généralement moins d’avantages qu’il ya des années, même les langages non chiffrés comme C ++ ont introduit des fonctionnalités telles que les pointeurs intelligents pour aider à combler le fossé entre efficacité de la mémoire et sécurité.
En résumé, il y a très peu de raisons de craindre le pointeur tant qu'il est utilisé en toute sécurité. Prenez juste un indice de la version de South Park de Steve "The Crocodile Hunter" Irwin - ne vous fourrez pas le pouce dans les trous des crocs .