475 Shares 986 views

Broadcaster – est … Les types de compilateurs. Convertir et programmes de diffusion

Les programmes, ainsi que les personnes à traduire d'une langue à l'autre besoin d'un interprète ou d'un traducteur.

concepts de base

Le programme est une représentation linguistique des calculs: i → P → P (i). Un interpréteur est un programme qui est fourni au programme d'entrée P x et certains d'entrée. Il effectue en P x: I (P, x) = P (x). Le fait qu'il n'y a qu'un seul traducteur est capable d'exécuter tous les programmes possibles (qui peuvent être représentés dans le système formel) est une découverte très profonde et significative Turing.

Le processeur est un interpréteur de programmes en langage machine. En général, trop cher pour écrire des interprètes pour les langues de haut niveau, de sorte qu'ils se traduisent par une forme qui est plus facile à interpréter.

Certains types de traducteurs ont des noms étranges:

  • L'assembleur se traduit par des programmes de langage assembleur en langage machine.
  • Le compilateur se traduit par un langage de haut niveau dans une langue inférieure.

Broadcaster – est un programme qui prend comme données d'entrée du programme dans certains S langue et produit le programme T de telle sorte que les deux ont la même sémantique: P → X → Q. C'est, Vx. P (x) = Q (x).

Si la diffusion du programme entier en quelque chose interprétable, il est appelé une compilation avant l'exécution ou la compilation AOT. compilateur AOT peut être utilisé en série, ce dernier qui est souvent l'assembleur, par exemple:

Le code source compilateur → (Traducteur) → → code assembleur assembleur (compilateur) → → code machine CPU (interprète).

compilation opérationnelle ou dynamique se produit si le programme est diffusé, lorsqu'il est exécuté par une autre partie précédemment compilé. JIT compilateurs se souviennent de ce qu'ils ont déjà fait pour ne pas répéter le code source encore et encore. Ils peuvent même produire la compilation adaptative et recompilation en fonction du comportement de l'environnement d'exécution du programme.

De nombreuses langues permettent d'exécuter du code à la compilation et compiler le nouveau code à l'exécution.

étape de traduction

Diffusion comprend les étapes consistant à synthétiser et à analyser:

L'analyseur de code source → → → générateur de représentation conceptuelle (synthétiseur) → Code cible.

Cela est dû à ces raisons:

  • Toute autre méthode ne convient pas. Traduction Word ne fonctionne tout simplement pas.
  • Bonne solution d'ingénierie: si vous voulez écrire des traducteurs pour les langues source M et N ciblées besoin écrire seulement des programmes simples M + N (de polukompilyatorov) plutôt que complexe M × N (total des traducteurs).

Cependant, dans la pratique, une vue conceptuelle d'une très rarement assez expressif et assez puissant pour couvrir toutes les sources possibles et les langues cibles. Alors que certains ont pu se rapprocher de cela.

Les compilateurs réels passent par plusieurs étapes. Lorsque vous créez votre propre compilateur n'a pas besoin de répéter tout le travail que les gens ont fait pour créer des représentations et des générateurs. Vous pouvez traduire votre langue directement en JavaScript ou C et bénéficier de JavaScript moteur existant et le compilateur C pour le reste. Vous pouvez également utiliser la représentation existante intermédiaire et machines virtuelles.

Traducteur record

Broadcaster – est un programme ou matériel, qui a impliqué trois langues: la source, la destination et la base. Ils peuvent être écrits dans une forme en T, en plaçant la gauche d'origine, à droite et la base cible ci-dessous.

Il existe trois types de compilateurs:

  • Broadcaster – est samokompilyator si elle correspond à la langue source de base.
  • Compilateur langue cible est la ligne de base, appelée samorezidentnym.
  • Broadcaster – un compilateur croisé, s'il cible et les langues diverses de base.

Pourquoi est-ce important?

Même si vous ne faites jamais un vrai compilateur, une bonne connaissance de la technologie de sa création, parce que le concept utilisé à cet effet sont largement utilisés, par exemple:

  • le formatage du texte;
  • les requêtes en langage à des bases de données;
  • l'architecture informatique de pointe;
  • généralisées problèmes d'optimisation;
  • ; GUIs
  • langages de script;
  • contrôleurs;
  • machines virtuelles;
  • La traduction automatique.

En outre, si vous voulez écrire Préprocesseurs, linkers, chargeurs, débogueurs et profileurs, vous devez passer par les mêmes étapes que lors de l'écriture d'un compilateur.

Vous pouvez également apprendre à écrire de meilleurs programmes, depuis la création du traducteur pour la langue signifie une meilleure compréhension de ses subtilités et les ambiguïtés. L'étude des principes généraux de la radiodiffusion vous permet également de devenir un bon langage de designer. Alors est-ce important la raideur de la langue si elle ne peut pas être mis en œuvre efficacement?

la technologie complète

La technologie de compilateur couvre de nombreux domaines de l'informatique:

  • la théorie formelle du langage: la grammaire, l'analyse syntaxique, calculabilité;
  • l'architecture de l'ordinateur: jeux d'instructions RISC, ou CDCI, des cycles d'horloge de base de traitement en pipeline, etc;.
  • concepts de langages de programmation, par exemple, l'exécution d'une commande séquentielle, l'exécution conditionnelle, itération, la récursion, une décomposition fonctionnelle, la modularité, la synchronisation, la méta-programmation, la portée, les sous-types constants, les modèles, le type de sortie, des prototypes, les annotations, couler, monades, boîtes aux lettres, continuent , wildcards, expression régulière, la mémoire transactionnelle, l'héritage, le polymorphisme, les paramètres du mode, etc., etc..
  • langues abstraites et des machines virtuelles;
  • algorithmes et structures de données: les expressions régulières, les algorithmes d' analyse syntaxique, algorithmes graphiques, programmation dynamique, formation;
  • langages de programmation: syntaxe, sémantique (statiques et dynamiques), les paradigmes de support (structure, OOP, fonctionnel, logique, pile, le parallélisme, la méta-programmation);
  • logiciel de création (compilateurs, généralement importants et complexes): localisation, mise en cache, componentize, API-interfaces, la réutilisation, la synchronisation.

la conception du compilateur

Certains des problèmes rencontrés dans le développement du traducteur réel:

  • Problèmes avec la langue source. Est-il facile de le compiler? Y at-il un préprocesseur? Comment sont les types? Y at-il une bibliothèque?
  • Le regroupement passe du compilateur: simple ou multi-voies?
  • Le degré d'optimisation souhaité. Rapide et impures programmes diffusés avec peu ou pas d'optimisation peut être normale. compilateur sur-optimisation va ralentir, mais un meilleur code à l'exécution peut valoir la peine.
  • Le degré requis de détection d'erreur. un traducteur peut s'arrêter à la première erreur? Quand il doit arrêter? Que ce soit pour faire confiance à la correction d'erreurs du compilateur?
  • La disponibilité des outils. Si la langue d'origine est pas très petite, les analyseurs de scanner et générateur sont nécessaires. Il y a aussi des générateurs, des générateurs de code, mais ils ne sont pas si commun.
  • Type de code cible à générer. Être sélectionné à partir du code de la machine virtuelle ou supplémenté pure. Ou il suffit d'écrire une partie d'entrée qui crée une représentation intermédiaire populaire, comme LLVM, RTL ou JVM. Ou faire une traduction de l'original dans le code source en C ou JavaScript.
  • Le format du code cible. Vous pouvez choisir un langage d'assemblage, un code machine portable, image mémoire de code machine.
  • Reciblage. Lorsque l'ensemble des générateurs est bon d'avoir une partie d'entrée commune. Pour cette raison, il est préférable d'avoir un générateur pour l'entrée de plusieurs parties.

compilateur Architecture: composants

Ce sont les principaux composants fonctionnels d'un compilateur qui génère du code natif (si le programme de sortie est un programme en C ou une machine virtuelle, vous ne devez pas tant d'étapes):

  • Le programme d'entrée (marques d'écoulement) est introduit dans le scanner (analyseur lexical), qui le convertit en un flux de jetons.
  • Parser (analyseur) la construction d'un arbre de syntaxe abstraite.
  • analyseur sémantique décompose les informations sémantiques et vérifie les nœuds d'arbres pour des erreurs. En conséquence, construit graphe sémantique – arbre de syntaxe abstraite avec des propriétés supplémentaires et les liens établis.
  • Générateur de code intermédiaire construit un graphe de flux (tuples sont regroupés en blocs principaux).
  • optimisateur de code indépendant de la machine mène à la fois une optimisation locale (dans l'unité de base) et globale (à tous les blocs) restant essentiellement dans les routines. Réduit le code redondant et simplifie les calculs. Le résultat est un graphique de flux modifié.
  • Générateur de code cible se lie blocs de base en un code de commande de transmission rectiligne, ce qui crée un des registres virtuels fichier objet assembleur (éventuellement inefficace).
  • optimiseur dépendant de la machine, éditeur de liens alloue de la mémoire entre les registres et rend les équipes de planification. Il exécute le programme de conversion en langage assembleur à cette assemblée avec une bonne utilisation de pipelining.

De plus, l'utilisation du gestionnaire de sous-système de détection d'erreur et les tables de symboles.

analyse lexicale (de balayage)

Le scanner convertit les caractères source de flux dans un flux de jetons, en supprimant les espaces, les commentaires et l'expansion des macros.

Scanners rencontrent souvent des problèmes, comme si oui ou non de prendre en compte le cas, les marges, les sauts de ligne et commentaires intégrés.

Les erreurs qui peuvent se produire lors de la numérisation, appelé lexical et comprennent:

  • caractères qui ne sont pas dans l'alphabet;
  • l'excès du nombre de caractères dans un mot ou d'une ligne;
  • pas un signe fermé ou une chaîne littérale;
  • fin de fichier dans le commentaire.

L'analyse syntaxique (parsing)

L'analyseur convertit la séquence de jetons dans un arbre de syntaxe abstraite. Chaque nœud de l'arbre est stocké comme un objet avec des champs nommés, dont beaucoup sont eux-mêmes les nœuds d'arbres. A ce stade, il n'y a pas de cycles. Lorsque vous créez un analyseur est nécessaire de prêter attention au niveau de la complexité de la grammaire (LL ou LR) et savoir s'il y a des règles homonymie. Certaines langues ne nécessitent l'analyse sémantique.

Les erreurs décelées à ce stade sont appelés syntaxe. Par exemple:

  • k = 5 * (7 – y;
  • j = / 5;
  • 56 x = 4 *.

analyse sémantique

Au cours de l' analyse sémantique pour vérifier la validité des règles et des parties associées de l'arbre d'analyse syntaxique (permettant des noms de référence opération d' insertion pour les conversions implicites de type, et ainsi de suite. D.) pour former le graphe sémantique.

De toute évidence, l'ensemble de la recevabilité des règles dans différentes langues différentes. Si vous compilez les langues de type Java, les compilateurs peuvent trouver:

  • multiple déclaration d'une variable à l'intérieur de son champ d'application;
  • une référence à une variable avant sa déclaration;
  • les références au nom du noir;
  • violation des droits de brevet;
  • nombre excessif ou insuffisant d'arguments dans un appel de méthode;
  • incompatibilité de type.

génération

génération de code intermédiaire produit graphe de flux composé de tuples, regroupés en blocs de base.

génération de code génère un code réel de la machine. Dans les compilateurs traditionnels pour les machines RISC sur la première étape, vous créez un assembleur avec un nombre infini de registres virtuels. Pour CISC-machines ne se produira probablement pas.