ABONAMENTE VIDEO REDACȚIA
RO
EN
×
▼ LISTĂ EDIȚII ▼
Numărul 48
Abonament PDF

Hiperspații în dezvoltarea software

Gelu Vac
Software Engineering Manager @ Crossover
PROGRAMARE


Există peste 700 de limbaje de programare și doar aproximativ 10 paradigme de dezvoltare software. Cum alegem la nivel de limbaj soluția de implementare pentru un proiect nou? Ce criteriu de evaluare folosim pentru a decide practic soarta noului proiect?

Ce sunt de fapt cele peste 700 de limbaje de programare? Or fi simple re-implementări ale aceluiași principiu cu mici diferențe sintactice? Cu siguranță, nu. Iar răspunsul este exact în spațiul paradigmelor de dezvoltare software. Respectiv în faptul că paradigmele de dezvoltare software nu se află într-o relație antagonică între ele, ci sunt ortogonale.

Câteva paradigme de dezvoltare software

Vorbim despre zone majore de concentrare din punctul de vedere al simbiotului CE avem de rezolvat (obiectul proiectului) și CUM poate fi rezolvat (reacția limbajului la o problemă concretă).

Paradigma programării imperative

În cazul acestei paradigme, fluxul de control este explicit: orice comandă arată pas cu pas cum are loc calculația și fiecare pas afectează starea generală a procesului de calculație.

Paradigma programării funcționale

Se bazează pe teoria funcțiilor matematice, mai exact pe calculații lambda. În această paradigmă fluxul de control este exprimat mai degrabă prin combinarea apelurilor de funcții decât prin atribuirea de valori variabilelor de lucru. Potențialul acestei paradigme vine din transmiterea funcțiilor în funcții (și returnarea funcțiilor din funcții).

Paradigma logic-declarativă

În această paradigmă, programatorul declară relațiile dintre date ca fapte sau reguli. De exemplu, faptele pot fi informațiile despre cine este supraclasa cui, iar regula poate fi o regulă logică, care să ateste că clasa A este bunicul clasei B, dacă A este părintele unei clase intermediare care este părintele clasei B.

Contrar altor paradigme de programare, nu vom construi soluția în paradigma de programare logică. Nu vom scrie funcții și nici nu vom da ordine imperativ. Pur și simplu vom descrie reguli care să definească relații dintre date și să solicite datele care satisfac regulile.

Paradigma programării orientată obiect

Această paradigmă este probabil cea mai des întâlnită în mediile comerciale. Separarea datelor și a acțiunii asupra datelor se pierde și se regăsește în această paradigmă. Este desigur o unificare artificială, dar utilă.

Un obiect are niște date interne și un set de funcții, numite metode. Este posibilă crearea mai multor replici (instante) ale unui obiect, după caz. Fiecare dintre aceste instante are propriul spațiu de date, unde obiectul își păstrează conținutul de informații private. Unele funcții ale obiectului pot fi apelate din alte părți ale programului care nu aparțin definiției obiectului. Mediul exterior nu poate accesa direct spațiul datelor, fiind privat, în schimb, le poate interoga prin apelul unei funcții care aparține obiectului. O astfel de funcție servește drept interfață, iar apelarea ei se numește transfer de mesaje.

Suplimentar acestui concept de ascundere a datelor, paradigma OOP presupune și alte idei, cum ar fi moștenirea, respectiv un programator poate întemeia definiția unui obiect pe unul deja definit. Caz în care, noul obiect moștenește toate definițiile obiectului existent și să le extindă sau să adauge altele noi.

Toate aceste caracteristici ajută la reprezentarea unor probleme reale cu mai multă ușurință și să generăm bucăți reutilizabile de cod, ameliorând mentenabilitatea volumelor mari de cod la care au participat zeci sau sute de programatori.

Paradigma programării concurente

Programarea concurentă este o paradigmă care intenționează să rezolve o problemă prin angajarea concurentă a mai multor procesoare. Fiecare procesor va acționa independent asupra task-ului atribuit și va rezolva o parte a problemei, iar ulterior, soluțiile parțiale ale fiecărui procesor sunt combinate pentru a contura soluția finală.

Punctul central al acestei paradigme este de a gestiona fluxul corect al controlului precum și datele spre și dinspre aceste bucăți de cod care rulează independent.

Paradigma programării bazată pe evenimente

Din perspectiva acestei paradigme, universul programării constă în evenimente și acțiuni legate de aceste evenimente. Când apare un eveniment, acțiunea legată de el este acționată automat. Această acțiune poate efectua unele calculații, dar și să acționeze alte evenimente. Rolul unui programator este să creeze un design al acestui mecanism de reacție de ceasornic în lanț și să implementeze acțiunile ca bucăți unitare de program (funcții).

O astfel de arhitectură trebuie să servească tuturor tipurilor de evenimente care pot să apară, să evite deadlock-urile și să administreze orice eveniment în timp ce se desfășoară o altă acțiune.

Această paradigmă se utilizează extensiv în aplicațiile cu GUI generos.

Definirea unui hiperspațiu

Orice spațiu se definește printr-un set de axe. Axele unui hiperspațiu de programare îl reprezintă paradigmele de programare. Nu este ușor, dar cu puțin efort ni-l putem imagina. În interiorul lui, putem reprezenta sub formă de nori orice limbaje de programare, în funcție de cât de mult suportă un anumit limbaj o anumită paradigmă. Respectiv, norul va fi localizat mai aproape sau mai departe (sau deloc) pe axa reprezentată de acea paradigmă.

Pentru un exemplu simplu, putem alege doar trei paradigme, și deci un spațiu tridimensional, în care să evaluăm trei limbaje low-level. Forma norilor, mai alungită sau mai lățită nu este întâmplătoare, ci urmărește desfășurarea ponderii limbajului între axele hiperspațiului.

Mai mult, vizualizăm hiperspațiul ca nori și nu ca puncte, deoarece:

  1. vorbim de concepte fuzzy care nu pot fi cuantificate printr-un singur scalar. Pur și simplu, nu este rezonabil să spui că C este 81% funcțional (și nu 80% sau 82%).

  2. Există un factor suplimentar care provine de la programator prin stilul propriu de codare. Unele persoane pun accent mai mare pe utilizarea funcțiilor, iar alte persoane sunt mai interesate de supralicitarea calculațiilor produsă prin apelarea funcțiilor și încearcă să fie mai imperativă.

Deci amprenta personală a programatorului se circumscrie în interiorul norului, dar gravitează dinamic.

O întrebare decentă este dacă există vreun limbaj de programare care să ,,tangenteze" toate paradigmele? respectiv există vreun nor care să aibă valori ridicate pe toate axele din hiperspațiu? Iar răspunsul este în labirintul minotaurului, respectiv cât de mult acceptăm ideea creaturilor supra-realiste.

Adevărul este că realizarea unui super-limbaj s-ar bloca pur și simplu într-un conflict de cerințe, pe care chiar dacă le-ar depăși, n-ar fi suficient de versatil, rapid, portabil, etc. . Această realitate este motivul pentru care limbajele actuale de programare acoperă două, maxim trei paradigme.

Cum să alegem un limbaj de programare pentru o implementare?

Toate paradigmele, toate limbajele de programare și chiar toate procesoarele sunt Turing-Echivalente. Adică două calculatoare P si Q sunt turing-echivalente dacă P poate simula Q și Q poate simula P.

Mai explicit: un om ajutat de o lopată și un buldozer sunt echivalenți cât timp reperul de evaluare este mutarea unui volum de pământ. Cheia apare, însă, în ceea ce numim "eficiență" și "ușurință". Dar turing-echivalența nu menționează aceste concepte, ci la potențialul de îndeplinire a misiunii.

Contează, deci, să alegem un limbaj bazat pe considerente de eficiență și ușurință. Practic, luăm zilnic decizii bazându-ne pe aceste considerente.

Există totuși, mai mulți factori în alegerea paradigmelor limbajelor de programare:

A. Domeniul și natura tehnică a problemei (obiectiv)

B. Cultura producătorului de software (subiectiv)

C. Constrângeri impuse de circumstanțe:

D. Moda. Ce se poartă. Vrând nevrând, trendul curent ne influențează alegerea limbajului de programare din mai multe motive:

Bibliografie

  1. Milena Vujosevic-Janicic si Dusan Tosic, "THE ROLE OF PROGRAMMING PARADIGMS IN THE FIRST PROGRAMMING COURSES", THE TEACHING OF MATHEMATICS, 2008, Vol. XI, 2, pp. 63-83
  2. Anil Ananthaswamy, "Beyond space and time: 10D - String country", New Scientist, 26 August 2009
  3. Stephen H. Kaisler, "Software paradigms", Wiley-Interscience, 2005
  4. Gokturk Ucoluk si Sinan Kalkan, "Introduction to programming concepts with use cases in Python", Springer, 2012

LANSAREA NUMĂRULUI 92

Prezentări articole și
Panel: Tehnologii embedded

Sponsori

  • comply advantage
  • ntt data
  • 3PillarGlobal
  • Betfair
  • Telenav
  • Accenture
  • Siemens
  • Bosch
  • FlowTraders
  • MHP
  • Connatix
  • MetroSystems
  • BoatyardX
  • Colors in projects