Cum să-ți creezi propriul limbaj de programare: teorie, instrumente și sfaturi de la un practician. Diferite limbaje de programare și domeniile lor de aplicare. Prelegere în Yandex

Programatorul William W. Vold spune povestea

În ultimele șase luni, am lucrat la crearea unui limbaj de programare (PL) numit Pinecone. N-aș îndrăzni să-l numesc complet, dar îl poți folosi deja - conține suficiente elemente pentru asta, cum ar fi variabile, funcții și structuri de date personalizate. Dacă doriți să-l verificați înainte de a citi, vă sugerez să vizitați pagina oficială și depozitul de pe GitHub.

Introducere

Nu sunt un expert. Când am început să lucrez la acest proiect, habar nu aveam ce făceam și încă nu am. Nu am studiat niciodată intenționat principiile creării unei limbi - am citit doar unele materiale pe Internet și nici în ele nu am găsit aproape nimic util pentru mine.

Cu toate acestea, am scris o limbă complet nouă. Și funcționează. Trebuie să fac ceva bine.

În acest articol voi încerca să arăt cum Pinecone (și alte limbaje de programare) transformă codul sursă în ceea ce mulți consideră magic. Mă voi concentra și pe situațiile în care a trebuit să fac compromisuri și să explic de ce am luat deciziile pe care le-am luat.

Cu siguranță, textul nu pretinde a fi un ghid cu drepturi depline pentru crearea unui limbaj de programare, dar pentru curioși va fi un bun punct de plecare.

Primii pasi

„De unde să încep?” este o întrebare pe care alți dezvoltatori o pun adesea atunci când învață că scriu propria mea limbă. În această parte voi încerca să răspund în detaliu.

Compilat sau interpretat?

Compilatorul analizează întregul program, îl transformă în cod de mașină și îl stochează pentru execuție ulterioară. Interpretul analizează și execută programul linie cu linie în timp real.

Din punct de vedere tehnic, orice limbaj poate fi atât compilat, cât și interpretat. Dar pentru fiecare limbă, o metodă este mai potrivită decât cealaltă, iar alegerea paradigmei într-un stadiu incipient determină proiectarea ulterioară. Într-un sens general, interpretarea este flexibilă, iar compilarea oferă performanțe ridicate, dar acesta este doar vârful unui subiect foarte complex.

Am vrut să creez un limbaj simplu, dar puternic, care este rar, așa că am decis să fac Pinecone compilat de la bun început. Pinecone are însă și interpret - la început, lansarea a fost posibilă doar cu ajutorul lui, mai târziu voi explica de ce.

Notă traducere Apropo, avem o privire de ansamblu rapidă - acesta este un exercițiu grozav pentru cei care învață Python.

Alegerea limbii

Un fel de meta-pas: limbajul de programare în sine este un program care trebuie scris într-un anumit limbaj. Am ales C++ datorită performanței sale, setului său bogat de funcționalități și pur și simplu pentru că îmi place.

Dar, în general, se pot da următoarele sfaturi:

  • limbaj interpretabil foarte recomandatscrieîntr-un limbaj compilat (C, C++, Swift). În caz contrar, performanța va fi bulgăre de zăpadă în timp ce meta-interpretul interpretează interpretul dvs.;
  • limbaj compilat poti sa scriiîn limbaj interpretat (Python, JS). Timpul de compilare va crește, dar nu și timpul de execuție a programului.

Design arhitectural

Structura unui limbaj de programare are mai multe etape de la codul sursă la fișierul executabil, la fiecare dintre acestea datele fiind formatate într-un anumit mod, precum și funcții de tranziție între aceste etape. Să vorbim despre asta mai detaliat.

Analizor/lexer lexical

Linia de cod sursă este trecută prin lexer și transformată într-o listă de jetoane.

Primul pas în majoritatea limbilor este analiza lexicală. Mai simplu spus, reprezintă împărțirea textului în jetoane, adică unități de limbă: variabile, nume de funcții (identificatori), operatori, numere. Astfel, prin alimentarea lexerului cu un șir cu codul sursă ca intrare, vom primi ca ieșire o listă cu toate token-urile pe care le conține.

Codul sursă nu va mai fi accesat în etapele ulterioare, așa că lexerul trebuie să furnizeze toate informațiile necesare pentru acestea.

Contracta

Când am creat limbajul, primul lucru pe care l-am făcut a fost să scriu un lexer. Mai târziu, am explorat instrumente care ar putea face analiza lexicală mai ușoară și ar putea reduce numărul de erori care apar.

Unul dintre principalele astfel de instrumente este Flex - un generator de analizor lexical. Ia ca intrare un fișier care descrie gramatica limbajului și apoi creează un program C, care, la rândul său, analizează șirul și produce rezultatul dorit.

Decizia mea

Am decis să păstrez analizorul pe care l-am scris. În cele din urmă, nu am văzut niciun avantaj special pentru Flex, iar utilizarea lui ar crea doar dependențe suplimentare care ar complica procesul de construire. În plus, alegerea mea permite mai multă flexibilitate - de exemplu, puteți adăuga o declarație la limbă fără a fi nevoie să editați mai multe fișiere.

Parser/parser

Lista de jetoane trece prin parser și se transformă într-un arbore.

Următoarea etapă este analizatorul. Transformă textul sursă, adică o listă de jetoane (ținând cont de paranteze și ordinea operațiilor), într-un arbore de sintaxă abstractă, care vă permite să reprezentați structural regulile limbajului creat. Procesul în sine poate fi numit simplu, dar odată cu creșterea numărului de constructe ale limbajului devine mult mai complicat.

zimbri

La acest pas, mă gândeam și să folosesc o bibliotecă terță parte, uitându-mă la Bison pentru a genera analizatorul. Seamănă mult cu Flex - un fișier personalizat cu reguli de sintaxă este structurat folosind un program C. Dar din nou, m-am hotărât împotriva instrumentelor de automatizare.

Avantajele programelor personalizate

Cu lexer, decizia mea de a scrie și de a folosi propriul cod (aproximativ 200 de linii) a fost destul de evidentă: îmi plac puzzle-urile, iar acesta este, de asemenea, relativ banal. Analizatorul este o poveste diferită: acum lungimea codului pentru acesta este de 750 de linii și aceasta este deja a treia încercare (primele două au fost pur și simplu groaznice).

Cu toate acestea, am decis să fac singur analizatorul. Iată principalele motive:

  • minimizați comutarea de context;
  • simplificarea asamblarii;
  • dorința de a face față sarcinii în mod independent.

Am fost convins de fezabilitatea soluției prin declarația lui Walter Bright (creatorul limbajului D) într-unul dintre articolele sale:

Nu aș recomanda folosirea generatoarelor de lexer și parser, precum și a altor așa-numite „compilatoare compilatoare”. Scrierea unui lexer și a unui parser nu va dura mult timp, iar utilizarea generatorului vă va lega ferm de acesta în lucrările viitoare (ceea ce este important atunci când portați compilatorul pe o nouă platformă). În plus, generatoarele se caracterizează prin emiterea de mesaje de eroare irelevante.

Grafic semantic abstract

Tranziția de la un arbore de sintaxă la un grafic semantic

În această parte, am implementat o structură care este în esență cea mai apropiată de „reprezentarea intermediară” din LLVM. Există o diferență mică, dar importantă între un arbore de sintaxă abstractă (AST) și un grafic semantic abstract (ASG).

ASG vs ASD

În linii mari, un graf semantic este un arbore sintactic cu context. Adică, conține informații precum ce tip returnează funcția sau în ce locuri este utilizată aceeași variabilă. Deoarece graficul trebuie să recunoască și să-și amintească tot acest context, codul care îl generează are nevoie de suport sub forma multor tabele explicative diferite.

Lansa

Odată ce graficul este întocmit, rularea programului este o sarcină destul de simplă. Fiecare nod conține o implementare a unei funcții care preia o anumită intrare, face ceea ce este programat să facă (inclusiv posibile apeluri la funcții de ajutor) și returnează un rezultat. Acesta este interpretul în acțiune.

Opțiuni de compilare

S-ar putea să vă întrebați de unde a venit interpretul, deoarece inițial am definit Pinecone ca un limbaj compilat. Ideea este că compilarea este mult mai dificilă decât interpretarea - am menționat mai devreme că am întâmpinat unele probleme cu acest pas.

Scrieți propriul compilator

La început mi-a plăcut această idee - îmi place să fac lucrurile singur și îmi doream de mult să învăț limbajul de asamblare. Dar crearea de la zero a unui compilator multiplatform este mai dificilă decât scrierea codului de mașină pentru fiecare element al limbajului. Am găsit această idee complet nepractică și nu merită resursele cheltuite.

Programarea este o întreagă știință care vă permite să creați programe de calculator. Include un număr mare de operații și algoritmi diferiți care formează un singur limbaj de programare. Deci, ce este și care sunt diferitele limbaje de programare? Articolul oferă răspunsuri și oferă, de asemenea, o listă generală a limbajelor de programare.

Istoria apariției și schimbărilor limbajelor de programe ar trebui studiată împreună cu istoria dezvoltării tehnologiilor informatice, deoarece aceste concepte sunt direct legate între ele. Fără limbaje de programare, ar fi imposibil să se creeze vreun program pentru ca un computer să funcționeze, ceea ce înseamnă că crearea computerelor ar deveni un exercițiu inutil.

Primul limbaj de mașină a fost inventat în 1941 de Konrad Zuse, care este inventatorul motorului analitic. Puțin mai târziu, în 1943, Howard Aiken a creat mașina Mark 1, capabilă să citească instrucțiuni la nivelul codului mașinii.

În anii 1950, a început cererea pentru dezvoltarea de software, iar limbajul mașinii nu a putut gestiona cantități mari de cod, așa că a fost creat un nou mod de a comunica cu computerele. „Assembler” este primul limbaj mnemonic care înlocuiește instrucțiunile mașinii. De-a lungul anilor, lista limbajelor de programare crește doar, deoarece domeniul de aplicare al tehnologiei informatice devine mai larg.

Clasificarea limbajelor de programare

În acest moment există peste 300 de limbaje de programare. Fiecare dintre ele are propriile caracteristici și este potrivit pentru o anumită sarcină. Toate limbajele de programare pot fi împărțite în mai multe grupuri:

  • Orientat pe aspect (ideea principală este separarea funcționalității pentru a crește eficiența modulelor software).
  • Structural (pe baza ideii de a crea o structură ierarhică a blocurilor individuale de program).
  • Logic (bazat pe teoria aparatului logicii matematice și a regulilor de rezoluție).
  • Orientat pe obiecte (în astfel de programare nu mai sunt folosiți algoritmi, ci obiecte care aparțin unei anumite clase).
  • Multi-paradigmă (combină mai multe paradigme, iar programatorul însuși decide ce limbaj să folosească într-un caz dat).
  • Funcțional (elementele principale sunt funcții care își modifică valoarea în funcție de rezultatele calculelor datelor sursă).

Programare pentru începători

Mulți oameni se întreabă ce este programarea? În esență, este o modalitate de a comunica cu un computer. Datorită limbajelor de programare, putem atribui sarcini specifice diverselor dispozitive prin crearea de aplicații sau programe speciale. Când studiezi această știință în stadiul inițial, cel mai important lucru este să alegi limbaje de programare potrivite (interesante pentru tine). O listă pentru începători este prezentată mai jos:

  • Basic a fost inventat în 1964, aparține familiei de limbaje de nivel înalt și este folosit pentru scrierea de programe de aplicație.
  • Python este destul de ușor de învățat datorită sintaxei sale simple și lizibile, dar avantajul este că poate fi folosit pentru a crea atât programe desktop obișnuite, cât și aplicații web.
  • Pascal este una dintre cele mai vechi limbi (1969) creată pentru predarea studenților. Modificarea sa modernă este strict tipificată și structurată, dar Pascal este un limbaj complet logic, care este de înțeles la nivel intuitiv.

Aceasta nu este o listă completă de limbaje de programare pentru începători. Există un număr mare de sintaxe care sunt ușor de înțeles și cu siguranță vor fi solicitate în următorii ani. Fiecare are dreptul să aleagă în mod independent direcția care va fi interesantă pentru el.

Începătorii au ocazia să-și accelereze învățarea programării și a bazelor acesteia datorită instrumentelor speciale. Asistentul principal este mediul de dezvoltare integrat pentru programe și aplicații Visual Basic („Visual Basic” este, de asemenea, un limbaj de programare care a moștenit stilul limbajului Basic al anilor 1970).

Nivelurile limbajelor de programare

Toate limbajele formalizate destinate creării, descrierii de programe și algoritmi pentru rezolvarea problemelor pe computere sunt împărțite în două categorii principale: limbaje de programare de nivel scăzut (lista este prezentată mai jos) și de nivel înalt. Să vorbim despre fiecare dintre ele separat.

Limbile de nivel scăzut sunt concepute pentru a crea instrucțiuni de mașină pentru procesoare. Principalul lor avantaj este că folosesc notații mnemonice, adică, în loc de o secvență de zerouri și unu (din sistemul de numere binar), computerul își amintește un cuvânt abreviat semnificativ din limba engleză. Cele mai cunoscute limbaje de nivel scăzut sunt „Assembler” (există mai multe subtipuri ale acestui limbaj, fiecare dintre ele având multe în comun, dar diferă doar printr-un set de directive și macrocomenzi suplimentare), CIL (disponibil în .Net platformă) și JAVA Bytecode.

Limbaje de programare la nivel înalt: listă

Limbile de nivel înalt sunt create pentru confort și eficiență mai mare a aplicațiilor, ele sunt exact opusul limbilor de nivel scăzut. Trăsătura lor distinctivă este prezența constructelor semantice care descriu succint și concis structurile și algoritmii programelor. În limbile de nivel scăzut, descrierea lor în codul mașinii ar fi prea lungă și de neînțeles. Limbile de nivel înalt sunt independente de platformă. În schimb, compilatorii îndeplinesc funcția de traducător: traduc textul programului în instrucțiuni elementare ale mașinii.

Următoarea listă de limbaje de programare: C ("C"), C# ("C-sharp"), "Fortran", "Pascal", Java ("Java") - se numără printre cele mai utilizate sintaxe de nivel înalt. Are următoarele proprietăți: aceste limbaje funcționează cu structuri complexe, acceptă tipuri de date și operațiuni cu informații despre fișiere I/O și au, de asemenea, avantajul de a fi mult mai ușor de lucrat datorită lizibilității și sintaxei ușor de înțeles.

Cele mai utilizate limbaje de programare

În principiu, puteți scrie un program în orice limbă. Întrebarea este: va funcționa eficient și fără eșec? De aceea ar trebui să alegeți cele mai potrivite limbaje de programare pentru a rezolva diverse probleme. Lista după popularitate poate fi descrisă după cum urmează:

  • Limbaje OOP: Java, C++, Python, PHP, VisualBasic și JavaScript;
  • grup de limbaje structurale: Basic, Fortran și Pascal;
  • multi-paradigmă: C#, Delphi, Curry și Scala.

Domeniul de aplicare al programelor și aplicațiilor

Alegerea limbii în care este scris un anumit program depinde în mare măsură de zona de aplicare a acestuia. Deci, de exemplu, pentru lucrul cu hardware-ul computerului în sine (drivere de scriere și programe de suport), cea mai bună opțiune ar fi C ("C") sau C++, care sunt incluse în principalele limbaje de programare (vezi lista de mai sus) . Și pentru a dezvolta aplicații mobile, inclusiv jocuri, ar trebui să alegeți Java sau C# („C-sharp”).

Dacă nu v-ați decis încă în ce direcție să lucrați, vă recomandăm să începeți să studiați cu C sau C++. Au o sintaxă foarte clară și o împărțire structurală clară în clase și funcții. În plus, cunoscând C sau C++, puteți învăța cu ușurință orice alt limbaj de programare.

Clasificarea limbajelor de programare

În zorii erei computerelor, codul mașinii era singurul mijloc de comunicare între o persoană și un computer. Marea realizare a creatorilor de limbaje de programare a fost că au reușit să facă computerul însuși să funcționeze ca traducător din aceste limbaje în codul mașinii.

Limbajele de programare existente pot fi împărțite în două grupuri: procedurale și non-procedurale (vezi Fig. 4.1).

Programele procedurale (sau algoritmice) sunt un sistem de instrucțiuni pentru rezolvarea unei anumite probleme. Rolul calculatorului se reduce la implementarea mecanică a acestor instrucțiuni.

Limbile procedurale sunt împărțite în limbi de nivel scăzut și de nivel înalt.

Diferite tipuri de procesoare au seturi de instrucțiuni diferite. Dacă un limbaj de programare se concentrează pe un anumit tip de procesor și ia în considerare caracteristicile acestuia, atunci este numit limbaj de programare de nivel scăzut.
Aceasta înseamnă că operatorii de limbă sunt aproape de codul mașinii și sunt concentrați pe comenzi specifice procesorului.

Orez. 4.1. Clasificarea generală a limbajelor de programare

Limbajele de nivel scăzut (orientate către mașină) vă permit să creați programe din codul mașinii, de obicei în formă hexazecimală. Este greu de lucrat cu ele, dar programele create cu ajutorul lor de către un programator înalt calificat ocupă mai puțin spațiu de memorie și rulează mai repede. Folosind aceste limbaje, este mai convenabil să dezvoltați programe de sistem, drivere (programe pentru controlul dispozitivelor computerizate) și alte tipuri de programe.

Un limbaj de nivel scăzut (orientat către mașină) este Asamblator, care reprezintă pur și simplu fiecare instrucțiune de cod de mașină, nu ca numere, ci folosind notații simbolice numite
mnemonice.

Limbajele de nivel scăzut creează programe foarte eficiente și compacte, deoarece dezvoltatorul are acces la toate capacitățile procesorului.

Limbaje de programare la nivel înalt mult mai aproape și mai de înțeles de o persoană decât de un computer. Caracteristicile arhitecturilor specifice computerelor nu sunt luate în considerare în ele, prin urmare programele create la nivel de text sursă sunt ușor de portat pe alte platforme pentru care a fost creat un traducător al acestui limbaj. Este mult mai ușor să dezvoltați programe în limbaje de nivel înalt folosind comenzi clare și puternice și sunt mult mai puține greșeli făcute la crearea programelor.

Principalul avantaj al limbajelor algoritmice de nivel înalt este capacitatea de a descrie programe de rezolvare a problemelor într-o formă cât mai convenabilă pentru percepția umană. Dar, deoarece fiecare familie de calculatoare are propriul său limbaj intern specific (mașină) și poate executa doar acele comenzi care sunt scrise în acest limbaj, sunt folosite programe speciale de traducător pentru a traduce programele sursă în limbajul mașinii.

Munca tuturor traducătorilor se bazează pe unul dintre cele două principii: interpretarea sau compilarea.

Interpretare implică traducerea instrucțiune cu instrucțiune și execuția ulterioară a instrucțiunii traduse a programului sursă. În acest sens, pot fi remarcate două dezavantaje ale metodei de interpretare: în primul rând, programul de interpretare trebuie să fie în memoria computerului pe parcursul întregului proces de execuție a programului original, adică să ocupe o anumită cantitate de memorie; în al doilea rând, procesul de traducere a aceluiași operator se repetă de câte ori trebuie executată această comandă în program, ceea ce reduce drastic performanța programului.

În ciuda acestor neajunsuri, traducători-interpreți au devenit destul de răspândite, deoarece sunt convenabile pentru dezvoltarea și depanarea programelor sursă.

La compilare Procesele de traducere și execuție sunt separate în timp: mai întâi, programul sursă este tradus complet în limbajul mașinii (după care prezența unui traducător în RAM devine inutilă), iar apoi programul tradus poate fi executat de mai multe ori. În consecință, pentru același program, traducerea folosind metoda de compilare oferă performanțe mai mari ale sistemului de calcul, reducând în același timp RAM necesară.

Complexitatea mare în dezvoltarea unui compilator în comparație cu un interpret din aceeași limbă se explică prin faptul că compilarea unui program include două acțiuni: analiza, adică determinarea corectitudinii programului sursă în conformitate cu regulile de construire a constructelor de limbaj ale intrării. limbaj și sinteză - generarea unui program echivalent în coduri de mașină. Difuzarea folosind metoda de compilare necesită „vizionarea” repetată a programului difuzat, de exemplu. traducători-compilatori sunt multi-pass: la prima trecere, se verifică corectitudinea sintaxei constructelor de limbaj ale operatorilor individuali independent unul de celălalt, la trecerea ulterioară, corectitudinea relațiilor sintactice dintre operatori etc.

Programul obținut ca urmare a traducerii folosind metoda de compilare este numit modul obiect, care este un program echivalent în codul mașinii, dar nu „legat” la anumite adrese RAM. Prin urmare, înainte de execuție, modulul obiect trebuie procesat de un program special de sistem de operare (editor de linkuri) și convertit în modul de încărcare.

Alături de traducătorii-interpreți și traducătorii-compilatorii discutați mai sus, în practică se folosesc și traducătorii interpret-compilatoare, care combină avantajele ambelor principii de traducere: în etapa de dezvoltare și depanare a programelor, traducătorul funcționează în modul interpret, iar după finalizarea procesului de depanare, programul sursă este retradus într-un modul obiect (adică, folosind metoda de compilare). ). Acest lucru vă permite să simplificați și să accelerați semnificativ procesul de compunere și depanare a programelor și, prin obținerea ulterior a unui modul obiect, asigurați o execuție mai eficientă a programului.

Programarea procedurală clasică necesită ca programatorul să ofere o descriere detaliată a modului de rezolvare a problemei, adică formularea algoritmului și notația sa specială. În acest caz, proprietățile așteptate ale rezultatului nu sunt de obicei indicate. Conceptele de bază ale limbilor acestor grupuri sunt operator și date.
În abordarea procedurală, operatorii sunt combinați în grupuri - proceduri. Programarea structurată în ansamblu nu depășește această direcție, ci doar surprinde în plus câteva tehnici utile
tehnologii de programare.

O direcție fundamental diferită în programare este asociată cu metodologiile (numite uneori „paradigme”) ale programării non-procedurale. Acestea includ programarea orientată pe obiecte și declarativă. Un limbaj orientat pe obiecte creează un mediu sub forma multor obiecte independente. Fiecare obiect se comportă ca un computer separat; ele pot fi folosite pentru a rezolva probleme ca „cutii negre” fără a se adânci în mecanismele interne ale funcționării lor. Dintre limbajele de programare obiect populare în rândul profesioniștilor, ar trebui menționat mai întâi C++; pentru o gamă mai largă de programatori, sunt preferate medii precum Delphi și Visual Basic.



Când folosește un limbaj declarativ, programatorul specifică structurile de informații inițiale, relațiile dintre ele și ce proprietăți ar trebui să aibă rezultatul. În același timp, programatorul nu construiește o procedură pentru obținerea acestuia („algoritm”) (cel puțin, în mod ideal). Aceste limbi nu au conceptul de „operator” („comandă”). Limbile declarative pot fi împărțite în două familii - logice (un reprezentant tipic este Prolog) și funcționale (Lisp).

Să caracterizăm cele mai cunoscute limbaje de programare.

1.Fortran(Formula TRANslating system – sistem de traducere formule); cel mai vechi limbaj care este încă folosit activ în rezolvarea problemelor de orientare matematică. Este un limbaj clasic pentru programarea pe calculator a problemelor de matematică și inginerie.

2.DE BAZĂ(Codul de instrucțiuni simbolice universale pentru începători - un cod universal de instrucțiuni simbolice pentru începători); în ciuda multor deficiențe și a abundenței de versiuni prost compatibile, este cel mai popular în ceea ce privește numărul de utilizatori. Folosit pe scară largă atunci când scrieți programe simple.

3.ALGOL(ALGOrithmic Language - limbaj algoritmic); a jucat un rol important în teorie, dar acum nu este folosit aproape niciodată pentru programarea practică.

4.PL/1(PL/1 Programming Language - primul limbaj de programare); limbaj polivalent; acum aproape niciodată folosit.

5.Pascal(Pascal – numit după omul de știință Blaise Pascal); extrem de popular atât atunci când învață programare, cât și printre profesioniști. Creat la începutul anilor '70 de omul de știință elvețian Niklaus Wirth. Limbajul Pascal a fost dezvoltat inițial ca un limbaj educațional și, într-adevăr, acum este unul dintre principalele limbaje pentru predarea programării în școli și universități. Cu toate acestea, calitățile sale generale s-au dovedit a fi atât de înalte încât programatorii profesioniști îl folosesc de bunăvoie. Succesul nu mai puțin impresionant, inclusiv financiar, a fost obținut de Philip Kahn, francezul care a dezvoltat sistemul Turbo Pascal. Esența ideii sale a fost de a combina etapele succesive ale procesării programului - compilare, editare link-uri, depanare și diagnosticare a erorilor - într-o singură interfață. Versiunile Turbo Pascal au umplut aproape toate instituțiile de învățământ, centrele de programare și companiile private. Au fost create mai multe limbi mai puternice pe baza limbajului Pascal (Modula, Ada, Delphi).

6.COBOL(Common Business Oriented Language - un limbaj orientat spre afaceri generale); a căzut în mare parte din uz. A fost conceput ca limba principală pentru prelucrarea în masă a datelor în zonele de management
și afaceri.

7.ADA;este limba câștigătoare (mai 1979) a competiției lingvistice universale a Pentagonului din 1975. Dezvoltatorii sunt un grup de oameni de știință condus de Jean Ikhbia. Limba câștigătoare a fost numită ADA, în onoarea Augustei Ada Lovelace. Limba ADA este un descendent direct al limbii
Pascal. Acest limbaj este destinat creării și întreținerii pe termen lung (pe termen lung) a sistemelor software mari; permite procesarea paralelă, controlul procesului în timp real și multe altele, ceea ce este dificil sau imposibil de realizat folosind limbaje mai simple.

8.Si(C – „si”); utilizat pe scară largă în crearea de software de sistem. A lăsat o amprentă mare asupra programării moderne (prima versiune a fost în 1972) și este foarte popular printre dezvoltatorii de sisteme software (inclusiv sisteme de operare). C combină atât caracteristicile unui limbaj de nivel înalt, cât și ale unui limbaj orientat pe mașină, permițând programatorului accesul la toate resursele mașinii, pe care limbaje precum BASIC și Pascal nu le oferă.

9.C++(C++); o extensie orientată pe obiect a limbajului C creată de Bjarne Stroustrup în 1980. Multe caracteristici noi puternice care au crescut dramatic productivitatea programatorului au fost suprapuse unei anumite naturi de nivel scăzut moștenit din limbajul C.

10.Delphi(Delphi); limbaj de programare „vizual” orientat pe obiecte; extrem de popular în acest moment. Creat pe baza limbajului Pascal de specialiștii Borland, limbajul Delphi, având puterea și flexibilitatea limbajelor C și C++, le depășește prin comoditatea și simplitatea interfeței atunci când se dezvoltă aplicații care oferă interacțiune cu baze de date și suport pentru diverse tipuri de lucru în cadrul rețelelor corporative și pe internet.

11.Java(Java); Un limbaj de programare orientat pe obiecte independent de platformă, care este extrem de eficient pentru crearea de pagini web interactive. Acest limbaj a fost creat de Sun la începutul anilor 90 pe baza SI++. Este conceput pentru a simplifica dezvoltarea aplicațiilor bazate pe C++, eliminând toate caracteristicile de nivel scăzut din acesta.

12.Lisp(Lisp) este un limbaj de programare funcțional. Se concentrează pe o structură de date sub forma unei liste și vă permite să organizați procesarea eficientă a unor volume mari de informații text.

13.Prolog(Programare in LOGic - programare logica). Scopul principal al limbajului este dezvoltarea de programe și sisteme inteligente. Prolog este un limbaj de programare creat special pentru lucrul cu baze de cunoștințe bazate pe fapte și reguli (unul dintre elementele sistemelor de inteligență artificială). Limbajul implementează un mecanism de backtracking pentru a efectua un lanț înapoi de raționament, în care anumite inferențe sau concluzii sunt presupuse a fi adevărate, iar apoi aceste ipoteze sunt verificate cu o bază de cunoștințe care conține fapte și reguli de inferență.
Dacă ipoteza nu este confirmată, se face o returnare și se face o nouă ipoteză. Limbajul se bazează pe un model matematic al teoriei calculului predicatului.

Limbaje de programare pentru internet:

1. HTML. O limbă binecunoscută pentru pregătirea documentelor. Este foarte simplu și conține comenzi de bază pentru formatarea textului, adăugarea de imagini, setarea fonturilor și culorilor, organizarea legăturilor și a tabelelor.

2. PERL. A fost conceput ca un mijloc de a procesa eficient fișiere text mari, de a genera rapoarte de text și de a gestiona sarcini.
Perl este semnificativ mai puternic decât limbaje precum C. Include multe funcții utilizate frecvent pentru lucrul cu șiruri de caractere, matrice, gestionarea procesoarelor și lucrul cu informații de sistem.

3. Tcl/Tk. Acest limbaj este axat pe automatizarea proceselor de rutină și constă din comenzi puternice. Este independent de sistem și încă vă permite să creați programe cu o interfață grafică.

4. VRML. Creat pentru a organiza interfețe virtuale tridimensionale pe Internet. Vă permite să descrieți diferite scene tridimensionale, lumini și umbre și texturi sub formă de text.

Alegerea unui limbaj de programare depinde de mulți factori: scopul, ușurința în scrierea programelor sursă, eficiența programelor obiect rezultate etc. Varietatea problemelor rezolvate de un calculator determină varietatea limbajelor de programare.

Întrebări de control

1. Ce sunt sistemele de programare și cărei clase de programe aparțin?

2. Ce este inclus în sistemele de programare?

3. În ce limbaj de programare au fost create primele programe?

4. În ce limbi sunt împărțite limbile procedurale?

5. Descrieți limbaje de nivel scăzut.

6. Ce limbă este o limbă de nivel scăzut?

7. Avantajele limbajelor de nivel scăzut.

8. Descrieți limbaje de nivel înalt.

9. Avantajele limbajelor de nivel înalt.

10. Dați exemple de limbaje de nivel înalt.

11. Pentru ce sunt destinați traducătorii?

12. Cum diferă un compilator de un interpret?

13. Dezavantajele interpretării (ca tip de traducător).

14. Care este procesul de compilare a unui program?

15. Ce acțiuni sunt efectuate în timpul compilării?

16. Cum diferă un modul de încărcare de un modul obiect?

17. Cum diferă programarea procedurală de programarea non-procedurală?

18. Ce tipuri de programare sunt non-procedurale?
programare?

19. Caracteristici ale limbajelor declarative.

20. Descrieți pe scurt limbajele de programare: Fortran, BASIC, Pascal, Cobol.

21. Descrieți pe scurt limbajele de programare: Ada, C, C++, Delphi, Java.

22. Dați exemple de limbaje orientate pe obiecte.

23. Cărei clase de limbi aparține limbajul Lisp?

24. Cărei clase de limbi aparține Prolog?

Limbajele de programare sunt împărțite în 2 clase:

  1. Orientat pe mașină sau pe mașină (nivel scăzut)
  2. algoritmic (nivel înalt)

Un limbaj de nivel scăzut este axat pe un anumit tip de procesor și este scris în coduri de mașină (0 sau 1). Acest limbaj este de înțeles pentru un computer, dar nu de înțeles pentru oameni. De exemplu, limbajul ASSEMBLY

Limbaje de programare la nivel înalt– scris folosind cuvinte și expresii în limba engleză. Adică, un astfel de limbaj este de înțeles pentru o persoană, dar

neînțeles de computer. Aceste limbi trebuie traduse în coduri de mașină. Pentru aceasta se folosesc traducători. Ele sunt împărțite în:

  1. Compilatorii traduc imediat codul sursă al unui program în cod mașină. După aceasta, un fișier batch (.exe sau .com) este generat și programul original în sine nu mai este necesar.
  2. Interpreți - traduc pas cu pas codul sursă al programului. Și de fiecare dată când îl porniți, accesați textul sursă. Foarte convenabil la depanarea programelor.

Există, de asemenea, conceptul de „legare” a programelor, adică colecția de elemente compilate într-un singur modul de program

Etapele modelării pe calculator:

  1. Enunțarea problemei și definirea obiectului de modelare
  2. Dezvoltarea unui model conceptual, identificarea elementelor principale și a relațiilor dintre acestea
  3. Formalizarea și trecerea la un model
  4. Crearea unui algoritm și scrierea unui program
  5. Planificarea și realizarea experimentelor pe calculator
  6. Analiza si interpretarea rezultatelor

Matrice se referă la tipuri de date compuse. Un element de matrice este accesat prin numele matricei și numărul elementului. Elementele unui tablou din memoria computerului sunt ordonate după indici crescători.

Atribute variabileîn limbaje de programare: nume, adresă, valoare și tip

Criterii de calitate sisteme software: fiabilitate, corectitudine, inteligibilitate, flexibilitate, eficienta

Limbaje de programare :

Perl - limbaj de scripting

Limbajelor de programare procedurală le lipsește un tip de date complex

Java Virtual Machine - Interpret

Prolog este un limbaj de programare logic care este un interpret

JavaSCRIPT – limbaj de scripting

SQL este un limbaj de manipulare a datelor folosit pentru a prelua, insera și șterge informații din bazele de date relaționale.

Limbajele de programare declarative includ limbaje logice

HTML și XML – limbaje de marcare a datelor

C este un limbaj folosit pentru programarea structurată

Elementele principale ale orientate pe obiecte programarea sunt:

  1. Clasă
  2. Obiect - o instanță a unei clase
  3. Un eveniment care se întâmplă unui obiect
  4. Metodă care se execută pe un obiect
  5. Proprietate

Conceptele de bază ale programarii orientate pe obiecte sunt:

  1. Polimorfismul este utilizarea unui singur nume pentru a defini acțiuni comune unei clase, ceea ce înseamnă capacitatea obiectelor de a alege o metodă internă pe baza tipului de date.
  2. Moștenirea este o proprietate a OOP care poate fi modelată folosind o schemă de clasificare taxonomică (ierarhie)
  3. Încapsularea înseamnă capacitatea de a include proceduri pentru lucrul cu un obiect într-un modul separat

Baza metodei programare structurată sunt: ​​(programare de sus în jos)

Cu alte cuvinte, aceasta este programare fără „GoTo”

  1. Folosind o compoziție din trei elemente de bază: ramificare, structură liniară și buclă
  2. Utilizarea subrutinelor

Folosind subrutine nu este nevoie să se realizeze un număr minim de operatori. Transferul datelor de intrare la apelarea unei subrutine are loc cu ajutorul parametrilor. Sunt apelați parametrii specificați în momentul apelării unei subrutine din programul principal real.

Cele mai potrivite limbaje pentru programarea sistemului sunt C, C++ și Assembly.

În timpul traducerii, etapa de analiză semantică este utilizată pentru a verifica tipurile din expresii.

În etapa de analiză în timpul traducerii, sunt detectate erori precum „lipsă punct și virgulă”.

Introducerea computerelor în toate sferele activității umane necesită specialiști de diverse profiluri care să stăpânească abilitățile de utilizare a tehnologiei informatice. Este în creștere nivelul de pregătire al studenților universitari, care din primul an sunt introduși în utilizarea computerelor și a metodelor numerice simple, ca să nu mai vorbim de faptul că la finalizarea cursurilor și a proiectelor de diplomă, utilizarea tehnologiei informatice devine norma în marea majoritate a universităților.

Tehnologia calculatoarelor este acum folosită nu numai în calculele inginerești și științele economice, ci și în specialități tradiționale non-matematice precum medicina, lingvistica și psihologia. În acest sens, se poate afirma că utilizarea computerelor a devenit larg răspândită. A apărut o mare categorie de specialiști - utilizatori de computere care au nevoie de cunoștințe privind utilizarea computerelor în industria lor - abilități de lucru cu software-ul existent, precum și de a crea propriul software adaptat pentru a rezolva o problemă specifică. Și aici descrierile limbajelor de programare vin în ajutorul utilizatorului.

2. Ce este un limbaj de programare

Limbaj de programare- un sistem formal de semne conceput pentru a descrie algoritmi într-o formă convenabilă pentru executant (de exemplu, un computer). Un limbaj de programare definește un set de reguli lexicale, sintactice și semantice utilizate pentru alcătuirea unui program de calculator. Acesta permite programatorului să determine exact la ce evenimente va reacționa computerul, cum vor fi stocate și transmise datele și ce acțiuni ar trebui efectuate asupra acestuia în diferite circumstanțe.

De la crearea primelor mașini programabile, omenirea a venit deja cu mai mult de două mii și jumătate de limbaje de programare. În fiecare an numărul lor este completat cu altele noi. Unele limbi sunt folosite doar de un număr mic de proprii dezvoltatori, în timp ce altele devin cunoscute de milioane de oameni. Programatorii profesioniști folosesc uneori mai mult de o duzină de limbaje de programare diferite în munca lor.

Creatorii de limbaj interpretează conceptul diferit limbaj de programare. Printre punctele comune recunoscute de majoritatea dezvoltatorilor se numără următoarele:

· Funcţie: Un limbaj de programare este destinat scrierii de programe de calculator care sunt utilizate pentru a transmite instrucțiuni către un computer pentru a efectua un anumit proces de calcul și pentru a organiza controlul dispozitivelor individuale.

· Sarcină: Un limbaj de programare diferă de limbajele naturale prin faptul că este conceput pentru a transmite comenzi și date de la o persoană la un computer, în timp ce limbajele naturale sunt folosite numai pentru ca oamenii să comunice între ei. În principiu, putem generaliza definiția „limbajelor de programare” - aceasta este o modalitate de transmitere a comenzilor, comenzilor, îndrumări clare pentru acțiune; întrucât limbile umane servesc și la schimbul de informații.

· Execuţie: Un limbaj de programare poate folosi constructe speciale pentru a defini și manipula structurile de date și pentru a controla procesul de calcul.

3. Etape ale rezolvării unei probleme pe calculator.

VT și-a găsit cea mai eficientă aplicație atunci când efectuează calcule intensive în muncă în cercetarea științifică și calculele de inginerie. Atunci când rezolvați o problemă pe un computer, rolul principal îi revine în continuare persoanei. Mașina își îndeplinește sarcinile numai conform programului dezvoltat. Rolul omului și al mașinii este ușor de înțeles dacă procesul de rezolvare a unei probleme este împărțit în etapele enumerate mai jos.

Formularea problemei. Această etapă constă într-o formulare semnificativă (fizică) a problemei și determinarea soluțiilor finale.

Construirea unui model matematic. Modelul trebuie să descrie corect (adecvat) legile de bază ale procesului fizic. Construirea sau selectarea unui model matematic dintre cele existente necesită o înțelegere profundă a problemei și cunoașterea ramurilor relevante ale matematicii.

Dezvoltarea Cupei Mondiale.Întrucât un computer poate efectua doar cele mai simple operații, nu „înțelege” formularea problemei, nici măcar într-o formulare matematică. Pentru a o rezolva, trebuie găsită o metodă numerică care să facă posibilă reducerea problemei la un algoritm de calcul. În fiecare caz specific, este necesar să selectați o soluție adecvată dintre cele standard deja dezvoltate.

Dezvoltarea algoritmului. Procesul de rezolvare a unei probleme (proces de calcul) este scris ca o succesiune de operații aritmetice și logice elementare care conduc la rezultatul final și se numește algoritm de rezolvare a problemelor.

Programare. Algoritmul pentru rezolvarea unei probleme este scris într-un limbaj ușor de înțeles de mașină sub forma unei secvențe precis definite de operații - un program. Procesul se desfășoară de obicei folosind un limbaj intermediar, iar traducerea acestuia este efectuată de mașina în sine și de sistemul său.

Ajustarea programului. Programul compilat conține diverse tipuri de erori, inexactități și erori de scris. Depanarea include monitorizarea programului, diagnosticarea (căutarea și determinarea conținutului) erorilor și eliminarea acestora. Programul este testat prin rezolvarea problemelor de control (test) pentru a obține încredere în fiabilitatea rezultatelor.

Efectuarea calculelor.În această etapă, datele inițiale pentru calcule sunt pregătite și calculele sunt efectuate folosind un program bine stabilit. În același timp, pentru a reduce munca manuală în procesarea rezultatelor, pot fi utilizate pe scară largă forme convenabile de eliberare a rezultatelor sub formă de text și informații grafice, într-o formă pe înțelesul oamenilor.

Analiza rezultatelor. Rezultatele calculelor sunt analizate cu atenție, și se întocmește documentația științifică și tehnică.

4. Pentru ce sunt limbajele de programare?

Procesul de funcționare a computerului constă în executarea unui program, adică a unui set de comenzi foarte specifice într-o ordine foarte specifică. Forma de mașină a instrucțiunii, constând din zerouri și unu, indică exact ce acțiune ar trebui să efectueze procesorul central. Aceasta înseamnă că, pentru a oferi computerului o secvență de acțiuni pe care trebuie să le efectueze, trebuie să specificați o secvență de coduri binare pentru comenzile corespunzătoare. Programele de cod de mașină constau din mii de instrucțiuni. Scrierea unor astfel de programe este o sarcină dificilă și plictisitoare. Programatorul trebuie să-și amintească combinația de zerouri și unu din codul binar al fiecărui program, precum și codurile binare ale adreselor de date utilizate în execuția acestuia. Este mult mai ușor să scrieți un program într-o limbă care este mai apropiată de limbajul uman natural și să încredințați unui computer munca de traducere a acestui program în coduri de mașină. Așa au apărut limbaje concepute special pentru scrierea programelor - limbaje de programare.

Există multe limbaje de programare diferite disponibile. De fapt, puteți folosi oricare dintre ele pentru a rezolva majoritatea problemelor. Programatorii cu experiență știu ce limbaj este cel mai bine să folosească pentru a rezolva fiecare problemă specifică, deoarece fiecare limbă are propriile sale capacități, orientare către anumite tipuri de probleme și propriul mod de a descrie concepte și obiecte utilizate în rezolvarea problemelor.

Toate numeroasele limbaje de programare pot fi împărțite în două grupuri: limbi de nivel scăzutȘi limbi de nivel înalt.

Limbile de nivel scăzut includ limbaje de asamblare (din engleză toassemble - assemble, assemble). Limbajul de asamblare folosește comenzi simbolice ușor de înțeles și rapid de reținut. În loc de o secvență de coduri binare de comenzi, sunt scrise denumirile lor simbolice, iar în loc de adrese binare ale datelor utilizate la executarea unei comenzi, sunt scrise nume simbolice ale acestor date alese de programator. Limbajul de asamblare este uneori numit cod mnemonic sau cod automat.

Majoritatea programatorilor folosesc limbaje de nivel înalt pentru a scrie programe. La fel ca limbajul uman obișnuit, o astfel de limbă are propriul alfabet - un set de simboluri folosite în limbă. Aceste simboluri sunt folosite pentru a alcătui așa-numitele cuvinte cheie ale limbii. Fiecare dintre cuvintele cheie își îndeplinește propria funcție, la fel ca în limba noastră familiară, cuvintele formate din litere din alfabetul unei anumite limbi pot îndeplini funcțiile diferitelor părți de vorbire. Cuvintele cheie sunt legate între ele în propoziții conform anumitor reguli sintactice ale limbii. Fiecare propoziție definește o anumită secvență de acțiuni pe care computerul trebuie să le efectueze.

Un limbaj de nivel înalt acționează ca un intermediar între o persoană și un computer, permițând unei persoane să comunice cu un computer într-un mod mai familiar oamenilor. Adesea, un astfel de limbaj ajută la alegerea metodei potrivite pentru rezolvarea unei probleme.

Înainte de a scrie un program într-un limbaj de nivel înalt, programatorul trebuie să scrie algoritm rezolvarea unei probleme, adică un plan de acțiune pas cu pas care trebuie finalizat pentru a rezolva această problemă. Prin urmare, limbile care necesită o compilare preliminară a unui algoritm sunt adesea numite limbaje algoritmice.