Procedūrinė prieš deklaratyvinę
Tai yra pagrindinė schizma apibūdinti, kaip bus programuojama. Panagrinėkime kiekvieną variantą
atskirai.
Procedūrinis programavimas
Procedūrinis arba imperatyvusis programavimas naudotas pirmiausiai, nes jis artimas tam, kaip veikia
kompiuteris. Jis ima vieną instrukciją ir ją įvykdo. Programa tėra vykdomų instrukcijų sąrašas ir, iš esmės,
yra tam tikra procedūra (tarkim, skirta dviejų skaičių sudėčiai). Programavimas yra tiesiog nurodymas, ką turi atlikti mašina
sudėk du skaičius ir parodyk rezultatą - būtų procedūrinė programa, išreikšta lietuvių kalba.
Metams bėgant procedūrinis programavimas sudėtingėjo ir darėsi vis abstraktesnis. Nuo mašininių
komandų pereita prie vis labiau nutolstančių nuo aparatūros instrukcijų. Pagrindinis procedūrinių kalbų
vystymasis buvo funkcijų ir paprogramių hierarchijos sukūrimas. Jei ankstyvajame etape, pvz., rūšiavimas buvo realizuojamas
panaudojant registrus ir mašininio lygio vykdymo išsišakojimus, tai vėliau rūšiavimas įtrauktas kaip programavimo kalbos elementas.
Dideliu proveržiu procedūriniame programavime buvo objektiškai orientuoto programavimo (OO)
įvedimas. Tai leido duomenis ir procedūras sujungti į vieną paketą objektą. Iš praktinės pusės patogu
vienoje vietoje turėti duomenis ir kodą, kuris dirba su tais duomenimis. O kartu ir didelis postūmis
abstraktumo link. Kodas ima mėgdžioti realaus pasaulio objektus. Programiniai elementai turi būsenas ir elgiasi tarsi realūs objektai.
Tačiau tikrovė yra tokia, kad net daugybė OO kalbų naudojama nenaudojant objektų, - taip kaip buvo
senais gerais laikais. Galima sukurti įrankius, tačiau negalima priversti juos naudoti.
Deklaratyvusis programavimas
Jis remiasi idėja, kad paprasčiausiai išdėstoma problema bei tikslai leidžiant sistemai rasti būdus
pasiekti sprendimą. Pvz., duodami užduotį žmogui (užprogramuodami jį) paprastai užduoties nesuskaidote į atskirus žingsnius.
Reikia pastebėti, kad schizma tarp šių dviejų programavimo prieigų taikoma ir vartotojo sąsajos (UI)
kūrimui. Tokios kalbos kaip XAML ar MXML deklaratyviosiomis, nes parašoma UI specifikacija nesirūpinant,
kaip bus sukurti UI realizuojantys objektai. Procedūrinis būdas yra tam tikra tvarka iškviesti objektų konstruktorius ir nurodyti jų savybes.
Žinomiausi deklaratyvių kalbų variantai yra funkcinės ir loginės kalbos.
Funkcinės kalbos
Šios kalbos bando programavimo kalbas suvesti į matematines funkcijas, kurių rezultatas niekada
nesikeičia, pvz., sin(0.3) visada bus tas pats. Tad funkcija tiesiog yra išrinkimo veiksmas. Beje, matematinės
funkcijos skiriasi nuo funkcijų programavimo kalbose. Šios gali turėti šalutinių efektų ar būsenos pokyčių, pvz.,
function pliusvienas() {
globaluskintamasis++;
return globaluskintamasis;
}
Tokia funkcija yra neleistina funkcinėje kalboje. Joje kintamieji nėra kintamieji ta prasme, kad kartą
aprašyti savo reikšmę turi visą programos vykdymo laiką jie yra surišti su reikšme. Bet kaip tada ciklai ir sąlyginis programos vykdymas?
Yra du atsakymai. Pirma, kodėl skaičiuojate? Jei dėl to, kad tai algoritmo, kuris gražina sprendinį, dalis,
to nedarykite. Tiesiog gražinkite atsakymą. T.y., jei skaičiuojate sin(0.3) iteraciniu būdu, paslėpkite iteraciją
funkcijoje ir paprasčiausiai gražinkite atsakymą.
Antras atsakymas yra funkcinis būdas tokiam veiksmui atlikti rekursija ir funkcinė kompozicija. Pvz.,
funkcija f(x), gražinanti x+1, gali būti realizuota taip:
x=0;
y=f(x);
z=f(f(x));
ir t.t.
Atkreipkite dėmesį, kad išraiškoje z=f(f(f(f(x)))) tik kintamasis z yra surištas su
rezultatu, joks kintamasis nekeičia savo reikšmės. Iš principo, tokia funkcija veikia tarsi ciklas.
Funkcinės kalbos turi didelį privalumą tame, kad nenurodoma, kaip reikia atlikti funkcijas, o nurodomas
tik jų rezultatas. Jose aiškiau matoma, kas vyksta ir jose lengviau realizuoti tokius dalykus, kaip lygiagrečius skaičiavimus.
Loginės kalbos
Jos neretai artimesnės deklaratyviam idealui nei funkcinės kalbos. Jose irgi neleidžiama funkcijoms ar
kintamiesiems keisti reikšmių, tačiau jos turi vieną papildomą ingredientą įrodymą.
Šiose kalbose galite užrašyti:
arsusiję(A,B);
ir bus gražinta true, jei A ir B susiję, o kitu atveju - false. Tai veikia netgi tada, kai A ir B yra
susiję ne tiesiogiai, o per daugelį tarpinių sąsajų. Kalboje realizuota rekursyvi paieškos priemonė, kuri įrodo
teiginius priklausomai nuo to, kas yra jos duomenų bazėje. Tarkim, galite užrašyti:
arsusiję(A,x);
Kur x yra nesurištas kintamasis, - ir bus paieška bandys surasti tokią x reikšmę, kuriai teiginys
būtų true. Galima užrašyti apibendrintai
arsusiję(A,B,C, x,y,z);
Kad būtų ieškoma x,y,z, kuriems predikatas yra true.
Prolog kalba buvo sukurta 1972 m. Ji yra bendros paskirties kalba su įvedimo/išvedimo priemonėmis,
grafika ir pan. Tačiau daugelis programuotojų mano, kad ji kiek dirbtina dėl šalutinių reiškinių dirbant su
predikatais. Tačiau kai kurie uždaviniai loginėse kalbose išsprendžiami labai paprastai. Vis tik neaišku, ar
loginis programavimas nuves kur nors toliau.
Dinaminės kalbos
Truputį pasitrauksime į šalį nuo aptariamo klausimo. Dabar labai daug kalbama apie dinamines kalbas.
Tradicinės kalbos (Java, C++ ar C#) yra statinės kalbos. Tačiau ribą labai sunku nustatyti.
Anksčiau skirdavo pagal tai, ar kalbos kompiliuojamos, ar interpretuojamos. Šiuo metu didžiausias dėmesys skiriamas tipams.
Kuriant OO kalbą renkamasi, ar bus griežta tipų kontrolė. Griežtos tipų kontrolės kalbose griežtai
apibrėžiama,kokio tipo objektai gali būti naudojami. Jei metodo parametro tipas yra Obuolys, tai bus klaida,
jei pabandysime joje nurodyti Apelsinas tipo reikšmę. Alternatyva bet kurioje vietoje leisti bet kokio tipo
objektus ir pačiai kalbai pasirinkti, kaip geriausiai susitvarkyti tai silpna tipų kontrolė.
Statinėse kalbose galima pažiūrėti, kokia reikšmė bus priskirta kintamajam tiesiog skaitant programos
kodą. Dinaminėse to negalima, nes kas priskirta pasimato tik programos vykdymo metu. Silpna tipų kontrolė
ar dinaminės kalbos palengvina programavimą, tačiau neverčia laikytis programavimo disciplinos.
Ankstyvosiose kalbose nebuvo tikrojo duomenų ir kodo atskyrimo, kas leido programoms modifikuoti
savo kodą. Vėliau save modifikuojantis kodas įgavo reputaciją kaip pavojingas ir nesaugus. Kalbos atskyrė
duomenis ir kodą programoms leista manipuliuoti tik duomenimis, o ne savo kodu. Tačiau interpretuojamos kalbos,
pvz., Basic ar JavaScript ištrynė tą skirtumą. Jose leidžiama modifikuoti kodą tad jos tapo dinaminėmis platesne prasme.
Dinaminės kalbos gali atrodyti žingsniu į ateitį, tačiau tai ir sugrįžimas į ankstyvuosius laukinius laikus.
Grafinės kalbos
Paskutinė paradigma yra grafinės kalbos, jei jas aplamai galima vadinti kalbomis. Tai keistas OO ir
deklaratyvaus aspektų mišinys su trupučiu procedūriškumo. Idėja tame, kad jei mėgdžiojame realaus
pasaulio objektus, tai programiniai objektai turi įgauti vaizdą. Tai įprasta vartotojo sąsajų srityje mygtukas,
kurį galime nutempti ir pasidėti norimoje vietoje yra fizinis mygtuko objekto programinio kodo
pavaizdavimas. Su juo galima ekgtis kaip su realiu objektu tempti, keisti dydį, spalvą ir pan.UI grafiniai
objektų komponentinis požiūris vis dar kuriamas kaip ActiveX, WPF, Widgets ir t.t.
O jei tą patį principą pritaikysime programavimui. Gaunama ciklo, sąlyginio vykdymo, modulio ir kt.
komponentus. Programą surenkame tarsi UI sutempdami ir susiedami komponentus į vykdymo grandinę.
Tereikia vos kelių eilučių procedūrinio kodo, nurodančio tikslesnius veiksmus, tačiau dauguma komponentų susijungs vien per savybes.
Toks stilius naudojamos tokiose kalbose kaip Scratch, skirtose vaikams. O neseniai Google paskelbė
apie grafinio programavimo aplinką, skirtą Android tačiau ji dar tebetestuojama.
Ir galiausiai
Yra dar daug kitų programavimo paradigmų, tačiau jos daugiausia yra nuošalyje ir specialios aplinkoms.
Pvz., sinchroninis, asinchroninis ar įvykiais valdomas programavimas, taip pat nuoseklus ir lygiagretusis
skaičiavimas, yra dirbtinio intelekto (AI) ir programavimo sąveika. Pvz., naudojant genetinius algoritmus programa išsivysto, o ne parašoma.
Kiti HOT.LT straipsniai:
Kompiuterių ištakos
Ką vadiname programuotoju?
Programavimo kalbų evoliucija
Dėl kompiuterinio raštingumo
Džonas Bakas FORTRAN tėvas
Windows 11: negi vėl déja vu?
Unix ir C kalbos kiltis ir ... šachmatai
Technika: Nuo Paleolito laikų
Programavimo kalbų istorija
Lambda išraiškos Java į naują lygį
Optimali stulpelių eilės tvarka
Didelių duomenų analizės terminai
Aukšto lygio programavimo kalbų evoliucija
Intuicijos ribojimas matematikoje 19-me amžiuje
Pirmoji programuotoja: Ada Lovelace
Tikroji Interneto pabaiga
"Ruby" kalba ir RoR
Bilas Geitsas: kol dar nebuvo garsus
Danas Briklinas: skaičiuoklės autorius
P-NP: Ant sveiko proto svarstyklių
AWK kalba - sena ir nuolat aktuali
Ar mašina kada nors mąstys?
Programavimo kalbų klegesys
Mūšis kibernetiniame pasaulyje
Naujojo tipo mokslas
ARPANET istorija
Visata kaip kompiuteris
Kobolo motina
Haketonai
|