Curs 1. Introducere – Practică – Introducere în programare

By Alexandru Corbaru

Plan

Programarea calculatoarelor

Paradigme de programare

Evoluția limbajelor de programare

Caracteristicile C++

Compilare și interpretare. Depanare

Cum funcționeaza un compilator

Zona de COD și zona de DATE

Cum funcționează un flow normal (cod obj executabil)

Ce este un linker , care este rolul lui, de ce e nevoie de fișiere .h și si de ce nu se poate face totul cu un singur fișier, etc

Programarea calculatoarelor

Programarea este o activitate informatică de elaborare a produselor-program, a programelor (software) necesare.

Programarea conține următoarele subactivități: specificarea, proiectarea, implementarea, documentarea și întreținerea produsului program.

Este un proces ce conduce de la formularea unei probleme (de calcul) la un program executabil pe un calculator

Sarcini înrudite sunt testarea, depanarea, întreținerea codului sursă, implementarea sistemului construit, managementul acestuia etc; acestea pot fi considerate ca părți ale procesului de programare, dar cel mai adesea sunt asociate termenului de dezvoltare software

Ingineria software (ingineria programării) combină tehnici inginerești cu practici de dezvoltare software

În ingineria software, programarea (implementarea) este privită ca una din fazele procesului de dezvoltare software

Există o permanentă dezbatere dacă scrierea de programe este o formă de artă, un meșteșug sau o disciplină inginerească

Paradigme de programare

Paradigmele de programare reprezintă o modalitate de a clasifica limbajele de programare în funcție de caracteristicile lor.

Caracteristici

Programarea structurată este o paradigmă a programării apărută după anul 1970 datorită complicării crescânde a programelor de calculatoare. A apărut ca un model nou de programare, în scopul de a crea noi tehnici de programare apte de a produce programe care să fie sigure în funcționare, pe o durată mai lungă.

Exemplu programare nestructurată vs structurată pe tablă.

Programarea imperativă , în contrast cu programarea declarativă, este o paradigmă de programare care descrie calculul ca instrucțiuni ce modifică starea unui program. În aproape același fel în care modul imperativ din limbajele naturale exprimă comenzi pentru acțiuni, programele imperative sunt o secvență de comenzi pentru acționarea calculatorului. Programarea procedurală este o metodă obișnuită de executare a programării imperative și de aceea cei doi termeni sunt folosiți deseori ca sinonime.

Programarea declarativă este un stil de programare în care se descrie logica unui calcul, fără să se prezinte modul de execuție; programarea declarativă răspunde la întrebarea ce trebuie calculat și nu la întrebarea cum se face acest lucru. Programarea funcțională este o paradigmă de programare care tratează calculul ca evaluare de funcții matematice și evită starea și datele muabile. Se pune accent pe aplicarea de funcții, spre deosebire de programarea imperativă, care folosește în principal schimbările de stare. Programarea logică, programarea funcțională și programarea bazată pe reguli se înscriu în paradigma programării declarative. Exemplu programare logică pe tablă.

Programarea orientată spre obiecte (sau programarea orientată-obiect) este o paradigmă de programare, axată pe ideea încapsulării, adică grupării datelor și codului care operează asupra lor, într-o singură structură. Un alt concept important asociat programării orientate obiect este polimorfismul.

Videoclip de prezentare a paradigmelor de programare

Evoluția limbajelor de programare

Discuție despre evoluția limbajelor de programare în sala de curs

Arborele genealogic al limbajelor de programare

Despre C++

Istorie și origini

Este unul din cele peste 2000 limbaje de programare.

Originile C++ limbajele de programare de nivel scăzut (cod maşină, limbaje de asamblare) limbajele de programare de nivel înalt (C, ADA, COBOL, FOTRAN) programarea orientată pe obiecte

1979: Bjarne Stroustrup – Simula, C cu clase … ->

1983: C++ (comparat cu C) clase moştenire inlining (inline keywords și Class Member Functions) argumente implicite pentru funcţii verificare puternică a tipurilor funcții virtuale supraîncărcarea funcțiilor referințe cu simbolul & cuvântul cheie const

1998: STL, C++98 – primele standarde C++

2003, 2005, 2011, 2014 – C++03, C++0x, C++11, C++14

2017 – e plănuită o nouă revizuire

Caracteristici

uşor de programat (mai puţin timp de scris, mai scurt şi mai uşor de citit); dezbatere în sală

portabil – programele pot rula pe diferite calculatoare fără modificări sau cu puţine modificări

limbaj nesigur puternic tipizat (programatorul trebuie să ştie exact ce trebuie să facă)

acceptă atât variabile de tipuri definite explicit, cât şi deduse

acceptă verificarea statică (la compilare), dar şi dinamică a tipurilor (în timpul execuţiei programului)

oferă o gamă variată de paradigme de programare

colecţie foarte mare de biblioteci

limbaj ce acceptă mai multe paradigme de programare: generică: se pot folosi tipuri ce vor fi specificate mai tărziu şi vor fi instanţiate în funcţie de necesităţi structurată: control intuitiv (ordinea în care instrucţiunile sunt executate) imperativă: cum (secvenţe de instrucţiuni ce trebuie executate de calculator) orientată pe obiecte: obiecte + atribute + proceduri (metode) declarativă: ce (ce calcule trebuie făcute şi nu cum să fie făcute) funcţională: programele văzute ca evaluarea unor funcţii matematice

De ce C++

Puternic, flexibil (conversii)

Structurat

Portabilitate (Windows, Apple, Linux, UNIX)

Eficient, elegant

Perspective în alte limbaje de programare (discuție în clasă)

Limbaj al programatorului

De ce Code::Blocks ?

sunteţi obişnuit cu el din liceu (discuție în clasă)

gratuit

editor simplu și sugestiv

permite aranjarea automată a codului (Format use AStyle)

Compilare și interpretare. Depanare

Un fişier cod sursă poate fi compilat sau interpretat.

Compilare: codul sursă este translatat de un program (denumit compilator) în cod maşină, după care poate fi executat

Interpretare: un program este executat direct din cod sursă prin intermediul unui program (numit interpretor), care traduce și execută instrucțiune cu instrucțiune codul sursă

Exemplu la curs

Diferențe între compilator și intepreter

No Compilator Interpretor/Interpreter 1 Compilatorul ia întregul program ca intrare. Interpretorul (Interpreterul) ia fiecare instrucțiune ca intrare. (El traduce instrucțiune cu instrucțiune.) 2 Se generează un cod obiect intermediar. Nu se generează un cod obiect intermediar. 3 Instrucțiunile de control condiționale se execută mai rapid. Instrucțiunile de control condiționale se execută mai încet. 4 Necesarul de memorie: Mai mare (deoarece este generat un cod obiect (object code) Necesarul de memorie este mai redus. 5 Programul trebuie să fie compilat de fiecare dată. De fiecare dată un program de nivel înalt este convertit într-un program de nivel scăzut. 6 Erorile sunt afișate după verificarea întregului program. Erorile sunt afișate pentru fiecare instrucțiune interpretată (dacă sunt) 7 Examplu : C Compiler Exemple: Interpretor BASIC

Explicație video:

Schema compilării în C++

Pașii compilării în C:

1.Preprocesarea

Compilatorul elimină comentariile, înlocuiește macro-urile, copiază conținutul fișierelor incluse. Astfel se obține codul procesat.

2.Compilarea și asamblarea

În această etapă codul este inițial transformat în cod de asamblare, iar apoi acesta în cod mașină specific mașinii pe care se compilează. După acest pas se obține fișierul obiect corespunzător codului.

3.Linkarea

În acest pas toate fișierele obiect obținute în urma compilării sunt unite într-un singur fișier executabil. De asemenea sunt legate de fișierul executabil și toate librăriile externe incluse în cod.

Linker

Un linker este un program care face legătura între fișierele obiect obținute în urma compilării și librăriile externe, obținând un fișier executabil.

Librăriile pot fi legate în mai multe moduri:

Dinamic. Când aplicația este executată, sistemul de operare face legătura cu librăriile necesare.

Static. Fișierul executabil conține și codul librăriilor pe care le folosește.

Întârziat. Similar cu legarea în mod dinamic, dar librăriile sunt încărcate doar când aplicația are nevoie de ele (nu de la începutul execuției)

Fișiere header

Fișierele header (cu extensia .h) sunt fișiere care conțin declarații de funcții și definiții de macro-uri. Ele sunt incluse în program folosind #include. Incluzând un fișier header într-un program va face legătura între program și fișierul header la linkare, astfel putând folosi funcțiile din fișierul header fără a copia codul acestora. Utilitatea fișierelor header se observă mai ales când trebuie folosite aceleași funcții în mai multe fișiere de tip

Există două tipuri de fișiere header: scrise de utilizator și de sistem (cum ar fi librăriile incluse în compilator).

Cele scrise de utilizator se includ cu sintaxa #include „fisier.h”, iar cele de sistem cu sintaxa #include .

Depanare (debugging)

Bug – eroare de programare, greu de sesizat

Erorile de compilare: probleme suprinse de compilator, în general rezultând din încălcarea regulilor de sintaxă sau prin folosirea incorectă a tipurilor de date, alocării memoriei sau erori în etapa de link-editare ;

Erori din timpul rulării: programul nu face ceea ce te aştepţi să facă („calculatorul face ceea ce i-ai spus să facă, nu ceea ce ai vrea să facă”

Dacă limbajele de programare ar fi vehicule…

C a fost marele multi-funcţional: compact, puternic, merge oriunde şi de încredere în situaţii în care viaţa ta depinde de el.

C++ este noul C— de două ori mai puternic, de două ori mai mare, lucrează în medii ostile, dar dacă încerci să-l foloseşti fără atenţie şi fără antrenament special, probabil te vei prăbuşi.

C♯ este C++ cu mai multe caracteristici de siguranţă, astfel încât să îl poată folosi şi civilii obişnuiţi. Arată puţin stupid, dar are în cea mai mare parte aceeași putere, atât timp cât stai în apropierea pompelor de carburant, de magazine auto și de confortul civilizației.

Java este o altă încercare de a îmbunătăți C. Într-un fel îşi face treaba, dar e mult mai lent, mai voluminos, poluează peste tot, iar oamenii vor crede că ești un țărănoi.

Recapitulare

Discuție cu studenții

Bibliografie