Sissejuhatus

jpoial@itcollege.ee

Arvutitest ja programmeerimisest

k - kilo (10^3), M - mega (10^6), G - giga (10^9), T - tera (10^12), P - peta (10^15), E - eksa (10^18), Z - zeta (10^21), Y - jota (10^24)
John von Neumann (1903 - 1957) - mällu salvestatud programmi idee. Annab võimaluse programme genereerida (programm on andmete eriliik). Neumanni arhitektuuri kriitika.


Need kaks pilti siin on kopeeritud meie põhiõpikust







Vajalikke lühendeid:
IDE - Integrated Development Environment. Arenduskeskkond programmide koostamiseks, silumiseks ja testimiseks (tavaliselt graafiline, näiteks eclipse - www.eclipse org).
API - Applications Programmer Interface. Programmeerijatele mõeldud kirjeldus mingi süsteemi funktsioonide kasutamiseks programmis, näiteks Java API kirjeldab keeles Java olemasolevaid funktsioone (konkreetselt Java puhul on need jagatud pakettidesse ja klassidesse, aga sellest hiljem...).

Programmeerimiskeeltest

Eesmärk: mitte töötada riistvara terminites, muuta programmeerimine universaalseks (sõltumatuks konkreetsest arvutitüübist).
Keele muudab arvutile arusaadavaks eriline süsteemitarkvara hulka kuuluv programm - keele translaator:
Näiteks keele Java korral





Näide: Baitkoodi dekompileerimine: javap -p -c Programm.class

Sama interpretaator (näit. JVM) võib töötada erinevate lähtekeeltega (Java, Scala, Groovy, Clojure, ...)

Programmi elutsükkel (IDE mõttes - small picture, mitte segi ajada elutsükliga tarkvaratootmises):


Programmeerimise paradigmad,  imperatiivne vs. deklaratiivne lähenemine:
Ajalooliselt esimesed kõrgtaseme keeled toetavad imperatiivset lähenemist.

Mitte päris tõsine vaade ajaloole

Populaarsus kogukonnas

Programmeerimiskeelt iseloomustavad:
  1. leksika - kuidas panna kirja elementaarseid "sõnu" antud keeles - nimed (identifikaatorid), konstandid (arvud, stringid, tõeväärtused jne.),  võtmesõnad (reserveeritud nimed), eraldajad jne.
  2. süntaks - antud keele grammatikareeglid. Erinevalt loomulikest keeltest ei ole programmeerimiskeeltes mitte midagi peale hakata süntaktiliselt vigaste tekstidega.
  3. semantika - keelekonstruktsioonide tähendus, s.t. kuidas interpreteeritakse süntaktiliselt korrektset programmi.
  4. stiil ja programmide koostamise metoodika. On kokkulepped, millega vabatahtlikult kitsendatakse süntaktiliselt lubatud programmide hulka, et saavutada paremat loetavust inimese poolt (näit. "treppimine" programmi struktuuri väljatoomiseks, nimekokkulepped jne.).

Algoritmidest

ca 825 m.a.j. , Abu Ja'far Mohammed ibn Mûsâ al-Khowârizmî - reeglid aritmeetiliste operatsioonide sooritamiseks

Algoritm on täpne (üheselt mõistetav) juhis antud ülesande lahendamiseks. Algoritm koosneb lõplikust arvust sammudest, millest igaüks on täidetav lõpliku aja jooksul lõplikke ressursse kasutades. Algoritmi rakendatakse teatavale lähteandmete komplektile (sisend) ning ta annab teatava resultaadi (väljund).
Kui algoritm lõpetab töö (peatub) mistahes sisendi korral, siis nim. seda kõikjal määratud algoritmiks, vastasel juhul osaliseks algoritmiks.
Kui algoritmi mistahes sammu täitmise järel on üheselt määratud, milline on järgmine samm, siis nim. algoritmi determineeritud algoritmiks.

Teosti on vahend teatud tüüpi ülesannete lahendamiseks. Teosti põhiomaduseks on juhitavus - teda saab programmeerida etteantud käsusüsteemi piirides (käsusüsteemi kuuluvad tavaliselt nn. lihtkäsud, tingimuste kontrollimise käsud, juhtimiskäsud jm.). Programm on tegevusjuhend, mis on teostile üheselt mõistetav ning viib püstitatud eesmärgi saavutamisele. Programm on algoritmi realisatsioon konkreetse teosti jaoks. Tavaliselt peame teosti all silmas arvutit, aga miks mitte näiteks ka robotit või pesumasinat...

Algoritmi iseloomustamiseks kasutatakse järgmisi mõisteid:
Algoritmi formaalsed (matemaatilised) esitused (samaväärsed):
Algoritmi peab saama väljendada nii, et see oleks mugav nii koostajale (algoritme koostavad inimesed) kui ka täitjale (teostile, arvutile).

Algoritmi esitusviisid:

Näide: Eukleidese algoritm kahe täisarvu suurima ühisteguri leidmiseks.

  1. Kui teine arv on null, siis anda vastuseks esimene arv ja lõpetada.
  2. Leida jääk, mis tekib esimese arvu jagamisel teisega.
  3. Asendada esimene arv teisega ja teine leitud jäägiga.
  4. Minna sammule 1.
 Joonised (plokkskeem, E-skeem)

   public static int syt (int a, int b) {
      while (b != 0) {
         int j22k = a % b;
         a = b;
         b = j22k;
      }
      return a;
   } // syt



Algoritmi sammude järjekorra määramiseks on kasutusel kaks lähenemisviisi:
  1. Märgendatud sammudega "goto"-stiilis juhtimine. Algoritmis tohib "suunata" mistahes märgendile, s.t. on lubatud käsud stiilis "minna sammule 6". See on pärit masinkoodi aegadest (suunamiskäsud), kõrgkeeltest kannab seda ideed näiteks Basic. Raskesti jälgitav/hallatav.
  2. Struktuurne lähenemine. Algoritm pannakse kokku lihtkäskudest ja juhtimisstruktuuridest. Iga juhtimisstruktuuri tervikuna saab vaadelda kui lihtkäsku, samuti võib iga juhtimisstruktuuri koostisosa olla kas lihtkäsk või omakorda juhtimisstruktuur.
Tüüpilisteks juhtimisstruktuurideks on:
Seni oleme vaadelnud korraga üht algoritmi/programmi - programming in small. Kui tekivad algoritmide/programmide kogud, mida on tarvis hallata, siis muutub meie ülesanne keerukamaks - programming in large. Kuidas taaskasutada olemasolevaid lahendusi? Kuidas hallata suurt valmisprogrammide kogu? Vastuse annab OOP - objektorienteeritud lähenemine (sellest kunagi hiljem).

Algoritmi kirjapanekul on soovitav välja tuua veel (kehtib nii programmide, mitmesuguste skeemide kui ka lihtsalt sõnaliste kirjelduste kohta):
  1. Ülesande püstitus lühidalt (mida see algoritm teeb?)
  2. Sisendi kirjeldus (mis on lähteandmeteks?) ja eeltingimused, mis peavad olema tagatud algoritmi tööks (kui neid on)
  3. Väljundi kirjeldus (mis on tulemuseks?) ja järeltingimused, mis kehtivad pärast algoritmi töö lõppu (kui neid on vaja)
  4. Muud eritingimused, eriolukordade kirjeldused jne.


Jaanus Pöial