Langage machine, langage de programmation
À strictement parler, un ordinateur n’est rien d’autre qu’une machine effectuant des opérations simples sur des séquences de signaux électriques, lesquels sont conditionnés de manière à ne pouvoir prendre que deux états seulement (par exemple un potentiel électrique maximum ou minimum). Ces séquences de signaux obéissent à une logique du type « tout ou rien » et peuvent donc être considérés conventionnellement comme des suites de nombres ne prenant jamais que les deux valeurs 0 et 1. Un système numérique ainsi limité à deux chiffres est appelé système binaire.
Un ordinateur est totalement incapable de traiter autre chose que des nombres binaires. Toute information d’un autre type doit être convertie, ou codée, en format binaire. Cela est vrai non seulement pour les données que l’on souhaite traiter (les textes, les images, les sons, les nombres, etc.), mais aussi pour les programmes, c’est-à-dire les séquences d’instructions que l’on va fournir à la machine pour lui dire ce qu’elle doit faire avec ces données.
Le seul « langage » que l’ordinateur puisse véritablement « comprendre » est donc très éloigné de ce que nous utilisons nous-mêmes. C’est une longue suite de 1 et de 0 (les « bits ») souvent traités par groupes de 8 (les « octets »), 16, 32, ou même 64. Ce « langage machine » est évidemment presque incompréhensible pour nous. Pour « parler » à un ordinateur, il nous faudra utiliser des systèmes de traduction automatiques, capables de convertir en nombres binaires des suites de caractères formant des mots-clés (anglais en général) qui seront plus significatifs pour nous.
Ces systèmes de traduction automatique seront établis sur la base de toute une série de conventions, dont il existera évidemment de nombreuses variantes.
Le système de traduction proprement dit s’appellera interpréteur ou bien compilateur, suivant la méthode utilisée pour effectuer la traduction. On appellera langage de programmation un ensemble de mots-clés (choisis arbitrairement) associé à un ensemble de règles très précises indiquant comment assembler ces mots pour former des « phrases » que l’interpréteur ou le compilateur puisse traduire en langage machine (binaire).
Édition du code source – Interprétation
Le programme tel que nous l’écrivons dans un langage de programmation quelconque est à strictement parler un simple texte. Pour rédiger ce texte, on peut faire appel à toutes sortes de logiciels plus ou moins perfectionnés, à la condition qu’ils ne produisent que du texte brut, c’est-à-dire sans mise en page particulière ni aucun attribut de style (pas de spécification de police, donc, pas de gros titres, pas de gras, ni de souligné, ni d’italique, etc.).
Le texte ainsi produit est ce que nous appellerons désormais un code source.
Le code source doit être traduit en une suite d’instructions binaires directement compréhensibles par la machine : le « code objet ». Dans le cas de Python, cette traduction est prise en charge par un interpréteur assisté d’un pré-compilateur. Cette technique hybride (également utilisée par le langage Java) vise à exploiter au maximum les avantages de l’interprétation et de la compilation, tout en minimisant leurs inconvénients respectifs. Veuillez consulter un ouvrage d’informatique générale si vous voulez en savoir davantage sur ces deux techniques.
Sachez simplement à ce sujet que vous pourrez réaliser des programmes extrêmement performants avec Python, même s’il est indiscutable qu’un langage strictement compilé tel que le C peut toujours faire mieux en termes de rapidité d’exécution.
Mise au point d’un programme – Recherche des erreurs (debug)
La programmation est une démarche très complexe, et comme c’est le cas dans toute activité humaine, on y commet de nombreuses erreurs. Pour des raisons anecdotiques, les erreurs de programmation s’appellent des « bugs » (ou « bogues », en Français), et l’ensemble des techniques que l’on met en œuvre pour les détecter et les corriger s’appelle « debug » (ou « débogage »).
En fait, il peut exister dans un programme trois types d’erreurs assez différentes, et il convient que vous appreniez à bien les distinguer.
Erreurs de syntaxe
Python ne peut exécuter un programme que si sa syntaxe est parfaitement correcte. Dans le cas contraire, le processus s’arrête et vous obtenez un message d’erreur. Le terme syntaxe se réfère aux règles que les auteurs du langage ont établies pour la structure du programme.
Erreurs sémantiques
Le second type d’erreur est l’erreur sémantique ou erreur de logique. S’il existe une erreur de ce type dans un de vos programmes, celui-ci s’exécute parfaitement, en ce sens que vous n’obtenez aucun message d’erreur, mais le résultat n’est pas celui que vous attendiez : vous obtenez autre chose.
En réalité, le programme fait exactement ce que vous lui avez dit de faire. Le problème est que ce que vous lui avez dit de faire ne correspond pas à ce que vous vouliez qu’il fasse. La séquence d’instructions de votre programme ne correspond pas à l’objectif poursuivi. La sémantique (la logique) est incorrecte.
Erreurs à l’exécution
Le troisième type d’erreur est l’erreur en cours d’exécution (Run-time error), qui apparaît seulement lorsque votre programme fonctionne déjà, mais que des circonstances particulières se présentent (par exemple, votre programme essaie de lire un fichier qui n’existe plus). Ces erreurs sont également appelées des exceptions, parce qu’elles indiquent en général que quelque chose d’exceptionnel (et de malencontreux) s’est produit. Vous rencontrerez ce type d’erreurs lorsque vous programmerez des projets de plus en plus volumineux, et vous apprendrez plus loin dans ce cours qu’il existe des techniques particulières pour les gérer.
Recherche des erreurs et expérimentation
L’une des compétences les plus importantes à acquérir au cours de votre apprentissage est celle qui consiste à déboguer efficacement un programme. Il s’agit d’une activité intellectuelle parfois énervante mais toujours très riche, dans laquelle il faut faire montre de beaucoup de perspicacité.