Maison / Navigateurs / Langage de programmation C. Aperçu des principales activités des Compilateurs CC SIT et des environnements de développement

Langage de programmation C. Aperçu des principales activités des Compilateurs CC SIT et des environnements de développement

cours pratique

Ce que c'est?

À une certaine époque (1991-1992), choisir une langue Si En tant que principal langage de programmation pour les cours de mathématiques, l'auteur a été confronté au problème du manque de manuels normaux pouvant être recommandés aux écoliers. Cela l'a obligé à rédiger ses notes de cours, que l'on pourrait appeler "Cours pratique de programmation en Si» — il contenait les informations dont l'auteur avait réellement besoin dans la pratique. De nombreuses années d'expérience dans l'enseignement ont montré que les notes sont très demandées et largement utilisées aussi bien par les écoliers que par les diplômés.

L'environnement de développement est un shell Dev-C++ gratuit et open source qui inclut le compilateur GCC.

L'auteur sera reconnaissant pour vos commentaires et critiques constructives concernant le contenu et la conception de ces documents. Si vous remarquez une erreur ou avez des suggestions, des commentaires, des plaintes, des demandes ou des déclarations, écrivez.

Accord de licence

  1. 1) publication de documents sous quelque forme que ce soit, y compris la publication de documents sur d'autres sites Web ;
  2. 2) distribution de documents incomplets ou modifiés ;
  3. 3) inclusion de matériaux dans des collections sur n'importe quel support ;
  4. 4) obtenir des avantages commerciaux de la vente ou d'une autre utilisation de matériaux.

Le téléchargement de matériel signifie que vous acceptez les termes de cet accord de licence.

Télécharger

Le résumé est distribué librement au format PDF. Nécessite le logiciel gratuit Acrobat Reader pour visualiser. Le plan de cours est divisé en 4 parties :

  1. Introduction à la programmation en C (860 Ko) 29.03.2014
    Étudier les constructions linguistiques de base et les techniques d'écriture de programmes.
  2. Stockage et traitement des données (792 Ko) 21.11.2013
    Langage C : tableaux, matrices, structures, chaînes de caractères, structures, récursivité.
  3. Développement de programmes en langage C (937 Ko) 01.03.2014
    Techniques de conception de programmes, programmation structurée, algorithmes entiers, méthodes numériques, modélisation.
  4. Structures de données dynamiques en langage C (666 Ko) 11.06.2009
    Listes, piles, arbres, graphiques.

Présentations

Les enseignants et les étudiants peuvent bénéficier de présentations basées sur ce résumé. Ils peuvent être téléchargés sur la page Présentations.

Méthodologie

L'objectif principal est de présenter aux étudiants les structures de base de la langue. Si: boucles, instructions conditionnelles, procédures. L'étude des sections liées au graphisme et à l'animation est très réussie.

8e année

Le programme comprend les sections suivantes (une partie du résumé est indiquée entre parenthèses) : Tableaux (II), Utilisation de fichiers (II), Chaînes de caractères (II), Rotation d'objets (III), Modélisation (III). Une attention particulière est accordée à l'étude des algorithmes permettant de travailler avec des tableaux, notamment la recherche, le tri, etc. Le concept de l'efficacité des méthodes informatiques est donné.

9e année

L'accent principal est mis sur l'étude méthodes de développement de logiciels dans la langue Si. Les étudiants accomplissent une tâche individuelle au cours de laquelle ils apprennent à construire des graphiques à l'écran, à se familiariser avec les transformations de systèmes de coordonnées, à étudier les méthodes de résolution d'équations, à se familiariser avec les méthodes numériques et à concevoir correctement des programmes (Sections 1-2 de la partie III). Une des tâches est consacrée à l'utilisation Méthode Monte Carlo pour calculer l'aire d'une figure complexe. À partir des nouvelles sections, nous étudions également Matrices (II), tableaux de chaînes de caractères (II). Le concept est introduit pointeurs et les opérations les plus simples avec eux sont étudiées.

10 e année

Apprendre une langue Si atteint un niveau plus sérieux. Les thèmes principaux - Gestion de la mémoire (II), Récursion (II), Structures (II). Il est prévu d'étudier Pascal comme deuxième langage de programmation. Désormais, les algorithmes des cours théoriques sont écrits alternativement en deux langues.

11e année

Ce ne sont pas tant les caractéristiques des langages qui sont étudiées que les algorithmes. Sections principales - Méthodes numériques (III), Modélisation (III), Structures de données dynamiques (IV).

Comprenez comment fonctionnent les boucles. Les boucles sont l’un des aspects les plus importants de la programmation car elles permettent d’exécuter des blocs de code individuels à plusieurs reprises jusqu’à ce qu’une certaine condition soit remplie. Cela facilite l'écriture d'actions répétitives par programmation et vous évite d'avoir à écrire de nouvelles conditions chaque fois que vous souhaitez que le programme fasse quelque chose.

  • Il existe trois principaux types de boucles : FOR, WHILE et DO...WHILE.
  • Utilisez une boucle FOR. C’est le cycle le plus populaire et le plus utile. Il continue d'exécuter la fonction donnée jusqu'à ce que les conditions définies dans FOR soient remplies. Les boucles FOR nécessitent que trois conditions soient spécifiées : la variable à initialiser, la condition à satisfaire et comment mettre à jour la valeur de la variable. Si vous n'avez pas besoin de ces trois conditions, vous devez laisser un espace avec un point-virgule à la place, auquel cas la boucle durera éternellement.

    #inclure int main () ( int y ; pour ( y = 0 ; y< 15 ; y ++ ){ printf ( "%d \n " , y ); } getchar (); }

    • Dans le programme ci-dessus, la valeur initiale de la variable y est nulle et la boucle continue jusqu'à ce que la valeur de la variable reste inférieure à 15. Chaque fois qu'une nouvelle valeur de y est affichée, elle est incrémentée de un et la boucle se répète. Dès que la variable y est égale à 15, la boucle se terminera.
  • Utilisez une boucle WHILE. Les boucles WHILE sont plus simples que les boucles FOR. Ils ne définissent qu'une seule condition et la boucle s'exécute tant que cette condition est remplie. Ici, vous n'avez pas besoin d'initialiser ou de mettre à jour la variable, mais cela peut être fait dans la partie principale du code de la boucle elle-même.

    #inclure int main () ( int y ; tandis que ( y<= 15 ){ printf ( "%d \n " , y ); y ++ ; } getchar (); }

    • La commande y++ ajoute un à la valeur de la variable y à chaque fois que la boucle est exécutée. Dès que la variable y devient 16 (notez que la boucle doit être exécutée jusqu'à ce que la variable inférieur ou égal à 15), le cycle s'arrête.
  • Appliquer une boucle FAIRE...ALORS QUE. Cette boucle est très utile dans les cas où les opérations de boucle doivent être effectuées au moins une fois. Dans les boucles FOR et WHILE, la condition est vérifiée au tout début, c'est-à-dire que si un faux résultat est obtenu, l'opération spécifiée par la condition est ignorée et n'est pas effectuée. La boucle DO...WHILE vérifie les conditions à la toute fin, ce qui permet à la boucle d'être exécutée au moins une fois.

    #inclure int main () ( int y ; y = 5 ; do ( printf ( "La boucle est en cours d'exécution ! \n " ); ) while ( y != 5 ); getchar ( ; )

    • Cette boucle affichera le message prévu même si le test de condition échoue. La variable y est définie sur cinq et la boucle doit se répéter lorsque la variable n'est pas égale à cinq, la boucle est donc quittée. Le message s'affiche une seule fois à l'écran, puisque la condition n'est vérifiée qu'à la toute fin.
    • La clause WHILE dans une boucle DO...WHILE doit se terminer par un point-virgule. C'est la seule boucle qui nécessite un point-virgule à la fin.
  • Conseil intersectoriel de normalisation des technologies de l'information du Comité RSPP de réglementation technique, de normalisation et d'évaluation de la conformité.

    Connectez-vous à l'ancien site Web TK-MTK-22

    Veuillez excuser toute erreur temporaire. Le portail est en cours de développement, certaines sections sont donc temporairement bloquées.

    Le Centre de compétences dans le domaine de la normalisation des technologies de l'information (CC SIT) a été créé dans le but de développer les capacités du Conseil intersectoriel du Comité RSPP sur la réglementation technique, la normalisation et l'évaluation de la conformité (ci-après dénommé le Conseil). La pratique a montré que le fonctionnement du Conseil uniquement en tant qu'organe consultatif ne produit plus l'effet souhaité face aux nouvelles tâches.

    Avec l'adoption et le début de la mise en œuvre du programme sur l'économie numérique, de nouveaux défis ont commencé à surgir dans le domaine de la normalisation informatique. Tout d'abord, le manque d'informations disponibles pour les spécialistes dans ce domaine a été révélé, de nombreuses décisions ne sont pas suffisamment justifiées d'un point de vue scientifique, sont obsolètes ou manquent des réglementations et actes législatifs nécessaires, et le manque de personnel spécialisé est devenu évident. . Et surtout, des solutions interministérielles ou intersectorielles sont nécessaires dans le domaine de la création d'un espace d'information unifié, qui devrait devenir un facteur important dans la transition vers une nouvelle structure technologique.

    Le statut du Conseil en tant qu'organisme public a cessé de satisfaire aux tâches émergentes et le besoin s'est fait sentir de créer une structure ayant le statut de personne morale, à laquelle pourraient être confiées de nouvelles tâches dans le domaine de la normalisation informatique.

    Bilan des principales activités du Comité central du SIT

    Standardisation

    Qu'est-ce qu'une norme informatique - devrait devenir une norme informatique - ne devrait pas être une norme informatique

    Le C est un langage de programmation assez « ancien » ; il a été créé au début des années 70. Malgré cela, le C est un langage vivant dans le sens où il est activement utilisé aujourd’hui. Il a été inventé, utilisé et est utilisé pour écrire des parties importantes du code de programme des systèmes d'exploitation de type Unix. Il est également utilisé pour écrire des utilitaires, des compilateurs et, plus rarement, des programmes d'application. C'est pourquoi C est appelé langage de programmation système.

    Sa survivabilité s’explique par le fait que les principes de fonctionnement des systèmes d’exploitation sont relativement universels ; ils ne sont pas soumis aux progrès et à la diversité que l’on peut observer dans l’environnement des logiciels de bureau et mobiles, ainsi que des applications Web. Le C n’est pas un langage de très haut niveau, il est plus proche de l’architecture informatique. En conséquence, les programmes C sont compacts et rapides.

    C ne prend pas en charge la programmation orientée objet. La prise en charge de la POO est implémentée en C++. Bien que ce dernier soit issu du langage C, il n'en est pas une « continuation », mais un langage à part entière qui peut être appris sans connaître le C. Cependant, apprendre le C est utile avant de faire connaissance avec son « petit frère avancé », car La syntaxe des langages est similaire, C ne surcharge pas le cerveau d'un programmeur novice de super pouvoirs et lui apprend à comprendre l'essence de ce qui se passe.

    Le C est-il bon pour se lancer dans la programmation pour la première fois ? Si vous n'étudiez pas dans une université dans une spécialité liée à l'informatique, alors non. Le C nécessite une compréhension de l’organisation et du fonctionnement du matériel, en particulier de la mémoire. Une grande partie de cela se fait avec des pointeurs, ils jouent un rôle clé ; ce sujet est assez difficile à comprendre et n’est généralement pas étudié à l’école.

    Bien entendu, vous pouvez apprendre les bases de la programmation en C sans avoir à apprendre les pointeurs. Cependant, une personne pensera connaître C sans en savoir grand-chose en substance. Le langage C a été créé par des programmeurs professionnels connaissant le matériel informatique pour écrire le système d'exploitation UNIX. Il n’était pas destiné à être une langue destinée à enseigner aux débutants.

    Environnements et compilateurs pour la programmation C

    Si vous utilisez l'une des distributions GNU/Linux, n'importe quel éditeur de texte avec coloration syntaxique fera l'affaire, vous aurez également besoin de GCC et d'un terminal.

    Il existe des éditeurs pour les programmeurs qui incluent divers modules complémentaires, notamment un terminal, une navigation dans les répertoires, etc. Par exemple, Geany ou Atom.

    C est un langage de programmation compilé. Sous GNU/Linux, pour obtenir des fichiers exécutables, on utilise GCC - un ensemble de compilateurs, y compris un compilateur pour C. Pour obtenir un fichier exécutable à partir d'un fichier source (ces fichiers ont généralement l'extension *.c), vous devez exécuter une commande dans le terminal qui ressemble à ceci :

    gcc -o bonjour bonjour.c

    Où gcc est une commande qui lance un programme qui effectue une compilation et d'autres actions ; -o – un commutateur indiquant que nous spécifions manuellement le nom du fichier exécutable ; bonjour – nom du fichier exécutable résultant ; bonjour.c est le nom du fichier de code source. Le nom du fichier exécutable peut être omis :

    gcc bonjour.c

    Dans ce cas, le fichier exécutable aura le nom par défaut a.out.

    Windows possède son propre ensemble de compilateurs - MinGW. Il peut être utilisé seul, mais est inclus dans l'environnement de développement simple Dev-C++, qui peut être un bon choix pour apprendre à programmer en C et C++.

    Lors de l'enregistrement, sélectionnez le type de fichier "Fichiers source C (*.c)". Le programme est compilé et lancé en appuyant sur la touche F9. Après exécution, le programme se ferme immédiatement et le résultat n'est pas visible. Pour éviter que cela ne se produise, écrivez deux lignes supplémentaires : #include et getch(). (Cela peut ne pas être pertinent pour une version plus récente de Dev-C++.)

    "Bonjour tout le monde" dans GNU/Linux :

    #inclure \n") ; }

    "Bonjour tout le monde" sous Windows :

    #inclure #inclure int main() (printf("Bonjour tout le monde \n") ; getch(); )

    D’autre part, il existe un grand nombre d’environnements de développement multiplateformes. Par exemple, module Eclipse + CDT, KDevelop, CLion. Ce dernier est payant, produit par JetBrains, leader du développement d'IDE, mais dispose d'une période d'essai de 30 jours, ce qui peut suffire pour une formation. CLion est plus pratique que les autres IDE.

    "Bonjour tout le monde" en C

    A l'aide de l'exemple d'un programme simple, notons immédiatement quelques fonctionnalités du langage de programmation C.

    En langage C, la fonction main() joue le rôle de branche principale du programme. Cette fonction doit toujours être présente dans un programme C complet et l'exécution du programme commence par elle. Cependant, les variables déclarées à l'intérieur ne sont pas globales ; leur portée s'étend uniquement à main(). Cependant, dans le langage de programmation C, presque tout le code du programme est contenu dans une fonction, et la fonction main() est la fonction principale et requise.

    Par défaut, la fonction main() renvoie un type de données int, vous n'avez donc pas besoin de spécifier un type de retour. Cependant, le compilateur émet un avertissement dans ce cas.

    La fonction printf() est conçue pour imprimer des données. Son objectif est similaire à la procédure write() en Pascal et à la fonction print() en Python. La fonction printf() ne passe pas à une nouvelle ligne après l'impression. Par conséquent, un caractère spécial est utilisé pour la transition, désigné par la combinaison \n. Les expressions C complètes sont séparées par des points-virgules.

    En C, les fonctions d'E/S ne font pas partie du langage. Par exemple, en Python, nous n'avons pas besoin d'importer de module pour utiliser les fonctions print() et input(). En C, nous ne pouvons pas simplement appeler la fonction printf(), car C lui-même ne l'a tout simplement pas. Cette fonction, ainsi que plusieurs autres, peut être activée à l'aide du fichier d'en-tête stdio.h. C'est précisément pourquoi la ligne est écrite au début du programme #inclure . Include est traduit de l'anglais par « allumer », et stdio est l'abréviation de « entrée-sortie standard ».

    Les fichiers d'en-tête (ils se terminent par *.h) contiennent généralement des déclarations de certaines fonctions. Une déclaration est simplement une description d'une fonction : quels paramètres elle prend et ce qu'elle renvoie. Le code de fonction lui-même (définition) ne se trouve pas dans le fichier d'en-tête, mais dans des bibliothèques (autres fichiers), qui peuvent déjà être compilées et situées dans les répertoires système. Avant de compiler un programme, on lance le préprocesseur du langage C. Entre autres choses, il inclut au début du fichier programme le contenu des fichiers d'en-tête qui y sont spécifiés.

    Travaux pratiques

    Commentez la première ligne du code HelloWorld. Essayez de compiler le programme. Avez-vous réussi à obtenir le fichier exécutable ? Quel avertissement le compilateur a-t-il donné ?

    1 // - commentaire sur une ligne en langage C ; /* … */ - commentaire multiligne en langage C.

    Particularités

    Revoir

    Le langage de programmation C se caractérise par le minimalisme. Les auteurs du langage voulaient que les programmes soient facilement compilés à l'aide d'un compilateur en un seul passage, après compilation, chaque composant élémentaire du programme correspondait à un très petit nombre d'instructions machine, et l'utilisation des éléments de base du langage ne impliquer une bibliothèque d'exécution. Un compilateur en un seul passage compile un programme sans revenir au texte déjà compilé. L’utilisation d’une fonction doit donc être précédée de sa déclaration. Le code C peut être facilement écrit à un faible niveau d’abstraction, presque comme un langage assembleur. C est parfois appelé « assembleur universel » ou « assembleur de haut niveau », ce qui reflète les différences entre les langages d'assemblage pour différentes plates-formes et l'unité du standard C, dont le code peut être compilé sans modification sur presque tous les ordinateurs. modèle. C est souvent appelé un langage niveau moyen ou même niveau faible, compte tenu de sa proximité avec les appareils réels.

    Les compilateurs C sont relativement faciles à développer en raison du niveau relativement bas du langage et d'un ensemble modeste d'éléments. Par conséquent, le langage est disponible sur une grande variété de plateformes (peut-être plus de plateformes que n’importe quelle autre langue existante). De plus, malgré sa nature de bas niveau, le langage vous permet de créer des programmes portables et assiste le programmeur dans cette tâche. Les programmes conformes à une norme de langage peuvent être compilés sur une grande variété d'ordinateurs.

    Programme "Bonjour le monde !"

    Ce programme simple, apparu dans la première édition de The C Programming Language de Kernighan et Ritchie, est généralement le premier programme de la plupart des manuels C. Elle tape le message « Hello World ! » sur le périphérique de sortie standard (qui est généralement un moniteur (affichage), mais peut également être un fichier, un périphérique ou une zone de mémoire, selon la façon dont le périphérique de sortie standard est reflété sur une plate-forme donnée).

    Main() ( printf ("Bonjour le monde ! \n") ; }

    Bien que ce programme puisse compiler correctement sur la plupart des compilateurs modernes, il génère plusieurs avertissements sur les compilateurs ANSI C. De plus, ce code ne sera pas compilé si le compilateur suit strictement la norme

    #inclure int main(void) ( printf ("Bonjour le monde ! \n") ; renvoie 0 ; )

    La première ligne du programme contient la directive du préprocesseur #include ; lorsqu'il la rencontre, le compilateur la remplace par le texte intégral du fichier auquel elle fait référence. Dans ce cas, cette ligne sera remplacée par le fichier d'en-tête standard

    La ligne suivante est la déclaration d'une fonction appelée main. Cette fonction du programme C est spéciale, car elle est exécutée en premier au démarrage du programme, c'est-à-dire qu'elle sert de ce qu'on appelle point d'entrée au programme.

    Les accolades après la fonction principale indiquent sa définition. Le mot int indique que la fonction principale renvoie (calcule) un entier. Le mot void indique que la fonction principale ne nécessite aucun paramètre ou argument de la part de l'appelant.

    La ligne suivante "appelle" ou exécute la fonction stdio.h et contient des informations décrivant comment la fonction doit être appelée. Dans cet exemple, un seul argument est transmis à cette fonction, contenant la chaîne de texte « Hello, World!\n » . La séquence \n est traduite en un caractère « nouvelle ligne » qui, lorsqu'il est affiché, désigne en conséquence un saut de ligne. La fonction printf renvoie une valeur int, qui est complètement ignorée dans cet exemple.

    L'instruction return amène le programme à arrêter d'exécuter la fonction donnée (main dans ce cas), renvoyant à la fonction appelante la valeur spécifiée après le mot-clé return (0 dans ce cas). Puisque la fonction actuelle est main , l’appelant est celui qui a démarré le programme. La dernière accolade marque la fin de la définition de la fonction principale.

    commentaires

    Le texte entouré des symboles /* et */ dans cet ordre est complètement ignoré par le compilateur. Les compilateurs compatibles C99 autorisent également les commentaires commençant par // et se terminant par une nouvelle ligne.

    Les types

    Stockage de données

    L'une des fonctions les plus importantes de tout langage de programmation est de fournir des capacités de gestion de la mémoire et des objets qui y sont stockés.

    Il existe trois manières différentes d'allouer de la mémoire aux objets en C :

    • Allocation de mémoire statique: un espace pour les objets est créé dans la zone de stockage des données du code du programme au moment de la compilation ; la durée de vie de ces objets coïncide avec la durée de vie de ce code.
    • Allocation automatique de mémoire: les objets peuvent être temporairement stockés sur la pile ; cette mémoire est alors automatiquement libérée et peut être réutilisée après que le programme quitte le bloc l'utilisant.
    • Allocation de mémoire dynamique: Des blocs de mémoire de la taille souhaitée peuvent être demandés lors de l'exécution du programme à l'aide des fonctions de la bibliothèque malloc, realloc et free à partir d'une zone mémoire appelée le tas. Ces blocs sont libérés et peuvent être réutilisés après avoir appelé la fonction free sur eux.

    Ces trois méthodes de stockage de données conviennent à différentes situations et présentent leurs propres avantages et inconvénients. Par exemple, l'allocation de mémoire statique n'a pas de surcharge d'allocation, l'allocation automatique n'a qu'une petite surcharge d'allocation, mais l'allocation dynamique a une surcharge potentiellement importante en termes d'allocation et de désallocation. D’un autre côté, la mémoire pile est beaucoup plus limitée que la mémoire statique ou tas. Seule la mémoire dynamique peut être utilisée dans les cas où la taille des objets utilisés est inconnue à l'avance. La plupart des programmes C font un usage intensif de ces trois méthodes.

    Dans la mesure du possible, l'allocation de mémoire automatique ou statique est préférable car cette méthode de stockage des objets est contrôlée par le compilateur, ce qui libère le programmeur des tracas liés à l'allocation et à la libération manuelles de la mémoire, qui est généralement une source d'erreurs de programme difficiles à trouver. Malheureusement, de nombreuses structures de données ont une taille variable au moment de l'exécution. Ainsi, comme les zones allouées automatiquement et statiquement doivent avoir une taille fixe connue au moment de la compilation, il est très courant d'utiliser l'allocation dynamique. Les tableaux de taille variable constituent l’exemple le plus courant de ce type d’utilisation de la mémoire.

    Ensemble de symboles utilisés

    Le langage C a été créé après l'introduction du standard Fortran ; Lisp et Cobol n'utilisaient que des parenthèses (), mais C a des parenthèses (), des carrés et des boucles (). De plus, C fait la différence entre les lettres majuscules et minuscules, tandis que les langues plus anciennes utilisaient uniquement des lettres majuscules.

    Problèmes

    De nombreux éléments C sont potentiellement dangereux et les conséquences d’une mauvaise utilisation de ces éléments sont souvent imprévisibles. Kernighan dit : " C est un outil très pointu : il peut être utilisé pour créer à la fois un programme élégant et un désordre sanglant." En raison du niveau relativement bas du langage, de nombreuses utilisations abusives d'éléments dangereux ne sont pas et ne peuvent pas être détectées ni à la compilation ni à l'exécution. Cela conduit souvent à un comportement imprévisible du programme. Parfois, en raison d'une utilisation analphabète d'éléments linguistiques, des failles de sécurité apparaissent. Il convient de noter que l’utilisation d’un grand nombre de ces éléments peut être évitée.

    La source d'erreur la plus courante est l'accès à un élément de tableau inexistant. Bien que C prenne directement en charge les tableaux statiques, il ne dispose pas de vérificateurs d'index de tableau (vérifications de limites). Par exemple, il est possible d'écrire sur le sixième élément d'un tableau de cinq éléments, ce qui conduira naturellement à des résultats imprévisibles. Un cas particulier d’une telle erreur est appelé erreur de dépassement de tampon. Ces types d'erreurs entraînent la plupart des problèmes de sécurité.

    Une autre source potentielle de situations dangereuses est le mécanisme du pointeur. Un pointeur peut faire référence à n'importe quel objet en mémoire, y compris le code d'un programme exécutable, et une utilisation incorrecte des pointeurs peut produire des effets imprévisibles et entraîner des conséquences catastrophiques. Par exemple, un pointeur peut ne pas être initialisé ou, suite à des opérations arithmétiques incorrectes du pointeur, pointer vers un emplacement mémoire arbitraire ; sur certaines plates-formes, travailler avec un tel pointeur peut provoquer un arrêt matériel du programme ; sur des plates-formes non protégées, cela peut conduire à une corruption de données arbitraires en mémoire, et cette corruption peut apparaître aux moments les plus arbitraires et bien plus tard que le moment de l'exécution. la corruption. De plus, la zone de mémoire dynamique à laquelle le pointeur fait référence peut être libérée (et même allouée par la suite à un autre objet) - de tels pointeurs sont appelés « suspendus ». Ou, à l'inverse, après avoir manipulé des pointeurs vers une zone de mémoire dynamique, il se peut qu'il ne reste plus de références, et alors cette zone, appelée « poubelle », ne sera jamais libérée, ce qui peut entraîner des « fuites de mémoire » dans le programme. D'autres langages tentent de résoudre des problèmes similaires en introduisant des types de référence plus restrictifs.

    Un autre problème est que les objets créés automatiquement et dynamiquement ne sont pas initialisés et peuvent contenir des valeurs restant en mémoire à partir d'objets précédemment supprimés. Cette valeur est complètement imprévisible, elle change d'une machine à l'autre, d'une exécution à l'autre, d'un appel de fonction à l'autre. Si un programme utilise une telle valeur, le résultat sera imprévisible et n'apparaîtra pas nécessairement immédiatement. Les compilateurs modernes tentent de diagnostiquer ce problème par une analyse du code source, bien qu'en général cela ne puisse pas être résolu par une analyse statique.

    Un autre problème courant est que la mémoire ne peut pas être réutilisée tant qu'elle n'est pas libérée par le programmeur à l'aide de la fonction free(). En conséquence, le programmeur peut accidentellement oublier de libérer cette mémoire, mais continuer à l'allouer, occupant de plus en plus d'espace. Ceci est désigné par le terme fuite de mémoire. A l’inverse, il est possible de libérer de la mémoire trop tôt mais de continuer à l’utiliser. Étant donné que le système d'allocation peut utiliser la mémoire libérée différemment, cela entraîne des conséquences imprévisibles. Ces problèmes sont résolus dans les langages récupérés. En revanche, si la mémoire est allouée dans une fonction et doit être libérée après la sortie de la fonction, ce problème est résolu en appelant automatiquement des destructeurs en C++, ou en utilisant des tableaux locaux utilisant des extensions C99.

    Les fonctions à argument variable sont également une source potentielle de problèmes. Contrairement aux fonctions ordinaires qui ont un prototype, la norme ne réglemente pas le test des fonctions avec un nombre variable d'arguments. Si un mauvais type de données est transmis, des résultats imprévisibles, voire fatals, se produisent. Par exemple, la famille de fonctions printf de la bibliothèque standard C, utilisée pour générer du texte formaté pour la sortie, est bien connue pour son interface variable-argument potentiellement dangereuse, qui est décrite par une chaîne de format. La vérification du type dans les fonctions variadiques relève de la responsabilité de chaque implémentation de fonction variadique, mais de nombreux compilateurs modernes vérifient spécifiquement les types dans chaque appel printf, générant des avertissements lorsque la liste d'arguments ne correspond pas à la chaîne de format. Il convient de noter qu'il est impossible de contrôler statiquement même tous les appels à la fonction printf, car la chaîne de format peut être créée dynamiquement dans le programme, donc en règle générale, le compilateur n'effectue aucune vérification pour d'autres fonctions avec un numéro variable. d'arguments.

    Pour aider les programmeurs C à résoudre ces problèmes et bien d’autres, un grand nombre d’outils distincts des compilateurs ont été créés. Ces outils incluent des programmes pour une vérification supplémentaire du code source et la détection des erreurs courantes, ainsi que des bibliothèques qui fournissent des fonctions supplémentaires non incluses dans la norme du langage, telles que la vérification des limites des tableaux ou une forme limitée de garbage collection.

    Histoire

    Premiers développements

    Le langage de programmation C a été développé aux Bell Labs entre 1973 et 1973. Selon Ritchie, la période de créativité la plus active s’est produite en 1972. La langue a été appelée « C » (C est la troisième lettre de l’alphabet latin) car bon nombre de ses caractéristiques proviennent de l’ancienne langue « B » (B est la deuxième lettre de l’alphabet latin). Il existe plusieurs versions différentes de l’origine du nom Bi. Ken Thompson évoque un langage de programmation

    Il existe plusieurs légendes concernant les raisons du développement du C et sa relation avec le système d'exploitation, comme pour les affichages graphiques ;

  • certains compilateurs n'adhèrent pas par défaut à la norme ANSI C, ou à son successeur ; ou
  • ils sont conçus pour s'adapter à une taille spécifique de certains types de données ou à une manière spécifique de stocker ces données en mémoire pour une plate-forme spécifique.
  • C99

    Article principal: En 1995, le premier amendement réglementaire a été apporté à la norme C, mais presque personne ne l'a reconnu). Cependant, à la fin des années 1990, la norme a été révisée, conduisant à la publication OIN 9899:1999 en 1999 . Cette norme est habituellement appelée « C99 ». En mars 2000, il a été adopté et adapté par l'ANSI.

    Voici quelques nouveautés du C99 :

    • fonctions en ligne (en ligne);
    • aucune restriction sur la déclaration de variables locales (comme en C++) ;
    • de nouveaux types de données tels que long long int (pour faciliter la transition des nombres de 32 à 64 bits), un type de données booléen explicite et un type complexe pour représenter des nombres complexes ;
    • tableaux de longueur variable ;
    • prise en charge des pointeurs restreints (restrict);
    • initialisation nommée des structures : struct ( int x, y, z; ) point = ( .y=10, .z=20, .x=30 );
    • prise en charge des commentaires sur une seule ligne commençant par // , empruntés au C++ (de nombreux compilateurs C les prenaient auparavant en charge en complément) ;
    • plusieurs nouvelles fonctions de bibliothèque telles que snprintf ;
    • plusieurs nouveaux fichiers d'en-tête, tels que stdint.h.

    L'intérêt pour la prise en charge des nouvelles fonctionnalités du C99 est actuellement mitigé. Alors que GCC, le compilateur C de Sun Microsystems et plusieurs autres compilateurs prennent actuellement en charge la plupart des nouvelles fonctionnalités C99, ce n'est pas le cas des compilateurs de Microsoft et les deux sociétés ne semblent pas les ajouter.

    Connexion avec C++

    Priorité des opérations en C

    Les opérations sont répertoriées ci-dessous par ordre décroissant de priorité. Les opérations répertoriées sur la même ligne ont la même priorité. Les opérations marquées R->L sont associatives à droite (c'est-à-dire que lors de la combinaison d'opérations de priorité égale sans parenthèses, elles sont évaluées de droite à gauche ; cependant, l'ordre dans lequel les arguments de la plupart des opérations sont évalués n'est pas spécifié et dépend des implémentations. ) :

    Opérations Postfix () . -> ++ --
    Opérations unaires (R->L) ++ -- & * + - ~ ! taille de (type)
    Multiplicatif * / %
    Additif + -
    Tondre << >>
    Comparaison des opérations < > <= >=
    Opérations de tests d’égalité == !=
    Au niveau du bit & ^ |
    casse-tête && ||
    Fonctionnement conditionnel (R->L) ?:
    Opérations d'affectation (R->L) = *= /= %= += -= <<= >>= &= ^= |=
    Calcul séquentiel ,

    Compilateurs C célèbres

    • OpenWatcom

    Compilateurs pour langages et plateformes dynamiques

    Parfois, afin de transférer certaines bibliothèques, fonctions et outils écrits en C vers un autre environnement, il est nécessaire de compiler du code C dans un langage de niveau supérieur ou dans du code de machine virtuelle conçu pour un tel langage.

    Les projets suivants sont destinés à ces fins :

    • Alchemy est un compilateur C/C++ pour les applications Flash et Adobe AIR.
    • AMPC - Compilateur C pour machine virtuelle

      Remarques

      voir également

      • Cyclone (langage de programmation) - un dialecte sécurisé du langage C
      • Catégorie:Compilateurs C

      Liens

      • Accueil officiel ISO/IEC JTC1/SC22/WG14 (anglais) . - Page officielle du groupe de travail international sur la normalisation du langage de programmation C. Récupéré le 20 février 2009.