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 :

schéma des lettres aux mots catégorisé - analogie : une phrase

schéma des lettres aux mots catégorisé - analogie : caractères

schéma des lettres aux mots catégorisé - analogie : jetons

schéma des lettres aux mots catégorisé - analogie

La même chose avec un programme :

schéma des lettres aux mots catégorisé - analogie

schéma des lettres aux mots catégorisé - analogie

schéma des lettres aux mots catégorisé - analogie

schéma des lettres aux mots catégorisé - analogie

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) :

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’objet Math.

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 identificateurs console et log 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 et 914909 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 personne bonjour ! 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 de var : le mot-clé réservé ne sera pas reconnu
  • wille au lieu de ville 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éral Stockholm.

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

  1. Wikipedia contributors. “Lexical analysis.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 27 Jan. 2017. Web. 2 Mar. 2017. 

  2. Wikipedia contributors. “Identifier.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 1 Mar. 2017. Web. 2 Mar. 2017. 

  3. Wikipedia contributors. “Delimiter.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 5 Jan. 2017. Web. 2 Mar. 2017.