CalculatoareProgramare

Broadcaster - este ... Tipuri de compilatoare. Conversia și programe de difuzare

Programe, precum și oamenii să traducă dintr-o limbă în alta nevoie de un interpret sau de traducător.

concepte de bază

Programul este o reprezentare lingvistică a calculelor: i → P → P (i). Un interpret este un program care este furnizat programul de intrare P și unele de intrare x. Se efectueaza la P x: I (P, x) = P (x). Faptul că există doar un singur traducător este capabil să execute toate programele posibile (care pot fi reprezentate în sistemul formal) este o foarte profundă și semnificativă Turing descoperire.

Procesorul este un interpret de programe în limbaj mașină. În general, prea scump pentru a scrie interpreți pentru limbaje de nivel înalt, astfel încât acestea să traducă într-o formă care este mai ușor de interpretat.

Unele tipuri de traducători au nume foarte ciudate:

  • Asamblorul traduce programe de limbaj de asamblare în limbaj mașină.
  • Compilatorul traduce un limbaj de nivel înalt într-o limbă inferioară.

Broadcaster - este un program care are ca date de intrare în programul de limbaj S și T produce programul în așa fel încât ambele au aceeași semantică: P → X → Q. Aceasta este, ∀x. P (x) = Q (x).

În cazul în care a difuzat întregul program în ceva interpretabil, aceasta se numește o compilare înainte de compilare de execuție, sau AOT. AOT compilator poate fi utilizat în serie, aceasta din urmă, care este adesea asamblor, de exemplu:

Codul sursa compilator → (traducător) → → asamblare cod de asamblare (compilator) codul → → mașină CPU (interpret).

compilare operațională sau dinamic are loc în cazul în care programul este difuzat, atunci când sunt executate de către o altă parte compilat anterior. JIT-compilatoare amintesc ceea ce au făcut deja acest lucru ca să nu se repete din nou și din nou codul sursă. Ele pot produce chiar compilare adaptivă și recompilarea bazate pe comportamentul mediului de execuție a programului.

Multe limbi permite să execute cod la momentul compilării și compila noul cod în timpul rulării.

etapa de traducere

Broadcast cuprinde etapele de analiză și sinteză a:

Analizorul de cod sursă → → → generator de reprezentare conceptuală (sintetizator) → Codul țintă.

Acest lucru se datorează aceste motive:

  • Orice altă metodă nu este adecvată. Traducerea cuvintelor pur și simplu nu funcționează.
  • soluție bună inginerie: dacă doriți să scrie traducători pentru limbile M și N sursa direcționate trebuie să scrie numai M + N programe simple (polukompilyatorov), mai degrabă decât M × N complex (total de traducători).

Cu toate acestea, în practică, o vedere conceptuală a unui foarte rar suficient de expresiv și suficient de puternic pentru a acoperi fiecare sursă și țintă posibile limbi. În timp ce unii au reușit să se apropie de acest lucru.

compilatoare Real trec prin mai multe etape. Când creați propriul dvs. compilator nu trebuie să repete toate munca grea pe care oamenii au făcut pentru a crea reprezentări și generatoare. Puteți traduce limba dvs. direct în JavaScript sau C și să profite de existente JavaScript-motor și compilatorul C pentru a face restul. Puteți utiliza , de asemenea , reprezentarea intermediară existente și mașini virtuale.

înregistrare traducător

Broadcaster - este un program sau hardware, care a implicat trei limbi: sursa, destinația și baza. Ele pot fi scrise într-o formă de T, plasarea de bază stânga originale, dreapta și țintă de mai jos.

Există trei tipuri de compilatoare:

  • Broadcaster - este samokompilyator în cazul în care corespunde limbii sursă de bază.
  • Compilatoare care limba țintă este momentul inițial, numit samorezidentnym.
  • Radiodifuzorul - un compilator, dacă el vizate și diverse limbi de bază.

De ce este important acest lucru?

Chiar dacă nu face un compilator reală, o bună cunoaștere a tehnologiei creației sale, deoarece conceptul utilizat în acest scop, sunt utilizate pe scară largă, de exemplu:

  • formatarea textului;
  • interogări lingvistice la bazele de date;
  • arhitectura de calculator avansate;
  • probleme de optimizare generalizate;
  • ; GUIs
  • limbaje de scripting;
  • controlere;
  • mașini virtuale;
  • Traducere automată.

În plus, dacă doriți să scrie preprocessors, linkeri, incarcatoare, debugger și profilers, trebuie să treacă prin aceiași pași ca și atunci când scrieți un compilator.

Puteți afla, de asemenea, cum să scrie programe mai bune, de la crearea traducător pentru limba înseamnă o mai bună înțelegere a labirintul și a ambiguităților sale. Studiul principiilor generale de radiodifuziune, de asemenea, vă permite să devină un bun designer de limbaj. Deci, nu contează cât de abruptă limba în cazul în care nu poate fi pusă în aplicare în mod eficient?

tehnologia cuprinzătoare

Tehnologia compilator acoperă multe domenii diferite de informatică:

  • Teoria formală a limbajului: gramatica, parsarea, calculabilitate;
  • arhitectura de calculator:. seturi de instrucțiuni, RISC sau CISC, pipeline ciclurilor de ceas de baza, etc;
  • concepte de limbaje de programare, de exemplu, efectuarea unui control al secvenței, condiționată a executării, iterație, recurențe, descompunerea funcțională, modularitate, sincronizare, meta-programare, domeniul de aplicare, sub-tipuri de constante, template-uri, tip de ieșire, prototipuri, adnotări, debit, monade, cutiile poștale, continuați , metacaractere, expresie regulată, memorie tranzacțional, moștenire, polimorfism, setările pentru modul, și așa mai departe, etc..;
  • limbaje abstracte și mașini virtuale;
  • algoritmi si structuri de date: expresii regulate, algoritmi, algoritmi parsing grafice, programare dinamică, de formare;
  • limbaje de programare: sintaxa, semantica (statice și dinamice), paradigme de suport (structural, OOP, funcțională, logică, stivă, paralelism, meta-programare);
  • software de creare (compilatoare, de obicei mari și complexe): localizare, cache, componentize, API-interfețe, re-utilizare, sincronizare.

Design compilator

Unele dintre problemele întâlnite în dezvoltarea reală traducător:

  • Probleme cu limba sursă. Este ușor să-l compila? Există un preprocesor? Cum sunt tipurile? Există o bibliotecă?
  • Gruparea trece compilator: un singur sau multi-way?
  • Gradul de optimizare dorit. Programe rapide și necurate de difuzare, cu puțin sau deloc de optimizare poate fi normal. Supra-optimizare compilator va încetini, dar mai bine de cod în timpul rulării poate fi în valoare de ea.
  • Gradul necesar de detectare a erorilor. Poate un traducător opri doar la prima eroare? Când trebuie să se oprească? Dacă să aibă încredere în corectarea erorilor de compilare?
  • Disponibilitatea instrumentelor. În cazul în care limba originală nu este foarte mic, sunt necesare analizoarele scanerului și a generatorului. Există, de asemenea, generatoare, generatoare de cod, dar acestea nu sunt atât de comune.
  • Tipul de cod țintă care urmează să fie generat. Fi selectat de la codul pur mașină virtuală completate sau. Sau pur și simplu a scrie o porțiune de intrare care creează o populară reprezentare intermediară, cum ar fi LLVM, RTL sau JVM. Sau să facă o traducere a originalului în codul sursă în C sau JavaScript.
  • Formatul codului țintă. Puteți alege un limbaj de asamblare, un cod mașină portabil, imagine mașină de memorie cod.
  • Retargeting. În cazul în care setul de generatoare este bine să aibă o porțiune de intrare comună. Din acest motiv, cel mai bine este de a avea un generator pentru intrarea multe părți.

compilator Arhitectura: componente

Acestea sunt principalele componente funcționale ale unui compilator care generează un cod nativ (în cazul în care programul de ieșire este un program în C sau o mașină virtuală, ai nevoie nu atât de multe etape):

  • Programul de intrare (urme de curgere) este alimentată în scaner (analizor lexical), care îl transformă într-un flux de jetoane.
  • Parser (parser) construirea unui copac abstract de sintaxă.
  • analizor semantic se descompune informația semantică și verifică nodurile de arbori pentru erori. Ca rezultat, construit grafic semantic - arbore de sintaxă abstractă, cu proprietăți suplimentare și legăturile stabilite.
  • Generatorul de cod intermediar construiește un grafic de flux (tuple sunt grupate în blocuri principale).
  • -Mașină independent de cod de optimizare a conduce atât la nivel local (în cadrul unității de bază) și global (pentru toate blocurile) de optimizare a rămas practic în cadrul rutine. Reduce codul redundante și simplifică calculele. Rezultatul este un grafic de flux modificat.
  • Generatorul se leagă de cod țintă blocuri de bază într-un cod de control al transmisiei rectiliniu, creând un fișier obiect de asamblare registre virtuale (eventual ineficiente).
  • -Mașină dependentă de optimizare, linker alocă memorie între registre și face ca echipele de planificare. Acesta realizează programul de conversie într-un limbaj de asamblare la această adunare, cu o bună utilizare a pipelining.

În plus, utilizarea subsistemului manager de detectare a erorilor și tabele de simboluri.

Analiza lexicala (scanare)

Scanerul convertește caracterele sursă flux într-un flux de token-uri, eliminarea, comentarii și spații albe macro-uri în expansiune.

Scanere de multe ori se confruntă cu probleme, cum ar fi dacă sau nu să se ia în considerare cazul, marjele, sfârșiturile de linie și comentarii încorporate.

Erori care pot apărea în timpul scanării, numit lexicale și includ:

  • caractere care nu sunt în alfabetul;
  • excesul de numărul de caractere într-un cuvânt sau o linie;
  • nu un semn închis sau un șir literal;
  • Sfârșitul de fișier în comentariu.

Parsing (parsare)

Parserul convertește secvența de token-uri într-un arbore de sintaxă abstractă. Fiecare nod din arbore este stocat ca un obiect cu câmpuri denumite, dintre care multe sunt ele însele nodurile de copac. În acest stadiu, nu există cicluri. Când creați este necesar un parser să acorde o atenție la nivelul de complexitate al gramaticii (LL sau LR) și de a afla dacă există reguli dezambiguizare. Unele limbi nu necesită o analiză semantică.

Au fost găsite erori în această etapă se numesc sintaxă. De exemplu:

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

analiza semantică

În timpul analizei semantice pentru a verifica permisibilitatea normelor și părți asociate ale arborelui parsare (nume de referință care permite inserarea de operare pentru conversii de tip implicite, și așa mai departe. D.) pentru formarea grafic semantic.

Evident, setul de admisibilitate a normelor în diferite limbi diferite. Dacă compilați limbile-Java cum ar fi, compilatoare pot găsi:

  • declarație de variabilă multiplă în cadrul domeniului său de aplicare;
  • o trimitere la o variabilă înainte de declarația acesteia;
  • trimiterile la numele nedeclarate;
  • încălcarea drepturilor de brevet;
  • număr excesiv sau insuficient de argumente într-un apel de metodă;
  • nepotrivire de tip.

generație

generare de cod intermediar produce grafic flux compus din tupluri, grupate în blocuri de bază.

generarea de cod produce un cod de mașină reală. În compilatoare tradiționale pentru RISC mașinile pe primul pas, creați un asamblor cu un număr infinit de registre virtuale. Pentru CISC-mașinile, probabil, nu se va întâmpla.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 ro.delachieve.com. Theme powered by WordPress.