
(Replica de mici dimensiuni a Small-Scale Experimental Machine (SSEM), primul calculator cu program de memorat din lume, aflat la Muzeul de Ştiinţă şi Industrie din Manchester, Anglia)
Caracteristica definitorie a computerelor moderne, care le distinge de toate celelalte mașini, este că acestea pot fi programate. Asta presupune că un anumit tip de instrucțiuni (program) poate fi implementat în calculator, care le va procesa. Calculatoare moderne, bazate pe arhitectura von Neumann, au adesea codul mașină în forma unui limbaj de programare imperativ.
În termeni practici, un program de calculator poate fi doar un set de instrucțiuni sau se poate extinde la mai multe milioane de instrucţiuni, la fel ca și programele pentru procesoare de texte și browsere web, de exemplu. Un computer tipic modern poate executa miliarde de instrucțiuni pe secundă (gigaflops), și rareori face o greșeală a lungul mai multor ani de funcționare. Programele de calculator mari compuse din mai multe milioane de instrucțiuni pot lua echipelor de programatori ani pentru a le scrie, și, ca urmare a complexității sarcinii, aproape sigur conțin erori.
Arhitectura programelor de memorat
Această secțiune se aplică la cele mai multe calculatoare bazate pe mașina RAM.
În cele mai multe cazuri, instrucțiunile de calculator sunt simple: se adaugă un număr la altul, se mută unele date de la o locație la alta, se trimite un mesaj la unele dispozitive externe, etc Aceste instrucțiuni sunt citite din memoria calculatorului și se realizează în general (execută) în ordinea în care s-au dat. Cu toate acestea, există, de obicei, instrucțiuni de specialitate pentru a spune calculatorului să sară înainte sau înapoi într-un alt loc în program și să continue executarea de acolo. Acestea sunt numite instrucțiuni de „salt”. Mai mult decât atât, instrucțiuni de salt pot fi făcute să se execute în mod condiționat, astfel că diferite secvențe de instrucțiuni pot fi utilizate în funcție de rezultatul unor calcule anterioare sau un eveniment extern. Multe computere sprijină direct subrutinele prin furnizarea unui tip de salt care „amintește” locul de la care acesta a sărit și o altă instrucțiune pentru a reveni la instrucțiunea următoare după instrucțiunea de salt.
Executarea programului ar putea fi asemănat cu a citi o carte. În timp ce o persoană va citi în mod normal, fiecare cuvânt și linie, în ordine, acestea pot sări uneori înapoi la un loc anterior în text sau poate sări capitole care nu sunt de interes. În mod similar, un calculator poate merge uneori înapoi și repeta instrucțiunile în unele secțiuni ale programului iar şi iar, până când unele condiții interne sunt îndeplinite. Aceasta se numește fluxul de control în cadrul programului și este ceea ce permite computerului să efectueze sarcini în mod repetat, fără intervenție umană.
Comparativ, o persoană care utilizează un calculator de buzunar poate efectua o operație aritmetică de bază cum ar fi adăugarea a două numere cu doar câteva apăsări pe buton. Dar, pentru a adăuga împreună toate numerele de la 1 la 1000 i-ar lua mii de apăsări pe buton și o mulțime de timp, şi cu certitudine aproape va face o greșeală. Pe de altă parte, un calculator poate fi programat pentru a face acest lucru cu doar câteva instrucțiuni simple. De exemplu:
mov No. 0, sum ; set sum to 0
mov No. 1, num ; set num to 1
loop: add num, sum ; add num to sum
add No. 1, num ; add 1 to num
cmp num, #1000 ; compare num to 1000
ble loop ; if num <= 1000, go back to ‘loop’
halt ; end of program. stop running
După ce s-a spus să ruleze acest program, computerul va îndeplini sarcina aditivă repetitivă fără intervenție umană mai departe. Aproape niciodată nu va face o greșeală, și un PC modern poate finaliza sarcina în aproximativ o milionime de secundă.
Cod mașină
În cele mai multe calculatoare, instrucțiunile individuale sunt stocate sub formă de cod mașină, fiecărei instrucțiuni atribuindu-i-se un număr unic (cod de operație sau opcod pe scurt). Comanda pentru a adăuga două numere împreună ar avea un opcode; comanda de a le multiplica ar avea un opcod diferit, și așa mai departe. Cele mai simple computere sunt capabile să efectueze oricare din câteva diferite instrucțiuni; calculatoarele mai complexe au câteva sute de instrucţiuni din care să aleagă, fiecare cu un cod numeric unic. Întrucât memoria calculatorului este capabilă să stocheze numere, se pot stoca, de asemenea, codurile de instruire. Aceasta conduce la faptul important că programe întregi (care sunt chiar listele cu aceste instrucțiuni) pot fi reprezentate ca liste de numere și pot fi manipulate în interiorul calculatorului în același mod ca datele numerice. Conceptul fundamental de a stoca programe în memoria calculatorului alături de datele pe care le operează e punctul cheie von Neumann, sau al arhitecturii programului de memorat. În unele cazuri, un calculator poate stoca unele sau toate programele sale în memorie care este ținută separat de datele cu care operează. Aceasta se numește arhitectura Harvard, după computerul Harvard Mark I. Calculatoare moderne von Neumann includ unele trăsături ale arhitecturii Harvard în proiectele lor, cum ar fi cache-ul CPU.
Deși este posibil să se scrie programe de calculator ca liste lungi de numere (limbaj mașină), această tehnică fiind folosită pe multe alte calculatoare timpurii, este extrem de obositor și potențial predispusă la erori în acest sens, în practică, în special pentru programele mai complicate. În schimb, fiecărei instrucțiuni de bază i se poate da un nume scurt care indică funcția sa și este ușor de ținut minte – un mnemonic, cum ar fi ADD, SUB, MULT sau JUMP. Aceste mnemonice sunt colectiv cunoscut sub numele de limbaj de asamblare al unui computer. Conversia programelor scrise în limbaj de asamblare în ceva ce computerul poate înțelege de fapt (limbaj mașină) se face de obicei de către un program de calculator numit de asamblare.

(O cartelă perforată din 1970 care conține o linie de la un program FORTRAN. Cartela spune:. „Z(1) = Y + W(1)” și este etichetată „PROJ039” pentru scopuri de identificare)
Limbaje de programare
Limbajele de programare oferă diferite moduri de a specifica programe pentru calculatoare pentru a le rula. Spre deosebire de limbajele naturale, limbajele de programare sunt concepute pentru a nu permite nicio ambiguitate, și să fie concise. Ele sunt limbaje doar scrise și sunt adesea dificil de citit cu voce tare. Ele sunt, în general, fie traduse în cod mașină de un compilator sau un asamblor înainte de a fi rulate, fie traduse direct în timpul rulării de către un interpretor. Uneori programele sunt executate printr-o metodă hibridă de cele două tehnici.
Limbaje de nivel inferior
Limbajele maşină și limbajele de asamblare care le reprezintă (denumite colectiv limbaje de programare de nivel inferior) tind să fie unice pentru un anumit tip de calculator. De exemplu, un calcul
ator cu arhitectura ARM (cum pot fi într-un PDA sau un joc video portabil) nu poate înțelege limba mașină a unui calculator cu Pentium Intel sau AMD Athlon 64, care s-ar putea găsi într-un PC.
Limbaje de nivel superior
Deși mult mai ușor decât în limbajul mașină, scrierea programelor lungi în limbaj de asamblare este adesea dificilă și este, de asemenea, predispusă la erori. Prin urmare, cele mai multe programe practice sunt scrise în limbaje de programare de nivel superior, mai abstracte, care sunt capabile să exprime nevoile programatorului mai convenabil (și prin aceasta contribuie la reducerea erorilor programatorului). Limbajele de nivel superior sunt, de obicei, „compilate” în limbaj mașină (sau, uneori, în limbaj de asamblare și apoi în limbaj mașină), folosind un alt program de calculator numit compilator. Limbajele de nivel superior sunt mai puțin legate de modul de funcționare al computerului țintă decât limbajele de asamblare, și mai mult legate de limbajul și structura problemei care trebuie soluționată de către programul final. Prin urmare, este adesea posibil să se utilizeze diferite compilatoare pentru a traduce același program de limbaj de nivel superior în limbajele mașină ale multor tipuri diferite de calculator. Aceasta este o parte din mijloacele prin care software-ul, ca jocurile video, pot fi puse la dispoziție pentru diferite arhitecturi de calculatoare, cum ar fi calculatoarele personale și diverse console de jocuri video.
Proiectarea programelor
Proiectarea programelor mici este relativ simplă și presupune analiza problemei, colectarea de intrări, elaborarea sau folosirea de proceduri și algoritmi stabilite, furnizarea de date pentru dispozitive și soluții de ieșire a problemei, după caz. Cu cât problemele devin mai mari și mai complexe, caracteristici cum ar fi subprograme, module, documentația formală, și noi paradigme precum programarea orientată pe obiecte, sunt mai des întâlnite. Programele mari care implică mii de linii de cod necesită metodologii formale de software. Sarcina de a dezvolta sisteme software de mari dimensiuni reprezintă o provocare intelectuală semnificativă. Crearea de software cu o fiabilitate acceptabil de mare într-un program și cu un buget previzibile s-a dovedit o sarcină dificilă. Disciplina academică și profesională de inginerie software se concentrează în mod special pe această provocare.
Buguri
(Primul bug(!) de calculator, o molie găsită prins pe un releu de calculator Harvard Mark II 🙂 )
Erorile în programele de calculator sunt numite „buguri”. Ele pot fi benigne și să nu afecteze utilitatea programului, sau pot să aibă numai efecte nesesizabile. Dar, în unele cazuri, acestea pot cauza „oprirea” programului sau a întregului sistem, şi să nu mai raspundă la intrări precum mouse-ul sau tastatura, acestea să pice complet, sau chiar să se distrugă. Bugurile benigne pot fi uneori exploatate cu rea intenție de către un utilizatorii lipsiţi de scrupule scriind un cod de exploit, conceput pentru a profita de un bug și a perturba rularea corespunzătoare a unui computer. Bugurile nu sunt, de obicei, din vina computerului. Deoarece computerele doar executa instrucțiunile pe care le primesc, bugurile sunt aproape întotdeauna rezultatul erorii programatorului sau a supravegherii efectuate în proiectarea programului.
Amiralul Grace Hopper, un om de ştiinţă informatician american și dezvoltator al primului compilator, este creditat că a folosit primul termenul de „bug”, în calcul, după o molie moartă care a fost găsită şi care a scurtcircuitat un releu în calculatorul Harvard Mark II în septembrie 1947.
Acest text este disponibil sub licența Creative Commons cu atribuire și distribuire în condiții identice
(Include text tradus din din Wikipedia)
Lasă un răspuns