Traducătorul este ... Tipuri de traducători. Convertiți și traduceți programul

Programele, precum oamenii, necesită traducători sau traducători care să traducă dintr-o limbă în alta.

Concepte de bază

Programul este o reprezentare lingvistică a calculelor: i → P → P (i). Interpretul este un program care este alimentat de programul P și de unele date de intrare x. Ea efectuează P pe x: I (P, x) = P (x). Faptul că există un singur translator care să poată efectua toate programele posibile (care pot fi reprezentate în sistemul oficial) este o descoperire foarte profundă și semnificativă a lui Turing.

Procesorul este interpretul programelor în limbajul mașinii. Este, de obicei, prea scump să se scrie interpreți pentru limbi de nivel înalt, astfel încât acestea să fie traduse într-o formă mai ușor de interpretat.

Unele tipuri de traducători au nume foarte ciudate:

  • Assembler traduce programele în asamblare în limbajul mașinii.
  • Compilatorul se traduce dintr-un limbaj de nivel înalt într-un limbaj inferior.

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

traducătorul este

Dacă traduceți întregul program în ceva care este interpretat, atunci se numește o compilație înainte de executare sau o compilare AOT. Componentele AOT pot fi utilizate secvențial, dintre care ultimul este adesea un asamblator, de exemplu:

Cod sursă → Compilator (compilator) → Cod de asamblare → Asamblator (traducător) → Cod mașină → CPU (interpret).

Compilarea online sau dinamică are loc dacă o porțiune a programului este tradusă atunci când sunt executate alte componente compilate. JIT-traducătorii își amintesc ce au făcut deja, pentru a nu repeta codul sursă din nou și din nou. Ele pot produce chiar compilație adaptivă și recompilare, bazate pe comportamentul mediului de rulare al programului.

Multe limbi vă permit să executați codul în timpul traducerii și să compilați un nou cod în timpul rulării.

Etape de traducere

Traducerea constă în etapele de analiză și sinteză:

Cod sursă → Analizor → Vedere conceptuală → Generator (sintetizator) → Cod țintă.

Aceasta se datorează următoarelor motive:

  • Orice altă metodă nu este adecvată. Traducerea cuvânt-cu-cuvânt 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).

tipuri de traducători

Cu toate acestea, în practică, reprezentarea conceptuală este foarte rar suficient de expresivă și puternică pentru a acoperi toate limbile sursă și țintă imaginabile. Deși unii dintre ei s-ar putea apropia de asta.

Compilerele reale trec prin multe etape. Când creați propriul compilator, nu este nevoie să repetați toată munca grea pe care o fac deja oamenii atunci când creați vizualizări și generatoare. Puteți să traduceți limba direct în jаvascript sau C și să utilizați motoarele jаvascript existente și compilatoarele C pentru a face restul. De asemenea, puteți utiliza vizualizările intermediare existente și mașini virtuale.

Înregistrarea traducătorului

Un traducător este un program sau un instrument tehnic în care sunt implicate trei limbi: sursă, țintă și de bază. Ele pot fi scrise în formularul T, plasând sursa pe stânga, ținta din dreapta și cea de bază de mai jos.

Există trei tipuri de compilatoare:

  • Un traducător este un auto-compilator dacă limba sursă corespunde unui limbaj de bază.
  • Compilatorul, al cărui limbaj țintă este egal cu limba de bază, se numește auto-rezident.
  • Un traducător este un compilator încrucișat, dacă are o altă limbă de bază și altă limbă de bază.

program de difuzare

De ce este important acest lucru?

Chiar dacă nu faceți niciodată un compilator real, este bine să știți despre tehnologia creării sale, deoarece conceptele folosite pentru acest lucru sunt aplicate peste tot, de exemplu în:

  • formatarea de texte;
  • limbaje de interogare la baze de date;
  • arhitecturi de calcul extinse;
  • probleme de optimizare generalizate;
  • interfețe grafice;
  • limbile de scripting;
  • controlere;
  • mașini virtuale;
  • traduceri de mașini.


În plus, dacă doriți să scrieți preprocesoare, constructori, încărcătoare, debugeri sau profilers, trebuie să parcurgeți aceiași pași ca la scrierea compilatorului.

De asemenea, puteți învăța cum să scrieți programe mai bine, deoarece crearea unui traducător pentru o limbă înseamnă o mai bună înțelegere a subtilităților și a ambiguităților sale. Învățarea principiilor generale ale traducerii face de asemenea posibil să devină un bun designer de limbi. Este atât de important, cât de limpede este limba, dacă nu se poate realiza în mod eficient?

Tehnologie cuprinzătoare

Tehnologia compilatorului acoperă multe domenii diferite ale informaticii:

  • teoria limbii formale: gramatica, parsarea, calculul;
  • arhitectura calculatorului: seturi de instrucțiuni, RISC sau CISC, conducte, nuclee, cicluri de ceas, 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..;
  • limbi abstracte și mașini virtuale;
  • algoritmi și structuri de date: Expresii regulate, algoritmi de parsare, algoritmi grafici, programarea dinamică, de formare;
  • limbaje de programare: sintaxa, semantica (statice și dinamice), paradigme de suport (structural, OOP, funcțională, logică, stivă, paralelism, meta-programare);
  • crearea de software (compilatoare, de regulă, mari și complexe): localizare, caching, componentizare, interfețe API, reutilizare, sincronizare.

conversia programului

Proiectarea compilatorului

Unele probleme care apar atunci când se dezvoltă un adevărat traducător:

  • Probleme cu limba sursă. Este ușor să o compilați? Există un preprocesor? Cum sunt manipulate tipurile? Există biblioteci?
  • Gruparea compilatorului trece: single-sau multi-pass?
  • Gradul de optimizare dorit. Translatarea rapidă și impură a programului cu optimizare minimă sau deloc poate fi normală. Optimizarea excesivă va încetini compilatorul, dar cel mai bun cod la timpul de execuție ar putea fi în valoare de acesta.
  • Rata de detectare a erorilor este necesară. Traducătorul se poate opri doar la prima eroare? Când ar trebui să se oprească? Am încredere în compilator pentru a corecta erorile?
  • Disponibilitatea instrumentelor. Dacă limba sursă nu este foarte mică, generatorul scannerului și analizorului este obligatoriu. Există, de asemenea, generatoare de generatoare de coduri, dar acestea nu sunt atât de comune.
  • Tipul de cod țintă pentru generare. Ar trebui să alegeți dintre coduri de mașini pure, augmentate sau virtuale. Sau scrieți doar o intrare care creează vederi intermediare populare, cum ar fi LLVM, RTL sau JVM. Sau traducerea de la sursă la codul sursă în C sau jаvascript.
  • Formatul codului țintă. Puteți alege limba de asamblare, codul mașinii portabile, codul mașinii din imaginea de memorie.
  • Retargeting. Cu o mulțime de generatoare este bine să ai o parte comună de intrare. Din același motiv, este mai bine să aveți un generator pentru mai multe părți de intrare.

compilație dinamică

Compilatoare Arhitectura: Componente

Acestea sunt principalele componente funcționale ale compilatorului care generează codul mașinii (dacă programul de ieșire este un program C sau o mașină virtuală, atunci nu sunt necesare mai mulți pași):

  • Programul de intrare (flux de semne) intră în scaner (analizor lexical), care îl transformă într-un flux de jetoane.
  • Parserul (parser) construiește un arbore de sintaxă abstractă din ele.
  • Analizorul semantic descompune informațiile semantice și verifică dacă nodurile arborelui sunt eronate. Rezultatul este un grafic semantic - un arbore de sintaxă abstractă cu proprietăți suplimentare și referințe instalate.
  • Generatorul de cod intermediar construiește un grafic de flux (tuplurile sunt grupate în blocurile principale).
  • Sistemul de optimizare a codurilor independent de mașină efectuează atât optimizarea locală (în cadrul blocului de bază) cât și globalizarea (pentru toate blocurile), rămânând, în principiu, în cadrul subrutinelor. Reduce codul redundant și simplifică calculele. Rezultatul este un grafic de flux modificat.
  • Generatorul de cod destinație leagă blocurile de bază de linia dreaptă cu transferul de control, creând un fișier obiect în asamblare cu registre virtuale (posibil ineficient).
  • Optimizatorul linker independent de mașină alocă memoria între registre și comenzi de programe. Convertește programul în asamblare într-un asamblator real, cu o bună utilizare a conductelor.

În plus, subsistemele de detectare a erorilor și managerul de tabele de simboluri sunt utilizate.

fișier obiect

Analiza lexicală (scanare)

Scanerul convertește fluxul de caractere ale codului sursă într-un flux de jetoane, eliminând spații, comentarii și macrocomenzi extinse.

Scanerii întâlnesc adesea probleme cum ar fi acceptarea sau neluarea în considerare a registrelor, liniuțelor, fluxurilor de linii și comentariilor imbricate.

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

  • caractere care nu sunt în alfabet;
  • depășind numărul de caractere dintr-un cuvânt sau șir;
  • nu un caracter închis sau literal șir;
  • sfârșitul fișierului în comentarii.

Analiza sintaxei (parsarea)

Parserul convertește secvența de jetoane într-un arbore de sintaxă abstractă. Fiecare nod arbore este salvat ca un obiect cu câmpuri numite, multe dintre ele fiind noduri ale copacului. Nu există cicluri în acest stadiu. Atunci când creați un parser, ar trebui să acordați atenție nivelului de complexitate a gramaticii (LL sau LR) și să aflați dacă există reguli pentru eliminarea ambiguității. Unele limbi necesită analiză semantică.

Erori întâlnite în această etapă se numesc erori de sintaxă. De exemplu:

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

Analiza semantică

În timpul analiză semantică este necesară verificarea regulilor de admisibilitate și legarea părților arborelui de sintaxă (permiterea trimiterilor de nume, introducerea operațiilor pentru turnarea implicită a tipurilor etc.) pentru a forma un grafic semantic.

Evident, setul de reguli de admisibilitate pentru diferite limbi este diferit. Dacă limbile asemănătoare cu Java sunt compilate, traducătorii pot găsi:

  • declarații multiple ale unei variabile care intră în domeniul său de aplicare;
  • trimiterea la o variabilă înainte de declarația sa;
  • referiri la numele nedeclarat;
  • încălcarea regulilor de accesibilitate;
  • număr prea mare sau insuficient de argumente la apelarea metodei;
  • tipul de nepotrivire.

program de intrare

generație

Generarea codului intermediar produce un grafic de flux compus din tupluri grupate în blocuri de bază.

Generarea de coduri produce codul mașinii reale. În compilatoarele tradiționale pentru mașinile RISC, în prima etapă, este creat un asamblator cu un număr infinit de registre virtuale. Pentru mașinile CISC, acest lucru probabil că nu se va întâmpla.

Distribuiți pe rețelele sociale:

înrudit
Traducerea unei pagini în limba rusă: instrucțiuni pas cu pas către browserele populareTraducerea unei pagini în limba rusă: instrucțiuni pas cu pas către browserele populare
Ca și în Mozilla traduceți paginile în rusă - instrucțiuni și recomandări pas cu pasCa și în Mozilla traduceți paginile în rusă - instrucțiuni și recomandări pas cu pas
Limbaj de programare JavaLimbaj de programare Java
Lista limbajelor de programare. Limbi de programare de nivel scăzut și înaltLista limbajelor de programare. Limbi de programare de nivel scăzut și înalt
Interpretată este ... Interpretul este un sinonimInterpretată este ... Interpretul este un sinonim
Programare: limba de asamblare. Elementele de bază ale limbajului de asamblareProgramare: limba de asamblare. Elementele de bază ale limbajului de asamblare
Python pentru începătoriPython pentru începători
Mediul de programare `Pascal ABC`Mediul de programare `Pascal ABC`
Cele mai populare limbi de programare. Limbaje de programare pentru începătoriCele mai populare limbi de programare. Limbaje de programare pentru începători
Ce este un compilator - descriereCe este un compilator - descriere
» » Traducătorul este ... Tipuri de traducători. Convertiți și traduceți programul