Compilator

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Notă despre dezambiguizare.svg Dezambiguizare - Dacă sunteți în căutarea profesiei de editor cu același nume, consultați Curatorul editorial .
Notă despre dezambiguizare.svg Dezambiguizare - "Compilație" se referă aici. Dacă sunteți în căutarea tipului de album, consultați Compilare .
Diagramă care ilustrează modul în care funcționează un compilator ideal.

Un compilator este un program de calculator care traduce o serie de instrucțiuni scrise într-un anumit limbaj de programare ( cod sursă ) în instrucțiuni ale unui alt limbaj ( cod obiect ): procesul de traducere se numește compilare în timp ce activitatea inversă - adică trecerea de la codul obiect la codul sursă - se numește decompilare și se face cu ajutorul unui decompilator .

Dacă toți compilatorii au aderat exact la specificațiile de limbaj, același program ar putea fi compilat neschimbat de fiecare compilator, producând semantic aceleași rezultate, adică programe care produc același rezultat atunci când sunt supuși acelorași date de intrare . În realitate, mulți compilatori implementează limba incomplet sau adaugă extensii proprietare, creând astfel dialecte ale limbii principale. Pentru limbile care adoptă un standard în decorarea simbolurilor, codul obiect generat de diferite compilatoare poate fi legat împreună într-un singur executabil.

Istorie

Începând din 1950 au fost dezvoltate mai multe compilatoare experimentale (inclusiv sistemul A-0 al Grace Hopper ), dar în 1957 echipa Fortran de la IBM , condusă de John Backus , a fost prima care a dezvoltat un compilator complet în timp ce, în 1960 , COBOL a fost unul dintre primele limbi care trebuie compilate pe arhitecturi multiple. [1]

Ideea de compilare a prins rapid și multe dintre principiile de proiectare a compilatorului au fost dezvoltate în anii 1960. Un compilator este el însuși un program scris într-o anumită limbă și primul dintre ele a fost scris în Assembly . Primul compilator auto-compilat, capabil să compileze propriul cod, a fost creat pentru limbajul Lisp de către Hart și Levin la MIT în 1962 . [2] Utilizarea limbajelor de nivel înalt pentru scrierea compilatoarelor s-a accelerat la începutul anilor 1970, când limbajele Pascal și C au fost folosite pentru a scrie compilatoare pentru ele însele: adică, de exemplu, compilatoare pentru C scrise la rândul lor în C.

Descriere

Pictogramă lupă mgx2.svg Același subiect în detaliu: Cod sursă și cod obiect .

Atunci când un limbaj de programare este definit pentru prima dată, apare problema modului de a face compilatorul său. În acest caz, există două abordări posibile:

  • scrieți compilatorul într-o altă limbă;
  • sau - dacă există deja un interpret pentru noul limbaj - este posibil să îl folosiți pentru a scrie o primă versiune a compilatorului, care va fi utilizată (oferindu-i codul sursă în sine) pentru a obține un prim compilator care funcționează în limbajul mașinii , care va face apoi utilizarea interpretului este inutilă. Compilatorul astfel obținut poate fi folosit pentru a scrie la rândul său compilatoare mai bune și așa mai departe.

Operațiune

Etape tipice de compilare.

Compilatorul intră într- un program , codul sursă, pe care efectuează o serie de operații pentru a obține, în absența erorilor , codul obiect. În general, compilatoarele sunt capabile să recunoască unele clase de erori prezente în program și, în unele cazuri, să sugereze cum să le corectăm.

Compilatoarele actuale împart operația de compilare în două etape principale: partea frontală și cea din spate . În etapa front-end , compilatorul traduce sursa într-un limbaj intermediar (de obicei intern al compilatorului); în etapa din spate, are loc generarea codului obiectului.

Etapa frontală

Această etapă este împărțită în mai multe etape:

  • Analiza lexicală Prin intermediul unui analizor lexical , adesea numit scanner sau lexer , compilatorul împarte codul sursă în multe bucăți numite jetoane . Jetoanele sunt elementele minime (care nu sunt divizibile în continuare) ale unei limbi, de exemplu cuvinte cheie ( pentru , în timp ce ), nume de variabile ( foo ), operatori ( + , - , « ).
  • Analizarea Analiza ia ca intrare secvența de jetoane generate în faza anterioară și efectuează verificarea sintaxei. Verificarea sintactică se face printr-o gramatică . Rezultatul acestui pas este un arbore de sintaxă .
  • Analiza semantică Analiza semantică se referă la verificarea semnificației instrucțiunilor prezente în codul de intrare. Verificările tipice ale acestei faze sunt verificarea tipului , adică verificarea faptului că identificatorii au fost declarați înainte de a fi utilizați și așa mai departe. Ca suport pentru acest pas, este creat un tabel de simboluri ( tabel de simboluri) care conține informații despre toate elementele întâlnite simbolic, cum ar fi numele, domeniul de aplicare , tipul (dacă este prezent) etc. Rezultatul acestei faze este arborele analizat abstract (AST).
  • Generarea codului intermediar: codul intermediar este generat din arborele de sintaxă.

Etapa din spate

Etapa din spate este, de asemenea, împărțită în mai multe faze:

  • Optimizarea codului intermediar.
  • Generarea codului țintă: în această fază codul este generat sub forma limbii țintă. Adesea limba țintă este o limbă mașină .

Schema sumară

curgere Activități
Cod sursa Editarea
Analizor lexical Analiza lexicală
Jeton
Analizator Analiza sintactică
Arborele de sintaxă
Analizor semantic Analiza semantică
Arborele sintaxei abstracte
Generator de cod intermediar
cod intermediar
Optimizator de cod intermediar
cod intermediar
Generator de cod țintă
codul țintă

Notă

  1. ^ The World's First COBOL Compilers Arhivat 20 februarie 2012 la Internet Archive .
  2. ^ AIM-39 , pe ai.mit.edu . Adus la 4 noiembrie 2005 (arhivat din original la 13 septembrie 2006) .

Bibliografie

  • Alfred V. Aho, Ravi Sethi și Jeffrey D. Ullman, Compilatori. Principii, tehnici și instrumente , Milano, Pearson, 2006. ISBN 978-88-7192-559-2

Elemente conexe

Alte proiecte

linkuri externe

Controlul autorității Thesaurus BNCF 2330 · LCCN (EN) sh86007588 · GND (DE) 4148248-7 · BNF (FR) cb120631538 (data) · BNE (ES) XX532454 (data) · NDL (EN, JA) 01.191.219
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT