Tikiu, kad nemažai iš jūsų mokat ar bent jau esat matę vieną ar kitą programavimo kalbą. Tačiau kaip ir visų inžinerinių objektų istorijoje, iki dabartinės situacijos vedė ilgas ir nelengvas kelias. Programavimas pradėjo vystytis su pirmaisiais programuojamais pianinais, o programavimas šiandienos plačiąja prasme atsirado su pirmosiomis elektroninėmis skaičiavimo mašinomis. Šiandien programavimo kalbų evoliucija skirstoma į penkias kartas (generations), kurias dėl įdomumo ir bendro išprusimo norėčiau trumpai pristatyti.
1 karta (1GL)
Pirmosios kartos programavimo kalba yra niekas kitas kaip tiesioginis mašininis kodas, kurį procesorius vykdo tiesiogiai. Pagrindinis pliusas – tokios instrukcijos veikia nepaprastai greitai ir efektyviai, tačiau galit suvokti, kiek pastangų reikia sukurti rimtesnę užduotį kremtančią procedūrą. Dviejų skaičių sumavimo operacija atrodytų taip:
000000 00001 00010 00110 00000 100000
Reikia pridurti, kad ir su kokia programavimo kalba šiandien tenka susidurti, visų jų galutinis variantas prieš įvykdant kompiuteryje yra tokio formato – mašininis kodas.
2 karta (2GL)
Antrosios kartos kalbos pradėjo rastis praėjusio amžiaus 6-ajame dešimtmetyje. Tai vadinamos “žemo lygio” (low-level) programavimo kalbos, padėjusios lengviau suvokti programų darbą. Trumpai antroji karta tai – asembleriai. Nors asembleris ir paspartino darbą programuotojams, tačiau tai dar nebuvo įrankis, leidžiantis be didelių pastangų tobulinti programas ir taisyti klaidas. Teko ir man susidurti su asembleriu praėjusį semestrą universitete, bet daugeliui programuotojų toks kodas gali vis dar atrodyti akmens amžiaus kūrinys (pateikiamas “Hello world” fragmentas):
assume cs:cseg, ds:dseg, ss:sseg mov ax,dseg mov ds,ax ;duomenu segmento iniciavimas lea dx, welcome mov ah, 09h int 21h mov ah,4ch int 21h
Šiandien asembleris vis dar naudojamas situacijose, kur reikalingas išskirtinis greitis ir optimizavimas, pavyzdžiui, Linux kernelis parašytas su C (kuris vadinamas dar ir aukšto lygio asembleriu) ir dalis – asembleriu, taip pat žaidimuose, šifravimo, duomenų spaudimo ir panašiuose programavimo uždaviniuose.
3 karta (3GL)
Trečiajai kartai priskiriamos aukšto lygio (high-level) programavimo kalbos, kurių išeities kodą jau nėra sudėtinga perskaityti ir taisyti. Galima sakyti, kad šios kartos programavimo kalbų atsiradimas buvo tam tikras lūžis programų sistemų kūrimo procese. Jos jau palaikė struktūrinį programavimą, o vėlesnės trečios kartos programavimo kalbos ir jų versijos – jau ir objektinį programavimo modelį. Pirmosios trečios kartos kalbos pristatytos dar penktojo dešimtmečio pabaigoje – šeštojo dešimtmečio pradžioje: Fortran, ALGOL, COBOL. Šiandien geriausiai žinomos šios kartos kalbos yra C, Delphi, Java ir pan. Šios priemonės jau leido programai atitrūkti nuo procesoriaus tipo ir kartais nuo naudojamos aplinkos. Pavyzdžiui – paprasta Java programa:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Reader { public static String readInputLine() { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { return in.readLine(); } catch(IOException e) { e.printStackTrace(); return "b"; } } }
4 karta (4GL)
Ketvirtosios kartos kalbos pasižymi dvejomis savybėmis – orientuotos į konkretų tikslą/problemą/sritį ir jų išeities kodo struktūra ir sakiniai panašūs į įprastos žmonių kalbos struktūrą. Taip buvo siekiama sumažinti sugaištamą laiką ir kainą, norint įgyvendinti tam tikras programavimo užduotis. Šiandien jos dažniausiai naudojamos duomenų bazių programavime ir skriptuose. Ketvirtos kartos kalbos: DataFlex, SQL, MATLAB, OpenRoad ir panašios kalbos, akcentuotos į konkrečios srities užduotis. SQL pavyzdys:
SELECT name, surname FROM people WHERE age > 18
5 karta (5GL)
Penktosios kartos apibrėžimų internete galite rasti keletą. Vienas iš jų: tai tokios programavimo kalbos, kurios turi grafines pagalbines priemones, padedančias programuoti. Tačiau mano kuklia nuomone teisingesnis šis variantas: penktosios kartos kalbos paremtos idėja, kad problemą išspręs kompiuteris, kuriam tereikės nurodyti apribojimus, o algoritmą sukurs pati mašina. Ketvirtoji karta buvo orientuota į specifines programas, o penktoji karta į tai, kad kompiuteris užduotis spręstų už jus. Penktosios kartos kalbos šiuo metu daugiausia naudojamos dirbtinio intelekto tyrimuose. Dešimtajame dešimtmetyje tokios kalbos buvo laikomos ateities kalbomis, kurios pakeis visas iki šiol egzistavusias programų kūrimo priemones. 1982-1993 metais Japonija investavo į penktosios kartos sistemos tyrimą ir kūrimą, tikėdamasi, jog tai bus ypatingo našumo sistema su dirbtiniu intelektu. Deja, kuo didesnės programų sistemos buvo kuriamos, tuo akivaizdžiau buvo, jog automatinis efektyvaus algoritmo parinkimas yra labai sudėtinga užduotis ir to vis dar neįmanoma pilnai automatizuoti, t.y. vis dar yra reikalingas žmogaus programuotojo įsikišimas.
Šiandien penktosios kartos idėjinės šlovės dienos jau praeityje ir šios kalbos yra naudojamos beveik vien akademiniuose tyrimuose ir darbuose. Geriausiai žinomos 5GL kalbos yra Prolog, OPS5, Mercury. Mercury “Hello world” pavyzdys:
:- module hello. :- interface. :- import_module io. :- pred main(io::di, io::uo) is det.:- implementation. main(!IO) :- io.write_string("Hello, World!\n", !IO).
Tarp kitko, 5GL idėja paremtu komponentu galima vadinti plačiai paplitusią priemonę regexp (Regular Expression) – vietoje to, kad apibrėžinėtumėte paieškos algoritmą, nurodote tik taisykles, kuriomis remiantis bus įvykdyta paieškos tekste užklausa.
end.
Štai taip skirstomos programavimo kalbos. Vis dar akivaizdu, jog nėra tokio algoritmo, kuris pakeistų silpniausią, bet vis dar nepakeičiamą tarpinę tarp klaviatūros ir kėdės – žmogų.



15 nuomonių
Įrašo komentarų RSS Grįžtamasis adresasLabai informatyvus ir įdomus straipsnis. Daug naujo sužinojau.
O kuriai kartai priklauso PHP? 3?
Ačiū :-) Taip, manyčiau PHP priklauso trečiai kartai. Taip pat Perl, Python, Ruby, ASP ir t.t.
Trečiąją kartą reikia skirstyti dar į dvi dalis. Tai vien tik funcijom paremtos programavimo kalbos (tokios kaip C, Basic) ir objektinės kalbos (C++, Delphi, Java, C#). Šuolis tarp funkcinių ir objektinių programavimo kalbų buvo didžiulis.
Interpretatoriai tokie kaip PHP, Perl ir pan yra dar viena visiškai skirtingą programavimo kalbų rūšis, turinti gana specifinę paskirtį – web programavimą. Pati PHP turėjo nemažai pereiti, kol išsivystė iki kalbos, kokia yra dabar. Kiek žinau PHP6 turės ir namespac’us.
Taip, galima trečiąją kartą dar suskirstyt, bet visų 3GL pagrininis tikslas nėra specifinis. Toks kartų skirstymas, kiek pastebėjau, remiasi keliais punktais – į ką priemonės orientuotos ir abstraktus vertinimas kaip tai priimtina vartotojui. Taip vienos kartos kalbos gali labai skirtis, pavyzdžiui C, kuris viena koja yra antroje kartoje, ir Java. Apskritai, galima būtų dar vieną straipsnį parašyti apie programavimo kalbų skirstyma pagal paradigmas :-)
Būtent dėl interpretuojamų kalbų paskirties (nors Perl nėra skirtas web programavimui – tarp kitko) galima suabejoti kur priskirti kai kurius jų egzempliorius. Pavyzdžiui Ruby – nors nėra specifinės srities kalba, tačiau ja galima rašyti 100% human-readable kodą. Sakyčiau, viena koja ketvirtoje kartoje.
„Reikia pridurti, kad ir su kokia programavimo kalba šiandien tenka susidurti, visų jų galutinis variantas prieš įvykdant kompiuteryje yra tokio formato – mašininis kodas.“
Manau, kad tai netiesa. Kompiliuojama kalba virsta mašininiu kodu, interpretuojama, sakyčiau, ne.
Raimundai, procesorius supranta vienintelę kalbą – vykdo instrukcijas pagal mašininį kodą.
Ar virsta mašininiu kodu SQL užklausos? Ar mašininiu kodu verčiamos ekselio formulės? Ar juo virsta worde vykdoma makroprograma, pažyminti eilutę ir uždedanti BOLD?
Šiek tiek pamąstykite…
Susitarkime apie ką kalbame. Interpretuojama kalba tai pvz Perl, Ruby, taip pat Python, PHP (tik jos turi tarpinį kodą kaip Java).
Interpretuojamos kalbos definicija: “An interpreted language is a programming language that is compiled into _machine readable code_ at the moment it is run by the languages interpreter.”
Taigi, akivaizdu dėl šių dalykų, turint galvoje kad mašina gali skaityti tik dvejetainę komandą (1GL).
O dėl SQL, excelio ir makrokomandų – nėra sudėtinga pasekti supaprastinta grandine – formatas nuskaitomas apdorojimo programos, kuri instrukcijas verčia mašininiu kodu.
Tereikia suprasti, kad kompiuteris procesų vykdymo ir informacijos kaupimo atžvilgiu yra labai primityvus – viskas saugoma ir valdoma dviejų simbolių pagalba – 0 ir 1, o jeigu būti dar tikslesniam – elektros grandinės atidarymu/uždarymu. Kiekvienas menkiausias veiksmas galutinėje būsenoje yra dvejetainis kodas ir kiekvienas informacijos bitas, ar tai būtų filmas ar čia krentanti snaigė – taip pat. O ar tai komanda, ar informacija – susitarimo (interpretacijos) reikalas.
Taigi nėra nieko čia kažko “iš aukščiau”.
Šiaip jeigu domina kaip kompiuteris veikia žemame lygmenyje, galima ta tema ir straipsnį parašyti :-)
Definicija tereiškia loginį atskyrimą, bet ji visai neįrodo, kad SQL sakinys virsta kodu.
Įsivaizduokite kokios nors kalbos interpretatoriumi (A) parašytą kitos kalbos interpretatorių (B). Kurios kalbos sakiniai virsta mašininiu kodu, vykdant B kalba parašytą programą? Ar pajėgtumėte konkrečią bitų seką priskirti „vertimui“ iš B ar A?
Ar virsta mašininiu kodu vartotojo Wordui duodama komanda „bold this“?
Dėl A ir B: ne, turbūt nesugebėtume, tačiau tai yra tas galutinis rezultatas, tad koks skirtumas per kiek kompiliatorių, linkerių ir interpretatorių linijų ta komanda ėjo?
Aš turiu galvoje galutinį rezultatą, o ne sekančią tarpinę stotelę interpretuojant komandą. Juk tiek SQL sakinys, tiek Wordo “bold this” pereina daugelį etapų bet jų visų kulminacija viena – komanda procesoriui sudėti skaičių, nuskaityti atminties bloką ir perduoti valdymą kitos paprogramės kodo segmentui.
Manau suprantu, ką norite pasakyti, bet aš turėjau omenyje visišką “pirmykštę” būseną.
Che.
Ar virsta mašinine komanda kompiuterinį žaidimą žaidžiančio vaiko judesys džoistiku? Skaitykite šaltinius ne paraidžiui, o kritiškai ir kūrybiškai, o kol to neišmokote, gal susilaikykite nuo „straipsnių rašymo“?
Juk įmanoma situacija, kai „aukšto lygio programavimo kalbos“ konstrukcijos jokiu kodu nevirsta, jos tik yra interpretatoriumi apdorojami duomenys, nulemiantys kodo, kuriuo parašytas kalbos interpretatorius, veikimą.
To Raimundas Zabarauskas:
Nesuprantu, kas užkliuvo Jum? Atrodo Jus žeidzia pats faktas, kad viskas gali virsti tik 0 ir 1 grandine (įskaitant džoistiko judesius ir šito komentaro raides)?
Vidmantas kalba apie galutini rezultata, kuris keliauja į kompiuterio procesorių būtent 0 ir 1 pavidalu.
P.S. “Skaitykite šaltinius ne paraidžiui, o kritiškai ir kūrybiškai, o kol to neišmokote, gal susilaikykite nuo „straipsnių rašymo“?”
O kas jei šaltinis yra tai ,į ką kūribiškai nepažvelgsi(pvz: medžiaga skirta pasiruošt egzaminui)?
Neskubėkit smerkti.
Raimundai, manau nereika jum aiškinti, kad net pelės pajudinimas reikalauja procesoriaus darbo, kad perpieštų į naują poziciją. Kiekvienas “pirstelėjimas” kompiuteryje – 0 ir 1 seka. Nebesikartosiu.
Dėl antros dalies – taip, sekantis etapas nebūtinai iškart yra mašininis kodas. Tačiau duomenų apdorojimo rezultatas – tiek tam apdorojimui, tiek rezultato pateikimui – bus pasitelktas mašininis kodas, kurio veikimo logika bus daugiau ar mažiau tiesiogiai nulemta to, kas buvo parašyta aukščiausiame lygyje.
Atrodo, kad jus šiek tiek žeidžia, kad kompiuterį valdo 0 ir 1 sekos :-) Jau sukurtoje, de facto architektūroje kūrybiškumo nebėra, tėra realizacija.
Manau nebėra mums ko ginčytis, nes jūs žvelgiate vienu žingsneliu anksčiau proceso vykdymo atžvilgiu, o aš tenoriu pasakyti, kad bet kokios kalbos parašytos instrukcijos neįmanoma įvykdyti be mašininio kodo, ko negalite neigti. Ar jis bus sugeneruotas tiesiogiai – ar per baigtinį skaičių “tarpinių” procesų – net ne diskusijos klausimas.
Labai atsiprašau dėl savo užgaulokos ironijos, kuri čia tikrai buvo visai ne vietoje.
Greičiausiai be reikalo užsipuoliau ir cituojamą sakinį: „Reikia pridurti, kad ir su kokia programavimo kalba šiandien tenka susidurti, visų jų galutinis variantas prieš įvykdant kompiuteryje yra tokio formato – mašininis kodas.“
Taip, kuria kalba berašytum programą, ji priverčia dirbti procesorių, kuris veikia vykdydamas tik mašininį kodą, ir nieko kito.
Tačiau ne, interpretuojamos kalbos konstrukcijos mašininiu kodu tiesiogiai gali ir nevirsti, jos tam tikra prasme tėra duomenys, kuriuos apdoroja mašininės tos instrukcijos, kuriomis išreikštas kalbos interpretatorius.
Panašu, kad kalbėjome apie skirtingus dalykus. Atsiprašau darsyk.
Labai malonu, kad susišnekėjome :-) Be abejo, jūs visiškai teisus dėl interpretuojamos kalbos tiesioginio virtimo mašininiu kodu, juolab neretai dar įsikiša virtualios mašinos, operacinė sistema ir t.t..
Nors ir kiek skirtingomis kryptimis, buvo įdomu padiskutuoti.
Tavo nuomonė: