Contactez-nous
Analyse lexicographique
Compilateurs
H3168 v1 Archive

Analyse lexicographique
Compilateurs

Auteur(s) : Bernard LORHO

Date de publication : 10 juin 1996

Logo Techniques de l'Ingenieur Cet article est réservé aux abonnés
Pour explorer cet article plus en profondeur Consulter l'extrait gratuit

Déjà abonné ?

Présentation

1 - Généralités

  • 1.1 - Phase et passe
  • 1.2 - Notions de grammaires

2 - Analyse lexicographique

3 - Analyse syntaxique

4 - Adressage des objets

5 - Modèle d’exécution

6 - Génération de code

  • 6.1 - Langage cible
  • 6.2 - Générateur de code
  • 6.3 - Adressage des instructions

7 - Conclusion

Sommaire

Présentation

Auteur(s)

  • Bernard LORHO : Professeur à l’Université d’Évry Val d’Essonne - Département d’informatique

Lire cet article issu d'une ressource documentaire complète, actualisée et validée par des comités scientifiques.

Lire l’article

INTRODUCTION

La compilation, c’est‐à‐dire la traduction automatisée d’un texte écrit dans un langage de programmation en un texte équivalent dans un autre langage de programmation, est née avec l’informatique. En effet, il est très vite apparu qu’il n’était pas raisonnable de programmer des applications d’une certaine taille et d’une certaine complexité dans les langages rudimentaires que sont les langages machines ou les langages d’assemblage. La raison de base de cette difficulté est simple : ces langages sont modelés sur la structure des machines et sur leur organisation, alors que les utilisateurs ont besoin de mécanismes d’expression qui soient du plus haut niveau possible et adaptés à la formulation de leurs problèmes.

De plus, la nécessité est vite apparue de viser une certaine portabilité qui permette d’écrire des programmes qui soient indépendants d’une machine donnée pour pouvoir les transporter facilement sur une autre machine. La portabilité est devenue une réalité économique forte condamnant la programmation de bas niveau. Celle‐ci n’a pas complètement disparu mais se cantonne à des domaines tout à fait spécialisés où il est indispensable de maîtriser le fonctionnement intime d’une machine.

On peut en fait dire qu’il y a nécessairement compilation dès qu’un programme est écrit. Cela implique que tout utilisateur de l’informatique compile, sans en être conscient dans la plupart des cas, comme M. Jourdain faisait de la prose...

Les langages de programmation ont commencé à se multiplier dès les débuts de l’informatique, certains se spécialisant dans des domaines d’application particuliers, d’autres essayant d’atteindre une certaine universalité. Tous ces langages « de haut niveau » constituent les langages que les compilateurs doivent être capables de traiter. Subsistent bien entendu les langages « de bas niveau » évoqués précédemment, qui sont incontournables car ce sont les seuls langages « natifs » des machines.

Le rôle des compilateurs est, en fait, à partir de programmes écrits dans un langage source, de les transformer en des programmes écrits dans un langage cible, qui peut être un langage de bas niveau ou un autre langage de haut niveau.

Ce processus de traduction doit satisfaire une contrainte très légitime qui est que les programmes cibles résultats de la compilation soient sémantiquement équivalents aux programmes sources, c’est‐à‐dire que leurs exécutions fournissent les mêmes résultats.

Arrêtons-nous un instant sur le fait qu’il peut paraître étrange de traduire un langage de haut niveau en un autre langage de haut niveau. Il y a d’excellentes raisons à une telle démarche : par exemple si, sur une machine donnée, on dispose d’un compilateur du langage C mais pas d’un compilateur d’un langage L et si l’on souhaite malgré tout prendre en compte des programmes écrits en L, il peut être plus facile d’écrire un compilateur de L vers C plutôt que d’écrire complètement un compilateur pour L.

On constate cette tendance croissante à considérer que le langage C (dont un compilateur est présent sur quasiment toutes les machines) constitue un langage cible privilégié pour de nombreux compilateurs car l’universalité de C permet de simplifier la compilation de nombreux langages. Cette démarche a l’avantage supplémentaire d’être indépendante de la machine support et donc de permettre la portabilité d’un compilateur sur plusieurs machines.

Logo Techniques de l'Ingenieur

Cet article est réservé aux abonnés.
Il vous reste 93 % à découvrir.

Pour explorer cet article Consulter l'extrait gratuit

Déjà abonné ?


VERSIONS

Il existe d'autres versions de cet article :

DOI (Digital Object Identifier)

https://doi.org/10.51257/a-v1-h3168

Lecture en cours
Présentation

Article inclus dans l'offre

"Technologies logicielles Architectures des systèmes"

(234 articles)

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques.

Des contenus enrichis

Quiz, médias, tableaux, formules, vidéos, etc.

Des modules pratiques

Opérationnels et didactiques, pour garantir l'acquisition des compétences transverses.

Des avantages inclus

Un ensemble de services exclusifs en complément des ressources.

Voir l'offre

2. Analyse lexicographique

Le texte du programme source fourni par l’utilisateur est vu par le compilateur comme une suite de caractères. On y retrouve les symboles terminaux introduits précédemment, sous la forme de caractères uniques comme « + » ou « ( », ou de groupes de caractères comme « = » suivi de « = » pour le symbole d’égalité = =, ou « e » suivi de « l » suivi de « s » suivi de « e » qui représente le mot réservé else.

L’utilisateur écrit également dans son texte source des symboles qui ne sont pas prédéfinis dans le langage : des identificateurs de variables comme « somme » ou « TOTAL », des constantes comme 1995, des chaînes de caractères comme « la compilation, c’est facile !». Le texte source peut même comprendre des entités sans utilité pour le compilateur mais intéressantes pour la lecture ou la présentation du programme : citons les commentaires (par exemple dans le langage C, tout texte compris entre les symboles « / * » et « * / ») ou des espaces, des tabulations, des lignes vides.

Le rôle de l’analyse lexicographique (encore appelée analyse lexicale) est de reconnaître ces symboles de base et de transformer la suite initiale de caractères en une suite codifiée d’unités lexicales où tous les détails d’écriture ont été éliminés. Ainsi, l’extrait de texte source C :

¼

/ * calcul de la position * /

if (position = = initial + 60)

¼

est transformé en la suite d’unités lexicales :

¼ si parouvrante identificateur (« position ») égalité identificateur (« initial ») plus nombre (« 60 ») parfermante ¼

parouvrante désigne une parenthèse ouvrante, parfermante une parenthèse fermante.

On peut aussi codifier encore plus finement la suite d’unités lexicales en remplaçant les noms des identificateurs par des références à un tableau où l’analyseur lexical place le nom des objets (identificateurs, constantes, ...) qu’il rencontre. La suite d’unités lexicales pourrait ressembler à :

¼ si parouvrante identificateur (6) égalité...

Logo Techniques de l'Ingenieur

Cet article est réservé aux abonnés.
Il vous reste 94 % à découvrir.

Pour explorer cet article Consulter l'extrait gratuit

Déjà abonné ?


Lecture en cours
Analyse lexicographique

Article inclus dans l'offre

"Technologies logicielles Architectures des systèmes"

(234 articles)

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques.

Des contenus enrichis

Quiz, médias, tableaux, formules, vidéos, etc.

Des modules pratiques

Opérationnels et didactiques, pour garantir l'acquisition des compétences transverses.

Des avantages inclus

Un ensemble de services exclusifs en complément des ressources.

Voir l'offre

Sommaire
Sommaire

BIBLIOGRAPHIE

  • (1) - AHO (A.), SETHI (R.), ULLMAN (J.) -   Compilateurs : Principe, techniques et outils.  -  InterEditions (1989).

  • (2) - FOSTER (J.M.) -   A syntax improving program,  -  Computer Journal, 11 : 1, 31-34 (1968).

  • (3) - JOHNSON (S.C.) -   Yacc – yet another compiler compiler.  -  ATT Report 32, Murray Hill (1975).

  • (4) - KNUTH (D.E.) -   On the translation of languages from left to right.  -  Information and Control, 8 : 6, 607-639 (1965).

  • (5) - KNUTH (D.E.) -   Semantics of context-free languages.  -  Math. Systems Theory, 2 : 2, 127-145 (1968).

  • (6) - KNUTH (D.E.) -   Top-down syntax analysis.  -  Acta Informatica, 1 : 2, 79-110 (1971).

  • ...

Logo Techniques de l'Ingenieur

Cet article est réservé aux abonnés.
Il vous reste 93 % à découvrir.

Pour explorer cet article Consulter l'extrait gratuit

Déjà abonné ?


Article inclus dans l'offre

"Technologies logicielles Architectures des systèmes"

(234 articles)

Une base complète d’articles

Actualisée et enrichie d’articles validés par nos comités scientifiques.

Des contenus enrichis

Quiz, médias, tableaux, formules, vidéos, etc.

Des modules pratiques

Opérationnels et didactiques, pour garantir l'acquisition des compétences transverses.

Des avantages inclus

Un ensemble de services exclusifs en complément des ressources.

Voir l'offre

Ressources documentaires

Linux embarqué

Linux est un système d'exploitation multitâche de la famille UNIX. Développé initialement sur processeur ...

Rust (langage de programmation)

Le langage de programmation Rust permet l’écriture de logiciels de haute performance, par une conception ...

Programmation par aspects

La programmation par aspects (en anglais « aspect-oriented programming ») est un style de ...

Langage UML : développement de logiciel et modélisation visuelle

Le langage UML (pour Unified Modeling Language) est un langage graphique de modélisation des systèmes ...