Le compilateur s'exécute. Compilation de langages de programmation. Traduire le bytecode en code machine

Tous les programmes informatiques sont un ensemble d’instructions de processeur constituées d’un ensemble spécifique de bits. Il existe plusieurs centaines de ces commandes et grâce à elles, toutes les actions sur votre ordinateur sont effectuées. Mais écrire des programmes directement à l’aide de ces commandes est difficile. Par conséquent, divers langages de programmation ont été inventés, plus faciles à comprendre pour les humains.

Pour préparer un programme à l'exécution, un programme spécial l'assemble à partir du code source dans un langage de programmation en code machine - instructions du processeur. Ce processus est appelé compilation. Linux est un logiciel libre et les codes sources des programmes sont donc accessibles à tous. Si le programme n'est pas dans le référentiel ou si vous souhaitez faire quelque chose de non standard, vous pouvez compiler le programme.

Dans cet article, nous examinerons comment les programmes Linux sont compilés, comment fonctionne le processus de compilation et également avec quelle flexibilité vous pouvez tout configurer.

Nous compilerons des programmes écrits en C ou C++, car c'est le langage le plus utilisé pour les programmes nécessitant une compilation. Nous avons déjà un peu abordé ce sujet dans l'article installation depuis tar.gz sous Linux, mais cet article s'adresse davantage aux débutants qui n'ont pas tant besoin de le comprendre que d'obtenir un programme prêt à l'emploi.

Dans le même article, le sujet est abordé plus en détail. Comme vous pouvez l'imaginer, un logiciel spécial est nécessaire pour transformer le code source en commandes du processeur. Nous utiliserons le compilateur GCC. Pour l'installer ainsi que tous les outils nécessaires sur Ubuntu, exécutez :

sudo apt install build-essential manpages-dev git automake autoconf

Ensuite, vous pouvez vérifier la bonne installation et la version du compilateur :

Mais avant de passer à la compilation du programme lui-même, examinons plus en détail les composants de ce processus.

Comment se fait la compilation ?

Compiler un programme Linux est un processus assez complexe. C'est encore plus compliqué car le code du programme n'est pas contenu dans un seul fichier ni même dans tous ses fichiers sources. Chaque programme utilise de nombreuses bibliothèques système contenant des fonctions standard. De plus, le même code doit fonctionner sur différents systèmes contenant différentes versions des bibliothèques.

Dans un premier temps, avant même le début de la compilation, un outil spécial doit vérifier si votre système est compatible avec le programme et si toutes les bibliothèques nécessaires sont disponibles. S'il manque quelque chose, une erreur sera générée et vous devrez résoudre le problème.

Vient ensuite l'analyse et la conversion du code source en code objet ; cette étape pourrait être supprimée, mais cela est nécessaire pour que le compilateur puisse effectuer diverses optimisations, réduire la taille du programme final et rendre les commandes du processeur plus efficaces.

Ensuite, tous les fichiers objets sont rassemblés dans un seul programme et liés aux bibliothèques système. Après avoir terminé cette étape, il ne reste plus qu'à installer le programme dans le système de fichiers et c'est tout. Ce sont les principales phases de la compilation d’un programme, et passons maintenant à la pratique.

Compilation de programmes Linux

La première chose dont nous avons besoin est le code source du programme lui-même. Dans cet exemple, nous allons construire la dernière version de vim. Il s'agit d'un programme totalement neutre, assez simple et utile à tout le monde, il est donc parfait comme exemple.

Obtenir des sources

La première chose dont nous avons besoin est le code source du programme, qui peut être trouvé sur GitHub. Vous pouvez trouver les sources de la plupart des programmes Linux sur GitHub. De plus, il y a des instructions de montage :

Téléchargeons les sources de notre programme à l'aide de l'utilitaire git :

git clone https://github.com/vim/vim

Vous pouvez également télécharger l'archive sur le site Web, puis la décompresser dans le dossier souhaité, mais ce serait plus pratique. L'utilitaire créera un dossier avec le nom du programme, nous devons le faire fonctionner :

Configuration de la configuration

Ensuite, nous devons exécuter un script qui vérifiera la compatibilité de notre programme avec le système et configurera les paramètres de compilation. Il s'appelle configure et est fourni par les développeurs du programme avec le code source. L'ensemble du processus de compilation est décrit dans le Makefile, qui sera créé par cet utilitaire.

Si configure n'est pas dans le dossier source, vous pouvez essayer d'exécuter les scripts suivants pour le créer :

./bootstrap
$ ./autogen.sh

Vous pouvez également utiliser l'utilitaire automake pour créer ce script :

aclocal
$en-tête automatique
$ automake --gnu --add-missing --copy --foreign
$ autoconf -f -Mur

L'utilitaire automake et d'autres de sa suite génèrent les fichiers nécessaires basés sur le fichier Mackefile.am. Ce fichier est requis dans la plupart des projets.

Une fois que vous avez configuré, nous pouvons passer à la configuration. L'un des énormes avantages de l'assemblage manuel de programmes est que vous pouvez choisir avec quelles options construire le programme, où il sera situé et quelles fonctionnalités supplémentaires doivent être incluses. Tout cela est configuré à l'aide de configure. L'ensemble complet des options peut être visualisé en exécutant :

./configure --help

Examinons les options les plus couramment utilisées et standard pour tous les programmes :

  • --prefix=PREFIX- le dossier d'installation du programme, au lieu de /, par exemple, il peut s'agir de /usr/local/, alors tous les fichiers seront distribués non pas dans le système de fichiers principal, mais dans /usr/local ;
  • --bindir=REP- le dossier de placement des fichiers exécutables doit être dans PREFIX ;
  • --libdir=REP- dossier par défaut pour le placement et la recherche des bibliothèques, également dans PREFIX ;
  • --inclusir=DIR- dossier pour placer les pages de manuel ;
  • --disable-fonctionnalité- désactiver cette fonctionnalité ;
  • --enable-feature- activer la fonctionnalité ;
  • --avec-bibliothèque- comme activate, active la bibliothèque ou le fichier d'en-tête spécifié ;
  • --sans-bibliothèque- cette désactivation désactive l'utilisation de la bibliothèque.

Vous pouvez exécuter configure sans options pour utiliser les valeurs par défaut, mais vous pouvez également spécifier manuellement les chemins souhaités. Dans notre cas, ./configure est là et nous pouvons l'utiliser :

Lors de l'installation, l'utilitaire vérifiera si toutes les bibliothèques requises sont sur le système, et sinon, vous devrez les installer ou désactiver cette fonctionnalité si possible. Par exemple, l'erreur suivante peut se produire : aucune bibliothèque de terminal n'a été trouvée en vérifiant tgetent()... configure : erreur : INTROUVABLE !

Dans ce cas, nous devons installer la bibliothèque requise. Par exemple, le programme propose des ncurses, donc on met :

sudo apt installer libncurces-dev

Le préfixe lib est toujours ajouté avant les bibliothèques, et -dev signifie que nous avons besoin d'une bibliothèque avec tous les fichiers d'en-tête. Une fois toutes les dépendances satisfaites, la configuration réussira.

Construire le programme

Une fois la configuration terminée et le Makefile prêt, vous pouvez procéder directement à la création du programme. A cette étape, le code source est directement converti en code machine. L'utilitaire make, basé sur le Makefile, fera toutes les actions nécessaires :

Après cela, le programme sera installé dans le dossier que vous avez spécifié et vous pourrez l'utiliser. Mais la manière la plus correcte est de créer un package pour installer le programme, cela se fait à l'aide de l'utilitaire checkinstall, il vous permet de créer à la fois des packages deb et rpm, il peut donc être utilisé non seulement dans Ubuntu. Au lieu de make install, exécutez :

Ensuite, installez simplement le package résultant en utilisant dpkg :

sudo dpkg installer vim.deb

Après cela, l'assemblage du programme est complètement terminé et installé, vous pouvez donc procéder à une utilisation complète.

Si vous avez installé le programme à l'aide de make install, vous pouvez le supprimer en exécutant la commande inverse dans le même dossier :

sudo make désinstaller

La commande supprimera tous les fichiers qui ont été copiés sur le système de fichiers.

Conclusions

Dans cet article, nous avons examiné comment un programme Linux est compilé. Ce processus peut être difficile pour les débutants, mais en général, tout est possible si vous passez quelques heures à résoudre le problème. Si vous avez des questions, posez-les dans les commentaires !

Pour conclure la vidéo sur ce que sont un compilateur et un interprète :

Compilateur- un programme ou un outil technique qui fonctionne compilation.

Compilation- traduction d'un programme compilé dans un langage source de haut niveau vers un programme équivalent dans un langage de bas niveau proche du code machine (code absolu, module objet, parfois langage assembleur). Les informations d'entrée du compilateur (code source) sont une description de l'algorithme ou du programme dans un langage orienté problème, et la sortie du compilateur est une description équivalente de l'algorithme dans un langage orienté machine (code objet).

Compiler- traduire un programme machine d'un langage orienté problème vers un langage orienté machine.

Types de compilateurs

    Vectorisation.

    Traduit le code source en code machine sur les ordinateurs équipés d'un processeur vectoriel. Flexible

    . Conçu de manière modulaire, piloté par des tables et programmé dans un langage de haut niveau ou implémenté à l'aide d'un compilateur de compilateurs.

    Dialogue.

    Voir : traducteur de dialogues. Incrémentiel

    . Retransmet les fragments du programme et les ajouts sans recompiler l'intégralité du programme.

    Interprétatif (étape par étape).

    Élimine certains types d'erreurs de syntaxe. Résident

    . Il réside en permanence dans la RAM et peut être réutilisé par de nombreuses tâches.

    Auto-compilation.

Écrit dans la même langue à partir de laquelle la diffusion est effectuée.

    Universel.

    Basé sur une description formelle de la syntaxe et de la sémantique du langage d’entrée. Les composants d'un tel compilateur sont : le noyau, les chargeurs syntaxiques et sémantiques. Types de compilation

    Lot.

Compilation de plusieurs modules sources en un seul élément de travail.

Ligne par ligne

    .

    Idem pour l'interprétation.

    Conditionnel

    .

    Compilation dans laquelle le texte traduit dépend des conditions spécifiées dans le programme source par les directives du compilateur. Ainsi, en fonction de la valeur d'une certaine constante, vous pouvez activer ou désactiver la traduction d'une partie du texte du programme.

Structure du compilateur

Le processus de compilation comprend les étapes suivantes :

Analyse lexicale.

A ce stade, la séquence de caractères du fichier source est convertie en une séquence de jetons. Analyse syntaxique (grammaticale)..

Le résultat de la compilation - un module exécutable - a les performances maximales possibles, mais est lié à un système d'exploitation et à un processeur spécifiques (et ne fonctionnera pas sur les autres).

Chaque machine cible (IBM, Apple, Sun, etc.) et chaque système d'exploitation ou famille de systèmes d'exploitation exécuté sur la machine cible nécessitent l'écriture de son propre compilateur. Il existe également ce qu'on appelle compilateurs croisés, vous permettant de générer du code sur une machine et dans un environnement de système d'exploitation destiné à être exécuté sur une autre machine cible et/ou dans un autre environnement de système d'exploitation. De plus, les compilateurs peuvent optimiser le code pour différents modèles de la même famille de processeurs (en prenant en charge des fonctionnalités spécifiques au modèle ou des extensions de jeu d'instructions). Par exemple, le code compilé pour les processeurs de la famille Pentium peut prendre en compte les fonctionnalités de parallélisation des instructions et utiliser leurs extensions spécifiques - MMX, SSE, etc.

Certains compilateurs traduisent un programme d'un langage de haut niveau non pas directement en code machine, mais en langage assembleur. Ceci est fait pour simplifier la partie du compilateur responsable de la génération du code et augmenter sa portabilité (la tâche de génération finale du code et de sa liaison à la plate-forme cible requise est transférée à l'assembleur), ou pour permettre au programmeur de contrôler et de corriger le résultat de la compilation.

Génération de bytecode

Le résultat du travail du compilateur peut être un programme dans un langage de bas niveau spécialement créé et sujet à interprétation machine virtuelle. Ce langage est appelé pseudocode ou bytecode. En règle générale, il ne s'agit pas du code machine d'un ordinateur et les programmes qui s'y trouvent peuvent être exécutés sur diverses architectures où il existe une machine virtuelle correspondante, mais dans certains cas, des plates-formes matérielles sont créées qui prennent directement en charge le pseudocode d'un langage. Par exemple, le pseudocode Java est appelé bytecode Java. Bytecode Java) et s'exécute dans la machine virtuelle Java, la spécification du processeur picoJava a été créée pour son exécution directe. Pour le .NET Framework, le pseudocode est appelé Common Intermediate Language (CIL) et le runtime est appelé Common Language Runtime (CLR).

Certaines implémentations de langages interprétés de haut niveau (par exemple Perl) utilisent le bytecode pour optimiser l'exécution : les étapes coûteuses d'analyse et de conversion du texte du programme en bytecode sont effectuées une fois au chargement, puis le code correspondant peut être réutilisé sans étapes intermédiaires.

Compilation dynamique

Article principal : Compilation JIT

En raison du besoin d'interprétation, le bytecode s'exécute beaucoup plus lentement qu'un code machine doté de fonctionnalités comparables, mais il est plus portable (indépendamment du système d'exploitation et du modèle de processeur). Pour accélérer l'exécution du bytecode, utilisez compilation dynamique, lorsqu'une machine virtuelle traduit le pseudocode en code machine immédiatement avant sa première exécution (et lorsque le code est accédé à plusieurs reprises, la version compilée est exécutée).

Le code CIL est également compilé en code machine cible par un compilateur JIT et les bibliothèques .NET Framework sont précompilées.

Décompilation

Il existe des programmes qui résolvent le problème inverse : traduire un programme d'un langage de bas niveau vers un langage de haut niveau. Ce processus est appelé décompilation et ces programmes sont appelés décompilateurs. Mais comme la compilation est un processus avec perte, il est généralement impossible de reconstruire avec précision le code source, par exemple, du C++. Les programmes en bytecodes sont décompilés plus efficacement - par exemple, il existe un décompilateur assez fiable pour Flash. Un type de décompilation est le désassemblage du code machine en code en langage assembleur, qui réussit presque toujours (la difficulté peut être un code auto-modifiable ou un code dans lequel le code réel et les données ne sont pas séparés). Cela est dû au fait qu'il existe une correspondance presque biunivoque entre les codes d'instructions machine et les instructions assembleur.

Compilation séparée

Compilation séparée(Anglais) compilation séparée) - traduction de parties du programme séparément, suivie de leur combinaison par l'éditeur de liens en un seul module de chargement.

Historiquement, une caractéristique du compilateur, reflétée dans son nom (eng. compiler- assembler, composer), était qu'il effectuait à la fois la traduction et la composition, tandis que le compilateur pouvait immédiatement générer du code absolu. Cependant, plus tard, à mesure que la complexité et la taille des programmes augmentaient (et que le temps consacré à la recompilation augmentait), il est devenu nécessaire de séparer les programmes en parties et d'attribuer des bibliothèques pouvant être compilées indépendamment les unes des autres. Lors de la traduction de chaque partie d'un programme, le compilateur génère un module objet contenant des informations supplémentaires, qui est ensuite utilisé pour relier et résoudre les liens entre les parties lorsque les parties sont assemblées dans un module exécutable.

L'apparition de la compilation séparée et la séparation des liens en tant qu'étape distincte se sont produites bien plus tard que la création des compilateurs. À cet égard, au lieu du terme « compilateur », le terme « traducteur » est parfois utilisé comme synonyme : soit dans la littérature ancienne, soit lorsqu'on veut souligner sa capacité à traduire un programme en code machine (et vice versa, le le terme « compilateur » est utilisé pour souligner la capacité d'assembler à partir de plusieurs fichiers).

Types de compilateurs

  • Vectorisation. Traduit le code source en code machine sur les ordinateurs équipés d'un processeur vectoriel.
  • Traduit le code source en code machine sur les ordinateurs équipés d'un processeur vectoriel.. Conçu de manière modulaire, piloté par des tables et programmé dans un langage de haut niveau ou implémenté à l'aide d'un compilateur de compilateurs.
  • .. Voir : traducteur de dialogue.
  • Dialogue. Retransmet les fragments du programme et les ajouts sans recompiler l'intégralité du programme.
  • Interprétatif (étape par étape). Effectue séquentiellement une compilation indépendante de chaque instruction individuelle (commande) du programme source.
  • Compilateur compilateur. Un traducteur qui accepte une description formelle d'un langage de programmation et génère un compilateur pour ce langage.
  • Interprétatif (étape par étape). Élimine certains types d'erreurs de syntaxe.
  • Élimine certains types d'erreurs de syntaxe.. Il réside en permanence dans la RAM et peut être réutilisé par de nombreuses tâches.
  • .. Écrit dans la même langue à partir de laquelle la diffusion est effectuée.
  • Auto-compilation. Basé sur une description formelle de la syntaxe et de la sémantique du langage d’entrée. Les composants d'un tel compilateur sont : le noyau, les chargeurs syntaxiques et sémantiques.

Types de compilation

  • Universel. Compilation de plusieurs modules sources en un seul élément de travail.
  • Basé sur une description formelle de la syntaxe et de la sémantique du langage d’entrée. Les composants d'un tel compilateur sont : le noyau, les chargeurs syntaxiques et sémantiques.. Idem pour l'interprétation.
  • Lot. Compilation dans laquelle le texte traduit dépend des conditions spécifiées dans le programme source par les directives du compilateur. Ainsi, en fonction de la valeur d'une certaine constante, vous pouvez activer ou désactiver la traduction d'une partie du texte du programme.

Structure du compilateur

Le processus de compilation comprend les étapes suivantes :

  1. Analyse lexicale. A ce stade, la séquence de caractères du fichier source est convertie en une séquence de jetons.
  2. Analyse syntaxique (grammaticale). La séquence de jetons est convertie en un arbre d'analyse.
  3. Analyse sémantique. L'arbre d'analyse est traité pour établir sa sémantique (signification) - par exemple, lier les identifiants à leurs déclarations, types, vérifier la compatibilité, déterminer les types d'expression, etc. Le résultat est généralement appelé « représentation/code intermédiaire » et peut être étendu par l'arbre d'analyse, un nouvel arbre, un ensemble abstrait de commandes ou quelque chose d'autre pratique pour un traitement ultérieur.
  4. Optimisation. Supprimer les structures inutiles et simplifier le code tout en conservant son sens. L'optimisation peut se faire à différents niveaux et étapes - par exemple, sur le code intermédiaire ou sur le code machine final.
  5. Génération de codes. A partir de la représentation intermédiaire, du code dans la langue cible est généré.

Dans des implémentations spécifiques du compilateur, ces étapes peuvent être séparées ou, inversement, combinées sous une forme ou une autre.

Génération de code

Génération de code machine

La plupart des compilateurs traduisent un programme d'un langage de programmation de haut niveau en code machine qui peut être directement exécuté par le processeur. En règle générale, ce code est également orienté vers l'exécution dans l'environnement d'un système d'exploitation spécifique, puisqu'il utilise les capacités qu'il offre (appels système, bibliothèques de fonctions). L'architecture (ensemble logiciel et matériel) pour laquelle la compilation est effectuée est appelée machine cible.

Le résultat de la compilation - un module exécutable - a les performances maximales possibles, mais est lié à un système d'exploitation et à un processeur spécifiques (et ne fonctionnera pas sur les autres).

Certains compilateurs traduisent un programme d'un langage de haut niveau non pas directement en code machine, mais en langage assembleur. Ceci est fait pour simplifier la partie du compilateur responsable de la génération du code et augmenter sa portabilité (la tâche de génération finale du code et de sa liaison à la plate-forme cible requise est transférée à l'assembleur), ou pour permettre au programmeur de contrôler et de corriger le résultat de la compilation.

Génération de bytecode

Le résultat du compilateur peut être un programme dans un langage de bas niveau spécialement créé et sujet à interprétation machine virtuelle. Un tel langage est appelé pseudocode ou bytecode. En règle générale, il ne s'agit pas du code machine d'un ordinateur et les programmes qui s'y trouvent peuvent être exécutés sur diverses architectures où il existe une machine virtuelle correspondante, mais dans certains cas, des plates-formes matérielles sont créées qui prennent directement en charge le pseudocode d'un langage. Par exemple, le pseudocode du langage Java est appelé bytecode Java et s'exécute dans la machine virtuelle Java, et la spécification du processeur picoJava a été créée pour l'exécuter directement. Pour le .NET Framework, le pseudocode est appelé Common Intermediate Language (CIL) et le runtime est appelé Common Language Runtime (CLR).

Certaines implémentations de langages interprétés de haut niveau (par exemple Perl) utilisent le bytecode pour optimiser l'exécution : les étapes coûteuses d'analyse et de conversion du texte du programme en bytecode sont effectuées une fois au chargement, puis le code correspondant peut être réutilisé sans étapes intermédiaires.

Compilation dynamique

En raison du besoin d'interprétation, le bytecode s'exécute beaucoup plus lentement qu'un code machine doté de fonctionnalités comparables, mais il est plus portable (indépendamment du système d'exploitation et du modèle de processeur). Pour accélérer l'exécution du bytecode, utilisez compilation dynamique, lorsqu'une machine virtuelle traduit le pseudocode en code machine immédiatement avant sa première exécution (et lorsque le code est accédé à plusieurs reprises, la version compilée est exécutée).

Le code CIL est également compilé en code machine cible par un compilateur JIT et les bibliothèques .NET Framework sont précompilées.

Décompilation

Il existe des programmes qui résolvent le problème inverse : traduire un programme d'un langage de bas niveau vers un langage de haut niveau. Ce processus est appelé décompilation et ces programmes sont appelés décompilateurs. Mais comme la compilation est un processus avec perte, il est généralement impossible de reconstruire avec précision le code source, par exemple, du C++. Les programmes en bytecodes sont décompilés plus efficacement - par exemple, il existe un décompilateur assez fiable pour Flash. Un type de décompilation est le désassemblage du code machine en code en langage assembleur, qui réussit presque toujours (la difficulté peut résider dans le code auto-modifiable ou dans le code dans lequel le code réel et les données ne sont pas séparés). Cela est dû au fait qu'il existe une correspondance presque biunivoque entre les codes d'instructions machine et les instructions assembleur.

Compilation séparée

Compilation séparée(Anglais) compilation séparée) - traduction de parties du programme séparément, suivie de leur combinaison par l'éditeur de liens en un seul module de chargement.

Historiquement, une caractéristique du compilateur, reflétée dans son nom (eng. compiler- assembler, composer), était qu'il effectuait à la fois la traduction et la composition, tandis que le compilateur pouvait immédiatement générer du code absolu. Cependant, plus tard, à mesure que la complexité et la taille des programmes augmentaient (et que le temps consacré à la recompilation augmentait), il est devenu nécessaire de séparer les programmes en parties et d'attribuer des bibliothèques pouvant être compilées indépendamment les unes des autres. Lors de la traduction de chaque partie d'un programme, le compilateur génère un module objet contenant des informations supplémentaires, qui est ensuite utilisé pour relier et résoudre les liens entre les parties lorsque les parties sont assemblées dans un module exécutable.

L'apparition de la compilation séparée et la séparation des liens en tant qu'étape distincte se sont produites bien plus tard que la création des compilateurs. À cet égard, au lieu du terme « compilateur », le terme « traducteur » est parfois utilisé comme synonyme : soit dans la littérature ancienne, soit lorsqu'on veut souligner sa capacité à traduire un programme en code machine (et vice versa, le le terme « compilateur » est utilisé pour souligner la capacité d'assembler à partir de plusieurs fichiers).

À l'aube du développement des ordinateurs, les premiers compilateurs (traducteurs) étaient appelés « programmes de programmation » (puisqu'à cette époque, seul le code machine était considéré comme un programme, et qu'un « programme de programmation » était capable de créer du code machine à partir de texte humain, c'est-à-dire programmer un ordinateur).

Voir aussi

Remarques

Littérature

  • Alfred W. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman. Compilateurs : principes, technologies et outils = Compilateurs : principes, techniques et outils. - 2e éd. - M. : Williams, 2010. -- 1184 p. - ISBN978-5-8459-1349-4
  • Robin Hunter. Concepts de base des compilateurs = L'essence des compilateurs. - M. : Williams, 2002. - 256 p. -ISBN0-13-727835-7
  • Chasseur R. Conception et construction de compilateurs / Trad. de l'anglais S.M. Krugovoy. - M. : Finances et Statistiques, 1984. - 232 p.
  • D. Crenshaw. Créons un compilateur !
  • Serebryakov V.A., Galochkin M.P. Fondamentaux de la conception de compilateurs.

Fondation Wikimédia.

2010.:

Synonymes

    - (nouveau lat., de lat. compiler pour voler, voler, choisir). Compilateur d'articles ou de livres en empruntant des passages aux écrits de divers auteurs. Dictionnaire de mots étrangers inclus dans la langue russe. Chudinov A.N., 1910. COMPILATEUR... ... Dictionnaire des mots étrangers de la langue russe

    Voir écrivain... Dictionnaire des synonymes russes et expressions similaires. sous. éd. N. Abramova, M. : Dictionnaires russes, 1999. auteur-compilateur, écrivain ; traducteur, hack, programme Dictionnaire des synonymes russes... Dictionnaire des synonymes

    Programme qui convertit un texte écrit dans un langage algorithmique en un programme composé d'instructions machine. Le compilateur crée une version complète du programme en langage machine. Voir aussi : Traducteurs Dictionnaire Financier Finam... Dictionnaire financier

    COMPILATEUR, UN PROGRAMME INFORMATIQUE qui traduit les symboles d'un LANGAGE DE PROGRAMMATION en commandes qu'un ordinateur peut directement comprendre. Les programmes sont pour la plupart écrits dans des LANGUES DE HAUT NIVEAU, comme C, Pascal ou BASIC... Dictionnaire encyclopédique scientifique et technique

    COMPILATEUR, compilateur, mari. (livre). Auteur de la compilation. || Un écrivain capable d'écrire uniquement des compilations (négligées). Compilateur pathétique. Dictionnaire explicatif d'Ouchakov. D.N. Ouchakov. 1935 1940... Dictionnaire explicatif d'Ouchakov

Les technologies informatiques modernes sont en constante amélioration. Chaque jour, de plus en plus de nouvelles technologies apparaissent qui permettent de donner vie à ce qui était jusqu'à récemment défini comme de la science-fiction. Les langues, humaines et informatiques, sont également susceptibles de subir des changements importants. Dans cet article, nous vous expliquerons en détail ce qu'est un compilateur, comment l'utiliser, pourquoi il a été créé et où vous pouvez le trouver maintenant. L'article est recommandé non seulement aux utilisateurs novices du système d'exploitation Windows, mais également aux programmeurs qui souhaitent acquérir les connaissances cachées de leur système.

Langue du système d'exploitation

Pour commencer, cela vaut la peine de faire abstraction, car la programmation ne consiste pas seulement à introduire certains mots clés dans une machine, il s'agit également d'actions soigneusement réfléchies liées aux composants du système. Au départ, il y avait le code binaire, puis les programmeurs ont créé un langage de programmation semi-machine - l'assembleur, mais pour quoi faire ?

Imaginez que vous deviez compter chaque bit sur la calculatrice d'un programmeur, puis la connecter correctement, et bien plus encore. En assembleur, tout est devenu un peu plus simple, mais cela reste très, très difficile par rapport aux langages de programmation modernes, par exemple le C++, qui est considéré comme l'un des plus complexes, mais nous en reparlerons un peu plus tard.

En langage assembleur, tout se fait grâce aux registres du processeur : division, multiplication, déplacement d'une valeur d'un point A à un point B, etc. Son principal problème est qu'il est encore semi-machine, mais reste lisible par les humains, contrairement à la dispersion chaotique. morceaux. Un autre inconvénient était le nombre limité de ces mêmes registres.

Dans les années 80, ils ont décidé de proposer un langage de programmation qui faciliterait et simplifierait l’écriture d’un système d’exploitation. C'est ainsi qu'apparaissent C et le compilateur C GCC de GNU. Si vous utilisez Linux, vous devez avoir vu les produits de cette société. À propos, l'assembleur est encore utilisé aujourd'hui, car certains compilateurs créent des fichiers objets avec du code binaire, tandis que d'autres compilateurs exécutifs créent des fichiers objets avec du code assembleur. Tout dépend de la plateforme du développeur.

Un compilateur moderne contient les programmes suivants :

    Le débogueur est un programme qui envoie des messages d'erreur à partir de l'éditeur de liens, du préprocesseur et de l'interpréteur. Un préprocesseur est un programme dont la tâche principale est de rechercher des marques spéciales commençant par le signe # et d'exécuter certains types de commandes. Par exemple, ajouter une bibliothèque tierce pour compiler un projet. Un interpréteur est un programme qui traduit notre langage de programmation plus ou moins compréhensible en code binaire ou assembleur. Un éditeur de liens est un programme qui connecte automatiquement les fichiers manquants.

Il existe également 2 types d'assemblage de projet par le compilateur : dynamique et statique. Dans le premier cas, seuls les fichiers nécessaires au projet sont ajoutés, malgré l'environnement de développement, et dans le second cas, tout est ajouté au tas (connecté bien sûr). Ainsi, à partir de là, nous pouvons déjà dire qu'un compilateur est une liste complète de programmes permettant de collecter et de traiter des informations sous une forme compréhensible et logique pour un ordinateur. Nous verrons ensuite comment tout a commencé.

Les premiers compilateurs simples

Vous serez peut-être surpris, mais l'objet de notre article (à l'époque on l'appelait aussi traducteur) est apparu pour la première fois en 1954 à l'Institut spécialisé en mathématiques appliquées. Il n’incluait pas un ensemble de programmes aussi vaste qu’aujourd’hui, mais il s’agissait tout de même d’une avancée scientifique à l’époque. Il n'y avait pas de débogueur, donc les gens devaient tout faire littéralement à la main, en utilisant des mathématiques standard et discrètes, afin de savoir si l'ordinateur électronique obtenait le bon résultat.


Est-il possible de construire sans un nouveau langage ?

Si vous êtes un programmeur suffisamment intelligent, vous pourrez accomplir cette tâche. Certes, cela demandera beaucoup de temps et d’efforts. À propos, il existait autrefois un tel métier : celui de programmeur de liens. Ce n’est que dans les nouveaux langages de programmation que tout est automatisé, mais avant, il fallait lier des morceaux de code avec des fichiers Make. D'ailleurs, certains projets sous Linux peuvent toujours être construits en utilisant ces mêmes fichiers Make ; il vous suffit de spécifier leurs dépendances manuellement.


Après avoir collecté le code, l'éditeur de liens a confié le travail à l'ordinateur pour traitement, où il a finalement reçu le code binaire terminé.

Comme vous pouvez le constater, un compilateur n’est pas seulement un programme, mais aussi le fruit des efforts de nombreuses personnes. Et comme l’a soutenu Henry Ford, ils tentent d’automatiser chaque processus.

Meilleur compilateur Windows

Ainsi, de nombreux lecteurs savent qu'il existe de nombreuses langues mortes, mais encore plus de langues vivantes, c'est-à-dire celles qui mettent à jour leur bibliothèque standard au moins une fois par an. Comme nous l'avons déjà dit, C a été créé en 1980 – ce fut une avancée majeure. Beaucoup de nos pères adorent encore cette langue, mais qu’en est-il maintenant ?

Il vit et s'épanouit dans un nouveau corps, pour ainsi dire. Son héritier est à juste titre le C++, bien qu'il soit interdit à son créateur d'y écrire du code similaire au C, de nombreux programmeurs l'ignorent et le font, mais pourquoi une violation aussi flagrante des règles est-elle autorisée ?


    Premièrement, il a pris une part importante des bibliothèques standards du C, et les nouveaux compilateurs G++ sont capables de compiler du code C, ce qui en soi indique leur similitude. Deuxièmement, C++ a été créé pour remplacer le C, et nous en voyons les résultats maintenant. À propos, le programme du compilateur G++ ne « jure » pas tant qu'au moins une classe n'est pas utilisée - c'est la principale différence entre les deux langages. On peut qualifier G++ de meilleur compilateur, ce n’est pas pour rien que les applications mobiles, le système d’exploitation Windows, etc. sont écrits grâce à lui.

Votre chemin sera épineux - cela vaut la peine de le savoir avant tout. Pour commencer à travailler avec un langage, par exemple s'il s'agit du C, vous devrez certainement vous familiariser avec le compilateur C. Et si vous ne le connaissez pas et ne comprenez pas sa logique, alors vos projets le feront un par un. décalage et crash.


Essayez de lire autant de livres que possible non seulement sur les bases de la programmation, mais également sur l'histoire de la création des langages, afin que vous commenciez certainement à comprendre l'essence même du processus. Essayez de combiner pratique et nouvelles connaissances, de cette façon vous vous souviendrez de tout beaucoup plus rapidement. Essayez également d'amener votre anglais à au moins un niveau intermédiaire, sinon il vous sera très difficile de naviguer dans l'IDE.

En conclusion

Nous espérons qu'après avoir lu cet article, vous comprendrez ce qu'est un compilateur, comment il fonctionne, pourquoi il a été créé et qui en a encore besoin aujourd'hui. Il convient de rappeler que la chose la plus importante pour un programmeur est de comprendre la situation, de comprendre les principes de base, nous espérons donc vraiment que l'article vous a aidé.

Bonjour, chers lecteurs ! Aujourd'hui, nous allons plonger un peu dans la théorie. Vous avez sûrement tous voulu envoyer votre programme super-duper à un ami. Mais comment faire cela ? Ne le forcez pas à installer PascalABC.NET ! Aujourd'hui, nous allons parler de la façon de procéder.

Tous les langages de programmation sont divisés en deux types - interprétable Et compilé.

Interprètes

Lors de la programmation dans un langage interprété, nous écrivons un programme qui ne doit pas être exécuté dans le processeur, mais qui doit être exécuté par un programme interpréteur. On l'appelle aussi machine virtuelle.

En règle générale, le programme est converti en un code intermédiaire, c'est-à-dire un ensemble d'instructions que la machine virtuelle peut comprendre.

Une fois interprété, le code est exécuté séquentiellement ligne par ligne (d’instruction en instruction). Le système d'exploitation communique avec l'interpréteur, pas avec le code source.

Exemples de langages interprétés : PHP, JavaScript, C#, Python.

Les programmes compilés s'exécutent plus rapidement, mais beaucoup de temps est consacré à la compilation du code source.

Les programmes conçus pour les interprètes peuvent être exécutés dans n'importe quel système où un tel interprète est présent. Un exemple typique est le code JavaScript. Tout navigateur moderne lui sert d’interprète. Vous pouvez écrire du code JavaScript une fois, en l'incluant dans un fichier HTML, et il s'exécutera de la même manière dans n'importe quel environnement doté d'un navigateur. Peu importe qu'il s'agisse de Safari sur Mac OS ou d'Internet Explorer sous Windows.

Compilateurs

Un compilateur est un programme qui transforme le code source écrit dans un langage de programmation en instructions machine.

Au fur et à mesure que le texte du programme est converti en code machine, le compilateur peut détecter des erreurs (dans la syntaxe du langage, par exemple). Par conséquent, tous les problèmes de points-virgules oubliés, de parenthèses oubliées, d'erreurs dans les noms de fonctions et de variables dans ce cas sont résolus au stade de la compilation.

Une fois compilés, tous code source(celui qu’écrit le programmeur) est immédiatement traduit en langage machine. Un soi-disant séparé fichier exécutable, ce qui n'a rien à voir avec le code source. L'exécution du fichier exécutable est assurée par le système d'exploitation. C'est-à-dire, par exemple, qu'un fichier .EXE est formé.

Exemples de langages compilés : C, C++, Pascal, Delphi.

Progression du compilateur.

Prétraitement

Cette opération est réalisée préprocesseur de texte.

Le texte source est partiellement traité - les éléments suivants sont produits :

  • Remplacer les commentaires par des lignes vides
  • Modules de connexion, etc., etc.

Compilation

Le résultat de la compilation est code objet.

Code objet est un programme en langage de code machine avec préservation partielle des informations symboliques nécessaires lors du processus d'assemblage.

Mise en page

La mise en page peut également porter les noms suivants : attacher, assemblée ou enchaînement.

Il s'agit de la dernière étape du processus d'obtention d'un fichier exécutable, composé de relier tous les fichiers objets du projet.

Fichier EXE.

Après la liaison, vous aurez un fichier .EXE de votre programme. Vous pouvez le confier à un ami et il s'ouvrira directement dans la ligne de commande, tout comme dans le bon vieux DOS. Essayons de créer un fichier .EXE. Toutes les actions seront données en PascalABC.NET.

Allez dans Outils -> Paramètres -> Options de compilation. Nous vérifions si la case à côté de 2 points est cochée. Si c'est le cas, nous le supprimons.

Maintenant, ouvrez votre programme et exécutez-le.

Ouvrez le répertoire où vous trouverez le code source du programme.

Le voici, le fichier .EXE.

Cliquez sur l'application. Comme vous pouvez le voir, après avoir saisi les données, la fenêtre se ferme immédiatement. Pour éviter que la fenêtre ne se ferme immédiatement, vous devez ajouter deux lignes de code, à savoir : using crt (avant la section de description de la variable) et readkey (à la fin du code, avant l'opérateur de fin).


Nous connectons la bibliothèque crt externe et utilisons la fonction readkey qui y est intégrée.

Désormais, la fenêtre se fermera lorsque vous appuierez sur n'importe quelle touche.

Remarque : PascalABC.NET est un environnement de développement intégré.

L'environnement de développement comprend :

  • éditeur de texte ;
  • compilateur;
  • outils d'automatisation de l'assemblage ;
  • débogueur

C'est tout pour aujourd'hui ! Posez vos questions dans les commentaires de cet article. N'oubliez pas de cliquer sur les boutons et de partager les liens vers notre site avec vos amis. Et pour ne pas rater la sortie du prochain article, je vous recommande de vous inscrire à la newsletter depuis notre site internet. L’un d’eux se trouve tout en haut à droite, l’autre en pied de page du site.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :