Atâta timp cât se cunosc bazele, ar trebui ca învățarea limbajelor de programare să fie relativ facilă. Dacă știm conceptele fundamentale, ar trebui să fie relativ simplu ca aceste cunoștințe să fie puse în practică folosind un anumit limbaj. Vom încerca să arătăm că programarea poate fi învățată pornind de la orice limbaj, atâta timp cât sunt însușite fundamentele.
Unii încearcă să învețe să programeze alegând un limbaj și învățând cum pot utiliza limbajul respectiv în diverse scopuri. Ei sunt capabil să realizeze produse din ce în ce mai complicate și, cel puțin până la un anumit punct, progresează destul de rapid. Dar, de multe ori, ei nu reușesc să își însușească acele concepte de bază de care programatorii "adevărați" au nevoie. Și, după câteva luni sau ani de practică, deși au realizat câteva aplicații frumușele, nu le e foarte clar ce e acela un vector, de ce e bine ca properietățile unui obiect să fie private etc. Pe lângă asta, le este foarte greu să treacă la un alt limbaj fiindcă li se pare că trebuie să învețe totul de la început.
Am folosit deja câteva cuvinte specifice programării (vector, obiect, proprietate, privat); sunt șanse foarte mari să nu știți ce înseamnă acestea (ar fi chiar de dorit). Dar, să sperăm că, în urma acestei serii de articole, după ce le veți înțelege, nu le veți uita. Aceste articole vor prezenta elementele de bază ale programării cu exemplificări în diverse limbaje de programare. Deocamdată am ales Java, JavaScript, C#, Swift, Python și Scala. Vom avea câte un episod pe săptămână, dar fiecare episod va avea șase variante. Conceptele vor fi aceleași, dar exemplele vor fi ilustrate în fiecare limbaj.
Astfel, pe lângă fundamente, vă veți putea alege și un limbaj cu care să începeți. Fiecare va avea o zi din săptămână dedicată (de luni până vineri). Puteți să propuneți limbaje noi...
Cui ne adresăm?
Această serie de articole se adresează în primul rând celor care nu au cunoștințe de programare. Dacă doriți să învățați un limbaj nou și cunoașteți elementele fundamentale ale programării, puteți trece la serialele pe care le vom publica pentru fiecare limbaj în parte. Pentru elemente simple de limbaj puteți să vă uitați peste exemplele din această serie, dar această serie nu are ca scop să vă învețe limbajul propriu-zis.
În cazul în care deja cunoașteți câteva limbaje de programare, dar considerați că aveți nevoie de împrospătarea cunoștințelor de bază, atunci puteți citi seria de articole. Eventual, puteți alege o variantă care folosește un limbaj pe care nu îl cunoașteți.
Dacă sunteți începător, atunci puteți alege unul dintre limbaje și veți putea trece destul de ușor la altul. Nu este recomandabil să încercați mai multe limbaje în paralel fiindcă la început vor apărea confuzii.
Ce vom prezenta?
Așa cum am spus, ne interesează conceptele fundamentale. Vom prezenta idei care să poată fi aplicate în orice limbaj pe orice platformă (dacă limbajul este disponibil pe mai multe platforme). Deși, ne vom concentra asupra unui singur limbaj, vom arăta pe scurt diferențele dintre limbaje, când este recomandabil să alegem un limbaj sau altul etc. Totuși, vom prezenta mai ales elemente comune tuturor limbajelor; această vă va permite să treceți cu ușurință de la un limbaj la altul.
Vom descrie bucle, condiții, variabile, obiecte (din nou, poate sunt cuvinte noi - le vom explica), vom vedea care este structura unui program, cum se execută un program sau ce se întâmplă "în culise". De asemenea, vom introduce diverși termeni care nu pot fi evitați în lumea programării (vom explica acele cuvinte noi care sunt menționate și vom introduce multe altele).
Dar, prezentările nu vor fi "teoretice", ci cu numeroase exemple practice; veți scrie cod începând cu primul episod (introducerea nu se numără).
Ce cunoștințe sunt necesare?
Majoritatea articolelor care își propun să învețe pe cineva programare precizează care sunt cunoștințele minime necesare. Am vrea să putem spune că nu trebuie să știți nimic, dar nu e chiar așa. De exemplu, avem nevoie să știți că două numere pot fi adunate și care este semnificația rezultatului, chiar dacă nu este neapărat necesar să știți exact cum se adună numerele. Am dus exemplul la extrem pentru a ilustra că, totuși, anumite cunoștințe minime sunt tot timpul necesare, chiar dacă se spune că studiul va începe de la zero. Probabil un copil de trei ani nu va putea urmări seria de articole; este posibil ca unul de șase să poată (dacă știe citi)...
Dar, pe lângă cunoștințele de bun simț, trebuie să presupunem că știți să folosiți un calculator. Nu vom prezenta cum se apasă pe iconițe, cum se instalează un program, cum se creează sau șterge un fișier etc. Pentru fiecare limbaj în parte vom descrie pe scurt mediul de programare, dar nu vom insista asupra acestor aspecte.
De asemenea, ne așteptăm să știți de ce platformă aveți nevoie pentru limbajul pe care îl alegeți. De exemplu, varianta Swift necesită probabil un MacBook, iar varianta C# un calculator cu Windows. Sunt alternative, dar nu pentru începători...
Ce este programarea?
Dacă dorim să învățăm să programăm, ar trebui să știm ce înseamnă programarea. Destul de simplu: scrierea de programe... Dar, nu am răspuns la întrebare; trebuie să știm ce este un program. Definițiile sunt multiple și interpretabile; majoritatea cad de acord că un program este o colecție de instrucțiuni. Se mai adaugă, uneori, că aceste instrucțiuni sunt executate într-o anumită ordine. Dar, nici asta nu ne spune mare lucru.
Totuși, programele sunt, într-adevăr, secvențe de instrucțiuni. O instrucțiune poate fi privită ca fiind o comandă dată calculatorului; aceste comenzi pot fi dintre cele mai diverse: adună numerele 24 și 57, scrie pe ecran Gazeta de Informatică, colorează o zonă a ecranului în albastru etc. Programele sunt formate din astfel de comenzi (instrucțiuni): unele conțin doar câteva, altele pot ajunge la milioane de comenzi. Probabil ne-am aștepta să reușim să ne scriem numele pe ecran din cinci instrucțiuni, dar ne putem imagina că scrierea unui joc ca StarCraft II necesită ceva mai multe. Dar, indiferent cât de complex este programul creat, el este format din aceleași tipuri de comenzi.
Unele definiții ale programului specifică faptul că instrucțiunile trebuie executate într-o anumită ordine pentru a obține rezultatul dorit. Să presupunem că dorim să scriem numărul 47 cu alb pe fond albastru. Avem la dispoziție o comandă C1 care colorează în albastru o zonă dreptunghiulară a ecranului, indiferent ce conținea înainte zona respectivă și o comandă C2 care scrie cu alb numărul 47. Probabil vă dați seama că vom obține rezultatul dorit executând prima dată C1 și apoi C2; dacă facem invers, vom avea pe ecran doar un dreptunghi albastru.
Așadar, este important ca instrucțiunile date să fie corecte și ca ele să fie executate în ordinea corectă. Dacă una dintre aceste condiții nu este îndeplinită, rezultatele pot fi surprinzătoare (de obicei dezastruoase). Se spună că un calculator face ceea ce îi spunem să facă, nu ceea ce vrem să facă.
Dar, cum arată astfel de comenzi? Depinde! Aici intră în scenă limbajele de programare. O aceeași comandă arată într-un fel într-un limbaj și altfel în altul, deși realizează același lucru. Este cam la fel ca în limbajul natural; un cuvânt în română și unul în engleză pot să însemne același lucru, dar de obicei arată diferit. Dar, unele cuvinte din română și engleză seamănă foarte mult; uneori sunt chiar identice. La fel se întâmplă și în cazul limbajelor de programare; putem să avem instrucțiuni foarte asemănătoare, chiar identice.
Am putea concluziona că programarea constă în abilitatea de a porni de la o anumită idee, a o împărți în "bucățele" mici și a scrie comenzile corespunzătoare acestor "bucățele" în limbajul de programare ales, în ordinea corectă.
Ce sunt limbajele de programare?
Pentru ca un calculator să execute un program, el trebuie să îl înțeleagă. Deocamdată, în ciuda zvonurilor propagate de filme ca Star Trek, calculatoarele nu înțeleg limbajul natural. De fapt, calculatoarele înțeleg doar un limbaj obscur, numit cod mașină. Noi nu putem folosi direct acel limbaj. Ar fi posibil din punct de vedere teoretic, dar nu și practic. Ar dura probabil câteva luni să scriem un program simplu. Limbajul mașină este, practic, o secvență de numere. O parte a unui program ar arăta cam așa:
1 2 3 4 |
00 06 00 72 67 02 00 70 28 55 00 00 0a 2c 0f 72 9f 02 00 70 28 56 00 00 0a 16 fe 01 2b 01 17 13 05 11 05 3a 12 02 00 00 00 16 0a 73 13 00 00 06 72 03 03 00 70 72 2b 03 00 70 72 39 03 00 70 17 |
Nici măcar nu sunt numere normale... Apar și litere. Nu vom insista asupra acestui aspect; veți înțelege la un moment dat de ce 2c este un număr.
Așadar, noi nu putem "vorbi" limbajul calculatorului și calculatorul (deocamdată) nu înțelege limbajul nostru. Avem nevoie de o soluție de compromis și aceasta este dată de limbajele de programare. Vom scrie programele folosind astfel de limbaje și, prin anumite modalități, programele vor fi traduse în limbajul calculatorului, iar aceste le va putea executa.
Există probabil mii de limbaje de programare. Tot timpul apar unele noi. Din fericire, doar câteva sunt "la modă". Așadar, va fi nevoie să știm doar câteva. Chiar dacă la un moment dat va trebui să cunoaștem un limbaj "obscur", totuși este puțin probabil să trebuiască să cunoaștem două sau mai multe. Și, dacă știm fundamentele programării, oricum ne va fi relativ simplu să învățăm un limbaj nou.
În momentul scrierii acestui articol, cele mai utilizate limbaje erau Java, C, C++, Objective-C, C#, JavaScript, PHP, Python, Visual Basic și Visual Basic .NET. Am ales patru dintre ele pentru seria noastră de articole. Al cincilea (Swift) este proaspăt "inventat" și, mai devreme sau mai târziu, ar trebui să înlocuiască Objective-C, iar al șaselea (Scala) este un limbaj care pare să fie din ce în ce mai folosit în domeniul Big Data. Am sărit peste C și C++ din cauză că ele sunt predate în școli, iar peste PHP din cauză că nu ne-am uitat la clasament în momentul în care am ales cele șase limbaje. Lista limbajelor preferate se modifică pe parcursul timpului, dar nu foarte des. Să nu vă imaginați că în fiecare an va trebui să învățați zece limbaje noi. Topul rămâne același pentru perioade lungi de timp și, doar din când în când, se "infiltrează" un limbaj nou.
Având în vedere că sunt mai multe, limbajele trebuie să fie diferite. În principiu, comenzile arată altfel în fiecare. Să vedem cum arată comanda care afișează mesajul Gazeta de Informatică în cele șase limbaje alese:
Java
1 |
System.out.println("Gazeta de Informatică"); |
C#
1 |
System.Console.WriteLine("Gazeta de Informatică"); |
JavaScript
1 |
alert('Gazeta de Informatică') |
Python
1 |
print "Gazeta de Informatica" |
Swift
1 |
println("Gazeta de Informatică") |
Scala
1 |
println("Gazeta de Informatică") |
Observăm că anumite limbaje ne permit să afișăm diacritice, în anumite limbaje comenzile par a fi asemănătoare cu anumite cuvinte din engleză, unele limbaje par să conțină cuvinte în plus, există anumite semne care par inutile (paranteze, ghilimele, apostroafe etc.). Așa cum vom vedea, fiecare are rolul său. Unele instrucțiuni arată la fel în mai multe limbaje (Swift și Scala în exemplele de mai sus).
Ce sunt mediile de programare?
Instrucțiunile care formează un program sunt numite codul sursă al acelui program. Acest cod sursă este un simplu text. Textul respectiv va fi transformat într-un fel sau altul în limbajul înțeles de calculator și programul va putea fi executat. Așadar, în principiu, pentru a scrie programe avem nevoie de un simplu editor de texte (de exemplu Notepad în Windows, TextExit în MacOS etc.).
Există editoare de text puțin mai prietenoase care ajuta programatorul. Anumite părți ale programului pot fi colorate în diverse moduri pentru ca semnificația lor să fie mai clară. Dar, codul sursă este același. Chiar și în cadrul acestor articole vom folosi instrumente similare pentru ca secvențele de cod să fie mai ușor de citit. De exemplu, o parte a unui program (nu trebuie să înțelegeți ce face programul respectiv) ar putea arăta așa:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Knuth { public static void amesteca(Object[] a) { Random random = new Random(); for (int i = 0; i < a.length; i++) { // se alege aleator una dintre pozitiile ramase int r = i + (int) (Math.random() * (a.length - i)); Object tmp = a[r]; a[r] = a[i]; a[i] = tmp; } } } |
Dar, de obicei, vom folosi un mediu de programare. Această aplicație ne va permite, de cele mai multe ori, să scriem programele, să folosim diverse instrumente ajutătoare în acest scop, să executăm programele respective, să le testăm, să ne dăm seama de ce nu funcționează conform așteptărilor etc. Există mai multe medii de programare pentru fiecare limbaj. Există și medii de programare care ne permit să folosim mai multe limbaje. În cadrul acestui serial, pentru fiecare limbaj, vom folosi un astfel de mediu de programare.