Sistem de rulare - Runtime system

În programarea computerului , un sistem de execuție , numit și mediu de execuție , implementează în primul rând porțiuni dintr-un model de execuție . Acest lucru nu trebuie confundat cu timpul rulării faza ciclului de viata a unui program, în care sistemul de rulare este în funcțiune. Când tratați sistemul de execuție ca fiind diferit de mediul de execuție (RTE), primul poate fi definit ca o parte specifică a aplicației software (IDE) folosită pentru programare , o piesă de software care oferă programatorului un mediu mai convenabil pentru rularea programelor în timpul producției lor ( testare și altele similare), în timp ce al doilea (RTE) ar fi chiar instanța unui model de execuție aplicat programului dezvoltat, care este el însuși rulat în sistemul de runtime menționat anterior .

Majoritatea limbajelor de programare au o formă de sistem de execuție care oferă un mediu în care rulează programele. Acest mediu poate aborda o serie de probleme, inclusiv gestionarea memoriei aplicației , modul în care programul accesează variabile , mecanismele pentru trecerea parametrilor între proceduri , interfața cu sistemul de operare și altele. De compilator face presupuneri în funcție de sistemul de execuție specific pentru a genera cod corect. De obicei, sistemul de runtime va avea o anumită responsabilitate pentru configurarea și gestionarea stivei și a heap-ului și poate include caracteristici precum colectarea gunoiului , fire de execuție sau alte caracteristici dinamice încorporate în limbă.

Prezentare generală

Fiecare limbaj de programare specifică un model de execuție și mulți implementează cel puțin o parte din acel model într-un sistem de runtime. O posibilă definiție a comportamentului sistemului de rulare, printre altele, este „orice comportament care nu poate fi atribuit direct programului în sine”. Această definiție include plasarea parametrilor în stivă înainte de apeluri de funcții, executarea paralelă a comportamentelor conexe și I / O de disc .

Prin această definiție, în esență , fiecare limbă are un sistem de rulare, inclusiv limbajele compilate , limbaje interpretate și integrate limbaje de domeniu specifice . Chiar și modelele de execuție independente invocate de API , cum ar fi Pthreads ( thread-uri POSIX ), au un sistem de execuție care implementează comportamentul modelului de execuție.

Majoritatea lucrărilor științifice despre sistemele de execuție se concentrează pe detaliile de implementare a sistemelor de execuție paralele. Un exemplu notabil de sistem de execuție paralel este Cilk , un popular model de programare paralelă. Setul de instrumente pentru proto-runtime a fost creat pentru a simplifica crearea sistemelor de runtime paralele.

În plus față de comportamentul modelului de execuție, un sistem de execuție poate efectua și servicii de asistență, cum ar fi verificarea tipului , depanarea sau generarea și optimizarea codului .

Relația cu mediile de rulare

Sistemul de execuție este, de asemenea, poarta de acces prin care un program care rulează interacționează cu mediul de execuție . Mediul de rulare include nu numai valori de stare accesibile, ci și entități active cu care programul poate interacționa în timpul execuției. De exemplu, variabilele de mediu sunt caracteristici ale multor sisteme de operare și fac parte din mediul de rulare; un program care rulează le poate accesa prin intermediul sistemului de runtime. De asemenea, dispozitivele hardware precum discurile sau unitățile DVD sunt entități active cu care un program poate interacționa printr-un sistem de runtime.

O aplicație unică a unui mediu de execuție este utilizarea sa într-un sistem de operare care îi permite doar să ruleze. Cu alte cuvinte, de la pornire până la oprire, întregul sistem de operare este dedicat doar aplicațiilor care rulează în acel mediu de execuție. Orice alt cod care încearcă să ruleze sau orice eșec în aplicație (aplicații) va întrerupe mediul de rulare. Ruperea mediului de execuție la rândul său sparge sistemul de operare, oprind toate procesările și necesitând o repornire. Dacă boot-ul se face din memorie numai în citire, se creează un sistem extrem de sigur, simplu, cu o singură misiune.

Exemple de astfel de sisteme de runtime incluse direct:

  • Între 1983 și 1984, Digital Research a oferit mai multe aplicații de business și educație pentru PC-ul IBM pe dischete bootabile pachet cu SpeedStart CP / M-86 , o versiune redusă a CP / M-86 ca mediu de rulare.
  • Unele versiuni independente ale Ventura Publisher (1986–1993), Artline (1988–1991), Timeworks Publisher (1988–1991) și ViewMAX (1990–1992) conțineau versiuni speciale de rulare ale GEM ale Digital Research ca mediu de rulare.
  • La sfârșitul anilor 1990, JP Software - procesor de linie de comandă e 4DOS a fost opțional , disponibil într - o versiune specială de execuție care urmează să fie legat de BATCOMP pre-compilate și criptate de locuri de muncă lot , în scopul de a crea unmodifyable executabilele din script - uri lot și le rula pe sistemele fără 4DOS instalate .

Exemple

Sistemul de rulare al limbajului C este un set particular de instrucțiuni inserate de compilator în imaginea executabilă. Printre altele, aceste instrucțiuni gestionează stiva de proces, creează spațiu pentru variabilele locale și copiază parametrii apelului funcției în partea de sus a stivei.

De multe ori nu există criterii clare pentru determinarea comportamentelor lingvistice care fac parte din sistemul de rulare în sine și care pot fi determinate de un anumit program sursă. De exemplu, în C, configurarea stivei face parte din sistemul de runtime. Nu este determinat de semantica unui program individual, deoarece comportamentul este invariant la nivel global: el deține toate execuțiile. Acest comportament sistematic implementează modelul de execuție al limbajului, spre deosebire de implementarea semanticii programului particular (în care textul este tradus direct în cod care calculează rezultatele).

Această separare între semantica unui anumit program și mediul de execuție este reflectată de diferitele moduri de compilare a unui program: compilarea codului sursă într-un fișier obiect care conține toate funcțiile versus compilarea unui întreg program într-un binar executabil. Fișierul obiect va conține doar cod de asamblare relevant pentru funcțiile incluse, în timp ce binarul executabil va conține cod suplimentar care implementează mediul de execuție. Fișierul obiect, pe de o parte, poate să lipsească informații din mediul de execuție care vor fi rezolvate prin conectare . Pe de altă parte, codul din fișierul obiect depinde în continuare de ipotezele din sistemul de execuție; de exemplu, o funcție poate citi parametrii dintr-un anumit registru sau locație de stivă, în funcție de convenția de apelare utilizată de mediul de rulare.

Un alt exemplu este cazul utilizării unei interfețe de programare a aplicațiilor (API) pentru a interacționa cu un sistem de execuție. Apelurile către acel API arată la fel ca apelurile către o bibliotecă software obișnuită , cu toate acestea, la un moment dat în timpul apelului, modelul de execuție se schimbă. Sistemul de execuție implementează un model de execuție diferit de cel al limbajului în care este scrisă biblioteca. O persoană care citește codul unei biblioteci normale ar putea să înțeleagă comportamentul bibliotecii doar prin cunoașterea limbii în care a fost scrisă biblioteca. Cu toate acestea, o persoană care citește codul API-ului care invocă un sistem de rulare nu ar putea înțelege comportamentul apelului API doar prin cunoașterea limbii în care a fost scris apelul. La un moment dat, prin intermediul unui mecanism, modelul de execuție nu mai este cel al limbii în care este scris apelul și trece la a fi modelul de execuție implementat de runtime sistem. De exemplu, instrucțiunea trap este o metodă de comutare a modelelor de execuție. Această diferență este ceea ce distinge un model de execuție invocat de API, cum ar fi Pthreads, de o bibliotecă software obișnuită. Atât apelurile Pthreads, cât și apelurile bibliotecii software sunt invocate printr-un API, dar comportamentul Pthreads nu poate fi înțeles în ceea ce privește limba apelului. Mai degrabă, apelurile Pthreads aduc în joc un model de execuție extern, care este implementat de sistemul de execuție Pthreads (acest sistem de execuție este adesea kernel-ul OS).

Ca un exemplu extrem, CPU-ul fizic în sine poate fi privit ca o implementare a sistemului de execuție al unui limbaj de asamblare specific. În această perspectivă, modelul de execuție este implementat de către procesorul fizic și sistemele de memorie. Ca o analogie, sistemele de rulare pentru limbaje de nivel superior sunt ele însele implementate folosind alte limbi. Aceasta creează o ierarhie a sistemelor de runtime, cu CPU în sine - sau, de fapt, logica sa la nivelul microcodului sau mai jos - acționând ca sistemul de runtime de nivel inferior.

Caracteristici avansate

Unele limbaje compilate sau interpretate oferă o interfață care permite codului aplicației să interacționeze direct cu sistemul de rulare. Un exemplu este Threadclasa în limbajul Java . Clasa permite codului (care este animat de un fir) să facă lucruri precum pornirea și oprirea altor fire. În mod normal, aspectele de bază ale comportamentului unui limbaj, cum ar fi planificarea sarcinilor și gestionarea resurselor, nu sunt accesibile în acest mod.

Comportamentele la nivel superior implementate de un sistem de rulare pot include sarcini precum desenarea textului pe ecran sau realizarea unei conexiuni la Internet. Este adesea cazul ca sistemele de operare să ofere și aceste tipuri de comportamente și, atunci când este disponibil, sistemul de runtime este implementat ca un strat de abstractizare care traduce invocarea sistemului de runtime într-o invocare a sistemului de operare. Aceasta ascunde complexitatea sau variațiile serviciilor oferite de diferite sisteme de operare. Acest lucru implică, de asemenea, că kernel-ul OS poate fi însuși văzut ca un sistem de execuție și că setul de apeluri OS care invocă comportamentele sistemului de operare pot fi privite ca interacțiuni cu un sistem de execuție.

În limită, sistemul de execuție poate oferi servicii precum o mașină cu cod P sau o mașină virtuală , care ascund chiar și setul de instrucțiuni al procesorului . Aceasta este abordarea urmată de multe limbaje interpretate, cum ar fi AWK , și unele limbaje precum Java , care sunt menite a fi compilate într-un cod de reprezentare intermediar independent de mașină (cum ar fi codul de bytecode ). Acest aranjament simplifică sarcina de implementare a limbajului și adaptarea acestuia la diferite mașini și îmbunătățește eficiența caracteristicilor sofisticate ale limbajului, cum ar fi reflectarea . De asemenea, permite același program să fie executat pe orice mașină fără un pas explicit de recompilare, o caracteristică care a devenit foarte importantă de la proliferarea World Wide Web . Pentru a accelera execuția, unele sisteme de execuție dispun de compilare just-in-time la codul mașinii.

Un aspect modern al sistemelor de rulare este comportamentele de execuție paralelă, cum ar fi comportamentele prezentate de constructele mutex în Pthreads și construcțiile de secțiuni paralele în OpenMP . Un sistem de runtime cu astfel de comportamente de execuție paralelă poate fi modularizat în conformitate cu abordarea proto-runtime.

Istorie

Exemple timpurii notabile de sisteme de rulare sunt interpretii pentru BASIC și Lisp . Aceste medii includeau și un colector de gunoi . Forth este un prim exemplu de limbaj conceput pentru a fi compilat într-un cod de reprezentare intermediar; sistemul său de rulare era o mașină virtuală care interpreta acel cod. Un alt exemplu popular, dacă teoretic, este calculatorul MIX al lui Donald Knuth .

În limbajele C și ulterioare care au acceptat alocarea dinamică a memoriei, sistemul de rulare a inclus și o bibliotecă care gestiona grupul de memorie al programului.

În limbajele de programare orientate obiect , sistemul de execuție a fost adesea responsabil și pentru verificarea dinamică a tipului și rezolvarea referințelor metodelor.

Vezi si

Referințe

Lecturi suplimentare