Reprezentarea internă a unui program C

Reprezentarea internă a unui program C
Reprezentarea internă a unui program C

4.6. Reprezentarea internă a unui program C

Sistemul de raportare a mediului intern de executare a-program C (referindu-se la „clasic“ C, nu C ++), cât mai aproape de „realitatea“ cu care se confruntă program care rulează direct la nivel de arhitectură, și care nu au sub un „distanțier“ software-ul. Prin această limbă se aplică termenul „asamblare-mașină independentă“, precum și conceptele de bază ale semanticii sale proiectate direct pe elementele corespunzătoare ale arhitecturii, inclusiv:

„Puritatea“ a codului. În absența unor apeluri la funcții externe, compilatorul generează un cod care reprezintă un „lucru în sine“. Mai mult decât atât, sunt specificate strict transformare implicită, însoțită de „inserții“ cod străin;

conformitatea cu formatele de prezentare a datelor tipurile de date de bază și în procesor. Tipuri de integrale sunt asociate cu diferite dimensiuni ale cuvintelor de mașini, susține un set de operații de transformări aritmetice, logice și la nivel de bit;

toate tipurile de date au o dimensiune fixă, care pot fi obținute folosind funcționarea programului sizeof. Programele pot pune în aplicare orice sistem de alocare de memorie și să se deplaseze liber de la o reprezentare la alta bază de date în aceeași zonă de depozitare;

funcțiile de apelare și transmiterea parametrilor

suna apelul subrutina și a reveni la revenirea echipei

Hardware stivă și variabile locale ale subrutina

Având în vedere că stiva hardware-ul se află în memoria RAM, este posibil să se plaseze un program de variabile normale. Plasarea variabilelor locale într-un teanc are o serie de avantaje în comparație cu variabilele de plasare statice la puncte fixe de RAM. După cum sa menționat mai sus, acest lucru vă permite să organizați recursivitate. În plus, arhitectura modernă de o importanță fundamentală pentru a sprijini procesele concurente care rulează pe variabile statice partajate. Această așa-numitele procese ușoare, fire sau fire (filet), care funcționează în paralel într-un singur program. Cu privire la utilizarea de fire, de exemplu, se bazează activitatea tuturor aplicațiilor grafice în sistemul Microsoft Windows 32: un fir de procese de sistem grafic de mesaje (apăsând pe butoanele tastaturii și mouse-ului, redesenarea de ferestre, eșantion comenzile dintr-un meniu, etc.), alte fire sunt angajate în calcule, comunicarea în rețea, animație etc.

Diverse fir funcționează în paralel pe date statice comune, astfel efectuarea unor lucrări împreună. În acest caz, aceeași rutină pot fi apelate din fire diferite. Spre deosebire de variabilele statice, care sunt comune tuturor componentelor, o stivă separată pentru fiecare fir este alocat. Când utilizați firul este foarte important ca variabilele locale ale subrutina introduse pe stivă. În caz contrar, nu ar fi posibil, în paralel, pentru a determina aceeași rutină din fire diferite: apelul subrutinei repetate se execută deja într-un alt fir, ar distruge un set static de variabile locale ale subrutina. Iar atunci când se utilizează seturile de date stivă locale ale aceluiași subrutina numit din fire diferite, diferite deoarece acestea sunt aranjate în diferite stive. Astfel, un alt fir de lucru cu diferite seturi de variabile locale, fără a interfera unele cu altele.

Să ne gândim mai detaliat modul în care variabilele locale sunt plasate în stivă subrutina prin exemplul limbajului C. În rutine C numite funcții. Funcția poate avea argumente și variabile locale, de exemplu, variabile care există numai în timpul executării funcției. De exemplu, luați în considerare funcția ƒ. în funcție de două argumente x intrare și tip întreg y care utilizează trei variabile locale o. b și c și tipul întreg. Funcția returnează o valoare întreagă.

Să presupunem că la un moment dat programul solicită ƒ funcția cu argumente x = 222, y = 333:

Apelantul împinge valoarea reală a argumentelor x și funcția ƒ y pe stiva, partea de sus a stivei este primul argument al funcției, sub el - al doilea argument. Apelarea unei funcții se traduce în următoarele comenzi:

La începutul funcției CTEK funcționare ƒ este după cum urmează: