C contre C ++

Il s'agit d'une comparaison objective des applications, de l'utilisation et des caractéristiques du langage C et C ++ . Les origines et la trajectoire de développement des deux langages de programmation sont également discutées.

Tableau de comparaison

Tableau de comparaison C versus C ++
C C ++
Conçu parDennis RitchieBjarne Stroustrup
Collecte des orduresManuel; permet une meilleure gestion de la mémoire.Aucun GC disponible sur la bibliothèque standard C ++ (STD). Cependant, STD fournit des moyens efficaces et déterministes pour gérer les ressources telles que la propriété des objets et le comptage des références.
Influencé parB (BCPL, CPL), ALGOL 68, AssemblageC, Simula, Ada 83, ALGOL 68, CLU, ML
Apparaît dans19721985
Des classesUtilise des structures à la place et donne ainsi plus de liberté pour utiliser les éléments de conception internesclasse et struct
POO (programmation orientée objet)Non intégré; la liberté de configurer des structures pour agir comme des objets. N'a pas la capacité de déclarer l'encapsulation.Construit en; la taille et la disposition de la mémoire des objets sont déterministes. Les appels de fonction virtuelle peuvent être effectués sans vtable via CRTP.
Implémentations majeuresGCC, MSVC, Borland C, Watcom CCollection de compilateurs GNU, Microsoft Visual C ++, Borland C ++ Builder, Intel C ++ Compiler, LLVM / Clang
Discipline de dactylographieStatique, faibleStatique, fort, dangereux, nominatif
Délimiteur de commentaires de bloc/* et *//* et */
Terminateurs de relevés;;
Délimiteur de commentaires en ligne////
Influencéawk, csh, C ++, C #, Objective-C, BitC, D, C simultané, Java, JavaScript, Limbo, Perl, PHPAda 95, C #, Java, PHP, D, Aïkido
Extensions de nom de fichier habituelles.c.cc, .cpp, .cxx, .h, .hh, .hpp
ParadigmesLangage d'implémentation des systèmes impératifs (procéduraux)Multi-paradigme, orienté objet, générique, procédural, fonctionnel, méta
Tableaux dimensionnés dynamiquementNonNon
PlateformesPresque rien sur la planète; nécessite une recompilationPresque tout, y compris les plates-formes basées sur OS et non basées sur OS
La vitesseLes applications C sont plus rapides à compiler et à exécuter que les applications C +++ -5% par rapport à C si vous savez faire un bon usage de C ++. Les performances des programmes C ++ et C peuvent souvent être égales, car les compilateurs pour les deux langages sont matures.
Flux d'exécutionDe haut en basDe haut en bas
Programmation-inclure#comprendre#comprendre
Type de chaîne de programmationAucun type de chaîne native; souvent déclaré comme un tableau de caractèresTableau, std :: string
Programmation entrée / sortiescanf pour l'entrée; printf pour la sortieiostream, fstream (std :: cin, std :: cout)
CodeCompilé en fichiers exécutables binaires natifs à l'aide d'un compilateur comme bcc.Compilé en fichiers exécutables binaires natifs
Type de langueLangage orienté vers la procédureLangage orienté objet multi-paradigme
Développé parDennis Ritchie & Bell LabsBjarne Stroustrup
Orienté objetPas nativementOui
Programmation génériqueNonOui
Programmation procéduraleOuiOui
Programmation fonctionnelleOuiPartiel
MétaprogrammationNonOui
RéflexionNonNon
Tableaux multidimensionnels pris en chargeOuiOui
Plate-formeTous ceux qui ont un compilateurTous ceux qui ont un compilateur

Origines du C et du C ++

Dennis Ritchie des Bell Labs a conçu le C, un langage de programmation informatique à usage général en 1972 pour une utilisation avec UNIX, un système d'exploitation d'alors. C est principalement utilisé pour la programmation de logiciels système, mais est également très utile pour créer des logiciels d'application générale. Certains des adjectifs utilisés pour décrire C sont des langages structurés, impératifs et procéduraux.

Le C ++ (nommé à l'origine "C avec des classes" et toujours connu comme la superstructure du C dans les cercles informatiques) a été développé comme une amélioration du C par Bjarne Stroustrup en 1983 aux Bell Labs. Stroustrup, en 1979, a commencé par ajouter des classes, des fonctions virtuelles, une surcharge d'opérateur, un héritage multiple, des modèles, une gestion des exceptions, etc. La norme du langage de programmation C ++ a été ratifiée ISO / IEC 14882: 1998 en 1998 et la version actuelle est la version 2003, ISO / IEC 14882: 2003 qui est en fait la version corrigée du C ++ 1998. Le "Library Technical Report 1", publié en 2005 donne des détails sur les extensions de la bibliothèque standard sans faire partie de la version standard. Une nouvelle version de la norme (officieusement connue sous le nom de C ++ 0x) est en cours de développement. C ++ est un langage de programmation commerciale très réussi depuis 1990. Bien que C ++ soit libre de droits, sa documentation n'est pas disponible gratuitement.

Utilisation de C contre C ++

C s'est avéré très utile pour exécuter des applications codées en langage assembleur en raison de ses points forts comme un simple compilateur, des niveaux d'accès à la mémoire inférieurs, une prise en charge du temps d'exécution plus faible et un langage de construction efficace qui était synchronisé avec les instructions matérielles. Un autre de ses crédits est qu'il est très portable (compatible avec une variété de systèmes d'exploitation et de plates-formes) avec des changements de code source très minimes. Ainsi, il a permis des opérations à distance et l'indépendance du matériel. C est également conforme à une variété de normes, ce qui le rend compatible avec tout.

C ++ est connu comme un langage de niveau intermédiaire. En raison du fait que le C ++ comprend à la fois des fonctionnalités de langage de haut niveau et de bas niveau. Certains des adjectifs utilisés pour décrire le C ++ sont de type statique, de forme libre, multi-paradigmes et prennent en charge la programmation procédurale.

Stroustrup, lors de la programmation de sa thèse de doctorat, a constaté que le langage Simula avait des fonctionnalités de haut niveau utiles pour le développement de gros logiciels, mais était trop lent pour une utilisation pratique, tandis que le BCPL (langage) était rapide, mais trop bas et donc inadapté au développement de gros logiciels. Dans les laboratoires Bell, il a dû analyser le noyau UNIX en ce qui concerne l'informatique distribuée, ce qui a créé d'autres problèmes et il s'est proposé d'améliorer C (en raison de sa nature ultra portable) avec des fonctionnalités de Simula. C ++ a été créé en 1983 avec des fonctionnalités supplémentaires telles que les fonctions virtuelles, le nom de la fonction et la surcharge de l'opérateur, les références, les constantes, la mémoire de stockage libre contrôlée par l'utilisateur, la vérification de type améliorée et les commentaires sur une seule ligne avec deux barres obliques (//). Le Cfront (version commerciale) a été publié en 1985 avec la classe, la classe dérivée, la vérification de type forte, l'inline et les fonctionnalités d'argument par défaut. 1985 a également vu la sortie du langage de programmation C ++, une référence importante au langage en l'absence d'une norme officielle. Cela a été suivi par la sortie du C ++ 2.0 en 1989 avec des fonctionnalités comme l'héritage multiple, les classes abstraites, les fonctions membres statiques, les fonctions membres const et les membres protégés. Des fonctionnalités telles que les modèles, les exceptions, les espaces de noms, les nouvelles conversions et le type booléen ont été ajoutées après 1990.

Parallèlement au langage, sa bibliothèque a également évolué, avec plusieurs ajouts comme la bibliothèque d'E / S de flux, la bibliothèque de modèles standard, etc.

Les premières éditions du livre K & R écrites par Dennis Ritchie & Brian Kernighan (nom original: The C Programming Language) décrivent leur version de C comme le K & RC avec des spécifications complètes, tandis que les éditions ultérieures incluent l'ANSI (American National Standards Institut) Normes C. Certaines des principales caractéristiques décrites sont l'introduction de divers types de données, la suppression de plusieurs ambiguïtés sémantiques, l'omission d'autres déclarations de fonctions, etc. Même après l'introduction de l'ANSI C, le K & RC est resté le langage de programmation le plus portable pour les programmeurs. en raison de ses compatibilités plus larges.

Les déclarations de fonction K&R n'incluaient aucune information sur les arguments de fonction conduisant à l'inexécution des vérifications de type de paramètre de fonction, bien que certains compilateurs aient émis un message d'avertissement si une fonction locale était appelée avec le mauvais nombre d'arguments ou si plusieurs appels à une fonction externe étaient utilisés différents nombres d'arguments. Des outils tels que l'utilitaire lint d'UNIX ont été créés pour vérifier la cohérence des fonctions utilisées dans plusieurs fichiers source.

Caractéristiques linguistiques

Caractéristiques de C

Certaines des caractéristiques importantes de C sont les suivantes:

  1. Installations de programmation structurées
  2. Confirmation aux traditions ALGOL
  3. Évaluation des courts-circuits - utilisation d'un seul opérande si le résultat peut être déterminé avec lui seul
  4. Système de typage statique pour éviter les opérations involontaires
  5. Paramètres de valeur passés en rapport avec le passage de valeur de pointeur
  6. Combinaison et manipulation de données hétérogènes
  7. Mots-clés réservés et texte source au format libre
  8. Plus grand nombre d'opérateurs composés, tels que + =, ++
  9. Grande capacité de masquage variable, bien que les définitions de fonction ne soient pas imbriquables
  10. Caractère - utilisation entière similaire au langage d'assemblage
  11. Accès de bas niveau à la mémoire de l'ordinateur via des adresses de machine et des pointeurs tapés
  12. Les pointeurs de fonction permettent des formes rudimentaires de fermetures et d'exécution polymorphe
  13. Arithmétique du pointeur définie Indexation du tableau (notion secondaire)
  14. Processeur standardisé pour définir les macros, y compris les fichiers de code source et les compilations conditionnelles
  15. Entrées / sorties complexes et fonctions mathématiques avec délégation cohérente aux routines de bibliothèque
  16. Syntaxe identique à «B» (le prédécesseur de C) mais différente d'ALGOL, par exemple: {...} remplacé begin ... end, && et || remplacé et & ou, qui
  17. Alors que B utilisait & et | dans les deux sens, C les a rendus syntaxiquement distincts des opérateurs bit à bit
  18. Similitudes avec Fortran, par exemple: le signe égal pour l'affectation (copie) et deux signes égaux consécutifs pour tester l'égalité (comparer à EQ) ou le signe égal dans BASIC)

D'autres fonctionnalités non officielles ajoutées avec le temps étaient:

  1. fonctions nulles
  2. Fonctions renvoyant des types struct ou union au lieu de pointeurs
  3. Affectations activées pour les types de données de structure
  4. qualificatif const pour rendre un objet en lecture seule
  5. Types énumérés
  6. Création d'outils pour éviter les problèmes inhérents à la langue

Bientôt C est devenu assez puissant pour que le noyau UNIX (écrit dans un langage d'assemblage) soit réécrit, ce qui en fait l'un des premiers noyaux d'OS écrits dans un langage en dehors des langages d'assemblage.

Caractéristiques du C ++

  1. C ++ est conçu pour être un langage à usage général typé statiquement qui est aussi efficace et portable que C
  2. C ++ est conçu pour prendre en charge directement et de manière globale plusieurs styles de programmation (programmation procédurale, abstraction de données, programmation orientée objet et programmation générique)
  3. C ++ est conçu pour donner au programmeur le choix, même si cela lui permet de choisir incorrectement
  4. C ++ est conçu pour être aussi compatible avec C que possible, offrant ainsi une transition en douceur de C
  5. C ++ évite les fonctionnalités spécifiques à la plate-forme ou non générales
  6. C ++ n'entraîne pas de surcharge pour les fonctionnalités qui ne sont pas utilisées
  7. C ++ est conçu pour fonctionner sans environnement de programmation sophistiqué

Le polymorphisme, l'une des principales qualités du C ++, permet à de nombreuses implémentations avec une seule interphase et aux objets d'agir selon les circonstances. C ++ prend en charge les polymorphismes statiques (au moment de la compilation) et dynamiques (au moment de l'exécution). Le polymorphisme à la compilation ne permet pas certaines décisions d'exécution, tandis que le polymorphisme à l'exécution entraîne généralement une baisse des performances. C ++, bien que considéré comme un sur-ensemble de C, il existe quelques différences qui rendent certains codes C valides non valides en C ++ ou se comportent différemment en C ++. Des problèmes comme le C ++ définissant de nouveaux mots clés, à savoir la nouvelle classe &, qui sont utilisés comme identificateurs dans C. Les codes C et C ++ peuvent être mélangés en déclarant tout code C qui doit être appelé depuis / utilisé en C ++ avec la liaison C et en le plaçant dans un bloc externe "C" {/ * code C * /}.

Développements dans les deux langues

Avec le temps, la normalisation est devenue de plus en plus importante en raison du grand nombre d'extensions et d'une bibliothèque aléatoire avec une popularité croissante du langage et du manque d'implémentation précise des compilateurs selon les spécifications. L'un des objectifs du processus de normalisation C était de produire un surensemble de K&R C, incorporant de nombreuses fonctionnalités non officielles introduites par la suite. Cependant, le comité des normes a inclus plusieurs nouvelles fonctionnalités telles que des prototypes de fonctions, des pointeurs vides, la prise en charge de jeux de caractères et de paramètres régionaux internationaux et un préprocesseur plus performant. La syntaxe des déclarations de paramètres a également été augmentée. Après les années 1970, C a remplacé BASIC en tant que principal langage de programmation de microprocesseurs et est devenu populaire grâce à sa collaboration avec les PC IBM. Pendant ce temps, Bjarne Stroustrup et d'autres de Bell Labs ont commencé à travailler sur la création du C ++, qui a ajouté des constructions de langage de programmation orienté objet à C.En outre, ANSI a formé un comité en 1983 appelé X3J11, pour établir une spécification standard de C et en 1989, le la norme a été ratifiée comme ANSI X3.159-1989 "Programming Language C." Il s'agit de la version de C souvent appelée ANSI C, Standard C ou C89. Le C90, introduit en 1990, était le même que le C89 sauf quelques modifications mineures. Alors que le C ++ a évolué rapidement, le C est resté statique jusqu'en 1995, lorsque l'Amendement normatif 1 a créé une nouvelle norme qui a subi une nouvelle révision, conduisant à la publication de l'ISO 9899: 1999 en 1999. Cette norme est communément appelée "C99". Il a été adopté en tant que norme ANSI en mars 2000. Certaines des nouvelles fonctions sont mentionnées ci-dessous:

  • Fonctions en ligne
  • Possibilité de déclarer des variables n'importe où, au lieu de seulement après une autre déclaration ou au début d'une instruction composée
  • Nouveaux types de données comme long long int, types entiers étendus facultatifs, type de données booléen explicite et type complexe pour désigner les nombres complexes
  • Les longueurs de tableau peuvent être variables
  • Commentaires d'une ligne commençant par // pris en charge
  • Fonctions de bibliothèque comme snprintf
  • Nouveaux fichiers d'en-tête, tels que stdbool.h et inttypes.h
  • Fonctions mathématiques génériques de type (tgmath.h)
  • Prise en charge améliorée de la virgule flottante IEEE
  • Initialiseurs désignés
  • Littéraux composés
  • Prise en charge des macros variadiques (macros d'arité variable)

C ++, tout en continuant d'évoluer pour répondre aux exigences du futur, une version plus récente appelée C ++ 0x indiquant qu'il devrait sortir avant 2010 est en cours de développement. Des indications suggèrent que C ++ continuera à tirer parti de sa nature multi-paradigme et des améliorations notables pourraient être une prise en charge native du threading et des concepts, facilitant ainsi le travail avec les templetes. Plus controversé, l'ajout de la collecte des ordures fait actuellement l'objet de vives discussions. Un groupe appelé Boost.org, qui conseille le comité des normes C ++ sur les bonnes fonctionnalités et les améliorations requises, travaille intensivement pour développer C ++ dans sa forme actuelle avec des capacités fonctionnelles et de métaprogrammation étendues.

Dans The Design and Evolution of C ++ (1994), Bjarne Stroustrup décrit quelques règles qu'il a utilisées pour concevoir le C ++. Connaître les règles permet de comprendre pourquoi le C ++ est ainsi. Beaucoup plus de détails peuvent être trouvés dans La conception et l'évolution de C ++.

Influences

L'influence de C peut être attribuée à des travaux comme awk, csh, C ++, C #, D, Objective-C, Concurrent-C, BitC, Java et JavaScript, Limbo, Perl, PHP, etc. Certaines des principales implémentations de C incluent le Borland C, Watcom C, GCC et MSVC. Le C ++, à son actif, a influencé d'autres travaux comme D, C #, ADA 95, Aikido, Java & PHP.

Critiques de C vs. C ++

Malgré sa popularité, C a été critiqué pour avoir des opérations souhaitables trop difficiles à réaliser et des opérations indésirables trop faciles à invoquer accidentellement, impliquant ainsi plus de compétences, d'expérience, d'efforts et d'attention aux détails du programmeur que d'autres langages de programmation pour une utilisation sûre et efficace de la langue.

Lorsque les langages orientés objet sont devenus populaires, C ++ était une extension de C qui fournissait des capacités orientées objet avec C ++ implémenté à l'origine comme un préprocesseur - le code source a été traduit en C, puis compilé avec un compilateur C.

Le C ++ étant dérivé de C, il se trouve également qu'il hérite de la plupart des critiques adressées à C. Mais puisque le langage est en fait une composition de deux langages différents, ainsi que la charge de programmes énormes, finissent souvent par rendre la compilation énorme et inappropriée en termes de taille pure. Lorsque ce problème est tenté d'être évité, en désactivant certains des codes marginaux, il a de nouveau été critiqué pour avoir perdu plusieurs utilitaires importants. Le créateur de C ++ estime également que C ++ est justifié d'être un langage complexe, car les exigences de programmation modernes ont également augmenté de manière considérable par rapport aux années passées.

Articles Connexes