Limbaje de programare de nivel înalt și de nivel scăzut: pe care ar trebui să le înveți. Ce este un nivel de limbaj de programare

20.07.2019 Video

Oamenii mă întreabă uneori ce trebuie să înveți pentru a deveni programator. Întrebarea este oarecum naivă, pentru că... În opinia mea, este imposibil să răspund la asta în mod normal. Aceste. Mai întâi trebuie să-ți dai seama ce fel de programator trebuie să devii. Și oricum, ești programator? În plus, atât specialiștii înalt calificați, scumpi, cât și „forța de muncă” sunt solicitate pe piață. Pachetul de cunoștințe și experiență din primul și al doilea diferă într-o măsură semnificativă.

Dar, în ciuda atât de vag al întrebării, este încă posibil să se răspundă. Puteți descrie maximul aproximativ de cunoștințe care, într-un fel sau altul, se referă la programare. De fapt, ei se străduiesc de obicei să predea acest maxim în universități în specialități ale căror titluri includ cuvântul „programator”.

Am studiat să fiu programator la facultate, apoi la universitate. Universitatea a fost cea care a rezolvat înțelegerea și interconectarea disciplinelor legate de așa-numitele științe informatice. Chiar dacă cunoștințele pe care le-au dat acolo erau înguste la minte și puțin depășite, au avut o abordare sistematică bună. După ani de practică după absolvire, am ajuns la concluzia că clasificarea universitară a disciplinelor este destul de bună și ne permite să răspundem la întrebarea ce ar trebui să știe orice programator.

Desigur, este imposibil să știi totul. Și nu este necesar. În plus, unele întrebări trebuie să fie cunoscute în profunzime, în timp ce altele necesită o înțelegere superficială de ansamblu. Prin urmare, în funcție de specializare, unele discipline sunt mai relevante, altele mai puțin. Dar cunoștințele generale de bază sunt necesare pentru aproape toate pentru orice inginer software, de la un inginer de sisteme la un dezvoltator web.

În paragraful anterior, am introdus în mod deliberat termenul „inginer software”. Cumva, se dovedește că un programator nu este neapărat un inginer. Chiar și din definiția Wikipedia rezultă că un inginer este în primul rând un designer. Acesta este cel care creează, adică. proiectează sisteme. Dar în practica de programare, designul nu este întotdeauna necesar. Uneori este suficientă codificarea: folosirea acest set tehnologii, pentru a crea ceva care funcționează. Un exemplu tipic este o turmă de site-uri corporative sau de marketing pe Joomla, WordPress, Drupal etc. Acesta este nivelul unui tehnician, nu al unui inginer. Acesta este nivelul de învățământ secundar. Și puteți lucra ca tehnician chiar și după finalizarea cursurilor în orice limbaj de programare, nu este necesară o bază teoretică puternică.

Și, revenind la inginerii de software, vreau să ofer graficul meu al disciplinelor pe care programatorii le studiază. Este evident că unele discipline folosesc în mod activ cunoștințele altora sau chiar cresc din altele. În consecință pentru înţelegere deplină Subiectul „superior”, este necesar un anumit nivel de înțelegere a celui inferior.

Graficul este format din subiecte (discipline) și este împărțit pe nivele. Cel mai jos - Baza generală - nu are nimic de-a face cu informatica. Este dat doar pentru a arăta pe ce se bazează disciplinele de informatică.

Există 2 tipuri de conexiuni între discipline: utilizare(săgeată regulată) și extensie(contur săgeată). Utilizarea implică nevoia de cunoaștere fragmentară a unui alt subiect, iar extinderea implică nevoia de cel puțin o privire de ansamblu, dar cunoștințe complete disciplina extensibilă.

Primul nivel de la CS (informatica) - Baza speciala . Acesta este punctul de plecare pentru orice programator pe patru fronturi:

    bazele aritmetice ale calculatoarelor(sisteme numerice și operații cu numere, operații logice);

    bazele fizice ale calculatoarelor(conductori, tranzistori, elemente logice, circuite, circuite integrate);

    teoria algoritmilor(algoritmi și structuri de date; complexitate, eficiență; metode de reprezentare a informațiilor în memorie);

    (Arhitectura sistemului de operare, procese, comunicare interprocese, fire de execuție, planificare, lucru cu memorie și periferice, sisteme POSIX);

    analiza sistemului(domeniu, procese de afaceri, fluxuri, diagrame, principii și teoria analizei sistemului);

    baze de date(teoria seturilor, tipuri de SGBD, SGBD relațional, modele de date, SQL, baze de date specifice).

Următorul nivel - Nivelul 2 - îl dezvoltă pe precedentul. Apropo, am intrat în ea doar pentru că pentru a le studia este de dorit (dar nu necesar) să stăpânim mai întâi sistemele de operare. Din punct de vedere al dezvoltării, acest subiect este încă mai aproape de primul nivel.

Nivelul 2 include:

    dezvoltare software (ciclu de viață Software, etapele de dezvoltare, elementele de bază ale rulării proiectelor software, instrumente);

    analiza datelor(Data Mining, OLAP, învățare automată, rețele neuronale, AI);

    rețele de calculatoare(după niveluri de stive TCP/IP și/sau ISO/OSI „de la și către”, protocoale, programare de rețea în C/C++);

    limbaje de programare a codurilor gestionate(cod gestionat, mașini virtuale, colectoare de gunoi, testare unitară, practică efectivă în C# sau Java);

Nivelul 3 - ultimul nivel pentru programatorul mediu. Este cel mai voluminos și include doar acele discipline care au legătură directă cu dezvoltarea de software. Au fost 6 în total:

    Dezvoltarea interfeței de utilizare și a gradului de utilizare(principii de proiectare a interfețelor utilizator);

    managementul echipei și al proiectelor(metodologii de dezvoltare și alte probleme de management);

    testarea software-ului(prezentare generală: tipuri de testare, instrumente);

    tehnologii web(protocol HTTP, server web, CGI, caching și proxy, programare client);

    sisteme distribuite(arhitecturi ale sistemelor distribuite, protocoale pentru interacțiunea în rețea a componentelor, instrumente, principii, abordări ale construirii sistemelor distribuite, toleranță la erori, date mari, sarcini mari);

    limbaje de programare interpretate(funcții, elemente de bază în două sau trei limbi, practică în una sau două limbi: JS, PHP, Python, Ruby).

Tot ce este mai sus este extins Expertiza . În general, acest nivel poate fi extins la nesfârșit, adăugând discipline adiacente dezvoltării și aspectelor cele mai complexe ale dezvoltării software. Am dat 3 exemple - dezvoltarea compilatoarelor, dezvoltarea sistemelor de operare și construcția de arhitecturi pentru sisteme software și hardware mari, sau arhitecturi concepute pentru sarcini deosebit de mari. Dependente la niveluri inferioare Nu l-am desenat pe grafic pentru că vor fi prea multe săgeți care trec prin toate nivelurile, până la baza comună. Probabil, dependențele largi sunt unul dintre semnele întrebărilor de natură expertă. Acest lucru confirmă doar că nivelul de expert necesită cele mai ample cunoștințe și experiență bună.

Lucrul interesant despre grafic este că nu arată doar ordinea preferată a subiectelor de studiu, ci și:

    face posibilă înțelegerea care sunt disciplinele necesare mai mult și care sunt mai puțin pentru a lucra într-o anumită specializare (pur și simplu selectați subiectul principal de specializare și priviți conexiunile și distanța față de ceilalți);

    oferă o înțelegere a modului de a studia informatica dacă începeți nu cu elementele fundamentale, ci cu cunoștințe aplicate (de exemplu, PHP) - vă puteți deplasa de-a lungul conexiunilor în lateral și în jos - de fapt, aceasta este exact calea mea personală de dezvoltare a fost (și nu pot să-l numesc cel mai ușor, mai eficient și optim).

Graficul este un model. O model bun De regulă, oferă răspunsuri la multe întrebări simultan. Mi-am propus sarcina de a face buna numaratoare, aproape de realitate. Normal că se bazează pe a mea experiență personalăși nu se preface a fi ideal. Am încercat să o fac cât mai obiectivă. Și vă reamintesc încă o dată că acesta este un grafic pentru un programator. Aceste. pentru un tester, administrator de sistem și alte profesii apropiate de programare, va fi mai mult sau mai puțin apropiat, dar clar diferit.

Se numesc limbaje de programare care sunt orientate spre comenzile procesorului și iau în considerare caracteristicile acestuia limbi de nivel scăzut. „Nivel scăzut” nu înseamnă rău sau nedezvoltat, înseamnă că operatorii acestui limbaj sunt aproape de nivelul hardware, codul mașinii este concentrat pe comenzile unui anumit tip de procesor. Codul mașinii a fost folosit ca limbaj de programare în prima generație de mașini.

Limba de cel mai jos nivel este asamblator. Programul de pe el reprezintă o secvență de comenzi de cod de mașină, dar scrise folosind mnemonici simbolice. Cu ajutorul limbajelor de nivel scăzut, sunt create programe compacte, optime, deoarece programatorul are acces la toate capacitățile procesorului. Pe de altă parte, acest lucru necesită o bună înțelegere a structurii computerului, iar utilizarea unui astfel de program pe un computer cu un alt tip de procesor este imposibilă. Astfel de limbaje de programare sunt folosite pentru a scrie aplicații de sistem mici, drivere de dispozitiv și module pentru andocare cu echipamente non-standard, atunci când compactitatea, performanța și accesul direct la resursele hardware sunt mai importante.

Limbajele de programare care imită limbajele naturale, au comenzi mari și sunt „orientate spre om” sunt numite limbi de nivel înalt. Caracteristici specifice arhitecturi de calculatoare nu sunt luate în considerare. Cu cât nivelul limbajului este mai ridicat, cu atât structurile de date și construcțiile utilizate în program sunt mai apropiate de conceptele naturale ale sarcinii originale.

Astfel, limbajele de programare de nivel înalt sunt concentrate pe rezolvarea conținutului mare probleme aplicate. Este mult mai ușor să dezvoltați programe în limbaje de nivel înalt folosind comenzi clare și puternice, iar numărul de erori făcute în timpul procesului de programare este mult mai mic.

Folosind un limbaj de programare, un program nu este creat gata de execuție, ci doar textul său (se numește cod sursă - cod sursă), descriind algoritmul dezvoltat. Codurile sursă ale programelor sunt ușor de portat pe alte platforme pentru care sunt dezvoltate. traducători a acestei limbi. Traducătorii (programele care traduc codul sursă în cod mașină) sunt de două tipuri principale: compilatori și interpreți.

Compilator procesează complet întregul text al programului: căutări erori de sintaxă, efectuează o analiză semantică și numai atunci, dacă textul programului respectă întocmai regulile limbii, este tradus (tradus) automat în limbajul mașinii în cod gata de executat (fișier EXE), care poate rula sub sistemul de operare . Poate fi transferat pe alte computere cu un procesor care acceptă codul de mașină corespunzător.

Interpret preia următoarea instrucțiune de limbă din textul programului, îi analizează structura și apoi o execută imediat. După executarea cu succes a comenzii curente, interpretul continuă să analizeze și să execute următoarea. Dacă aceeași instrucțiune este executată de mai multe ori într-un program, interpretul o tratează de fiecare dată ca și cum ar fi fost întâlnită pentru prima dată. Prin urmare, programele care necesită o cantitate mare de calcule repetitive vor rula lent. În plus, pentru a rula programul pe un alt computer, trebuie instalat și un interpret, deoarece fără el programul nu va funcționa.

Principalul dezavantaj al compilatoarelor este laboriositatea traducerii limbajelor de programare axate pe prelucrarea datelor dintr-o structură complexă, necunoscută în prealabil sau care se schimbă dinamic în timpul funcționării programului. Pentru astfel de programe, în codul mașinii sunt introduse verificări și analize suplimentare privind disponibilitatea resurselor sistemului de operare, precum și mijloace pentru capturarea și eliberarea dinamică a memoriei computerului, care este destul de dificil de implementat la nivelul instrucțiunilor mașinii specificate static și pentru unele sarcini este aproape imposibil.

Folosind un interpret, dimpotrivă, pentru a examina conținutul memoriei, este posibil să întrerupeți programul în orice moment, să organizați un dialog cu utilizatorul, să efectuați orice transformări complexe de date și, în același timp, să monitorizați constant software-ul și hardware-ul mediu, care asigură o fiabilitate ridicată a programului. La executarea fiecărei comenzi, interpretul verifică și analizează resursele necesare sistemului de operare, iar dacă apar probleme, emite mesaje de eroare.

Cum să se dezvolte tehnologie informatică nu sta pe loc, iar metodele și limbajele de programare sunt îmbunătățite în mod constant. Să luăm în considerare ce limbi există în domeniul computerelor moderne și clasificarea lor.

Informații generale

Lista limbajelor de programare este atât de largă și diversă, încât aranjarea completă a acesteia este o sarcină aproape imposibilă. Dintre toate limbile, se pot distinge trei subgrupuri principale:

  • mașină (limbaje de programare de nivel scăzut);
  • orientat pe mașină (asambleri);
  • independent de mașină (nivel înalt);

Printre dezvoltatorii modern software Cele mai populare sunt următoarele limbaje de programare majore. Lista este dată în ordinea descrescătoare a popularității:

  1. Java.
  2. HTML.
  3. Visual Basic.
  4. Delphi.

Această listă de limbaje de programare este departe de a fi completă, dar acestea sunt cele mai populare limbaje, a căror cunoaștere poate fi cerută unui programator atunci când aplică pentru un loc de muncă. Toate sunt limbaje de programare de nivel înalt.

Bazele programarii

Limbajele de programare de nivel scăzut sunt acele limbaje care necesită luarea în considerare a tipului și capacităților procesorului. Operatorii și metodele de operare ale unor astfel de limbaje de programare sunt destul de apropiate de codul mașinii, necesită cunoștințe despre dispozitivul de memorie computer personalși cum îl accesează procesorul.

Este dificil de a numi diferitele limbaje de programare de nivel scăzut. Lista se va reduce în continuare la o singură limbă dominantă - limbajul de asamblare. Deoarece vă permite să compuneți coduri de program în notații apropiate de codul mașinii, asamblatorul este utilizat exclusiv la scrierea software-ului de sistem, cum ar fi sisteme de operare, drivere de dispozitiv și la programarea codurilor de control ale microcircuitelor.

Dezavantajul unor astfel de limbaje de programare este că programele din ele sunt scrise pentru a îndeplini sarcini specifice, dispozitiv specific iar executarea lor este imposibilă dacă sunt transferate la alt procesor.

Dezvoltarea aplicațiilor

Lista limbajelor de programare de creat aplicații personalizate, precum și pentru dezvoltarea și implementarea de software personalizat, are mii de posturi. După cum înțelegeți, o astfel de diversitate se datorează faptului că o anumită limbă este potrivită pentru rezolvarea anumitor probleme.

Deși aceste limbaje de programare sunt clasificate ca un grup separat, ele sunt executate în codul mașinii. A performa program terminat rând cu rând și traducerea lui în programe speciale – interpreți. Dacă traducerea codul programului Când se transferă dintr-o limbă în alta fără a executa comenzi, programele de compilare fac acest lucru. ÎN caz general programele concepute pentru a traduce programe scrise dintr-un limbaj de programare formal în altul se numesc traducători.

Să aruncăm o privire mai atentă asupra limbajelor de programare de nivel înalt. Nu vom face o listă, vom scrie doar puțin mai detaliat despre fiecare dintre cele mai populare.

SQL

Un limbaj de programare specializat este destinat în primul rând lucrului cu sistemele de gestionare a bazelor de date și programarea acestora. SQL se traduce prin „specializat” Deoarece piața DBMS a crescut exponențial în ultimele decenii, popularitatea acestui limbaj nu este o surpriză.

Există opinii diferite cu privire la viitorul acestei limbi. Se crede cu siguranță că tehnologia de creare a bazelor de date relaționale a fost la cel mai bun moment, dar timpul i se scurge. Nevoia de dezvoltare în legătură cu volumele tot mai mari de date prelucrate îi conduce pe experți la ideea că în viitor umanitatea are nevoie pur și simplu de o tranziție de la tehnologiile relaționale la cele post-relaționale, ținând însă cont de menținerea compatibilității cu băncile de date existente.

Javascript

Pe bună dreptate, se află pe locul al doilea în rândul limbajelor de programare de nivel înalt. Ușor de învățat, convenabil de utilizat. Adaptabilitatea crescută la programare în comparație cu progenitorul său duce la faptul că milioane de oameni din întreaga lume lucrează cu acest limbaj. Un limbaj orientat pe obiecte bazat pe C++, adaptat pentru a crea programe și aplicații capabile să prelucreze fluxuri uriașe de informații în medii specializate și ținând cont de specificul mediului de implementare a produsului finit.

Tehnologia Java este baza care permite extinderea nelimitată a infrastructurii întreprinderilor și companiilor, capabile să conecteze între ele sisteme de diferite calibre, de la conectarea la o rețea telefonică prin Wi-Fi până la supercomputere.

XML

Descendentă a HTML, această tehnologie este un limbaj de marcare extensibil. Este adaptat pentru interpretarea documentelor. Efectuează transformări complexe și modificări ale documentelor. XML este folosit pentru a transfera și stoca temporar date atunci când lucrați cu diverse baze de date relaționale prin Internet.

XML a atins deja punctul în care poate pretinde că este tehnologia de bază pentru construirea rețelelor corporative.

Programare în limba rusă

Cele mai populare limbaje de programare folosesc vocabularul englezesc. Cu toate acestea, pe lângă ele, există și limbaje de programare ruse. Lista în limba rusă este mică, iar domeniul în care sunt folosite este foarte specializat. Să dăm câteva exemple.

  • 1C: Întreprindere. Un întreg sistem conceput pentru a gestiona o organizație în toate domeniile de activitate. Puteți găsi adesea „Programator 1C” în anunțurile de angajare.
  • Verb. Un analog al Pascal în limba engleză.
  • Robik. Un limbaj de programare specializat conceput pentru a învăța copiii noțiunile de bază ale programării.
  • Spadă. Un limbaj bazat pe proceduri.

După cum puteți vedea, lista limbajelor de programare este atât de largă și variată încât nu poate fi acoperită de nicio clasificare sau liste. Dacă te hotărăști să te apuci de programare la nivel amator sau profesional, atunci amintește-ți că un programator este o profesie creativă care necesită nu numai cunoștințe, ci și fantezie, imaginație, intuiție și chiar puțin noroc.

Limbajul de programare – una dintre modalitățile de a scrie algoritmi; un set de simboluri de sistem, reguli pentru formarea și interpretarea construcțiilor din simboluri pentru specificarea algoritmilor folosind simboluri în limbaj natural.

Un procesor de calculator este un circuit integrat mare. Primește toate comenzile și datele sub formă de semnale electrice, dar pot fi reprezentate și ca o colecție de zerouri și unu, adică numere. Prin urmare, în realitate, programul cu care lucrează procesorul este o secvență de numere numite codul mașinii .

Scrierea unui program în codul mașinii este destul de dificilă, iar complexitatea lucrării crește disproporționat cu dimensiunea programului. În mod convențional, putem presupune că codul de mașină este acceptabil dacă dimensiunea programului nu depășește câteva zeci de octeți și nu este nevoie de operații manuale de introducere și ieșire a datelor. Această situație apare, de exemplu, la programarea automatelor simple.

Mai mult programe complexe creat folosind așa-numitele limbaje de programare. Teoretic, un program poate fi scris folosind limbajul uman obișnuit - aceasta se numește programare într-un metalimbaj, dar nu este încă posibilă traducerea automată a limbajului uman obișnuit în codul mașinii. Traducerea este efectuată de special utilitati, numit radiodifuzorii, iar traducătorii capabili să traducă limbajul uman obișnuit în codul mașinii nu există încă (din cauza ambiguității ridicate a limbajului natural).

limbaje de programare – limbaje artificiale. Ele diferă de limbile umane naturale într-un număr mic de cuvinte, al căror sens este clar pentru traducător (aceste cuvinte sunt numite cheie), și cerințe destul de stricte pentru forma operatorilor de înregistrare (totalitatea acestor formulare de cerințe gramaticăŞi sintaxă limbaj de programare). Încălcările formularului de înregistrare fac ca traducătorul să nu poată efectua corect traducerea și să afișeze un mesaj de eroare.

Ce este nevoie pentru a „crea un limbaj de programare”?

La prima vedere, pentru a face acest lucru, este necesar să se determine ce instrucțiuni pot fi folosite în ea (se numesc operatori), aprobă cu strictețe lista de cuvinte cheie care pot fi utilizate și dezvoltă reguli de scriere a fiecărui operator (reguli de sintaxă). Cu toate acestea, acest lucru nu este suficient. Aceasta este doar o idee a unui limbaj de programare. Pentru ca acesta să aibă aplicație practică, trebuie dezvoltat un program care să poată difuza text scris în conformitate cu toate regulile a acestei limbiîn codul mașinii, adică creați un traducător. Astfel, traducătorul reprezintă o implementare specifică a ideii de limbaj de programare.

Pe baza principiului de funcționare, există două tipuri de traducători: compilatoareŞi interpreți. În consecință, se pot distinge două clase de limbaje de programare: compilateŞi interpretabil .

Difuzarea este traducere. Dacă ne uităm la modul în care lucrează traducătorii din limbi străine, vom vedea și că există două abordări: traducerea simultană și traducerea textului.

Un traducător simultan „prinde” fraza pe care o aude și o traduce cât mai aproape de sens posibil. În momentul traducerii, el nu știe ce frază va urma în continuare și nu are timp să ia în considerare frazele exprimate mai devreme. Este ca și cum ar lucra cu o anumită frază la un moment dat. Pentru a traduce orice concepte specifice, el trebuie să construiască structuri întregi. Expresiile de traducere simultană sunt de obicei mai lungi decât originalul și lipsesc de grație.

Un traducător literar va citi mai întâi întregul text pentru a fi tradus de mai multe ori. El va găsi în avans toate locurile care sunt deosebit de greu de tradus, va construi structurile necesare și le va folosi ori de câte ori va fi nevoie. Atunci când traduce o anumită frază, traducătorul trebuie să țină cont de caracteristicile întregii cărți în ansamblu și chiar de caracteristicile altor lucrări ale aceluiași autor.

Interpreți lucrează ca interpreți simultani. Ei iau o declarație dintr-un program, o traduc în codul mașinii (sau un cod intermediar apropiat de codul mașinii) și o execută. Dacă un anumit operator este folosit în mod repetat într-un program, interpretul îl va traduce fidel de fiecare dată, ca și cum ar fi întâlnit pentru prima dată.

Compilatoare procesează programul în mai multe etape. În primul rând, ei revizuiesc textul sursă (numit de obicei cod sursă) de mai multe ori, găsesc zone comune, verifică erori de sintaxă și contradicții interne și abia apoi traduc textul în codul mașinii. Rezultatul este un program compact și eficient.

Dacă un program este scris într-un limbaj de programare interpretat, atunci acesta poate fi executat doar pe computerul pe care va fi instalat anterior interpretul, deoarece acesta trebuie să participe la execuția programului. Programele scrise în limbaje de programare compilate nu au nevoie de intermediari - după compilare, este deja obținut codul mașinii, care conține tot ceea ce este necesar pentru ca procesorul să funcționeze. Prin urmare, astfel de programe funcționează pe orice computer și o fac de sute de ori mai repede. Acesta este avantajul limbajelor de programare compilate.

Totuși, programele scrise în limbaje de programare interpretate au un alt avantaj. Deoarece le putem executa numai sub controlul interpretului, putem, în consecință, să oprim programul în orice moment, să ne uităm la declarațiile sale, să facem modificările necesare, să-l pornim din nou etc. Conținutul programului este deschis utilizatorului. Pentru programele compilate este aproape imposibil să faci toate acestea. După compilarea unui program, textul său sursă rămâne doar la autor. Toți ceilalți utilizatori primesc cod de mașină care poate fi executat, dar practic nu poate fi văzut sau modificat. Deși teoretic acest lucru se poate face, necesită o cantitate imensă de timp, disponibilitate programe specialeși un nivel ridicat de cunoștințe și experiență.

Există două niveluri de limbaje de programare: limbi de nivel scăzutŞi limbi de nivel înalt .

Limbajul de programare de nivel scăzut este un limbaj de programare creat pentru a fi utilizat cu un tip special de procesor și ținând cont de caracteristicile acestuia. În acest caz, „nivel scăzut” nu înseamnă „rău”. Aceasta înseamnă că limbajul este aproape de codul mașinii (vă permite să implementați direct unele comenzi ale procesorului).

Limbile de nivel scăzut seamănă puțin cu limbajul normal, familiar. Programele mari și alfabetizate sunt rareori scrise în astfel de limbi. Dar dacă programul este scris într-o astfel de limbă, atunci va funcționa rapid, va ocupa o cantitate mică de spațiu și va permite un număr minim de erori. Cu cât limbajul este mai jos și mai aproape de nivelul mașinii, cu atât sarcinile care sunt atribuite fiecărei echipe sunt mai mici și mai specifice.

Pentru fiecare tip de procesor, cel mai scăzut nivel este limba asamblator, care vă permite să reprezentați codul mașinii nu ca numere, ci ca simboluri, numite mnemonice. Fiecare tip de procesor are propriul limbaj de asamblare; poate fi considerată în acelaşi timp cu formă specială comenzile mașinii de înregistrare și ca limbaj de programare de cel mai scăzut nivel.

Avantajul limbilor de nivel scăzut este că ajută la crearea cel mai mult programe eficiente(scurt și rapid). Dezavantajul unor astfel de limbaje este că sunt dificil de învățat din cauza necesității de a înțelege structura procesorului și că un program creat într-un astfel de limbaj nu este aplicabil altor tipuri de procesoare.

Limbaje de programare la nivel înalt vizibil mai ușor de învățat și utilizat. Programele scrise cu ajutorul lor pot fi folosite pe orice platformă de calculator, cu condiția să existe un traducător pentru limba dată. Aceste limbi nu iau în considerare deloc proprietățile unui anumit procesor și nu oferă mijloace directe pentru accesarea acestuia. În unele cazuri, acest lucru limitează capacitățile programatorilor, dar lasă și mai puțin loc pentru greșeli.

Limbile de nivel înalt sunt mai orientate spre om; Comenzile acestor limbi sunt cuvinte englezești care pot fi citite de om. Cu cât nivelul limbajului este mai mare, cu atât trebuie efectuate mai multe operații pentru a executa comanda necesară.

Odată cu apariția limbajelor de nivel înalt, programatorii au putut să aloce mai mult timp rezolvării unei anumite probleme, fără a fi distrași în special de problemele foarte subtile de organizare a procesului de executare a unei sarcini pe o mașină. În plus, apariția acestor limbi a marcat primul pas către crearea de programe care au depășit limitele laboratoarelor de cercetare și departamentelor financiare.

Avantajele limbajelor de programare de nivel înalt :

· alfabetul limbajului este mult mai larg decât cel al mașinii, ceea ce îl face mult mai expresiv și crește semnificativ claritatea și înțelegerea textului;

Care sunt diferitele limbaje de programare? Ce fel de concepte sunt încorporate în ele? Cum s-au dezvoltat? În acest articol, vom lua în considerare tipurile de limbaje de programare bazate pe așa-numitele niveluri - de la coduri de mașină (nivel scăzut, aproape de hardware-ul computerului) până la limbaje precum Java sau C# (nivel înalt). Cu cât listarea de text a programului suferă mai puține transformări pe parcursul transformării într-un set de zerouri și unu, cu atât nivelul este mai scăzut. În continuare ne vom uita la:
  1. Limbi de nivel scăzut (coduri de mașină și asamblare)
  2. Intermediar (C, Fortran….)
  3. Nivel înalt(C++, Java, Python, Ruby, JavaScript...)
Nivelul caracterizează, de asemenea, cât de multe detalii trebuie să fie detaliată lista viitorului program pentru implementarea implementării. Cât de simplu este acest proces pentru oameni? Nivelul unei limbi nu trebuie considerat un indicator clar al capacităţilor sale. Un limbaj de programare este un instrument care este eficient într-un domeniu și mai puțin util în altele. Atat tamplarul cat si tamplarul lucreaza cu lemnul. Primul are un instrument principal - un set de dalte, al doilea - un topor. Cu toate acestea, un dulgher va face un dulap sculptat mai elegant, iar un tâmplar va construi o casă mai repede. Deși fiecare este capabil să facă treaba celuilalt, o va face mult mai puțin eficient. Diverse date dintr-un computer sunt reprezentate ca seturi de zerouri și unu. Comenzile de control pentru prelucrarea acesteia sunt aceleași date care conțin instrucțiuni care determină locația informațiilor necesare și metoda de modificare.

Limbaje mașini (nivelul cel mai scăzut)

Va trebui să facem o scurtă vizită din zona Software în zona Hardware. Să ne uităm la asta într-o formă simplificată. CPU– „creierul” principal al computerului. Placa de baza, pe care este instalat, conține controlere care servesc la interacțiunea cu alte dispozitive prin intermediul magistralelor (canale de date pentru comunicare).

Unii lucrează cu de mare viteză(săgeți roșii): procesorul extrage comenzi din memorie și manipulează datele, mai ales în jocurile 3D, consumă cantități uriașe de texturi, forme, coordonate pixeli și alte obiecte pentru a construi o imagine pe ecranul monitorului. Alții (din cauza limitărilor în viteza schimbului de informații) nu au nevoie de indicatori atât de înalți. Diverse interne și dispozitive externe sunt conectate în diagramă cu săgeți verzi.

Lumea interioară a procesorului

Toate instrucțiunile procesorului provin din memorie pentru a fi executate binar. Formatul, numărul, subsetul de instrucțiuni depind de arhitectura acestuia. Majoritatea sunt incompatibile între ele și urmează ideologii diferite. Și, de asemenea, tipul de comandă depinde foarte mult de modul (8/16/32... adâncime de biți) și sursa de date (memorie, registru, stivă...) cu care funcționează procesorul. Aceeași acțiune poate fi reprezentată diverse instructiuni. Procesorul are instrucțiuni pentru adăugarea a doi operanzi (ADD X,Y) și adăugarea unuia la cel specificat (INC X). Adăugarea unui triplu la un operand se poate face cu ADD X,3 sau apelând INC X de trei ori diferite procesoare, este imposibil de prezis care dintre aceste metode va fi optimă în ceea ce privește viteza sau amprenta memoriei. Pentru comoditate, informațiile binare sunt scrise în formă hexazecimală. Să luăm în considerare o parte dintr-un program familiar (limbaj C, a cărui sintaxă este similară cu Java) int func () ( int i = getData ("7") ; return ++ i; . . . ) Cod care implementează aceleași acțiuni ca o secvență de instrucțiuni pentru procesor: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... Așa arată de fapt limbajul de programare de nivel scăzut pentru procesor intel. Un fragment care apelează o metodă cu un argument și returnează rezultatul incrementat cu unu. Acesta este limbajul mașinii (codul), care este transferat direct, fără transformare, procesorului pentru execuție. Pro:
  • Suntem complet stăpâni pe situație, avem cele mai largi posibilități de utilizare a procesorului și hardware-ului computerului.
  • Toate opțiunile de organizare și optimizare a codului ne sunt disponibile.
Contra:
  • Este necesar să aveți cunoștințe extinse despre funcționarea procesoarelor și să luați în considerare număr mare factori hardware la executarea codului.
  • Crearea de programe care sunt puțin mai complexe decât exemplul dat duce la o creștere bruscă a timpului petrecut pentru scrierea codului și depanarea acestuia.
  • Dependența de platformă: un program creat pentru un procesor nu va funcționa în general pe alții. Poate pentru a acestui procesor, în alte moduri de funcționare a acestuia, va fi necesară editarea codului.
Codurile mașinilor au fost utilizate pe scară largă în zorii computerelor, nu existau alte metode de programare în epoca pionierilor informatici. ÎN timp dat sunt folosite ocazional de inginerii în microelectronică atunci când dezvoltă sau testează la nivel scăzut al procesoarelor.

Limbaj de asamblare (nivel scăzut)

Spre deosebire de un computer, tu și cu mine percepem informațiile mai bine în formă text/semantică decât în ​​formă digitală. Puteți numi cu ușurință cincizeci de nume de contacte pe smartphone-ul dvs., dar este puțin probabil să puteți scrie numerele de telefon corespunzătoare acestora pe de rost. Este la fel cu programarea. Urcăm scara de tip făcând trei pași de bază:
  • Să asociem o instrucțiune simbolică cu grupuri de instrucțiuni de procesor digital care efectuează acțiuni corespunzătoare.
  • Să evidențiem separat argumentele instrucțiunilor procesorului.
  • Să introducem capacitatea de a numi zonele de memorie, variabilele și locația comenzilor individuale.
Să comparăm fragmente din programul anterior în codul mașinii (centru) și în limbajul de asamblare (dreapta): 2004 b0 48 83 ec 08 sub $0x8, % rsp 2004 b4 bf bc 05 20 00 mov $0x2005bc, % edi 3104 c bc xor % eax, % eax 2004 bb e8 e8 fe ff ff callq getData 2004 c0 48 83 c4 08 add $0x8 , % rsp 2004 c4 83 c0 01 add $0x1 , % eax După cum puteți vedea, un program are procesul de scriere a fost simplificat: nu este nevoie să folosiți cărți de referință pentru generarea valorilor digitale de comandă, calcularea lungimii de tranziție, distribuția datelor în memorie între celulele sale și alte caracteristici ale procesorului. Descriem acțiunea necesară dintr-un set de comenzi simbolice și argumentele necesare logicii de execuție, iar apoi programul translator traduce fișier textîntr-un set de zerouri și unuri care poate fi citit de procesor. Pro:
  • Procesul de scriere și modificare a codului a fost simplificat.
  • Controlul asupra tuturor resurselor hardware a fost menținut.
  • Este relativ mai ușor să portați programul pe alte platforme, dar acestea necesită modificări în funcție de compatibilitatea hardware-ului.
Contra:
  • Limbajul de asamblare este un limbaj de programare de nivel scăzut. Crearea chiar și a unor secțiuni mici de cod este dificilă. În plus, este necesar să se țină cont și de funcționarea specifică a echipamentului.
  • Dependența de platformă.
Cel mai popular exemplu de demonstrație Java: public static void main (String args) ( System. out. println ("Hello World!" ) ; ) ar arăta ca (sintaxa NASM, cu folosind Windows API și kernel32.lib) după cum urmează: global _main extern _GetStdHandle@4 extern _WriteFile@20 extern _ExitProcess@4 secțiune . text_main: ; octeți DWORD; mov ebp, esp sub esp, 4; hStdOut = GetstdHandle ( STD_OUTPUT_HANDLE ) push - 11 apel _GetStdHandle@4 mov ebx, eax ; WriteFile(hstdOut, mesaj, lungime(mesaj), &bytes, 0); push 0 lea eax, [ ebp- 4 ] push eax push (message_end - message) push mesaj push ebx call _WriteFile@20 ; ExitProcess (0 ) push 0 apel _ExitProcess@4 ; never here hlt message: db "Hello, World" , 10 message_end: Ca și codurile de mașină, limbajul de asamblare este mai des folosit de ingineri și programatori de sisteme. Este folosit pentru a scrie părți dependente de hardware ale nucleului sistemului de operare care sunt critice în ceea ce privește timpul sau caracteristicile implementării driverului a diferitelor dispozitive periferice

. Dar în

în ultima vreme recurg la el din ce în ce mai puțin, deoarece utilizarea sa reduce foarte mult portabilitatea programelor pe alte platforme. Uneori folosesc procesul de dezasamblare - creează o listă de asamblare a unui program din coduri digitale pentru a analiza logica pentru executarea fragmentelor mici. În cazuri rare, dacă codul original de nivel înalt nu este disponibil: analiza virușilor pentru a le combate sau pierderea Cantitatea de funcționalitate și timpul de implementare a codului de asamblare nu mai erau satisfăcătoare. Costurile de scriere, testare și întreținere a programelor au crescut cu un ordin de mărime mai rapid decât capacitățile lor. A fost necesar să se reducă cerințele de la programator în ceea ce privește cunoașterea funcționării echipamentului, pentru a-i oferi un instrument care să-i permită să scrie în limbi apropiate de logica umană. Treceți la un nou nivel de tipuri de limbaje de programare. Oferă capacitatea de a se împărți în diverse module cu apeluri secvențiale suplimentare (paradigma de programare procedurală), oferă diverse tipuri date cu capacitatea de a le construi etc. În plus, aceste măsuri au adus o portabilitate îmbunătățită a codului pe alte platforme și o organizare mai confortabilă a muncii în echipă. Una dintre primele limbi care a susținut toate cele de mai sus a fost dezvoltată în anii 50 ai secolului trecut Fortran. Abilitatea de a crea în forma text cu o descriere a logicii de execuție folosind bucle, ramuri, subrutine și operarea cu matrice și prezentând date sub formă de real, întreg și numere complexeîncântați ingineri și oameni de știință. În scurt timp au fost create „cadre” științifice și biblioteci. Toate acestea au fost o consecință a faptului că Fortran este încă relevant astăzi, deși într-un mediu științific restrâns, și se dezvoltă, întrucât bagajul dezvoltărilor este foarte mare, singura biblioteca IMSL se dezvoltă activ din 1970 (!), cum multe software relevante similare vă amintiți - vechi? O altă ramură a dezvoltării limbilor la acest nivel este C. Dacă Fortran a devenit un instrument pentru oamenii de știință, atunci C a fost creat pentru a ajuta programatorii să creeze aplicații software: sisteme de operare, drivere etc. Limbajul vă permite să controlați manual alocarea memoriei și oferă acces direct la resursele hardware. Programatorii C trebuie să controleze entitățile de nivel scăzut, așa că mulți sunt de părere că C este un limbaj de asamblare avansat și este adesea numit un limbaj de „nivel mediu”. După ce a introdus tastarea datelor în asamblare, elemente de programare procedurală și modulară, limbajul C este încă unul dintre principalele limbaje pentru programarea sistemului, care este, de asemenea, facilitat de dezvoltarea rapidă a microelectronicii în ultimii ani. Toate tipurile de gadget-uri, controlere, rețea și alte dispozitive au nevoie de drivere, implementare de protocoale pentru colaborareși alte programe software de nivel relativ scăzut pentru implementarea interacțiunii cu echipamente. Toate cele de mai sus contribuie la cererea pentru limbă astăzi. Orientat pe obiecte și principii functionale a primit o dezvoltare ulterioară sub formă de C++, C#, Java, luând mult din sintaxa C. Pro:
  • Simplificarea procesului de creare a codului: introducerea tipurilor, împărțirea în module, reducerea listelor de programe.
  • Logica transparentă a algoritmului de bază datorită trecerii de la codurile de mașină la comenzi mai citite de om într-un stil semantic descriptiv.
  • Portabilitate. A devenit suficient să recompilăm textul programului pentru a fi executat pe altă platformă (eventual cu o ușoară modificare).
  • Viteza programelor compilate.
Contra:
  • Lipsa gestionării automate a memoriei și necesitatea unei monitorizări constante.
  • Lipsa implementării conceptelor de programare orientată pe obiecte și funcționale.

Dezvoltarea limbajelor de nivel înalt

Limbajele de programare de nivel înalt, în ceea ce privește crearea de software, au început să se îndepărteze din ce în ce mai mult de codurile de mașină și să implementeze diverse paradigme de programare pe lângă cele procedurale. Acestea includ, de asemenea, implementarea principiilor orientate pe obiecte. C++, Java, Python, JavaScript, Ruby... - gama de limbaje de acest tip este cea mai populară și mai solicitată astăzi. Ele oferă mai multe oportunități de implementare a unei varietăți de software și este imposibil să se determine clar „specializarea” fiecăruia dintre ele. Dar popularitatea aplicării în zonele relevante se datorează bibliotecilor/cadrelor de lucru cu acestea, de exemplu: JavaScript- În față. Limbajul a fost conceput pentru a permite browserului web client să interacționeze cu utilizatorul și server la distanță. Cele mai populare biblioteci sunt Angular, React și VUE. În prezent, este utilizat relativ activ pe web și alte servere (backend), Node.js este deosebit de popular. Rubin– Backend. Folosit pentru a crea scripturi (fișiere de service) și mai departe servere web. Cadrul principal este Ruby On Rails. Piton– domeniul științific și ingineresc (pe lângă zona web). Este o alternativă la pachetele standard de calcul și matematică (Mathematica, Octave, MatLab...), dar are semantica obișnuită a limbajului și un număr mare de biblioteci. Are mulți fani în domeniul sistemelor învățarea automată, statistică și inteligență artificială. Bibliotecile utilizate frecvent includ django, numpy, panda și tensorflow. C++– O dezvoltare universală, evolutivă a limbajului C Oferă capabilități de programare funcționale și orientate pe obiecte fără a pierde capacitatea de a interacționa cu hardware de nivel scăzut. Datorită acestui fapt, productivitatea și flexibilitatea sunt realizate la crearea software-ului, dar și prețul corespunde: o barieră ridicată la intrare datorită specificației complexe a limbajului, necesitatea controlului independent asupra resurselor la executarea programului. Multe software de sistem și pentru utilizator unic sunt scrise folosindu-l: module de sistem de operare (Windows, Symbian...), jocuri, editori ( Adobe Photoshop, Autodesk Maya...), baze de date (MSSQL, Oracle...), playere (WinAmp...), etc. Trebuie remarcat faptul că software-ul modern este un produs complex, în dezvoltarea căruia mai multe limbaje de programare sunt utilizate simultan și gradul de participare al fiecăruia dintre ele trebuie determinat, rezultatul general poate fi foarte dificil.

Progrese suplimentare

Recent, un alt tip de programare a câștigat popularitate - funcțional (dezvoltarea ulterioară a nivelului de limbă). Iată un alt tip de abstractizare pentru calcule - funcții care iau un set de funcții ca argumente și returnează altul. Rolul variabilelor este jucat de aceleași funcții (variabilele care ne sunt familiare sunt pur și simplu expresii constante, similare cu final înaintea unei declarații de tip în Java). Funcția în sine este închisă în domeniul său, rezultatul funcționării sale depinde doar de argumentele transmise. De aici rezultă două proprietăți remarcabile:
  • Pentru testare avem nevoie doar de argumente ale funcției (rezultatul muncii nu depinde de variabile externe etc.).
  • Un program în stil funcțional este miraculos pregătit pentru concurență: apelurile de funcții secvențiale pot fi emise în fire învecinate (deoarece nu sunt afectate de factori externi) și nu necesită blocări (adică nu există probleme de sincronizare). Un bun stimulent pentru a dedica timp acestui subiect, având în vedere adoptarea pe scară largă a procesoarelor multi-core.
Cu toate acestea, pragul de intrare este mai mare decât pentru OOP: pentru un cod eficient este necesar să se construiască un program, care să descrie algoritmul de execuție sub formă de funcții. Dar și pentru un stil pur funcțional ar fi bine să cunoaștem elementele de bază ale logicii și teoriei categoriilor. Cele mai populare sunt Haskell, Scala, F#. Dar nu vă fie teamă, elemente de programare funcțională au apărut în Java (precum și în alte limbaje moderne de a treia generație) și pot fi combinate cu OOP. Veți cunoaște toate aceste detalii mai detaliat la stagiul online JavaRush. Regiune programare logica(nivelul de limbă următor) Nu am găsit încă unul lat aplicare practică din cauza cererii reduse. Construirea programelor necesită cunoașterea elementelor fundamentale ale matematicii discrete, logicii predicatelor, instrumentelor de constrângere și a altor ramuri ale logicii matematice. Cel mai popular limbaj activ este Prolog.

Concluzie

În prezent, cele mai comune limbi sunt OOP. Java, de la începuturile sale, a fost întotdeauna în top, de obicei în primele trei, limbi populare. Pe lângă OOP, conține elemente de programare funcțională și puteți combina stiluri diferite elaborarea programelor dvs. Gama de aplicații Java este foarte largă - acestea sunt sarcini de afaceri, implementarea de servere web (backend), limbajul principal pentru crearea de aplicații Android, medii de programare multiplatformă și locuri de muncă (IDE/AWM) și modelare și multe altele . Poziția Java este deosebit de puternică în sectorul Enterprise - o zonă a software-ului corporativ care necesită cod de înaltă calitate și de lungă durată și implementarea celei mai complexe logici de afaceri.