Langages de programmation

Le langage, dans le sens courant, est un ensemble de réactions qui permettent aux individus de communiquer.

Si nous désirons communiquer avec un ordinateur pour lui donner les instructions nécessaires à l'accomplissement de certaines tàches, nous allons utiliser un langage de programmation.

Remarque : le langage de programmation est un moyen de communication de l'individu vers l'ordinateur. Les règles de communications d'un ordinateur avec un autre ordinateur sont les protocoles.

Inhoudsopgave Haut

Evolution des langages

Nous pouvons partir d'un type de représentation le plus proche de la machine, pour aller vers le langage le plus proche des réactions humaines.

Les langages de premières générations sont des langages qui désignent de manière précise les emplacements mémoire et les instructions basiques à effectuer.
Nous retrouvons ici le langage machine, au départ sous la forme de bits 1 ou 0.
Par facilité, le code hexadécimal a été utilisé par la suite dans le langage machine.
Le langage assembleur est un langage de deuxième niveau.

Les langages de haut niveau (HLL : high-level languages) permettent une plus grande portabilité, et une certaine distance vis à vis des compétences techniques particulières du cœur de l'ordinateur.

Les langages 4GL (fourth-Generation Languages) permettent cette distance vis à vis des compétences techniques, et les langages 5GL offrent une programmation déclarative et logique (les efforts sont dirigés vers le problème, et non plus vers la méthode de résolution).

Inhoudsopgave Haut

Traductions

Les langages de haut niveau permettent une approche plus humaine, mais ils ne sont pas compris par l'ordinateur.
Nous devons donc traduire les instructions de notre langage de haut niveau vers un langage que l'ordinateur comprend.

Deux types de traductions sont possibles : l'interprétation et la compilation.

Inhoudsopgave Haut

Interprétation

Le code n'est pas traité préalablement. Un programme extérieur est nécessaire (interpréteur), ce programme traduit au fur et à mesure les instructions.

L'avantage de l'interprétation est que le code est plus indépendant de la machine sur laquelle il sera exécuté. C'est l'interpréteur qui est spécifique à l'environnement de travail, et non pas le code de départ.

Inhoudsopgave Haut

Compilation

Imaginons le cas d'une boucle : à chaque passage, les instructions situées dans le corps de la boucle devraient être interprétées. Cela n'est pas nécessaire (bien que les interpréteurs actuels sont optimisés, et que de nombreuses solutions alternatives existent, comme un mélange d'interprétation et de compilation).

La compilation permet donc de réaliser une seule fois le travail de traduction. Un fichier unique est réalisé (code que le processeur est capable de comprendre dans le cas d'une machine concrète, ou de plus haut niveau dans le cas d'une machine abstraite).

L'avantage de la compilation est que le code produit est généralement optimisé en fonction de l'architecture et du système d'exploitation sur lesquels le code doit être ensuite exécuté.

Certains langages gardent quand même une certaine indépendance, le code compilé de manière plus ou moins générique étant ensuite exécuté par une machine abstraite (ou machine virtuelle1) qui assure la traduction de ce code vers un code plus spécifique. Exemples de machines abstraites : p-machine (langage Pascal), machine virtuelle Java, framework .NET, etc.

Inhoudsopgave Haut

Phases de la compilation/interprétation

Les deux premiers conçepts suivants s'appliqueront tant à la compilation qu'à l'interprétation.

Nous retrouvons trois grandes phases dans la compilation :

  1. « Analyse lexicale » (en anglais, “lexical analysis”).
  2. « Analyse syntaxique » (en anglais, “syntactic analysis”).
  3. Génération du code.

Le code écrit dans un langage de haut niveau est soumis à ces différents processus (qui peuvent chacun retourner des erreurs) pour générer un code compréhensible par la machine auquel il est destiné4.

Inhoudsopgave Haut

Analyse lexicale

Le code source est analysé caractère par caractère. Ces derniers sont groupés en « jetons » (en anglais, “tokens”), comme une phrase pourrait être découpée en mots.
Chaque caractère doit être identifié comme symbole terminal ou appartenant à un ensemble symbole terminal, ou non.
C'est dans cette phase que sont retirés les espaces redondants et les commentaires.

Chaque jeton est composé

  • d'un type qui indique quel type de symbole terminal le jeton représente
  • d'une valeur

Inhoudsopgave Haut

Analyse syntaxique

Dans cette phase, le code est confronté aux règles syntaxiques du langage utilisé (vérification des délimiteurs d'instruction, une parenthèse ouverte doit être fermée, etc.).

Le résultat se présente sous une forme arborescente, et nous pouvons rencontrer deux grands types de « parcours analytiques » (en anglais, “parsing”) :

  • « parcours analytique ascendant » (en anglais, “bottom-up parcing”) : des feuilles à la racine, par comparaison avec les voisins.
  • « parcours analytique descendant » (en anglais, “topdown parcing”) : de la racine vers les feuilles (méthode plus rapide).

Dans les deux cas, l'analyseur syntaxique (parcer) travaille par tàtonnements et retours (backtracking).

Inhoudsopgave Haut

Fast parcing

Une autre méthode analytique est l'« analyse syntaxique rapide » (en anglais, “fast parcing”) qui permet d'éviter les lenteurs du “backtracking” (en français, « retour en arrière »), gràce à l'utilisation de mots réservés.
L'écriture du code est soumise à plus plus de rigueur, car il faut tenir compte des contraintes du langage, mais le gain de temps est considérable.

Inhoudsopgave Haut

Génération du code

La troisième étape (en compilation seulement) est la génération d'une suite d'instructions en code machine, correspondant au programme.
C'est à ce moment que l'espace mémoire nécessaire est mesuré.

Structure d'un compilateur

La structure d'un compilateur comporte en réalité un nombre plus élevé de composantsref 2 :

flot de caractères
étape 1 de la compilation |
  |   |
« Analyseur lexical » (en anglais, “scanner”) | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Reconnaître les "mots" (les unités lexicales). |   |   |
« flot d'unités lexicales » (en anglais, “tokens flow”)
étape 2 de la compilation |
  |   |
« Analyseur syntaxique » (en anglais, “parser”) | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Reconnaître les "phrases". |   |   |
arbre abstrait
étape 3 de la compilation |
  |   |
Analyseur sémantique | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Vérifier les types et les coercitions du langage. |   |   |
arbre abstrait
étape 4 de la compilation |
  |   |
Générateur de code intermédiaire | Interaction entre les modules de la compilation Interaction entre les modules de la compilation | Table des symboles |
Exemples : code à 3 adresses, arbre syntaxique, etc. |   |   |
représentation intermédiaire
étape 5 de la compilation |
  |   |
Optimiseur de code indépendant de la machine | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Rapide, plus court, moins coûteux en ressources, etc. |   |   |
représentation intermédiaire
étape 6 de la compilation |
  |   |
Générateur de code | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
code pour la machine cible
étape 7 de la compilation |
  |   |
Optimiseur de code dépendant de la machine | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
code pour la machine cible |   |   |
  | flot de caractères
étape 1 de la compilation |
  |   |
  | « Analyseur lexical »11 | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | Reconnaître les "mots" (les unités lexicales). |   |   |
  | « flot d'unités lexicales »12
étape 2 de la compilation |
  |   |
Alternative  | Crible | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Alternative  | Récupérer les "mots" au travers d'un filtre. |   |   |
Alternative  | unités lexicales
étape 3 de la compilation |
  |   |
  | « Analyseur syntaxique »13 | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | Reconnaître les "phrases". |   |   |
  | arbre abstrait
étape 4 de la compilation |
  |   |
  | Analyseur sémantique | Interaction entre les modules de la compilation Interaction entre les modules de la compilation | Table des symboles |
  | Vérifier les types et les coercitions du langage. |   |   |
  | arbre abstrait
étape 5 de la compilation |
  |   |
  | Générateur de code intermédiaire | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | Exemples : code à 3 adresses, arbre syntaxique, etc. |   |   |
  | représentation intermédiaire
étape 6 de la compilation |
  |   |
  | Optimiseur de code indépendant de la machine | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | Rapide, plus court, moins coûteux en ressources, etc. |   |   |
  | représentation intermédiaire
étape 7 de la compilation |
  |   |
Alternative  | Alloueur de mémoire | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
Alternative  | Choisir la place en mémoire des variables, des fonctions, etc. Allocations pour les registres. |   |   |
Alternative  | représentation intermédiaire |   |   |
  | Générateur de code | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | code pour la machine cible |   |   |
  | Optimiseur de code dépendant de la machine | Interaction entre les modules de la compilation Interaction entre les modules de la compilation |   |
  | code pour la machine cible |   |   |

En pratique, cependant, certaines phases sont implémentées au sein d'un même module. Nous retrouvons alors une découpe en trois parties suivantes :

  • « Partie avant » (en anglais, “front-ends compiler”)
    • Analyse lexicale.
    • Crible.
    • Analyse syntaxique.
    • Analyse sémantique.
  • « Partie centrale » (en anglais, “middle-ends compiler”)
  • « Partie arrière » (en anglais, “back-ends compiler”)
    • Génération du code dépendant de la machine.
    • Optimisation du code.

L'avantage de ce type de découpe du compilateur est que nous pouvons alors construire rapidement un compilateur pour un nouveau langage car nous devons seulement réaliser la partie avant.

Table des symboles

L'exemple de compilateur LSD010 qui est proposé sur ce site ne remplit la table des symboles que lorsque l'AST [“Abstract Syntaxic Tree”18] est totalement construit.

Nederlandse vertaling

U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.

Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.

Bij voorbaat dank.

Document heeft de 12/02/2004 gemaakt, de laatste keer de 31/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/langages-programmation.html

De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.

Notes

  1.  Machine abstraite : Le terme le plus utilisé est "machine virtuelle", mais il est plus correct de parler de "machine abstraite", par opposition à la "machine concrète".

  2.  Analyse lexicale : komt overeen met “lexical analysis” en anglais

  3.  Analyse syntaxique : komt overeen met “syntactic analysis” en anglais

  4.  Machine : Le terme machine est utilisé ici tant pour désigner une "machine concrète" qu'une "machine abstraite"".

  5.  jetons : komt overeen met “tokens” en anglais

  6.  parcours analytiques : komt overeen met “parsing” en anglais

  7.  parcours analytique ascendant : komt overeen met “bottom-up parcing” en anglais

  8.  parcours analytique descendant : komt overeen met “topdown parcing” en anglais

  9.  analyse syntaxique rapide : komt overeen met “fast parcing” en anglais

  10.  backtracking : komt overeen met « retour en arrière » en français

  11. a,b Analyseur lexical : komt overeen met “scanner” en anglais

  12. a,b flot d'unités lexicales : komt overeen met “tokens flow” en anglais

  13. a,b Analyseur syntaxique : komt overeen met “parser” en anglais

  14.  Partie avant : komt overeen met “front-ends compiler” en anglais

  15.  Partie centrale : komt overeen met “middle-ends compiler” en anglais

  16.  Partie arrière : komt overeen met “back-ends compiler” en anglais

  17.  LSD010 : Langage Simple et Didactique Il existe une un certain nombre d'interprétations de l'acronyme LSD (Langage Symbolique Didactique, Langage Sans Difficulté, Langage Simple et Didactique). LSD010 est la version 2010 de la suite LSD80, LSD_02, LSD03, LSD04, LSD05, LSD06, LSD07, LSD08, et LSD09.

  18. a,b Abstract Syntaxic Tree : komt overeen met « arbre syntaxique abstrait » en français

  19.  AST : “Abstract Syntaxic Tree” (en français, « arbre syntaxique abstrait »)

Inhoudsopgave Haut

Referenties

  1. boek Taal van het document:uk Programming Languages : ECIS, Compilers and Programming Languages Translators (2005)
  2. boek Taal van het document:fr Compilateurs : A. Aho, M. Lam, R. Sethi, J. Ulman, Principes; techniques et outils

Deze verwijzingen en links verwijzen naar documenten die geraadpleegd zijn tijdens het schrijven van deze pagina, of die aanvullende informatie kunnen geven, maar de auteurs van deze bronnen kunnen niet verantwoordelijk worden gehouden voor de inhoud van deze pagina.
De auteur Deze site is als enige verantwoordelijk voor de manier waarop de verschillende concepten, en de vrijheden die met de referentiewerken worden genomen, hier worden gepresenteerd. Vergeet niet dat u meerdere broninformatie moet doorgeven om het risico op fouten te verkleinen.

Inhoudsopgave Haut