1 Întrebare teoretică "semantica și schemele semantice ale programelor"

1.1 Semantica operațională 3

Semantica denociară 5

1.3 Semantica axiomatică 8

1.4 Semantica translației 9

1.5 Concluzii privind metodele de determinare a semanticii 10







2 Problema celor cinci filozofi de mese 10

2.1 Afirmația problemei 10

2.2 Soluția problemei 11

2.3 Lista procedurilor de rezolvare a sarcinilor 12

3 Lista surselor utilizate 15

1 Întrebare teoretică "Semantica și schemele semantice ale programelor" 3

1.1 Semantica de operare3

1.2 Semantica denotationala5

1.3 Semantica axiomatică

1.4 Semantica translațională 9

1.5 Concluzii privind metodele de determinare a semanticii 9

2 Problema celor cinci filozofi de mese

2.1 Afirmația problemei10

2.2 Rezolvarea problemelor10

2.3 Listarea procedurilor de soluționare a problemei11

3 Lista surselor utilizate15

În majoritatea ghidurilor, definiția semanticii este dată în text simplu. De regulă, mai întâi cu ajutorul unor gramatici formale este dată o definiție a sintaxei construcției și apoi sunt date câteva exemple și un mic text explicativ pentru explicarea semanticii. Din păcate, înțelesul acestui text este adesea ambiguu, astfel încât cititorii diferiți să o înțeleagă în moduri diferite. Un programator poate obține o idee greșită despre exact ceea ce va face programul atunci când este executat, iar dezvoltatorul poate implementa orice construcție de limbă diferit decât dezvoltatorii altor implementări ale aceleiași limbi. În ceea ce privește sintaxa, aveți nevoie de o metodă care vă permite să oferiți o definiție precisă și concisă a semanticii limbii.

Problema determinării semanticii unui limbaj de programare a fost luată în considerare de teoreticieni pentru o lungă perioadă de timp, însă nu a fost găsită încă o soluție universală satisfăcătoare. Au fost dezvoltate multe metode diferite de determinare a semanticii formale. Să luăm în considerare câteva dintre ele.

Vorbind despre metodele de determinare a semanticii, nu putem să nu menționăm semantica operațională. Semantica de operare este redusă la descrierea sensului programului prin executarea operatorilor pe o mașină reală sau virtuală. Semnificația operatorului este determinată de modificările care au avut loc în starea mașinii după executarea acestui operator. Pentru a înțelege acest concept, ia în considerare comanda în limba mașinii.

Permiteți starea calculatorului să fie valorile tuturor registrelor și celulelor de memorie, inclusiv codurile de stare și registrele de stare. Dacă scrieți doar starea computerului, executați comanda, sensul pe care doriți să o definiți și apoi explorați noua stare a mașinii, semantica a acestei comenzi devine clar: acesta este reprezentat de schimbarea în starea computerului cauzată de executarea comenzii.

Descrierea semanticii operaționale a operatorilor de limbi de programare de nivel înalt necesită crearea unui calculator real sau virtual. Hardware-ul computerului este un interpret pur al limbajului mașinii. Un interpret pur al oricărui limbaj de programare poate fi creat cu ajutorul unui software care devine un calculator virtual pentru o anumită limbă. Semantica unui limbaj de nivel înalt poate fi descrisă folosind un interpret pur al acelui limbaj. Cu această abordare, totuși, există două probleme. În primul rând, complexitatea și caracteristicile individuale ale hardware-ului calculatorului și ale sistemului de operare utilizat pentru a rula un interpret curat fac dificilă înțelegerea a ceea ce se întâmplă. În al doilea rând, definiția semantică făcută în acest fel va fi disponibilă numai pentru persoanele cu o configurație absolut identică a calculatorului.

Această problemă poate fi evitată prin înlocuirea calculatorului real cu un calculator virtual de nivel inferior. Registrele, memoria, informațiile despre starea și procesul de executare a operatorilor pot fi modelate de programele corespunzătoare. Un set de comenzi poate fi creat astfel încât semantica fiecărei comenzi individuale să fie ușor de înțeles și de descris. Astfel, mașina ar fi idealizată și mult simplificată, ceea ce ar face mai ușor să înțeleagă schimbările în starea ei.

Folosirea metodei operaționale pentru a descrie pe deplin semantica limbajului de programare necesită două componente. În primul rând, pentru a traduce limba, operatorii limbajului selectat de nivel scăzut au nevoie de un traducător. În al doilea rând, pentru acest limbaj de nivel scăzut, este necesară o mașină virtuală, a cărei stare este modificată de comenzi primite în timpul traducerii operatorilor de nivel înalt. Modificările în starea acestei mașini virtuale determină semnificația acestui operator.

Tabelul 1.1 prezintă un exemplu în care semantica construirii limbajului C poate fi descrisă în termenii următoarelor comenzi simple.

Tabelul 1.1 - Exemplu de semantică operațională

Operatorul C

trebuie să etichetați dacă var relop var a vrut să eticheteze

Aici relop este unul dintre operatorii relației din set, ident este identificatorul și var este identificatorul sau constanta. Toți acești operatori sunt simpli și ușor de înțeles și implementați.

Prima și cea mai semnificativă utilizare a semanticii operaționale formale a fost descrierea semanticii PL / I. Aceste reguli abstracte și regulile de traducere PL / I au fost numite prin denumirea comună Vienna Definition Language (VDL) în onoarea orașului în care au fost create de IBM.

Semantica operațională este eficientă atât timp cât descrierea limbii rămâne simplă și informală. Din păcate, descrierea VDL a limbajului PL / I este atât de complicată încât practic nu servește scopurilor practice.

Semantica operațională depinde de algoritmi și nu de matematică. Operatorii unui limbaj de programare sunt descriși în termeni de operatori ai unui alt limbaj de programare care are un nivel inferior. Această abordare poate duce la un cerc vicios atunci când conceptele sunt implicit exprimate prin ele însele. Metodele descrise în următoarele două secțiuni sunt mult mai formale în sensul că se bazează pe logică și matematică, mai degrabă decât pe mașini.

Semantica denotationala este cea mai riguroasa metoda cunoscuta pentru descrierea semnificatiei programelor. Se bazează foarte mult pe teoria funcțiilor recursive. Considerația complexă a semanticii denotăționale este o aventură lungă și complexă.







Conceptul de bază al semanticii denotationale este definirea pentru fiecare entitate a limbajului a unui anumit obiect matematic și a unei anumite funcții care cartografiază instanțele acestei entități la instanțele acestui obiect matematic. Deoarece obiectele sunt definite strict, ele reprezintă sensul exact al entităților relevante. Ideea însăși se bazează pe faptul că există metode stricte de manipulare a obiectelor matematice, mai degrabă decât construirea limbajelor de programare. Complexitatea utilizării acestei metode este de a crea obiecte și funcții de afișare. Denumirea metodei "semantică denotatională" derivă din cuvântul englez denote (denote), deoarece un obiect matematic denotă semnificația entității sintactice corespunzătoare.

Pentru a introduce metoda denotationala, folosim un construct limbaj foarte simplu - numere binare. Sintaxa acestor numere poate fi descrisă prin următoarele reguli gramaticale:

<двоичное_число> → 0 | 1; | | <двоичное_число> 0; | | <двоичное_число> 1.

Pentru a descrie numere binare folosind semantica denotationala si regulile gramaticale mentionate mai sus, valoarea lor efectiva este asociata cu fiecare regula care are un simbol terminal (principal) in partea sa dreapta. Obiectele în acest caz sunt numere zecimale.

În acest exemplu, obiectele semnificative trebuie să comunice cu primele două reguli. Celelalte două reguli sunt, într-un sens, regulile de calcul, deoarece ele combină simbolul terminalelor cu care obiectul poate fi asociat cu nonterminalul, care poate fi o anumită construcție.

Fie ca domeniul de definire a valorilor semantice ale obiectelor să fie un set de întregi decimați decimați negativi Nat. Acestea sunt exact obiectele pe care vrem să le asociem cu numere binare. Funcția semantică Mb desenează obiecte sintactice la obiectele din setul N conform regulilor de mai sus. Funcția Mb în sine este definită după cum urmează:

Mb ('0') = 0, Mb ('1') = 1; Mb (<двоичное_число> '0') = 2 × Mb (<двоичное_число>); Mb (<двоичное_число> '1') = + 2 x Mb (<двоичное_число>) + 1.

Descrierea valorii constantelor literale sintactice zecimale. <десятичное_число> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; | | <десятичное_число> (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9).

Mapările denotaționale pentru aceste reguli de sintaxă sunt după cum urmează:

Md ('0') = 0, Md ('1') = 1. Md ('9') = 9; Md (<десятичное_число> '0') = 10 × Md (<двоичное_число>); Md (<десятичное_число> '1') = 10 × Md (<десятичное_число>) + 1; ... Md (<десятичное_число> '9') = 10 × Md (<десятичное_число>) +9.

După ce ați determinat sistemul complet pentru o anumită limbă, îl puteți folosi pentru a determina semnificația programelor complete ale acelei limbi. Aceasta creează baza pentru un mod foarte strict de gândire în programare.

Semantica semantică a programului poate fi definită în termeni de schimbări în stările unui calculator ideal. În mod similar s-au definit cimenturile operaționale și au fost definite și determinările denotaționale. Adevărat, pentru simplitate, ele sunt definite numai în ceea ce privește valorile tuturor variabilelor declarate în program. Semantica operațională și denotatională diferă prin faptul că schimbările în stările din semantica operațională sunt determinate de algoritmi programați, iar în semantica denotatională ele sunt determinate de funcții matematice stricte. Fie starea programului definită de următorul set de perechi ordonate:

Fiecare parametru i este numele variabilei, iar parametrii corespunzători v sunt valorile curente ale acestor variabile. Oricare dintre parametrii v poate avea o valoare specială undef, indicând faptul că valoarea asociată cu acesta nu este definită în prezent.

Fie ca VARMAP să fie o funcție a doi parametri, numele variabilei și starea programului. Valoarea funcției VARMAP (ik, s) este vk (valoarea corespunzătoare parametrului ik în starea s).

Cele mai multe funcții de cartografiere semantice pentru programe și software construiește stările hărților în stări. Aceste modificări de stat sunt folosite pentru a determina semnificația programelor și a proiectelor software. Rețineți că astfel de construcții de limbi, ca expresii, nu sunt afișate în state, ci în cantități.

Expresiile sunt baza multor limbi de programare. În plus, avem de-a face doar cu expresii foarte simple. Singurii operatori sunt + și ×; expresiile nu pot conține mai mult de o declarație; Singurele operanzi sunt variabile scalare și constante literale întregi; nu se utilizează paranteze; valoarea expresiei este un număr întreg. Următoarea este o descriere a acestor expresii: <выражение> → <десятичное_число> | | <переменная> | | <двоичное_выражение> <двоичное_выражение> → <выражение_слева> <оператор> <выражение_справа> <оператор> → + | ×

După ce ați determinat sistemul complet pentru o anumită limbă, îl puteți folosi pentru a determina semnificația programelor complete ale acelei limbi. Aceasta creează baza pentru un mod foarte strict de gândire în programare.

Semantica denotationala poate fi folosita pentru a dezvolta o limba. Operatorii, care sunt greu de descris cu ajutorul semanticii denotationale, pot fi dificil de inteles de catre utilizatori, iar dezvoltatorul ar trebui sa se gandeasca la un design alternativ.

Pe de o parte, descrierile denotaționale sunt foarte complexe, pe de altă parte - ele oferă o metodă excelentă de descriere concisă a limbii. [1, p.188-191]

În cazul în care semantica operaționale este destinat în primul rând să se stabilească în mod clar regulile de conduită pentru Programul executiv, axiomatica (deductive) semantica destinată în primul rând să se stabilească în mod clar regulile de conduită artist dovedind proprietăți ale programelor (cele mai interesante dintre aceste proprietăți - proprietatea de a da unele rezultate cu anumite date de intrare).

semantica axiomatica (derivare, deductiv, logic) se bazează pe un sistem de axiome, postulate proprietățile constructele lingvistice de bază și regulile de deducție, care permit să se obțină proprietățile oricăror programe și fragmentele lor prin retragerea regulilor de axiome inferență. Scopul principal al acestei metode de descriere a semanticii este de a ne permite să dovedim corectitudinea programelor prin logica matematică.

Iată definiția dată de un dicționar explicativ: semantica axiomatică este semantica limbajelor de programare, în care sensul unui construct sau program de limbă în anumite limbi de programare este determinat de "axiom". Pentru fiecare afirmație concretă, axioma indică ceea ce trebuie să fie adevărat după realizarea sa în contextul a ceea ce era adevărat înainte de realizarea cuvântului. Semantica axiomatică joacă un rol important în demonstrarea corectitudinii programelor.

Spre deosebire de semantica operațională, semantica deductivă refuză să asocieze semnificația construcțiilor limbajelor de programare cu orice mod de efectuare a calculelor. Astfel, se rezumă la o serie de detalii de calcule care nu sunt semnificative pentru înțelegerea sensului programului și fac posibilă discutarea despre proprietățile abstracte ale programelor. Cu toate acestea, semantica deductivă este în principal orientată către programarea imperativă. [2]

Cu abordarea traducerii, semantica limbajului de programare este specificată prin definirea regulilor pentru traducerea (convertirea) fiecărui program sintactic corect într-o propoziție într-o limbă a cărei semantică este deja cunoscută. De exemplu, regulile pentru traducerea unui limbaj de tip assembler sunt atât de simple și de înțeles încât ele formează o specificație semantică complet satisfăcătoare a limbajului de asamblare. Definiția semanticii prin desemnarea pentru fiecare construcție a limbii imaginii corespunzătoare (secvența instrucțiunilor pseudo-mașină) a fost utilizată în determinarea limbajului Epsilon orientat pe mașină.

În general, abordarea traducerii poate fi utilizată pentru limbile de nivel înalt. Ca limba în care transferul poate fi selectat un limbaj matematic (de exemplu, limba-calcul), o altă limbaj de programare (de exemplu, limba ALMO pentru a descrie algoritmi, limbaje sau limbaj Pascal pentru limba Settle) sau o anumită limbă mașină. Astfel, un traducător pentru un limbaj de nivel înalt pentru o limbă specifică a mașinii devine o definiție semantică a limbii. [3]

Concluzii privind metodele de determinare a semanticii

Există mai multe motive pentru care semantica programelor ar trebui abordată. sau semnificația expresiilor, a operatorilor și a unităților de program.

Un ghid pentru utilizarea limbajului de programare ar trebui să includă o descriere a fiecărui construct de limbaj, fie singur, fie în combinație cu alte construcții. În limbaj există multe modele diferite, a căror definiție exactă este necesară atât pentru programatorul care folosește limba, cât și pentru dezvoltatorul implementării acestei limbi. Programatorul are nevoie de aceste informații pentru a scrie programele corecte și cunoaște în prealabil rezultatul oricăror operatori de programe. Pentru dezvoltatorul de compilatoare, sunt necesare definiții corecte ale construcțiilor pentru a crea o implementare corectă a limbii.







Trimiteți-le prietenilor: