Comment un ordinateur lit-il un programme ?
Nous allons voir ici, grossièrement, comment un ordinateur passe d’une suite de caractères à un programme exécutable.
Le but est de se faire une idée générale de ce processus, de mettre en évidence les notions d’erreurs lexicales et syntaxiques, ainsi que de voir le vocabulaire permettant de désigner les unités de base d’un programme.
I. analyse lexicale
En informatique, l’analyse lexicale (lexical analysis) est le processus de conversion d’une séquence de caractères (par exemple un programme ou d’une page web) en une séquence de jetons (des chaînes de caractère auxquelles sont assigné une signification et donc un sens précis, en anglais tokens).
Un programme qui procède à cette analyse peut être appelé un analyseur lexical (en anglais lexer, tokeniser, ou scanner, bien que scanner soit aussi le terme pour la première étape opérée par un analyseur lexical).
Un analyseur lexical est en général combiné avec un analyseur syntaxique (parser), lesquels analysent ensemble la syntaxe de langages de programmation, page webs, etc.1
Il s’agit donc de passer d’une suite d’éléments ‘caractères’, sans signification particulière en tant que tels, à une suite de ‘jetons’, dont le type est connu et signifiant. On pourrait faire une analogie avec le passage pour l’humain des lettres aux mots :
La même chose avec un programme :
catégories de jetons
Différents langages auront différentes catégories de jetons. On va prendre ici un modèle fictif (quoique extrêmement proche de celui de Python par exemple) :
identifier
(identificateur) : des noms déterminés par le langage ou par le programmeur.keyword
oureserved keyword
(mot-clé ou mot-clé réservé) : les noms définis par le langage sont dits réservés, ils ne peuvent pas être utilisés pour un autre usage que celui défini par le langage.
operator
(opérateur) : des symboles qui opèrent sur des arguments et produisent une valeur.delimiter
oupunctuator
(séparateur) : caractères permettant de délimiter différentes parties indépendantes d’un flux de données.literal
(littéral) : une représentation d’une valeur directement dans le code source.comment
(commentaire) : il s’agit d’indications, de documentation à l’intention du lecteur humain de programme (qui peut être le programmeur lui-même).
Les identificateurs, ou identifiants (identifiers)
En informatique, les identificateurs sont des jetons lexicaux qui nomment des entités.2
Les identificateurs sont des noms, mots déterminés par le langage ou par l’utilisateur.
l’utilisateur peut s’en servir, par exemple, pour associer un nom facilement mémorisable à une valeur en mémoire.
Exemple
// créé la variable nombre_aleatoire
// et lui assigne un nombre aléatoire entre 0 et 1
var nombre_aleatoire = Math.random();
var
est un identificateur défini par le langage. On parle alors de mot-clé où de mot-clé réservé.
nombre_aleatoire
est un identificateur défini par l’utilisateur
Math
est un identificateur correspondant à un objet présent dans l’environnement, fourni avec le langage.
random
est un identificateur correspondant à une procédure contenue dans l’objetMath
.
Les mots-clés du langage ne sont généralement pas utilisables comme identificateurs. Ils sont généralement d’un nombre limité.
Exemple : liste des 33 mots-clés réservés en ECMAscript 5 (version actuelle de la spécification correspondant au JavaScript utilisé dans les navigateurs)
liste | ||||
---|---|---|---|---|
break | case | catch | class | const |
continue | debugger | default | delete | do |
else | export | extends | finally | for |
function | if | import | in | instanceof |
new | return | super | switch | this |
throw | try | typeof | var | void |
while | with | yield |
Voir aussi : liste des objets fournis avec le langage
Les opérateurs (operators)
Les opérateurs sont des symboles qui opèrent sur des arguments et produisent une valeur. On parle d’opérateur unaire si celui-ci ne prend qu’une valeur, d’opérateur binaire s’il en prend deux, ou d’opérateur ternaire s’il en prend trois.
Exemples
// opérateurs binaires
1 + 1 // renvoie 2
2 - 1 // renvoie 1
// opérateur unaire
n++ // renvoie n + 1 et assigne à n la valeur n + 1
// opérateur ternaire
// a ? b : c ;
0 > 1 ? 'si vrai' ? 'si faux' ; // si a est vrai, renvoie b, sinon renvoie c
Les séparateurs (delimiters ou punctuators)
A delimiter is a sequence of one or more characters used to specify the boundary between separate, independent regions in plain text or other data streams.
Un séparateur (delimiter) est une séquence d’un ou plusieurs caractères utilisés pour spécifier les limites entre des régions séparées, indépendantes d’un texte brut ou d’un autre flux de données.3
var ville = 'Stockholm';
console.log(ville);
Plusieurs séparateur sont présents ici : Le point-virgule, qui permet de délimiter des instructions les apostrophes droites permettant de délimiter la chaîne de caractère
Stockholm
le point permettant de séparer les identificateursconsole
etlog
les parenthèses, permettant de délimiter une zone ou placer des arguments.
Les séparateurs (delimiters ou punctuators en anglais) sont des signes, qui
Les littéraux
In computer science, a literal is a notation for representing a fixed value in source code. (source : Wikipédia)
En informatique, un littéral est une notation représentant dans le code source une valeur fixe.
Un littéral est une valeur présente littéralement dans un code source.
Exemples
var ville = 'Stockholm';
var nombre_d_habitants = 914909;
ici
var
,ville
,nombre_d_habitants
sont des identificateurs, ce sont des index qui renvoient à autre chose. Par contre,Stockholm
et914909
sont des littéraux : ils valent pour eux-même.
Par analogie :
Pierre dit 'bonjour !'.
ici
Pierre
est un identificateur : c’est un index qui pointe vers une personnebonjour !
est un littéral: c’est littéralement ce que dit Pierre
Les commentaires (comments)
In computer programming, a comment is a programmer-readable explanation or annotation in the source code of a computer program. They are added with the purpose of making the source code easier for humans to understand, and are generally ignored by compilers and interpreters. (source : Wikipédia)
En programmation, un commentaire est une explication ou annotation dans le code source d’un programme, lisible par un programmeur. Ils sont ajoutés avec le but de rendre le code source plus facile à comprendre par les humains, et sont généralement totalement ignorés par les compilateurs et interpréteurs.
exemples
en JavaScript
// commentaire sur une ligne
/* commentaire
sur plusieurs lignes
(multilignes) */
en Python
# commentaire sur une ligne
""" commentaire
sur plusieurs lignes
(multilignes) """
Les erreurs de nature lexicale
Un premier type d’erreur peut à ce stade être anticipée : les erreurs dues à des erreurs dans l’écriture des jetons, qui seront alors mal analysés.
Exemples
// mal écrit
ver wille ='Stoekolm;
// bien écrit
var ville = 'Stockholm';
Plusieurs erreurs sont présentes dans le premier exemple :
ver
au lieu devar
: le mot-clé réservé ne sera pas reconnuwille
au lieu deville
ne provoquera pas d’erreur lors de l’analyse lexicale, cela reste un identificateur valide. Mais si le programme contient une fois l’un et une fois l’autre, mais cela pourrait entrainer des dysfonctionnements lors de l’exécution.- l’absence d’espace entre
=
et'
ne provoquera pas non plus d’erreur d’analyse lexicale. C’estpar contre une inconsistance de style qui peut gêner la lecture par un humain.- De même, l’erreur d’orthographe de
Stockholm
ne perturbera pas l’analyseur lexical- Par contre, l’oubli d’un des délimitateurs
'
provoquera des erreurs, l’analyseur lexical ne pouvant alors pas déterminer les limites du littéralStockholm
.
On peut comparer ces erreurs à des erreurs d’orthographe : mal écrire les mots d’un programme peut amener à des erreurs.
II. analyse syntaxique
l’analyse syntaxique permet quant à elle de déterminer le sens des instructions formées grâce aux jetons.
Les erreurs de nature syntaxique
Une organisation précise de jetons correspond à un sens précis, et des jetons mal organisés peuvent engendrer un comportement non désiré du programme, un plantage voire une impossibilité pure et simple de procéder à l’analyse syntaxique.
exemples
// non
; ville = var 'Stockholm'
// oui
var ville = 'Stockholm';
Pour savoir comment organiser les jetons, on se réfère généralement à la documentation du langage.
notes & références
-
Wikipedia contributors. “Lexical analysis.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 27 Jan. 2017. Web. 2 Mar. 2017. ↩
-
Wikipedia contributors. “Identifier.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 1 Mar. 2017. Web. 2 Mar. 2017. ↩
-
Wikipedia contributors. “Delimiter.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 5 Jan. 2017. Web. 2 Mar. 2017. ↩