Programmation informatique - Computer programming

La programmation informatique est le processus de conception et de construction d'un programme informatique exécutable pour accomplir un résultat informatique spécifique ou pour effectuer une tâche spécifique. La programmation implique des tâches telles que : l'analyse, la génération d' algorithmes , la précision des algorithmes de profilage et la consommation de ressources, et la mise en œuvre d'algorithmes dans un langage de programmation choisi (communément appelé codage ). Le code source d'un programme est écrit dans un ou plusieurs langages intelligibles pour les programmeurs , plutôt qu'en code machine , qui est directement exécuté par l' unité centrale . Le but de la programmation est de trouver une séquence d'instructions qui va automatiser l'exécution d'une tâche (qui peut être aussi complexe qu'un système d'exploitation ) sur un ordinateur , souvent pour résoudre un problème donné. Une programmation compétente nécessite donc souvent une expertise dans plusieurs sujets différents, y compris la connaissance du domaine d'application , des algorithmes spécialisés et de la logique formelle .

Les tâches accompagnant et liées à la programmation comprennent : les tests , le débogage , la maintenance du code source , la mise en œuvre des systèmes de construction et la gestion des artefacts dérivés , tels que le code machine des programmes informatiques. Ceux-ci peuvent être considérés comme faisant partie du processus de programmation, mais le terme développement logiciel est souvent utilisé pour ce processus plus large, le terme programmation , implémentation ou codage étant réservé à l'écriture réelle du code. Le génie logiciel combine des techniques d' ingénierie avec des pratiques de développement logiciel. L'ingénierie inverse est un processus connexe utilisé par les concepteurs, les analystes et les programmeurs pour comprendre et recréer/réimplémenter.

Histoire

Ada Lovelace , dont les notes ajoutées à la fin de l' article de Luigi Menabrea incluaient le premier algorithme conçu pour être traité par un moteur analytique . Elle est souvent reconnue comme la première programmeuse informatique de l'histoire.

Les appareils programmables existent depuis des siècles. Dès le IXe siècle, un séquenceur musical programmable a été inventé par les frères persans Banu Musa , qui ont décrit un joueur de flûte mécanique automatisé dans le Livre des dispositifs ingénieux . En 1206, l'ingénieur arabe Al-Jazari a inventé une boîte à rythmes programmable où un automate mécanique musical pouvait être fait pour jouer différents rythmes et motifs de batterie, via des chevilles et des cames . En 1801, le métier à tisser Jacquard pouvait produire des tissages entièrement différents en modifiant le "programme" - une série de cartes en carton avec des trous percés.

Les algorithmes de décryptage existent également depuis des siècles. Au 9ème siècle, le mathématicien arabe Al-Kindi a décrit un algorithme cryptographique pour déchiffrer le code crypté, dans A Manuscript on Deciphering Cryptographic Messages . Il a donné la première description de la cryptanalyse par analyse de fréquence , le premier algorithme de décryptage.

Le premier programme informatique est généralement daté de 1843, lorsque le mathématicien Ada Lovelace a publié un algorithme pour calculer une séquence de nombres de Bernoulli , destiné à être porté par Charles Babbage d » analyse du moteur .

Les données et les instructions étaient autrefois stockées sur des cartes perforées externes , qui étaient conservées en ordre et disposées dans des jeux de programmes.

Dans les années 1880, Herman Hollerith a inventé le concept de stockage de données sous une forme lisible par machine. Plus tard, un panneau de commande (carte de connexion) ajouté à sa tabulatrice de type I de 1906 lui a permis d'être programmé pour différents travaux, et à la fin des années 1940, les équipements d'enregistrement d'unités tels que l' IBM 602 et l' IBM 604 , ont été programmés par des panneaux de commande dans un façon, tout comme les premiers ordinateurs électroniques . Cependant, avec le concept de l' ordinateur à programme stocké introduit en 1949, les programmes et les données étaient stockés et manipulés de la même manière dans la mémoire de l'ordinateur .

Language de machine

Le code machine était le langage des premiers programmes, écrit dans le jeu d'instructions de la machine particulière, souvent en notation binaire . Des langages d'assemblage ont rapidement été développés pour permettre au programmeur de spécifier des instructions dans un format texte (par exemple, ADD X, TOTAL), avec des abréviations pour chaque code d'opération et des noms significatifs pour spécifier les adresses. Cependant, étant donné qu'un langage assembleur n'est guère plus qu'une notation différente pour un langage machine, deux machines avec des jeux d'instructions différents ont également des langages assembleur différents.

Panneau de commande filaire pour une machine comptable IBM 402 .

Langages de compilation

Les langages de haut niveau ont rendu le processus de développement d'un programme plus simple et plus compréhensible, et moins lié au matériel sous-jacent. Le premier outil lié au compilateur, le système A-0 , a été développé en 1952 par Grace Hopper , qui a également inventé le terme « compilateur ». FORTRAN , le premier langage de haut niveau largement utilisé à avoir une implémentation fonctionnelle, est sorti en 1957, et de nombreux autres langages ont rapidement été développés, en particulier COBOL destiné au traitement des données commerciales et Lisp pour la recherche informatique.

Ces langages compilés permettent au programmeur d'écrire des programmes en termes syntaxiquement plus riches et plus capables d' abstraire le code, ce qui facilite le ciblage de différents jeux d'instructions machine via des déclarations de compilation et des heuristiques. Les compilateurs ont exploité la puissance des ordinateurs pour faciliter la programmation en permettant aux programmeurs de spécifier des calculs en entrant une formule à l'aide de la notation infixe .

Saisie du code source

Les programmes étaient encore pour la plupart saisis à l'aide de cartes perforées ou de bandes de papier . À la fin des années 1960, les dispositifs de stockage de données et les terminaux informatiques sont devenus suffisamment bon marché pour que des programmes puissent être créés en tapant directement dans les ordinateurs. Des éditeurs de texte ont également été développés qui ont permis d'apporter des modifications et des corrections beaucoup plus facilement qu'avec des cartes perforées.

Programmation moderne

Exigences de qualité

Quelle que soit l'approche du développement, le programme final doit satisfaire à certaines propriétés fondamentales. Les propriétés suivantes sont parmi les plus importantes :

  • Fiabilité : à quelle fréquence les résultats d'un programme sont-ils corrects. Cela dépend de l'exactitude conceptuelle des algorithmes et de la minimisation des erreurs de programmation, telles que les erreurs de gestion des ressources (par exemple, les débordements de mémoire tampon et les conditions de concurrence ) et les erreurs logiques (telles que les erreurs de division par zéro ou off-by-one ).
  • Robustesse : dans quelle mesure un programme anticipe les problèmes dus aux erreurs (pas aux bogues). Cela inclut des situations telles que des données incorrectes, inappropriées ou corrompues, l'indisponibilité des ressources nécessaires telles que la mémoire, les services du système d'exploitation et les connexions réseau, les erreurs de l'utilisateur et les pannes de courant inattendues.
  • Facilité d'utilisation : l' ergonomie d'un programme : la facilité avec laquelle une personne peut utiliser le programme aux fins prévues ou même dans certains cas à des fins imprévues. De tels problèmes peuvent faire ou défaire son succès, même indépendamment des autres problèmes. Cela implique un large éventail d'éléments textuels, graphiques et parfois matériels qui améliorent la clarté, l'intuitivité, la cohésion et l'exhaustivité de l'interface utilisateur d'un programme.
  • Portabilité : la gamme de matériel informatique et de plates-formes de système d'exploitation sur lesquelles le code source d'un programme peut être compilé / interprété et exécuté. Cela dépend des différences dans les installations de programmation fournies par les différentes plates-formes, y compris les ressources matérielles et du système d'exploitation, le comportement attendu du matériel et du système d'exploitation et la disponibilité de compilateurs spécifiques à la plate-forme (et parfois de bibliothèques) pour le langage du code source.
  • Maintenabilité : la facilité avec laquelle un programme peut être modifié par ses développeurs présents ou futurs afin d'y apporter des améliorations ou de le personnaliser, de corriger des bogues et des failles de sécurité , ou de l'adapter à de nouveaux environnements. Les bonnes pratiques lors du développement initial font la différence à cet égard. Cette qualité peut ne pas être directement apparente pour l'utilisateur final, mais elle peut affecter de manière significative le sort d'un programme sur le long terme.
  • Efficacité / performances : mesure des ressources système consommées par un programme (temps processeur, espace mémoire, périphériques lents tels que les disques, bande passante réseau et, dans une certaine mesure, même interaction avec l'utilisateur): moins, mieux c'est. Cela inclut également une gestion prudente des ressources, par exemple le nettoyage des fichiers temporaires et l'élimination des fuites de mémoire . Ceci est souvent discuté à l'ombre d'un langage de programmation choisi. Bien que le langage affecte certainement les performances, même les langages les plus lents, tels que Python , peuvent exécuter des programmes instantanément d'un point de vue humain. La vitesse, l'utilisation des ressources et les performances sont importantes pour les programmes qui goulottent le système, mais une utilisation efficace du temps du programmeur est également importante et est liée au coût : plus de matériel peut être moins cher.

Lisibilité du code source

En programmation informatique, la lisibilité fait référence à la facilité avec laquelle un lecteur humain peut comprendre le but, le flux de contrôle et le fonctionnement du code source. Cela affecte les aspects de qualité ci-dessus, y compris la portabilité, la convivialité et, surtout, la maintenabilité.

La lisibilité est importante car les programmeurs passent la majorité de leur temps à lire, à essayer de comprendre et à modifier le code source existant, plutôt que d'écrire un nouveau code source. Un code illisible entraîne souvent des bogues, des inefficacités et du code dupliqué . Une étude a révélé que quelques transformations simples de la lisibilité raccourcissaient le code et réduisaient considérablement le temps de compréhension.

Suivre un style de programmation cohérent contribue souvent à la lisibilité. Cependant, la lisibilité est plus qu'un simple style de programmation. De nombreux facteurs, n'ayant que peu ou rien à voir avec la capacité de l'ordinateur à compiler et exécuter efficacement le code, contribuent à la lisibilité. Certains de ces facteurs comprennent :

Les aspects de présentation de ceci (tels que les retraits, les sauts de ligne, la mise en évidence des couleurs, etc.) sont souvent gérés par l' éditeur de code source , mais les aspects de contenu reflètent le talent et les compétences du programmeur.

Divers langages de programmation visuels ont également été développés dans le but de résoudre les problèmes de lisibilité en adoptant des approches non traditionnelles de la structure et de l'affichage du code. Les environnements de développement intégrés (IDE) visent à intégrer toutes ces aides. Des techniques telles que la refactorisation de code peuvent améliorer la lisibilité.

Complexité algorithmique

Le domaine académique et la pratique de l'ingénierie de la programmation informatique sont tous deux largement concernés par la découverte et la mise en œuvre des algorithmes les plus efficaces pour une classe donnée de problèmes. À cette fin, les algorithmes sont classés en ordres en utilisant la notation dite Big O , qui exprime l'utilisation des ressources, telles que le temps d'exécution ou la consommation de mémoire, en termes de taille d'une entrée. Les programmeurs experts connaissent une variété d'algorithmes bien établis et leurs complexités respectives et utilisent ces connaissances pour choisir les algorithmes les mieux adaptés aux circonstances.

Algorithmes d'échecs à titre d'exemple

"Programmer un ordinateur pour jouer aux échecs" était un article de 1950 qui évaluait un algorithme "minimax" qui fait partie de l'histoire de la complexité algorithmique ; un cours sur Deep Blue d' IBM (ordinateur d'échecs) fait partie du programme d'études en informatique de l'Université de Stanford .

Méthodologies

La première étape de la plupart des processus formels de développement de logiciels est l' analyse des exigences , suivie de tests pour déterminer la modélisation de la valeur, la mise en œuvre et l'élimination des défaillances (débogage). Il existe de nombreuses approches différentes pour chacune de ces tâches. Une approche populaire pour l'analyse des exigences est l' analyse des cas d'utilisation . De nombreux programmeurs utilisent des formes de développement logiciel Agile où les différentes étapes du développement logiciel formel sont davantage intégrées dans des cycles courts qui prennent quelques semaines plutôt que des années. Il existe de nombreuses approches du processus de développement de logiciels.

Les techniques de modélisation courantes comprennent l'analyse et la conception orientées objet ( OOAD ) et l'architecture dirigée par les modèles ( MDA ). Le langage de modélisation unifié ( UML ) est une notation utilisée à la fois pour l'OOAD et le MDA.

Une technique similaire utilisée pour la conception de bases de données est la modélisation entité-relation ( ER Modeling ).

Les techniques d'implémentation incluent les langages impératifs ( orientés objet ou procédural ), les langages fonctionnels et les langages logiques .

Mesurer l'utilisation de la langue

Il est très difficile de déterminer quels sont les langages de programmation modernes les plus populaires. Les méthodes de mesure de la popularité des langages de programmation comprennent : le comptage du nombre d'offres d'emploi qui mentionnent la langue, le nombre de livres vendus et de cours enseignant la langue (cela surestime l'importance des nouvelles langues) et des estimations du nombre de lignes de code existantes écrites dans la langue (cela sous-estime le nombre d'utilisateurs de langages métier comme le COBOL).

Certains langages sont très populaires pour des types d'applications particuliers, tandis que d'autres sont régulièrement utilisés pour écrire de nombreux types d'applications. Par exemple, COBOL est toujours présent dans les centres de données d'entreprise, souvent sur de gros ordinateurs centraux , Fortran dans les applications d'ingénierie, les langages de script dans le développement Web et C dans les logiciels embarqués . De nombreuses applications utilisent un mélange de plusieurs langages dans leur construction et leur utilisation. Les nouveaux langages sont généralement conçus autour de la syntaxe d'un langage antérieur avec de nouvelles fonctionnalités ajoutées (par exemple, C++ ajoute l'orientation objet au C, et Java ajoute la gestion de la mémoire et le bytecode au C++, mais en conséquence, perd en efficacité et en capacité de faible -manipulation de niveau).

Débogage

Le premier bogue connu causant un problème dans un ordinateur était un papillon de nuit, piégé à l'intérieur d'un ordinateur central de Harvard, enregistré dans une entrée de journal de bord datée du 9 septembre 1947. "Bug" était déjà un terme courant pour un défaut logiciel lorsque ce bogue a été trouvé. .

Le débogage est une tâche très importante dans le processus de développement logiciel, car avoir des défauts dans un programme peut avoir des conséquences importantes pour ses utilisateurs. Certains langages sont plus sujets à certains types de défauts car leur spécification n'exige pas que les compilateurs effectuent autant de vérifications que d'autres langages. L'utilisation d'un outil d' analyse de code statique peut aider à détecter certains problèmes possibles. Normalement, la première étape du débogage consiste à tenter de reproduire le problème. Cela peut être une tâche non triviale, par exemple avec des processus parallèles ou certains bogues logiciels inhabituels. En outre, l'environnement utilisateur spécifique et l'historique d'utilisation peuvent rendre difficile la reproduction du problème.

Une fois le bogue reproduit, il peut être nécessaire de simplifier l'entrée du programme pour faciliter le débogage. Par exemple, lorsqu'un bogue dans un compilateur peut le faire planter lors de l' analyse d' un fichier source volumineux, une simplification du scénario de test qui entraîne seulement quelques lignes du fichier source d'origine peut être suffisante pour reproduire le même plantage. Essais et erreurs/diviser pour régner : le programmeur essaiera de supprimer certaines parties du scénario de test d'origine et vérifiera si le problème persiste. Lors du débogage du problème dans une interface graphique, le programmeur peut essayer d'ignorer certaines interactions de l'utilisateur de la description originale du problème et vérifier si les actions restantes sont suffisantes pour que des bogues apparaissent. Les scripts et les points d'arrêt font également partie de ce processus.

Le débogage est souvent effectué avec des IDE . Des débogueurs autonomes comme GDB sont également utilisés, et ceux-ci fournissent souvent moins d'environnement visuel, généralement en utilisant une ligne de commande . Certains éditeurs de texte tels qu'Emacs permettent d'invoquer GDB à travers eux, pour fournir un environnement visuel.

Langages de programmation

Différents langages de programmation prennent en charge différents styles de programmation (appelés paradigmes de programmation ). Le choix de la langue utilisée est soumis à de nombreuses considérations, telles que la politique de l'entreprise, l'adéquation à la tâche, la disponibilité de packages tiers ou les préférences individuelles. Idéalement, le langage de programmation le mieux adapté à la tâche à accomplir sera sélectionné. Les compromis de cet idéal impliquent de trouver suffisamment de programmeurs qui connaissent le langage pour constituer une équipe, la disponibilité de compilateurs pour ce langage et l'efficacité avec laquelle les programmes écrits dans un langage donné s'exécutent. Les langues forment un spectre approximatif allant du « bas niveau » au « haut niveau » ; Les langages "de bas niveau" sont généralement plus orientés machine et plus rapides à exécuter, tandis que les langages "de haut niveau" sont plus abstraits et plus faciles à utiliser mais s'exécutent moins rapidement. Il est généralement plus facile de coder dans des langages "de haut niveau" que dans des langages "de bas niveau".

Allen Downey , dans son livre Comment penser comme un informaticien , écrit :

Les détails semblent différents dans différentes langues, mais quelques instructions de base apparaissent dans presque toutes les langues :
  • Entrée : Rassemblez des données à partir du clavier, d'un fichier ou d'un autre appareil.
  • Sortie : affichez les données à l'écran ou envoyez des données vers un fichier ou un autre appareil.
  • Arithmétique : effectuez des opérations arithmétiques de base comme l'addition et la multiplication.
  • Exécution conditionnelle : vérifiez certaines conditions et exécutez la séquence d'instructions appropriée.
  • Répétition : effectuez une action à plusieurs reprises, généralement avec quelques variations.

De nombreux langages informatiques fournissent un mécanisme pour appeler les fonctions fournies par les bibliothèques partagées . À condition que les fonctions d'une bibliothèque respectent les conventions d'exécution appropriées (par exemple, la méthode de transmission des arguments ), ces fonctions peuvent être écrites dans n'importe quel autre langage.

Programmeurs

Les programmeurs informatiques sont ceux qui écrivent des logiciels informatiques. Leurs tâches impliquent généralement :

Bien que la programmation ait été présentée dans les médias comme un sujet quelque peu mathématique, certaines recherches montrent que les bons programmeurs ont de solides compétences en langages humains naturels, et qu'apprendre à coder est similaire à apprendre une langue étrangère .

Voir également

Les références

Sources

Lectures complémentaires

  • AK Hartmann, Guide pratique des simulations informatiques , Singapour : World Scientific (2009)
  • A. Hunt, D. Thomas et W. Cunningham, le programmeur pragmatique. De Compagnon à Maître , Amsterdam : Addison-Wesley Longman (1999)
  • Brian W. Kernighan, La pratique de la programmation , Pearson (1999)
  • Weinberg, Gerald M. , La psychologie de la programmation informatique , New York : Van Nostrand Reinhold (1971)
  • Edsger W. Dijkstra , Une discipline de programmation , Prentice-Hall (1976)
  • O.-J. Dahl, EWDijkstra , CAR Hoare, Programmation structurée , Academic Press (1972)
  • David Gries , La science de la programmation , Springer-Verlag (1981)

Liens externes