Programmēšanas paradigmas: imperatīvā, deklaratīvā, funkcionālā, objektorientētā

Iepazīstieties ar programmēšanas paradigmu salīdzinājumu — imperatīvā, deklaratīvā, funkcionālā un objektorientētā: principiem, piemēriem un pielietojumu.

Autors: Leandro Alegsa

Programmēšanas paradigmas ir veids, kā sagrupēt programmēšanas valodas pēc to darbības jomām. Valodas var būt vairāk nekā vienā paradigmā.

Dažās paradigmās tiek aplūkots koda izpildes veids, piemēram, blakusparādību atļaušana vai nepieciešamība veikt darbības noteiktā secībā. Citas paradigmas aplūko veidu, kā kods tiek grupēts, piemēram, kodu sadalot vienā vai divās daļās (vai daudzos mazos gabaliņos). Dažas citas paradigmas aplūko kārtību un daļas, kas veido programmu tādu, kāda tā ir.

Pastāv divas galvenās paradigmu grupas - imperatīvā un deklaratīvā. Viena valoda var būt abas vienlaikus; mūsdienu programmēšanas valodas bieži atbalsta vairākas paradigmas, ļaujot izvēlēties piemērotāko pieeju konkrētam uzdevumam.

Saturs

·         1 Imperatīvā programmēšana

·         2 Deklaratīvā programmēšana

·         3 Citas paradigmas

·         4 Pārskats

·         5 Paradigmu problēmas

·         6 Vēsture

o    6.1 Mašīnas kods

o    6.2 Proceduālās valodas

o    6.3 Objektorientēta programmēšana

o    6.4 Deklaratīvās paradigmas

·         7 Saistītās lapas

·         8 Atsauces

·         9 Citas tīmekļa vietnes

Imperatīvā programmēšana

Imperatīvajās programmās programmētāji datoram uzdod sakārtotu darbību kopumu, kas jāveic, lai kaut ko izdarītu. Ja kāds vēlas, lai dators uzzīmē kaķa seju, viņš varētu dot norādījumus, piemēram, "Uzzīmē apli šeit, uzzīmē divus mazākus apļus tur, uzzīmē divus trīsstūrus virsū" un tā tālāk. Imperatīvajām programmām dažkārt ir daudz blakusparādību.

Imperatīvā pieeja balstās uz stāvokļa (state) un izpildes soļu (statements) konceptiem: programma maina datu stāvokli pa soļiem, izmantojot piešķiršanas operācijas, ciklus un izvērtēšanas. Šī pieeja ir intuitīva, ja jāapraksta konkrētas darbības vai algoritmi, un tā bieži nodrošina labu veiktspēju un precīzu kontroli pār izpildi.

Pastāv divas galvenās imperatīvās paradigmas, un daudzos gadījumos valodai ir abas:

  • Strukturēts - datoram tiek doti norādījumi, kas vienmēr ir noteiktā secībā. Tādi soļi kā "atgriezties pie 3. soļa" (tā sauktie goto paziņojumi) nav atļauti.
    • Procedūras - Programma ļauj programmētājam dot nosaukumu rīkojumu sarakstam, kas šos rīkojumus pārvērš par "procedūru", kuru var izmantot vēlāk. Lielākā daļa strukturēto valodu arī ir procedurālas.
  • Objektorientēts - idejas datoram tiek skaidrotas, izmantojot objektus, koda daļas, kurām ir noteikts rīkojumu kopums un informācija par tiem.

Objektorientētā programmēšana (OOP) ir imperatīvas paradigmās bieži izmantota pieeja. Tā strukturē programmas kā objektu kopu, katram objektam ir dati (lauki) un uz tiem attiecināmas metodes (uzvedība). Galvenie OOP principi ir enkapsulācija, mantošana un polimorfisms. OOP ļauj labi modelēt reālās pasaules sistēmas un atbalsta koda atkārtotu izmantošanu un paplašināmību. Tipiski piemēri valodām, kas atbalsta imperatīvu vai OOP stilu: C, C++, Java, Python, C#.

Priekšrocības:

  • Precīza kontrole pār izpildes secību un resursu pārvaldību.
  • Plaša valodu un rīku ekosistēma, laba veiktspēja.
  • OOP sniedz strukturētu pieeju lielu sistēmu modelēšanai.
Trūkumi:
  • Blakusparādības un globālais stāvoklis var apgrūtināt programmu saprašanu un testēšanu.
  • Grūtāk paralelizēt kodu bez papildu piesardzības, ja tiek mainīts kopīgs stāvoklis.

Deklaratīvā programmēšana

Deklaratīvajās paradigmās programmētājs norāda datoram, kas jādara, nevis to darīt. Ja programmētājs vēlas, lai dators uzzīmē kaķa seju, viņš varētu dot norādījumus, piemēram, "Uzzīmē seju, uzzīmē divas acis, divas ausis un muti".

Deklaratīvā pieeja ļauj uzsvērt problēmas semantiku un atstāt izpildes stratēģiju izpildes laikam (kompilatoram vai izpildes videi). Tas veicina īsāku, vieglāk uzturamu kodu un ļauj automatizēt optimizācijas, jo izpildes iekārta var pārkārtot darbības, ja rezultāts nemainās.

Vispazīstamākās deklaratīvās paradigmas ir:

  • Funkcionāls - lielāko daļu darba veic funkcijas bez blakusparādībām.
  • Loģika - tiek izklāstīts faktu kopums, un tad tiek uzdots viens vai vairāki "jautājumi".
  • Notikuma vadīts - koda daļas tiek iestatītas tā, lai tās darbotos, kad notiek noteiktas lietas (piemēram, datora ieslēgšana).

Funkcionālā programmēšana uzsver nepārtrauktas un tīras funkcijas, kas nedara blakusparādības un bieži strādā ar nemainīgiem (immutable) datiem. Tas atvieglo paralelizāciju un kļūdu izolēšanu. Populāras funkcionālās valodas un stili: Haskell, Erlang, Lisp dialekti, OCaml, Clojure, Scala. Funkcionālajā pieejā bieži tiek izmantotas augstākā līmeņa abstrakcijas — augstākās pakāpes funkcijas, kompozīcija, piesegšana (currying) un lazy evaluation.

Loģiskā programmēšana (piem., Prolog) ļauj formulēt problēmu kā faktu un noteikumu kopu; izpildes vide meklē risinājumus, izmantojot atpakaļmeklēšanu un konsekvenču izslēgšanu. Deklaratīvais stils aptver arī valodas un tehnoloģijas kā SQL (datu vaicāšana), HTML/CSS (prezentācijas apraksts) — tajās tiek norādīts, kas jāsasniedz, nevis kā to soli pa solim izpildīt.

Priekšrocības:

  • Augstāks abstrakcijas līmenis — vieglāk izteikt sarežģītas domāšanas shēmas īsā formā.
  • Vieglāka testēšana un formalizācija, ja nav blakusparādību.
  • Labāka paralelizācijas un optimizācijas iespēja funkcionālajās valodās.
Trūkumi:
  • Dažkārt grūtāk precīzi kontrolēt veiktspēju vai zemu līmeņa resursus (piem., atmiņas pārvaldību) bez īpašām zināšanām.
  • Nākotnes izpildes stratēģijas atkarībā var radīt negaidītas sekas, ja netiek saprasts izpildes modelis (piem., lazy vs eager).

Citas paradigmas

Dažas paradigmas var atrast gan imperatīvajās, gan deklaratīvajās valodās. Šīs paradigmas parasti ir sastopamas kopā ar kādu no iepriekš minētajām paradigmām, nevis atsevišķi.

Papildus galvenajām grupām pastāv vairākas specializētas pieejas, kas risina noteiktus problēmjautājumus:

  • Notikumu vadīta (event-driven) programmēšana — izmanto klausītājus un notikumu apstrādātājus; plaši lietota lietotāja saskarnēs un tīmekļa serveros (piem., JavaScript, Node.js).
  • Paralēlā un konkurentā programmēšana — ietver modeļus kā pavedieni, procesa orientēta programmēšana, aktoru modelis (Erlang, Akka). Šie modeļi palīdz droši koordinēt vairākas izpildes vienības.
  • Datu plūsmas (dataflow) un reaktīvā programmēšana — programs tiek raksturota kā datu plūsma, kas tiek transformēta; piemērota strāvu apstrādei un reaģēšanai uz notikumiem.
  • Aspect-oriented — ļauj izdalīt šķērsgriezuma aspektus (piem., žurnālošana, kešošana) no pamatbiznesa loģikas.
  • Constraint un declerative constraint paradigmas — definē ierobežojumus, un iekārta atrod risinājumus, piemēram, prolog-stila pieejas vai optimizācijas rīki.

Pārskats

Paradigma nav tikai tehniska kategorija — tā ietekmē, kā programmētājs domā par problēmu, kā tiek organizēts kods, kādas kļūdas parasti parādās un kā tiek risināta uzturēšana. Prakse rāda, ka labākie risinājumi bieži sastāv no dažādu paradigmu kombinācijas — piemēram, galvenā programma var būt imperatīva, biznesa loģika funkcionāla, un konfigurācija deklaratīva (SQL vai konfigurācijas faili).

Izvēloties paradigmu vai valodu, jāņem vērā:

  • Projekta prasības (veiktspēja, paralēlisms, uzturēšana).
  • Komandas pieredze un esošā ekosistēma.
  • Rīku un bibliotēku pieejamība konkrētā valodā vai paradigmā.

Paradigmu problēmas

Nereti paradigmas mijiedarbība rada praktiskas problēmas:

  • Impedances disbalanss starp paradigmu prasībām — piemēram, objektorientēta datu modelēšana un relāciju datubāze (ORM problēmas).
  • Jauktas pieejas radītā sarežģītība — ja vienā projektā tiek izmantotas ļoti atšķirīgas paradigmas bez skaidras konvencijas, tas var apgrūtināt koda lasāmību un uzturēšanu.
  • Veiktspējas kompromisi — deklaratīvās abstrakcijas var slēpt intensīvas datu kopēšanas vai neefektīvas darbības, ja nav izpratnes par izpildes modeli.
  • Debugēšanas un profila rīku trūkums dažām mazāk izplatītām paradigmām vai valodu kombinācijām.

Vēsture

Programmēšanas paradigmas ir attīstījušās kopš datoru pirmsākumiem, reaģējot uz tehniskajām vajadzībām un jaunu ideju par labāku problēmu noformulēšanu.

Mašīnas kods

Sākumā programmas rakstīja tieši mašīnas kodā un asemblerī — tieši norādot, kādā secībā procesors veic instrukcijas. Tas deva lielu kontroli, bet bija smagi lasāms un viegli kļūdīgs.

Procedurālās valodas

Augstākā līmeņa procedurālās valodas (piem., Fortran, COBOL, Pascal, C) ieviestas, lai atvieglotu programmu strukturēšanu un atkārtotu izmantošanu, uzsverot procedūras/funkcijas un strukturētās kontroles konstrukcijas.

Objektorientēta programmēšana

OOP attīstījās, lai labāk modelētu sarežģītas sistēmas ar datiem un uzvedību kopā. Valodas kā Smalltalk, C++ un vēlāk Java popularizēja objektorientētu domāšanu plašākā mērogā.

Deklaratīvās paradigmas

Deklaratīvās pieejas (funkcionālās un loģiskās) tika attīstītas gan akadēmiskos, gan praktiskos virzienos. Funkcionālās valodas (Lisp, Haskell, ML) uzsvēra funkciju virs stāvokļa pārvaldības; loģiskā programmēšana (Prolog) demonstrēja jaunu veidu, kā izteikt problēmas un meklēt risinājumus.

Kopš tā laika valodas ir kļuvušas par hibrīdiem, kas apvieno labāko no vairākiem pasaules — mūsdienu programmētāji bieži izmanto imperatīvus, objektorientētus, funkcionālus un deklaratīvus elementus vienā projektā.

Šis īsais pārskats sniedz pamatu sapratnei par galvenajām paradigmu atšķirībām, to priekšrocībām un ierobežojumiem. Izvēloties paradigmu, svarīgākais ir orientēties uz problēmas dabu, komandas kompetenci un ilgtermiņa uzturēšanas prasībām.

Pārskats

Programmēšanas valodas tiek grupētas pēc paradigmām, tāpat kā mašīnas var grupēt pēc to izmantošanas veida.

Dažas valodas atbilst tikai vienai galvenajai paradigmai, piemēram,:

  • Smalltalk (objektorientēta)
  • Asambleja (imperatīva, bet ne strukturēta vai objektorientēta)
  • Haskell (funkcionālā valoda)
  • Prolog (loģika)

Lielākā daļa valodu ir vairāk nekā viena paradigma. Dažas no tām izceļas ar to, ka tām ir vairāk nekā viena:

  • Scala (objektorientēta, funkcionāla, paralēla)
  • Visual Basic (notikumu vadīta, objektorientēta)
  • Common Lisp (procesuālais, funkcionālais, objektorientētais, meta)
  • Shēmas (funkcionālās, procesuālās, meta)
  • Perl (funkcionālā, procesuālā, meta, objektorientētā, uz notikumiem orientētā)
  • Python (funkcionālais, objektorientētais, procedurālais)
  • Ruby (funkcionālā, objektorientētā, procesuālā)
  • Wolfram Language (funkcionālā, procesuālā, vispārīgi deklaratīvā)
  • Oz (loģiskais, funkcionālais, imperatīvais, objektorientētais)
  • F# (funkcionālā, imperatīvā, objektorientētā, meta)

Vairāk paradigmu ne vienmēr ir labi. Viens gadījums, kad mazāk paradigmu var būt laba lieta, ir tad, ja ir valoda, kas ir tikai funkcionāla. Šādā valodā funkcija dažreiz veic mazāk darba (piemēram, tikai tās grupas daļas, kas tai patiešām ir jāpārbauda), nekā tas būtu jādara, ja valoda būtu arī procedurālā valoda.

Daudzas programmēšanas paradigmas ir tikpat labi pazīstamas gan ar lietām, ko tās neļauj cilvēkiem darīt, gan ar tām, ko tās ļauj cilvēkiem darīt. Viens no gadījumiem, kad tas ir taisnība, ir funkcionālās valodas. Ja funkcionālā valoda ir tikai vai galvenokārt funkcionāla, tā parasti nepieļauj blakusparādības. Cits gadījums, kad tas ir taisnība, ir strukturētā programmēšana: tā atšķiras no parastajām imperatīvajām valodām, jo neļauj programmētājiem izmantot "goto paziņojumus" (paziņojumus, kas norāda programmai pāriet uz iepriekšējo soli). Šā un citu iemeslu dēļ cilvēki dažkārt uzskata, ka jaunās paradigmas nepieļauj pietiekami daudz lietu. Tomēr dažkārt ir labi, ja dators neļauj cilvēkiem darīt lietas: tas var palīdzēt cilvēkiem izvairīties no problēmām ar viņu kodu un ļaut datoram izdarīt minējumus, lai tas varētu ātrāk palaist kodu, vai pat pārbaudīt kodu, vai tajā nav problēmu, pirms tas darbojas!

Pārskats par dažādām programmēšanas paradigmām saskaņā ar Peter Van RoyZoom
Pārskats par dažādām programmēšanas paradigmām saskaņā ar Peter Van Roy

Paradigmu problēmas

Dažiem cilvēkiem, kas pēta programmēšanas valodas, nepatīk, ka programmēšanas valodu grupēšanai tiek izmantotas paradigmas, piemēram, Hārperam un Krišnamurti. Šie cilvēki saka, ka daudzas programmēšanas valodas nevar vienkārši sagrupēt paradigmās, jo valodas aizņemas lietas un idejas no daudzām paradigmām.

Vēsture

Laika gaitā ir radītas jaunas paradigmas, un cilvēki uz tām ir norādījuši vai nu tajā laikā, vai arī atskatoties atpakaļ. Viena no pirmajām paradigmām, kas tika atzīta par jaunu programmēšanas veidu, bija strukturētā programmēšana 20. gadsimta 60. gados. Ideja par "programmēšanas paradigmu" ir radusies 1978. gadā, ja ne agrāk, kad Roberts V. Floids (Robert W. Floyd) to izmantoja, mācot. Vārdu "paradigma" tā, kā to saprot Roberts, pirmo reizi lietoja Tomass Kūns savā grāmatā "Zinātnisko revolūciju struktūra" (1962).

Mašīnas kods

Viszemākā līmeņa (vistuvāk tam, kā datoram patīk saprast lietas) un vecākā programmēšanas paradigma ir mašīnkods, imperatīva paradigma. Mašīnkodā norādījumi ir tikai skaitļu kopums noteiktā secībā. Asamblēšanas valoda ir mazliet zemāka līmeņa (un mazliet mazāk veca). Asamblēšanas valodā datora norādījumiem ir doti mnemonikas vārdi (vieglāk iegaumējami nosaukumi), un atmiņas adresēm (norādījumiem, kā atrast kādu informācijas vienību datorā) var dot nosaukumus. Šīs valodas dažkārt sauc par pirmās un otrās paaudzes valodām.

Sešdesmitajos gados asemblera valodas tika uzlabotas, pievienojot jaunas lietas, piemēram, bibliotēkas COPY, makrokodus ("īpašā" koda daļas, kas pirms programmas palaišanas tiek pārveidotas par parasto kodu), palaides procedūras (norādījumu kopas, kurām tiek dots nosaukums un kuras tiek saglabātas vēlāk) un mainīgos (vienumus, kuriem tiek doti nosaukumi un kuri tiek saglabāti vēlāk) no ārpus programmas. Tas ļāva cilvēkiem izmantot kādu kodu vairāk nekā vienā projektā un neuztraukties par aparatūras specifiskām problēmām (problēmām, kas rodas tikai viena veida datoriem), pateicoties tādām komandām (norādījumu nosaukumiem) kā READ/WRITE/GET/PUT.

Asambleju izmantoja un dažkārt joprojām izmanto sistēmās, kurās ir svarīgi, lai kods būtu ātrs, un to daudz izmanto arī iegultajās sistēmās, jo tā ļauj lietotājam precīzi kontrolēt, ko mašīna dara.

Proceduālās valodas

Pagājušā gadsimta sešdesmito gadu beigās cilvēki sāka izgudrot procesuālās valodas. Šīm trešās paaudzes valodām (pirmajām no tām, ko tagad saucam par augsta līmeņa valodām) bija vārdi, kas bija saistīti ar to, ko tās mēģināja atrisināt. Piemēram,

  • COBOL (COmmon Business Oriented Language) - izmanto tādus vārdus kā file, move un copy.
  • FORmula TRANSLĀCIJA (FORTRAN) - izmanto matemātiskus vārdus un simbolus ( formas, ko izmanto rakstīšanā un drukāšanā). Tā tika izstrādāta galvenokārt zinātnei un inženierzinātnēm.
  • ALGOrithmic Language (ALGOL) - paredzēta algoritmu (soļu kopumu, kas datoram norāda, kas jādara) rakstīšanai. Tā izmanto matemātiskus vārdus un simbolus, tāpat kā FORTRAN.
  • Programming Language One (PL/I) - bija paredzēts, ka tā būs noderīga ikvienam.
  • Iesācēju universālais simbolisko instrukciju kods (BASIC) - izveidots, lai palīdzētu iesācējiem programmēt.
  • C - programmēšanas valoda, kas paredzēta daudzām lietām. Deniss Ričijs pie tās strādāja no 1969. līdz 1973. gadam AT&T Bell Labs.

Objektorientēta programmēšana

Pēc tam, kad daudzi cilvēki bija sākuši izmantot procedurālās valodas, tika izgudrotas objektorientētās programmēšanas valodas. Šajās valodās dati un to "metodes" (veidi, kā manipulēt ar datiem) ir apvienoti vienā "objektā". Daži programmētāji, piemēram, Ričards Stallmans (Richard Stallman), nepiekrīt, ka objektorientētās valodas ir labāk piemērotas ideju skaidrošanai datoram nekā procedurālās valodas.

Tā kā objektorientēta programmēšana ir paradigma, nevis valoda, cilvēki ir izveidojuši tādas objektorientētas asamblēšanas valodas kā HLA (High Level Assembly).

Deklaratīvās paradigmas

Tajā pašā laikā daži cilvēki izstrādāja deklaratīvās programmēšanas valodas. Valoda, kas ir labi pazīstama kā deklaratīvā valoda, ir SQL (valoda, kurā var pievienot un noņemt lietas no tabulām).

Saistītās lapas

  • Domāšanas veids
  • Tipa sistēma
  • Tjūringa pilnīgums

Jautājumi un atbildes

J: Kas ir programmēšanas paradigma?


A: Programmēšanas paradigma ir veids, kā sagrupēt programmēšanas valodas pēc to darbības veida.

J: Kādas ir divas galvenās paradigmu grupas?


A: Divas galvenās paradigmu grupas ir imperatīvā un deklaratīvā.

J: Ar ko atšķiras imperatīvā un deklaratīvā paradigma?


A: Imperatīvās paradigmas aplūko veidu, kādā kods tiek izpildīts, piemēram, pieļaujot blakusparādības vai nepieciešamību veikt darbības noteiktā secībā, savukārt deklaratīvās paradigmas aplūko veidu, kādā kods tiek sagrupēts, piemēram, sadalot kodu vienā vai divās daļās (vai daudzās mazās daļās).

Vai valoda var būt gan imperatīva, gan deklaratīva paradigma?


A: Jā, valoda vienlaikus var būt gan imperatīvā, gan deklaratīvā paradigma.

J: Kā programmēšanas paradigma sagrupē valodas?


A: Programmēšanas paradigmas sagrupē valodas pēc tā, ko tās dara. Tajās tiek skatīts, kā kods tiek izpildīts, kā tas ir sagrupēts un kādā secībā un no kādām daļām sastāv programma.

J: Vai bez imperatīvās un deklaratīvās programmēšanas paradigmas ir arī citi programmēšanas paradigmu veidi?


A: Jā, ir arī citi programmēšanas paradigmu veidi, ne tikai imperatīvā un deklaratīvā. Piemēram, dažas aplūko veidu, kādā kods tiek izpildīts (piemēram, pieļaujot blakus efektus), bet citas aplūko veidu, kādā kods tiek grupēts (piemēram, kodu sadalot vienā vai divās daļās).

Vai katra valoda pieder tikai vienam programmēšanas paradigmas veidam?


A: Nē, ne katra valoda pieder tikai vienam programmēšanas paradigmas veidam; dažas valodas var būt vairāk nekā viena veida paradigmas.


Meklēt
AlegsaOnline.com - 2020 / 2025 - License CC3