Modele de ciclu de viață al aplicațiilor. §1 Informaţii generale despre limbă. Etapele proiectării programului. Modele ciclului de viață al aplicației Istoricul proiectului studentului al limbajului de programare C

Etichete: Istoricul standardizării C, ANSI C, ISO C, C99, C11, ISO/IEC C, C.

Origini

C și este un „produs derivat” derivat din crearea sistemului de operare UNIX, care a fost dezvoltat la Bell Laboratories de Ken Thompson, Denis Ritchie și co. Thompson a scris de unul singur versiunea originală a UNIX, care rula pe DEC PDP-7, unul dintre primele minicalculatoare cu doar 8K cuvinte de memorie principală (era 1969, până la urmă).

Ca și alte sisteme de operare ale vremii, UNIX a fost scris în limbaj de asamblare. Depanarea programelor în limbaj de asamblare este o adevărată durere și greu de îmbunătățit, iar UNIX nu a făcut excepție. Thompson a decis că este nevoie de un limbaj pentru a dezvolta în continuare sistemul de operare nivel înaltși a venit cu o limbă mică B. Thompson bazată pe limbajul BCPL, un limbaj pentru programarea sistemului, dezvoltat la mijlocul anilor '60. BCPL, la rândul său, provine din ALGOL 60, una dintre cele mai vechi (și mai influente) limbi.

Ritchie sa alăturat în curând proiectului UNIX și a început să scrie în B. În 1970, Bell Labs a achiziționat un PDP-11 pentru proiect. Deoarece B era gata să ruleze pe PDP-11, Thompson a rescris o parte din UNIX în B. În 1971 a devenit clar că B nu era tocmai potrivit pentru PDP-11, așa că Ritchie a început să creeze o versiune extinsă a lui B. La început l-a numit NB (New B ), dar când limbajul a devenit foarte diferit de B, numele a fost schimbat în C. Până în 1973, limbajul devenise suficient de stabil pentru ca UNIX să fie rescris în el. Trecerea la C a oferit un avantaj important: portabilitatea. Scriind un compilator C pentru fiecare dintre mașinile de la Bell Labs, echipa de dezvoltare ar putea porta UNIX la acestea.

Standardizare

C a continuat să evolueze în anii 70, mai ales între 1977 și 1979, când a fost publicată prima carte despre C, Limbajul de programare C, scrisă de Brian Kernighan și Denis Ritchie și publicată în 1978, a devenit biblia programatorilor C. În absența unui standard oficial, această carte – cunoscută și sub numele de K&R, sau „Cartea Albă”, așa cum le place să o numească fanilor C – a devenit standardul de facto. În anii 70 existau puțini programatori C și majoritatea erau utilizatori UNIX. Cu toate acestea, în anii 1980, C sa extins dincolo de limitele înguste ale lumii UNIX. Compilatoarele C au devenit disponibile pe o varietate de mașini care rulează diferite sisteme de operare. În special, C a început să se răspândească pe platforma IBM PC în dezvoltare rapidă.

Odată cu creșterea popularității au apărut și probleme. Programatorii care au scris compilatoare noi au luat ca bază limbajul descris în K&R. Din păcate, în K&R unele caracteristici ale limbajului au fost descrise vag, astfel încât compilatorii le interpretau adesea la propria discreție. În plus, cartea nu a făcut o distincție clară între ceea ce este o caracteristică a limbajului și ceea ce este o caracteristică a sistemului de operare UNIX. Ceea ce a înrăutățit situația a fost că, după publicarea K&R, C a continuat să se dezvolte: i s-au adăugat noi funcții și au fost eliminate cele vechi. Curând a apărut o nevoie evidentă de o descriere cuprinzătoare, exactă și modernă a limbii. Fără un astfel de standard, au început să apară dialecte ale limbii, care au interferat cu portabilitatea - cel mai puternic aspect al limbii.

Dezvoltarea standardului C american a început în 1983 sub auspiciile Institutului Național American de Standarde (ANSI). După multe revizuiri, standardul a fost finalizat în 1988 și adoptat oficial în decembrie 1989 ca ANSI X3.159-1989. În 1990, a fost aprobat de către Organizația Internațională pentru Standardizare (ISO) ca standard internațional ISO/IEC 9899:1990. Această versiune a limbajului se numește de obicei C89 sau C90, pentru a evita confuzia cu versiunea originală a C, care este de obicei numită K&R C.

Limba a suferit modificări minore în 1995 (schimbările sunt descrise într-un document numit în mod obișnuit amendamentul 1). Modificări mai semnificative au avut loc în 1999, când a fost publicat standardul ISO/IEC 9899:1999. Limbajul descris în acest standard este de obicei numit C99. Termenii „ANSI C”, „ANSI/ISO C” și „ISO C”, folosiți cândva pentru a descrie C99, au două semnificații datorită existenței a două standarde.

În 2011, odată cu revizuirea limbajului C++, a fost lansat standardul C11. În ciuda existenței standardului '11, mulți compilatori încă nu acceptă pe deplin nici măcar versiunile C99, așa că utilizarea standardului C11 va fi menționată în mod explicit.

Când reputația ta funcționează pentru profitul tău

Management comunitar

Crearea Tonului Vocii. Procesarea promptă a comentariilor atât negative, cât și pozitive din partea mărcii. Managementul comunicațiilor conform scenariilor specificate. Traducerea problemelor problematice către client.

Agenți de influență

Crearea și implementarea „virtualelor” pe forumuri și în rețelele sociale. Există o bază de date de conturi actualizate și live pe peste 300 de site-uri.

Lucrul cu recenzii

Scrierea, coordonarea și postarea recenziilor despre marcă pe platforme de top și site-uri de recenzii. Prelucrarea și acoperirea comentariilor negative cu unele pozitive. Ca rezultat al rezultatele căutării negativitatea este înlocuită treptat.

Monitorizarea rețelelor sociale

Lucrul cu sistemele Youscan, IQbuzz, Brand Analytics. Controlul mențiunilor de marcă. Identificarea perspectivelor cheie și răspunsul prompt la negativitate. Un instrument indispensabil pentru control feedback de la clienti.

Analiză și cercetare

Analiza domeniului informațional, cercetarea categoriei de produse și a principalilor competitori ai mărcii. Acest instrument acoperă sarcini de la monitorizarea reputației și marketing în timp real până la cercetarea aprofundată.

SERM

Analiza detaliată a rezultatelor căutării pentru cuvintele cheie selectate. Colectarea referințelor despre client pe rețelele de socializare, forumuri și site-uri de știri. Dezvoltarea unei strategii de abordare a informațiilor negative. Clientul primește livrare complet controlată în TOP10.

Care este motivul acestui statut al limbajului C? Din punct de vedere istoric, acest limbaj este inseparabil de operare sisteme Unix, care își cunoaște renașterea în aceste zile. Anii 60 au fost epoca formării sistemelor de operare și a limbajelor de programare de nivel înalt. La acea vreme, sistemele de operare și compilatoarele au fost dezvoltate independent pentru fiecare tip de computer și, adesea, chiar și propriile limbaje de programare (amintiți-vă, de exemplu, PL/I). În același timp, comunitatea problemelor apărute în acest caz a devenit deja evidentă. Răspunsul la conștientizarea acestei comunități a fost o încercare de a crea un mobil universal sistem de operare, iar pentru aceasta aveam nevoie de un limbaj de programare la fel de universal și mobil. C a devenit un astfel de limbaj, iar Unix a devenit primul sistem de operare scris aproape în întregime într-un limbaj de nivel înalt.

Legătura strânsă cu Unix a oferit limbajului C un teren de testare pe care nicio altă limbă nu avea la acel moment. Problemele de programare a sistemelor au fost considerate pe bună dreptate cele mai dificile din industrie la acea vreme. În cea mai mare parte, erau atât de dependente de mașină încât mulți nici măcar nu s-au gândit să le rezolve altfel decât în ​​asamblare. Limbajele de nivel înalt au fost destinate programării aplicațiilor și au implementat doar funcții foarte limitate necesare pentru funcționarea sistemului, și adesea doar pentru un anumit tip de mașină.

Încă de la început, limbajul C a fost creat astfel încât sarcinile de sistem să poată fi scrise în el. Creatorii lui C nu au dezvoltat un model abstract al executorului limbajului, ci pur și simplu au implementat în el acele capabilități care erau cele mai necesare în practica programării sistemului. Acestea au fost în primul rând mijloace de lucru direct cu memorie, structuri structurale de control și organizare modulară a programului. Și în esență nimic altceva nu a fost inclus în limbaj. Orice altceva a fost pus în biblioteca de rulare. Prin urmare, detractorii se referă uneori la limbajul C ca un asamblator structural. Dar indiferent ce au spus ei, abordarea s-a dovedit a fi foarte reușită. Datorită lui s-a realizat nou nivelîn ceea ce priveşte simplitatea şi capacităţile limbajului.

Mai există, însă, un factor care a determinat succesul limbii. Creatorii au separat foarte abil proprietățile independente și dependente de mașină în el. Datorită acestui fapt, majoritatea programelor pot fi scrise universal - performanța lor nu depinde de arhitectura procesorului și a memoriei. Câteva părți ale codului dependente de hardware pot fi localizate în module separate. Și folosind preprocesorul, puteți crea module care, atunci când sunt compilate platforme diferite va genera codul corespunzător dependent de mașină.

Sintaxa limbajului C a provocat multe controverse Tehnicile de scurtare folosite în el, dacă sunt folosite excesiv, pot face programul complet ilizibil. Dar, după cum a spus Dijkstra, mijloacele nu sunt de vină pentru faptul că sunt folosite analfabet. De fapt, abrevierile de sintaxă propuse în C corespund celor mai frecvente situații stereotipe din practică. Dacă considerăm abrevierile ca idiomuri pentru prezentarea expresivă și compactă a unor astfel de situații, atunci beneficiile lor devin necondiționate și evidente.

Deci, C a apărut ca un limbaj de programare a sistemului universal. Dar nu a rămas în aceste limite. Până la sfârșitul anilor 80, limbajul C, după ce l-a împins pe Fortran din poziția sa de lider, a câștigat o popularitate masivă în rândul programatorilor din întreaga lume și a început să fie utilizat într-o mare varietate de sarcini aplicate. Un rol semnificativ l-a jucat aici răspândirea Unix (și, prin urmare, C) în mediul universitar, unde a fost pregătită o nouă generație de programatori.

Ca toate limbile, C a fost îmbunătățit treptat, dar majoritatea îmbunătățirilor nu au fost radicale. Cea mai semnificativă dintre acestea, poate, ar trebui considerată introducerea unei specificații stricte a tipurilor de funcții, care a crescut semnificativ fiabilitatea comunicării inter-module în C. Toate astfel de îmbunătățiri au fost consacrate în 1989 în standardul ANSI, care încă definește limbajul C.

Dar dacă totul este atât de roz, atunci de ce continuă să fie folosite toate celelalte limbi, ceea ce le susține existența? Călcâiul lui Ahile al limbajului C a fost că s-a dovedit a fi la un nivel prea scăzut pentru sarcinile care au fost puse pe ordinea de zi în anii '90. În plus, această problemă are două aspecte. Pe de o parte, instrumentele de nivel prea scăzut au fost integrate în limbaj - în primul rând gestionarea memoriei și aritmetica adresei. Nu este fără motiv că schimbarea capacității de biți a procesoarelor are un efect foarte dureros asupra multor programe C. Pe de altă parte, C nu are caracteristici de nivel înalt - tipuri de date și obiecte abstracte, polimorfism, gestionarea excepțiilor. Ca urmare, în programele C, tehnica implementării unei sarcini domină adesea conținutul acesteia.

Primele încercări de a corecta aceste deficiențe au început să fie făcute la începutul anilor 80. Chiar și atunci, Bjarne Stroustrup de la AT&T Bell Labs a început să dezvolte o extensie a limbajului C sub numele de cod. Stilul de dezvoltare a fost destul de consistent cu spiritul în care a fost creat limbajul C în sine - au fost introduse anumite caracteristici în el pentru a face mai mult lucru convenabil persoane și grupuri specifice. Primul traducător comercial al noii limbi, numit C++, a apărut în 1983. A fost un preprocesor care a tradus programul în cod C. Cu toate acestea, nașterea reală a limbajului poate fi considerată publicarea cărții lui Stroustrup în 1985. Din acest moment C++ a început să câștige popularitate la nivel mondial.

Principala inovație a C++ este mecanismul de clasă, care face posibilă definirea și utilizarea noilor tipuri de date. Programatorul descrie reprezentarea internă a unui obiect de clasă și un set de funcții-metode pentru accesarea acestei reprezentări. Unul dintre obiectivele prețuite la crearea C++ a fost dorința de a crește procentul de reutilizare a codului deja scris. Conceptul de clase a oferit un mecanism de moștenire pentru aceasta. Moștenirea vă permite să creați noi clase (derivate) cu reprezentare extinsă și metode modificate, fără a afecta codul compilat al claselor originale (de bază). În același timp, moștenirea oferă unul dintre mecanismele de implementare a polimorfismului - conceptul de bază al programarii orientate pe obiecte, conform căruia, pentru a efectua același tip de procesare diferite tipuri date poate fi folosit același cod. De fapt, polimorfismul este, de asemenea, una dintre metodele de asigurare a reutilizarii codului.

Introducerea claselor nu epuizează toate inovațiile limbajului C++. Implementează un mecanism de gestionare a excepțiilor structurat cu drepturi depline, a cărui absență în C a făcut mult mai dificilă scrierea de programe fiabile, un mecanism de șablon - un mecanism sofisticat de macro-generare profund încorporat în limbaj, deschizând o altă cale către reutilizarea codului, si multe altele.

Astfel, linia generală de dezvoltare a limbajului a avut ca scop extinderea capacităților acestuia prin introducerea de noi constructe de nivel înalt, menținând în același timp o compatibilitate cât mai deplină cu ANSI C, desigur, lupta pentru creșterea nivelului limbajului a continuat al doilea front - aceleași clase fac posibilă, cu o abordare competentă, ascunderea operațiunilor de nivel scăzut, astfel încât programatorul să înceteze efectiv să lucreze direct cu entitățile dependente de memorie și de sistem. Cu toate acestea, limbajul nu conține mecanisme care obligă dezvoltatorul să structureze corect programul, iar autorii nu au emis recomandări sistematice pentru utilizarea constructelor sale destul de sofisticate. De asemenea, nu au avut grijă în timp util să creeze o bibliotecă de clase standard care implementează structurile de date cele mai frecvent întâlnite.

Toate acestea au dus la faptul că mulți dezvoltatori au fost forțați să exploreze ei înșiși labirinturile semanticii lingvistice și să găsească în mod independent expresii care funcționează cu succes. De exemplu, în prima etapă a dezvoltării limbajului, mulți creatori de biblioteci de clase au căutat să construiască o singură ierarhie de clase cu o clasă de bază comună Object. Această idee a fost împrumutată de la Smalltalk, unul dintre cele mai cunoscute limbaje orientate pe obiecte. Cu toate acestea, s-a dovedit a fi complet neviabil în C++ - ierarhiile proiectate cu grijă ale bibliotecilor de clasă s-au dovedit a fi inflexibile, iar munca claselor nu a fost evidentă. Pentru ca bibliotecile de clase să fie utilizabile, acestea trebuiau furnizate în codul sursă.

Apariția claselor șablon a respins complet această direcție de dezvoltare. Moștenirea a început să fie folosită numai în cazurile în care era necesar să se genereze o versiune specializată a unei clase existente. Bibliotecile au început să fie compuse din clase separate și mici ierarhii fără legătură. Cu toate acestea, reutilizarea codului a început să scadă pe această cale, deoarece în C++ utilizarea polimorfă a claselor din ierarhii independente este imposibilă. Utilizarea pe scară largă a șabloanelor duce la o creștere inacceptabilă a volumului de cod compilat - să nu uităm, șabloanele sunt implementate folosind metode de macrogenerare.

Una dintre cele mai grave deficiențe ale C++, pe care le-a moștenit din sintaxa C, este capacitatea compilatorului de a descrie structura internă a tuturor claselor utilizate. În consecință, modificarea structurii interne a reprezentării unei clase de bibliotecă duce la necesitatea recompilării tuturor programelor în care este utilizată această bibliotecă. Acest lucru limitează foarte mult dezvoltatorii de biblioteci în ceea ce privește modernizarea lor, deoarece la lansare noua versiune, acestea trebuie să rămână binare compatibile cu cea anterioară. Această problemă îi face pe mulți experți să creadă că C++ este nepotrivit pentru a rula proiecte mari și foarte mari.

Și totuși, în ciuda deficiențelor enumerate și chiar a indisponibilității standardului de limbaj (asta după mai bine de cincisprezece ani de utilizare!), C++ rămâne unul dintre cele mai populare limbaje de programare. Puterea sa constă în primul rând în compatibilitatea sa aproape completă cu limbajul C. Datorită acestui lucru, programatorii C++ au acces la toate dezvoltările realizate în C. În același timp, C++, chiar și fără utilizarea claselor, aduce un număr atât de important. lucruri pentru C caracteristici suplimentareși facilitățile pe care mulți îl folosesc pur și simplu ca un S îmbunătățit.

Referitor la model de obiect C++, atunci atâta timp cât programul tău nu devine foarte mare (sute de mii de linii), este foarte posibil să îl folosești. Apărând în în ultima vreme tendință spre bazate pe componente software doar întărește poziția C++. La dezvoltarea componentelor individuale, deficiențele C++ încă nu apar, iar legarea componentelor într-un sistem de lucru nu se mai face la nivel de limbă, ci la nivel de sistem de operare.

În lumina a tot ceea ce s-a spus, perspectivele pentru C++ nu par sumbre. Deși nu va avea monopol pe piața limbajului de programare. Poate singurul lucru pe care îl putem spune cu certitudine este că această limbă nu va supraviețui unei alte modernizări-extindere. Nu degeaba, atunci când a apărut Java, a primit o atenție atât de mare. Limbajul, care este apropiat ca sintaxă de C++ și, prin urmare, pare familiar multor programatori, a fost ferit de cele mai flagrante neajunsuri ale C++, moștenite din anii 70. Cu toate acestea, Java nu pare să se ridice la nivelul rolului pe care i l-au atribuit unii oameni.

Rolul special al limbajelor C/C++ în programarea modernă face să fie practic lipsit de sens furnizarea de adrese specifice pe Internet unde puteți găsi materiale despre ele. Pur și simplu sunt prea multe locuri ca acesta. Cu toate acestea, dacă sunteți interesat să aflați mai multe despre evoluția C++, atunci începeți cu acest scurt articol http://citforum.syzran.ru/programming/prg96/76.shtml.

Alexandru Sergheev, [email protected]
Articol din revista BYTE/Russia, martie 2000

Pentru a demonstra în mod clar utilizarea în practică a limbilor descrise, am ales o sarcină în care trebuia să introducem o serie de numere întregi dintr-o intrare standard sau dintr-un fișier, apoi să le scoatem numai pe cele impare, iar în ordine inversă urmând. Aceasta este una dintre cele mai simple probleme care necesită în esență lucrul cu matrice, bucle, ramificări și I/O pentru a o rezolva și, de asemenea, vă permite să demonstrați apelurile subrutine. În același timp, este vizibil și ușor de perceput.

Lista 1. C

1 #include /* Conectați funcții I/O */ 2 3 void main(void) 4 ( 5 int M; /* Matrice de 10 numere întregi, numărând de la 0 */ 6 int N; 7 pentru (N=0; N)<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Trecem prin matrice invers */ 12 if (M[N]%2) /* ordonăm și le imprimăm pe cele impare */ 13 printf("%d\n", M[N]) ; 14)

  • Linia 3.În C/C++, execuția programului începe întotdeauna cu funcția principală.
  • Liniile 7 și 11.În antetul buclei sunt indicate setarea inițială, condiția de continuare și regula de recalculare a parametrului buclei, separate prin punct și virgulă. Operațiuni ++ Şi -/- - cele mai cunoscute abrevieri ale limbajului C, adică creșterea și decrementarea unei variabile, adică creșterea și scăderea valorii acesteia cu unu.
  • Linia 8. Funcţie scanf introduce, conform formatului specificat de primul parametru, valorile variabilelor ale căror adrese sunt specificate de parametrii rămași. Aici adresa la care este introdusă valoarea este calculată folosind aritmetica adresei la adresa locației matricei M offset-ul se adaugă prin N elemente. Același efect poate fi obținut prin scriere &M[N].
  • Linia 12. Operațiunea % calculează restul unei diviziuni. Starea operatorului dacă se consideră executat dacă valoarea numerică a expresiei este diferită de zero.
  • Linia 13. Funcţie printf- imprimarea după format funcționează în același mod scanf, dar în loc de adrese se transmit valori care urmează să fie scoase la evidență.
1 #include 2 3 șablon class Array 4 ( 5 public: Array (T Size=1) : M (nou T), N(Size), n(0) () 6 Array (void) ( șterge M;) 7 T Count (void) const ( return n; ) 8 T operator (int i) const ( return M[i]; 9 void Add (T Data) // Adresă de memorie distribuită 12 int N; 13); 14 15 șablon void Array ::Add(T Data) 16 (dacă (N-n) // Dacă toate cele 17 alocate sunt folosite ( int* P = new T; // spațiu, distribuiți mai mult 18 pentru (int i=0; i O; // Matrice de numere întregi de dimensiune variabilă 28 while (1) // Buclă infinită 29 ( int N; 30 cin >> N; // cin - flux de intrare standard 31 dacă (cin.eof()) break; // Ieșire din buclă la sfârșitul fișierului 32 A.Add(N) // Adăugați numărul introdus la matricea 33 ) 34 pentru (int N=A.Count()-1; N>=0; --N) // Treceți prin; tabloul 35 dacă ( A[N]%2) 36 cout<și eliberează memorie
  • Rândurile 3-13. Clasa șablon este declarată Matrice cu parametru T. Este o matrice de dimensiuni variabile de obiecte de tip T. Desigur, în sarcina noastră nu este nevoie să folosim o clasă șablon. Cu toate acestea, am vrut să demonstrăm cum C++ poate crea o structură de date polimorfă care poate funcționa cu orice tip de element.
  • Linia 5. Constructor de clasă. Inițializează reprezentarea obiectului. De exemplu, pe teren M se introduce adresa blocului de memorie ordonat prin operatie nou T.
  • Linia 8. Un exemplu de supraîncărcare operațională. Funcţie operator va fi apelat când parantezele pătrate apar în dreapta unui obiect de clasă Matrice.
  • Linia 9. Această funcție este cea principală în implementare. Acesta adaugă elemente la matrice, extinzându-l după cum este necesar. Deoarece este mai complex decât celelalte, definiția sa este preluată din descrierea clasei. Funcțiile descrise în corpul clasei sunt implementate în C++ nu prin apelare, ci prin substituție inline. Acest lucru accelerează programul, deși îi crește dimensiunea.
  • Rândurile 15-24. Definiția funcției Array::Add(T)(apropo, acesta este numele ei complet).
  • Linia 27. Creați un obiect de tip Matrice. Șablon Aggau parametrizată după tip int.

limbaj C și UNIX

Limbajul de programare CU(a se citi „C”) a fost creat la începutul anilor 70, când Ken Thompson și Dennis Ritchie de la Bell Labs au dezvoltat sistemul de operare UNDC. Mai întâi au creat partea compilatorului CU, apoi l-a folosit pentru a compila restul compilatorului CUși în cele din urmă a folosit compilatorul rezultat pentru a compila UNIX. Sistemul de operare UNIX a fost distribuit inițial în cod sursă către CUîntre universități și laboratoare, iar destinatarul ar putea compila codul sursă în limbaj CUîn codul mașină folosind un compilator adecvat CU.

Distribuția codului sursă a făcut ca sistemul de operare UNIX să fie unic; programatorul ar putea schimba sistemul de operare, iar codul sursă ar putea fi transferat de la o platformă hardware la alta. Astăzi, standardul POSIX definește setul standard de apeluri de sistem UNIX disponibile în CU, care trebuie implementat în versiunile UNIX care sunt compatibile cu POSIX. C a fost a treia limbă pe care Thomson și Ritchie l-au dezvoltat în timpul creării UNIX; primele două au fost, desigur, OŞi ÎN.

C limbaj de asamblare mobil

Comparativ cu limba anterioară - BCPL, limba CU a fost îmbunătățit prin adăugarea de tipuri de date de lungimi specifice. De exemplu, tipul de date int ar putea fi folosit pentru a crea o variabilă cu un anumit număr de biți (de obicei 16), în timp ce tipul de date lung ar putea fi folosit pentru a crea o variabilă întreagă cu un număr mare de biți (de obicei 32). Spre deosebire de alte limbi de nivel înalt, CU ar putea lucra cu adrese de memorie direct folosind pointeri și referințe. Din moment ce CUîși păstrează capacitatea de a accesa direct hardware-ul, este adesea clasificat ca un limbaj de nivel mediu sau numit în glumă „limbaj de asamblare mobil”.

C - limbaj de programare structurat

Cât despre gramatică și sintaxă, atunci CU este un limbaj de programare structurat. În timp ce mulți programatori moderni gândesc în termeni de clase și obiecte, programatorii CU gândiți în termeni de proceduri și funcții. ÎN CU Puteți defini propriile tipuri de date abstracte folosind cuvântul cheie struct. În mod similar, puteți descrie propriile tipuri de numere întregi (enumerări) și puteți da alte nume tipurilor de date existente folosind cuvântul cheie typedef. În acest sens CU este un limbaj structurat cu germenii programării orientate pe obiecte.

Standardizarea limbajului C

Limbaj răspândit C pe diferite tipuri de computere (numite uneori platforme hardware) a condus, din păcate, la multe variații ale limbajului. Erau asemănători, dar incompatibili unul cu celălalt. Aceasta a fost o problemă majoră pentru dezvoltatorii de software care aveau nevoie să scrie programe compatibile care să poată rula pe mai multe platforme. A devenit clar că era nevoie de o versiune standard C. În 1983 ANSI (American National Standards Committee) a format comitetul tehnic X3J11 pentru a crea un standard lingvistic C(pentru a „oferi o definiție clară și independentă de mașină a limbajului”). În 1989 standardul a fost aprobat. ANSI a încheiat un parteneriat cu ISO (International Standards Organization) pentru standardizare C la nivel internațional; un standard comun a fost publicat în 1990 și numit ANSI/ISO 9899:1990. Acest standard este încă în curs de îmbunătățire și este susținut de majoritatea companiilor de dezvoltare a compilatoarelor.

Nașterea lui C++

Bjarne Stroustrup eliberează potențialul orientat pe obiecte CU prin transferul capacităţilor de clasă Simula 67 V CU. Inițial, noua limbă a purtat numele „C cu clase” și abia apoi a început să fie numită C++. Limbă C++ a atins popularitate după ce a fost dezvoltat la Bell Labs, a fost ulterior transferat în alte industrii și corporații. Astăzi este unul dintre cele mai populare (și autorizate) limbaje de programare din lume. C++ moștenește atât părțile bune, cât și părțile rele CU.

Dezvăluirile lui Bjarna Stroustrup

Bjarne Stroustrup: „Am venit cu C++, și-a notat definiția inițială și a finalizat prima implementare. Am selectat și formulat criterii de proiectare C++, și-a dezvoltat principalele caracteristici și a fost responsabil de soarta propunerilor de extindere a limbii în comitetul de standardizare C++", scrie autorul celui mai popular limbaj de programare. - "Limbajul C++ datorează mult limbajului C, și limba C rămâne un subset limbajul C++(dar C++ a remediat câteva defecte serioase în sistemul de tip C). Am economisit și fonduri C, care sunt suficient de scăzute pentru a face față celor mai critice sarcini ale sistemului. Limbă C, la rândul său, datorează mult predecesorului său, BCPL; Apropo, stilul de comentariu // a fost preluat din C++ de la BCPL. O altă sursă principală de inspirație a fost limbajul Simula67. Conceptul de clase (cu clase derivate și funcții virtuale) a fost împrumutat de la acesta. Un mijloc de supraîncărcare a operatorilor și capacitatea de a plasa anunțuri oriunde unde poate fi scrisă o instrucțiune amintește Algol68. "

De ce C++

Nume C++ inventat de Rick Massitti. Numele indică natura evolutivă a trecerii la acesta de la C. „++” este o operație de creștere în C. Nume puțin mai scurt C+ este o eroare de sintaxă; în plus, a fost deja folosit ca denumire a unei limbi complet diferite. Experți în semantică C găsi că C++ mai rău decât ++C. Titluri D limbajul nu l-a înțeles pentru că este o extensie a C și nu încearcă să-și remedieze problemele aruncând diverse caracteristici.

De ce a fost nevoie de C++?

Iniţial limbaj de programare C++ a fost conceput astfel încât autorul și prietenii săi să nu fie nevoiți să programeze în asamblare, C sau alte limbaje moderne de nivel înalt. Scopul său principal a fost de a face scrierea unor programe bune mai ușoară și mai plăcută pentru programatorul individual. Planul de dezvoltare C++ nu a existat niciodată pe hârtie; proiectarea, documentarea și implementarea s-au mutat simultan. Desigur, interfața externă C++ a fost scris în C++. Nu a existat niciodată un „Proiect C++” sau un „Comitet de dezvoltare C++”. De aceea C++ a evoluat și continuă să evolueze în toate direcțiile pentru a face față provocărilor cu care se confruntă utilizatorii și prin discuții între autor și prietenii și colegii săi.

C++ adevărat orientat pe obiecte

ÎN limbajul C++ Principiile programării orientate pe obiecte sunt pe deplin susținute, inclusiv cei trei piloni pe care se sprijină: încapsularea, moștenirea și polimorfismul. Încapsularea în C++ sprijinit prin crearea de tipuri de date non-standard (personalizate) numite clase. Limbă C++ susține moștenirea. Aceasta înseamnă că puteți declara un nou tip de date (clasă) care este o extensie a unuia existent.

Deşi limbaj de programare C++ pe bună dreptate numită continuare CUși orice program funcțional în limbaj CU va fi suportat de compilator C++, la mutarea din CU La C++ S-a făcut un salt foarte important. Limbă C++ a beneficiat de afinitatea sa cu limba CU de mulți ani, la fel de mulți programatori au descoperit că pentru a profita din plin limbajul C++, ei trebuie să dezînvețe unele dintre cunoștințele lor anterioare și să dobândească altele noi, și anume, să învețe un nou mod de conceptualizare și rezolvare a problemelor de programare. Înainte de a începe să înveți C++, Stroustrup și majoritatea celorlalți programatori care folosesc C++ luați în considerare învățarea limbilor străine CU opțional.

Limbajul de programare C++ este considerată în prezent limba dominantă folosită pentru dezvoltarea produselor comerciale, în care sunt scrise 90% din jocuri C++ folosind DirectX.

Literatură

Surse:

  • H.M.Deitel, P.J.Deitel „Cum se programează în C++”
  • Bjarne Stroustrup "Limbajul de programare C++. Ediția a 3-a."
  • Simon Robinson, Ollie Cornes, Jay Glynn și alții „C# pentru profesioniști”.
  • Jess Liberty „Învățați-vă C++ în 21 de zile”
  • Stanislav Gornakov „DirectX, lecții de programare în C++”

C++ (citiți c-plus-plus) este un limbaj de programare general compilat, tipizat static, în care puteți crea programe de orice nivel de complexitate.
De mai bine de 20 de ani, acest limbaj se numără printre cele trei cele mai populare și solicitate limbaje de programare. (Puteți verifica acest lucru vizitând site-ul web TIOBE).
Limbajul a apărut la începutul anilor 1980, când angajatul Bell Labs, Björn Stroustrup, a venit cu o serie de îmbunătățiri ale limbajului C pentru propriile nevoi.

Bjarne Stroustrup – creatorul limbajului C++

Stroustrup a decis să extindă limbajul C cu capabilitățile găsite în limbajul Simula. C, fiind limbajul de bază al sistemului UNIX pe care rulau computerele Bell, este rapid, bogat în funcții și portabil. Stroustrup a adăugat capacitatea de a lucra cu clase și obiecte. Ca urmare, problemele practice de modelare s-au dovedit a fi posibil de rezolvat atât în ​​ceea ce privește timpul de dezvoltare (mulțumită utilizării claselor similare Simula), cât și în ceea ce privește timpul de calcul (mulțumită vitezei lui C).
Iată cum vorbește însuși dezvoltatorul de limbaj despre asta:



În 1998, primul standard de limbă, cunoscut sub numele de C++98, a fost publicat de un comitet de standarde. C++ continuă să evolueze pentru a satisface cerințele actuale. Unul dintre grupurile care dezvoltă limbajul C++ și prezintă propuneri pentru îmbunătățirea acestuia către Comitetul pentru standarde C++ este Boost, care este angajată, printre altele, în îmbunătățirea capacităților limbajului prin adăugarea de caracteristici de metaprogramare. Cel mai recent standard a fost lansat în 2017 și se numește C++17. Următorul standard nu va întârzia să apară și este de așteptat să apară în 2020.
Nimeni nu deține drepturile asupra limbajului C++, este gratuit. În martie 2016, în Rusia a fost creat un grup de lucru WP21 C++. Grupul a fost organizat pentru a colecta propuneri pentru standardul C++, a le transmite unui comitet și a le apăra la reuniunile generale ale Organizației Internaționale pentru Standardizare.
C++ este un limbaj cu mai multe paradigme (de la cuvântul paradigmă - un stil de scriere a programelor de calculator), care include o gamă largă de stiluri și tehnologii de programare diferite. Este adesea clasificat ca un limbaj orientat pe obiecte, dar strict vorbind, nu este cazul. În timpul procesului de lucru, dezvoltatorul primește libertate absolută în alegerea instrumentelor, astfel încât problema rezolvată folosind o anumită abordare să fie rezolvată cât mai eficient posibil. Cu alte cuvinte, C++ nu forțează programatorul să adere la un singur stil de dezvoltare a programului (de exemplu, orientat pe obiecte).
C++ are o bibliotecă standard bogată care include containere și algoritmi obișnuiți, I/O, expresii regulate, suport multithreading și alte caracteristici. C++ a influențat multe limbaje de programare, printre care: Java, C#, D. Deoarece C++ aparține unei familii de limbaje bazate pe sintaxa limbajului C, puteți stăpâni cu ușurință alte limbaje de programare din această familie: JavaScript, PHP , Perl, Objective-C și multe altele. etc., inclusiv limba parentală în sine - C. ()
Pe parcursul existenței sale, limbajul C++ a dobândit mituri persistente care sunt ușor de infirmat (vezi aici: Partea 1 și Partea 2)

Istoria limbii și eliberarea standardelor

1983

Creatorul limbii este Björn Stroustrup, un angajat al Bell Labs, a introdus o versiune timpurie a limbajului C++ („C cu clase”)

1985

Prima lansare comercială a C++, limba își capătă numele modern

1986

Lansarea primei ediții a limbajului de programare C++ - o carte dedicată C++ scrisă de Björn Stroustrup

1998

Standardul internațional pentru limbajul C++ a fost ratificat: ISO/IEC 14882:1998 „Standard pentru limbajul de programare C++”

2003
2005

Raportul tehnic al bibliotecii 1 (TR1) a fost lansat. Deși nu face parte oficial din standard, raportul a descris extensii ale bibliotecii standard care ar trebui incluse în următoarea versiune a limbajului C++.

2011

Lansarea unui nou standard – C++11 sau ISO/IEC 14882:2011; noul standard a inclus completări la nucleul limbajului și extinderea bibliotecii standard, inclusiv cea mai mare parte a TR1

2014

Lansarea standardului C++14 („Standard internațional ISO/IEC 14882:2014(E) Limbajul de programare C++”); C++14 poate fi văzut ca o mică extensie peste C++11, care conține în mare parte remedieri de erori și îmbunătățiri minore

2017

Lansarea unui nou standard – C++1z (C++17). Acest standard a introdus multe modificări și completări. De exemplu, STD a inclus biblioteci ale standardului C11, un sistem de fișiere bazat pe boost::filesystem și cea mai mare parte a bibliotecii experimentale TS I.

2020

C++20 este numele neoficial al standardului ISO/IEC pentru limbajul de programare C++, care se așteaptă să urmeze C++17. Schiță de standard N4800.

Filosofia C++

În cartea sa The Design and Evolution of C++ (2007), Björn Stroustrup descrie principiile pe care le-a urmat atunci când a proiectat C++ (abreviat):

  • Obțineți un limbaj de uz general cu tipuri de date statice, eficiența și portabilitatea limbajului C.
  • Suportă direct și cuprinzător o varietate de stiluri de programare.
  • Oferă programatorului libertatea de a alege, chiar dacă îi oferă posibilitatea de a alege greșit.
  • Mențineți compatibilitatea cu C cât mai mult posibil, făcând astfel posibilă o tranziție ușoară de la programarea C.
  • Evitați discrepanțe între C și C++: orice construct care este valabil în ambele limbi trebuie să însemne același lucru în fiecare dintre ele și să conducă la același comportament de program.
  • Evitați funcțiile care depind de platformă sau nu sunt universale.
  • „Nu plătiți pentru ceea ce nu utilizați” - nicio caracteristică de limbă nu ar trebui să ducă la o scădere a performanței programelor care nu o folosesc.
  • Nu necesită un mediu de programare prea complicat.

C și C++

Sintaxa C++ este moștenită din limbajul C Deși, formal, unul dintre principiile C++ rămâne menținerea compatibilității cu limbajul C, de fapt, grupurile de standardizare pentru aceste limbaje nu interacționează, iar modificările pe care le fac nu. numai că nu se corelează, dar adesea se contrazic fundamental reciproc ideologic. Astfel, elementele pe care noile standarde C le adaugă nucleului se află în elementele standard C++ ale bibliotecii standard și nu sunt deloc în nucleu, de exemplu, matrice dinamice, matrice cu granițe fixe, facilități de procesare paralelă. Potrivit lui Stroustrup, combinarea dezvoltării acestor două limbi ar fi de mare beneficiu, dar este puțin probabil să fie posibil din motive politice. Deci compatibilitatea practică între C și C++ se va pierde treptat.
În acest exemplu, în funcție de compilatorul utilizat, va fi afișat fie „C++”, fie „C”:

Programul 9.1

#include int main() (printf("%s\n", (sizeof("a") == sizeof(char)) ? "C++": "C"); return 0; )

Acest lucru se datorează faptului că constantele de caractere în C sunt de tip int , iar în C++ sunt de tip char , dar dimensiunile acestor tipuri sunt diferite.

Modele ciclului de viață al aplicației

Ciclu de viață software-ul este o perioadă de timp care începe din momentul în care se ia o decizie privind necesitatea creării unui produs software și se termină în momentul în care acesta este complet scos din serviciu. Acest ciclu este procesul de construire și dezvoltare a software-ului. Există mai multe modele de ciclu de viață.
Model în cascadă ciclul de viață (modelul cascadă englezesc) a fost propus în 1970 de Winston Royce. Acesta prevede implementarea succesivă a tuturor etapelor proiectului într-o ordine strict fixă. Trecerea la etapa următoare înseamnă finalizarea completă a lucrărilor în etapa anterioară. Cerințele determinate în etapa formării cerințelor sunt strict documentate sub formă de specificații tehnice și sunt înregistrate pentru întreaga dezvoltare a proiectului. Fiecare etapă culminează cu lansarea unui set complet de documentație suficientă pentru a permite continuarea dezvoltării de către o altă echipă de dezvoltare.
Etapele proiectului conform modelului cascadei:

  1. Formarea cerințelor;
  2. Proiecta;
  3. Implementarea;
  4. Testare;
  5. Implementarea;
  6. Operare și întreținere.

În modelul în cascadă, trecerea de la o fază de proiect la alta presupune că rezultatul fazei anterioare este complet corect. În proiectele mari, acest lucru este aproape imposibil de realizat. Prin urmare, acest model este potrivit doar pentru dezvoltarea unui proiect mic. (W. Royce însuși nu a aderat la acest model și a folosit un model iterativ).
Model iterativ
O alternativă la modelul în cascadă este modelul de dezvoltare iterativă și incrementală (IID), care a primit de la T. Gilb în anii '70. denumirea modelului evolutiv. Modelul IID implică ruperea ciclului de viață al proiectului într-o succesiune de iterații, fiecare dintre ele seamănă cu un „mini-proiect”, incluzând toate procesele de dezvoltare aplicate la crearea unor piese mai mici de funcționalitate în comparație cu proiectul în ansamblu. Scopul fiecărei iterații este de a obține o versiune funcțională a sistemului software, inclusiv funcționalitatea definită de conținutul integrat al tuturor iterațiilor anterioare și actuale. Rezultatul iterației finale conține toată funcționalitatea necesară a produsului. Astfel, odată cu finalizarea fiecărei iterații, produsul primește un increment - un increment - la capacitățile sale, care, prin urmare, se dezvoltă evolutiv.


În majoritatea metodologiilor moderne de dezvoltare sunt implementate diverse variante ale abordării iterative:

Proces de dezvoltare - Proces rațional unificat (RUP)

Procesul rațional unificat (RUP)(proces unificat rațional) este o metodologie de dezvoltare software menținută de Rational Software (IBM). Metodologia oferă recomandări pentru toate etapele de dezvoltare: de la modelarea afacerii până la testarea și punerea în funcțiune a programului finalizat. Limbajul de modelare unificat (UML) este folosit ca limbaj de modelare.
Ciclul de viață complet al dezvoltării produsului constă din patru faze, fiecare dintre acestea incluzând una sau mai multe iterații.

  • Etapa inițială (începerea)
  • Determinarea sferei proiectului și a cantității de resurse necesare. Sunt determinate cerințele de bază, limitările și funcționalitatea cheie a produsului. Riscurile sunt evaluate. Planificarea acțiunii. La sfârșitul fazei inițiale, se evaluează atingerea Obiectivului Ciclului de viață, care presupune un acord între părțile interesate pentru continuarea proiectului.

  • Clarificare
  • Cerințe de documentare. Proiectarea, implementarea și testarea arhitecturii executabile. Clarificarea termenilor și costurilor. Reducerea riscurilor cheie. Finalizarea cu succes a fazei de dezvoltare înseamnă atingerea reperului arhitecturii ciclului de viață.

  • Constructii
  • În faza „Build”, cea mai mare parte a funcționalității produsului este implementată: proiectarea aplicației este finalizată, codul sursă este scris. Faza de construire se încheie cu prima lansare externă a sistemului și cu etalonul capacității operaționale inițiale.

  • Introducere
  • În faza de „Implementare”, versiunea finală a produsului este creată și transferată de la dezvoltator la client. Aceasta include un program de testare beta, instruirea utilizatorilor și determinarea calității produsului. Dacă calitatea nu corespunde așteptărilor utilizatorilor sau criteriilor stabilite în faza de Start, faza de implementare se repetă din nou. Realizarea tuturor obiectivelor înseamnă atingerea etapei de lansare a produsului și finalizarea întregului ciclu de dezvoltare.



"Tehnologia de informație. Inginerie de sistem și software. Procesele ciclului de viață al software-ului”. Acest standard a fost adoptat de Agenția Federală pentru Reglementare Tehnică și Metrologie a Federației Ruse și este similar cu standardul internațional ISO/IEC 12207:2008. Acest standard stabilește o structură generală a proceselor ciclului de viață al software-ului care poate fi urmată în industria software. Standardul nu propune un model specific de ciclu de viață. Prevederile sale sunt comune oricăror modele, metode și tehnologii ale ciclului de viață pentru crearea de software. Descrie structura proceselor ciclului de viață fără a specifica modul de implementare sau finalizare a activităților și sarcinilor incluse în acele procese.

Prezentare pentru lecție
Subiecte de mesaje
  • Free Software Foundation (FSF)
  • Licențe software gratuite
  • FreeSoftware și Open Source
  • Istoria dezvoltării limbajelor de programare
  • Istoria limbajului C și C++
  • Poveste
  • Critica C++
  • Istoria UNIX
  • Modelul ciclului de viață al software-ului în spirală
  • UML (Limbaj de modelare unificat)
  • Cadrul de soluții Microsoft
  • IDE pentru programare C/C++ pe Windows
  • Compilatoare C/C++
  • Crearea unei aplicații de consolă pe Windows
Întrebări
  1. De ce modelul cascadă al dezvoltării software nu este utilizat în proiecte mari?
  2. Care este diferența dintre modelele de dezvoltare în cascadă și cele iterative?
  3. Enumerați etapele dezvoltării software în metodologia procesului unificat rațional (RUP).