Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 8. nädala sisukord | järgmine > |
8.5 Silmaring: Erinevad programmeerimiskeeled
Konkreetses teadusharus ja eluvaldkonnas võib kasutusel olla mitu erinevat üldtunnustatud mõistete, seaduste ja meetodite süsteemi (paradigmat), millel rajaneb uurimine ja õpetamine. Ka programmeerimises on võimalikud erinevad paradigmad, mis määravad teatud vaated programmile, algoritmidele jm. Erinevatele paradigmadele vastavad erinevad keeled (või vähemalt erinevad võimalused ühes keeles).
Programmeerimise paradigmasid saab klassifitseerida mitmel moel. Esiteks saab jaotada programmeerimiskeeled kõigepealt kahte gruppi: imperatiivsed ja deklaratiivsed.
Imperatiivsed ehk käskivad keeled on keeled, kus programmi põhiliseks elemendiks on käsk ehk instruktsioon. Imperatiivses keeles kirjutatud programm kirjeldab üksikasjalikult, mida on vaja teha ja kuidas seda on vaja teha - programm on käskude jada. Imperatiivsetes keeltes tuleb täpselt ette "öelda", kuidas lahenduseni jõutakse. Tuntumad imperatiivsed keeled on C, C++, Java, Python.
Deklaratiivsed keeled on keeled, kus kirjeldatakse ehk deklareeritakse seosed ja reeglid, mis antud ülesande valdkonda kuuluvad. Deklaratiivsed keeled on keeled, kus programmeerija ei pruugi alati kõiki algoritmi detaile kirja panna, vaid võib esitada otsitava lahenduse kirjelduse, ning juba programmi täitmise käigus otsustab süsteem automaatselt, mis viisil täpselt seda lahendust otsida. Tuntumad deklaratiivsed keeled on: Prolog, Haskell jt.
Imperatiivseid keeli saab edasi jaotada struktuurseks ja objektorienteeritud keelteks.
Deklaratiivsed keeled jaotatakse funktsionaalse programmeerimise keelteks ja loogilise programmeerimise keelteks.
Struktuursete keelte põhiideeks on lähenemine probleemile kui tervikule ja seejärel probleemi tükeldamine väiksemateks osadeks. Struktuurprogrammeerimise käigus vaadeldakse esmajoones funktsioone ja protseduure. Kui on välja selgitatud vajalikud tegevused ja algoritmid, siis teises järjekorras vaadeldakse nende tegevuste teostamiseks vajaminevaid andmeid. Tuntumad struktuursed keeled on Pascal, C.
Struktuursete keeltega tutvumiseks vaatleme näiteks keele C programme.
Klassikaline Hello world programm on tavaliselt esimene programm, mida kirjutatakse, kui õpitakse uut programmeerimiskeelt. Üks tuntud kollektsioon sisaldab 583 Hello world programmi rohkem või vähem tuntud programmeerimiskeeltes ning sama fraasi tõlget 78 erinevas inimkeeles.
Esimene C-programm
Klassikaline Hello world programm C keeles:
// Programm, mis kirjutab ekraanile tervituse. #include <stdio.h> // sisendi/väljundi päis main () { // peafunktsioon printf ("Hello, world!\n"); // väljund (reavahetusega) }
Teine C-programm
// Programm, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud. #include <stdio.h> main () { int i; // muutuja deklareerimine for (i = 1; i<11; i++) { // tsükkel printf("%d ",i*i); // väljund } printf("\n"); // reavahetus }
Erinevalt struktuursest lähenemisest suunab objektorienteeritud lähenemise kasutamine esmase tähelepanu andmetele ja alles seejärel tõstatatakse küsimus, mida nende andmetega teha saab. OO lähenemine püüab esitada programmis esinevaid andmeid ja nendega teostatavaid tegevusi sarnastena meie igapäevases elus ettetulevatele objektidele, kusjuures objekte kujutatakse 'intelligentsetena'. Näiteks on meil objekt KALENDER. Küsides nüüd endalt, mida KALENDER teha OSKAB, leiamegi selle objektiga seotud tegevused: soovitud kalendrilehe näitamine ja lehekeeramine. Mitte kalendri VAATAMINE vaid NÄITAMINE, sest kalender ise ei vaata. Ja lehekeeramise laseme tal endal teha, seda võiks ta ju osata. Tuntumad objektorienteeritud keeled Java, C++ jne.
Vaatame näiteks keele Java programme.
Esimene Java-programm
// Programm, mis kirjutab ekraanile tervituse. class Hello { // programmi algus public static void main(String[] args) { // peafunktsioon System.out.println("Hello, world!"); // väljund (reavahetusega) } }
Teine Java-programm
// Programm, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud. class Ruudud { // programmi algus public static void main(String[] args) { // peafunktsioon for (int i = 1; i < 11; i++) { // tsükkel ühest kuni kümneni System.out.print(i*i+" "); // väljund } System.out.println(); // reavahetus } }
Funktsionaalse programmeerimise keeled on keeled, kus lahendus kirjeldatakse funktsioonide kogu abil. Funktsionaalsete keelte idee on programmide kirjutamine (matemaatiliste) funktsioonide defineerimise teel, määramata seejuures täpselt ära, mis strateegia järgi funktsiooni resultaati tuleb arvutada. Funktsionaalsete keelte omapära seisneb selles, et erinevalt imperatiivse keele programmidest ei ole üheselt ära määratud funktsioonide täitmise järjekord. Neid kasutatakse väga laialdaselt tehisintellekti probleemide lahendamisel. Tuntumad funktsionaalsed keeled on: Lisp, Scheme, Haskell jt.
Funktsionaalsed programmeerimiskeeled on oma ajaloo vältel pälvinud rohkem teoreetikute kui praktikute tähelepanu. Funktsionaalsest programmeerimisest pärinevad mitmed programmeerimise kontseptsioonid, nt kõrgemat järku funktsioonid, rekursioon, laisk arvutus ja palju muud. Ajapikku on paljud neist leidnud rakendamist paljude praktilisema suunitlusega keelte poolt.
Esimene Haskell-programm
-- Programm, mis kirjutab ekraanile tervituse. module Hello (main) where -- peamoodul, mooduli päis main = putStr "Hello, world!\n" -- väljastamine (reavahetusega)
Teine Haskell-programm
-- Programm, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud. module Squares (main) where -- mooduli päis squares n m = [ i^2 | i <- [n..m] ] -- funktsiooni defineerimine main = print $ squares 1 10 -- väljastamine
Loogiliste keelte omapära seisneb selles, et nendes kirjutatud programm kirjeldab ülesandes kasutatavate objektide seosed loogiliste avaldistena, mille väärtused saavad olla kas tõesed või väärad. Ka programmi töö tulemuseks on esitatud küsimuse tõeväärtus. Tuntumaks loogiliseks keeleks on Prolog.
Esimene Prolog-programm
% Programm, mis kirjutab ekraanile tervituse. ?- write('Hello, world!'), nl. % väljastamine (reavahetusega)
Teine Prolog-programm
% Programm, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud. squares(11). % töö lõpetamine squares(M) :- K is M*M, write(K), write(' '), N is M+1, squares(N). % reegel ?- squares(1). % töö alustamine
Skriptimise keeled ehk skriptikeeled on interpreteerivad programmeerimise keeled. Skript on interpreteeritavas keeles kirjutatud programm. Tavalised programmid enne käivitamist peavad olema muudetud binaarfailideks ehk kompileeritud. Skriptid aga jäävad inimesele loetavad ja need on interpreteeritud ehk tõlgitud arvutile mõistetavasse keelde ridade kaupa iga käivitamise korral.
On olemas erinevad skriptikeeled, näiteks teksti töötlemise skriptikeeled (Perl, Bash jt.), veebiprogrammeerimise skriptikeeled (PHP, JavaScript jt.) jt.
Esimene Perl-programm
# Programm, mis kirjutab ekraanile tervituse. print "Hello, world!\n"; # väljastamine (reavahetusega)
Teine Perl-programm
# Programm, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud. for($i = 1; $i <= 10; ++$i) { # tsükkel print $i*$i, ' '; # väljastamine } print "\n"; # reavahetus
Esimene PHP-programm
<?php // php skripti algus; skript, mis kirjutab ekraanile tervituse echo "Hello, world!\n"; // väljastamine ?>
Teine PHP-programm
<?php // php skripti algus; skript, mis väljastab ekraanile arvude 1, 2, ..., 9, 10 ruudud for($i = 1; $i <= 10; ++$i){ // tsükkel echo $i*$i; // väljastamine echo " "; } echo "\n"; // reavahetus ?>
PHP-programmi on võimalik kirjutada ka HTML-koodi sisse ja vaadata veebibrauserist.
Muudame natuke esimest PHP-programmi ja paneme tulemuse HTML-koodi sisse. Oletame, et meil on olemas kaks sõne ja me tahame neid kokku panna ja väljastada.
<html> <head> <title>PHP Test</title> </head> <body> <?php // php skripti algus; skript, mis kirjutab ekraanile tervituse $a = "Hello"; // muutuja deklareerimine $b = "world"; // muutuja deklareerimine echo $a . ", " . $b . "!\n"; // väljastamine ?> <!-- php skripti lõpp. Kuna asub juba HTML koodi sees, siis on vaja teistmoodi kommenteerida --> </body> </html>
ERINEVAD PROGRAMMEERIMISKEELED JA PARADIGMAD
Mõned programmeerimiskeeled toetavad konkreetset paradigmat (Haskell funktsionaalset, Prolog loogilist), teised toetavad aga mitmeid erinevaid. Nii näiteks võivad keeltes C++ ja JavaScript kirjutatud programmid olla puhtalt struktuursed või puhtalt objektorienteeritud või sisaldada mõlema stiili elemente. Millist stiili kasutada, on programmeerijate otsustada. Ka Python võimaldab mitut programmeerimisstiili, näiteks objektorienteeritud, struktuurset või funktsionaalset programmeerimist. Järgmises tabelis võrreldakse levinumaid programmeerimiskeeli.
PROGRAMMEERIMISKEELTE KASUTUSALAD
Erinevate keelte kasutuslevik on pidevas muutumises ja seda on huvitav jälgida näiteks siin.
Sageli kasutatakse suurte programmide loomisel mitu erinevat programmeerimiskeelt (programmi erinevate osade jaoks). Nt järgmises tabelis on näidatud, milliseid programmeerimiskeeli on kasutatud kõige populaarsemate veebilehtede puhul.
Pythoni juures võib esile tuua arendamise kiirust, samas programmid võivad jääda aeglaseks. Samuti on Pythonis olemas ka kõik objektorienteeritud programmeerimise vahendid. Python on hea keel prototüüpimiseks: tihtipeale luuakse mingi arvutiprogrammi esialgne kavand selles keeles ning hiljem realiseeritakse see mõnes kiiremas kõrgkeeles. Vahel kirjutatakse ainult programmi aeglasemad osad C-s või C++-is.
Python on olnud oluline Google'i programmeerimisel algusest peale kuni tänaseni. Kümned Google'i insenerid kasutavad Pythonit. Samuti on Facebook, NASA, Yahoo! Groups ja YouTube osaliselt kirjutatud Python-is. Ka Thonny on kirjutatud keeles Python. Siin on välja toodud veel mõned organisatsioonid, mis kasutavad Pythonit.
Kuna C on riistvarale lähedane keel, siis kasutatakse seda operatsioonisüsteemide draiverite ning operatsioonisüsteemide tuumade kirjutamiseks. C++ kasutatakse tihti suuremate ja veakindlate süsteemide loomisel, mille puhul on kiirus oluline. Enamik operatsioonisüsteeme on kirjutatud C ja C++ keeles. Nende hulka kuuluvad Windows 95, 98, 2000, XP, Vista, Windows 7, Windows 8, Apple Mac OS X, Symbian OS ja Be-OS, Google Chrome OS, RIM BlackBerry OS 4.x, Apple iPhone iPod Touch ja iPad OS jne. Samuti on mitmed veebilehitsejad kirjutatud C ja C++ keeles, nt Microsoft Internet Explorer, Google Chrome, Mozilla Firefox, Safari, Netscape Navigator, Opera ja Opera Mini. Ka Microsoft Office tooted (nagu Word, Excel, PowerPoint, Outlook jt) on kirjutatud C++ keeles. Järgmiste veebilehtede programmeerimisel on samuti kasutatud C ja C++: Facebook, YouTube, Amazon, Paypal. Veel üks tuntud programm, mis on kirjutatud C ja C++ keeles, on Winamp.
Hetkel on Java üks populaarsemaid programmeerimiskeeli, mida kasutab umbes 9 miljonit arendajat, eriti klient-server veebirakendustes. Tuntumad rakendused on Twitter, Amazon, Google, Facebook ja Youtube. Samuti Google ja Android, Inc. on otsustanud kasutada Javat Android operatsioonisüsteemi loomisel.
PHP on üldotstarbeline skriptimise keel, mis on eriti sobilik veebiserverite jaoks. Veebruaris 2014 82% veebilehtedel kasutati PHP'd serveripoolse programmeerimiskeelena. Ka nt Moodle ja Facebook kasutavad PHP keelt.
Aga nt Skype on kirjutatud hoopis keeles Embarcadero Delphi (ehk objektorienteeritud Pascal).
< eelmine | 8. nädala sisukord | järgmine > |