Limbajul masina

4
Limbajul maşină Fiecare program, indiferent de limbajul în care a fost scris de către programator, ajunge să fie executat de (micro) procesor numai după ce a fost tradus (compilat) în singurul limbaj pe care îl “ştie” procesorul (şi deci calculatorul): limbajul său maşină. Dacă dăm spre execuţie la două calculatoare, unul cu procesor Intel şi celălalt cu procesor Motorola, un acelaşi program scris în C++, de fapt fiecare procesor va executa programul dat ca pe un şir de instrucţiuni în propriul său limbaj-maşină; aşadar, în momentul execuţiei, un acelaşi program va arăta diferit în calculatoare cu procesoare diferite. Limbajul-maşină conţine câteva zeci de instrucţiuni elementare, cele mai simple ce pot fi executate de procesor. Execuţia unei singure instrucţiuni scrisă într-un limbaj evoluat (C++, de exemplu) constă de fapt din execuţia unui şir de astfel de instrucţiuni elementare. O instrucţiune în limbaj-maşină poate indica procesorului: - să execute, prin intermediul Unităţii Aritmetice şi Logice, o operaţie aritmetică sau booleană asupra unei reprezentări de număr – întreg sau fracţionar – sau asupra unei valori de adevăr; - să transfere un şir de biţi dintr-o zonă a memoriei în alta; - să modifice ordinea de execuţie a instrucţiunilor memorate, eventual după verificarea unei condiţii logice. Acestea sunt operaţiile la nivelul limbajului maşină. Ele sunt acei atomi din care este alcătuit calculul, aşa cum îl “vede” procesorul. Felul în care sunt proiectate instrucţiunile limbajului-maşină – din punctul de vedere al circuitelor care le execută şi al structurii şirurilor de biţi pe care le prelucrează – constituie elementul fundamental de definire şi de proiectare a unui anumit procesor. Pornind de la aceste fundamente diferite, diverse procesoare ajung să execute în mod identic un acelaşi program, indiferent dacă este scris în C++, Java sau Pascal. De ce au fost inventate aceste noi limbaje, care constituie un nivel suplimentar faţă de limbajul-maşină? Descrisă în instrucţiuni ale limbajului-maşină, rezolvarea unei probleme poate fi dusă la capăt de procesor, dar este foarte greu de înţeles pentru om. Calculatoarele pot fi programate în limbaj-maşină de foarte puţini specialişti. Un prim pas în drumul calculatorului spre larga utilizare de azi l-a constituit tocmai creşterea numărului celor care îl puteau programa: au apărut limbaje mai apropiate de modul în care omul îşi reprezintă rezolvarea unei probleme; astfel de limbaje (primul a fost Fortran, în 1954) se numesc limbaje evoluate. Pentru ca, aşa cum aminteam, procesoare diferite să execute la fel un acelaşi program scris într-un limbaj evoluat este nevoie în primul rând ca fiecare calculator să posede, în software-ul său, un compilator 1 pentru limbajul evoluat şi, în al doilea 1 Un compilator este scris pentru un anume limbaj evoluat şi pentru un anume procesor. El traduce programe din acel limbaj evoluat în limbajul-maşină al

Transcript of Limbajul masina

Page 1: Limbajul masina

Limbajul maşină

Fiecare program, indiferent de limbajul în care a fost scris de către programator, ajunge să fie executat de (micro) procesor numai după ce a fost tradus (compilat) în singurul limbaj pe care îl “ştie” procesorul (şi deci calculatorul): limbajul său maşină. Dacă dăm spre execuţie la două calculatoare, unul cu procesor Intel şi celălalt cu procesor Motorola, un acelaşi program scris în C++, de fapt fiecare procesor va executa programul dat ca pe un şir de instrucţiuni în propriul său limbaj-maşină; aşadar, în momentul execuţiei, un acelaşi program va arăta diferit în calculatoare cu procesoare diferite.

Limbajul-maşină conţine câteva zeci de instrucţiuni elementare, cele mai simple ce pot fi executate de procesor. Execuţia unei singure instrucţiuni scrisă într-un limbaj evoluat (C++, de exemplu) constă de fapt din execuţia unui şir de astfel de instrucţiuni elementare.

O instrucţiune în limbaj-maşină poate indica procesorului:- să execute, prin intermediul Unităţii Aritmetice şi Logice, o operaţie aritmetică sau booleană asupra

unei reprezentări de număr – întreg sau fracţionar – sau asupra unei valori de adevăr;- să transfere un şir de biţi dintr-o zonă a memoriei în alta;- să modifice ordinea de execuţie a instrucţiunilor memorate, eventual după verificarea unei condiţii

logice.Acestea sunt operaţiile la nivelul limbajului maşină. Ele sunt acei atomi din care este alcătuit calculul,

aşa cum îl “vede” procesorul. Felul în care sunt proiectate instrucţiunile limbajului-maşină – din punctul de vedere al circuitelor care le execută şi al structurii şirurilor de biţi pe care le prelucrează – constituie elementul fundamental de definire şi de proiectare a unui anumit procesor.

Pornind de la aceste fundamente diferite, diverse procesoare ajung să execute în mod identic un acelaşi program, indiferent dacă este scris în C++, Java sau Pascal. De ce au fost inventate aceste noi limbaje, care constituie un nivel suplimentar faţă de limbajul-maşină? Descrisă în instrucţiuni ale limbajului-maşină, rezolvarea unei probleme poate fi dusă la capăt de procesor, dar este foarte greu de înţeles pentru om. Calculatoarele pot fi programate în limbaj-maşină de foarte puţini specialişti. Un prim pas în drumul calculatorului spre larga utilizare de azi l-a constituit tocmai creşterea numărului celor care îl puteau programa: au apărut limbaje mai apropiate de modul în care omul îşi reprezintă rezolvarea unei probleme; astfel de limbaje (primul a fost Fortran, în 1954) se numesc limbaje evoluate. Pentru ca, aşa cum aminteam, procesoare diferite să execute la fel un acelaşi program scris într-un limbaj evoluat este nevoie în primul rând ca fiecare calculator să posede, în software-ul său, un compilator1 pentru limbajul evoluat şi, în al doilea rând, este nevoie ca reprezentările datelor să fie standardizate pentru toate calculatoarele. Condiţia de standardizare ţine de arhitectura calculatoarelor: reprezentările interne ale datelor elementare (numere şi caractere) fac parte din arhitectura procesorului. Alegerea unei reprezentări înseamnă deciderea procedurii (standardului) de codificare / decodificare a datelor, inclusiv opţiunea privind lungimile pe care se reprezintă acestea. Spre exemplu, literele se pot reprezenta în toate calculatoarele folosind codul ASCII, care asociază unei litere un şir de opt biţi: litera “A” se reprezintă în ASCII ca “01000001”.

Execuţia programelor Toate datele existente în calculator sunt, la un moment dat, prelucrate sau sunt rezultatul unei

prelucrări:- datele numerice sunt supuse unor operaţii de tip aritmetic,- datele sub formă de text sunt prelucrate prin tehnoredactare,- cele reprezentând imagini sau sunete pot fi prelucrate pentru a îmbunătăţi calitatea audio-vizuală,- toate tipurile de date pot fi comprimate pentru a putea fi memorate într-un spaţiu mai mic,- “prelucrarea” instrucţiunilor – care, în calculatoarele neumanniene, sunt tot date – constă din

o traducerea lor în “limba-maternă” a calculatorului (limbajul-maşină),o adăugarea unor porţiuni de program des utilizate şi care se găsesc gata scrise undeva în

calculator şi, în fine,o execuţia lor.

1 Un compilator este scris pentru un anume limbaj evoluat şi pentru un anume procesor. El traduce programe din acel limbaj evoluat în limbajul-maşină al procesorului respectiv.

Page 2: Limbajul masina

Transformările pe care le suferă un program scris în limbaj evoluat până ajunge să poată fi executat.Cronologic, limbajul maşină, a fost primul limbaj de programare utilizat. Pornindu-se de la descrierea

semantică a algoritmului, programul cuprinde un şir finit de instrucţiuni, redactate sub forma unor secvenţe cu caractere binare. Aceasta comportă un efort foarte mare din partea programatorilor, şi în prezent este utilizată doar la programarea unor microprocesoare pentru automatele simple.         Prin intermediul compilatorului limbajului de programare, instrucţiunile sursă ale programului sunt analizate sintactic şi semantic şi sunt transformate în “program obiect”, care mai departe va fi convertit în “forma executabilă”, formă ce este memorată în memoria internă. 2.2.2. Evoluţia microprocesoarelor Intel 4004 a reprezentat prima realizare a unui întreg procesor prin integrare pe un singur cip (chip); Intel 8008 a fost primul microprocesor folosit ca unitate centrală de procesare într-un calculator. Din punctul de vedere al succesului comercial al microprocesoarelor, capul de serie a fost pentru Intel 8080 din 1974 – un microprocesor pe 8 biţi, cu frecvenţă a ceasului de 2 MHz şi care integra 6000 de tranzistoare pe un singur cip. Procesorul 80286 din 1982 lucra pe 16 biţi şi avea aproape 150000 de tranzistori, la o frecvenţă de 6 MHz. Pentium, lansat în 1993, ajunsese la 3 milioane de tranzistoare şi la frecvenţa de 60 MHz; procesorul lucra cu date pe 32 sau 64 de biţi. După Pentium II (1997) şi Pentium III (1999), în anul 2000 a apărut Pentium IV, având 42 de milioane de tranzistori şi o frecvenţă de 1500 MHz. Un indicator al vitezei de lucru a unui procesor este câte milioane de operaţii pe secundă se estimează că poate executa. Cum operaţiile efectuate variază mult de la un program la altul, iar tipuri diferite de operaţii au timpi diferiţi de execuţie, măsura aceasta nu este exactă şi depinde de aplicaţiile pentru care este folosit calculatorul. Cu caracter orientativ şi în scopul comparării performanţelor relative, se afirmă că 8080 efectua 640000 de operaţii pe secundă, 80286 ajunsese la 1 milion, primul Pentium la 100 de milioane, iar Pentium IV la aproape 1700 de milioane (spre comparaţie, primele calculatoare, realizate înainte de 1950, puteau efectua maximum 5000 de operaţii pe secundă). Dacă luăm în considerare şi frecvenţa ceasului, observăm că numărul estimat de operaţii pe secundă a crescut mai repede decât aceasta: de exemplu, primul Pentium putea efectua de 100 de ori mai multe operaţii decât 80286, neavând însă decât o frecvenţă de 10 ori mai mare. Creşterea suplimentară se explică nu prin tehnologie, ci prin ideile noi de arhitectură a calculatoarelor: pipeline şi paralelism. În acest fel, într-un singur ciclu al ceasului ajung să se efectueze două instrucţiuni, faţă de o instrucţiune la 15 cicluri ale ceasului, la procesorul 8088. De altfel, faţă de comparaţia 80286 – Pentium I, în interiorul familiei Pentium diferenţa dintre raportul frecvenţelor şi cel al numărului de instrucţiuni pe secundă s-a redus şi chiar inversat, ilustrând relativa stagnare din punctul de vedere al ideilor de arhitectură.2.2.3. Pentium

Anunţat în 1992 şi lansat în 1993, tipul de microprocesor Pentium este încă cel mai recent descendent al familiei Intel. Păstrând compatibilitatea cu cele patru generaţii anterioare de microprocesoare, inclusiv cu 8088, Pentium introduce ideea de procesare paralelă: având două căi identice de procesare a datelor, el poate executa simultan două intrucţiuni (pairing). Numită de Intel “arhitectură superscalară”, acest mod de execuţie ilustrează pentru prima dată funcţionarea paralelă la un procesor CISC (Complex Instruction Set Computer – calculator cu mulţime complexă de instrucţiuni)2. Simplificând, putem imagina un procesor Pentium ca integrând pe un singur cip două procesoare 486. Pentru a putea folosi întreaga putere oferită de Pentium, poate fi nevoie ca ordinea instrucţiunilor să fie modificată (compilatoare cu optimizarea codului), din cauza execuţiei în etape distincte a fiecărei instrucţiuni (pipeline).

Ajuns astăzi la o frecvenţă a ceasului de peste 3GHz (trei miliarde de tacturi pe secundă), magistrala de comunicare a datelor având peste 500 MHz, Pentium în versiunea IV reprezintă un important avans tehnologic – zeci de milioane de tranzistori pe un cip. Iată câteva idei de arhitectură ce cresc performanţele procesorului Pentium:

- tehnica pipeline (execuţia etapizată şi intercalată a instrucţiunilor);- memoria imediată (cache memory), caracterizată prin

o includerea în cipul-procesoro amânarea scrierii în memoria principală până la un moment de încărcare mai micăo un nivel suplimentar de memorie ce evită întârzierile în caz de eşec la accesul memoriei imediate)

- coprocesorul încorporat (idee apărută la ultimele versiuni de procesoare 486).În ultimii câţiva ani au apărut însă doar îmbunătăţiri strict tehnologice.

2 Funcţionarea paralelă este de obicei asociată unor arhitecturi RISC (Reduced Instruction Set Computer – calculator cu mulţime redusă de instrucţiuni). Ca şi la CISC, este vorba de numărul instrucţiunilor din limbajul maşină. În arhitectura RISC, orice instrucţiune-maşină CISC neinclusă în limbajul-maşină RISC se simulează printr-o secvenţă de instrucţiuni RISC. Păstrând puţine instrucţiuni (cele mai frecvent folosite), arhitecturile RISC sunt considerate ca dând procesoare mai rapide.