You are on page 1of 289

Prirodno-matematièki fakultet u Sarajevu

Odsjek za matematiku
UVOD U
KOMPJUTERSKE
NAUKE

Skripta
Pripremili:
doc. dr. Samir Ribiæ, Adnan Isajbegoviæ, Kemal Gu iæ, Edin Ajanoviæ, Zlatan Zametica,
Sanjin Ðogiæ, Maja imiæ, Jasmin Meru iæ, Sabina Karahod iæ, Valida Hamidoviæ, Edis
Heriæ, Azra Èau eviæ, Nedim enderoviæ, Imer Husejnoviæ, Adi Prijiæ, Sanela abanoviæ,
Faik Idrizbegoviæ, Ermin Hod iæ, Dino Èau eviæ, Emir Gegiæ
Sarajevo, maj 2010
1
Sadr aj
Programske paradigme............................................................
.......4

ièano programiranje................................................................
......8

Programiranje u programskim jezicima niskog nivoa ..............18

Ma inski jezik....................................................................
...........................................................18
Asemblerski jezik...............................................................
...........................................................23
Stekovni jezici Forth i Postscript..............................................
..................................................30

Nestrukturano programiranje u programskim jezicima visokog


nivoa...........................................................................
....................41
FORTRAN.........................................................................
...........................................................42
COBOL...........................................................................
..............................................................50
BASIC...........................................................................
................................................................54

Struktuirano programiranje......................................................
....59

Pascal..........................................................................
..................................................................62
Programski jezik C..............................................................
...........................................................65
Algol 60........................................................................
................................................................76
Algol 68........................................................................
................................................................77
PL/I............................................................................
...................................................................78
Ada.............................................................................
...................................................................80
Modula 2........................................................................
...............................................................81
XBASE...........................................................................
..............................................................82
BCPL............................................................................
................................................................83

Objektno-orijentisano programiranje..........................................85
C++.............................................................................
..................................................................87
Delphi..........................................................................
................................................................101
C#..............................................................................
..................................................................112
Python..........................................................................
...............................................................115
Ruby............................................................................
................................................................128

Deklarativno programiranje......................................................
..131

SQL.............................................................................
................................................................131

Funkcionalno programiranje......................................................
138

Lisp............................................................................
.................................................................143
ML..............................................................................
................................................................145

2
Miranda.........................................................................
..............................................................147
Haskell.........................................................................
...............................................................148

Logièko programiranje.............................................................
...150

Prolog..........................................................................
................................................................151

3
Programske paradigme
Prvi kompjuteri su bili programirani icama, tj. raznim kombinacijama, ice bi bile
spojene i
time bi bila obavljena operacija. Jedan od ranih primjera takvih kompjutera je I
BM 805 Test
Scoring Machine, iz 1936. godine, kojeg je napravio Reynold Johnson, srednjo kolsk
i
profesor, a koji je mogao obraditi testove na osnovu èitanja zaokru enih odgovora.
Prvi elektronski digitalni raèunar je Atanasoff-Berry
Computer (ABC) iz 1937. godine, koji je bio dizajniran
za rje avanje sistema linearnih jednaèina. Do 1973.
Godine se smatralo da je ENIAC bio prvi kompjuter, ali
je te godine poni ten patent u amerièkom patent
zavodu, i ABC je progla en prvim kompjuterom.
Tokom 2. svjetskog rata, Njemaèka se uveliko slu ila
ma inom za kodiranje nazvanom Enigma. Glavni cilj
Velike Britanije je bio razbijanje koda ove ma ine, ne bi
li time do li do vrijednih podataka za potrebe rata.
Razbijanje njenog koda ruènim putem nije bilo
moguæe, zbog glomaznosti, pa je tako u februaru 1944.
godine u Bletchley Parku pu ten u pogon Colossus,
prvi elektronski ureðaj kojeg je bilo moguæe
programirati.
Poslije su kompjuteri bili bazirani na binarnom kodu koji su predstavljali kontr
olne
sekvence u CPU. Gottfried Wilhelm Leibniz (1646-1716) je prvi razvio binarni kod
, te time
omoguæio osnovu za razvoj kompjuterskih nauka. Leibniz je poku ao razviti ma inu koja
bi
obavljala èetiri osnovne raèunske operacije. On je zami ljao ma inu koja bi radila na
principu kuglica smje tenim u bu enim karticama, a stanje da ima kuglice bi predstav
ljalo
stanje jedan, a ako nema kuglice, predstavlja stanje nula. Na ovom konceptu rade
dana nji raèunari, te se zbog toga èesto i smatra prvim nauènikom u oblasti informatike.
Da bi se programiranje olak alo, razvijeno je asemblersko programiranje. Ovo je za
mjenilo
ma insko programiranje. Asemblersko programiranje se smatra primitivnim jezikom, i
ako
je druga generacija, èak iako su tokom ezdesetih imali ogromne moguænosti, kao i
sofisticirane makroe. Takoðer, podr avali modularno-programerske opcije poput CALL
(pozivanje potprograma), eksterne varijable, operatore tipa READ/WRITE/GET/PUT,
itd.
Asembliranje se jo uvijek koristi u integrisanim sistemima.
Sljedeæi napredak je bio razvoj proceduralnih jezika. Ovo je treæa generacija jezika
, te
predstavljaju napredne jezike. Primjeri ovih jezika su COBOL (Common Business Or
iented
Language), FORTRAN (FORmula TRANslation), ALGOL (ALGOritmic Language), itd. koji
su uglavnom razvijeni za komercijalne i nauène potrebe, PL/1 (Programming language
1)
koji je razvijen kao hibrid za nauène i komercijalne potrebe, te BASIC (Beginners
All
Purpose Symbolic Instruction Code) namijenjen za iroku upotrebu. U ovim jezicima,
opisuje se korak po korak taèno kako procedura ide da bi se rije io problem. To znaèi
da je
brzina i efikasnost programa najvi e zavise od sposobnosti i iskustva programera.
Nakon toga, ranih 1980-ih je razvijeno objektno-orjentisani programiranje. Primj
eri su
Simula, Smalltalk, Eiffel, Java, C++, itd. Ovo je najuticajnija programska parad
igma u
komercijalnom razvoju softvera. U ovim jezicima, podaci i manipulacije podacima
se
predstavljaju kao objekat. Jedini naèin da korisnik pristupi ovim podacima je pute
m
podprograma. Radi ovoga, interni rad na objektima mo e biti promjenjen bez da se u
tièe
RekonstrukcijaColossusaiz 2006.godine

4
na bilo koji kod koji koristi taj objekat. U posljednje vrijeme su se èak nekim je
zicima koji
nisu klasièni objektno-orjentisane paradigme, dodavani objektno-orjentisani koncep
ti
(Visual Basic, Pascal, itd.)
Mnogi programeri i danas sumnjaju u efikasnost objektno-orjentisanih jezika u od
nosu na
proceduralne jezike. Jedna od glavni zamjerki jeste na mnogo bespotrebnih dodata
ka u
samom jeziku ili objektima, koji zauzimaju prostor, a èesto nisu ni potrebni ( Softw
are
bloat ). Kao moguæe rje enje razvijen je polimorfizam. Polimorfizam je osobina po kojo
j
objekat ima parametre razlièitih tipova, tj. jedan objekat odreðenog tipa se mo e kori
stiti
kao objekat drugog tipa. Recimo, ako se psu, zada funkcija govor(), onda on laje
, a ako se
zada maèki, onda mijauèe. Oboje naslijeðuje govor() od grupe ivotinje , ali njihove
podklasne metode prevladaju metode nadklase. Dodavanje medote hodanje grupi
ivotinje æe dati objektima maèkama i psima istu metodu hodanja. Nalijeðivanje
metodom polimorfizma omoguæuje klasi B da naslijedi metodu od klase A bez da mora
pruzeti sve osobine klase A. Primjer u C++:
#include <iostream>
#include <string>
using namespace std;
class Zivotinje
{

public:
Zivotinje(const string& name) : name(name) {}
virtual string talk() = 0;
const string name;

};

class Macka : public Zivotinje

{
public:
Macka(const string& name) : Zivotinje(name) {}
virtual string talk() { return "Mijauu!"; }

};

class Pas : public Zivotinje

{
public:
Pas(const string& name) : Zivotinje(name) {}
virtual string talk() { return "Vauu! Vauu!"; }
};

int main()

{
Zivotinje[] =
{

new Macka("Mica"),
new Macka("Macek"),
new Pas("Lesi")

};

for(int i = 0; i < 3; i++)


{
cout << zivotinje[i]->name << ": " << zivotinje[i]->talk() <<
endl;

delete zivotinje[i];
}
return 0;

5
Rezultat je sljedeci:
# Mica: Mijauu!
# Macek: Mijauu!
# Lesi: Vauu! Vauu!

Objektno-orjentisano programiranje se smatra orjentisanim asemblerskim jezikom.


Primjer
je HLA (High Level Assembly), kojeg je razvio Randall Hyde. HLA koristi sintaksu
baziranu
na nekoliko naprednijih programskih jezika poput Pascal-a, Ada, C++, itd. HLA om
oguæuje
lahko uèenje za poèetnike, a posjeduje napredne konstrukcije za naprednije programer
e.
HLA je prvobitno smi ljen kao alat za uèenje asemblerskog programiranja na fakultets
koj
razini. Primjer koda u HLA:
program Pozdrav;
#include( "stdlib.hhf" )
static

hwString :string := "Pozdrav", nl;


begin Pozdrav;

push( hwString );

call stdout.puts;
end Pozdrav;

Èesto se HLA smatra ni im programskim jezikom, poput sliènih produkata tipa MASM
(Microsoft) ili TASM (Borland), to se zakljuèuje prilikom analize jednostavnijih pr
ograma
raðenim u njemu. HLA u sebi podr ava jednostavnije instrukcije ma inskog nivoa kao i
ostali x86 asembler, te se u njemu mo e pisati jednostavniji kod, sa ignorisanjem
HLL
(High Level Language) kontrolnih instrukcija.
Nezavisno od proceduralnih jezika, razvijene su deklarativne paradigme. U ovim j
ezicima,
kompjuteru se govori ta je problem, a ne kako ga rije iti. Program je struktuisan k
ao
kolekcija svojstava za pronala enje rezultata, a ne procedura koje treba slijediti
. Program
posjeduje bazu podataka, ili skup pravila, te na osnovu toga pronalazi rje enje ko
je sadr i
tra ena svojstva. Primjeri ovih jezika su SQL, te familije funkcionalih jezika (Sc
heme,
Erlang, Ocaml) i logièih programerskih jezika (ALF, Visual Prolog, XSB, Fril). Fun
kcionalni
jezici koriste blokove kodova koji se pona aju kao matematièke funkcije. Ovi jezici
se
uglavnom koriste u akademske svrhe. Primjeri gdje su ovi jezici iskori teni su
Mathematica, XSLT, itd.
Logièko programiranje se bazira na matematièkoj logici, tj. na logièkim formulama, a
program se izvr avaju kori tenjem suèelja sa setom pravila sve dok se ne pronaðe
odgovor na problem ili se komplet formula smatra nedosljednim. Zato se od progra
mera
oèekuje istinitost programa da bi funkcionisalo. Poèeci ovog tipa programiranja dati
ra iz
ranih 1960-tih, tokom debate o primjeni deklarativnih i proceduralnih jezika u r
azvoju
umjetne inteligencije. Danas se logièko-programski jezici koriste u rje avanju probl
ema u
civilnom in injerstvu, zraènoj kontroli, mehanici, itd.
6
7

STILOVI PROGRAMSKIH JEZIKA

O IÈENIANALOGNIDIGITALNI
DEKLARATIVNI IMPERATIVNI
FUNKCI-
ONALNI DOMENSKI LOGIÈKI NIZOVNI NISKOGNIVOA
VISOKOGNIVOA
MA INSKI STEKOVNIASEMB-
LERSKI NESTRUKTUIRANI STRUKTUIRANI
PROCEDURALNI OBJEKNI
OBJEKTNOORIJENTISANI OBJEKTNOBAZIRANI
S NASLJEÐIVANJEMKLASA S NASLJEÐIVANJEMOBJEKATA
ièano programiranje

Prvi raèunari su bili programirani direktno putem ica. Oni su bili povezani sa mnog
im
logièkim vezama; u poèetku izgraðeni pomoæu elektriènih releja, kasnije vakuum cijevi,
tranzistora i integriranih sklopova.
Relej je elektrièni pogon prekidaèa. Mnogi releji koriste elektromagnet za (pokretan
je)rad
mehanizma prekidaèa, ali i drugi principi se takoðer se koriste. Gornji sklop korist
i tri releja,
sa spiralom svakog od njih spojenih na jedan ulaz i uzemljenje. Stoga, releji æe s
e uvijek
aktivirati, kad god na njihove odgovarajuæe ulaze pustimo visoki napon.
Serijska veza prekidaèa osigurava da je uèinak AND kola (izlaza) pozitivan kada su s
vi
releji su aktivni. Krajnji rezultat je logièko AND kolo sa tri ulaza. Jaki pogon(e
nergija)
visoke vrijednosti na izlazu se intepretira kao logièka 1, a otvoreni (pokretni) k
ao logièka 0.
Donji sklop pokazuje odgovarajuæe NAND kolo s dva ulaza. Paralelni prikljuèak za rel
ejne
prekidaèe osigurava da æe izlaz biti logièka 1, dok najmanje jedan relej ostaje neakti
van.
8
Do sredine 1940-ih veæina raèunara su radije bili graðeni od vakuum cijevi nego od
prekidaèa i releja. Iako su vakuumske cijevi lomljive, skupe, i koriste puno energ
ije, one su
puno br e od releja (i puno ti e). Ako se zanemari Atanasoff ABC ma ina i Colossus, on
da
je prvi pravi (radni) opæe namjene, elektronièkih raèunala Electronic Numerical Integr
ator
And Computer (ENIAC) koji je konstruisan na Univerzitetu u Pensilvaniji izmeðu 194
3. i
1946.
Zamisao John William Mauchly (1907-1980) i J. Presper Eckert Jr. (1919-1995), EN
IAC
je bio èudovi te -bio je visok 10 stopa, zauzimao je 10002 stopa (podnog) prostora,
te ak
oko 30 tona, i koristi vi e od 70.000 otpornika, 10.000 kondenzatora, 6.000 prekid
aèa, i
18.000 vakuum cijevi. Konaèna ma ina je zahtijevala 150 kilovata snage, to je bilo
dovoljno da osvjetli mali grad.
Jedan od najveæih problema s raèunarima izgraðenim iz vakuum cijevi je pouzdanost;
90% ENIAC-a je izgubilo na vremenu propisanom za lociranje i zamjenu spaljenih c
ijevi.
Zapisi iz 1952. pokazuju da je oko 19.000 vakuum cijevi moralo biti zamijenjeno
samo u toj
godini, to je u prosjeku oko 50 cijevi na dan!
Analogni raèunar je forma raèunara koji stalno koristi promjenljive aspekte fizièkih p
ojava,
kao to su elektrièna, mehanièka ili hidraulièna velièina, da podesi problem iznala enja
rje enja. S druge strane, digitalni raèunari predstavljaju razlièite kolièine prirasta,
kao i
njihove brojèane promjene vrijednosti.
Mehanièko -analogni raèunari su bili vrlo va ni u kontroli obraèuna pi toljima u Drugom
svjetskom ratu i Korejskom ratu; proizvoðeni su u velikom broju.
Specifièno, razvoj tranzistora uèinio je elektronsko -analogne raèunare praktiènim, i pr
ije
nego to su se digitalni raèunari dovoljno razvili, oni (tranzistori) su se obièno kor
istili u
nauci i industriji.
Analogni raèunari mogu imati vrlo irok raspon slo enosti. Logaritmar ( iber)
9
nomogram[1] su najjednostavniji, dok su // (naval gun fire control computers and
large
hybrid digital/analogue computers) // bili meðu najslo enijim. Digitalni raèunari imaj
u
odreðeni minimalni (i relativno veliki) stupanj slo enosti koji je daleko veæi od
jednostavnijih analognih raèunara. Ta slo enost je potrebna za izvr avanje njihovih
pohranjenih programa, te u mnogim sluèajevima za kreiranje uèinka koji je direktno
pogodan za ljudsku upotrebu.
Postavljanje analognog raèunara iziskuje listu faktora da bude odluèeno; zajedno s
poèetnim uvjetima -tu je, startna cijena. Druga bitna stvar je kreiranje potrebne
mre e
povezivanja izmeðu elemenata za raèunanje. Ponekad je potrebno razmisliti o struktur
i
problema, tako da bi raèunar funkcionisao na zadovoljavajuæi naèin. Nijedna varijabla
ne bi
smjela prema iti raèunarske granice, a trebala bi se izbjeæi i diferencijacija, tipièno,
reorganiziranjem mre e meðusobnih veza kori tenjem integratora u drugaèijem smislu.
Pokretanje elektronskog analognog raèunara, pretpostavljajuæi da je pode en, poèinje
zadr avanjem raèunara sa nekim promjenljivim vezanim za njihove poèetne vrijednosti.
Aktiviranjem prekidaèa, on ili off pokreæemo program (zadatak)/raèunar. U nekim
sluèajevima raèunar se mo e, nakon pokretanja u odreðenom vremenskom intervalu, u
vi e navrata povratiti u poèetno stanje, ponoviti zadatak, i pokrenuti se opet.
Sliènost izmeðu linearno -mehanièkih komponenti, kao to su opruge i dashpots
(viskozno -fluidni amortizeri), i elektriènih komponenti, kao to su kondenzatori, i
nduktori, i
otpornici je upadljiva u smislu matematike. One mogu biti kreirane pomoæu jednad bi
koje
su u su tini istog oblika.
Kako god, razlika izmeðu ovih sistema je ono to èini analogno raèunanje korisno. Ako
se uzme u obzir jednostavan mno tvo opruga sistem, konstruisanje fizièkog sistema æe
zahtijevati pravljenje ili modificiranje opruga . Nakon toga bi uslijedilo njihovo
meðusobno
spajanje i postavljanje na odgovarajuæe mjesto, prikupljanje test - opreme s odgov
arajuæim
ulaznim rasponom, i na kraju, uzimanje mjera. U slo enijim sluèajevima, kao to su
amortizeri za trkaæe automobile, eksperimentalne konstrukcije, modifikacija, i tes
tiranje, to
nije tako jednostavno niti jeftino.
Elektrièni ekvivalent mo e biti konstruisan sa nekoliko operativnih pojaèala (OP pojaèal
a)
i nekih pasivnih linearnih komponenti; sva mjerenja se mogu direktno uzeti sa
osciloskopom. U sklopu, (simuliranog) 'èvrstina opruge ", na primjer, mo e se promij
eniti
pode avanjem potenciometra. Elektrièni sistem je analogija na fizièkom sistemu, otuda
ime, ali je manje skup za izgradnju, opæenit sigurniji i obièno je mnogo lak i za izmi
jeniti.
Takoðer, elektronski sklop u pravilu mo e raditi na vi im frekvencijama nego sistem ko
ji je
simuliran. To omoguæava da se simulacija pokreæe br e nego u stvarnom vremenu (koji bi
,
u nekim sluèajevima, bio u satima, sedmicama, ili du e). Iskusni korisnici analognih
elektronskih raèunara ka u da su oni ponudili relativno povjerljive kontrole, te
razumijevanje problema u odnosu na digitalne simulacije.
Nedostatak mehanièko-elektriène analogije je da je elektronika ogranièena rasponom nad
kojim varijable (promjenljive) mogu varirati (mijenjati vrijednosti). To se zove
dinamièki
raspon. Ona je takoðer ogranièena nivoom buke. Digitalni proraèuni pokretnim zarezom
imaju uporedivo ogroman dinamièki opseg (Dobro moderan priruèni, nauèni / in enjerski,
kalkulatori imaju eksponent 500.)
Ovi elektrièni sklopovi takoðer mogu lako izvesti niz razlièitih simulacija. Na primje
r,
napon mo e simulirati pritisak vode, a elektrièna struje mo e simulirati brzinu protok
a u
obliku kubiènih metara u sekundi. (U stvari, s obzirom na odgovarajuæi mjerni faktor
, sve
to je potrebno bi bio stabilan otpornik, u tom sluèaju.) S obzirom na protok i akum
ulirani
volumen tekuæine, jednostavan integrator kasni sa snadbijevanjem dok su obje varij
able
naponi. U praksi, struja je rijetko kori tena u elektroniènim analognim raèunalima, je
r je sa
10
preciznost
raèuna, a dok
je relativno
spor, pru a
praktièno bilo
koji stupanj
preciznosti
koji bi mogao
biti potreban.
// Poljski
Analogni raèunari
ELWAT //
Elektronski
naponom puno lak e raditi.
Analogna raèunala su posebno dobro namje tena da prikazuju situacije opisane
diferencijalnim jednad bama. Povremeno, oni (analog. raè.) su se koristili kada bi s
e
diferencijalna jednad ba pokazala vrlo te ka za rije iti standardnim sredstvima.
Digitalni elektronski sistem koristi dvije naponske razine da predstavi binarne
brojeve. U
mnogim sluèajevima, binarni brojevi su samo kodovi koji odgovaraju, na primjer, na
svjetlost primarnih boja, ili slova abecede (ili drugih simbola). Manipulacija t
ih binarnih
brojeva je naèin kako digitalni raèunari rade. Meðutim, elektronski analogni raèunar,
manipulira elektriènim naponom to odgovara dijelu va nosti u problemu koji se rije ava.

Taènost analognog raèunara je ogranièena njegovom procjenom elemenata, kao i


kvalitetom unutarnje snage i elektriènih veza. Preciznost (èitanja) analognog raèunara
bila
je ogranièena uglavnom precizno æu (èitanja) opreme koju koristi, uglavnom na tri ili èeti
ri
bitne znamenke. Preciznost digitalnih raèunara je ogranièena du inom rijeèi; proizvoljna

analogni raèunari obièno imaju prednje ploèe s brojnim utiènicama (jedno-kontaktne


utiènice) to dopu ta sloju kabla (fleksibilne ice sa utikaèima na oba kraja) formiranje
meðusobnih veza koje definiraju postavljanje problema. Osim toga, postoje precizni
potenciometri (promjenljivi otpornici) visoke rezolucije za postavljanje (i kada
je to
potrebno mijenjanje) skale faktora. Osim toga, tu je vjerojatno da æe biti nula -c
entar
analognog pokazivaèa -tip brojila za prosjeènu taènost mjerenja napona. Stabilan, taèan
izvor napona daje poznate dimenzije.
Tipièni elektronski analogni raèunari sadr e bilo gdje, od nekoliko do stotinjak ili v
i e
operativnih pojaèala ( "op pojacala, op ampovi"), nazvani tako jer izvode matematièk
e
operacije. Op pojaèala su odreðeni tip pojaèala s povratnom vezom, sa vrlo visokim
napredovanjem i stabilnim upisom. Ona se uvijek koriste s preciznim popratnim
komponentama koje u djelovanju, (sve, ali otkazuju iz struje, dolaze iz ulaznih
komponenti.?) Veæina OP pojaèala u reprezentativnoj postavi su zbirna pojaèala, koja
dodaju i oduzimaju analogne napone, koji provode rezultate na izlaznim prikljuècim
a.
Takoðer, OP pojaèala sa popratnim kondenzatorima su obièno ukljuèeni u postavku, a oni
integriraju zbir svojih unosa u odnosu na vrijeme.
Integriranje u odnosu na druge varijable je gotovo poseban dio mehanièko -analogno
g
integratora; to gotovo nikada nije uèinjeno u elektronskim analognim raèunarima. Meðut
im,
s obzirom da se rje enje problema ne mijenja s vremenom, vrijeme mo e poslu iti kao
jedna od varijabli.
Ostali elementi raèunara ukljuèuju analogne multiplikatore, nelinearne funkcijonalne

11
generatore, te analogne komparatore.
Induktori se nikada nisu koristili u tipiènim analognim elektronskim raèunarima, jer
je
njihovo odstupanje od idealnog pona anja preveliko za raèunanje bilo koje velike
preciznosti. Postavke analognog raèunara koje na prvi pogled zahtijevaju induktore
mogu
se preurediti i redefinirati za kori tenje kondenzatora. Kondenzatori i otpornici,
s druge
strane, mogu biti mnogo bli e idealnom nego induktori, to je razlog za to oni èine veæinu
pasivnih raèunalnih komponenti.
Upotreba elektriènih svojstava u analognim raèunarima znaèi da se izraèunavanja obièno
izvode u stvarnom vremenu (ili br e), brzinom odreðenom uglavnom frekvencijskim
odzivom operativnih pojaèala i ostalih raèunarskih elemenata. U povijesti elektronsk
ih
analognih raèunara, bilo nekih posebnih tipova visokih brzina.
Nelinearne funkcije i proraèuni mogu biti konstruisani sa ogranièenom precizno æu (tri i
li
èetiri_znamenke) dizajniranjem HYPERLINK
"http://en.wikipedia.org/wiki/Function_generator" funkcijonalnih generatora -pos
ebni
sklopovi razlièitih kombinacija otpornika i dioda za pru anje nelinearnosti. Obièno,
poveæanjem ulaznog napona, postupno se poveæava i broj provodivih dioda.
Kada se nadoknadi za temperaturu, prednji pad napona tranzistorske baze -emitera
,
mo e pru iti upotrebljivo taène eksponencijalne ili logaritmicke funkcije. Op pojaèala
podi u izlazni napon, tako da su iskoristiva u ostatku raèunara.
Bilo koji fizikalni proces koji vr i neko raèunanje mo e se tumaèiti kao analogni raèunar.
Neki primjeri, izmi ljeni u svrhu ilustriranja koncepta analognih raèunanja, ukljuèuju
kori tenje hrpe izolacijskih cijevi kao model za sortiranje brojeva; ploèa, skup nok
tiju, i
gumeni zavoj kao model za nala enje udubljene taèke u skupu taèaka (convex hull); i
nizovi vezani zajedno kao model pronala enja najkraæeg puta na mre i.
Analogni raèunari èesto imaju kompliciran okvir, ali u svojoj biti sadr e skup kljuènih
komponenti koje izvode kalkulacije; koji operator manipulira unutar okvira kompj
utera.
Kljuène hidrauliène komponente mogu ukljuèivati cijevi, ventile i spremnike.
Kljuène mehanièke komponente mogu ukljuèivati rotirajuæe osovine za pohranjivanje
podataka unutar raèunara, mitra (miter mo e znaèiti pored ostalog i klin) -zupèanik
diferencijala, disk / lopta / valjak integratora, kamere (2-D i 3-D), mehanièke rje a
vaèe
( resolvers) i multiplikatore i obrtne servo-e.
Kljuène elektriène / elektronske komponente mogu ukljuèivati:
Precizne otpornike i kondenzatore
operativna pojaèala
multiplikatore
mjeraèe napona
generatore odreðenih funkcija
Osnovne matematièke operacije kori tene u elektriènom analognom raèunaru su:

12
zbrajanje
integracija s obzirom na vrijeme
inverzija
mno enje
stepenovanje
logaritmiranje
dijeljenje, iako je mno enje mnogo preporuèljivije
Diferencijacija s obzirom na vrijeme ne koristi se èesto, a u praksi se izbjegava
redefiniranjem problema kada je to moguæe. Ona odgovara u frekvencijskoj domeni na
visoko-prolaznim (high pass filter, filter koji propusta visoke frekvencije i pr
opusta ih kao
niske frekvencije) filterima, to znaèi da se buke visoke frekvencije pojaèavaju, dok
je
diferencijacija isto rizièna za nestabilnosti.
Da bi se bolje razumio fizièki svijet, ponekad je potrebno koristiti matematièke mod
ele za
predviðanje reakcija razlièitih fizikalnih sistema, kao to je gibanje masa prikljuèenih
na
izvor, na vanjske podra aje, poput prisiljavanja. Kroz kori tenje diferencijalnih je
dnad bi,
postaje moguæe precizno modelirati pona anja takvih sistema No, ustvari je raèunski
kompleksno vidjeti grafièki prikaz rje enja ovih modela. Upalite analogni raèunar. Ana
logni
raèunari kroz kori tenje mno itelja, sabiraèa, i integratora mogu brzo i taèno predstavlja
ti
diferencijalne jednad be grafièki.
(Kako bi se modelirao prisilno, prigu eno titranje mase prièvr æene na oprugu,) mo emo
izgraditi analogni raèunar koristeæi sumatore i integratore. Kori tenjem diferencijaln
e
jednad be:

bili bismo u moguænosti odrediti odgovor sistema na sinus, trokut i kvadratne tala
se
frekvencija izmeðu 2 Hz i 2 MHz. U izgradnji na eg raèunara dizajnirali smo dva sklopa
.
Oba kruga predstavljaju iste diferencijalne jednad be, a druga se ispostavilo dale
ko
superiornija uodnosu na prvu.
Matematièka analiza:
Modeliranjem prigu enog kretanja, jaèina sistema mno tvo opruga je usmjerena na
diferencijalnu jednad bu:
13
gdje je M masa objekta prièvr æena na oprugu, Kd je konstanta prigu enja, Ks je
konstanta opruge, i F(t) je snaga funkcije. Da bi se rije ila ova diferencijalna j
ednad ba,
prvo se mora rije iti homogena jednad ba za dobivanje rje enja ovog sistema.
Rje avanjem homogene jednad be dobiva se rje enje oblika:

Dalje, za pojedina rje enja moramo rije iti originalnu jednad bu. Kori tenje Laplaceove
transformacije, mo emo transformirati jednad bu i rje enje za xL(s).

Zatim, pomoæu inverzne Laplaceove transformacije, mo emo rije iti za x (t). Rje avanje
ovog integrala æe nam dati rje enje diferencijalne jednad be koja je analogna modelu
raèunala.

Ili da bismo mogli koristiti analogni raèunar.

Jednom kad imamo stabilan spoj dizajna, mo emo prijeæi na modeliranje jednad be sa
veæim sklopovima.
Dizajn na eg prvog analognog raèunala:
U na prvi sklop dizajna, poku ali smo direktno implementirati sklop, bez da ga se
umanjuje. Ovdje je originalni blok dijagram na eg jakog harmonièkog oscilatora.
14
I ovo je shema sklopa koji smo izgradili, zajedno sa otpornikom i vrijednosnim
kondenzatorom.

Odgovor orginalnog sklopa za razlièite ulazne valove


Svi sljedeæi ulazni valovi su bili na istoj amplitudi i istoj frekvenciji (100 Hz)
. U svim
sljedeæim dijagramima, ulazni val je plava, a izlazni je zelena linija.
15
Kvadratni val Sinusni val
Efekti uma su zapa eni kod svih izlaznih valova. Svi izlazni oblici valova proizvod
e
karakteristièni termalni um. Takoðer se mo e primijetiti da je izlazni oblik valova za
ovaj
sklop bio vrlo slièan, bez obzira na ulazni val. Ovaj sklop je takoðer dao bolji odg
ovor,
barem u smislu va nosti, kod kvadratnih valova nego kod sinusnih i trougaonih valo
va
Podruèje programabilnih ulaznih polja
Moderna inkarnacija ièanog programiranja je u specijaliziranim programabilnim èipovim
a
tipa FPGA. Za neke jaèe kalkulacije mo e se konstruisati elektrièni sklop koji mo e rije i
ti
na problem mnogo br e nego trenutni mikroprocesor.
FPGA je integrisani sklop dizajniran da bude pode en od strane kupca/korisnika ili
dizajnera poslije procesa proizvodnje-odakle i programibilno polje . FPGA konfigur
acija je
generalno/opæenito odreðena pomoæu HDL-a (hardware description language) slièno
onome koji se koristio za upotrebu aplikacija specificno intergisanog sklopa (AS
IC),
(sklopni dijagrami su se prethodno koristili za odreðene konfiguracije, kao sto su
bili za
ASIC procesi, ali je ovo izuzetno rijetko). FPGA se moze koristiti za implementa
ciju bilo
koje logicne funkcije koju moze obavljati ASIC. Moguænost a uriranja funkcionalnosti
poslije dostave i niskih bespovratnih tro kova, tehnièki, relativno ko ta ASIC dizajn
(ne
odupiruci se opæenito veæoj jedinstvenoj cijeni) nudeæi prednost za mnoge
aplikacije/zahtjeve.
FPGA sadr i programibilne logièke komponente zvane logièki blokovi i hijerarhija
rekonfigurabilne povezanosti koja omoguæuje blokovima da budu ièno -zajedno (wired
together) ne to poput jednog èipa programbilne makete. Logièki blokovi mogu biti
konstruirani za obavljanje kompleksnih kombinacija funkcija ili samo za jednosta
vna
logièka kola kao to su AND i XOR. U veæini FPGA, logika blokova ukljuèuje pamæenje
elemenata koji mogu biti jednostavni flip-flopovi ili vi e cjelokupnih blokova mem
orije.
U VHDL, dizajn se sastoji od minimuma cjelina koje opisuju suèelje i arhitekturu,
koja
sadrzi trenutne implementacije. Osim toga, veæina dizajnera uvozi zbirke modula. N
eki
dizajneri takoðer sadr e vi e arhitekture i konfiguracija.
Jednostavno AND kolo u VHDL-u bi izgledalo otprilike ovako :
16
-- (this is a VHDL comment)

-- import std_logic from the IEEE library


library IEEE;
use IEEE.std_logic_1164.all;

-- this is the entity


entity ANDGATE is

port (

IN1 : in std_logic;

IN2 : in std_logic;

OUT1: out std_logic);


end ANDGATE;

architecture RTL of ANDGATE is


begin

OUT1 <= IN1 and IN2;

end RTL;

Dok se primjer iznad mo e uciniti vrlo govorljivim (rjeèiv) za HDL poèetnike, treba imat
i
na umu da su mnogi dijelovi ili neobavezni ili trebaju biti napisani samo jednom
. I opæenito
jednostavne funkcije kao ova su dio veæeg modula djelovanja, umjesto da se ima odv
ojen
modul za ne to tako jednostavno. Osim toga, kori tenje elemenata poput tipa std_logi
c
mo e u poèetku biti overkill (preoptereæenje). Jedna mo e lako koristiti tip izgraðenih b
i izbjeæi uvoðenje biblioteke u poèetku. Meðutim, kori tenjem ovih 9 -logièkih vrijedosti (
U,X,0,1,Z,W,H,L,-) umjesto jednostavnih bitova ( 1 , 0 ) nudi vrlo opse ne simulac
ije i alat
za otkrivanje gre aka dizajnera koji trenutno ne postoji u bilo kojem HDL-u.
[1] je grafièki ureðaj za raèunanje, dvodimenzionalni dijagram dizajniran je da omoguæi
pribli no
grafièko izraèunavanje funkcije.
17
Programiranje u programskim jezicima niskog nivoa
Ma inski jezik
Od hardwarea pa prema softwareu
Raèunarski sistem sastoji se od hardvera i softvera. Hardver èine delovi raèunara, a
softver èine programi po kojima raèunar radi. Raèunar je ma ina bez inteligencije.
«Inteligencija raèunara nije ni ta veæa od inteligencije onog kontejnera pored fakulteta»*
.
Raèunar izvr ava samo ono to mu je zadato i to na naèin na koji mu je zadato.
Programom zadajemo raèunaru na koji naèin izvr ava poslove. Da bi re ili neki problem
kori æenjem raèunara, moramo raèunaru precizno opisati sve korake-instrukcije (naredbe)
koje on izvr ava redosledom koji mu je zadat. Skup instrukcija napisan za re avanje
nekog problema naziva se program, a pisanje instrukcija programiranje.
Za komunikaciju izmeðu ljudi koriste se jezici. Jezik je sredstvo za predstavljanj
e i
preno enje informacija, sredstvo za komunikaciju. Èovek mora na neki naèin da saop ti
raèunaru niz instrukcija koje on treba da izvr i. Programski jezik je sredstvo kojim
èovek
saop tava raèunaru program. Kori æenjem programskog jezika komuniciraju èovek i
raèunar. Prirodni jezici dopu taju nejednoznaènost i nepreciznost. Raèunar mo e
«razumeti» samo formalan zapis, ne toleri uæi ni najmanje nepreciznosti. Zbog toga je
do lo do razvoja programskih jezika koji omoguæavaju zapis niza instrukcija raèunaru k
oje
se ne mogu vi eznaèno protumaèiti. Jednoznaènost svake konstrukcije programskog
jezika je njegova najbitnija karakteristika. Programski jezik je skup pravila ko
jim se
predstavljaju instrukcije i opisuju podaci raèunaru.
Razlikujemo tri nivoa programskih jezika:

ma inski jezik
simbolièki jezik
jezici vi eg nivoa
Ma inski zavisni jezici
Najjednostavniji programski jezik je interni jezik raèunara ma inski jezik.
Najva niji delovi raèunara izgraðeni su od elektronskih i magnetnih komponenti, koje
karakteri u dva stabilna stanja (ima napona nema napona, teèe struja -ne teèe struja,
severni pol ju ni pol). Zbog tehnièke realizacija raèunara u raèunari se sve predstavlja
pomoæu dva simbola 0 i 1, binarnom azbukom. Jedan znak binarne azbuke predstavlja
bit
(binary digit). Sve informacije u raèunaru predstavljaju se nizom bitova grupisani
m u grupe
od 8, 16, 32, 64 bita. Grupa od 8 bitova naziva se bajt (byte).
Ma inski jezik je izgraðen nad binarnom azbukom. Sve operacije i svi podaci
predstavljeni su nizom bitova. U zavisnosti od arhitekture raèunara ti nizovi bito
va imaju
razlièita tumaèenja i razlièite su velièine.
Kako se ma inski program sastoji od niza nula i jedinica, i zahteva dobro
poznavanje naèina rada i arhitekture odreðenog raèunara, vrlo je te ko programirati na
njemu. Programi na prvim raèunarima bili su zapisani ma inskim jezikom, i to je uslo
vilo da
uzak krug ljudi pi e i odr ava programe.
**prof.dr. eljko Juriæ, sa predavanja.
18
Da bi se premostile pote koæe pisanja programa na ma inskom jeziku dolazi do
razvoja simbolièkih jezika. Umesto instrukcija pisanih nizom bitova uvedene su
mnemotehnièke skraæenice za operacije i simbolièke oznake podataka npr. naredbom
ADD a, b vr i se sabiranje podataka a i b. Na taj naèin proces programiranja je u zn
atnoj
meri olak an, ali i dalje zavisi od konkretnog procesora, tj. i dalje je potrebno
poznavati
tehnièke karakteristike konkretnog raèuna za koji pi emo program. Da bi se program
napisan na simbolièkom jeziku izvr avao na raèunaru mora se prethodno prevesti na
ma inski jezik. Kako svakoj naredbi simbolièkog jezika odgovara jedna naredba
ma inskog jezika, posao je automatizovan tako to je napisan program koji kao ulaz d
obija
program napisan u simbolièkom jeziku, a kao izlaz odgovarajuæi program na ma inskom
jeziku. Program koji vr i prevoðenje iz simbolièkog u ma inski jezik naziva se asembler
( translator). Po tom nazivu simbolièki jezik se èesto naziva asemblerski jezik ili
kraæe
asembler. Napomenimo da skup naredbi simbolièkog jezika zavisi od arhitekture raèuna
ra,
pa program napisan u simbolièkom jeziku za jedan raèunar ne mo e se koristiti za raèunar
druge arhitekture, veæ se mora ponovo pisati. Èesto za ma inske i simbolièke jezike
ka emo da su ma inski zavisni jezici. Va no je istaæi da pri programiranju na ma insko
zavisnim jezicima programer morao vrlo detaljno, u malim koracima opisati re avanj
e
problema. Mo emo to uporediti sa procesom gradnje kuæe pri èemu moramo voditi raèuna
o polo aju svake cigle, daske i slièno. Jasno je da pri gradnji kuæe u jednom momentu
moramo detaljno opisati polo aj svake cigle, tj. elemente kuæe predstavljati i na ta
j naèini,
ali pri izradi samog projekta lak e i razumljivije je govoriti o veæim jedinicama np
r. soba,
kuhinja, vrata, prozor i slièno. Kako to izgleda kada koristimo raèunare upoznajmo n
a
sledeæem primeru. Pretpostavimo da treba da saberemo èetri broja. U vi im programskim
jezicima to radimo kori æenjem jedne instrukcije (npr. x=a+b+c+d), kada koristimo
simbolièki jezik prva instrukcija alje prvi podatak u poseban registar (akumulator)
zatim
sledeæom instrukcijom dodajemo drugi broj sadr aju registra i tako dok ne dodamo i
poslednji broj, poslednja instrukcija je preme tanje konaènog rezultata iz registra
u
memoriju.
Maternji jezik raèunara
Veæina stonih raèunara, kako èesto ka emo, radi na bejziku. Ova tvrdnja je samo
delimièno taèna: stoni raèunari, sa gledi ta korisnika, rade na bejziku jer on kuca nard
be
na tom jeziku i na njemu dobija odgovore od raèunara. Sam raèunar ne "razume" bejzik
- u
njegov ROM je ugraðen vrlo slo en program koji naredbe bejzika prevodi na za raèunar
jedino razumljiv jezik -ma inski jezik ili mikrokod -koji se sastoji od velikih ni
zova nula i
jedinica. Maternji jezik raèunara se, dakle, ne odlikuje velikom koncizno æu i pregled
no æu
(razumljivosti da i ne govorimo), a ipak je bolji od bilo kog postojeæeg programsk
og jezika!
Èitavo ovo poglavlje posveæeno je onima koji, poznavajuæi blagodeti bejzika, ele da se
upuste u pisanje ma inskih programa. Zar ima takvih? Ima ih, i to mnogo -svaki ozb
iljan
vlasnik raèunara æe, pre ili posle, preæi na ma inski jezik. Zato, pre nego to preðemo na
ovaj jezik, moramo da objasnimo potrebu za njim.
Razgovor bez prevodioca
Pre svega, zamislite da razgovarate sa nekim Francuzom ne znajuæi njegov jezik.
Razgovor se, dakle, odvija preko prevodioca. Oèigledno je da je potrebno vreme da
ono
to ste eleli da ka ete objasnite prevodiocu, pa zatim on prevede va u reèenicu, saop ti
je Francuzu, razume njegov odgovor i prevede je vama. Isto je tako i kod raèunara
prevoðenje
svake naredbe traje dugo. Ako se jedan ciklus u programu izvr ava 1000 puta,
naredbe unutar tog ciklusa æe 1000 puta biti prevoðene. Programi koji rade na ma insko
m
19
jeziku zato, po pravilu, rade 40-100 puta br e od odgovarajuæih BASIC programa!
Problemi sa brzinom æe, u daljem razvoju raèunara, verovatno biti prevaziðeni, ali pot
reba
za ma inskim jezikom neæe. Mo ete li Francuzu sa kojim razgovarate posredstvom
prevodioca da saop tite taèno ono to mislite? Njemu ne govorite vi nego prevodilac; o
n
nehotice modifikuje neke va e reèenice tako da se nijansa njihovog znaèenja mo e lako
promeniti. Bejzik omoguæava realizaciju èak i vrlo slo enih programa za obradu podatak
a,
ali kada se doðe do osetljive oblasti rada sa periferijskim jedinicama ( tampaèem,
ploterom, modemom i, naroèito, disk-jedinicom) poèinju da se javljaju "nesporazumi"
korisnik
taèno zna ta bi raèunar trebalo da uradi, a raèunar radi ne to slièno tome, ali ne
to! Korisnik tada, u veæini sluèajeva, modifikuje svoje potrebe, to izaziva delimièni g
ubitak
poverenja u raèunar.
I ovaj problem mo e da bude prevaziðen bez ma inskog jezika -postoje specijalizovani
vi i programski jezici za rad sa periferijskom opremom. No, vratimo se opet razgov
oru sa
Francuzom i prevodiocu: ta ako elite da razgovarate o nekoj specifiènoj temi (npr.
raèunaru ZX Spectrum) koju i vi i sagovornik odlièno poznajete ali prevodilac o njoj
nema
pojma? Proæi æe mnogo, mnogo vremena dok prevodilac ne shvati ono to elite da
ka ete; njegov prevod æe, u nedostatku poznavanja struènih termina, postati nerazumlji
v i
na kraju æete morati da prekinete razgovor. Nikada ni jedan konstruktor raèunara i
programskih jezika neæe moæi da predvidi sve potrebe korisnika i da obuhvati sve obl
asti u
kojima æe raèunar biti kori æen! Ma inski jezik omoguæava korisniku da natera raèunar da
radi taèno ono to njemu treba bez posredstva operativnih sistema. Pomoæu ma inskog
jezika realizuje se slo eni softver za obavljanje specifiènih potreba koji, kasnije,
lako mo e
da preraste u poseban programski jezik.
Treba, ipak, reæi da veæina proseènih korisnika raèunara poèinje da pi e ma inske
programe ne zbog zadovoljavanja potreba za nekim sasvim specifiènim aplikacijama
raèunara veæ da bi programi za igre br e radili. Ovo se posebno odnosi na vlasnike spo
rog
ZX81.
Ma inska abeceda
Iako su ma inski jezici, kao to smo rekli, nizovi jedinica i nula, oni se prikazuju
na ne to
pogodniji naèin preko mnemonièkih skraæenica. Pre svega, jedinice i nule treba pretvor
iti u
heksadekadne brojeve (smatramo da vam je poznato ta su heksadekdani brojevi -u
njima se, osim cifara 0-9, javljaju i slova A, B, C, D, E i F, koja redom predst
avljaju "cifre"
10, 11, 12, 13, 14 i 15). Zatim se heksadekadni brojevi grupi u dva po dva (jer su
dve
heksadekadne cifre jedan bajt dok se, sa stanovi ta memorije, jedna heksadekadna c
ifra
naziva "nibble". Zatim se programske instrukcije zamenjuju skraæenicama koje opisu
ju
njihovo dejstvo. Kod procesora Z80 se, na primer, èesto koristi naredba LD A, H ko
ja se
heksadekadno kodira kao 7C. Skraæenica LD dolazi od "load" i znaèi: prenesi sadr aj
registra H u registar A (akumulator).
Za pisanje programa na ma inskom jeziku potrebno je, najpre, shvatiti strukturu na
redbi.
Svaka naredba se sastoji od mnemonièke skraæenice (u gornjem primeru to je bilo LD)
koja se prevodi u dve ili èetiri heksadekadne cifre (jedan ili dva bajta). Iza skr
aæenice se
pi e adresni deo koji govori raèunaru gde se nalaze podaci koje treba da obraðuje. Ova
j
adresni deo mo e da bude neki od procesorskih registara (B, C, D, A, E, H, L kod
procesora Z80, na primer) ili adresa nekog bajta memorije. Naredba LD A, (7530),
na
primer, prenosi sadr aj memorijskog bajta èija je adresa 7530 (ova adresa je
heksadekadna i njoj odgovara dekadna adresa 30000) u procesorski registar A radi

20
obrade.
Kada smo napisali program u mnemonièkim skraæenicama, pristupamo njihovom
pretvaranju u heksadekadne brojeve. Za to mo emo da koristimo tabelu (prema njoj s
e
gore pomenuta naredba LD A, (7530) prevodi sa 3A 30 75) ili gotov program koji v
r i
prevoðenje. Ovakav program mo e da bude vi e ili manje slo en, a vrlo su popularni
slo eni "asembler programi" koji omoguæavaju uno enje skraæenica, ispravljanje,
prevoðenje programa i snimanje na kasetu. Ukoliko radimo manuelno, treba dobijene
heksadekadne brojeve pretvoriti u dekadne (za to se koristi bejzik program ili,
najèe æe,
neki programabilni d epni raèunar) i uneti ih memoriju pomoæu naredbe POKE.
Da sve ovo ne bi ostalo na nivou teoretisanja, sastaviæemo kratak ma inski program k
oji
uveæava sadr aj nekog bajta memorije za 1 i odgovarajuæi prateæi bejzik program.
Ma inski program je pisan za procesor Z80 koji poseduje veæina popularnih modela
(ZX81, Spectrum, TRS 80...) koji su kod nas zastupljeni. Na ma inski program æe
poèinjati od adrese 30000 (heksadekadno 7530) i imaæe svega èetiri instrukcije. Prva
instrukcija (LD A, (753A)) æe u registar A (èesto se naziva i akumulator) dovesti br
oj koji se
nalazi na adresi 753A (dekadno 30010), sledeæa æe poveæati sadr aj registra A za jedan
(INC A), zatim æe sadr aj akumulatora biti vraæen na odgovarajuæe mesto u memoriji (LD
(753A),A) i na kraju æe se izvr avanje ma inskog programa prekinuti (naredba RET) i
raèunar æe se vratiti u bejzik program iz koga je usledio poziv ma inskog. Ceo program
,
kodiran, izgleda ovako:
7530 3A 3A 75 LD A, (753A)
7533 3C INC A
7534 32 3A 75 LD (753A),A
7537 C9 RET
Sa leve strane se nalaze adrese instrukcija, a odmah do njih su same instrukcije
predstavljene kao heksadekadni brojevi. Mnemonièke skraæenice su ispisane pored njih
radi kompletnosti - one raèunaru ni ta ne znaèe.
Rutine iz ROM-a
Program glasi 3A 75 3A 3C 32 75 3A C9 ili, kada ove brojeve pretvorimo u dekadne
: 58
117 58 60 50 117 58 201. Sada nam ostaje da sastavimo bejzik program koji æe uneti
ma inske instrukcije u memoriju, a zatim demonstrirati rad programa:
10 FOR I=0 TO 7
20 READ A
30 POKE 30000+I,A
40 NEXT I
50 INPUT A
60 POKE 30010,A
70 CALL 30000
80 PRINT PEEK 30010
90 GOTO 50
100 DATA 58,117,58,60,50,117,58,201
Nije te ko razumeti rad programa. Najpre se iz DATA naredbe u memoriju unosi ma insk
i
program koji poèinje od adrese 30000. Zatim se od korisnika tra i da otkuca neki bro
j
(podrazumeva se da je taj broj manji od 256), a zatim raèunar poziva potprogram i
na
ekranu prikazuje rezultat.
21
Èak i na ovom jednostavnom primeru se vidi koliko se ma inski programi razlikuju od
raèunara do raèunara. ZX81, na primer, ne poseduje naredbe READ i DATA, pa bi
uno enje programa moralo drukèije da se organizuje. Naredba CALL 30000 bi kod mnogih
raèunara morala da se zameni sa, na primer, B=USR(30000), a kod nekih drugih bi br
oj
30000 morao da bude sme ten negde u memoriji, pa bi se koristilo B=USR(0). Kod
raèunara koji ne koriste Z80 procesor morale bi da se izvr e korenite izmene: èitav
ma inski program bi, to se kodova tièe, bio sasvim razlièit, a mo da ne bi imao ni isti b
roj
naredbi. Kada bismo ovaj program eleli da primenimo na raèunaru BBC model B, sve
instrukcije bejzik programa bi morale da budu promenjene, a neke uop te ne bi lièile
na
one koje smo koristili!
Lako je primetiti da sastavljanje ma inskih programa nije ni malo jednostavan posa
o. Na
program je "znao" gde se nalazi argument operacije koju treba da izvr i i gde da s
mesti
rezultat. Da smo, meðutim, bili ambiciozniji i po eleli da elimini emo potrebu za bejz
ik
programom i da na ma inskom jeziku realizujemo uno enje broja sa tastature i
prikazivanje rezultata na ekranu, na program bi se produ io na stotinak instrukcija
. Ba u
ovome i le i ume nost dobrog programera: cilj je upotrebiti rutine iz ROM-a raèunara z
a
obavljanje nekih zadataka! Raèunar, jasno, negde u ROM-u ima potprogram koji slu i z
a
uno enje podataka sa tastature (ovaj potprogram se koristi za bejzik naredbu INPUT
). Zar
ne bi bilo bolje pozvati ovaj program? Na alost, ROM je toliko veliki da ovaj pro
gram nije
lako pronaæi, a nije lako ni zakljuèiti u kom æe se memorijskom bajtu nalaziti broj ko
ji je
korisnik otkucao posle njegovog izvr avanja.
Zakljuèak
Specifiènost svakog raèunara èine elektronske komponente, njihova logièka povezanost,
kao i njihovo funkcionisanje. Rijeè predstavlja niz bita, odnosno nula i jedinica.
Du ina
rijeèi je broj bita koji je saèinjavaju. U/I jedinica mo e da omoguæi serijski (bit po b
it) ili
paralelni (svi bitovi odjednom) prenos podataka odnosno instrukcija. Repertoar i
nstrukcija
(broj raspolo ivih instrukcija) zavisi od vrste i tipa raèunara. Do kraja 60-tih god
ina
organizacija upravljaèke jedinice zavisila je od repertoara instrukcija. Primjenom
koncepta
mikroprogramiranja omoguæeno je da se operacija (instrukcija) formira od elementar
nih
operacija nazvanih mikrooperacije. Binarni kodovi mikrooperacija nazivaju se
mikroinstrukcije. Umjesto binarnog koda operacije formiraju se mikroprogrami, ko
ji
predstavljaju skup mikroinstrukcija i koji se smje taju u upravljaèku memoriju. Repe
rtoar
instrukcija kod raèunara sa mikroprogramiranjem mo e se jednostavno mijenjati
dopisivanjem novih mikroprograma.
22
Asemblerski jezik
Asemblerski jezici su porodica ni ih jezika za programiranje raèunara,
mikroprocesora, mikrokontrolora i drugih (obièno) integriranih sklopova. Oni provo
de
simbolièan prikaz brojèanih kodova i ostalih konstanti potrebne da se programiraju
posebne CPU arhitektre. Ova reprezentacija je obièno definiran od strane proizvoðaèkog
hardvera, a temelji se na kratice (zvane mnemotehnike) koji poma u programeru da s
e
sjeti pojedinih uputa, registara, itd. Asemblerski jezik je tako specifièan za odr
eðene
fizièke (ili virtualne) raèunarske arhitekture. To je u suprotnosti s veæinom jezika v
isoke
razine, koji se (idealno) prenose.Korisnièki program koji se zove asembler i koris
ti se za
prevoðenje izvje taja asemblerskih jezika u odreðeni ma inski kod. Asembler obavlja vi e
ili manje izomorfne prijevode (jedan-na-jedan preslikavanja) iz mnemonièke izjave
u
ma inske instrukcije i podatke. To je u kontrastu sa programskim jezicima visoke r
azine, u
kojima jedna izjava opæenito je rezultat mnogim ma inskim uputama.Mnogi sofisticiran
i
assembleri nude dodatne mehanizme kako bi se olak ao razvoj programa, su tisku
kontrolu procesa, pomoæ i ispravljanje gre aka. U posebnim , najmodernim asemblerski
m
jezicima ukljuæene su i makro objekti( macro , opisane u nastavku), a nazivaju se makr
o
asembleri.
Asembler
Tipièno moderni asembler stvara objektni kod prevodeæi mnemotehnièke instrukcija
u opcode, te rje avanjem simboliènih imena za memorijske lokacije i drugih subjekata
.
Kori tenje simbolièke reference je kljuèno obilje je asemblera ,spremanje dosada njih
proraèuna i adresa nakon uploada programske modifikacije. Veæina asembler takoðer
ukljuèuje makro objekate za obavljanje tekstualne zamjenue -npr, za stvaranje zaje
dnièke
sekvence, kratke upute kako inline , umjesto naziva potprograma, ili èak i generirati
cijeli
plan programa. Asembler se opæenito jednostavnije mo e napisati nego programski jezi
ka
visoke razine, a moguæe je od 1950 godine. Moderni asembler, posebno je temelj za
RISC
arhitekture, kao to je MIPS, Sun SPARC, i HP PA-RISC, kao i x86 (-64), za optimiz
iranje
maksimalnog potencijala rada cijevi CPU-a. Postoje dvije vrste asemblera, koji s
e temelje
na koliko prolaza je potrebne za izrade datoteke programa:

Prva vrsta One-pass asembler prolazi kroz izvorni kod jednom i pretpostavlja da
æe svi simboli biti definiran prije bilo kakve upute.
Druga vrsta Two-pass asembleri (i Multi-pass asembleri) koji izraðuju tablice
sa svim nerije enim simbolima u prvom prolazu , zatim upotrijebe drugi prolaz za
rje avanje ovih adresa. Prednost one-pass asemblera je brzina, koja nije tako
va na kao to je nekada bio s napretcima u brzini i sposobnosti raèunara. Prednost
two-pass asemblera je da simbol se mo e definirati bilo gdje u programu. Kao
23
rezultat toga, program se mo e definirati na vi e logiènih naèina. To èini s dva
prolaza asemblerski program za lak e èitanje i odr avanje.
Sofisticirani asemblerski jezici visoke razine pru aju apstrakcije kao to su:

Napredna kontrola strukture


High-level proceduru / funkciju deklaracije i saziva
High-level apstraktni tipovi podataka, ukljuèujuæi i structure, zapise, unija, klasa
i
postavki
Profinjena makro obrada ( iako je dostupna na asemblerima od kasne 1960-ih za
IBM/360)
Objektno-orijentirane osobine kao to su: enkapsulacija, polimorfizam,
nasljeðivanje(inheritance), interface.
Struktura asemblerskog jezika
Program napisan u asemblerskom jezik se sastoji od niza instrukcija -mnemotehnik
a koji
odgovaraju toku izvr ne naredbe, tek kada prevede asembler, tada mogu biti uèitane u
memoriju i biti izvr ene.
Na primjer, x86/IA-32 procesor mo e izvr iti sljedeæe binarne instrukcija ( 'MOV') kao
to je
izra eno u ma inskom jeziku:
Heksadecimalni: B0 61 (binarni: 10110000 01100001)
Ekvivalentno asemblerskom jezik je lak e zapamtiti (npr. Intel u sintaksi, mnemonièk
i) :
MOV AL, 61h
Ova instrukcija znaèi: Premjesti (zapravo kopiraj) heksadecimalnu vrijednost '61 '
u registar
procesora poznat kao "AL". (H-sufiks oznaèava heksadecimalnom ili 97 u decimalnom)
.
Mnemotehnièki "mov" predstavlja opcode 1011 koja zapravo kopira vrijednost u druge
naredbe u registar prve naredbe. Mnemonièku naredbu odabrao je dizajner da bi
instrukciju "move" mogao programmer bolje zapamtiti. Tipièna izjava asemblerskog j
ezika,
zarezom odvojena lista argumenata ili parametara koje slijedi opcode. U praksi,
mnogi
programeri ispuste rijeè mnemonièki, to je tehnièki nepravilno, i nazivaju ga "mov"
opcode. Da biste ga stavili na drugi naèin, mnemonièki kao to je "mov" nije opcode, a
li
kao da simbolizira opcode, moglo bi se odnositi na "opcode mov", na primjer kada
se
namjerava na binarnom opcode oznaèiti neki simbol -mnemonièki -sama. Malo moderniji
programeri trebaju da spominju zapravo ono to su u obrascima binarni opcode-ove z
a
posebne upute, razlika je u praksi postala malo zamagljena meðu programerima, ali
ne i
meðu procesor dizajnerima. Transformacijom obiènog jezika u ma inski jezik je postignu
to
asemblerom, i (djelomièno) obrnutog od asemblera tj. disassebler -a. Za razliku od
programskih jezika vi e razine, obièno postoji jedan-na-jedan korespondencija izmeðu
jednostavnog asemblerskog i instrukcija ma inskog jezika. Meðutim, u nekim sluèajevima
,
24
asemblerski jezik pru a pseudoinstukcije koji pro iruju na nekoliko uputa ma inski jez
ik,
pru ajuci obièno potrebnu funkcionalnost. Na primjer, za ma inski jezik kojem nedostaj
e
"granaja ako veæe ili jednako"( "branch if greater or equal" ) instrukcija, asembl
erski jezik
pru a pseudoinstrukcije koje se pro iruje i na ma inski "skup ako je manje od" i "gran
aj
ako je nula ( set if less than i branch if zero )".Veæina asemblera takoðer nudi bogat
jezik makroa (obja njeno ispod) koji se koristi od strane prodavaèa i programera za
generiranje slo enijih kodova i sekvenci. Svaka raèunarska arhitektura i arhitektura
procesora obièno ima svoj ma inski jezik. Na ovoj razini, svaka instrukcija je jedno
stavno
dovoljno da se izvr ava pomoæu relativno malog broja elektriènih sklopova.Raèunari se
razlikuju po broju i vrsti instrukcije koje mogu da izvr e. Na primjer, novi 64-bi
tni raèunari
æe imati razlièit strujni krug od 32-bitnog raèunara. Oni isto tako imaju razlièite velièi
ne,
brojeve registara i prikaze razlièitih vrsta podataka u memoriji. Dok veæina raèunara
za
opæu namjenu su u stanju izvr iti u su tini iste funkcionalnosti.
Osnovni elementi
Bilo koji asembleski jezik se sastoji od 3 vrste instrukcija koje se koriste za
definiranje
programa:
Opcode mnemotehnika (Opcode mnemonics)
Sekcija podataka (Data sections)
Asemblerska direktiva(uputa)
Opcode mnemotehnika
Upute (izjave) u asemblerskmo jeziku opæenito su vrlo jednostavna, za razliku od
onih u programskim jezicima visoke razine. Opæenito, opcode je simbolièko ime za jed
nu
istrukcuju ma inskog jezika, a tu je najmanje jedan opcode mnemonièki definisan za s
vaku
instrukciju ma inskog jezika. Svaka naredba u pravilu sastoji se od instrukcije il
i opcode
plus nula. Veæina upute odnose se na jednu vrijednost, ili par vrijednosti. Instru
kcije mogu
biti bilo neposredno (najèe æe vrijednost u bajtovima, koji se kodira uputama) ili adr
esini
podatci koji se nalaze negdje saèuvane u memoriji. To odreðuje temeljna arhitekture
procesora, asembler samo odra ava kako ova arhitektura radi.
Data sections
Postoje upute koje se koriste za definiranje elemenata za dr anje podataka i
varijabli. Oni definiraju vrstu podataka, du inu i poravnanje podataka. Ove upute
se mogu
definirati da li su podaci dostupni izvan programa (programi sklopljen odvojeno)
ili samo na
program u kojem je definiran dio podataka.
Assembly directives i pseudo-ops
25
Asemblereske direktive su upute koje su pogubili asebleri za vrijeme sklapanja.O
ni
mogu napraviti red programa u ovisnosti o parametrima ulaz od strane programera,
tako
da jedan program mo e biti sklopljen na razlièite naèine, mo da i za razlièite aplikacije.
Oni
se takoðer mogu koristiti za predstavljanje programa, olak avajuæi programerima za
èitanje i odr avanje. Imena pseudo-OPS-a èesto poèinju sa dot da bi ih razlikovali od
ma inske instrukcije.Neki asembleri takoðer podr avaju pseudo-upute, koje generiraju
dvije ili vi e ma inske instrukcije. Obièno, svako konstanti i varijabli je dato ime,
tako da
upute mogu se lak e lokacirati po imenu, to promovi e self-documenting code . U
izvr nom kodu, naziv svakog potprograma je povezan sa svojim entry point , tako da bi
lo
koji poziv potprograma mo e koristiti svoje ime. Unutar potprograma, GOTO destinacij
e
su date oznake.Neki asembleri imaju potporu lokalnih simbola koji su leksièno razl
ièite od
normalnih simbola (npr., kori tenje "10 $" kao GOTO odredi te). Veæina asemblera
osigurava fleksibilno upravljanje simbol, to omoguæava programerima da upravljaju
razlièitim prostorima, automatski izraèunati offset unutar strukture podataka, te dodi
jeliti
oznake koje se odnose na doslovnu vrijednost ili rezultat jednostavnih raèunanja
asemblera.Asemblereski jezici, kao i veæina drugih programskih jezika, dopustaju d
a
komentari mogu biti dodani u red izvornog koda, koje zanemaruju asembler. Dobra
upotreba komentarima je jo va nije u asembleru nego u vi im programskim jezicima, kao
i smisao, svrhu sljedeæe instrukcije je te ko de ifrirati iz samog koda. Pametno kori te
nje
tih pogodnosti mo e uveliko pojednostaviti problem kodiranja i odr avanja nisko razi
nskih
kodova. Sirovi asemblerski kod generisan od strane asemblera ili disasemblera-ko
da bez
komentara, smislenih simbola, ili defenicijama podataka je dosta te ko èitati kada s
e
promjene moraju izvr iti.
Broj operacija (Number of operands)
Instrukcije ce biti kategorizirane po maksimalnom broj operanada (registri, memo
ri kih
lokacija,vrijednosti) izrièito navedeno u uputama.Neki od operanada isto tako bi m
ogli dati
implicitno, pohranjene na vrhu stack-a ili implicitne registre i rezultat se raèun
a kao
dobar(iako ne naredba). Neki setovi instrukcija mogu imati razlièit broj operanada
za
razlièite upute. (U primjerima koji slijede, a,b i c odnose na memorijske adrese i
reg1 ,
ma inske registre.)

0-adresni (nulta adresna ma ina), tzv. stack ma ina : sve aritmetièke instrukcije
odvijaju pomoæu vrh jedne ili dviju pozicija na stack-u, naredbe su: push i pop up
ute
se koriste za pristup memoriji:push a, push b, add , pop c.
1-adresni (jednoadresa ma ina), tzv. akumulator ma ina, ukljuèuje veæinu starijih
raèunara i mnoge male mikrokontrolere. Veæina uputa odredi jednog izrièito prvu
naredbu (registar, memorijsku lokaciju) sa implicitnim akumulatorom: load, add b
,
store c. Vezana klasa je praktièno stack ma ini koje èesto omoguæavaju jedan
eksplicitnu naredbu u aritmetici instrukcije: push a, add b, pop c.
2-adresni (dvoadresna ma ina) -neke RISC i mnoge CISC ma ine spadaju u tu
26
kategoriju. Za RISC ma inu (zahtijeva eksplicitnomemorisko pamæenje), upute æe biti:
load a, reg1; load b, reg2; add reg1, reg2; store reg2, c;

3-adresni CISC(troadresna ma ina) -gore navedeni primjer ovdje mogu se obavljati u


jednoj instrukciji u ma ini s memorijskim instrukcijama: add a,b, c; ili vi e obièno
(veæina ma ina dozvoljva najvi e dvije memoriske instrukcije): move a, reg1; add
reg1, b, c;
3-adresni RISC (troadresna ma ina) -U tipiènoj troadresnoj RISC ma ini, sve tri
instrukcije aritmetièkih uputa moraju biti registrovane, tako izrièiti 2-adresni loa
d /
store upute nisu potrebne. Skup instrukcija sa 32 registara zahtijeva 15 bitova
za
kodiranje tri registrara troadresnog, tako da ovaj program je obièno ogranièena sa
uputama postavljene s 32-bitnim uputama ili du e. Primjer: load a, reg1; load b, r
eg2;
add reg1 + reg2-> reg3; store reg3, c;
Vi e adresni - neke CISC ma ine dozvoljavaju razne naèine adresiranja koje dopu taju
vi e od 3 instrukcija ,kao to je VAX "POLY".
Primjeri:
Java virtual machine JVM (0 adresni):
iload_1
iload_2
iadd
istore_3

MOS 6510 (1 adresni):


jsr xout
lda #<bobot
ldy #28
jsr strout
lda #<bobpa
ldy #2
jsr strout
txa

Motorola 68000 (2 adresni):


print_b_of lea s_ofbeer,a1
bsr print_s
rts
27
print_s
move.b #OUTCH,d7
move.l a1,a2

print_s_loop
add.b (a2)+,(a3)+
beq print_s_done
trap #14
bra print_s_loop

Intel i386 (2 adresni s ogranièenjem):


wait_on_input:
call _kbhit
cmp EAX, 0
je wait_on_input
xor EAX, [EBX]
pop edi

Vax 11 (3 adresni):
loop3:
MULF3 (R5)+, (R6), R9 ; R9 <- A[i, k]*B[k, j] and

; increment pointer for A[i, k]


ADDL2 #400, R6 ; increment pointer for B[k, j]
ADDF2 R9, R8 ; R8 <- R8 + A[i, k]*B[k, j]
SOBGTR R7, loop3 ; decrement loop count, continue if > 0

Makroji (Macro)
Mnogi asembleri podr avaju predefinirane makronaredbe, a drugi podr avaju
28
programer-defined makronaredbe koje ukljuèuju sekvence linije teksta u koje su stavl
jene
varijable i konstante. Ovaj slijed teksta linija ukljuèuje slijed instrukcija, ili
slijed za pohranu
podataka pseudo-OPS-a. Jedan makro je definiran koristeæi odgovarajuæi pseudo-op.
Kada asembler obradi takve izjave, on zamjenjuje izjavu sa tekst linije vezane u
z taj
makro, onda obraðuje ih kao da su se pojavili u izvornom kodu datoteke svi zajedno
(ukljuèujuæi, bolje asembler, irenje makronaredbi koje se pojavljuju u zamjenski teks
t).
Buduæi da makronaredbe mogu imati kratka imena, ali pro iriti na vi e ili zaista puno li
nija
koda, oni se mogu koristiti kako bi smo asemblerske programe puno skratili (zaht
ijevaju
manje linija koda iz programer aplikacija, kao i vi i nivo jezik). Oni se takoðer mo
gu koristiti
za dodavanje vi e razinskih struktura programa. Mnogi asembleri imaju izgraðene (ili
unaprijed definirane) makronaredbe za sistemsko pozivanja i drugih posebnih broj
nih
sekvenci, kao to je stvaranje i pohranu podataka realizirana kroz naprednu Boolean
operaciju nad bitovima koji se koriste u igricama, softver sigurnosti, upravljanj
e podacima
i kriptografiji. Makro asembleri èesto dopu ta makronaredbi da uzimaju parametre. Ne
ki
asembleri ukljuèuju prilièno sofisticirane makro jezike, koji ukljuèuje elemente visok
ih
programskih jezika kao dodatne parametre, simbolièke varijable, kondicionale, niz
manipulacija i aritmetièkih instrukcija, sve kori teno za vrijeme izvr avanja date
makronaredbe. Makronaredbe dozvoljavaju i spremanje konteksta tj. razmjenu infor
macija
. Tako makronaredbe mogu generirati veæi broj asemblerski jezika, na temelju makro
argumenata. To bi se moglo koristiti za generiranje strukture podataka ili "unro
lled" petlje,
na primjer, ili bi se mogli generisati cijeli algoritmi utemeljeni na slo enim par
ametrima.
Npr. : Organizacija koristi asemblerski jezik koji je sna no pro iren pomoæu
makronaredbi,tada se on mo e smatrati vi em programskim jezikom. Makroi su kori teni
za prilagodbu sistema velikih razmjera softver za odreðene kupce u mainframe doba, a
takoðer su kori teni od strane kupca da svoje osoblje zadovolje potrebama izrade
posebne verzije proizvoðaèa operativnih sistema, a to se dogodilo, na primjer, siste
mski
programeri rade s IBM-ovim Monitor System / Virtual Machine (CMS / VM) i sa IBM-
ovim
"real time transaction processing" ("stvarnom vremenska obrada transakcije") dod
atkom,
CICS (Customer Information Control System) a ACP / TPF, airline / financijskom s
istemu
koja je zapoèela u 1970-ih i dalje radi mnoge velike Global Distribution Systems (
GDS) i
kartiènog sistema danas. Takoðer je moguæe koristiti iskljuèivo makro obradu. Moguænosti
generirati asemblerski kod napisan u potpuno razlièitim jezicima, na primjer, za
generisanje verzije programa u COBOL-u koristeæi èisti program makroasemblera, sadr e
linija koda unutar COBOL-a. To je zato to, kao to je realizirana u 1970-ih, pojam m
acro
processing ( obrada makronaredbe ) je neovisna od pojma assembly ("asembler"),
modernom smislu rijeèi obrada, obrada teksta, nego objekt generiranog koda. Koncep
t
makro obrade, u stvari su se pojavila i pojavljuje se u programskog jezika C, ko
ji podr ava
"preprocesor upute" za postavljanje varijabli. Imajte na umu da za razliku od pr
ethodnih
odreðene makro procese unutar asemblera, C preprocesor nije Turing-complete (Turingpo
tpun),
jer nisu imali moguænost da koriste petlje ili "go to". Unatoè moæ makro obrade, to
je zapu teno na vi im programskim jezicima, a preostalih trajnica za asembler. To je
zato
to mnogi programeri su bili prilièno zbunjeni makro parametarima supstitucijom.
29
Stekovni jezici Forth i Postscript
Forth je strukturiran, zahtjevan, reflektivan, stack-Baziran programski jezik .F
orth se
ponekad pi e velikim slovima nakon uobièajene upotrebe tijekom ranijih godina, iako
ime
nije akronim. Proceduralni programski jezik, bez provjere tipa, Forth ima intera
ktivne
znaèajke oba izvr enje naredbi ( to ga èini pogodnim kao ti za sustave koji imaju
nedostatak formalnog operativnog sustava) i sposobnost za prikupljanje sekvenci
naredbi
za kasnije izvr enje. Neke Forth implementacije (obièno rane verzije ili one pisane
za
iznimno lak prenos) navojem kompajlirani kod, ali mnoge druge implementacije. Ia
ko nije
popularan kao drugi programski sistemi, Forth ima dovoljno podr ke za prodaju i
izvoðenje. Forth trenutno koristi Open Firmware, prostor aplikacije, i drugi ugraðen
i
sustavi. Gforth, implementacija u Forth od GNU projekta aktivno odr ava, posljednj
e
izdanje u decembru 2008. 1994 standard trenutno prolazi kroz reviziju, privremen
o
nazvan Forth 200x.
Pregled
Forth okru enju kombinira prevodilac s interaktivnim shell-ovima. Korisnik interak
tivno
odreðuje i vodi potprograme, ili "operacije," u virtualni stroj slièno runtime ! okru enj
u.
Operacije mogu biti testirane, redefinirane i debugged kao izvor je u ao bez recompi
ling
ili ponovno pokretanje cijelog programa. Svi sintaktièki elementi, ukljuèujuæi i osnov
ne
varijable operatera, pojavljuju se kao takva procedura. Èak i ako je odreðena operac
ija
optimizirana tako da ne zahtijeva poziv potprograma, jo uvijek je dostupna kao
potprogram. S druge strane, shell mo e sastaviti i interaktivno upisati naredbe u
koderu
prije nego ih izvodi (Takvo pona anje je uobièajeno, ali nije obavezno).Forth okru enj
a
razlikuju se u naèinu pohranjivanja rezultirajuæeg programa, ali automatski pokrenut
program ima isti uèinak kao i ruèno pokrenut program.Ovaj contrast sa kombinacijom C
sa Unix shell ,pri èemu su kompletne funkcije posebna klasa programskih objekata i
interaktivne naredbe su strogo zadane. Veæina Forth jedinstvenih svojstava proizla
ze iz
ovog naèela. Ukljuèivanjem interakcije, skriptiranja, i kompilacije, Forth je popula
ran na
raèunalima s ogranièenim resursima, kao to su BBC Microsoft i Apple II serije, i dalj
e
ostaje tako u aplikacijama kao to su firmware-i mali mikrokontroleri.Gdje C kompi
lator
sada mo e generirati kod s vi e kompaktnosti i performansi, Forth zadr ava prednost
interaktivnosti.
Stacks
Svaki programsko okru enje sa rekurzivnim potprogramom implementira stack za kontr
olu
toka. Ova struktura obièno pohranjuje lokalne varijable, ukljuèujuæi i potprogramske
parametre (u kao to je C call in value sistemu). Forth èesto nema lokalne varijable,
meðutim, nije ni poziv po vrijednosti. Umjesto toga, srednje vrijednosti èuvaju se u
drugi
stack. Rijeèi djeluju neposredno na zadnje vrijednosti u ovom stack-u. U tom smislu
mo e se nazvati "parametar" ili "podaci" stack, ali najèe æe jednostavno stack . Funkcija-
Poziv stack-a se onda zove "veza" ili "return" stack, skraæeno rstack . Posebna rstack
manipulacijska funkcija koju je omoguæio kernel koristi za privremeno skladi tenje u
nutar
rijeèi , ali inaèe ne mo e se koristiti da proðe parametre ili za rukovanje podacima. Veæi
rijeèi su navedene u smislu njihova uèinka na stack. Tipièno, parametri su postavljeni n
a
vrhu stacka prije nego to je rijeè izvr ena. Nakon izvr enja, parametri se bri u i
zamijene sa bilo kojm povratnom vrijedno æu. Za aritmetièki operatore, ovo slijedi pra
vilo
30
reverse Polish notaticije. Primjer stacka koji ilustrira upotrebu prikazan je na
slikama .
Odr avanje
Forth je jednostavan jezik koji se mo e pro iriti; njegova modularnost i pro irivanje
dozvoljavaju pisanja na visokoj razini programa kao to su CAD sustavi. Meðutim,
pro irivanje takoðer poma e slabijim programerima tipa da napi u neshavtljiv kod,sati
neshvatljivo broj, koji je dao Forth reputaciju kao "pisati-jedini jezik". Forth
se uspje no
koristi u velikim, slo enim projektima, dok je aplikacija razvijena od strane nadl
e nog,
disciplinirani profesionalci su dokazali da se jednostavno odr ava na razvoju hard
verske
platforme tijekom desetljeæa upotrebe.Forth je utoèi te, kako u astronomskim tako i u
prostoru aplikacija.Forth se jo uvijek koristi i danas je ugraðen u mnogim sistemim
a (mali
kompjuterizirani ureðaji) zbog svoje prenosivosti, efikasnog kori tenja memorije, kr
atkog
vremena razvoja, i velike brzine izvedbe. On je implementiran uèinkovito na modern
im
RISC procesorima i procesorima koji ga koriste kao navedeni strojni jezik. Ostal
o upotrebe
Forth-a ukljuèuju Open Firmware boot ROM-ovi koji koriste Apple, IBM, Sun, i OLPC
XO-1
i FICL-based u prvoj fazi kontroler pokretanja sustava FreeBSD operativnog susta
va.
Povijest
Forth je evoluirao od Charles H. Moore-ovih osobnih programskih sistema, koji su
se
kontinuirano razvijali od 1958. Forth je prvi put izlo en drugim programerima u ra
nim 1970im,
poèev i s Elizabeth Rather na US Nacionalnom Radio Astonomskom
laboratoriju.Nakon njihovog rada na NRAO, Charles Moore i Elizabeth formirali su
Forth
1973.godine,i preradili Forth sisteme na desetine drugih platformi u sljedeæem
desetljeæu.Fotrh je nazvan tako 1968.godine jer je fajl koji tumaèi datoteku bio ozn
aèen
Èetvrti, za èetiri (buduæe) generacije softvera-ali IBM 1130 operacijski sistem ogranièi
o
imena datoteka do 5 znakova.Moore je vidio Forth kao nasljednika kompajliranog l
inka
treæe generacije programskih jezika, ili softvera za "èetvrte generacije" hardvera,
a ne kao
èetvrta generacija programskog jezika kao pojam je do ao da se koristi..Buduæi da se
Charles Moore èesto selio sa jednog posla na drugi tokom svoje karijere, rani prit
isak na
uèenje jezika je bio lahk za portanje na razlièite raèunalne arhitekture. Forth sistem
èesto
je kori ten da bi se izneo novi hardver. Na primjer, Forth je prvi stanovnik softver
a na
novim Intel èip 8086 u 1978 i MacFORTH je prvi stanovnik razvoj sustava za prvi Appl
e
Macintosh je 1984.
FORTH, Inc.microFORTH je razvijen za Intel 8080, Nokia-u 6800, i Zilog Z80
mikroprocesor poèetkom 1976. godine. MicroFORTH hobisti kasnije koriste za generir
anje
Forth sistema za druge arhitekture, kao to je 6502 u 1978-oj godini. Brzo irenje i
velika
primjena konaèno su doveli do standardizacije jezika. Uobièajena praksa je zapravo
kodirati standarde FORTH-79 i FORTH-83 u 1979 i 1983 godini, respektivno. Ovi
standardi su ujedinjeni od strane ANSI 1994 god., obièno se nazivaju ANS Forth. FO
RTH
je postao vrlo popularan 1980 god. to je dobro jer je pogodan za mala mikroraèunala
iz
tog vremena,zato to je kompaktan i prenosiv. Barem jedan kuæni raèunar, ima FORTH u
operativnom sistemu. Canon Cat takoðer koristi FORTH za svoj sistem programiranja.
Rockwell je takoðer producirao single-chip mikroraèunala s FORTH jezgrima, R65F11 i
R65F12.
Programer perspektive
31
Dodatne informacije: Reverse Polish notacija
Forth velikoj mjeri oslanja na iskljuèivo kori tenje data stack-a i Reverse Polish n
otacije (ili
postfix notacija RPN), to obièno koriste kalkulatori iz Hewlett-Packarda. U RPN-u,
operator je postavljen iza njegovih operandi, za razliku od uobièajenih infix nota
cija, gdje
se opretaror nalazi izmeðu svojih operanada. Postfix notacija èini jezik lak im za
tumaèenje i pro irenje, Forth ne upotrebljava BNF gramatike, i nema monolitan prevod
ilac.
Produ eno prevodjenje jedino zahtijeva pisanje novih rijeèi, umjesto mijenjanja gram
atike i
mijenja temeljne provedbe. Koristeæi RPN,rezultat za matematièki izraz (25 * 10 + 50
)
mogao bi se napisati na ovaj naèin:
25 10 * 50 + . <cr> 300 ok

Èak Forth strukturalne znaèajke su stack-orijentirane. Na primjer:


: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;

Ovaj kod definira novu operaciju (operacija again 'je pojam koji se koristi za pot
program)
koja sezove FLOOR5 pomoæu sljedeæe naredbe: DUP duplira broj na stack-u; 6 mjesta od
6 na vrhu stack-a, poredi prva dva broja na stack-u (6 i DUPed input), i zamjenj
uje ih s
pravom ili pogre nom vrijed æu, IF uzima pravu-ili-pogre nu vrijednost i odabere izvr avat
i
naredbe odmah nakon njega ili za prijelaz na drugo; DROP odbacuje vrijednost na
stack-
u, a THEN zavr ava uslov. Tekst u zagradi je komentar, koji defini e da operacija oèek
uje
broj na stack-u, i vraæa moguænost promjene broja. FLOOR5 operacija je ekvivalent za
ovu
funkciju napisan u C programskom jeziku:
int floor5(int v) { return v < 6 ? 5 : v - 1; }

Ova funkcija je napisana jezgrovitije kao:


: FLOOR5 ( n -- n' ) 1- 5 MAX ;

Ova operacija se pokreæe na sledeæi naèin:


1 FLOOR5 . <cr> 5 ok
8 FLOOR5 . <cr> 7 ok

Prvo tumaè stavlja broj (1 ili 8) na stack a zatim ga poziva FLOOR5, èije otvaranje
brojeva
pokreæe rezultat. Napokon, poziv za operaciju "." otvara i ispisuje rezultat na ko
risnikov
terminal.
Sadr aji
Forth gramatièko ra èlanjavanje je jednostavno, uprkos tome to nema eksplicitne
gramatike. Interpreter èita ulazne podatke iz ureðaja korisnièkog unosa, onda ra èlanjuje
rijeèi u prostoru ogranièenja.Neki sustavi prepoznaju dodatni razmak znakova. Kad
interpreter pronaðe rijeè, poku ava pronaæi rijeèi u rjeèniku. Ako je rijeè pronaðena, tuma
izvr ava kod vezan uz rijeè, a zatim se vraæa u ra èlanjivanje ostatka. Ako rijeè nije
pronaðena, operacija pretpostavlja da je broj i poku ava se pretvoriti u broj i stav
iti ga na
stack-u, ako je uspje na, tumaè nastavlja sa ra èlanjivanjem ulaznog toka podataka. U
32
suprotnom, ako oba pretra ivanja i broj pretvorbi ne uspije, tumaè ispisuje rijeèi sa
porukom o gre ci koja ukazuje da rijeè nije priznata, èisti ulazni tok, i èeka novog kor
isnièki
unos. Definicija nove operacije zapoèinje znakom : (dvotoèka) i zavr ava sa znakom ;
(taèka-zarez). Na primjer:
: X DUP 1+ . . ;

to æe kompletirati operaciju X, i omoguæiti njegovo pronala enje u rjeèniku.


Veæina Forth sistema ukljuèuju specijalizirane asemblere koji pronalaze izvedive rij
eèi.
Asembler je poseban dijalekt kompilator-a. Forth sastavljaci èesto koriste Reverse
Polish
notacija u kojoj parametri instrukcije prethode instrukciji. Obièno dizajn Forth a
ssembler
konstruira uputu o stack-u, a zatim ga kopira u memoriju kao posljednji korak. R
egistri
mogu biti referenced by naziv kori ten od strane proizvoðaèa, numerirane (0 .. n, kako
je
upotrijebljen u stvarni rad code) ili ime za svoje svrhe u Forth sustavu: npr. "
S" za
registrirati se koristi stack pokazivaè.
Operativni sistem, fajlovi(datoteke) i zadaci
Classic Forth sustavi tradicionalno ne koriste niti operativni sustav niti datot
etski sustav.
Umjesto spremanja koda u datotekama, izvor-kod je pohranjen u blokovima zapisan
na
fizièki disk adrese. Rijeè BLOK treba da odredi broj 1K velièine bloka na buffer adres
i koja
sadr e podatke kojm se obavlja automatsko upravljanjei Forth sustava. Neki diskovi
koriste datoteke pomoæu sustava pristupa disku, gdje se datoteke nalaze se na disk
u u
blok rasponima. Obièno se primjenjuju kao binarni zapisi fiksne du ine, s cijelim br
ojem
zapisa nadisku bloka. Brzo pretra ivanje posti e hashed pristup na kljuèu podataka.
Multifunkcionlnost, najèe æe zahtevanog round-robin rasporeðivanja, obièno je dostupan
(iako vise rijeci i podr ke nisu obuhvaæeni Forth ANSI standardom). Rijeè PAUSE se kor
isti
za spremanje trenutnog zadatka izvr enje konteksta, da biste prona li sljedeæi zadatak
i
vratili ga na njegovo izvr enje kontekstu. Svaki zadatak ima svoj skup, privatne k
opije
nekih kontrolnih varijabli i radno podruèje. Zamjena zadataka je jednostavna i uèink
ovita, a
kao rezultat toga, Forth multitaskers su dostupne èak i na vrlo jednostavanim
mikrokontrolerima, kao to su Intel 8051, Atmel AVR, i TI MSP430.
Za razliku od toga, neki Forth sustavi rade na domaæim operativnim sistema kao to s
u
Microsoft Windows, Linux ili Unix verzija i koriste domaæe operativne sustave i su
stav
datoteka za izvor i podatkovne datoteke, ANSI Standard opisuje Forth operacije k
oje se
koriste za I / O. Ostali ne-standardni sadr aji ukljuèuju mehanizam za izdavanje poz
iva
OS ili Windows sustava, a mnogi daju nastavcima koji zapo ljavaju raspored osigura
va
operativni sustav. Obièno su veæi i drugaèiji skup rijeèi iz samostalan Forth je PAUSE r
ijeè
za izradu zadatka, ovjesa, uni tenje i mijenjanje prioriteta.
Self i cross kompilacije
Potpuno opremljen Forth sustav sa svim izvornim kodovima koje æe sam sastaviti, je
tehnika koja se obièno naziva meta-kompilacija by Forth programera (iako se termin
ne
odgovaraju toèno meta-kompilaciju jer je obièno definirana). Uobièajeno je da se redef
inira
pregr t rijeèi koje su sastavljene od bitova u memoriji. Kompilator rijeèi koristi pos
ebnu
verziju pod nazivom za preuzimanje i èuvanje koja se mogu preusmjeriti u spremniku
u
podruèju memorije.Spremnik podruèje simulira ili pristupa memoriji poèetkom razlièite
adrese od one kod spremnika. Takvi prevodioci definiraju rijeèi za pristup ciljano
j memoriji
33
raèunala, a host(sastavljanje) memorije i raèunala.
Nakon pristizanja i pohrannivanja operacije redefinira se broj prostora, prevodi
lac,
asembler, itd. su recompiled pomoæu novih definicija. To uèinkovito reuses sve kod
prevodilac i tumaè. Zatim, Forth sustava kod je sastavio, ali ova verzija je pohra
njena u
meðuspremniku. Meðuspremnik u memoriji se zapisati na disk, i naèini se pod uvjetom da
je privremeno uèitavanje u memoriju za testiranje. Kad nova verzija pojavljuje se
na posao,
to je pisano u odnosu na prethodnu verziju. Brojne su varijacije takvih prevodite
lje za
razlièita okru enja
Za ugraðeni sustav kodovi mogu biti pisani na drugo raèunalo, tehnika poznata kao cr
oss
kompilacije, preko serijskog porta ili èak jednom TTL malo, a imajuæi rijeèi imena i d
rugih
ne-executing dijelovima rjeènika u izvornom sastavljanju raèunala. Minimalna definic
ije za
takav kompajler budu rijeèi koje podrazumijevaju dohvatiti i pohraniti byte, i rij
eè naredbe
Forth rijeèi koje treba izvr iti. Èesto najvi e vremena dio pisanja udaljenog luka gradi
poèetnog programa za provedbu dohvatiti, spremanje i izvr avanje, ali mnogi moderni
mikroprocesori imaju integrirane moguænosti za ispravljanje pogre aka (kao to su
Motorola CPU32) koji eliminiraju ovaj zadatak.
Struktura jezika
Osnovna struktura podataka u Forth je "rjeènik", koji pronalazi "operaciju" na izv
r ni kod
nazvan strukturom podataka. Rjeènik je ostao u sjeæanju kao stablo povezanih lista
polazeæi od najnovijih (u posljednje vrijeme) definira rijeè najstarijih, dok stra ar,
obièno
NULL pokazivaèa, je pronaðena. Kontekst prekidaè uzrokuje popis pretrage za poèetak u
razlièit list. Povezane liste za pretra ivanje nastavljaju pretragu kao ogranak obje
dninjujuci
glavni kanal na kraju vodeci natrag u nadyorno, stablo. Tu mo e biti nekoliko rjeèni
ka. U
rijetkim sluèajevima, kao to su meta-kompilacije rjeènik moze biti izoliran i samosta
lan.
Efekt podsjeæa na gnije ðenja imenskih prostoru i mogu preopteretiti kljuène rijeèi ovisno
o
kontekstu. Definisana rijeè uglavnom sastoji se od glave i tijela sa glavom koja s
e sastoji
od imena polja (NF) i povezanih polja (LF), te tijelo koje se sastoji od koda po
lja (CF) i
parametar polje (PF). Glava i tijelo rjeènika ulaz tretiraju odvojeno, jer oni ne
mogu biti
bliski. Na primjer, kada Forth program rekompajlira za novu platformu, glava mo e
ostati
na sastavljanju raèunala, dok tijelo ide na novu platformu. U nekim okru enjima (kao
to
su ugraðeni sustavi) glave zauzimaju memoriju nepotrebno. Meðutim, neki crosskompajl
eri
mogu staviti glave u cilj ako cilj oèekuje da podr i interaktivni Forth. [19]
Rjeènik unos
Taèan format unosa rjecnika nije propisan, i implementacije se razlikuju. Meðutim,
odreðene komponente su gotovo uvijek prisutne, iako se taèno velièina i red mogu
razlikovati. Opisan kao struktura, unos rjecnika mo e izgledati ovako:
structure

byte: flag \ 3bit flags + length of word's name

char-array: name \ name's runtime length isn't known at compile time

address: previous \ link field, backward ptr to previous word

address: codeword \ ptr to the code to execute this word

any-array: parameterfield \ unknown length of data, words, or opcodes


end-structure forthword

34
Naziv polja poèinje s prefiksom koji daje duzinu rijeèi imena (obièno do 32 bajtova),
te
nekoliko bita za zastave. Karakter reprezentira ime operacije a zatim slijedi pr
efiks. Ovisno
o pojedinoj provedbi Forth, moze biti jedan ili vi e NUL ('\ 0') bajtova za poravn
anje.
Povezano polje sadr i pokazivaè na prethodno definiranim rijeèi. Pokazivaè se mo e
relativni pomak ili apsolutna adresa koja ukazuje na sljedeæi najstariji brat ili
sestra. Polje
pokazivaèa kod æe biti adresu rijeè koja æe izvr iti koda ili podataka u polju ili paramet
ar
poèetak stroj kod taj Procesor æe se izvr iti izravno. Za debelo definirane rijeèima, kôd
polje pokazivaèa ukazuje na rijeèi koje æe spasiti trenutno Forth pokazivaè instrukcije
(IP)
na povratku stacka, pa teret s novom IP adresom na kojoj nastaviti izvr enje rijeèi.
To je
isto kao to procesor poziv / upute za vraæanje ne.
Struktura kompajlera
Kompajler sam po sebi nije monolitan program. Sastoji se od Forth rijeèi vidljivog
sustava
koji je i korisna je programer. Ovo omoguæava programeru da promijeni rijeèi kompajl
er za
posebne namjene. "Vrijeme prevoðenja" zastava u polje Ime je postavljen za rijeèi "v
rijeme
prevoðenja" pona anje. Veæina jednostavne rijeèi izvr iti isti kôd li su upisani na naredbe
i
redak, ili ugraðen u kod. Prilikom sastavljanja tih, prevodilac jednostavno mjesta
kod ili
navojem pokazivaè na rijeè. [14] klasièni primjeri kompajliranju rijeèi su kontrolne str
ukture,
kao to su IF, a dok. Sve u Forth kontrole strukture, i gotovo sve njegove kompajl
er budu
provedeni u kompajliranju rijeèi. Sve u Forth rijeèi kontrolu protoka izvr iti tijekom
kompilaciju za prikupljanje razlièitih kombinacija primitivnih rijeèi PODRU NICA i?
PODRU NICA (podru nice, ako false). Tijekom kompilacije podataka stog se koristi za
podr ku balansiranje upravljaèka struktura, gnije ðenje, a backpatching podruènih adrese.
Isjeèak:
... DUP 6 < IF DROP 5 ELSE 1 - THEN ...

æe se sastaviti u sljedeæem nizu unutar definicije:


... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...

Brojevi iza PODRU NICA predstavlja skok u odnosu adrese. LIT je primitivna rijeè za
guranje "doslovno" broj podataka na stog.
Kompilacija dr ave i tumaèenje stanja rijeèi:
: analizira ime kao parametar, stvara rjeènik ulaz (debelo definicija) i ulazi u kom
pilaciju
dr ave. Tumaè i dalje èitati razmakom razgranièeni rijeèi iz ureðaja korisnièkog unosa. Ako
rijeè je pronaðena, tumaè vr i prikupljanje semantike povezana s rijeèju, umjesto da
interpretacije semantike. Zadani kompilacija semantika rijeèi su dodati svojoj int
erpretaciji
semantika na trenutnu definiciju. [14] rijeè; (polu-debelo) zavr i definicijama i vr
aæa se na
tumaèenje stanja. To je primjer èije rijeèi kompilaciju semantici se razlikuju od zada
ne.
Interpretacija semantika, (polu-debelo), veæina kontrola protoka rijeèima, i nekolik
o drugih
rijeèi su neodreðene u Forth ANS, to znaèi da oni samo smiju se koristiti unutar defini
cije,
a ne na interaktivnoj komandna linija. [14]
Tumaèa dr ave mo e se mijenjati ruèno sa rijeèima [(lijevo-bracket) i] (desno-zagrada) koj
i
35
ulaze tumaèenje dr ave ili kompilaciju dr ave, odnosno. Ove rijeèi mogu se koristiti s r
ijeèi
doslovno za izraèun vrijednosti tijekom prevoðenja i umetnuti izraèunata vrijednost u
trenutnom debelo definiciju. Doslovno je kompilaciju semantika da se objekt iz p
odataka
stog i dodati semantiku na trenutni debelo definicija to mjesto taj objekt na st
og podataka.
ANS u Forth, trenutno stanje tumaèa mo e se i èitati iz dr ave zastave koji sadr i
vrijednost true kad u kompilaciji dr ave i la nih drugaèije. To omoguæava primjenu tzv
dr avnom pametnih rijeèi s pona anjem koji se mijenja u skladu s trenutno stanje tumaèa.

Neposredna rijeè
Rijeè TRENUTAN obilje ava najnoviju definiciju kao neposredna rijeèi, djelotvorno
zamijeniv i svoju kompilaciju semantike s tumaèenjem semantike. [21] Trenutan rijeèi
obièno se izvode tijekom kompilaciju, ne sastavlja, ali to se mo e nadjaèati koje
programer, u bilo dr ave. ; Je primjer neposredne rijeèi. U ANS Forth, rijeèi odgoditi
uzima
ime kao parametar i dodaje kompilaciju semantika zove rijeèi na trenutnu definicij
u èak i
ako je rijeè je oznaèen odmah. Forth-83 definira razlièite rijeèi sastaviti i [sastaviti
] prisiliti
kompilaciji ne-hitnu i neposrednu rijeèi, respektivno.
Neimenovane rijeèi
Neimenovani rijeèi se mo e definirati s rijeèi: NoName koji kompilira sljedeæe rijeèi do
sljedeæeg, (polu-debelo) i odlazi na izvr enje tokena podataka stog. Izvr enja tokena
daje
neprozirni ruèka za sastavio semantika, slièno djelovanje upuæuje na C programskog
jezika. Izvr enju tokena mogu biti pohranjeni u varijable. Rijeè EXECUTE traje izvr en
je
tokena iz podataka stog i obavlja povezana semantika. Rijeè kompajlirati, (kompajl
iratizarez)
traje izvr enje tokena iz podataka stog i dodaje povezana semantika na trenutnu
definiciju. Rijeèi '(karta) uzima ime rijeèi kao parametar i vraæa token izvr enje povez
anih s
tom rijeè o podacima stog. U interpretaciji stanja, 'RANDOM-rijeè EXECUTE jednak je
RANDOM-word. [22]
Ra èlanjivanje rijeèi i komentare rijeèi:
: , odgoditi, ' i: NoName primjeri su ra èlanjivanja rijeèi koje se iz svoje argumente za
unos korisnik umjesto podataka stog. Drugi primjer je rijeè ((Paren) koja èita i ign
orira
sljedeæe rijeèi do i ukljuèujuæi sljedeæa desno zagradi i koristi se za mjesto u komentare
debelo definiciji. Slièno tome, rijeè \ (backslash) koristi se za komentare koje nas
tavljaju
kraj trenutne linije. Da se rastaviti ispravno, ((Paren) i \ (backslash) mora bi
ti odvojen
razmakom od sljedeæih komentar tekst.
Struktura koda
U veæini Forth sustava, tijelo kod definiranja sastoji se od bilo strojnom jeziku,
ili neki oblik
navojem kod. Izvorni Forth koji slijedi neformalni FIG standardni (Forth interes
na
zajednica), je TIL (navojem Interpretive jezik). Ovo je takoðer pozvao indirektne-
navojem
kod, ali s izravnim navojem i potprogram navojem Forths takoðer su postali popular
ni u
moderno doba. Najbr i moderni Forths kori tenje potprograma navoja, umetnite
36
jednostavne rijeèi kao makronaredbi i izvesti okance optimizacije ili druge optimi
ziranje
strategije da bi kod manjih i br e. [23]
Podatkovni objekti
Kad je operacija varijabla ili drugi objekt podataka, ukazuje na CF runtime kod
povezan s
definiranjem rijeèi koju je stvorio.Operacija je karakteristièno definiranje "defini
ra
pona anje" (stvaranje rjeènika ulaza plus eventualno raspodjeli i inicijalizuije pod
atke
prostora), a takoðer propisuje pona anje kao instancu klase rijeèi da bi izgradili ovu
definiciju operacije. Primjeri ukljuèuju: imena varijablama neincijalizirani, jedn
a æelija
mjesto u memoriji. Primjer pona anja:
VARIJABILNI vraæa svoju adresu na stack
STALNE imena vrijednosti (naveden kao argument konstanta). Primjer pona anja vraæa
vrijednost.
CREATE imena lokacije; prostor mo e biti dodijeljena na ovoj lokaciji, ili se mo e p
odesiti
da sadr i niz inicijalizirane ili druge vrijednosti.
Primjer pona anja vraæa adresu poèetku ovog prostora. Forth takoðer pru a pogonu kojim
programer mo e definirati nove aplikacije specifiène za definiranje rijeèi, navodeæi kak
o
obièaj definiranja pona anja i primjer pona anja. Neki primjeri ukljuèuju kru ne odbojnika
,
imenovan bitovi na I / O port, i automatski-indeksirana polja. Podatkovni objekt
i definirani
ovim i sliènim rijeèima su globalne u djelokrugu. Funkcija osigurava lokalne varijab
le i na
drugim jezicima osigurava podataka stog u Forth (iako Forth takoðer ima stvarne lo
kalne
varijable). Forth stil programiranja koristi vrlo malo objekata zove podataka u
usporedbi s
drugim jezicima; obièno takvi podaci objekti slu e da sadr i podatke koji se koriste r
ijeèi ili
broj zadataka (u multitasked implementaciji)] Èetvrta ne provodi konzistentnost po
dataka
tipa uporabe, to je programer odgovornost za kori tenje odgovarajuæeg operatora za
preuzimanje i pohranu vrijednosti ili druge operacije na podacima.
Programiranje
Rijeèi napisane u Forth-u se skupljaju u izvr nom obliku. Klasièni "indirektni navoj"
implementacije sastavlja popise adresa rijeèi koje treba izvr iti, pak, mnogi modern
i
sustavi generiraju stvarni strojni kod (ukljuèujuæi i pozive na neki vanjski kod rij
eèi i za
druga mjesta). Neki sustavi imaju optimiziranje kompilatora. Opæenito govoreæi, Fort
h
program ia zadatak sprema kao sliku sjecanja i sastavi program s jedinstvenom
naredbom (npr. RUN) koji se izvr ava kada je sastavljena verzija optereæena. Tijekom
razvoja, programer koristi tumaèa za izvr enje i i test .Veæina programera Forth stack
-a
zala u slobodan top-down dizajn, i bottom-up razvoj uz kontinuiranu provjeru i
integracije."Top-down dizajn je obièno razdvajanje programa u" rjeèniku ",zatim kori
ste
visoke razine postavljanja alata za pisanje konaènom programu. Dobro osmi ljen progr
am
Forth èita kao prirodni jezik, i ne implementira samo jedno rje enje, ali i postavlj
a alate za
napad na povezane probleme.
Primjer koda
Hello, world!
Za obja njenje tradicije programiranja "Hello World", pogledajte program Hello, wo
rld!
. Jedan od moguæih implementacija:

37
: HELLO ( -- ) CR ." Hello, world!" ; HELLO <cr>

Operacija CR (Carriage Return) uzrokuje sljedeæe outpute koji æe biti prikazani u no


vom
redu. Ra èlanjivanjem rijeèi. .: glasi dvostruko citat razgranièena string i dodaje kod
na
novijim definicijama, tako da parsiranje stringa æe biti prikazano na izvr enju. Raz
mak
razdvajanje rijeèi ." iz niza Hello, world nije ukljuèen kao dio niza. Potrebno je d
a tumaè
raspozna :: kao Forth rijeè. Standardni Forth sistem je takoðer tumaè, a isti rezultat
se
mo e dobitit upisivanjem sljedeæeg odsjeèka koda u Fotrh konzolu:
CR .( Hello, world!)

(Dot-Paren) je neposredna rijeè koja analizira razgranièeni niz i prikazuje ga. Kao
i kod
operacije .: razdvaja .
Rijeè dolazi prije teksta za ispisOperacija cr dolazi prije ispisa teksta.. Prema
konvenciji,
Forth tumaè ne pokreæe izlaz u novi red. Isto tako po konvenciji tumaè èeka za ulaz na
kraju prethodne linije.nema.U Forth's CR ne podrazumijeva 'flush-buffer', kao to
je to
ponekad sluèaj u drugim programskim jezicima.

Mije anje prikupljanja i tumaèenja


Ovdje je definicija operacije EMIT-Q koji kada se izvr ava emitiran je od jednog z
naka Q:
: EMIT-Q 81 ( the ASCII value for the character 'Q' ) EMIT ;

Ova definicija koristit ASCII vrijednost znaka Q (81) izravno.Tekstaizmeðu zagrada


je
komentirani i ignoriran od strane kompajlera.Operacija EMIT uzima vrijednost iz
podataka
stack-a i prikazuje odgovarajuæi karakter. Sljedeæe redefiniranje EMIT-Q koristi ope
raciju
[ (left-bracket), ] (right-bracket), CHAR i LITERAL -privremeno prebacivanje na
stanje
tumaèa, izraèunavanje ASCII vrijednost Q karaktera, povratak na kompilaciju i dodava
nje
izraèunate vrijednost toka :
: EMIT-Q [ CHAR Q ] LITERAL EMIT ;

Ra èlanjivanje rijeèi CHAR uzmima razmakom razgranièeni rijeèe kao parametar i mjesta
vrijednosti prvi lik podataka stack-a . Rijeè [CHAR] je neposredna verzija CHAR. K
oristeæi
[CHAR], npr. definicija za EMIT-Q mo e se prepisivati ovako:
: EMIT-Q [CHAR] Q EMIT ; \ Emit the single character 'Q'
Ova se definicija koristi \ (backslash) za opisivanje komentara. Obe,i CHAR i [C
HAR] su
unaprijed definirane u Forth ANS. Kori tenje neposrednih i odgoðenih operacija [CHAR
]
mogu su definirani ovako:
: [CHAR] CHAR POSTPONE LITERAL ; IMMEDIATE

Kompletan program RC4 cipher


U 1987 Ron Rivest razvio je RC4 cipher-sustav za RSA Data Security, Inc kod je k
rajnje
jednostavan i mo e biti napisan kao i veæina programera iz opisa. Imamo niz od 256
bitova, sve razlièite. Svaki put polje koje se koristi zamjeni dva bajta. Zamjene
kontroliraju
38
brojila i i j , svaki poèinje 0. Da bi se dobio novi dobili novi i doda se 1. Da bi se
bio
novi j doda se polje bajta u novom i . Slijedi promjena bajtova na i i j . Kod je niz
bitova na zbroju polja bitova u i i j . Ovo je XORed s osam bitova na tekstu za ifrira
nje,
ili Bajt za ifriranje ili za de ifriranje.. Niz je inicijaliziran od 0 do 255. Poto
m korak po
korak koristeæi i i j , dobiva se novi j dodajuæi da je niz bitova na i i kljuè zamj
Konaèno, i i j su postavljena na 0. Sve dopune su modulira ne na 256.Za daljnje
informacije, pogledajte sljedeæe http://ciphersaber.gurus.com
Sljedeæi Standard Forth verzije koristi Core samo rijeèi.
0 VALUE ii
0 VALUE jj
CREATE S[] 256 CHARS ALLOT
: ARCFOUR ( c -- x )

ii 1+ DUP TO ii 255 AND ( -- i )

S[] + DUP C@ ( -- 'S[i] S[i] )

DUP jj + 255 AND DUP TO jj ( -- 'S[i] S[i] j )

S[] + DUP C@ >R ( -- 'S[i] S[i] 'S[j] )

OVER SWAP C! ( -- 'S[i] S[i] )

R@ ROT C! ( -- S[i] )

R> + ( -- S[i]+S[j] )

255 AND S[] + C@ ( -- c x )

XOR ;
: ARCFOUR-INIT ( key len -- )

256 MIN LOCALS| len key |

256 0 DO I S[] I + C! LOOP

0 TO jj

256 0 DO ( key len -- )

key I len MOD + C@


S[] I + C@ + jj + 255 AND TO jj

S[] I + DUP C@ SWAP ( c1 addr1 )

S[] jj + DUP C@ ( c1 addr1 addr2 c2 ) ROT C! C!

LOOP

0 TO ii 0 TO jj ;

Ovo je jedan od mnogih testova za provjeru koda.


CREATE KEY: 64 CHARS ALLOT

: !KEY ( c1 c2 ... cn n store the specified key of length n )

DUP 63 U> ABORT" key too long (<64)"

DUP KEY: C! KEY: + KEY: 1+ SWAP ?DO I C! -1 +LOOP ;

HEX 61 8A 63 D2 FB 5 !KEY

KEY: COUNT ARCFOUR-INIT

CR

DC ARCFOUR 2 .R SPACE

EE ARCFOUR 2 .R SPACE

4C ARCFOUR 2 .R SPACE

F9 ARCFOUR 2 .R SPACE

2C ARCFOUR 2 .R

CR .( Should be: F1 38 29 C9 DE )
PostScript (PS) je dinamièki programski jezik (concatenative) koga su stvorili Joh
n
Warnock i Charles Geschke u 1982. PostScript je najpoznatiji po tome to je jezik
za
opisivanje stranica u elektronièkim i i podruèjima stalnog izdava tva.
Jezik
PostScript je Turing-complete programski jezik, koji pripada grupi concatenative jez
ika.
Tipièno, PostScript programi se ne proizvode prema ljudima, kao drugi programi. Meðu
tim,
39
moguæe je pisanje raèunalnih programa u PostScript kao u bilo kojem drugom
programskom jeziku. PostScript je intrepetirani, stack-based jezik slièan Forth-u,
ali s jako
dinamièanim pisanjem i strukture podataka inspirirane kao one u Lisp.scoped memori
ji i,
buduæi da je jezik na razini 2,orijentiran je i na garbage collection.. Jezik kori
sti Reverse
Polish notaciju, to èini redoslijed operacija jednoznaèanim,, ali èitanje program zahti
jeva
malo vje be, jer treba imatii izgled stack-a na umu. Veæina operatora ( to je u drugim
jezicima pojam funkcije) uzima svoje argumente iz stack-a, i mjesto njihovih rez
ultati je na
stack-u. Literala (npr. brojevi) imaju uèinak postavljanja svoje kopije na stack-u
.
Sofisticirani strukture podataka mogi biti izgraðene na polju i rjeènik tipa, ali ne
mo e biti
progla en u sistemu pisanja, koji ih vidi sve samo kao polja i rjeènicima, tako da s
vako
daljnje pisanje æe biti primenjeno na korisnièki definiran "tip" koji je lijevo od k
oda koji ih
provodi.
Simbol "%" se koristi za uvoðenje komentara u PostScript programe. Kao opæe konvenci
je,
svaki PostScript program bi trebao poèeti sa znakovima "%!" tako da svi ureðaji mogu
to
ispravno protumaèiti kao PostScript.
Hello World
Hello World program je uobièajen naèin da se poka e mali primjer kompletanog programa
u odreðenom jeziku, mo e izgledati ovako u PostScript-u (razina 2):
%!PS
/Courier % name the desired font
20 selectfont % choose the size in points and establish

% the font as the current one


72 500 moveto % position the current point at

% coordinates 72, 500 (the origin is at the

% lower-left corner of the page)


(Hello world!) show % stroke the text in parentheses
showpage % print all on the page

or if the output device has a console


%!PS
(Hello world!) =

Jedinice za du inu
Postskriptum koristi taèku kao jedinicu za du inu. Meðutim, za razliku od nekih drugih
verzija taèke, PostScript koristi toèno 72 bodova za inch. Tako je:
Na primjer, kako bi privukao vertikalne linije duljine 4cm, dovoljno je napisati
:
0 0 moveto
0 113.385827 lineto stroke
PostScript koristi single-precizne realne brojeve (24-bitni kazaljka), tako da nem
a smisla
koristiti vi e od 9 znaèajki i odrediti decimalni realni broj. Za prijedlog grafika,
broj
znaèajnihznaèajki mo e biti smanjen.
40
Nestrukturano programiranje u programskim jezicima visokog
nivoa
Ne-strukturirano programiranje je historijski najranija programska paradigma koj
a je bila u
stanju stvoriti Turing-complete algoritme. Praæeno je historijski kao proceduralno
programiranje a onda kao objektno-orijentirano programiranje,oba su smatrana kao
strukturirano programiranje.
Nestrukturirano programiranje je sna no kritizirano zbog proizvodnje jedva èitljivih
kodova i
ponekad se smatralo da ima lo pristup za stvaranje velikih projekata, ali je pohv
aljeno za
slobodu koju pru a programerima.
Tu su ujedno i visoke i niske razine programskih jezika koji koriste ne-struktur
irano
programiranje. To ukljuèuje rane verzije BASIC-a (kao to su MSX BASIC i GW-BASIC),
JOSS, FOCAL, MUMPS, TELCOMP, COBOL, machine-level code(ma insko kodiranje),
rani asemblerski sistemi (bez proceduralnih metaoperatora), asemblerskih program
za
pronala enje gre aka i nekih skriptnih jezika kao to su MS DOS.
OSNOVNI KONCEPTI
Program u ne-strukturiranom jeziku obièno se sastoji od sekvencijalno zapovjednih
naredbi, ili izjava, obièno po jedan u svakoj liniji. Linije su obièno numerisane il
i mogu imati
oznake, ovo omoguæava protok izvr enja za skok na bilo koji red u programu.
Ne-strukturirano programiranje uvodi osnovne koncepte kontrole toka, kao to su pe
tlje,
grane i skokove. Iako nema pojma o proceduri u ne-strukturiranoj paradigmi, potp
rogrami
su dozvoljeni. Za razliku od postupka, potprogram mo e imati nekoliko ulaza i izla
za, te
direktni skok u potprogram ili iz potprograma je (teoretski) dozvoljen.
Nema koncepta lokalne varijable u ne-strukturiranom programiranju (iako za sklap
anje
programa, registri opæe namjene mogu slu iti istoj svrsi nakon spremanja na ulaz), a
li
labele i varijable mogu imati ogranièeno podruèje djelovanja (Na primjer, grupa lini
ja). To
znaèi da nema (automatski) dodatak kada osvje iti potprogram koji dozivate, tako da
sve
varijable mogu zadr ati svoju vrijednost iz prethodnog poziva. To èini opæu rekurziju
(opis
procesa ponavljanja objekata na samoslièan naèin je rekurzija) te kom, ali neki sluèajev
i
rekurzija gdje nisu potrebene vrijednosti stanja potprograma nakon rekurzivnog p
oziva -
moguæe su ako su varijable koje su posveæene rekurzivnom potprogramu izbrisane (ili
reinicijalizirane
na svoju izvornu vrijednost) na ulazu u potprogram. Dubina stvaranja mo e
isto tako biti ogranièena na jednu ili dvije razine.
VRSTE PODATAKA
Ne-strukturirani jezici dopu taju samo osnovne tipove podataka, kao to su brojevi,
nizovi i
redovi (numeriran skup varijabli istog tipa). Uvoðenje polja u ne-strukturiranim j
ezicima bio
je znaèajan korak naprijed, èineæi tok obrade podataka moguæim unatoè nedostatku
strukturirane vrste podataka.
PROGRAMSKI JEZICI
Da bi bio izvediv, plan mora biti napisan u binarni ma inski kod, koji poznaje pro
cesor.
Ma insko programiranje je te ko i dovodi do gre aka. Nadalje, buduæi da svaki tip
41
procesora ima svoj ma inski kod, program napisan za jednu vrstu procesora nije izv
ediv
na bilo kojoj drugoj vrsti procesora.
FORTRAN
Danas, veæina programa su pisana u jezicima visoke razine, koje slièe engleskom pa s
u
zbog toga lak i za kori tenje nego ma inski kod, ali koji imaju ogranièen, specijalizira
n
rjeènik i jednostavnu sintaksu bez dvosmislenosti. FORTRAN (Formula Translation),
predstavljen 1956. godine, bio je prvi jezik visoke razine. Od tada je nekoliko
puta bio
ispitan (pregledan). Fortran 77,misleæi da neæe biti posljednja verzija, irom je bio
dostupan i kompatibilan s kasnijim verzijama.
U jezicima visoke razine instrukcije nisu izvedive. Umjesto toga, programski jez
ici visoke
razine izvorni program èitaju kao ulaz od strane programa koji se zove
prevodilac(kompajler), koji provjerava njegove sintakse i, ako nema gre aka, sasta
vlja
ekvivalentan ma inski programski kod objekta. (Ako izvorni program sadr i sintaksne
gre ke, prevodilac(kompajler) izbacuje broj poruka koji ukazuju na prirodu gre ke i
gdje su
te gre ke nastale.)
Iako je u ma inskom kodu, objektni program je nepotpun, jer sadr i napomene za
potprograme a koji zahtijeva zajednièke poslove kao to su èitanje ulaza, rezultata iz
laza i
raèunanja matematièkih funkcija. Ovi potprogrami su grupisani zajedno u bibliotekama
koje su na raspolaganju za kori tenje od strane svih objektnih programa. Za stvara
nje
izvedivog programa objektni programi zahtjevaju da budu povezani sa bibliotekama
potprograma. Izvr ni program tada mo e biti uèitan u memoriju i pokrenut.
CHARACTER tip
Konstanta tipa CHARACTER, (èesto zvana STRING) je niz znakova koja mogu biti velik
a
slova abecede, numerièka slova, praznine, kao i: + - * / = (),. '$:
Kada su ukljuèi u Fortran izvje taj, niz mora biti razdvojen jednostrukim navodnicim
a ( ').
Jedan citat mo e biti ukljuèen u niz tako to pi emo dva uzastopno. Samo je jedan
zadr an.
Primjer: 'WE''RE A'' JOCK TAMSON''S BAIRNS.'

INTEGER tip
Konstante tipa INTEGER su cijeli brojevi.
Primjeri: 123 + 1 0 4356 -4
INTEGER konstante su predstavljene u taènom obliku. Njihova velièina ima granicu koj
a
ovisi o du ini rijeèi.
REAL tip
Konstante tipa REAL su brojevi koji mogu ukljuèivati razlomke. Realni brojevi su z
apravo
ono to u matematici nazivamo decimalnim brojevima. Karakterizira ih decimalna taèka
koja odvaja cijeli dio od decimalnog dijela broja npr. 2.73. Ukoliko je broj nap
isan bez
42
decimalne taèke, Fortran ga tretira kao cijeli broj. Ako je napisan s taèkom, tretir
an je kao
realni broj. REAL konstanta je pisana u jednom od sljedeæih oblika:
1.
Cijeli dio napisan kao INTEGER konstanta definira se kao prethodnom dijelu, nako
n
èega slijedi decimalni zarez, nakon toga razlomak kao niz decimalnih cifri. Ili ci
jeli
dio ili razlomak, ali ne i oboje, jedan je morao biti izostavljen.
2.
INTEGER konstanta ili konstanta REAL, dalje slijedi decimalni eksponent napisan
kao slovo 'E' nakon toha slijedi INTEGER konstanta. Konstanta je na exponent od
10 a koji se mno i sa prethodnim dijelom.
Primjeri: +123,4 -123,4 .6 E-3 (0.6x10-3) 4.6E3
(4.6x103) 7E-3 2.
REAL konstante su predstavljene u pribli nom obliku. Njihova velièina ima granicu ko
ja
ovisi o du ini rijeèi.
Napomena: eksplicitni tip du ine secifikovan u bajtovima (8 bita) èesto je naveden i
za "*".
VARIJABLE
Varijabla je rezervirani memorijski prostor èiji sadr aj korisnik/programer smije mi
jenjati
tokom izvoðenja programa. Sadr aj dakle mo e biti UPISAN u varijablu. Pri tome se
sadr aj koji je eventualno prethodno tamo stajao bri e i zamjenjuje novim. Upis se v
r i, na
primjer, pridru ivanjem. Opæenito, u FORTRANU, izraze, odnosno vrijednosti izraza,
moramo pridru iti varijablama. Nakon pridru ivanja, varijabla sadr i vrijednost izraza
i u
programu, kad god zatrebamo taj izraz, mo emo upotrijebiti umjesto njega varijablu
kojoj
smo ga pridru ili (u koju smo izraz smjestili). Varijabla dr i vrijednost sve do nov
og
pridru ivanja! Varijabla se sastoji od 1 do 6 velikih slova i decimalnih brojeva.
Primjeri: VOL TEMP A2 COLUMN IBM370
Prostori su zanemareni od strane Fortran 77, npr. "COL UMN 'je ekvivalentno' COL
UMN
'.
Napomena: Prostor postaje znaèajan u "slobodnom formatu" za Fortran 90!
Jasnoæa se mo e pobolj ati tako to odaberemo varijable koje sugeriraju njihovu
upotrebu, npr.
DEGC MEAN STDDEV
Svaka varijabla ima tip, koji propisuje vrstu vrijednosti koju mo e imati. Tip var
ijable mo e
biti naveden eksplicitno ili dodijeljen implicitno.
EXPLICITNI TIP
Tip varijable mo e biti dodijeljen explicitno kao iskaz od strane tipa specifikaci
je. To je
oblik:
type variable_list
gdje je type (tip) naziv vrstei variable_list je jedna varijabla ili lista varij
abli, odvojene
zarezima.
U iskazu se dati tip dodjeljuje za sve varijable u listi.
Primjeri:

INTEGER WIDTH
REAL NUM, K

43
Tip specifikacije izjave se ne sla e u izvr om ma inskom kodu instrukcija. Umjesto tog
a
prevodilac zapisuje imena i tipove varijabli i pohranjuje rezerve za njih. Takve
ne-izvr ne
izjave moraju biti postavljene na poèetak programa, prije prve izvr ne izjave.
IMPLICITNI TIP
Ako se varijabla upotrebljava bez ukljuèenja u tip specifikacije, njegov tip je do
dijeljen
implicitno (po defaultu) prema sljedeæem pravilu: Ako varijabla poèinje slovom od I
do N,
njen tip je INTEGER. Ako to nije ispunjeno, onda je njen tip REAL.
Tako je TEMP REAL varijabla, dok je ITEMP INTEGER varijabla.
U programu je dopu teno pisati
OLOVKA = 6
HEMIJSKA=7.5
bez prethodne deklaracije. Nije meðutim dopu teno pisati
OLOVKA = 6.0
HEMIJSKA = 7
elimo li to, moramo napisati
REAL OLOVKA
INTEGER HEMIJSKA
OLOVKA = 6.0
HEMIJSKA = 7
Napomena: Deklaracija mora biti jednoznaèna: ime varijable se u deklaraciji smije
pojaviti
samo jednom.
DEKLARACIJA
Fortran kao i brojni drugi programski jezici zahtijeva od programera da prije ne
go poène
koristiti imena varijabli u programu, ta imena deklarira, tj najavi i rezervira.
Fortran je
meðutim, ne to liberalniji od npr C-a.

to je deklaracija?
Deklaracija je popisivanje imena varijabli koje æe biti kori tene u programu, uz ist
ovremeno
odreðivanje tipa varijable. Preciznije, deklaracijom se propisuje koji tip podatka
smije biti
smje ten u varijablu.

DODJELJIVANJE VRIJEDNOSTI
Prije nego to se varijabla mo e koristiti u raèunanju, mora joj biti dodijeljena poèetn
a
vrijednost. Ovo mo e biti ispunjeno èitajuæi vrijednosti ulaza ili putem dodjele izjav
a.
READ izjava
READ izjava se koristi za dodjeljivanje vrijednosti varijabli èitanjem podataka iz
ulaza.
Najjednostavniji oblik READ izjave je: READ *, variable_list Gdje je variable_li
st jedna ili
lista varijabli odvojenih zarezom. Ova izjava èita konstante iz terminala, odvojen
e
razmacima, zarezima, ili novim linijama, a dodjeljuje ih kao niz varijabli u lis
ti. Izvr enje
programa se zaustavlja dok se ukljuèi (unese) pravi broj konstanti.
Primjer: READ *, VAR1, VAR2, VAR3
Èeka dok se ne unesu tri konstante, nakon toga dodijeljuje im niz varijabli VAR1,
VAR2 i
VAR3.
44
DODJELA IZJAVA
Najjednostavniji oblik dodjele izjava je:
varijabla = konstanta
To znaèi da je konstanta dodijeljena kao vrijednost varijable na lijevoj strani. I
majte na umu
da '=' znak ima drugo znaèenje nego u algebri. To ne znaèi jednakost, ali je zadatak
operatora.
Primjeri:

TEMP = 74,5
ITEMP = 100
VRSTA PRAVILA
Koji god naèin se koristi za dodjeljivanje vrijednosti varijabli, tip vrijednosti
mora biti
dosljedan sa tom varijablom. Pravila su:
1.
CHARACTER vrijednost ne mo e biti dodijeljena numerièkoj varijabli ili obratno.
2.
INTEGER vrijednost mo e biti dodijeljena REAL varijabli. Vrijednost dodijeljena je
realni ekvivalent cijelog broja.
Primjer: X = 5 je ekvivalent X = 5.0
3.
REAL vrijednost mo e biti dodijeljena INTEGER varijabli. Dodijeljena vrijednost je
odrezana, tako to se odbaci dio razlomka.:
ARITMETIÈKI IZRAZI
Aritmetièki izraz je je onaj izraz koji se dobije izvodeæi niz aritmetièkih operacija
da bi dobili
brojèanu vrijednost koja zamjenjuje izraz. Aritmetièki izraz je svaka smislena
kombinacija operanada i operatora. Operatori, dakle, predstavljaju aritmetièke ope
racije
i, na neki naèin, stvaraju vezu izmeðu operanada. Operand aritmetièkog izraza mo e biti:
numerièka konstanta
numerièka varijabla, to mo e prethoditi predznakom + ili -.
aritmetièki izraz u zagradama, npr. (arithmetic_expression)
Aritmetièke operacije su obilje ene slijedeæim aritmetièkim operatorima.
Operator Operacija
+ Zbrajanje ili predznak +
- Oduzimanje ili predznak

* Mno enje
/ Dijeljenje
** Potenciranje
Aritmetièki izraz ima oblik:
operand [operator operand] ...
Uglate zagrade oznaèavaju da su stavke operatora i operanda neobavezne, da se oni
mogu ponavljati neogranièeno.
45
Spaces (prazan prostor) se mo e koristiti kako bi pobolj ali èitljivost, ali su zanema
reni od
strane kompajlera Fortran 77.
Primjeri:

3,14159
K
(A + B) * (C + D)
-1,0 / X +Y / Z ** 2
2,0 * 3,14159 * RADIUS
Ogranièenja:
1. Dva operatora ne mogu biti napisana uzastopno.
Primjer: *-B nije dozvoljeno. Drugi faktor mora biti stavljen u zagradu, to jest
: * (-B).
2. Operandi moraju biti takvi da su operacije matematièki definirane, npr. dijelje
nje s
nulom, nula na ne to itd, sve je ilegalno (nije dozvoljeno).
EVALUACIJA (PREDNOST REDA)
Aritmetièki izraz se ocjenjuje zamjenjujuæi varijable operandi i izraze u zagradama
njihovim
vrijednostima, i obavljanje operacija naznaèeno je u nizu, koristeæi rezultat svake
operacije
kao operand od sljedeæeg. Va an je redoslijed kojim se izvode operacije, kako je
prikazano na primjeru:
4,0 +6,0 * 2,0
Slijed operacija odreðen je redoslijedom raèunskih operacija, u kojem operatori na b
ilo
kojoj liniji imaju jednaku prednost i prednost se smanjuje prema dolje.
**
* /
+ - (Binarni i unarni)
Koristeæi ovu prednost reda, pravila za procjenu aritmetièkih izraza mogu biti naved
ena
kako slijedi:
1. Evaluacija (procjena) poèinje s lijevom operandom.
2. Varijabla operand, ili izraz u zagradi, se ocjenjuju prije nego to se sljedeæa p
ravila
primjene.
3. Potenciranje se realizuje s desna na lijevo.
Primjer: 2 ** 3 ** 2 vrednuje do 512 (2 ** 9).
4. Sve ostale operacije obavljaju se s lijeva na desno, osim ako operator nije d
rugaèije
naznaèio.
Primjeri:
4,0 +6,0 * 2,0 vrednuje do 16,0
(4,0 +6,0) * 2,0 vrednuje do 20,0
TIP PRAVILA ZA ARITMETIÈKE IZRAZE
Operandi REAL i INTEGER mogu se slobodno pomije ati u aritmetièkom izrazu. Tip
vrijednosti izraza odreðuje se primjenom sljedeæih pravila:
1. Ako su oba operanda istog tipa, vrijednost rezultata je takoðer tog tipa.
46
2. Ako je jedan operand INTEGER a drugi REAL, INTEGER operand se pretvara u svoj
pravi ekvivalent prije nego to se operacija izvede, a vrijednost rezultata je REA
L.
Ovo pravilo nije u skladu s pravilima iz aritmetike, u kojem se dijeljenjem jedn
og cijelog
broja sa drugim (npr. 7 / 5) ili podizanjem cijelog broja na cijeli broj (npr. 2
-1) ne dobije
uvijek kao rezultat cijeli broj.
Primjeri:
Vrijednost
99/100 0
7 / 3 2
-7 / 3 -2
N ** (-1) 0
N ** (1 / 2) 1
100 * 9 / 5 180
9 / 5 * 100 100
ARITMETIÈKI ZADATAK
Kao to je navedeno na poèetku poglavlja, vrijednost aritmetièkog izraza je dodijeljen
a
numerièkoj varijabli u izjavi (iskazu) oblika:
numeric_variable = arithmetic_expression
Ako se tip izraza razlikuje od varijable, pravila navedena pod 'Type rules (Tip
pravila) se
primjenjuju, tj.
Expression Promjenljivi Rule
tip tip
INTEGER REAL Pretvori u Real
REAL INTEGER Skratiti
PRINT izjava
Izlaz mo e biti printan koristeæi PRINT izjavu, koja je vrlo slièna READ izjavi:
PRINT *, output_list
output_list je jedna konstanta, varijabla ili izraz ili popis stavki, odvojenih
zarezima.

Primjer: PRINT *,'THE RESULTS ARE', X ,'AND',Y


PRINT izjava ispisuje izlazne liste na ekranu terminala u standardnom formatu.
PROGRAM izjava
Programu se opcionalno mo e dati ime tako da poèinje sa jednom PROGRAM izjavom. To
je oblik:
PROGRAM program_name
gdje program_name je naziv u skladu s pravilima za Fortran varijable.

47
STOP i END izjave
Svaki program mora zakljuèiti s tvrdnjom END, koja oznaèava kraj programa. END izjav
a
mo e da bude samo na kraju programa. Izjava STOP zaustavlja izvoðenje programa. U
Fortranu 77/90, ali ne u prethodnim verzijama, END je takoðer imao isti efekat. St
oga, ako
je izvr enje jednostavno da se zaustaviti na kraju programa, STOP nije obavezno.
Meðutim, jedna ili vi e STOP izjava mo e biti napisana ranije.
IZGLED PROGRAMA (fiksni oblik Fortran 77)
Kada je uveden Fortran, bu ene kartice bile su zajednièki medijski ulaz. Fortran je
osmi ljen kako bi se iskoristio raspored kartice '80-kolone ignoriranjem razmaka i
rezervacije razlièitih podruèja kartice za razlièite svrhe. Iako se kartice vi e ne kori
ste,
Fortran i dalje koristi ovu kolonu na temelju rasporeda. Svi Fortran izvje taji mo
raju biti
napisani u kolonama 7 do 72. Izjava zavr ava zadnjim znakom u liniji, osim ako slj
edeæa
vrsta ima bilo koji znak osim 0 u koloni 6. Svaki takav karakter oznaèava da su ko
lone 7 do
72 nastavak prethodne vrste. Kolone 73 do 80 su zanemarene od strane kompajlera.
Izvorno, ove su kolone kori tene za ispis niza brojeva na karticama, ali sada se n
ormalno
ne koriste. Kolone 1 do 5 su rezervisene za izjavne oznake (statement labels).
Izgled pravila prikazani su na slici 5..
Columns Usage
1-5 Statement labels
6 Continuation character or blank
7-72 Fortran statements
73-80 Unused
Slika 5: Izgled Fortrana
JEDNOSTAVAN PROGRAM
Sljedeæi primjer koristi Fortran izjave koje smo upoznali do sad da bi se rije io je
dnostavan
problem.
Primjer 1: Vozaè puni svoj rezervoar benzinom prije polaska na put. Svaki put kad
stane
da bi nasuo benzin on stavlja 40 litara u rezervoar. Na njegovom odredi tu, on pun
i
rezervoar opet i bilje i udaljenost koju je napravio u kilometrima. Napi ite program
koji èita
udaljenost putovanja, broj zaustavljanja i kolièinu benzina koju je stavio na kraj
u putovanja,
a ispisuje prosjeènu potro nju benzina u kilometrima po litri.
1| PROGRAM PETROL
2| INTEGER STOPS, FILLUP

3| C

4| C THESE VARIABLES WOULD OTHERWISE BE TYPED REAL BY DEFAULT

5| C ANY TYPE SPECIFICATIONS MUST PRECEDE THE FIRST EXECUTABLE


STATEMENT

6| C

7| READ *, KM,STOPS,FILLUP

8| USED = 40*STOPS + FILLUP

9| C COMPUTES THE PETROL USED AND CONVERTS IT TO REAL


10| KPL = KM/USED + 0.5

48
11| C 0.5 IS ADDED TO ENSURE THAT THE RESULT IS ROUNDED
12| PRINT *, 'AVERAGE KPL WAS',KPL
13| END

Slika 6: Program za potro nju benzina


Ovaj program ilustrira neke od taèaka o vrsti pretvorbe koja je spomenuta u pretho
dnom
poglavlju. U liniji 8, koristi se broj litara benzina koji se izraèunava. Kompjute
rska vrijednost
je tipa INTEGER, ali se pretvara u REAL kada se dodijeljuju realna varijabla USE
D.
U liniji 10, izraz KM / RABLJENO je ocijenjen kao REAL, ali æe biti skraæen, a ne
zaokru en, kada se dodijeljuje INTEGER varijabla KPL. Dodavanje 0,5 prije skraæivanj
a
ima uèinak zaokru ivanja gore ili dolje. Ovo je korisna metoda zaokru ivanja. To je
ilustrirano dalje u nastavku.
KM/USED KM/USED + 0.5 KPL
12.0 12.5 12
12.4 12.9 12
12.5 13.0 13
12.9 13.4 13
Ovaj FORTRAN program omoguæuje korisnicima dodavanje, promjenu, brisanje ili prika
z
zapisa u datoteci people's names (imena ljudi), po serijskim brojevima. Zapisi s
e moraju
dodati prije nego to se oni mogu mijenjati, brisati ili prikazati.
IMPLICIT INTEGER (A-Z)
CHARACTER*6 EMPSER,SERNO
CHARACTER*16 FNAME,LNAME,BNAME
CHARACTER*21 MSGOK,MSGNG
DATA BNAME /' '/
DATA MSGOK /'1OPERATION COMPLETED.'/
DATA MSGNG /'1INCORRECT SERIAL NO.'/
FOUND = 0
ENDSW = 0

100 FORMAT ('1ENTER FUNCTION NUMBER ')


200 FORMAT (' (1-ADD, 2-CHANGE, 3-ERASE, 4-DISPLAY, 5-END)')
300 FORMAT (' & REQUIRED SERIAL NO.')
400 FORMAT (I1,1X,A6)
500 FORMAT (A16,A16,A6)
600 FORMAT (A16)
700 FORMAT (' ENTER FIRST NAME:')
800 FORMAT (' ENTER LAST NAME:')
900 FORMAT (' ',A16,1X,A16)
1000 FORMAT (A21)

WRITE (6,100)
WRITE (6,200)
WRITE (6,300)
READ (6,400) FNTYPE,EMPSER
IF (FNTYPE.GT.4) GO TO 70
OPEN (UNIT=11, FILE='NAMES')
OPEN (UNIT=12, FILE='WORK')

49
10
READ (11,500,ERR=75,IOSTAT=INT,END=15) SERNO,FNAME,LNAME
IF (INT.NE.0) GO TO 75
IF (EMPSER.EQ.SERNO) GO TO 20
WRITE (12,500,ERR=75,IOSTAT=INT) SERNO,FNAME,LNAME
GO TO 10

15
FOUND = 0
ENDSW = 1
GO TO 25

20
FOUND = 1

25
IF (FNTYPE.EQ.1.AND.FOUND.EQ.0) GO TO 30
IF (FNTYPE.GT.1.AND.FOUND.EQ.1) GO TO 35
WRITE (6,1000) MSGNG
IF (FOUND.EQ.0) GO TO 65
GO TO 55

30
FNAME = BNAME
LNAME = BNAME
GO TO 45

35 IF (FNTYPE.EQ.3) GO TO 40
GO TO 45
40 WRITE (6,1000) MSGOK
GO TO 60

45
WRITE (6,900) FNAME,LNAME
IF (FNTYPE.EQ.4) GO TO 50
SERNO = EMPSER
WRITE (6,700)
READ (5,600) FNAME
WRITE (6,800)
READ (5,600) LNAME

50 WRITE (6,1000) MSGOK


55 WRITE (12,500,ERR=75,IOSTAT=INT) SERNO,FNAME,LNAME
IF (ENDSW.EQ.1) GO TO 65
60 READ (11,500,ERR=75,IOSTAT=INT,END=65) SERNO,FNAME,LNAME
IF (INT.EQ.0) GO TO 55

65
CLOSE (UNIT=11)
CLOSE (UNIT=12)
STOP
70 STOP 10
75 STOP 20
END

COBOL
Cobol je jedan od najstarijih programskih jezika. Njegovo ime je akronim za Comon
Business-Oriented Language , odnosno primjenjuju ga u financijama i administrativ
nim
sistemima za tvrtke.
Cobol je kreirala Grace Hopper u drugoj polovini 1959. godine. Sve je poèelo 8. ap
rila
1959. na sastanku proizvoðaèa raèunara i korisnika, te akademika gdje je ministarstvo
za
50
obranu SAD-a odluèilo sponzorirati i nadgledati odreðene akcije. Sastanak je odr an 28
.
maja 1959. kojeg je predvodio Charles Phillips. Osnovan je odbor na èelu kojega je
bio
Joseph Wegstein koji je tijekom narednih mjeseci kreirao prvu verziju COBOLA. Od
bor su
èinili èlanovi est vodeæih tvrtki proizvoðaèa raèunara i tri vladine organizacije. Ti
proizvoðaèi su bili: Burroughs korporacija, IBM Laboratorije, Honeywell (Minneapolis
) ,
RCA Sperry Rand ,Sylvania Electric Products
Tri vladine organizacije su bile : Amerièko zrakoplovstvo David Taylor Model Basin
NBS
(dana nji Nacionalni institut za tehnologiju)
Ovaj odbor srednjeg dometa je osnovan, ali nikad nije sasvim pokrenut, na kraju je
osnovan pododbor kojeg su èinili: William Selden i Gertrude Tierney iz IBM-a,Howar
d
Bromberg i Howard Discount iz RCA, te Vernon Reeves i Jean Sammet iz Sylvania
Electric Products. Ovaj pododbor je zavr io specifikacije za Cobol u decembru 1959
.
Glavne odrednice su u velikoj mjeri inspirirane jezikom FLOW-MATIC kojeg je izum
ila
Grace Hopper,za koju obièno ka emo da je majka programskog jezika COBOL ,zatim
IBM-ovim COMTRAN-om,jezik kojega je izumio Bob Bemer, te FACT-om jezikom iz
Honeywell-a. Odluka za kori tenje naziva COBOL donesena je na sastanku odbora
odr anog 18.septmbra 1959.
Prvi kompajleri za Cobol su implementirani tijekom 1960, i u decembru je taj ist
i program
pokrenut na dva razlièita tipa raèunara, na RCA te na Remigton-Rand Univac-u
demonstrirajuæi da je moguæe postiæi takvu kompatibilnost. Od 1959. COBOL je podvrgnut
mnogim modifikacijama, to ga je u velikoj mjeri pobolj alo. U pou aju da se rije i prob
lem
nekompatibilnosti izmeðu razlièitih verzija COBOL-a American National Standards Inst
itute
(ANSI) je 1968. razvio standardni oblik jezika. Ova je verzija poznata kao Ameri
can
National Standard (ANS) COBOL. 1974. ANSI je objavio prepravljenu verziju
(ANS)COBOL-a, koji je sadr avao razne dodatke koji nisu bili u verziji iz 1968. go
dine.
1985. ANSI je objavio jos jednu prepravljenu verziju COBOL-a, napredniju od one
iz 1974.
, razvoj jezika se nastavio do danas.
U januaru 1960. sve dotada nje modifikacije su ureðene i izdane pod imenom Cobol 60.
ANSI je proizveo nekoliko revizija COBOL-a ukljuèujuæi: COBOL-68 , COBOL-74 ,COBOL85
,Amandman-1989 ,Amandman-1991 , COBOL 2002 , Finalno tehnièko izvje æe 2003
, XML sintaksno izvje æe 2006
Objektno orijentirane zbirke klasa jo se èeka za odobrenje
Posao se nastavlja do sljedeæe potpune revizije COBOL-a za koju se oèekuje da æe biti
2010.
COBOL se najèe æe koristi u vladinim i vojnim organizacijama, komercijalnim poduzeæima
i operativnim sistemima kao to je IBM-ov z/OS, Microsoft Windows i u familiji POS
IX
(Unix/Linux itd.). 1997. korporacija Gartner je objavila da 80 % svjetskog poslo
vanja
obavlja upravo programski jezk COBOL sa preko 200 milijardi linija koda, i procj
enjuje da
godi nje nastane jo dodatnih 5 milijardi linija koda.
COBOL nije podr avao lokalne varijable, rekurzije, dodjeljivanje dinamièkoj memoriji
te
struktuirane programske strukture, no u kasnijim verzijama je to ispravljeno. CO
BOL ima
preko 400 kljuènih rijeèi, omoguæava sintaksu kao to je:
ADD YEARS TO AGE
Dok je ekvivalentna struktura u veæini programskih jezika age:=age + years , a ova
sintaksa je slièna operatoru dodjele koji je kasnije implementiran u C.
COBOL dozvoljava identifikatore duge do 30 karaktera.
Primjer programa Hello, world u COBOLU:
51
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY 'Hello,world'.
STOP RUN.

Sintaksa COBOLA je obièno bila kritizirana zbog verbalizma, ali neki smatraju to k
ao
pozitivnu stvar jer èini ovaj programski jezik lakim za èitanje i razumijevanje. Tra
dicionalni
COBOL, je imao ogranièen broj funkcija, to ga je èinilo podesnim za namjenu u
poslovnom raèunalstvu.
Programi u COBOLU imaju èetiri dijela:
IDENTIFICATION DIVISION-
Govori raèunaru ime programa,te sadr i ostalu dokumentaciju,odnosno tko je autor
programa, kad je program napisan,a kada kompajliran, za kakvu je namjenu napravl
jen itd.
ENVIRONMENT DIVISION
Ovaj dio govori raèunaru s kojim æe ureðajima suraðivati (printeri,ostale datoteke i sl.
),i
grana se na: CONFIGURATION SECTION (definira izvor) i INPUT-OUTPUT (definira
printer,datoteke koje bi mogle biti kori tene te dodjeljuje identifikacijska imena
ovim
izlaznim jedinicama).
DATA DIVISION
Data division govori o mjestu u memoriji koje je dodijeljeno podacima i identifi
katorima koje
je koristio program. Dvije va ne podjele ovoga dijela su: FILE SECTION (u ovom dij
elu se
definira struktura, velièina i tip podataka koji æe biti ispisani ili uèitani u datote
ku ) i
WORKING STORAGE SECTION.
Pretpostavimo da datoteka 'input.dat' sads i skup naruèioca po redovima:
Joe Bloggs 20Shelly Road Bigtown 023320
John Dow 15Keats Avenue Nowheresville042101
Jock MacDoon05Elliot Drive Midwich 100230

File section æe izgledati ovako


000400 DATA DIVISION.
000410 FILE SECTION.
000420
000430 FD INPUT-FILE.
000440 01 CUSTOMER-DATA.
000450 03 NAME PIC X(12).
000460 03 ADDRESS.
000470 05 HOUSE-NUMBER PIC 99.
000480 05 STREET PIC X(19).
000490 05 CITY PIC X(13).
000500 03 CUST-NUMBER

PROCEDURE DIVISION
Sva logika programa, odnosno sve naredbe se nalaze u ovom dijelu. PERFORM naredb
a
se koristi za poziv drugih paragrafa. Svaka naredba se zavr ava taèkom. Slijedi prim
jer
programa koji tekstualnoj datoteci dodaje brojeve.
52
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. LINE-NO-PROG.
000030 AUTHOR. TIM R P BROWN.
000040****************************************************
000050* Program to add line numbers to typed code *
000060* Allows for comment asterisk, solidus, or hyphen ,*
000070* moving it into position 7. *
000080* *
000090****************************************************
000100
000110 ENVIRONMENT DIVISION.
000120 INPUT-OUTPUT SECTION.
000130 FILE-CONTROL.
000140 SELECT IN-FILE ASSIGN TO 'INPUT.TXT'
000150 ORGANIZATION IS LINE SEQUENTIAL.
000160 SELECT OUT-FILE ASSIGN TO 'OUTPUT.COB'
000170 ORGANIZATION IS LINE SEQUENTIAL.
000180
000185*****************************************************
000187
000190 DATA DIVISION.
000200 FILE SECTION.
000210
000220 FD IN-FILE.
000230 01 LINE-CODE-IN.
000240 03 CHAR-1 PIC X.
000250 03 CODE-LINE PIC X(110).
000260
000270 FD OUT-FILE.
000280 01 LINE-CODE-OUT PIC X(120).
000290
000300
000310 WORKING-STORAGE SECTION.
000320
000330 01 EOF-FLAG PIC X VALUE 'N'.
000340 88 END-OF-FILE VALUE 'Y'.
000350
000360 01 NUMBER-CODE.
000370 03 L-NUM-CODE PIC 9(6) VALUE ZEROS.
000380 03 B-SPACE PIC X VALUE SPACE.
000390 03 L-CODE PIC X(100) VALUE SPACES.
000400
000410 01 NUMBER-COMMENT.
000420 03 L-NUM-COM PIC 9(6) VALUE ZEROS.
000430 03 L-COMMENT PIC X(100) VALUE SPACES.
000440
000450 01 LINE-NUMBER PIC 9(6) VALUE ZEROS.
000460
000470
000480*****************************************************
000490
000500 PROCEDURE DIVISION.
000510
000510 MAIN-PARA.
000520 OPEN INPUT IN-FILE
000530 OUTPUT OUT-FILE
000535
000540 PERFORM UNTIL END-OF-FILE
000550 ADD 10 TO LINE-NUMBER
000560 READ IN-FILE AT END
000570 MOVE 'Y' TO EOF-FLAG

53
000580 NOT AT END
000590
000600
000610
000620
IF (CHAR-1 = '*')
OR (CHAR-1 = '/')
OR (CHAR-1 = '-') THENMOVE LINE-CODE-IN TO L-COMMENT
000630 MOVE LINE-NUMBER TO L-NUM-COM
000640 WRITE LINE-CODE-OUT FROM NUMBER-COMMENT
000660 ELSE
000670 MOVE LINE-CODE-IN TO L-CODE
000680 MOVE LINE-NUMBER TO L-NUM-CODE
000690 WRITE LINE-CODE-OUT FROM NUMBER-CODE
000720 END-IF
000730 END-READ
000740 INITIALIZE NUMBER-CODE NUMBER-COMMENT
000750 END-PERFORM
000760
000770 CLOSE IN-FILE OUT-FILE
000780 STOP RUN.
BASIC
BASIC (Beginner's All-purpose Symbolic Instruction Code) je napredni programski
jezik.
Osmislili su ga maðarski matematièar i informatièar John George Kemeny i amerièki
informatièar Thomas E. Kurtz 1964. godine, kao programski jezik koji bi pribli io sv
ijet
programiranja osobama kojima to nije primarna struka, s obzirom da je svaka upot
reba
kompjutera zahtjevala pravljenje posebnog softvera. Sam jezik je do ivio ekspanzij
u 70-tih
i 80-tih kada na tr iste izlaze kompjuteri manjih dimenzija namijenjeni iroj bazi k
orisnika.
BASIC je i danas odlièan alat za uèenje programiranja, ali i kao osnova mnogo slo enij
ih
jezika poput Microsoft Visual Basic, koji je glavni jezik za .NET platforme.
Tako je recimo, 1977. u magazinu Byte Magazine predstavljana tri glavna kompjutera
tog
doba i sva tri su imali BASIC kao primarni programski jezik i kao operativno suèel
je.
Commodore PET je imao verziju Micro-Soft BASIC , a Apple II i TRS-80 su imali sliènu
ali
noviju verziju. Kako su dolazili novi kompjuteri na tr iste svaki je dolazio sa no
vijom
verzijom, èime su irili veliku familiju verzija BASIC-a. Tako su Atari 8-bit kompjute
ri imali
vlastitu verziju BASIC-a nazvanu Atari BASIC koja je donekle bila modifikovana da
bi
stala na 8kB ROM memorije. BBC je izdao BBC Basic, koji je razvijen od strane Aco
m
Computers Ltd. Koji je sadr avao mnogo novih strukturalnih naredbi. Mnogi kuæni
kompjuteri 80-tih su u ROM memoriji dobijali neku verziju BASIC-a. Samim time, f
amilija
verzija BASIC-a je najveæa od svih programskih jezika.
Primjer jednog koda u BASIC-u:
10 INPUT "What is your name: ", U$
20 PRINT "Hello "; U$
30 INPUT "How many stars do you want: ", N
40 S$ = ""
50 FOR I = 1 TO N
60 S$ = S$ + "*"
70 NEXT I
80 PRINT S$
90 INPUT "Do you want more stars? ", A$
100 IF LEN(A$) = 0 THEN GOTO 90

54
110 A$ = LEFT$(A$, 1)
120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
130 PRINT "Goodbye "; U$
140 END

Varijable

Klasièni BASIC je razumio samo jedan tip varijable i stringove. Imena varijabli u
BASIC-u
su morala na prvom mjestu sadr avati slova, dok je na drugom mjestu moglo biti ili
slovo ili
broj. Stringovi su se uvodili dodavanjem znaka $ nakon imenovanja varijable.
Primjer:
A=5
A$="THIS IS A STRING"
K7=10
BB$="HELLO!"
ZZ=1.54

Jedina numerièka varijabla je bila binarna implementacija pokretnog zareza . Svaka


varijabla je zauzimala 5 bajta memorije i mogla je biti u opsegu od -1E+38 do 1E
+37.
Multidimenzionalne matrice su mogle imati i numerièku i slovnu vrijednost. U tom s
luèaju
adresa elementa u matrici je bila u zagradama kao u ovim primjerima:
A(1)=1
A$(1)="BOOKS"

Dimenzije u matrici se rastavljaju zarezima:


A(1,3)=4
A$(2,2)="XYZ123"

Operatori i simboli
BASIC ima nekoliko operatora za kako matematièke operacije, tako i za string varij
able:
+ sabiranje
- oduzimanje
* mno enje
/ dijeljenje
() za postavljanje primarnosti matematièkih operacija
AND operacija u matematièkoj logici sa znaèenjem i
OR operacija u matematièkoj logici sa znaèenjem ili
55
NOT operacija u matematièkoj logici sa znaèenjem nije
= jednakost
> veæe od
< manje od
>= jednako ili veæe
<= manje ili jednako
<> nije jednako
" " odreðuje da je string podatak konstanta
: razdvaja vi e komandi u jednom redu
Radne naredbe
num znaèi da se tra i numerièka vrijednost. To mo e biti fiksni broj, varijabla ili neka
druga
operacija ili funkcija koja sadr i numerièku vrijednost
str znaèi da se tra i string. To mo e biti statièki string ili string varijabla ili neka
druga
operacija ili funkcija koja sadr i string vrijednosti
device number znaèi da je u pitanju neki ureðaj. Za device 0 se podrazumijeva da su
u
pitanju ekran i tastatura, a u COLOR BASIC-u device#-1 znaèi kasetu a #-2 printer
Funkcije
ABS(num) daje apsolutnu vrijednost za dati broj
ASC(str) daje prvom znaku ASCII string kod
CHR$(num) daje string znaku ACCII numerièki kod
EOF(device number) daje vrijednost 0 ako u fajlu imaju podaci ili -1 ako nema
INKEY$ daje neki znak ako je pritisnututa neka tipka na tastaturi, a ako nije da
je vrijednost
nula
INT(num) daje cijeli broj (integer) od numerièke vrijednost
LEFT$(str,num) daje prvih num slova stringa str
LEN(str) daje du inu stringa
MEM daje vrijednost preostale memorije u bajtima
56
MID$(str,start num,length num) daje novi string iz str poèev od pozicije start num pa
uzimajuæi narednih length num znakova
PEEK(num) daje vrijednost memorije na lokaciji num (0-65535)
POINT(x num, y num) daje boju na grafikonu na poziciji x,y
RIGHT$(str, position num) daje novi string poèev od pozicije num pa do kraja datog
stringa
RND(number) daje proizvoljan broj od 0 do number
SGN(num) daje vrijednost 1 ako je num pozitivan, a ako je negativan daje vrijednos
t-1,
te vrijednost 0 ako je u num 0
SIN(num) daje vrijednost num u radijanima
STR$(num) pretvara num u string
USR(num) poziva ma inski jezièni podprogram na lokaciji 275 i 276 u memoriji, te se
num izvr ava po tom podprogramu, nakon èega se dobija rezultat izvr ene operacije
Komande
AUDIO [ON/OFF] ukljuèuje i iskljuèuje zvuk iz audio kasete
CLOAD [ name ] otvara BASIC program iz kasete. Ako name nije zadan, otvara
sljedeæi program
CLOADM [ name ] otvara program u ma inskom jeziku iz kasete. Ako nije naveden
name , otvara sljedeæi dostupni program
CLOSE [device number] zatvara ureðaj (u COLOR BASIC-u ovo jedino mo e biti #-1, tj.
zatvara kasetu)
CLS(num) èisti ekran, a ako je dat num (0-8) daje boju novom ekranu
CONT nastavlja program nakon to se pritisne pauza ili stop
CSAVE [ name ] snima BASIC program na kasetu pod zadanim imenom
DATA var,var,var,... zadaje podatke u BASIC programu koji se pozovu sa READ
komandom
END kraj programa
EXEC [adresa memorije] izvr ava program u ma inskom jeziku na adresi u memoriji
FOR {num}={broj} TO {broj} [STEP {broj}]...NEXT (num) stvara FOR petlju sa zadan
im
parametrima
57
GOSUB {broj linije} poziva podprogram na datoj liniji
GOTO {broj linije} program se nastavlja od date linije
IF {ne to} THEN {komanda} [ELSE {komanda}] izvr ava kondicionu naredbu, ako je
taèna onda izvr ava THEN a ako nije onda ELSE
LIST [poèetni red] [zavr ni red] izlistava linije programa poèev i zavr avajuæi sa
zadanim linijama
LLIST [poèetni red] [zavr ni red] isto kao i LIST, samo to izlistava na printeru
NEW bri e sadr aj memorije (i program i varijable)
POKE adresa memorije, data zapisuje vrijedonst data (0-255) na adresi memorije (0

65535)
RESET (x,y) resetuje pixel na grafikonu sa koordinatama x (0-63) i y (0-31) na c
rnu boju
RETURN povratak iz podprograma
RUN num pokreæe BASIC program od date linije
SOUND ton, du ina daje zvuk sa frekvencijom tona (1-255) i trajanjem (1-255)
STOP program staje sa izvr avanjem
VAL (str) daje numerièku vrijednost iz stringa ako su u stringu brojevi
58
Struktuirano programiranje
Struktuirano programiranje mo e se posmatrati kao podskup ili subdisciplinarnih
imperativnih programiranja, jedan od glavnih paradigmi programiranja. Ono je naj
poznatiji
za uklanjanje ili smanjenje oslanjanja na GOTO naredbe. Historijski gledano, nek
oliko
razlièitih strukturirane tehnike ili metodologije razvijene su za pisanje struktur
iranih
programa. Najèe æi su:
1. Edsger Dijkstra strukturirano programiranje, gdje je logika programa struktur
a,
sastavljena od sliènih pod-struktura u ogranièenom broju naèina. To smanjuje
razumijevanje program za razumijevanje svaku strukturu vlastitu, te u odnosu na
onaj koji
sadr e to, korisno razdvajanje pitanja.
2. Pogled izvedena iz Dijkstrin koji se takoðer zala e za cijepanje programa u pod-s
ekcije
s jednog mjesta ulaska u zemlju, ali je sna no protivi konceptu jednu toèku izlaza.
3. Podaci Structured Programming ili Jackson strukturirano programiranje, koji s
e temelji
na usklaðivanje strukture podataka s programskim strukturama. Ovaj pristup primije
niti
temeljne strukture koje je predlo io Dijkstra, ali kao konstrukti koji koriste vis
oke razine
strukture programa koji æe se po uzoru na temeljne strukture podataka obraðuju. Post
oje
najmanje 3 glavne pristupu podataka strukturirani programski dizajn je predlo io J
ean-
Dominique Warnier, Michael A. Jackson, i Ken Orr.
Godina nakon Dijkstra (1969), objektno-orijentirano programiranje (OOP) je razvi
jen kako
bi se moglo sudjelovati u vrlo velikim ili slo enim programima (vidi dolje: Objekt
no
orijentirano usporedbe)
Niske razine strukture programiranje
Na niskom nivou, strukturiranih programa èesto su sastavljene od jednostavan,
hijerarhijska toka struktura programa. To su Sequence, selection, i repetition:
"Sequence" se odnosi na nalog za izvr enje izvje taja.

U " selection " jedna od brojnih izjava se izvodi, ovisno o stanju programa. To
se
obièno izra ava s kljuènim rijeèima kao to su if..then..else..endif, switch, or case.
U " repetition ", izjava je obavljena sve dok program dosegne odreðen oblik ili op
eracije
se primjenjuju na svaki element kolekcije. To se obièno izra ava s kljuènim rijeèima kao
to
su while, repeat, for or do..until. Èesto se preporuèuje da sve petlje moraju imati
samo
jedan unos taèke (i originalne strukture programiranja, takoðer samo jedan izlaz bod
), i
nekoliko jezika provoðenja ovog. Jezik je opisan kao "block-strukturiranim" ako im
a
sintaksu za zatvaranjem strukture izmeðu uzastopne kljuène rijeèi, kao to su if-izjavu
uzastopne strane, ako fi .. kao u ALGOL 68, ili broj odjeljak uzastopne BEGIN ..
END, kao
59
u PL / I. Meðutim, jezik je opisan kao "èe lja strukturiranim" ako ima sintaksa za
zatvaranjem objekata unutar redoslijedu rijeèi. "Èe alj-strukturirano" jezik ima vi e kl
juènih
rijeèi da definiraju strukturu odvojene sekcije unutar bloka, analogan vi e zubi ili
zubaca
èe lja u odvajanje dijelova èe lja. Na primjer, u Adi, blok 4-raèvast cesalj kljuènim rijeè
DECLARE, BEGIN, EXCEPTION, END , A ako je izjava-u Adi je 4-raèvast cesalj kljuènim
rijeèima IF, THEN, ELSE, END IF.
Dizajn
Strukturirano programiranje je èesto (ali ne uvijek) povezane s "top-down" pristup
dizajnu.
Top-down je programski stil, glavno upori te u tradicionalnim proceduralnim jezici
ma, u
kojoj dizajn zapoèinje odreðivanjem na slo ene komade i onda ih dijeli na sukcesivno
manje komade. Na kraju, komponente su dovoljno specifièni da bude kodirana, a prog
ram
je napisan. To je upravo suprotno od bottom-up pristup programiranju koja je uob
ièajena u
objektno-orijentirani jezici poput C + + ili Java.
Tehnika za pisanje programa koristeæi top-down metode je napisati nazive svih glav
nih
funkcija koji ce biti potrebni. Kasnije, programerski tim pregleda potreba od sv
ake funkcije
i proces se ponavlja. Ove podijeljene podrutine ce akcju izvoditi tako jednostav
no da se
moze i sa eto kodirati. Kad se sve ove razlicite podrutine kodiraju program je izv
rsen.
Strukturirano programiranje jezici
Strukturno programiranje se moze raditi u bilo kojem programskom jeziku, iako je
po eljno
da se koristi ne to poput proceduralnog programskog jezika. Od oko 1970 kada je
strukturirano programiranje poèelo da stièe popularnost kao tehnika, veæina novih
proceduralnih programskih jezika su ukljuèeni u moguænost potaknuti strukturirano
programiranje . Neki od poznatijih strukturirani programski jezici su ALGOL, Pas
cal, PL / I i
Ada.
Historija
Teorijski temelj
Teorema strukuiranog programiranja daje teorijsku podlogu strukturiranog program
iranja.
On navodi da su tri naèina kombiniranja programa-sekvenciranje, izbor, i iteracije
-dovoljni
da se izrazi bilo koja racunska funkcija. To zapazanje nije nastalo sa pokretom
struktuiranog programiranja, it te strukture su dovoljne da se opi u sa uputama ci
klusa
sredi ta centralne jedinice , kao i rad Turingovog stroja. Stoga procesor uvijek v
r i
"strukturirani program" u tom smislu, èak i ako se instrukcije èitaju iz memorije ni
su dio
strukturiranog programa. Strukturirani teorem programa ne adresira kako napisati
analizirati korisno strukturirani program.
60
Debate
Godine 1967 pismo od Dijkstra pojavilo se u Communications of the ACM s naslovom
"GOTO naredbe smatra tetnim." U pismu, koje je naveo Böhm i Jacopini dokaz, pozvao
na ukidanje nesputan GOTO od jezika visoke razine u interesu pobolj anja kvalitete
koda.
Ovo pismo se obièno navodi kao poèetak rasprave strukturirano programiranje. Iako,
mnogi programeri koji nisu upoznati s teoremom sumnjao je u svoja potra ivanja, to
vi e znaèajnih spora u nadolazeæim godinama je bilo strukturirano programiranje zaprav
o
mogao pobolj ati softvera jasnoæa, kvaliteta, i razvoj dovoljno vremena da se opravd
a
obuku programera u njemu. Dijkstra je tvrdio ogranièavanje broja strukture æe pomoæi d
a
se programer usredotoèi na razmi ljanje i da æe se pojednostaviti zadatak u osiguranja
ispravnosti programa dijeljenjem analizu na upravljive koraka. 1969 u svojim Nap
omene o
strukturirano programiranje, Dijkstra je napisao:
Kada smo zauzeli stav da to nije jedino zadatak programera za izradu odgovarajuc
eg
programa, ali i takoder da se demonstruje njegova ispravnost na uvjerljiv naèin pa
ove
gore navedene primjedbe imaju dobok utjecaj na aktivnosti programera: object koj
i stvara
mora biti korisno strukutirano.
... U nastavku æe postati jasno da plan korektnosti nije moja jedina briga, prilag
odljivost
programa ili upravljanja bit æe jo jedan ...
Donald Knuth je prihvatio naèelo da programi moraju biti napisani s logièno na umu,
ali on
se nije slo ilo (i jo uvijek se ne sla e ) i ukidanje GOTO naredbe. U svom radu 1974,
"srtuktuirano programiranje s Goto izvje taji", on je dao primjere gdje je vjerova
o da
direktno vodi do skoka jasnije i uèinkovite bez rtvovanja logiènosti. Knuth je predlo i
o
bla a strukturna ogranièenja: Trebalo bi biti moguæe donositi plan dijagram toka sa sv
im
naprijed granama na lijevo, sve unatrag grane na desnoj strani, i nema kri anja je
dnih i
drugih. Mnogi od onih koji poznaju prevodioce i teorije grafova su zagovarali do
pu tajuæi
samo reducirati tok grafova. Teoretièari strukturiranog programiranja stekli su ve
likog
saveznik 1970 nakon to je IBM-ov istra ivaè Harlan Mills primijenio svoju interpretac
iju o
teoriji strukturiranog programiranja na razvoj sistema za indeksiranje u New Yor
ku vrijeme
u istra ivanju datoteka. Projekt je bio veliki in enjering uspjeh, a menad eri u drugi
m
kompanijama navode u prilog usvajanja strukturiranog programiranja, iako je Dijk
stra
kritizirao naèina na koje Millsovo tumacenje razlikuje od objavljianih radova. 198
7 je jo
uvijek moguæe postaviti pitanje strukturiranog programiranja u èasopisu informatike.
Frank
Rubin did so in that year with a letter "," GOTO smatra tetnim 'smatra tetnim. "
Rezultat
Do kraja 20. st. gotovo svi raèunalni znanstvenici bili su uvjereni da je korisno
nauèiti i
primjenjivati koncepte strukturiranog programiranja. Vi i programski jezik kojima
su
izvorno nedostajale programske strukture, kao to su FORTRAN, COBOL, BASIC i sada
61
ih imaju.
Zajednièki odstupanja
Iznimka rukovanje
Iako postoji gotovo nikakav razlog za vi e taèaka ulaza do potprograma, èesto se koris
te
vi e izlaza, da bi se odra alo da potprograma mo da neæe imati vi e posla za napraviti, il
i
mo da nai li okolnosti koje sprjeèavaju nastavka. Tipièan primjer bio bi jednostavan
postupak èitanja podataka iz datoteke i prerade:
open file;

while (reading not finished) {

read some data;

if (error) {

stop the subprogram and inform rest of the program about the
error;

}
}
process read data;
finish the subprogram;
" Stop and inform " mo e se postiæi bacanjem iznimke, drugi povratka iz postupka,
etiketom petlje break, ili èak goto. Kako postupak ima 2 izlaza, tokr i pravila Dijk
strinovog
strukturiranog programiranjea Kodiranje sa jednom toèkom izlaza u pravilu bi bilo
vrlo
nezgrapan. Ako je bilo vi e moguæih stanja pogre ke, s razlièitim pravilima èi æenja, toèka
izlaza æe biti izuzetno te ko za èitanje i razumijevanje, vrlo vjerojatno èak i vi e nego
onaj
s nestrukturiranim kontrolom barata goto izjavama. Veæina jezika usvojili vi e toèaka
izlaza
oblik strukturalnog programiranja. C omoguæuje vi estruke putove strukture izlaza (k
ao to
je "continue", "break", i "return"), noviji jezici takoðer imaju " labelled breaks
" ( dozvoljava
izbijanja vi e nego samo najintimnije petlje ) i iznimke.
Neki programi, osobito parsera i komunikacijskih protokola, ima broj oblika koji
slijede
jedni druge na naèin koji nije lako svesti na osnovne strukture. Moguæa je struktuir
atinje tih
sistema tako to svaki oblik-CHANGE zaseban potprograma i koristeæi varijable ukazuj
u
na aktivno stanje. Meðutim, neki programeri (ukljuèujuæi Knuth) vole da provode oblike
CHANGE s skokom na novo stanje.
Pascal
POVIJEST
Pascal se temelji na programskom jeziku Algolu i ime je dobio u èast francuskog
matematièara i filozofa Bleza Paskala. U pro losti, prateæi Pascal Kompanija Wirth je
razvila jezik Euler.
62
Pascal je uglavnom namijenjen za poduèavanje poèetnika strukturnom
programiranju. Neke verzije Pascala su se koristile za sve, od istra ivaèki projekat
a za PC
igre do ugraðenih sistema. Postoje noviji Pascalovi kompajleri koji se koriste na ir
oko.
Pascal je bio prvi visoko rangirani jezik kori ten za razvoj u Apple Lisa. Objektn
i Pascal se
na iroko koristi za razvijanje Windowsovih programa kao to je Skype. Kompanija Wirt
h je
namjeravala kreirati efikasan jezik baziran na tzv. strukturnom programiranju. P
ascal ima
korijene u programskom jeziku Algol 60, ali takoðer uvodi koncepte i mehanizme koj
i bi
omoguèili programerima da defini u vlastite tipove podataka, i uèiniti lak u gradnju
dinamiènih i rekurzivnih struktura podataka kao to su popisi, stabla i grafovi.
Pascal ima strog pristup svim objektima, to znaèi da se jedan tip podataka ne mo e
pretvoriti ili tumaèiti kao drugi, bez eksplicitne pretvorbe. Slièni mehanizmi su st
andard u
mnogim programskim jezicima danas. Drugi jezici koji su uticali na Pascal-ov raz
voj su
Cobol, Simula 67 i Wirth-ov vlastiti Algol-W.
ALFABET JEZIKA PASCAL
Alfabet programskog jezika Pascal se sastoji od svih velikih i malih slova engle
skog
alfabeta, cifara 0-9, i sljedeæih specijalnih znakova:
' ( ) + -* / , . :; < > = [ ] { }
Alfabet verzije Turbo Pascal ukljuèuje jo i sljedeæe znakove:
@ $ _
Sintaksa jezika Pascal predviða da bilo koji dio Pascal programa koji je omeðen vitièa
stim
zagradama predstavlja komentar, i raèunar se na njega uopæe ne obazire prilikom
izvr avanja programa.
STRUKTURA PASCAL PROGRAMA
Pascal u svom izvornom obliku je èisto proceduralni jezik,a ukljuèuje kontrolne
strukture s rezerviranim rijeèima kao to su: if, then, else, while, for, i tako dal
je.
Meðutim, Pascal takoðer ima mnogo olak ica u struktuiranim podacima i drugih objekata
apstrakcije koji nisu bili ukljuèeni u orginalni Algol60, kao to su tip,definicije,
dokumentacija, pokazivaèe, nabrajanja. Takve tvorevine su dijelom naslijeðene ili
inspirisane iz Simula 67, Algol 68, Niklaus Wirth-ovog vlastitog Algol-W i suger
isane od
CAR Hoare.
Na poèetku svakog Pascal programa mora se nalaziti zaglavlje programa. Ono
poèinje kljuènom rijeèi p r o g r a m, iza koje slijedi ime programa, a nakon tog slij
ede
rijeèi input ukoliko program èita podatke sa standrdnog ulaznog ureðaja(tipièno tastatur
e),
odnosno output ukoliko program prikazuje izlazne podatke korisniku preko standar
dnog
izlaznog ureðaja ( tipièno ekrana). Izvr ni dio programa uvijek poèinje kljuènom rijeèi
begin, a zavr ava kljuènom rijeèi end, nakon koje obavezno slijedi taèka, koja oznaèava
kraj programa.
U Pascalu se svaka od promjenjivih koje æe se koristiti mora predhodno
deklarirati(najaviti). Deklaracija promjenjivih zapoèinje navoðenjem kljuène rijeèi v ar
.
63
Nakon toga slijedi popis promjenjivih koje deklariramo zajedno sa dozvoljenim sk
upom
vrijednosti koje promjenjive mogu da prihvate. U jeziku Pascal, svaka promjenjiv
a mora
imati svoj tip. Svi tipovi podataka se mogu podijeliti na proste i slo ene tipove.
U proste
tipove spadaju èetiri osnovna tipa podataka: cjelobrojni tip, realni tip, znakovni
tip, i logièki
tip, kao i dva izvedena tipa: pobrojani tip i intervalni tip.
Cjelobrojni tip je najjednostavniji prosti tip. Uzmimo kao primjer deklaraciju
var Broj : integer;
Ova deklaracija oznaèava da je tip promjenjive Broj tip integer, odnosno cjelobroj
ni tip.
Zbog nekih tehnièkih ogranièenja, opseg vrijednosti koje se mogu smje tati u cjelobroj
ne
promjenjive uvijek je ogranièen. U veæini verzija Pascala vrijednosti promjenjivih
ogranièene su na opseg od -32768 do 32767. ovaj opseg èesto nije dovoljan, pa mnoge
verzije Pascala uvode i tip longint koji je identièan tipu integer, osim to dopu ta z
natno
iri opseg vrijednosti.
Realni tip
Promjenjive realnog tipa mogu sadr avati proizvoljne vrijednosti iz skupa realnih
brojeva.
Primjer deklaracije promjenjive realnog tipa:
var Temperatura : real;
Znakovni tip
Promjenjive znakovnog tipa, odnosno tipa char, mogu kao svoju vrijednost sadr avat
i
proizvoljan znak, to jest slovo, cifru ili znak interpukcije. Ovo se pokazalo ka
o veliko
ogranièenje, pa mnoge verzije Pascala uvode i tip string. Promjenjive ovog tipa mo
gu
sadr avati èitave rijeèi ili reèenice.
Logièki ( Bulov ) tip
Promjenjive logièkog tipa mogu imati samo jednu od dvije moguènosti: true ili false.
Na
primjer, ukoliko imamo deklaraciju:
Var Punoljetan : Boolean;
Tada promjenjiva Punoljetan mo e imati samo vrijednost true ili false.
Pobrojani tip
Pascal dozvoljava korisniku da definira vlastite tipove uz pomoæ kljuène rijeèi type.
Na
primjer, deklaracija
type Boje = ( Crvena, Zelena, Plava, Zuta, Crna, Bijela );
definira novi tip Boje. Promjenjive tipa Boja mogu imati vrijednosti samo vrijed
nosti
Crvena, Zelena, Plava, Zuta, Crna ili Bijela.
Intervalni tip
Intervalni tip je jo jedan korisnièki definirani tip, koji omoguæava programeru da de
finira
podskup nekog veæ postojeæeg tipa, odnosno da ogranièi skup vrijednosti predstavljen
tipom. Intervalni tip se definira tako to se prvo definira ime tipa, zatim znak j
ednakosti,
nakon èega se navode poèetna i krajnja vrijednost koju promjenjiva tog tipa mogu uzi
mati,
razdvojene sa dvije taèke. Na primjer:
type Sat = 0 . . 23;

DaniUgodini= 1. . 365;
Ovdje su deklarirani tipovi Sat i DaniUgodini kao podskupovi tipa integer. Slo eni
tipovi
mogu biti izgraðeni od jednostavnijih, kao npr. u sljedeæem primjeru:
a = Array [1..10] of Integer;
b = record

x: Integer;
64
y: Char
end;
c = File of a;

Kao to je prikazano u gornjem primjeru, Pascal-ove datoteke su sekvence komponent


i.
Svaka datoteka ima tampon varijablu koja se oznaèava sa f ^. Postupci za èitanje i
pisanje premje taju varijable u meðuspremnik.
Pascal je strukturiran programski jezik, to znaèi da je protok kontrola struktuiran
u standardna izvje æa, bez 'go to' naredbe.
while a <> b do writeln('Waiting');

if a > b then writeln('Condition met')


else writeln('Condition not met');

for i := 1 to 10 do writeln('Iteration: ', i:1);

repeat

a := a + 1
until a = 10;

case i of

0: write('zero');
1: write('one');
2: write('two')
end;
Pascal kao i drugi programski jezici omoguèava definisanje potprograma kao to su
procedure i funkcije.Procedure i funkcije u Pascalu se mogu umetati na bilo koju
dubinu.
Svaki procedura ili funkcija mo e imati vlastitu deklaraciju konstanti, tipova, va
rijabli, i
drugih procedura i funkcija, koje moraju sve biti u tom redoslijedu. Ovaj zahtje
v narud be
je izvorno namijenjen da omoguæi efikasnu single-pass kompilaciju.
Sada æemo dati jedan primjer programa raðenog u programskom jeziku Pascal:

Programski jezik C
C (izgovara se "ce") je racunarski programski jezik opæe namjene. Razvio ga je 197
2
Dennis Ritchie na Bellovi laboratoriji za kori tenje s operativnim sistemom UNIX.
Iako je C
dizajniran za sistemski softver, on je takoðe iroko kori ten za razvoj prenosivih sof
tverskih
65
aplikacija. C je jedan od najpopularnijih programskih jezika i ima jako malo raèun
arske
arhitekture za koji C kompajler ne postoji. C je uvelike uticao na mnoge druge p
opularne
programske jezike, od kojih je najpoznatiji C + +, koji je izvorno zapoèeo kao pro
du etak
od C.
Dizajn
C se koristi u sistemskom softveru. Dizajniran je tako da je mogao da koristi je
dnostavan
kompajler, obezbedi nizak level pristupa memoriji i jezièke konstukcije unatoè ma insk
im,
te da bi osigurao minimalno vrijeme izvodjenja podr ke. C je stoga koristan za mno
ge
aplikacije koje su bile kodirane u asemblerskim jezicima. Uprkos niskom nivou sp
osobnosti
ovog jezika, bio je dizajniran da podstakne na nezavisno ma insko programiranje.
Skladnih standarda i spretno napisan, C program moze biti sastavljen za vrlo sir
ok raspon
raèunarskih platformi I operativnih sistema, sa malo ili nimalo promjena svog izvo
rnog
koda. Jezik je postao dostupan na svim poljima, od ugradjenih mikrokontrolera do
superracunara.
Minimalizam
Dizajn ovog programskog jezika je vezan za prvobitnu namjeru da se koristi kao
prijenosni sistem. On pru a jednostavan, direktan pristup bilo kojem adresnom obje
ktu i
izrazi u njegovom kodu mogu biti prevedeni direktno iz ma inskog u izvr ni kod. Neke
od
ranijih verzija C kompajlera su implementirane na PDP 11 procesorima koji imaju
samo
16 adresnih bita. C kompajleri za nekoliko obiènih 8- bitnih platformi su solidno
prevedeni.
Karakteristike
Kao i veæina jezika u ALGOL radiciji, C ima objekte za strukturirano programiranje
i
omoguæava opseg leksièkih promjenljivih i rekurzije, dok statièki sistem tipa spreèava
mnoge neplanirane operacije. U C u , sav izvr ni kod je sadr an unutar funkcije.
Funkcijski parametri uvijek nose vrijednost. Izostavljanje oznake se u C-u preds
tavlja se
izrièito preko polaznih pokazivaèa vrijednosti. Raznovrsni tipovi podataka (struktur
a)
omoguæuju povezivanje elemenata koji se mogu kombinovati I koristiti zajedno. Polj
e za
tekst u C programu je slobodnog formata, I koristi taèka zarez za razdvajanje izra
za.
Ovo su takodje neke osobine ovog jezika:

Varijable mogu biti sakrivene unutar bloka


Djelimièno slabi tipovi (na primjer, znakovi se mogu koristiti kao cijeli brojevi)
Nizak nivo pristupa memoriji raèunara ,preko prevodjenja ma inske adrese do
podatka
Funkcije I podaci zahtijevaju vrijeme za izvodjenje slozenijih oblika
Razvrstavanje po indeksima je sekundaran pojam, definiran u aritmetickim
podacima.
Predprocesor za makro definicije, kod za ukljuèivanje datoteka, i uvjetnu
kombilaciju.
Slo ene funkcije kao to su I /O, kori tenje stringova, matematièkih funkcija
dosljedno prevedenih na biblioteke programa.
Relativno mali skup unaprijed odredjenih fraza
Govorne structure koje vi e lièe na B nego na ALGOL., na primjer: Znak { ... }
(Algol 60 koristi begin...end, a Algol 80 ( ) ).Znak = se koristi za raspored
(kopiranje), kao to je u Fortran-u, dok je u Algol-u: = . Oznaka == se koristi za
66
ispisivanje jednakosti ( to je EQ. u Fortranu, ili = u BASIC-u i Algol-u)

Logièke operacije "i" i "ili" su predstavljena sa & & i | | kao u Algolu, I semant
ièki su
razlièite od operatora & i | . Meðutim Unix 6 & 7 verzije C-a doista koriste ALGOLov
e
i ASCII operatore, ali za utvrðivanje infimuma i supremuma respektivno.
Veliki broj slo enih operatora, kao to su + =, + +, itd. (Odgovara operatorima +: =
i
+ = 1 kod ALGOL-a 68) .
Nedostaci
Relativno nizak novo prirode jezika pru a programeru kontrolu za zatvaranje nad on
im
to raèunar radi , pri èemu dozvoljava posebno skrojenu I agresivnu optimizaciju za
odreðenu platformu. To omoguæuje kodu da uèinkovito djenuje i na vrlo ogranièenom
hardveru, kao to su ugraðeni sistemi.
C ne posjeduje pojedine karakteristike koje su dostupne u nekim drugim programsk
im
jezicima:

Nema ugradjene definicije funkcija.


Nema direktne dodjele polja ili ica (kopiranje se mo e obaviti putem standardne
funkcije, podr ano je zadavanje objekata tipa strukture ili unije) .
Nema utomatskog skupljanja smeæa.
Nema zahtjeva za provjeru granica u polju.
Nema operacija na cijelom polju.
Nema sintakse za raspone, (kao to je A..B notacija kori tena u nekoliko jezika).
Prije C99, nije bilo odvajanja Boolean tipova (nula/ ne-nula je kori tena umjesto
toga).
Ne postoje formalni zatvaraèi ili funkcije kao parametri (samo funkcije i varijabl
e).
Nema generatora,ni pomoænih programa, unutranja kontrola protoka se sastoji od
ugradjene funkcije poziva.
Bez obzira na rukovanje, standardne funkcije biblioteka oznaèavaju pogre ne
uslove u osnovnim varijablama i / ili specijalnom povratnom vrijednosti, a funkc
ije
biblioteka ne pru aju lokalne go to naredbe.
· Samo poèetna podr ka za modularno programiranje.
Nema kompajliranja slo enijih oblika funkcija ili operatora preoptereæenja.
Vrlo ogranièena podr ka za objektno-orijentisano programiranje sa obzirom na
polimorfizam i nasljeðivanje.
Ogranièeno podr ka za obavijanje.
Nema prirodne podr ke za umre avanje.
Nema standardne biblioteke za raèunarsku grafiku i nekoliko grugih programa
potrebnih za programiranje.
Mnoge od ovih karakteristika su dostupne kao ekstenzije u nekim kompajlerima, il
i su u
nekim operativnim okru enjima (npr. POSIX), ili su dobijeni preko biblioteke treæe s
trane, ili
se mogu simulirati usvajanjem odredjenih dosicplina kodiranja.
Nedefinisana pona anja
Mnoge operacije u C koje imaju nedefinisano pona anje ne zahtijevaju da budu
dijagnosticirane u vrijeme prevoðenja. U sluèaju C, "nedefinisano pona anje" znaèi da
taèno pona anje koje proizlazi ne odredjuje standard, a upravo ono to æe se dogoditi ne
mora biti dokumentirano u C provedbi. Poznati, iako pogre an, izraz u grupama
67
comp.std.c i comp.lang.c je da program mo e uzrokovati "demone za letenje do tvog
nosa". Ponekad se u praksi dogaða na primjer, nedefinisano pona anje , bug , koji je
te ko
pronaæi, a koji mo e o tetiti sadr aj memorije. Ponekad odreðeni kompajler generira
razumne i dobro izvedene akcije koje su potpuno drugaèije od onih koji æe se dobiti
uz
pomoc nekog drugog C kompajlera. Razlog za to je neko pona anje ostavljeno
nedefinisanim je da bi kompajlerima bio omoguæen irok raspon instrukcija arhitektur
a da
bi generisali uèinkovitiji izvr ni kod za dobro definisano pona anje, koji je smatran
va nim
za primarnu ulogu C-a kao jezika za implementaciju sistema; tako C èini da se na
odgovornost programera izbegava nedefinisano pona anje, eventualno pomoæu alata za
pronala enje dijelova programa èije pona anje nije definisano.
Primjeri nedefinisanog pona anja su:

Pristupanje izvan granica polja,


Suvi no naèenje cijelog broja
Dostizanje kraja vrijednosti funkcija bez pronala enja izjave o povratku, kada je
kori tena vrijednost povratka.
Èitanje vrijednosti variable prije nego to je inicijalizovana.
Ove operacije su sve programske gre ke koje bi mogle nastati kori tenjem i drugih
programskih jezika; C crpi kritike jer njegov standard izrièito identifikuje brojn
e sluèajeve
nedefinisanog pona anja, ukljuèujuæi i neke u kojima se pona anje moglo dobro definisati
,
ali se ne navodi nikakav mehanizam za to.
Pozivanje () na tok otvoren za input je primjer nedefininisanog pona anja, a ne nu n
o
programerska gre ka. To je i sluèaj za koji neke potvrdjene implementacije mogu pru it
i
dobro definisanu, korisnu semantiku (u ovom primjeru, pretpostavlja odbacivanje
unosa
kroz sljedeæi, novi red), kao dozvoljeno pro irenje. Upotreba takvih nestandardnih
ekstenzija opæenito ogranièava prenosivost softvera.
Historija
Do razvoja C jezika je doslo u AT & T Bell Labs, izmeðu 1969 i 1973. Prema Ritchie
,
najkreativnije razdoblje bilo je 1972. Nazvan je "C", zbog svoje osobine da je d
obijen iz
ranijih jezika pod nazivom "B", koji prema Ken Thompson u je bio gola verzija BC
PL
programskog jezika.
Porijeklo jezika C usko je vezano za razvoj operativnih sistema Unix. Izvorno je
prevodjen
u asemblerski jezik u PDP-7 Ritchie-a i Thompson-a, koji ukljuèuje nekoliko ideja
od
kolega. Na kraju su odluèili da naprave operativni sistem za PDP-11. Nedostatak
funkcionalnosti jezika B,pri iskori tavanju nekih moguænsoti PDP-a 11 dovela je do r
azvoja
rane veryije C-a.
·
Originalne PDP-11 verzije UNIX sistema razvijene su u asemblerski jezik. Do 1973
,
uz dodatak struktura tipova, C jezik je postao dovoljno sna an da su veæina UNIX
jezgara operativnih sistema iznova napisana u C-u. To je bilo jedno od prvih jez
gara
operativnih sistema provodjen u neki drugi jezik.(Raniji primjeri ukljuèuju Multic
s
sistem (napisane u PL / I)i MCP (Master Control Program) za Burroughs B5000
napisane u Algol-u 1961.)
U 1978, Brian Kernighan i Dennis Ritchie objavio je prvo izdanje The C
Programming Language. Ova knjiga, poznata kao C programer "K & R", slu io dugi
68
niz godina kao neformalni specifikaciju jezika. Verzija C koji opisuje se najèe æe
spominju kao K & R C, a drugo izdanje knjige poslije pokriva ANSI C standardom.
K & R je predstavio nekoliko jeziènih moguænosti:

standardnu I / O biblioteku
dugi tip podataka int
Neoznaèen tip podataka int
slo eni zadatak operatora oblika = OP (kao to su =-) su promijenjeni u obliku op =
da bi uklonili semantièku nejasnoæu stvorenu kao to je konstrukcija i=-10, koji je
bio interpretiran kao i =- 10 umjesto eventualno namijenjene I = -10
Èak i nakon objavljivanja 1989 Standard C, mnogo godina K & R C je jo uvijek smatra
n
kao "najmanji zajednièki nazivnik" na koji su C programeri ogranièili sebe kad je
maksimalni prijenos zatra en, jer su mnogi stariji kompajleri jo uvijek bili u upot
rebi.
U ranim verzijama C, samo funkcije koje su vratile ne -cjelobrojnu vrijednost tr
ebale su
biti deklarisane, ako se koriste prije definicije funkcije. Funkcija koja se kor
istila bez ikakve
prethodne deklaracije se , po pretpostavci , vracala na cijeli broj, ako je njeg
ova vrijednost
veæ kori tena.
Na primjer:
long int SomeFunction ();
/ * OtherFunction int (); * /

/ * Int * / CallingFunction ()

long int test1;

Registrirajte / * int * / test2;

test1 = SomeFunction ();


ako (test1> 0)
test2 = 0;
drugo
test2 OtherFunction = ();

povratak test2;
)
Sve navedene komentare out - int deklaracije mogu biti ispu teni u K & R C .
Dok K & R deklaracije funkcija ne ukljuèuju bilo kakve informaciju o argumentu fun
kcije,
parametri funkcije se ne provjeravaju, iako æe neki prevodioci izdati upozorenje,
ako je
lokalna funkcija nazvana krivim brojem argumenta, ili ako se vi e poziva za funkci
je koristi
pomoæu razlièitih brojeva ili vrste argumenata. Odvojeni alati, kao to su neke usluge
Unixa
razvijeni su da (izmeðu ostalog) mogu provjeriti dosljednost funkcije kori æene na vi e
izvornih datoteka.
U godinama nakon objave K & R C, nekoliko neslu benih osobina su dodate jeziku, uz
potporu AT & T kompajlera i nekih drugih dobavljaèa. Meðu njima su:
69
· void funkcija
· funkcije povratka struktura ili skupine tipova (a ne pokazivaèe)
· zadatak za strukture tipove
· navedeni tipovi
Veliki broj ekstenzija i nedostatak sporazuma o standardnim bibliotekama, uz pop
ularnost
jezika i èinjenicu da èak ni Unix kompajleri nisu precizno implementirani K & R
specifikaciju, dovela je do nu nosti standardizacije.
Tijekom kasnih 1970-ih i 1980-ih, verzije C-a su prevodjene za irok krug raèunara,
miniraèunara i mikroraèunara, ukljuèujuæi i IBM PC, èime se njegova popularnost poveæala
znaèajno.
Godine 1983, amerièki nacionalni institut za standarde (ANSI) formira odbor, X3J11
, za
uspostavljanje standardnih specifikacija C-a. Godine 1989, standard je potvrdjen
kao ANSI
X3.159-1989 "Programski jezik C". Ova verzija jezika èesto se naziva ANSI C, Stand
ard C,
ili ponekad C89.
Godine 1990, ANSI C standard (sa promjenom oblikovanja) usvojen je od strane
Meðunarodne organizacije za normizaciju (ISO) kao ISO / IEC 9899:1990, koja se
ponekad naziva C90. Dakle, pojmovi "C89" i "C90" odnose se na isti programski je
zik.
ANSI, kao i druga nacionalna tijela za uspostavljanje normi, vi e ne razvijaju C s
tandard
samostalno, ali se priklanjaju normama ISO C. Nacionalno usvajanje promjena
meðunarodnog standarda se obièno dogaða u roku godinu dana od ISO objavljivanja.
Jedan od ciljeva procesa C standardizacije bio je proizvodnja skup K & R C, uklj
uèujuæi
mnoge neslu bene osobine koje su naknadno uvedene. Odbor za standarde je ukljuèivao
nekoliko dodatnih osobina kao to su prototipovi funkcija (posuðena iz C + +), void
pokazivaèi, podr ka za meðunarodni karakter skupova te lokacije, i pobolj anje
preprocesor. Sintaksa za deklaraciju parametara takoðer je takodje bila pribli ena s
tilu koji
se koristi u C + +, iako je K & R interfejs i dalje dopu ten, za kompatibilnost s
postojeæim
izvorni kod.
C89 je podr an u trenutnim C kompajlerima, a veæina C koda koji se sastavlja se i da
nas
temelji na njemu. Bilo koji plan napisan samo u Standard C i bez ikakve zavisnos
ti od
hardver-a æe raditi ispravno na bilo kojoj platformi C izvedbe, u okviru svojih gr
anica
resursa. Bez takve mjere opreza, programi mogu kompajlirati samo na odreðenim
platformama ili s odreðenim kompajlerima, zbog, na primjer, kori tenja nestandardnih
biblioteka, kao to su GUI biblioteke.
U sluèajevima gdje kod mora biti u iskompajliran, bilo standardno ili baziran na K
& R C
komajlerima, __STDC__ makro naredba se mo e koristiti za podijelu koda u Standard
i K
& R odjeljcima da bi iskoristila osobine dostupne samo u Standard C.
Nakon ANSI / ISO standardizacije procesa, specifikacija C jezika ostala je relat
ivno
statièna neko vrijeme, dok je C + + nastavio da se dalje razvija, uglavnom sopstve
nim
naporima. Godine 1995 Normativni Amandman 1 do 1990 C Standard je objavljen, da
bi
ispravio neke detalje i dodao podr ku za opse niji meðunarodni karakter skupova. C
standard dodatno je prepravljen krajem 1990-ih, to je dovelo do objavljivanja ISO
/ IEC
9899:1999 u 1999, koji se obièno naziva "C99". On je od tada izmijenjen tri puta o
d strane
70
Technical Corrigenda. Meðunarodni standard C odr ava radne skupine ISO / IEC
JTC1/SC22/WG14.
C99 uvodi nekoliko novih moguænosti,nekoliko novih tipova podataka (npr. int), raz
lièite
du ine polja, pomoæ za makronaredbe promjenjive mjesta i podr ku za komentari u
jednom redu koji poèinju s / /, kao u BCPL ili C + +. Mnogi od ovih veæ se provode u
nastavcima u nekoliko C kompajlera.
C99 je veæim dijelom kompatibilan s C90, ali je stro i na neki naèin. Godine 2007 se
poèelo sa radom u oèekivanju druge revizije C standarda, neformalno nazvane "C1X".
Odbor C standarda je usvojio smjernice da ogranièi usvajanje novih osobina koje ni
su
testirane od strane postojeæih implementacija.
Upotreba
Primarna upotreba C-a je "sistem programiranje", ukljuèujuæi izvedbu operativnih
sistema i ugraðenih sistem aplikacija, zbog kombinacija po eljnih karakteristika kao
to su
prenosivost koda i efikasnost, moguænost pristupa odreðenim hardverskim adresama,
sposobnost da se "igra rijeèima" kako bi se slagala sa zahtjevima za pristup podac
ima,
vrijeme izvoðenja i niske potra nje za resursima sistema. C se takoðer mo e koristiti za
web programiranje pomoæu CGI kao "Gateway" informacijama izmeðu web aplikacija,
poslu itelja i preglednika. Neki faktori za odabir C pord ostalih jezika su njegov
a brzina,
stabilnost i manja osjetljivost na promjene u radnim okru enjima zbog svoje prirod
e
sastavljanja.
Jedna od posljedica irokog prihvaæanja C-a je i efikasnost prevodjenja kompajlera,
bibioteka i predstavnika drugih programskih jezika u C. C se ponekad koristi kao
posredni
jezika u implementacijama drugih jezika. Ovaj pristup se mo e koristiti za prijeno
s i
praktiènost.Neki prevodiocima koji koriste C ovaj naèin su BITC, Gambit, Glasgow Has
kell
kompajler, Squeak, i Vala. Na alost, C je zami ljen kao programski jezik, a ne kao
prevodilac jezika, pa je stoga manje idealan za kori tenje kao srednji jezik. C je
takoðer
na iroko kori ten za implementaciju krajnjeg korisnika aplikacije, ali kako su aplik
acije
postale veæe, mnogo tog razvoja usmjereno je na druge jezike.
Sintaksa
Za razliku od jezika kao to su FORTRAN 77, C izvorni kod je slobodnog oblika i
omoguæuje proizvoljno kori tenje razmaka za oblikovanje koda, prije nego redanja u
kolone linije teksta,bazirane na ogranièenju. Komentari se mogu pojaviti bilo izmeðu
/ * i *
/, ili (u C99) nakon / / do kraja linije.
Svaka datoteka sadr i izvor deklaracije i definicije funkcije. Funkcije definicije
, pak,
sadr e deklaracije i izjave. Deklaracije defini u nove tipove koristeæi kljuène rijeèi kao
to
su struct, union i enum, ili dodijeljuju tipove, rezervi u nove varijable, obièno pi
sanjem tipa
nakon èega slijedi ime varijable. Kljuène rijeèi kao to su char i int odredjuju tipove.
Dijelovi
koda su u zagradama ({i}, ponekad zvanim "vitièasta zagrada") ogranièavaju opseg
deklaracija i djeluju kao jedna izjava za kontrolne strukture.
Kao imperativni jezik, C koristi izvje taje za specifiène akcije. Najèe æa izjava je izraz
,
nakon kojeg slijedi zarez. Kao nuspojava evaluacije, funkcijama se mogu davati i
mena i
varijablama se mogu dodijeliti nove vrijednosti.
Da biste izmijenili normalno sekvencijalno izvr enje izvje taja, C nudi kontrolu pro
toka
71
izjava identificiranim rezervisanim rijeèima. Strukturirano programiranje je podr an
o od
strane, if (-else) uvjetnog izvoðenja kao i do-while,while i for za izvr enje petlji
. For iskaz je
odvojio inicijalizaciju, testiranje, i ponovno inicijaliziranje izraza, bilo koj
eg ili svih koji mogu
biti izostavljeni. Break i continue se mogu koristiti da napuste izjavu ili petl
ju Tu je i nestrukturiran
go to iskaz koji se grana direktno do neoznaèene lebele unutar funkcije.
Switch odabira sluèaj koji treba biti izvr en na osnovu vrijednosti cijelog broja iz
raza.
Izrazi se mogu koristiti za razne ugraðene operatore (vidi dolje) i mogu sadr avati
pozivanje funkcija. Redoslijed argumenata funkcija i operanada je nedefinirana.
Procjene
se èak mogu poklapati. Meðutim, sve nuspojave (ukljuèujuæi skladi tenje u varijabli) æe se
dogoditi prije sljedeæeg "sequence point"-a.
Iako je imitirao mnoge jezike zbog rasprostranjene familijarnosti, C sintaksa je
èesto bila
kritizirana. Na primjer, Kernighan i Ritchie ka u u Introduction of The C Programm
ing
Language, "C, kao i bilo koji drugi jezik, ima svoje nedostatke. Neki od operato
ra imaju
krivu prednost, neki dijelovi sintakse bi mogli biti bolji."
Problemi koje vrijedi spomenuti su:

Ne provjeravanje broja i tipova argumenata kada funkcija ima prazan popis


parametara. (To osigurava povratnu kompatibilnost s K & R C, koji nisu imali
prototipova.)
Upitan izbor prednosti operatora, kao to je spomenuto od strane Kernighan i
Ritchie gore, kao to su obvezujuæe == vi e nego èvrsto & i | u izrazima kao to su
x == 0 & 1.
Kori tenje operatora =, koristi u matematici za jednakost, pokazujuæi zadanost,
nakon presedana u FORTRAN, PL / I, i BASIC , ali za razliku od ALGOL-a i
njegovih derivata. Ritchie je napravio ovu sintaksu svjesno, jer se argument o
zadanosti pojavljije vi e nego argument poredjenja.
Sliènost i jednakost operatora dodjele (= i ==), to ga èini lakim da se sluèajno
zamijeni jedan za drugim. C-ov slab sistem tipova dozvoljava svakom da se korist
i u
kontekstu drugih, bez kompilacija gre ke (iako neki kompajleri daju upozorenja). N
a
primjer, uvjetni izraz if (a = b) je taèan samo ako nije nula nakon dodjele.
Nedostatak infiksnog operatora za slo ene objekte, posebno za string operacije,
izradjuju program koji se jako oslanja na te operacije kao ne to te ko za èitanje.
Izjava sintaksi koje neki smatraju nerazumnim, naroèito za pokazivaèe funkcija.
(Ritchie-jeva ideja je bila da proglasi identifikatore u kontekstima nalik namje
ni).
Operatori u C-u i C + +
C podr ava bogat skup operatora, èiji se simboli koriste u izrazu ua navodjenje
manipulacija koje se izvode, dok se ocjenjuje ekspresija. C ima operatore za:
aritmetiku (+, -, *, /,%)
ispitivanje jednakosti (==,! =)
relacije poredka (<, <=,>,> =)
Booleovu logiku (!, & &, | |)
logiku bitovima (~, &, |, ^)
smjene bitovima (<<,>>)
zadavanje (=, + =, -=, *=, / =,% =, = &, | =, ^ =, <<=,>> =)
72
prirast i smanjenje (+ +, -)
referencu i dereferencu (&, *, [])
uvjetnu procjenu (?:)
èlan izbora (., ->)
Vrstu pretvorbe (())
Velièinu objekta (sizeof)
Funkciju argument zbirka (())
sekvencioniranje (,)
grupiranje (())
C ima formalnu gramatiku, odredjenu C standardom.
Tipovi sintaksi mogu se koristiti za pretvaranje vrijednosti izmeðu integer tipa i
tipa
pokretnog zareza, ili izmeðu dva tipa integer ili dva tipa pokretnog zareza sa raz
lièitim
velièinama, npr. (Long int) sqrt (1000,0), (dupli) (256 * 256), ili (float) sqrt (
1000,0).
Rekonstrukcija je implicitna u vi e konteksta, npr. kada je dodjeljivanje vrijedno
sti varijabli
ili funkcija parametra, kada se koristi vrijednost pokretnog zareza kao indeks z
a vektor, ili
aritmetièkih operacija na operand s razlièitim tipovima.
Za razliku od nekih drugih sluèajeva tipa casting, konverzije izmeðu brojeva i vrije
dnosti
pokretnog zareza opæenito malo mijenjaju kodiranje kako bi se oèuvala brojèana vrijedn
ost
operanda , u najveæoj moguæoj mjeri. Konkretno, prevodjenja iz cijelog broja na tip
pokretnog zareza æe saèuvati svoju brojèanu vrijednost taèno -ako broj bita u ciljnom ti
pu
nije dovoljna, i u tom sluèaju najmanje znaèajnih bitova-je izgubljeno.
Pretvaranje iz tipa pokretni zarez u tip cijeli broj podrazumijeva odsijecanje bilo
kojeg
dijela (tj. vrijednost se zaokru uje "prema nula"). Za ostale vrste zaokru ivanja, C
99
standard specificira (u <math.h>) sljedeæe funkcije:

round (): zaokru i na najbli i cijeli broj, na pola puta od nule


rint (), nearbyint (): zaokru i prema va eæem tipu pokretni zarez smjeru
zaokru ivanja.
ceil (): najmanju sastavnu vrijednost ne manje od argumenta (zaokru iti)
kat (): Najveæu sastavnu vrijednost (u duploj reprezentaciji) ne veæoj od argumenta
(zaokru i dolje)
· TRUNC (): zaokru i prema nula (isto kao typecasting na int)
Sve ove funkcije koriste dvostruki argument i vraæaju dvostruki rezultat, to mo e bit
i
baèeno na cijeli broj ako je potrebno.
Prevodjenje pokretne vrijednosti za double tip èuva brojèanu vrijednost taèno, to je
suprotno od prevodjenja koje zaokru uje vrijednost kako bi se uklopio u manji broj
bita
frakcije, obièno prema nuli. Neki kompajleri æe tiho pretvoriti pokretnu vrijednost
do
udvostruèene u nekim kontekstima, npr. funkcija parametara progla ena kao pokretna
mo e zapravo biti donesen kao dvostruka.
U ma inama koji su u skladu sa IEEE standardima o pokretnom zarezu, neki dogaðaji u
vezi zaokru ivanja su pogoðeni trenutnim naèinom rada zaokru ivanja ( to ukljuèuje
round-to-even, round-down, Round-up, i round-to-zero), koje se mo e dohvatiti i po
staviti
pomoæu fegetround () / fesetround () funkcija definisanim u <fenv.h>.
73
Integer Aritmetika u C u postavlja drugi complement kod za unutra nje kodiranje.
Konkretno, pretvaranje bilo cjelobrojne vrijednosti na bilo koji cijeli broj tip
a s n bitova èuva
2n vrijednost po modulu.
"Hello, World" primjer
"Hello, World", primjer koji se pojavio u prvom izdanju K & R je postao model za
uvodni
program u veæini programskih ud benika, bez obzira na programski jezik. Program ispi
suje
"Hello, World" na standardni izlaz,gdje je obièno prikaz ekrana ili terminal.
Originalna verzija je:
main ()
(

printf ("Hello, World \ n");


)
Standard-nekonformna "Hello, World" program: [11]

# Include <stdio.h>

int main (void)

printf ("Hello, World \ n");

return 0;
)

U prvom redu program sadr i obradu direktive, oznaèeno # include. To uzrokuje


preprocesor - prvi alat za ispitivanje izvornog koda koji zamijenjuje liniju sa
cijelim tekstom
stdio.h standardnih zaglavlja koji sadr i izjave za standardni izlaz i izlaz funkc
ija poput
printf. Uglaste zagrade okolo stdio.h ukazuju da se stdio.h tra i pomoæu strategija
koje
preferiraju standardna zaglavlja,naspram drugih,koja imaju isti naziv. Dvostruki
navodnici
mogu se koristiti da ukljuèe lokalna ili specifièna zaglavlje datoteke.
U sljedeæem redu oznaèeno je da je funkcija nazvana glavna definisana. Glavna
funkcija slu i za posebne namjene u C programima: U vrijeme izvoðenja poziv glavna
funkcija oznaèava poèetak izvr avanja programa. Tip razvrstaè int oznaèava vraæanje
vrijednosti, kao rezultat vrednovanja glavna funkcija je cijeli broj. Kljuène rijeèi
void kao
parametar popisa pokazuje da glavna funkcija ne uzima argumente. Otvaranja vitièas
tih
zagrada oznaèavaju poèetak definicije glavnih funkcija. U sljedeæem redu, funcija nazv
ana
printf , koja je progla ena u stdio.h se opskrbljuje iz sistema biblioteka. U tom
pozivu, printf
funkcije je pro ao jedan argument, adresa prvog znaka u nizu doslovno "Hello, Worl
d \ n".
String literal je neimenovano polje s elementima tipa char, postavite automatski
prevodilac
sa zavr nim 0-vrijednosnim znakovima za oznaèavanje kraja niza (printf treba znati o
vo). \
N je escape sekvencu koju C prevodi kao znak za novi red koji na izlazu oznaèava k
raj
trenutne linije. Povratna vrijednost funkcije printf je tipa int, ali tiho je od
baèena jer se ne
koristi. (Oprezniji program mo e testirati povratnu vrijednost kako bi se utvrdilo
da li je ili
ne printf funkcija naslijedjena.). Zarez oznaèava razmak u reèenici. Povratna izjava
prestaje izvr enjem glavnih funkcija i uzrokuje to da vrati cijelobrojna vrijednos
t 0, to se
tumaèi kao izlazni kod za pokazivanje uspje nog izvr enja. Zatvaranje vitièaste zagrade
oznaèava kraj koda za glavnu funkciju.
74
Strukture podataka
C je statièki slab sistem slab obiènog tipa koji ima neke sliènosti s drugim ALGOLpoto
mcima,
kao to je Pascal. Ima ugraðene tipove za cijele brojeve razlièitih velièina,
potpisane i nepotpisane, floating-point brojeve, znakove i popisane tipove (nabr
ajanja).
C99 je dodao boolean vrstu podataka. Tu su i izvedeni tipovi ukljuèujuæi i polja,
pokazivaèe, evidencije (struct), i unije (union).
C se èesto koristi za programiranje sistema ni eg nivoa, gdje mo e biti potrebno
bje anje iz tipa sistema. Kompajleri poku avaju da osiguraju taènost veæine vrsta izraza
,
ali programer mo e pojaèati provjere na razne naèine, ili pomoæu kori tenja tipova u formi
izrièitog pretvaranja vrijednosti iz jedne u drugu vrstu, ili pomoæu pokazivaèa i unij
e da
reinterpretiraju osnovne bite vrijednosti na neki drugi naèin.
C podr ava kori tenje pokazivaèa, vrlo jednostavanih tipova koji snimaju adresu ili
lokacije objekta ili funkciju u memoriji. Pokazivaèi se mogu preoblièiti za pristup
podacima
pohranjenim na adresi ukazao na, ili da se pozove poka i funkcija. Pokazivaèima se
mo e manipulirati pomoæu pokazivaèa dodjele i aritmetike. Run-time zastupljenost
vrijednosti pokazivaèa je obièno sirova memorija adresa, ali dok tip pokazivaèa ukljuèuj
e i
tip onog na sta je pokazano, izrazi obuhvaæenih pokazivaèa mogu biti provjereni u vr
ijeme
kompajliranja.
Pointer aritmetike je automatski poredan po velièini pokazanih podataka. Pokazivaèi
se
koriste za razne svrhe u C. Tekstom stringova èesto se manipulira koristeæi pokazivaèe
na
nizove znakova. Dinamièka dodjela memorije, to je opisano u nastavku, izvodi se uz
pomoæ pointera. Mnoge vrste podataka, kao to su grane, èesto se provodi kao dinamicki
dodijeljene strukture objekata povezanih pomoæu pokazivaèa. Pokazivaèi funkcije su
korisne za pozivanje rukovanja. Poznate grupe pokazivaèa su: Null-pointeri (koji p
okazuju
da vrijednost nije ispravna), Void pointeri (koji pokazuju nepoznate tipove obje
kata).
Koristenje ovih pointera mora biti uz obaveznu opreznost, jer su obièno neoznaèeni,
i
mogu dovesti do ne eljenih efekata. Objekti koje tra imo moraju biti odvojeni i pono
vo
upotrijebljeni, ne smeju biti bez inicijalizacije (divlji pokazivaèi) . Generalno,
C dozvoljava
kori tenje i manipulisanje i konverziju izmedju tipova pointera, iako kompajleri p
reduzimaju
mjere razlièitog levela provjere. Drugi programski jezici reðavaju ovaj problem prek
o
ogranièenih tipova.
Tipovi variabli u C u su tradicionalno na fiksiranoj i statièkoj velièini vremena
kompajliranja. Takodje,moguæe je da se smjesti cio blok memorije u toku tog vremen
a,
koristeæi standardne funkcije biblioteka, i tretiranje njih kao promjenljivih. C n
ema
specijalne propise za deklarisanje vi edimenzionalnih variabli, i ne zahtijeva da
varijabla
bude pravilna (bounds checking carinska provjera). Broj elemenata u deklarisnim
variablama X mo e biti determinisan kao sizeof X / sizeof x[0]. Interesantan prika
z
moguænosti unutra nje promjene pointera i variabli je pokazan ispod. Èetiri dodjele
odgovaraju propisanom c kodu,a to su:
/* x je varijabla a i je cijeli broj */
x[i] = 1; /* ekvivalntno *(x + i) */
*(x + i) = 1;
75
*(i + x) = 1;
i[x] = 1; /* neobièna upotreba, ali taèna: i[x] je ekvivalntno *(i + x) */

Primjetiti da je posljednja linija neobièna, ali semantiècki taèna, izraz: i[x], koji
mijenja
indeks varijabli i sa varijablom x. Ova zadnja linija mo e biti pronadjena u C kod
u, ali
njegova upotreba je strana i èudna medju C programerima.
Memory management
Jedna od najva nijih funkcija programerskog jezika je da omoguæi rukavanje memorijom
i objektima koje su pohranjene u memoriji.
C omoguæava tri puta da se smjesti objekat u memoriju.

Statièko smje tanje u memoriju: mjesto za objekte je osigurano za vrijeme


kompajliranja ti objekti imaju ivotni vijek samo dok ono traje.
Automatsko smje tanje u memoriju: koje smje ta objekre privremeno
Dinamièko smje tanje u memoriju: blokovi memorije neogranièene velièine mogu
biti pozvani za vrijeme kompajliranja uz kori tenje funkcija biblioteka.
Ova tri pristupa variraju od situacije do situaciju, ali uglavnom ih posjeduju s
vi C programi.
Biblioteke:
Programski jezik C koristi biblioteke kao primarnu metodu za ekstenziju. U C u s
e
biblioteka sje ta u funkciju sadr anu u jedinstvenoj arhivskoj datoteci. Svaka bibliot
eka je
tipièno te a datoteka koja sadr i prototipe funkcija sadr anim u biblioteci koju mo e
koristiti program, i deklaracije specijalnih tipova podataka i makro simbola kor
i tenim u
ovim funkcijama.
Najuobièajenija C biblioteka je C standard libraby , koja je specifièna po ISO i ANS
I C
standardima i dolazi sa svakom C implementacijom. Ova biblioteka podr avca input i
output tok, prijenos memorije, mamtematièkih stringova i vrijednosti vremena.
Dok su mnogi programi napisani u C-u , postoji irok krug drugih dostupnih
biblioteka.Biblioteke su èesto napisane u C-u zbog toga sto C kompajleri generi u ob
jektni
kod. Programeri zatim kreiraju interfejs biblioteka tako da se programi mogu kor
istiti na
nisko-nivoskim jezicima kao to je Java, Perl i Python.
Algol 60
ALGOL 60 je kori ten uglavnom u svrhu istra ivanja od strane raèunarskih nauènika u
Sjedinjenim Dr avama i Evropi. Njegova upotreba u komercijalne aplikacije je bila
uskraæena usljed nedostatka opisa u standardno ulazno / izlaznim objektima
nezainteresovanosti velikih raèunarskih kompanija. ALGOL 60 je meðutim postavio
standarde za izradu algoritama i imao je velik uticaj na buduæi razvoj jezika.
ALGOL 60 naèelno nije posjedovao ulazno / izlazne objekte; primjena im je bila
samodefini uæa te su rijetko bili kompatibilni jedni s drugima. Nasuprot tome, ALGOL
68 je
ponudio opse ne biblioteke transput objekata (ALGOL 68 sinonim za ulazno/izlazne).
ALGOL 60 dozvoljava dvije strategije pozivanja parametara: uobièajeni poziv-po-ref
erenci
(call-by-reference) i poziv-po-imenu (call-by-name). Poziv-po-imenu imao je odreðe
na
76
ogranièenja za razliku od poziva-po-referenci, to je predstavljalo ne eljeni nedostat
ak u
vodeæim jezièkim dizajnima. Na primjer, nemoguce je sa ALGOL 60 napraviti proceduru
koja ce zamijenit vrijednosti dva parametra, ako su stvarni parametri koji se po
zivaju
cjelobrojna promenljiva i niz koji je indeksiran istom cjelobrojnom promjenjljiv
om. Ipak,
poziv-po-imenu je jo uvijek popularan dio Algola u vidu isjeèaka programskog koda t
zv.
"thunks". Donald Knut osmislio je "test èovjek ili djeèak " da kompajler ispravno ra
zlikuje
"rekurziju i ne-lokalne reference". Ovaj test sadr i primjer poziva-po-imenu.
procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);

value n, m; array a; integer n, m, i, k; real y;


comment The absolute greatest element of the matrix a, of size n by m
is transferred to y, and the subscripts of this element to i and k;
begin integer p, q;

y := 0; i := k := 1;
for p:=1 step 1 until n do
for q:=1 step 1 until m do

if abs(a[p, q]) > y then


begin y := abs(a[p, q]);
i := p; k := q
end

end Absmax

Algol 68
ALGOL 68 (skraæeno od ALGOrithmic Language 1968) je bio vodeæi raèunarski
programski jezik kao nasljednik uspje nog ALGOL 60 razvijen u cilju mnogo ireg spek
tra
primjene i rigoroznije definisane sintakse i semantike.
Doprinosi polju raèunarske nauke ALGOL-a 68 su veliki i raznovrsni. Iako neki od n
jih nisu
javno izno eni dok nisu potvrðeni, u jednom ili drugom obliku, kasnije je postao dio
razvijenih programskih jezika.
ALGOL 68 uvodi sadr aje kao to su sintakse na bazi izraza, korisnièki deklarisani tip
ovi i
strukture, model pokazivaèkih promjenjljivih i pokazivaèkih parametara, te moguænost
uzimanja elementa iz nizova, redova i matrica.
begin # Algol-68 prime number sieve, functional style #

proc error = (string s) void:


(print(( newline, " error: ", s, newline)); goto stop);
proc one to = (int n) list:
(proc f = (int m,n) list: (m>n | nil | cons(m, f(m+1,n))); f(1,n));

mode list = ref node;


mode node = struct (int h, list t);
proc cons = (int n, list l) list: heap node := (n,l);
proc hd = (list l) int: ( l is nil | error("hd nil"); skip | h of l );
proc tl = (list l) list: ( l is nil | error("tl nil"); skip | t of l );
proc show = (list l) void: ( l isnt nil | print((" ",whole(hd(l),0)));

show(tl(l)));

77
proc filter = (proc (int) bool p, list l) list:
if l is nil then nil
elif p(hd(l)) then cons(hd(l), filter(p,tl(l)))
else filter(p, tl(l))
fi;

proc sieve = (list l) list:


if l is nil then nil
else

proc not multiple = (int n) bool: n mod hd(l) . 0;


cons(hd(l), sieve( filter( not multiple, tl(l) )))
fi;

proc primes = (int n) list: sieve( tl( one to(n) ));

show( primes(100) )

end

PL/I
Nauèno i poslovno orjentisani korisnici su 1950-tih i ranih 1960-tih programirali
u razlièitim
programskim jezicima za razlièiti raèunarski hardver. Tako su poslovno orjentisani s
e
koristili Autocoders-om preko COMTRANa do COBOLa, dok su nauèno orjentisani
korisnici programirali u FORTRANu. IBM-ov System 360 (najavljen 1964. god) je bi
o
dizajniran kao zajednièka ma inska arhitektura za oba tipa korisnika, nasljednika sv
ih
postojeæih IBM arhitektura. Slièno, IBM je elio jedinstven programski jezik za sve
korisnike. Nadali su se da bi FORTRAN mogao biti pro iren za potrebe poslovno
orjentisanih programera. U oktobru 1963 formira se odbor sastavljen od 3 èlana IBM
-a iz
Njujorka i 3 èlana SHARE-a te IBM-ove grupe nauèno orjentisanih korisnika u cilju
prijedloga ovih pro irenja FORTRAN-a. Bili su u nemoguænosti da to uèine zbog
ogranièenja FORTRAN-a te su se pojavili sa dizajnom novog programskog jezika pod
oznakom NPL . Ova skraæenica se podudarala sa skraæenicom za Britanski nacionalni
laboratorij fizike te je zamijenjen sa MPPL, a kasnije, 1965 godine sa PL/I (sa
rimsko I
kao FORTRAN-ov IV ). Prva definicija se pojavila u aprilu 1964 godine.
IBM je uzeo NPL kao poèetnu taèku i dovr io dizajn do nivoa pisanja prvog kompajlera:
NPL-ove definicije su bile nepotpune u detaljima i opsegu. Kontrola PL/I je obav
ljana
najprije u Centru za programiranje u Njujorku a kasnije u IBM-ovoj laboratoriji
u Hursliju,
Velika Britanija. SHARE i GUIDE grupe korisnika su bili ukljuèene u pro irivanje jez
ika i
imale su ulogu u IBM-ovom procesu za kontrolu jezika kroz njihove PL/I projekte.
Pokazalo
se da tako veliki jezik ima potrebu za formalnom definicijom PL/I-ja. Projekt je
osnovan
1967 godine u IBM-u u Beèu da bi pru io kompletnu specifikaciju i otklonio moguæe
dvojbe. To je dovelo do jedne od prvih veæih formalnih metoda za razvoj, nazvanih
VDM.
Jezik je najprije bio detaljno naznaèen u priruèniku Specifikacije jezika PL/I. C28-6
571
napisanog u Njujorku 1965 godine, te izmijenjen u priruèniku Specifikacije jezika P
L/I.
GY33-6003 u Hursliju 1967 godine. IBM je nastavio razvijat PL/I kasnih 60-tih i r
anih 70tih,
objavljujuæi ga u priruèniku GY33-6003. Ove priruènike su upotrijebljavale grupe
korisnika Multics-a kao i drugi rani korisnici. Prvi kompajler je napra vljen 19
66 godine, a
standard za PL/I je odobren 1976 godine. Odbor The Share 3by3 je postavio sljedeæe
ciljeve za NPL :
· Korisni opseg koji æe ukljuèivati postojeæi FORTRAN, dodatno uvrstiti aplikacije78
znakovne i brojne nizove, pro irene U/I operacije te dinamièke odzive u sluèajevima
gre aka prekoraèenja ili kraja datoteke.

Razumljivost jezika. Ukloniti proizvoljna ogranièenja i neprirodne interpunkcije ko


je
su smetali korisnicima FORTRAN-a. Kao rezultat dobiti jezik koji æe biti lak e uèiti i
koristiti.
Uskladiti jezik sa trenutnom praksom rada ma ina Sisteme U/I kontrole, nadzor
zamki (odnosno izuzetaka), praæenje operacija i multiprogramiranje. (Drugi
implementatori ne podr avaju funkciju multiprogramiranja jer se njihovi operativni
sistemi razlikuju od IBM-ovih u tom podruèju.)
Ovi ciljevi su evoluirali tokom ranog razvoja jezika. Bilo je potrebno uvest kon
kurentnost sa
COBOL-ovim upravljanjem listama i pisanju izvje taja. Korisni opseg se pro irio i
ukljuèivao je sistemsko programiranje te dogaðajima-upravljano programiranje. Dodatn
i
ciljevi za PL/I su bili:

Izvr avanje kompajliranog koda u odnosu na FORTRAN ( to nije bilo postignuto).


Imati moguænost pro irenja za novi hardver i u podruèju novih aplikacija.
Pobolj ati produktivnost i vrijeme procesa programiranja, prenoseæi napor sa
programera na kompajler.
Biti ureðajno-neovisan, te funkcionisati efikasno u glavnom hardveru i opsegu
operativnog sistema.
Da bi postigao ove ciljeve, PL/I je posudio ideje od drugih postojeæih jezika doda
juæi
prilièan broj novih moguænosti te upotpunio ga sa prepoznatljivom i èitljivom sintakso
m.
Brojni principi i moguænosti kombinovani su skupa da jeziku dobije svoj karakter u
ispunjavanju ciljeva:

Blok strukture, sa osnovnom semantikom (ukljuèujuæi rekurziju), kao ALGOL 60.


PL/I je pro ao test èovjek ili dijete Donalda Knuth-a. Argumenti proslijeðivati preko
poziva-po-referenci, koriteæi la ne varijable za vrijednosti po potrebi (poziv-povri
jednosti).
irok opseg raèunarskih tipova podataka, programa kontrole tipova podataka kao i
oblika struktura podataka.
Dinamièka pro irenja za nizove i znakove
Kratka sintaksa za izra avanje,deklaracije i iskaze sa dozvoljenim skraæenicama.
Pogodan za skup znakova od 60, te moguæno æu pode enja na 48.
Opse ne strukture zadane u iskazima,opcijama i deklaracijama da bi se sakrila
odreðena kompleksnost, olak alo pro irenje jezika i smanjilo tipkanje.
Sna no iterativno procesiranje sa dobrom podr kom za strukturalno programiranje.
Bez rezervisanih rijeèi. Novi atributi, iskazi i opcije iskaza su bile moguæe dodati
PL/I-ju bez poni tavanja postojeæih programa. Nisu bili rezervisani èak ni IF, THEN,
ELSE i DO.
Ortogonalnost- svaka moguænost da bude neovisna jedna o drugoj, te slobodno
kombnovana sa ostalim moguænostima gdje god ima smisla. Svaka moguænost da
bude dostupna u svakom kontekstu gdje ima smisla- da se iskoristi to je vi e
moguæe i da se izbjegnu proizvoljna ogranièenja . (Poma e da programski jezik
bude dobar ).
Moguænosti za kontrolu i presretanje izuzetaka u posebnim uslovima (rukovanje
izuzecima) rada.
Programi podijeljeni u odvojene cjeline (pogodne za kompajliranje), sa odbjektim
a
za kompajliranje tzv. macros, za kombinovanje i spajanje dijelova koda u u
kompletne prorame.
Objekti za otklanjanje gre aka (tzv. debugging), integrisani u osnovu jezika.
79
Ovi principi su neminovno rezultirali velikim programskim jezikom te su zahtijev
ali prilièno
kompleksnije kompajlere od COBOL-ovih ili FORTRAN-ovih. To se nije gledalo kao
nedostatak jer je bilo malo ljudi koji su se bavili kompajliranjem(zahtjevalo pu
no rada), s
druge strane je bilo vi e obiènih programera (manje rada).
/* Read in a line, which contains a string,
/* and then print every subsequent line that contains that string. */

find_strings: procedure options (main);


declare pattern character (100) varying;
declare line character (100) varying;
declare (line_no, end_file) fixed binary;

end_file = 0;
on endfile (sysin) end_file = 1;

get edit (pattern) (L);


line_no = 1;
do while (end_file = 0);

get edit (line) (L);


if index(line, pattern) > 0 then
put skip list (line_no, line);
line_no = line_no + 1;
end;

end find_strings;

Ada
Ada je struktuirani, imperativni raèunarski programski jezik. Dizajnirao ga je tim
predvoðen
Jean Ichbiah kompanije CII Honeywell Bull tokom 1977-1983. Obavljao je sliène zada
tke
kao C i C++, ali sa poveæanom sigurno æu poput Jave. (Neki navode i uticaj Ade na Javu
.)
Nazvana je prema Ada Lovelace, èesto pripisivano kao prvi raèunarski programer.
Izvorna namjena Ade je da bude u ugraðenim real-time sistemima, te se jo uvijek kor
isti u
te svrhe. Revizija Ada 95, dizajnirana od strane S. Tucker Taft kompanije Interm
etrics
izmeðu 1992 i 1995,unaprijedila je podr ku za sistemsko, numerièko i finansijsko
programiranje.
Znaèajnije odlike Ade ukljuèuju precizno pisanje, modularne mehanizme (paketi), prov
jeru
pri pokretanju, paralelno procesiranje (zadatci), upravljanje izuzecima te gener
iènost. Ada
95 je dodala podr ku za objektno-orjentisano programiranje, ukljuèujuæi dinamièko
otpremanje.
Podr ku provjere pri pokretanju Ada koristi da bi zabranila pristup slobodnoj memo
riji,
sprijeèiti prepunjavanje buffer-a, gre ku off-by-one i druge otklonjive propuste. Ov
e
moguænosti se mogu i iskljuèiti èime se dobije na efikasnosti, ali se takoðe mo e efikasno
i
kompajlirati. Takoðe ukljuèuje objekte za lak u programsku provjeru. Zbog ovih razloga
na ao je iroku upotrebu u sigurnosnim sistemima kao to su avio, vojnim (za oru je) te
svemirskim letjelicama.
Programe Ade saèinjavaju paketi, procedure i funkcije.
with Ada.Text_IO;

80
package Mine is

type Integer is range 1 .. 11;

i : Integer := Integer'First;
procedure Print (j: in out Integer) is

function Next (k: in Integer) return Integer is


begin
return k + 1;
end Next;

begin
Ada.Text_IO.Put_Line ('The total is: ', j);
j := Next (j);

end Print;

begin
while i < Integer'Last loop
Print (i);
end loop;
end Mine;

Modula 2
Modula-2 je raèunarski programski jezik dizajniran i razvijan izmeðu 1977 i 1980 od
strane
Niklaus Wirtha iz Ciri kog ETH, kao revizija Pascala da bi slu io kao jedini program
ski
jezik za operativni i aplikacijski softver radne stanice Lilith. Glavni koncepti
su bili:
Modul kao mjera za kompajliranje iz dijelova
Coroutine kao osnovni programski dio za konkurencijske procese
Enkapsulaciju tipova i procedura koji omoguæavaju pristup odreðenim ma inskim
objektima
Modula-2 je shvaæena kao uspje an nastavak Niklaus Wirth-ovog ranijeg programskog
jezika Pascala. Dizajn jezika je bio pod uticajem programskog jezika Mesa i novi
h
moguænosti za programiranje osobnih raèunara Xerox Alto, oba iz Xerox-a, koje je Wir
th
vidio tokom 1976 u Xerox PARC-u.
MODULE SumAndAverage;

FROM InOut IMPORT ReadInt, WriteString, WriteLn, WriteInt,


OpenInput, OpenOutput, CloseInput,
CloseOutput, Done;

VAR
N:INTEGER;
X:INTEGER;
SUM:INTEGER;
AVERAGE:INTEGER;

BEGIN
WriteString

('Enter the names of the output, input files');


WriteLn;
OpenOutput("OUT");
IF NOT Done THEN

WriteString('Output file cannot be opened');


WriteLn;
HALT;

81
END;
OpenInput("IN");
IF NOT Done THEN

CloseOutput;
WriteString('Input file cannot be opened');
WriteLn;
HALT;

END;
N:=0; SUM:=0; ReadInt(X);
WHILE Done DO

WriteInt(X,3);
WriteLn;
N:=N+1;
SUM:=SUM+X;
ReadInt(X);

END;
WriteString('The Sum is '); WriteInt(SUM, 1);
WriteLn; AVERAGE:=SUM DIV N;
WriteString('The Average is ');
WriteInt(AVERAGE, 1); WriteLn;
CloseOutput;
CloseInput;

END SumAndAverage.

XBASE
dBASE je bio prvi iroko kori teni sistem za upravljanje bazama podataka ili
DBMS(database management system) za mikrokompjutere, objavljen od strane Ashton-
Tate za CP/M, kasnije i na Apple II, Apple Macintosh i IBM PC u DOS-u to je dBASE
uèinilo najprodavanijim softverom dugi niz godina. dBASE nije uspio napraviti prel
az na
operativni sistem Microsoft Windows te je na kraju bio zamijenjen novijim rje enji
ma kao
to su bili Paradox, Clipper i FoxPro. dBASE je prodat Borlandu 1991, koji je kasn
ije 1999
prodao prava na distribuciju novoformiranom dBASE Inc.
Sredinom 1980'tih mnoge kompanije su poèinjale sa pravljenjem njihovih varijacija
i sliènih
rje enja na jezik dBASE. Tu svrstavamo FoxPro (danas Visual FoxPro), Quick-Silver,
Clipper, Xbase++, FlagShip, i Harbour. Zajedno se neformalno svrstavaju i kao xB
ase ili
XBase.
SELECT 1
SET ORDER TO 1
@ 01,01 TO 20,78 DOUBLE
DO WHILE .T.

VCODIGO = 0
VFIM = SPACE(01)
@ 05,06 SAY "CODIGO: " GET VCODIGO PICT "999"
READ
SEEK VCODIGO
IF .NOT. FOUND()
@ 22,32 SAY "ESTE CÓDIGO NAO FOI CADASTRADO"
INKEY(0)
@ 22,32 SAY " "

LOOP
ENDIF
@ 07,6 SAY "DIA: " + DIA
@ 09,6 SAY "HORA: " + HORA

82
@ 11,6 SAY "COMPROMISSO: " + COMPRO
@ 15,48 SAY "CONTINUAR? [S/N] " GET VFIM PICT "@!" VALID(VFIM$"SN")
READ
IF VFIM = "S"
LOOP
ELSE
EXIT
ENDIF
ENDDO

Quick BASIC
Microsoft QuickBASIC (èesto jo i kao QB s tim da se treba razlikovati od Qbasic koji
je
zapravo drugi sistem)je nasljednik programskog jezika BASIC, razvijanog od stran
e
Microsoft korporacije za kori tenje u MS-DOS operativnom sistemu. Zasnovan je u ma
njoj
mjeri na GW-BASICu ali je podpomognut sa korisnièki-definisanim tipovima, unaprijeðe
nim
programskim strukturama, boljom diskovnom i grafièkom podr kom te kompajlerom u
dodatku interpreteru. Microsoft je prodavao QuickBASIC kao komercijalni paket za
razvoj.
DECLARE SUB init ()
DECLARE SUB get.wave ()
DECLARE SUB save.wave ()
DECLARE SUB measure ()
DECLARE SUB enter (number!)
DIM SHARED motorv(1000)
DIM SHARED servofreq(1000)
DIM SHARED lf$
lf$ = CHR$(10)
CALL init
CALL measure
END
SUB init
lf$ = CHR$(10)
OPEN "com2:2400,n,8" FOR RANDOM AS #1 LEN = 2
PRINT #1, ":acquire:type normal"; lf$;
PRINT #1, ":acquire:complete 1"; lf$;
END SUB
SUB measure
FOR count% = 1 TO 6

PRINT #1, ":digitize channel1"; lf$;


PRINT #1, ":measure:freq?"; lf$;
CALL enter(servofreq(count%)) 'input vav
motorv(count%) = TIMER

NEXT count%
END SUB

BCPL
BCPL (Basic Combined Programming Language) je raèunarski programski jezikm
dizajniran od strane Martin Richardsa sa Univerziteta Cambridge 1966; bio je nam
jenjen
za pisanje kompajlera za druge jezike.
Neobièan je utoliko to ima jedan podatkovni tip: rijeè, fiksan broj bita, obièno odabra
no da
se podudara sa arhitekturom ma inske rijeèi. Ovakav izbor je kasnije pokazao da stva
ra
izvjesne probeme kada je BCPL kori ten na ma inama èiji najmanji adresabilni podatak
83
nije bila rijeè veæ byte. Interpretacije bilo koje vrijednosti je odreðivao operater,
kori tenu
za obradu vrijednosti. (Na primjer, + je sabirao dvije vrijednosti zajedno treti
rajuæi ih kao
cjelobrojne tipove; znak ! uno eno u vrijednosti, efektivno tretirajuæi kao pokazivaè.
) Da bi
ovo moglo raditi, realizirano je tako da se ne vr i provjera tipa.
// Routine to compute a checksum of a
// named file, simplified from a compiler example.
GET "libhdr"

LET start() = VALOF

$( LET args = VEC 50


LET instream = 0
LET outstream = 0
LET sum = 314159

IF rdargs("FROM/A,TO/K", args, 50) = 0 DO


$( writes("Bad arguments for CHECKSUM*n")
RESULTIS 20
$)

instream := findinput(args!0)
IF instream = 0 DO $( writef("can't open %s*n", args!0)
RESULTIS 20
$)
selectinput(instream)

UNLESS args!1 = 0 DO
$( outstream := findoutput(args!1)

IF outstream = 0 DO $( writef("can't open %s*n", args!1)


endread()
RESULTIS 20

$)
$)

$( LET ch = rdch()
IF ch=endstreamch BREAK
sum := (13*sum + ch) & #xFFFFFFF

$) REPEAT

UNLESS outstream=0 DO selectoutput(outstream)


writef("%n*n", sum)
out:
endread()
UNLESS outstream = 0 DO $( selectoutput(outstream)

endwrite()
$)
RESULTIS 0
$)

84
Objektno-orijentisano programiranje
Objektno orjentisano programiranje je metodologija programiranja kojom se modeli
ra
realan svet kao skup objekata i odnosa meðu objektima. Osnovni element u ovoj
metodologiji su, znaèi, objekti koji se koriste za razvoj programa (softvera). Pom
islite o
objektima koji nas oku uju automobili, ptice, drveæe, ljudi itd. Ima ih bezbroj svud
a oko
nas. Uobièajeno je da sve objekte koji nas okru uju klasifikujemo pa otuda i jedan o
d
osnovnih pojmova kod OO metodologije pojam klase (Class).
Klasa (Class)
Klasa je sastavljena od osobina objekta koje se izra avaju podacima koje ih opisuj
u
(atributa) i akcija koje objekti mogu sprovoditi (metoda). Uzmimo na primjer aut
omobil:
podaci (atributi) koji karakteri u automobile su brzina, boja, broj sjedi ta, itd.,
a aktivnosti
(metode) koje ovaj objekat mo e da obavlja su
ubrzavanje, koèenje, promena stepena brzine (mjenjaèem) itd. Ili, uzmimo za primjer
objekte kao to su studenti. Atributi studenta su ime, prezime, broj indeksa, godi
na
roðenja, godina studija, itd. Aktivnosti koje studenti izvr avaju su upis semestra,
prijava
ispita, polaganje ispita, itd. Ili, recimo posmatrajmo automat za kafu. Kao atri
bute automata
mo emo da uzmemo boju, listu artikala koji se nude, iznos novca u kasi, trenutnu u
patu,
itd. Metode kod automata mogu biti izbor artikla, ubacivanje novca, preuzimanje
artikla,
preuzimanje kusura, odustajanje od kupovine, itd. Klasa opisuje sve objekte dato
g tipa, na
taj naèin to defini e koji æe podaci biti kori æeni za opis svakog pojedinaènog objekta.
Zato je klasa apstraktna struktura bez pojedinaènih vrijedosti za podatke kojima s
e opisuju
objekti.
Objekti (Object)
Objekta je jedna konkretizacija klase, odnosno objekat je jedan konkretan primer
ak sa
konkretnim atributima koji ga razlikuju od drugih objekata iz iste klase. Na pri
mer u klasi
Pjevaè, mo e da postoji objekat HalidBeslic koja prestavlja jedan poseban sluèaj objekta
iz klase Pjevaè .
Razmjena poruka (Message Passing)
Objekti ne postoje izolovano. Oni interaguju sa drugim objektima. U OO programir
anju ova
interakcija se ostvaruje preko poruka. Prenos poruka je proces u kome jedan obje
kat
(po iljalac-sender) alje podatke drugom objektu (primaocureceiver) ili tra i od drugo
g
objekta da aktivira neki svoj metod. Tako svaka poruka ima po iljaoca i primaoca.
Pona anje objekata (Behavior)
Pona anje se odnosi na to kako objekti reaguju na poruke, to jest kako menjaju sop
stveno
stanje (atribute) i/ili aktiviraju svoje metode.
Prednosti kori æenja OO programiranja
Realistièno modeliranje realnosti: Kori æenje OO metodologije daje
moguænost boljeg I verodostojnijeg modeliranja procesa iz na e realnosti.
Vi estruko kori æenje klasa: Jedanput dizajnirana klasa mo e biti iskori æena
u raznim aplikacijama.
Olak ano odr avanje softvera: Kori æenjem OO metodologije znaèajno se
olak ava odr avanje softvera, jer je jednostvnija identifikacija modulèa koje
treba menjati.
Osnovna svojstva OO metodologije
Sada æemo se ukratko baviti nekim osnovnim svojstvima OO metodologije.
Enkapsulacija (Encapsulation, data hiding)
Enkapsulacija je jedan va an koncept u OO programiranju. Spoljni svet, kao je veæ reèe
no,
85
pristupa samo onim atributima i metodama koje su oznaèene kao public. Programer ko
ji
koristi neku klasu ne mora da zna kako su atributi i metode u samoj klasi kodira
ne. Sve to
je njemu potrebno je da poznaje interfejs preko kojeg pristupa metodama i atribu
tima
klase. Naravno, potrebno je da razume i znaèenje atributa i metoda kojima pristupa
, ali ne
mora da zna kako su same metode programirane. Na taj naèin je obezbijeðeno da se
gre ke koje se pojave u klasi otklanjaju u samoj klasi, bez potrebe za promjenom o
nog
dela programa koji tu klasu koristi.
Apstrakcija (Abstraction)
Apstrakcija je proces kojim se objekti iz realnog sveta modeliraju upro æenom slikom
napravljenom u klasi pomoæu atributa i metoda. Recimo klasa automobil koju smo nap
red
pomenuli ne opisuje sve moguæe karakteristike automobila, veæ neke osobine zanemaruj
e
(apstrahuje) i ne prikazuje ih kroz atribute i metode. Koji atributi i metodi æe b
iti odabrani za
prikaz u klasi zavisi od namjera koje imamo u pogledu buduæeg kori æenja klase u razni
m
aplikacijama. Pravilno odabran model realnog sveta mo e da pomogne da se razumeju
re enja problema koje treba rije iti kroz softversku aplikaciju.
Kompozicija (Composition)
Objekti mogu da interaguju na razlièite naèine u nekom sistemu. U nekim sluèajevima
klase i objekti mogu biti tako meðusobno povezani da svi zajedno èine kompleksan sis
tem.
U primeru sa automobilom toèkovi, paneli, motor, mjenjaè itd. Mogu biti posmatrani k
ao
posebne klase. Klasa automobil, u tom sluèaju, predstavlja kompoziciju ovih posebn
ih
klasa
Nasljeðivanje (Inheritance)
Nasljeðivanje omoguæava da neka klasa (sub klasa) bude bazirana na drugoj klasi (sup
er
klasa) i da od nje nasledi svu funkcionalnost. Kroz dodatni kod (atribute metode
) sub klasa
mo e biti specijalizovana za posebne potrebe. Na primer, kod klase vozila (kao sup
er
klase) mo emo kreirati sub klase automobili i motorcikli. Obe ove klase nasledile
bi sve
metode klase vozila, ali bi takoðe mogle da imaju I svoje specijalizovane metode i
atribute,
kao to su metoda Nagnise() i atribut Ugaonaginjanja za motorcikle.
Vi estruko nasljeðivanje (Multiple Inheritance)
Vi estruko Nasljeðivanje omoguæava da neka klasa (sub klasa) bude bazirana na vi e od
jedne klase.
Polimorfizam i kasno povezivanje (Polymorphism and Late bindning)
Polimorfizam je sposobnost objekta da menja pona anje u zavisnosti od naèina na koji
se
koristi. Polimorfizam u najjednostavnijem obliku se pojavljuje kao niz metoda sa
istim
imenom ali sa razlièitim parametrima. Ovaj oblik polimorfizma naziva se overloding
(overloading), a sreæe se i kod operatora . U zavisnosti od parametara koje korist
imo biæe
pozvan onaj metod koji odgovara kori æenim. Pored ovoga omoguæena je i izmjena
metoda u naslijeðenim klasama, kada metode s istim imenom rezultuju razlièitim poziv
ima
podprograma, to se naziva kasno povezivanje.
Modularnost (Modularity)
I pored gore navedenih koncepata OO programiranje donosi i poveæanje modularnosti
programa. Individualne klase ili grupe povezanih klasa (biblioteke klasa) mogu s
e
posmatrati kao moduli koji se mogu koristiti u raznim softverskim projektima. Na
taj naèin
se smanjuje potreba za ponovnim programiranjem sliènih zadataka, pa se tako reduku
je
ukupan napor potreban za razvoj softvera.
Automatsko upravljanje memorijom (Garbage collection)
Objekti se mogu kreirati i dinamièki, tako da se alocira vi e njegovih kopija (insta
nci). Ako
jezik ima automatsko upravljanje memorijom, njegovo okru enje æe samo izbacivati iz
memorije objekte koji se vi e ne koriste.
86
C++

C++ je programski jezik op te namjene i srednje razine sa podr kom za objektno


orijentirano programiranje. Prvobitno je razvijan u Bell Labs (laboratoriju
telekomunikacijske tvrtke Bell) pod rukovodstvom Bjarne Stroustrupa tokom 1980-i
h kao
pro irenje programskom jeziku C, te mu je originalno ime bilo "C with classes" (en
gl. C s
klasama). Zbog velike potra nje za objektno orijentiranim jezicima te izrazitim
sposobnostima, specifikacija programskog jezika C++ ratificirana je 1998. kao st
andard
ISO/IEC 14882.C + + je uvelike utjecao na mnoge druge popularne programskim jezi
cima,
od kojih su najpoznatiji Java.
Razlike izmeðu struktura i klasa u C + +
U C + +, struktura je klasa definisana strukturom kljuène rijeèi. Èlanovi i baza klase
su
javni po defaultu. Klasa definisana sa klasom kljuène rijeèi ima privatne èlanove i ba
znu
klasu po defaultu. To je jedina razlika izmeðu struktura i klasa u C + +.
Agregatna klase
Agregatna klasa je klasa bez korisnièki-progla ene konstrukcije, bez privatne ili za t
iæene
baze èlanova, bez baze klase i bez virtualnih funkcija. Takve klase se mogu inicij
alizirati sa
zatvorenom listom reèenica koje su odvojene zarezom. Semantika sljedeæeg koda je
jednaka u programskim jezicima C i C + +:
struct C

int a;

double b;
};

struct D

int a;

double b;

C c;
};

// initialize an object of type C with an initializer-list


C c = { 1, 2 };

// D has a sub-aggregate of type C. In such cases initializerclauses


can be nestedC++
D d = { 10, 20, { 1, 2 } };

POD-struktura
POD-struktura (Plain Old struktura podataka) je agregatna klasa koja ima ne-stat
ièku bazu
èlanova tipa ne-POD-strukture, nema korisnièki definisanu dodjelu operatora niti kor
isnièki
definisan destruktor. Mo e se izvuæi zakljuèak da je POD-struktura C++-a ustvari
ekvivalent C strukturama. U veæini sluèajeva, POD-struktura æe imati istu memoriju kao
odgovarajuæa struktura deklarisana u C. Iz tog razloga, POD-struktura se ponekad
kolokvijalno naziva i "struktura u C-stilu .
87
Deklaracija i upotreba C + + klase imaju svoje èlanove. Ovi èlanovi su varijable
(ukljuèujuæi i èlanove drugih objekata i klasa), funkcije (specifièni identifikatori ili
preoptereæenje operatora) poznatije kao metode, konstruktori i destruktori. Èlanovi
se
deklari u kako bi se bilo u moguænosti pristupiti istima bilo javno ili privatno pom
oæu
public: i private: ulaznih razvrstavaèa respektivno. Svaki èlan nakon to je nai ao na
razvrstaè imat æe povezani pristup sve dok drugi razvrstavaè ne naiðe. Tu je i nasljedst
vo
izmeðu klasa koji mo e koristiti protected: razvrstaè.
Osnovne deklaracijske I èlanske varijable
Klase se deklari u sa rijeèima class ili struct. Deklaracija èlanova se nalazi unutar
ove
deklaracije.
struct personclass person
{{

string name;public:

int age; string name;


}; int age;
};

Gornje definicije su funkcionalno ekvivalentne. Oba koda æe difinisati objekat tip


a person
(eng. osoba) koja ima dva javna èlana baze, name (eng. ime) i age (eng. godine). T
aèkazarez
nakon vitièaste zagrade je obavezna.
Nakon jedne od ovih deklaracija (naravno ne obje), person se mo e koristiti kako b
i se na
sljedeæi naèin stvrila nova varijabla person-inog tipa:
#include <iostream>
#include <string>
using namespace std;

class person
{
public:

string name;

int age;
};

int main ()
{

person a, b;

a.name = "Calvin";

b.name = "Hobbes";

a.age = 30;

b.age = 20;

cout << a.name << ": " << a.age << endl;

cout << b.name << ": " << b.age << endl;

return 0;
}

88
Izvr avanjem prethodnog koda ispis æe biti :
Calvin: 30
Hobbes: 20
Èlan funkcije
Va an element C + + klasa i struktura èine èlanovi funkcije. Svaki tip podataka mo e ima
ti
svoje odranije ugraðene funkcije (zvane metodama) koje imaju pristup svim èlanovima
(javnim i privatnim) tog tipa podataka. U strukturi koda ne-statiènih èlanova funkci
je,
kljuèna rijeè this se koristi misleæi na objekat zbog kojeg je funkcija pozvana. To se
èesto
koristi prolaskom adrese objekta kao implicitno prvog argumenta funkcije. Uzet æem
o
gornji primjer person-e kao ponovni primjer:
class person

std::string name;

int age;
public:

person() : age(5) { }

void print() const;


};

void person::print() const

cout << name << ";" << this->age << endl;

/* "name" and "age" are the member variables.

The "this" keyword is an expression whose value is the address

of the object for which the member was invoked. Its type is

const person*, because the function is declared const.


*/
}

U gornjem primjeru print () funkcija je deklarisana u tijelu klase i definisana


sa
kvalificiranjem iste sa imenom klase praæenom sa ::. Oba èlana name i age su privatn
a i
print() je deklarisan kao javni èlan to je neophodno ako ga elimo koristiti i izvan
klase.
Uz èlana funkcije print(), ispis se mo e pojednostaviti u:
a.print ()
b.print ();
gdje su a i b gore nazvani kao po iljaoci, i prema svakom od njih æe se obraæati kao p
rema
posebnom èlanu varijabli kada se funkcija print () izvr i.
Nasljeðivanje
Izgled ne-POD klase u memoriji se ne odreðuje C + + standardom. Na primjer, mnogi
popularni C++ kompajleri implementiraju jednu ba tinu kao splet roditeljske klase
sa
djeèijom klasom, ali ovo nije potrebno po standardu.
89
Na primjer, razmislite o
class P
{

int x;
};
class C : public P
{

int y;
};

Na primjeru P sa P* p pokazuje na to da bi ovako moglo izgledati u memoriji:


+----+
|P::x|
+----+
^
p

Na primjeru C sa P* p pokazuje da bi moglo izgledati ovako:


+----+----+
|P::x|C::y|
+----+----+
^
p

Stoga, bilo koji kod koji manipulira polja P objekta mo e manipulisati P polja unu
tar C
objekta bez razmi ljanja o definiciji o C poljima. Pravilno napisam C++ program ne
bi
trebao praviti pretpostavke u vezi sa izgledom naslijeðenog polja, ni u kom sluèaju.
Kori tenjem static_cast ili dynamic_cast tipove pretvaranja operatori æe osigurati d
a su
pokazivaèi pravilno pretvoreni iz jednog tipa u drugi.
Preoptereæeni operatori
U C ++-u operatori kao to su + - */ mogu biti preoptereæeni kako bi odgovarali potr
ebema
programera. Ovi se operatori nazivaju preoptereæeni operatori. Po konvenciji,
preoptereæeni operatori bi se trebali pona ati skoro isto kao to se pona aju u ugraðenim
baznim tipovima (int,float, itd.), ali ovo nije tra eno. Osoba mo e proglasiti struk
turu kao
integer u kojoj varijabla really pohranjuje cijeli broj, ali zvanjem integer * i
nteger suma,
umjesto umno ka cijelih brojeva, cijeli brojevi se mogu vratiti :
struct integer
{
int i;
integer (int j = 0) : i (j) {}
integer operator* (const integer &k) const
{

return integer (i + k.i);


}
};

90
Kod iznad je koristio konstruktora kako bi konstruisao povratnu vrijednost. ZA jas
niju
prezentaciju (iako èe ovo smanjiti uèinkovitost programa), gornji kod se mo e prepravi
ti u:
integer operator* (const integer &k) const
{

integer m;

m.i = i + k.i;
return m;
}
Programeri mogu staviti prototip operatora u struct deklaraciji i definisati fun
kciju
operatora u globalnom podruèju:
struct integer

int i;

integer (int j = 0) : i (j) {}

integer operator* (const integer &k) const;


};

integer integer::operator* (const integer &k) const


{

return integer (i + k.i);


}
i gore pretstavlja po iljaocevu vlastitu èlansku varijablu, dok k.i pretstavlja èlansk
u
varijablu iz argumenta varijable k. Kljuèna rijeè const se pojavljuje dvaput u gornj
em
kodu. Prvo pojavljivanje, argument const integer &k, pokazuje da argument varija
ble
neæe biti promjenjen u funkciji. Drugo pojavljivanje pokazuje se na kraju deklarac
ije i ono
obeæava kompajleru da po iljaoc neæe biti promjenjen kada se pokrene funkcija.
U const integer &k, znak (&) znaèi proæi po preporuci. Kada se pozove funkcija, poin
ter
varijable æe biti prosljeðen u funkciju, a ne vrijednost varijable.
Ova gornja osobina isto vijedi I za klase.
Binarni preoptereæeni operatori
Binarni operatori (operatori sa dva argumenata) su preoptereæeni sa deklaracijom f
ukcije
sa identifikatorskim operatorom koji poziva samo jedan argument. Varijabla sa li
jeve strane
operatora je po iljaoc dok je ona sa desne strane argument.
integer i = 1;

/* we can initialize a structure variable this way as

if calling a constructor with only the first

argument specified. */
integer j = 3;
/* variable names are independent of the names of the

member variables of the structure. */


integer k = i * j;
cout << k.i << endl;

91
'4' æe se ispisati
Slijedi popis binarnih preoptereæenih operatora:
Operator Op ta upotreba
+ - * /% Aritmetièka izraèunavanja
<<>> Bitna izraèunavanja
<> ==! = <=> = Logièka uporeðivanja
& & Logièka veza

= <<=>> = Slo eni zadatak


, (Bez op te upotrebe)

'=' operator izmeðu dvije varijable istog strukturalnog tipa je podrazumijevano


preoptereæen da kopira èitav sadr aj iz jedne varijable u drugu. Mo e biti zamjenjen neèim
drugim ako je potrebno.
Operatori moraju biti preoptereæeni jedan po jedan, drugim rijeèima, nijedno
preoptereæenje je povezano jedno sa drugim. Na primjer, < nije obavezno suprotno o
d >.
dviju varijabli istog tipa struktura je preoptereæena po defaultu kopirati cijeli
sadr aj
varijabli iz jednog u drugi. Mo e se prepisati s neèim drugim, ako je potrebno.
Operatori moraju biti preoptereæena jedan po jedan, drugim rijeèima, nema preoptereæen
ja
je povezan s jednom drugom. Na primjer, <nije nu no suprotno od>.
+ -Positive / negative sign right
* & Dereference right
! ~ Logical / bitwise NOT right
++ --Pre-increment / decrement right
++ --Post-increment / decrement left
Unarni preoptereæeni operatori
Dok neki operatori, kao to smo gore objasnili, imaju dva uvjeta, po iljaoc sa lijev
e strane i
argument na desnoj, neki operatori imaju samo jedan argument, po iljaoca, i oni se
nazivaju unarnima. Primjeri su negativni znakovi (kada se ni ta ne stavi lijevo od
njih) i
logièno NE.
Po iljaoc unarnog operatora mo e biti na lijevoj a i na desnoj strani operatora. Sli
jedi lista
unarnih preoptereæenih operatora:
Operator Op ta upotreba Polo ajpo iljaoca

+ -Pozitivan / negativan predznak desno


* & Dereference desno
! ~ Logièki / bitwise NOT desno
+ + --Prije poveæanja/smanjenja desno
+ + -. Poslije poveæanja/smanjenja lijevo
92
Sintaksa preoptereæenja unarnog operatora, gdje je po iljaoc na desnoj strani:
return_type @ operator ()
Kada je po iljaoc na lijevoj strain, deklaracija izgleda ovako:
return_type operatora @ (int)
@ Iznad oznaèava operatora koji æe da bude preoptereæen. Zamijenite return_type sa
baznim tipom povratne vrijednosti (int,bool, itd.)
Parametar int u su tini ne znaèi ni ta, ali po konvenciji on je pokazatelj da je po ilja
oc na
lijevoj strani od operatora.

const argumenti semogu dodati na kraju deklaracije ako je primjenljivo.


Preoptereæenja zagradama
Uglasta zagrada [] a i mala zagrada () mo e biti preoptereæena u C++ strukturama.
Uglasta zagrada mora sadr avati samo jedan argument, dok mala zagrada mo e
sadr avati bilo koji odreðeni broj argumenata, ili biti bez argumenata.
Sljedeæa deklaracija preoptereæuje uglastu zagradu.
return_type operator[] (argument)
Sadr aj unutar zagrade je odreðen u dijelu argument.
Mala zagrada se preoptereæuje na slièan naèin.
return_type operator() (arg1, arg2, ...)
Sadr aj zagrade u pozivnom dijelu je odreðenu drugoj zagradi.
Kao dodatak uz operatore iznad, strelica operator (->), strelica sa zvjezdicom (
->*), kljuène
rijeèi new i delete mogu takoðer biti preoptereæene. Kao i operator (=), oni se takoðer
peoptereæuju po defoltu ako nije napravljena posebna deklaracija.
Konstruktori
Ponekad softver in injeri ele da njihove varijable uzimaju po defoltu vrijednosti i
li
specifiène vrijednosti pored deklaracije. Ovo se mo e uèiniti uvoðenjem konstruktora.
person (string N, int A)

{
name = N;
age = A;

93
Imajte na umu da vitièaste zagrade ne mo ete izostaviti, èak i ako su prazne.
Poèetne vrijednosti mogu se dati zadnjim argumentima kako bi se pomoglo pri
inicijaliziranju istih.
person (std::string N = "", int A = 0) : name (N), age (A) {}
Kada nijedan argument nije zadan konstruktoru u primjeru iznad, mo e se reæi da je t
o
jednako zvanjem konstruktor bez argumenta ( ili poèetni konstruktor):
person () : name (""), age (0) {}
Deklaracija konstruktora izgleda kao funkcija sa imenom istim kao i bazni tip. U
stvari,
mo emo to nazvati kontruktor u formi za zvanje funkcije. U tom sluèaju tip varijable
person bi bio povratna vrijednost:
int main ()

person r = person ("Wales", 40);

r.print ();
}

Kod iznad krejira privremeni person objekat, i onda ga dodjeljuje r-u kori tenjem
konstruktora za kopiranje.
Bolji naèin za kreiranje objekta bez kori tenja nepotrebnog kopiranja je:
int main ()

person r ("Wales", 40);

r.print ();
}
Specijalna programska akcija, koja mo e ali I ne mora biti povezana sa varijablom,
se
moze dodati kao dio konstruktora.
person ()
{

std::cout << "Hello!" << endl;


}
Sa gornjom konstrukcijom Hello! æe biti ispisano u sluèaju kada je person varijabla be
z
specijalnih vrijednosti inicijalizirana.
Destruktori
Destruktori su ustvari suprotni konstruktorima. Pozivaju se kada je uni ten dio kl
ase, npr.
Kada objekat klase kreiran u bloku (par vitièastih zagrada {} ) je obrisan nakon zat
varanja
zagrade, onda se destruktor poziva automatski.
Sintaksa za deklaraciju destruktora je slièna onoj za konstruktora. Nema povratne
vrijednosti i ime metode je isto kao i ime klase sa crticom(~) ispred.
~person ()

94
{

cout << "I'm deleting " << name << " with age " << age <<
endl;
}

Osobine
Sintaksa C++-a poku ava da uèini da svaki dio strukture izgleda kao osnovni bazni ti
p.
Upravo zato, preoptereæeni operatori dozvoljavaju da se manipuli e stukturom kao sa
prostim brojevima, polja strukture se mogu deklarisati kori tenjem uglastih zagrad
a u
sintaksi (neko_ime_struktuirane_varijable[velièina]).
Potro nja memorije
Potro nja memorije jedne strukture je ustvari suma memorijske velièine njenih dijelo
va
varijable. Uzmimo za primjer strukturu twonums :
struct twonums

{
int a;
int b;

};

Struktura se sastoji od dva integer. U mnogim sada njim C++ kompajlerima, integer
su 32bitni
integer po defoltu, tako da svaki èlan varijable koristi 4 bita memorije. Èitava
struktura, zato koristi najmanje (ili upravo toliko) 8 bita memorije.
+----+----+
| a | b |
+----+----+

Meðutim, kompajler mo e dodati crtice izmeðu varijabli ili na kraju structure kako bi
osigurao dobro poravnanje za datu kompjutersku arhitekturu, koje su inaèe 32-bitne
.
Naprimjer, struktura
struct bytes_and_such

{
char c;
char C;
short int s;
int i;
double d;
};

Mo e izgledati ovako
+-+-+--+--+--+----+--------+
|c|C|XX|s |XX| i | d |
+-+-+--+--+--+----+--------+

U memoriji, gdje XX predstavlja dva neiskori tena bita.


95
Struktura mo e iskoristiti pokazivaèe i strelice kako bi deklarisala i inicijalizira
la varijable
svojih èlanova.
Prolaz sa upuæivanjem
Dosta programera preferira da koristi znak & kako bi deklarisali argument funkci
je koji
ukljuèuje strukturu. Ovo je zato to bi se kori tenjem drugèijeg znaka samo jedna rijeè
(tipièno 4 bita na 32-bitnoj ma ini, 8 bita na 64-bitnoj ma ini) je potrebna da bi se
pro lo u
funkciju. U suprotnom, ukoliko se koristi promjenljiva vrijednost, potrebno je d
a se
argument kopira svaki put kada se pozove funkcija, to je skupo ukoliko je rijeè o v
elikoj
strukturi. Kako prolazna vrijednost povlaèi èinjenicu da se originalna struktura mod
ificira u
funkciji, kljuèna rijeè const trebao bi se koristiti da se zagarantuje da funkcija n
eæe
mijenjati parametar ukoliko to nije potrebno.
Kljuèna rijeè this
Kako bise olak ala strukturalna sposobnos da se refernira, C++ je uveo kljuènu rijeè t
his
za sve èlanove funkcija. This kljuèna rijeè se pona a kao pokazatelj prema sada njem
objektu.
This kljuèna rijeè je izuzetno va na za èlanove funkcija koji imaju strukturu povratne
vrijednosti:
complex& operator+= (const complex & c)

realPart += c.realPart;

imagPart += c.imagPart;

return *this;
}
Kao to smo ustanovili gore, this je pokazivaè, tako da je upotreba znaka (*) potreb
na
kako bi se on mogao preobratiti u odnosu na prethodno stanje.
C++ se èesto smatra da obuhvata C programski jezik, meðutim to I nije ba taèno. Veliki
dio C koda se mo e taèno kompajlirati u C++-u, ali postoji nekoliko razlika koje taène
kodove iz C-a prikazuje kao netaène u C++-u, ili ih drugaèije prihvata.
Jedna od razlika sa kojoj se èesto susreæemo jest eta to C dozvoljava promjenu iz voi
d* u
drugi pokazivaèki tip, a C++ ne dozvoljava. Jo jedan èesti problem jested a C++ defin
i e
mnogo novih kluènih rijeèi, kao to su new I class, koje se mogu koristiti kao identif
ikatori u
C programu.
Neke razlike su uklonjene u najnovijem (C99) C standard, koji sada podr ava znakov
e iz
C++-a kao to je npr. // komentari i mije a eklaracije I kod. Meðutim, C99 je uveo dos
ta
novih znakova koje C++ ne podr ava, kao to su promjenljive du ine polja, domaæe tipove
kompleksnih brojeva. Iako æe neki dijelovi C99 biti ukljuèeni u sljedeæu verziju C++
standard, C++0x.U cilju mje anja C i C++ koda, bilo koja deklaracija ili definicij
a funkcije
mora se deklarisati sa C poveznicom tako to æe se postaviti vanjski C {/*...*/} blok.
Takva funkcija ne mo e se osloniti na dodatke koji ovise o o teæivanju imena (funkcijs
ko
preoptereæenje).
96
Java
Java je objektno-orjentirani programski jezik razvijen u timu predvoðenim James Go
sling-
om u kompaniji Sun Microsystems poèetkom 1990-tih. Ideja je bila da se stvori prog
ramski
jezik koji bi bio nezavisan od operativnog sistema, baziran na C++-u, ali sa
pojednostavljenom sintaksom, stabilnijim runtime sistemom i pojednostavljenom ko
ntrolom
memorije.
Java nema veze sa JavaScript-om, iako oba jezika koriste sliènu sintaksu baziranu
na C
sintaksi.
Pet osnovnih razloga za razvoj Jave su:
treba da koristi objektno-orijentacione metodologije
treba da se isti program izvr ava na mnogim operativnim sistemima
treba da sadr i (built-in) podr ku za raèunarske mre e
treba da izvr i programe sa (geografski) udaljenih servera sa sigurno æu
treba da bude jednostavan za upotrebu i da posudi korisne stvari od starijih obj
ektivnoorijentisanih
jezika, poput C++.
Da bi postigli mre nu podr ku i izvr avanje programa na udaljenim serverima, Java
programeri ponekad moraju koristiti dodatke poput CORBA ili OSGi.
Objekt-Orijentacija [
Osnovni koncept u Javi je klasa (en. class), tj. sav izvorni kod je napisan unut
ar klasa. U
pravilu, svaka klasa je deklarirana unutar datoteke sa istim imenom i sufiksom .
java. Ovo
pravilo je donekle nametnuto kompajlerom koji zahtijeva da su imena klasa i dato
teka ista
(osim tkz. unutra njih klasa, en. inner classes). Osnovni tipovi u Javi, poput int
, boolean,
byte i sl. su takodjer predstavljeni u klasama (napomena: Reflection types) i im
aju
odgovarajuæe klasne omote poput java.lang.Integer, java.lang.Boolean i java.lang.B
yte.
Nezavisnost od Platforme (operativnog sistema) [uredi]
Javin izvorni kod nije kompajliran u ma inski kod nego je pretvoren u tkz. bytecod
e koji
zahtijeva posebno okru enje da bi se mogao izvr avati. To okru enje se u ovom sluèaju
zove Javina Virtualna Ma ina (en. Java Virtual Machine ili JVM). Trenutno JVM podr a
va
najrasprostranjenije operativne sisteme, mada ne sve. Ideja je da ako se kod nap
i e i
kompajlira na jednoj platformi (npr. Mac OS X), taj isti bytecode se mo e izvr avati
na svim
ostalim platformama koje imaju JVM (npr. Microsoft Windows XP, Linux) bez potreb
e za
97
ponovnim kompajliranjem na toj platformi.
Automatsko Èi æenje Resursa (garbage collection) [uredi]
U Javi, za razliku od npr. C++-a, memorija namjenjena objektu je automatski poèi æena,
tj.
vraæena sistemu èim se taj objekat vi e ne koristi (za tog objekta ka emo da je van
doma aja ili en. out of scope). To nije sluèaj u C++-u gdje svaki objekat koji je st
voren
mora biti ruèno izbrisan koristeæi uputu delete (ako se to ne uradi onda doðe do tkz.
curenja memorije ili en. memory leak).
Sintaksa [uredi]
Iako je Java nastala od C++, ali za razliku od C++, koji dozvoljava struktuirane
kao i
objektno-orjentirane principe, u Javi su objektno-orjentirani principi obavezni.
Sve je u Javi
objekat, a sav izvorni kod je pisan unutar klasa.
Sve u Javi je uvijek upisano unutar klase, pa èak i glavna aplikacija. Konvencija
za nazive
Java datoteke je da imaju isto ime kao i klasa koju sadr e sa obaveznim sufiksom "
.java".
Kompajler æe generirati class datoteku za svaku klasu definiranu u datoteci sa izv
ornim
kodom. Ime generirane datoteke je ime klase sa .class sufiksom. Tako npr. za kla
su
Primjer koja je deklarirana u datoteci Primjer.java, kompajler æe stvoriti class d
atoteku sa
nazivom Primjer.class. U sluèaju nepoznate (anonimne) klase, generirana datoteka æe
imati ime klase koja sadr i nepoznatu klasu, zajedno sa simbolom $ i brojem. Npr.
Primjer$1.class.
Klase koje pokreæu program moraju imati metodu main(), tzv. glavnu metodu.
Uputa void oznaèava da metoda main() ne vraæa ni ta.
main() metoda mora uzimati niz String objekata kao parametar. Obièno se taj parame
tar
imenuje args, meðutim bilo koje dozvoljeno ime varijable se mo e koristiti kao param
etar
(npr. argumenti).
Uputa static oznaèava da je ova metoda statièna tzv. metoda na nivou klase, umjesto
uobièajenog nivoa objekta (instance). Glavna metoda mora biti oznaèena static.
Uputa public (javna) oznaèava da se ta metoda mo e zvati iz koda u drugim klasama il
i da
se ta klasa mo e koristiti u drugim klasama izvan hierarhije te klase.
Printing funkcija je standardni dio Jave, tj. java.lang.System definira javnu st
aticnu (public
static) varijablu out koja je instanca (objekat) klase java.io.PrintStream i ima
metodu
println(java.lang.String) koja ispisuje informaciju na ekranu (tkz. standardni o
utput).
98
Evo primjera programa pisanog u jeziku Java
// OddEven.import javax.swing.JOptionPane;

public class OddEven {


// "input" is the number that the user gives to the computer
private int input; // a whole number("int" means integer)
/*

* This is the constructor method. It gets called when an object of the OddEven t
ype
* is being created.
*/
public OddEven() {
/*

* Code not shown for simplicity. In most Java programs constructors can initiali
ze objects
* with default values, or create other objects that this object might use to per
form its
* functions. In some Java programs, the constructor may simply be an empty funct
ion if nothing
* needs to be initialized prior to the functioning of the object. In this progra
m's case, an
* empty constructor would suffice, even if it is empty. A constructor must exist
, however if
* user doesn't put one in then the compiler will create an empty one.
*/
}
// This is the main method. It gets called when this class is run through a Java
interpreter.
public static void main(String[] args) {

/*

* This line of code creates a new instance of this class called "number" (also k
nown as an
* Object) and initializes it by calling the constructor. The next line of code c
alls
* the "showDialog()" method, which brings up a prompt to ask you for a number
*/
OddEven number = new OddEven();
number.showDialog();

}
public void showDialog() {
/*

* "try" makes sure nothing goes wrong. If something does,


* the interpreter skips to "catch" to see what it should do.
*/
try {
/*

* The code below brings up a JOptionPane, which is a dialog box


* The String returned by the "showInputDialog()" method is converted into
* an integer, making the program treat it as a number instead of a word.
* After that, this method calls a second method, calculate() that will
* display either "Even" or "Odd."
*/
input = Integer.parseInt(JOptionPane.showInputDialog("Please Enter A Number"));
calculate();

} catch (NumberFormatException e) {
/*

* Getting in the catch block means that there was a problem with the format of
* the number. Probably some letters were typed in instead of a number.
*/
System.err.println("ERROR: Invalid input. Please type in a numerical value.");
}
}
/*

* When this gets called, it sends a message to the interpreter.


* The interpreter usually shows it on the command prompt (For Windows users)
* or the terminal (For Linux users).(Assuming it's open)
*/
private void calculate() {
if (input % 2 == 0) {
System.out.println("Even");
} else {
System.out.println("Odd");
}
}
}

99
Java izvorni kod se kompajlira koristeæi javac program, tj. pozivajuæi Java kompajle
r. Npr.
da bi kompajlirali gore navedeni primjer u trenutaènom direktoriju
UNIX, Linux i Mac OS X
$ javac Primjer.java
Windows
C:\> javac Primjer.java
Samostalni programi u Javi se izvr avaju tako da se Javinoj runtime (JRE) pripi e im
e
klase koja sadr i main() (glavnu) metodu koja se automatski poziva. Npr. gore spom
enuti
program se pokreæe na sljedeæi naèin (ako je Primjer.java kompajliran u trenutnom
direktoriju)
UNIX, Linux i Mac OS X
$ java -cp . Primjer
Windows
C:\> java -cp . Primjer
Ime klase koja sadr i glavnu metodu koja se pokreæe mo e se takoðer deklarisati u METAIN
F/
MANIFEST.MF datoteci u Java arhivi, tj. JAR fajlu.
Applet
Java apleti (applets) su (obièno mali) programi koji su ukljuèeni unutar drugih apli
kacija,
obièno web stranice prikazane (i izvr avane) unutar browser-a.
// Primjer.java applet

import java.applet.Applet;
import java.awt.Graphics;

public class Primjer extends Applet {

public void paint(Graphics gc) {

gc.drawString("Vozdra raja, nema Hello world!", 65, 95);

}
}
<!-- Primjer.html stranica to sadr i Primjer applet -->
<html>
<head>

<title>Vozdra Raja Applet Primjer</title>

</head>

<body>

<applet code="Primjer" width="200" height="200">


</applet>
</body>
</html>

Uputa import upuæuje kompajler da ukljuèi java.applet.Applet i java.awt.Graphics kla


se u
kompilaciju. Koristeæi import uputu programer mo e koristiti normalizirano (skraæeno)
ime
100
klase (npr. Applet) umjesto èitavog imena (npr. java.applet.Applet) u svom izvorno
m kodu.
Primjer klasa pro iruje klasu Applet, tj. Applet daje osnovnu okosnicu aplikaciji
za
prikazivanje i kontrolu tokom rada apleta. Applet klasa je komponenta Abstract W
indowing
Toolkit (AWT), koji daje apletu moguænost da se prika e u korisnikovom grafièkom
interfejsu (tj. GUI) i reaguje na GUI dogaðaje (poput klika na dugme).
Primjer overrides (termin koji opisuje da metoda u ovoj klasi ima prednost nad r
oditeljskom
klasom) paint(Graphics) metodu nasliðenu od Container super-klase koja, daje, tj.
sadr i
kod za prikazivanje apleta. Metoda paint() uzima Graphics objekat kao parametar
koji
sadr i grafièki kontekst unutuar kojeg se prikazuje aplet. Tako npr. paint() poziva
metodu
drawString(String, int, int) unutar grafièkog kontexta da prika e "Vozdra raja, nema
Hello
world!" poèev i na piksel koordinatama 65 i 95 u apletovom prostoru.
Aplet se stavlja u HTML dokument koristeæi <applet> HTML elemenat (tj. tag). Takoðer
postoje tri atributa koji se mogu postaviti
code="Primjer" - naznaèuje ime klase koju treba izvrsiti

width="200" - znaèi irina, tj. irina apletovog prostora

height="200" - znaèi visina, tj. visina apletovog prostora

Apleti se takoðer mogu dodati HTML-u koristeæi object ili embeded elemente (tj. tago
ve),
mada podr ka za ove element varira ovisno o internet pregledniku.
Delphi
Do sada smo vjerovatno znali da je Borlandov Delphi najbolje prodavani proizvod
za
brzo razvijanje aplikacija (RAD -Rapid Application Development) koji se koristi
za pisanje
Windows aplikacija. Sa Delphijem mo emo pisati Windows programe br e i jednostavnije
nego to je to bilo moguæe ranije. Mo emo kreirati Win32 konzolne aplikacije, odnosno
Win32 programe za grafièki korisnièki interfejs (GUI Graphical User Interface). Kada
kreiramo Win32 GUI aplikacije koristeæi Delphi, dostupna nam je sva snaga istinsko
g
prevodioca (Object Pascal programski jezik) ubaæenog u RAD okru enje. Ovo znaèi da
mo emo kreirati korisnièki interfejs za program (korisnièki interfejs znaèi menije, dija
log
bokseve, glavni prozor, itd.) kori tenjem tehnike prevuci-i-pusti (drag-and-drop)
koja se
koristi kod pravih okru enja za brzi razvoj aplikacija. Takoðer, mo emo koristiti Acti
veX
kontrole kako bi smo kreirali specijalizovane programe poput Web browsera za par
minuta.
Delphi nam daje sve to bez dodatnih tro kova, ne moramo rtvovati brzinu izvr avanja
programa, po to Delphi generi e brz prevedeni kod. Delphi obavlja veliki dio posla r
adeæi
u pozadini sa detaljima niskog nivoa koji èine osnovu Windows programa, ali Delphi
ne
mo e pisati programe umjesto nas. Osoba koja se bavi izradom programske potpore èest
o
101
se naziva PROGRAMER, a alati za izradu programske potpore s kojima se slu i naziva
ju
se programerski alati.
Izbor alata za programiranje je vrlo irok. Prvo treba odrediti da li æe se programs
ki
proizvod koristiti na jednoj ili vi e platformi odnosno hoæe li se izvr avati u:
· DOS okru enju
· Windows okru enju
· Unix okru enju
· Specifiènom okru enju
ili na nekom od drugih okru enja, ili ipak mora zadovoljiti rad na vi e okru enja. Zat
im po
izboru platforme treba izabrati onaj jezièki procesor koji æe pru iti moguænost izrade
programske potpore po svim potrebnim zadanim elementima, na primjer da se izvr ava
u
Windows XP okru enju, omoguæava dostup vlastitim bazama podataka ili mo e pristupiti
bazama podataka drugih proizvoðaèa, ima potporu za pristup podacima na nekom
poslu itelju preko Interneta i slièno.
Delphi je proizvod firme Borland, danas poznate kao Inprise. Ova firma je poznat
a po
programskim jezicima kao sto su Pascal, C, C++... Dakle, Delphi programski jezik
firme
Borland utemeljen na Pascal-u zami ljen za brzu izradu programske potpore (RAD - R
apid
Application Development) s mno tvom alata koji slu e kao ispomoæ u oblikovanju grafièki
orijentiranog sadr aja. Vrlo je pogodan za izradu slo ene programske potpore.
Embarcadero Delphi, od prije poznat po imenima CodeGear Delphi, Inprise Delphi i
Borland Delphi je razvojni softver za Microsoft Windows aplikacije koje su prije
bile
kreirane od strane Borland-a, dok ih sada razvija Embarcadero Tehnologije. Bazir
a se na
jeziku Delphi programskog jezika, koje je izvedenica od Object Pascal-a. Delphi
2010 je
najnovija verzija ovog softvera i na tr i tu se mo e naæi u tri razlièita izdanja:
Professional, Enterprise i Architect.
Delphi koristi programski jezik na bazi Pascal -jezika koji se zove Object pasca
l i prikuplja
Delphi kodove u izvorni x86 kod. Oni ukljuèuju VCL (Visual Component Library), pod
r ku
za COM ovisne interfejse sa numerisanim referencama, te podr avaju veliki dio
komponenti od treæe strane. Sprovoðenjem interfejsa mogu se ovlastiti razlièita polja
ili
osobine klasa (razreda). Poruke su podr ane uvoðenjem tagging-a za svaki razred
koristeæi brojnu konstantu poruke koja se nas tièe.
Nagla ena je povezanost baze podataka, te Delphi nudi iroku bazu podataka. VCL
(Visual Component Library) sadr i veliku bazu podataka koja se tièe kontrole i bazu
podataka koja nude razlièite pristupe.
Objekti
Objekti su ustvari osnova Delphija. Nema Delphija bez objekata. Naime, sve to
vidimo u Delphiju i sa èime radimo su objekti.
Tako, recimo, èim otvorimo Delphi, dobivamo prvi i glavni objekt sa kojim æemo radit
i, a to
je Form. Form je ustvari prozor na koji se stavljaju ostali objekti. Naravno, De
lphi ne bi bio
to to jeste da se objektima ne mo e manipulisati. Tako mo emo pored fizièkih promjena
102
(mijenjanje irine, visine, boje... ) stvarati i akcije za taj objekt (na klik mi a,
na pomjeranje
mi a... ).
Vrlo va na odlika objekata je nasljeðivanje. Naime, kad god se jedan objekat stavi n
a drugi
(npr. Label na Form) ovaj prvi postaje 'dijete' (engl. Child), a drugi 'roditelj
' (engl. Parent),
te æe, po toj logici, prvi objekt naslijediti neke osobine od drugog (npr. boju, f
ont...). Va no
je napomenuti da broj 'dijete' objekata uop te nije ogranièen za jedan 'roditelj' ob
jekt. To
dopu ta itekako veliku slobodu programeru.
Kao i sve u Delphiju, programer mo e sam stvarati objekte po svojoj volji i svojim
eljama.
Najva nije je da su za svaki objekt vezane njegove osobine (engl. Properties), pom
oæu
kojih se manipuli e objektima.
Slika 1. Form
3OSOBINE
Osobine se mijenjaju na dva naèina. Onaj koji se prvi nauèi je pomoæu Object
Inspectora. To je prozor koji se nalazi sa lijeve strane i uvijek je otvoren. On
sadr i
osobine svih objekata koje trenutno programer koristi, ali je samo jedna vidljiv
a i to ona
koja je pod fokusom (na koju je kliknuto mi em).
103
Action Izaberete neku proceduru koja æe biti obavljena pri otvaranju prozora Izabe
rete neku proceduru koja æe biti obavljena pri otvaranju prozora
ActiveC ontrol Pokazuje objekat koji je aktivan nakon otvaranja prozora
Align Prijanjanje uz neku od ivica ekrana
Anchors Pokazuje kako je objekat vezan za 'roditelj' objekat
AutoScroll Odreðuje da li æe se automatski pojaviti scrollbarovi ako je to potrebno
AutoSize Odreðuje da li æe objekt tako prilagoditi velièinu da nema slobodnog prosto
BiDiMode Pravac objekata
Borde rIcons Ikone poput minimize, maximize, close
Borde rStyle Odreðuje stil prozora ( npr. Sizeable -moguæe je mijenjati velièinu u rad
u )
BorderWidth irina okvira
C aption Naslov ( npr. u ovom prozoru je naslov 'Programiranje: Osobine...' )
C lie ntHeight Visina 'korisnog' dijela prozora
C lientWidth irina 'korisnog' dijela prozora
Color Boja
Constraints Ogranièenja ( npr. visine )
Ctl3D Odreðuje da li æe objekat biti 3D renderisan
C ursor Odreðuje kakav æe kursor biti iznad objekta
DefaultMonitor Odreðuje koji objekat æe biti glavni
DockSite Odreðuje da li je objekat vezan
DragKind Odreðuje vrstu povlaèenja objekta
DragMode Odreðuje naèin povlaèenja objekta
Enabled Pokazuje da li je objekat ' iv'
Font Odreðuje font na objektu
FormStyle Stil prozora ( npr. MDIChild -prozor unutar drugog prozora )
Height Visina objekta ( dimenzija po y-osi )
HelpC ontext Dio Help file koji æe biti prikazan po pritisku na 'What's this?'
He lpFile Odreðuje koji file slu i kao Help file
Hint Tekst koji se nalazi u utom okviru koji slu i kao obja njenje
Horz ScrollBar Odreðuje osobine horizontalnog scrollbara
Icon Ikona u gornjem lijevom uglu prozora
Ke yPreview Odreðuje da li æe objekat reagovati na tastaturu prije aktivne kontrole
Left Udaljenost objekta od lijeve strane 'roditelj' objekta ( ovdje ekrana )
Menu Pokazuje na meni tog prozora
Name Ime objekta ( automatski je Form1, ali se mo e mijenjati )
O bje ctMenuItem Pokazuje na jedan dio menija
O ldC re ate O rde r Odreðuje kreiranje i uni tavanje objekta
Pare ntBiDiMode Nasljeðivanje BiDiMode
ParentFont Nasljeðivanje fonta
Pixe lsPerInch Broj taèaka po inèu
PopupMenu Odreðuje popup meni za objekat
Position Odreðuje poziciju prozora ( npr. ScreenCentar -uvijek u centru ekrana )
PrintScale Skala za printanje
Scaled Skaliranje
ShowHint Odreðuje da li æe Hint biti prikazan
Tag Brojna oznaka objekta
Top Udaljenost objekta od gornje strane 'roditelj' objekta ( ovdje ekrana )
UseDockManager Odreðuje kori tenje dock managera pri pomjeranju prozora
VertScrollBar Odreðuje osobine vertikalnog scrollbara
Visible Pokazuje da li je objekat vidljiv
W idth Odreðuje irinu objekta ( dimenzija po x-osi )
W indowMenu Odreðuje meni ako je FormStyle MDIForm
W indowState Stanje prozora ( npr. Maximized -starta se maximizovan )

Slika 2. Object Inspector


104
Drugi naèin mijenjanja osobina je mijenjanje u radu. Ovo je programerski naèin. Naim
e,
dok program radi programer nema moguænost mijenjati osobine pomoæu Object
Inspectora. Tako recimo ako hoæemo da u toku rada programa, prozor ( npr. Form1 )
promijeni visinu (koja je iznosila npr. 375) na 400, treba da ukucamo ovo:
Form1.Height := 400;
Dakle, prvo upisujemo ime objekta, pa stavljamo taèku. Delphi je toliko razvijen d
a æe
automatski izbaciti listu osobina, pa se lako mo e izabrati Height (visina). Mala
i velika
slova nisu va na, tj Delphi ne pravi razliku, ali je kori tenje istih preporuèljivo ra
di lak eg
snala enja, ali i estetike.
PETLJE
Iako petlje nisu novost iz Delphija (postoje i u Pascalu), one su od velikog znaèa
ja u
programiranju. Petlja je skup naredbi koje se ponavljaju do ili za vrijeme ispun
jenja nekog
uslova. Postoje tri petlje: For, Repeat i While. Svaki kod ispisan kao primjer z
a neku od 3
petlje ne stoji sam, veæ kao dio neke procedure.
FOR petlja
For petlja je najpoznatija petlja, ali ne uvijek i najbolja. U ovoj petlji progr
amer defini e broj
ponavljanja i radnje koje se vr e za vrijeme tog ponavljanja.
Primjer, da se irina i visina mijenjaju za 10, i to 3 puta:
for i := 1 to 3 do
begin

Form1.Width := Form1.Width + 10;


Form1.Height := Form1.Height + 10;
end;

Dakle, ako se izvr ava vi e naredbi, koristi se begin..end blok.


REPEAT petlja
Repeat..until petlja se koristi ako broj ponavljanja nije apsolutan. To u praksi
znaèi da æe
se ne to ponavljati dok se odreðeni uslov ne ispuni.
Primjer, prozor ( Form1 ) mijenja irinu za 1 dok ona ne preðe vrijednost od 600.
repeat
Form1.Width := Form1.Width + 1;
until Form1.Widht = 600;
Lako se zakljuèuje da æe se radnja obaviti bar jednom. Èak i ako se vr i vi e radnji
begin..end blok nije potreban.
WHILE petlja
Kao i Repeat petlja i While se koristi ako broj ponavljanja nije apsolutan. Meðuti
m, razlika
je u tome to se ponavljanje vr i dok je uslov ispunjen.
Primjer, prozor ( Form1 ) poveæava irinu dok god je ona manja od 600.
while Form1.Width < 600 do
Form1.Width := Form1.Widht + 1;

105
Ovdje se radnja neæe izvr iti nijednom ukoliko je irina veæ veæa od 600. Ukoliko se vr i v
radnji
koristi se, kao i kod for petlje, begin..end blok.
PROCEDURE
Procedure su intelektualna osovina Delphija. Svaka radnja je, ustvari, jedna pro
cedura. Prvo,
upoznavanje sa jedinicom ( engl. Unit ). Prvi kontakt je svakako zbunjujuæi i jedi
nica djeluje krajnje
komplikovano. Meðutim, sve je potputno jasno. Zatamnjene rijeèi odvajaju cjeline i t
o malo
poja njava stvar.
A tu je i veza sa procedurama. Naime, u oèi odmah upadaju rijeèi private i public. I
znad private su
procedure definisane od strane samog Delphija. Na samom poèetku nema nijedne proce
dure.
Ispod private su procedure koje defini e sam programer. Mogu biti privatne i javne
. Privatne su
samo za taj prozor, a javne za sve prozore u tom projektu. Dakle, kad startamo D
elphi dobijamo
prazan Form i skoro prazan Unit.
Slika 3. Unit
Primjer: elimo da se poslije klika mi em na prozor, boja prozora promijeni u crvenu
.
1.Kliknimo jednom na Form.
2.Sa lijeve strane tu je Object Inspector koji sadr i dvije trake : Properties i E
vents. Biramo
Events.
3.Od mnogih moguænosti biramo onu OnClick. Dvoklikom na prazno desno polje pored
OnClick Delphi stvara procedure FormClick.
4.U jedinici se prikazuje sljedeæi tekst:
procedure TForm1.FormClick(Sender: TObject);
begin
end;
i u prazan prostor u begin..end bloku upisujemo:
Form1.Color := clRed;
Primjetimo da boje imaju prefiks cl.

Za pisanje privatnih procedura potrebno je definisati proceduru ispod rijeèi priva


te. Defini emo je
na sljedeæi naèin:
-ispisujemo rijeè procedure,
-ispisujemo ime procedure (npr. Bojenje),
-nakon imena mogu se u zagradi definisati neke varijable koje æe procedura koristi
ti, ali to nije
obavezno.
106
Zatim se ispod implementation pi e sama procedura. Prostor nije te ko naæi. Uostalom t
amo su
sve procedure, pa i one koje Delphi defini e.
Primjer: elimo definisati privatnu proceduru koja æe bojiti prozor u crveno, a zati
m i proceduru da
na klik mi em obojimo prozor
1.Kliknimo na Unit i izaberimo mjesto ispod rijeèi private. Tu upi imo:
procedure Bojenje;
2.Zatim ispod rijeèi
implementation
{$R *.DFM}
pi emo:
procedure TForm1.Bojenje;
begin

Form1.Color := clRed;
end;

3.Zatim ponovimo prva 3 koraka iz pro log primjera.


4.U prazan prostor begin..end bloka upisujemo
Bojenje;
Dakle proceduru defini emo i determini emo. Determini emo je kao privatnu, a defini emo
je u
implementaciji.
FUNKCIJE
Naime, ako opet pogledamo kako to izgleda jedan Unit, primjeæujemo rezervisanu
(podebljanu ) rijeè uses. Nakon nje slijedi spisak svih jedinica koje koristi na pr
ojekt. To su
posebne jedinice koje nemaju svoj prozor, veæ samo sadr avaju odreðene funkcije. Tako,
recimo,
Math unit sadr i mnoge matematièke funkcije, neke i vrlo va ne, kojih nema u Delphiju.
Uzmimo
primjer funkcije
Power(Base: Extended; Exponent: Extended): Extended.
Ova funkcija izraèunava xy. Recimo da elimo izraèunati 733 i tu vrijednost dodijeliti
promjenljivoj a,
pa pi emo: a := Power(7, 33);
Primjeæujemo da je kao baza uneseno 7, a kao eksponent 33. Meðutim, da smo htjeli sa
mi da
defini emo takvu funkciju morali bismo raditi sljedeæe:
1.Kliknimo na Unit i izaberimo mjesto ispod rijeèi private. Tu upi imo:
function Stepenovanje(Baza: Integer, Eksponent: Integer): Integer;
2.Zatim ispod rijeèi
implementation
{$R *.DFM}
pi emo:
function TForm1.Stepenovanje(Baza: Integer, Eksponent: Integer): Integer;
var

i, t: Integer;
begin
t := 1;
if i <> 0 then
for i := 1 to Eksponent do
t := t * Baza;
Stepenovanje := t;
end;

107
Dakle, funkcije se defini u tako to se nakon imena u zagradu upisuju promjenljive k
oje defini e
korisnik, a nakon zagrade tip koji funkcija vraæa. U gornjem primjeru to je Intege
r, najèe æi tip
brojevnih promjenljivih.
Ovako se pi e funkcija za jednokratnu upotrebu. Ali ako elimo da napi emo jednu ili v
i e funkcija
koje mo emo koristiti u svim projektima, defini emo funkcije kao public, a unit èuvamo
kao
poseban, bez prozora. U projektima u kojima elimo da upotrebimo taj unit, u gore
pominjanu listu
uses dodajemo i ime tog unita (ako je saèuvan pod imenom MyUnit, pi emo upravo MyUni
t). Isto
va i i za jedinice koje nisu veæ navedene (Delphi smatra samo odreðene jedinice za def
ault i kao
takve ih ispisuje automatski, ali onih koje ne spadaju u takve ima puno vi e. One
dolaze sa
Delphijem. Takve su recimo Math, Chart, Db...).
Oèigledno je da su funkcije veoma sliène procedurama. Ustvari, jedina razlika je to f
unkcije daju
neku povratnu vrijednost, a procedure samo obavljaju odreðene radnje, te se mo e reæi
da su
funkcije pro irene procedure.
JEDNA VRLO VA NA PROCEDURA:
FormIme.Show; (FormIme je ime prozora koji elimo otvoriti)
Ova procedura je specifièna po tome to se u jedinicu prozora iz kojeg elimo otvoriti
prozor treba
unijeti sljedeæi kod:
uses UnitIme; (UnitIme je ime jedinice prozora koji elimo otvoriti)
Meðutim, za razliku od gore pominjanih jedinica, ovaj kod se unosi, kao i procedur
e i funkcije,
izmeðu rezervisane rijeèi implementation i {$R *.DFM}.
7. DODACI ZA DELPHI
Delphi sa sobom donosi nekoliko vrlo korisnih dodataka. Zanimljiv je podatak da
je veæina ovih
programa kreirano u potpunosti u Delphiju to pokazuje njegovu uèinkovitost i moæ.
-Database Desktop -kao to i samo ime ka e, slu i za manipulisanje bazama podataka. U
njemu se mogu kreirati nove, ali i modifikovati stare baze. Database Desktop rad
i sa raznim
vrstama baza, a najva nija vrsta su tabele. Va no je reæi i da se tabele mogu saèuvati u
raznim
ekstenzijama (program je kompatibilan sa ostalim database programima).
108
Slika 4. Database Desktop
-Image Editor je, poput Paintbrush-a, program za dizajn i modifikovanje slika ti
pa bitmap, ali ima
i moguænosti kreiranja ikona i kursora.
Program nema veliki broj opcija, niti ima moguænost primjenjivanja nekih specijaln
ih efekata poput
nekih skupih editora slika, ali to mu i nije prvobitna namjena. Da bismo napravi
li sliku, ikonu ili
kursor, dovoljno je izabrati u opciji New (File meni) jednu od te tri opcije. Raèu
nar æe vas pitati za
velièinu i dalje je sve klasika.

Slika 5. Image Editor


109
-Help Workshop slu i za kreiranje Windows Help datoteke za na projekt. Proces se, n
a poèetku,
èini komplikovan, ali to uop te nije tako.

Slika 6. Help Workshop


-InstallShield je program koji omoguæava kreiranje setup aplikacije za va e projekte
. Vrlo je
jednostavan za kori tenje. Samo izaberemo New project i 'Wizard' æe nas voditi kroz
proces.

Slika 7. InstallShield

110
PREDNOSTI
Delphi je visoko razvijeni program namijenjen mnogim korisnicima jer se lako upo
trebljava i
bazira se na raniji Object Pascal jezik. Iako je Pascal napravljen iskljuèivo za p
otrebe edukacije,
Delphi nije.
Iako Delphi koristi programski jezik visoke kvalitete, a takoðer podr ava i mali niv
o programiranja,
omoguæavajuæi asemblerske dijelove i sistem znakova direktnih CPU kodova.
Metarazred je prvi razred instrukcija ili objekata. Objekti se u stvari odnose n
a objekte (kao u Java
programu) koji Delphi implicitno razvrstava tako da èesto nema potrebe da se ruèno o
dredi
memorija za pokazatelje na objekte ili sliène tehnike koje se èesto koriste u drugim
programskim
jezicima. Postoje reference namijenjene za numerisane vrste (tipove) u nizu (kao
i niz za poèetak i
zavr etak, null-poèetak, terminate-kraj)
Nizovi mogu biti uvezani u lanace koristeæi + znak, radije nego koristeæi funkcije. Za
one koji vi e
vole nizove i vrste nizova, nije potrebno imati memoriju niti menad era memorije.
Menad er
memorije koju je uveo Borland Developer Studio 2006 je pobolj an u mjeri da sada i
ma funkcije za
praæenje memorijskih pukotina.
Programski jezik je prilagoðen Rapid Application Development (RAD) i ima integrisa
n IDE
(Integrated Development Environment) . Svi Delphi proizvodi imaju veliku bibliot
eku koja se zove
VCL (Visual Component Library) i ukljuèuje veæinu njihovih izvornih kodova.
Komponenete treæih strana (obièno imaju sve izvorne kodove) se mogu kupiti na tr i tu ka
o i alati
za pobolj anje IDE ili za druge relevantne razvojne zadatke Delphi-ja. IDE ukljuèuje
GUI za
lokalizaciju i prevoðenje kreiranih programa koji se mogu drugaèije rasporediti tako
da nema
dodatnih tro kova za prevoðenje (neki programeri ele da koriste proizvode od treæe stra
ne radi
toga jer time dobivaju veæu funkcionalnost). Okosnica ili okvir VCL-a odr ava visoki
nivo
kompatibilnosti izvornih kodova u razlièitim verzijama to znaèi da programer mo e da na
dogradi
veæ postojeæi izvorni kod u noviju Delphi verziju, u veæini sluèajeva. Biblioteke od treæe
strane
trebaju nadogradnju od strane prodavaèa ili ako veæ imaju izvorni kod, onda jednostv
ano trebaju
da ponovo prikupe podatke iz nove verzije. VCL je rano usvojio Dependency inject
ion ili Inversion
of Control. VCL je sofisticirani sastavni model koji se mo e iznova koristiti i iri
ti od strane
razvojnog programera.
Koristeæi razredne pomoænike (class helpers) mo e se uvrstiti nova funkcija u jezgro R
TL i VCL
razrede bez mijenjanja originalnog izvornog koda RTL-a i VCL-a.
Brz program -prevodilac mo e uraditi prevod i do jedne, finalne izvr ne radnje, to
pojednostavljuje distribuciju, te elimini e DLL verzijske probleme. Kreiranje DLL
i ActiveX DLLs ili
COM Automation servers je takoðe moguæe, te razvojni programeri mogu da kreiraju Win
dows
koristeæi Delphi program.
Delphi IDE, Delphi 2005 podr ava unaprijeðene oblike kao to je Method Extraction itd.
I imaju
moguænosti kreiranja UML metoda od izvornog koda ili modificiranje izvornog koda,
kroz promjene
samog modela. Delphi ima veliku grupu podr ke na Usenet i web (e.g. ) koji poma u u
rje avanju
problema za programere / individualce.
MANE
Nema izvorne 64-bit podr ke
Delphi kreira samo izvorne 32-bit aplikacije. Nije moguæe napisati 64-bit Windows
aplikacije,
koje su potrebne u kori tenju memorije vi e od 4 GB. Takoðer, ne mogu se napisati plug
-ins
(ukopèati plug in) u 64-bit aplikacije i usluge za treæa lica kao npr. Windows Explo
rer. Podr ka
111
aplikacijama u 64-bit mo e se naæi na Delphi mapama veæ nekoliko godina, ali se jo uvij
ek ne
praktikuje redovno. Sada nja mapa prikazuje Commodore project, to pru a podr ku 64-bit,
ali
datum objavljivanja jo uvijek nije odreðen.
Platforma nije unakrsna
Delphi nije unakrsna platforma. Posljednji izdati Delphi program sadr i Delphi Pri
sm koji se
mo e koristiti za razvijanje NET aplikacija. Unakrsna platforma, sa kod imenom Pro
ject X, je
prikazana na zadnjoj mapi. Takoðer, Lazarus (besplatni Delphi Clone) veæ sadr i najèe æe
kori tene VCL komponente Delphi-jeve unakrsne platforme izmeðu Linux, Mac OS i Windo
ws.
Kompatibilnost sa prija njim modelima
Svako novo izdanje Delphi-ja eli oèuvati kompatibilnost sa prija njim modelima, i to
u to
veæoj mjeri. Ovo omoguæava korisnicima da prikupljaju bogatstvo kodova bez brige oko
bilo kojih
prekinutih interfejsa ili funkcionalnosti. Meðutim, neki razvojni programeri misle
da ova pa nja
usmjerena na kompatibilnost sa prija njim modelima usporava razvoj i revoluciju De
lphi jezika, te
dovodi do starijeg dizajna u standardnim razrednim bibliotekama (VCL/RTL).
Na prvi pogled, Delphi se èini jako komplikovan, meðutim, ubrzo se shvata da je on
izuzetno jasan i matematièki definisan. Naime, i najte i izazovi su ustvari samo skl
apanje
jednostavnih radnji u jednu.
Delphi je vrlo moæan alat. Svaka akcija u Windows-u se mo e napraviti u Delphiju, ta
ko da
se jedan cijeli operativni sistem mo e napraviti u Delphiju. Zapravo, sam Delphi j
e
napravljen u Delphiju.
Takoðer je i kompletan alat. Naime, moguæe je manipulisati bazama podataka, SQL-om,
HTML-om, game driverima i slièno.
Njegova najznaèajnija osobina je kompatibilnost. Sam programer mo e kreirati nove
komponente i tako prilagoditi Delphi samom sebi.
C#
C#[1] (engl. C sharp, izgovor:/se shärp/) je jedan od mlaðih programskih jezika. Nas
tao je
2002. godine kao sastavni deo MS .NET Framework 1.0. C# je objektno orijentisan
programski jezik kao i veæina modernih vi ih programskih jezika (C++, Java itd). Jez
ik je
op te primene i namenjen je izradi aplikacija za .NET Framework platformu.
NET (èitaj: dot net) je naziv za najnoviju Microsoftovu viziju buduænosti raèunalstva
u kojoj
se aplikacije izvr avaju distribuirano putem Interneta. Da bi to ostvarili, bilo j
e potrebno
ispuniti neke uvjete.
Kao prvo, distribuirano raèunalstvo je konceptualno poput objektno orijentiranog
programiranja, to se najbolje vidi u sposobnosti da programski kod za odreðenu oper
aciju
smje tava u jedan blok, umjesto da ga se prepisuje gdje god je to potrebno. Upravo
prelazak na distribuirani model donio je toliko potrebnu efikasnost u razvoju ap
likacija.
Drugo, smje tanjem specijaliziranog koda na jedno mjesto i otvaranjem javno dostup
nog
suèelja, razlièiti su ureðaji (telefoni, dlanovnici, stolna raèunala itd.) podr ani istim
programskim kodom. Odavde vuèe korijene Microsoftova «pokreæi svagdje» filozofija.
I kao treæe, kontrolom pristupa u realnom vremenu distribuiranim resursima, tvrtke
poput
Microsofta dobivaju moguænost bolje kontrole izvr avanja aplikacija. Na taj naèin apli
kacije
112
prelaze iz razmi ljanja «posjedujem objekt» u razmi ljanje «podr avam servis». Zanimljivo
je da je Microsoft prelaskom na .NET odustao od strogog patentiranja svojeg vlas
ni tva
(sve tehnologije koje zahvati nastoji prilagoditi Windows operativnom sustavu).
Kako
buduænost vidi u pru anju softverskih servisa putem distribuiranih aplikacija, .NET
Framework je napravljen tako da aplikacije na drugim platformama mogu pristupiti
tim
servisima. Na primjer, .NET je izgraðen na standardiziranim tehnologijama poput XM
L-a i
SOAP-a.
U aspektu razvoja aplikacija, .NET se oslanja na .NET Framework. .NET Framework
se
sastoji od Common Language Runtime, .NET Framework standardne biblioteke klasa i
specijaliziranih klasa poput onih koje podr avaju ASP.NET (sljedeæa generacija ASP
serverske tehnologije) te Windows Forms (za razvoj klasiènih desktop aplikacija).
Common Language Runtime (CLR) upravlja izvr avanjem koda kompiliranog za .NET
platformu. CLR ima dvije zanimljive moguænosti. Prva je ta da mu je specifikacija
otvorena
to omoguæuje portiranje na newindows operativne sustave. Drugo, za pisanje aplikaci
ja
koje koriste standardne klase mo e se koristiti bilo koji programski jezik kojeg p
odr ava
CLR.
Jedan od jezika koji se savr eno uklapa u .NET Framework jest C#. Taj novi jezik,
nasljednik C++, objavljen je zajedno s .NET Frameworkom, te je zato logièno da bud
e
primarni programski jezik za pisanje .NET aplikacija.C# i Java su jezici najnovi
je
generacije èiji su izravni prethodnici C++ i C. Svaki od njih sadr i napredna svojst
va poput
Garbage Collection (skupljanje smeæa) èime se smanjuje potreba za intervencijama
izravno u programskom kodu. Navedeni jezici su sintaktièki gotovo isti.
C# i Java izvorne datoteke kompiliraju se u prijelazni jezik: C# u Microsoft Int
ermediate
Language (MSIL), a Java u Java bytecode. U svakom od ovih sluèajeva prijelazni jez
ik se
mo e izvoditi; bilo interpreterom, bilo just-in-time kompilacijom na odgovarajuæem
virtualnom stroju. Valja naglasiti da je u C# dodatna pozornost posveæena kompilac
iji
prijelaznog jezika u binarni kod.
C# podr ava primitivnije tipove podataka od onih u Javi (poglavlje 4), a omoguæuje i
stvaranje vlastitih tipova podataka. Na primjer, C# podr ava pobrojenja (enumerati
ons),
tipski sigurni vrijednosni tipovi podataka koji mogu sadr avati samo konstante, te
strukture
koje su korisnièki definirani tipovi podataka. (poglavlje 11). (Java ne podr ava pob
rojenja
ali ih mo e simulirati).
Za razliku od Jave, C# ima moguænost preoptereæivanja razlièitih operatora. Poput Jave
,
C# ne koristi nasljeðivanje vi e klasa u korist nasljeðivanja jedne klase to je pro ireno
nasljeðivanjem vi e suèelja. Polimorfizam je podr an pomoæu nasljeðenih metoda te
preoptereæenja ili skrivanja metoda bazne klase. C# koristi delegate. To su tipski
sigurni
pokazivaèi na metode, a osnovna ima je namjena implementacija upravljanja dogaðajima
.
U Javi su vi edimenzionalna polja implementirana preko jednodimenzionalnih (polja
mogu
biti èlanovi drugih polja). C# pak podr ava i takva (zupèasta), ali i pravokutna polja
.
Za detaljniju usporedbu C# i Java-e kliknite.
Komparativan pregled C#-a
Microsoft .NET vs. J2EE.

113
[b]C# vs. C++[/b]
Iako posjeduje neke elemente nasljeðene od Visual Basica i Jave, najbli i roðak C#-a j
e
C++.
Najva nija razlika izmeðu ta dva jezika je to to C# ne sadr i poziv datoteke zaglavlja,
to
znaèi da je sav kod «umetnut» u datoteku.
Kao to smo veæ spomenuli, .NET izvr ni sustav u kojem se izvodi C# kod upravlja
memorijom te preuzima brigu o zadaæama poput skupljanja smeæa (Garbage Collection).
Zbog toga je potreba za pokazivaèima u C#-u puno manja nego u C++. Pokazivaèi se
mogu dodu e koristiti i u C#-u, ali samo u pisanju nesigurnog koda. Preporuèa ih se
ondje
gdje su karakteristike performansi od krucijalne va nosti.
Razumijevanje tipova podataka u C# je znatno kompleksnije od razumijevanja C++ t
ipova
podataka. Svi tipovi podataka u C#-u izvedeni su iz 'object' tipa. Takoðer postoje
i razlike u
naèinu kako se odreðeni tipovi podataka mogu koristiti. Polja u C#-u su limitirana t
e stoga
nije moguæe dodavati elemente nakon to je polje popunjeno.
C# naredbe vrlo su sliène C++ naredbama. Spomenut æu samo jednu razliku: naredba
switch je promijenjena tako da je zabranjeno nastavljanje sluèaja.
Kao to je veæ spomenuto, C# ne koristi nasljeðivanje vi e klasa. Ostale razlike kod
upotreba klasa su: dodana je podr ka svojstvima klasa to je preuzeto iz Visual Basi
ca, a
metode se pozivaju pomoæu operatora . (toèka) umjesto operatora :: (dvije dvotoèke).
Primjer programa u C#
using System.IO;

public static byte[] ReadFile(string filePath)


{
byte[] buffer;
FileStream fileStream = new FileStream(filePath, FileMode.Open,

FileAccess.Read);

try

int length = (int)fileStream.Length; // get file length

buffer = new byte[length]; // create buffer


int count; // actual number of bytes read

int sum = 0; // total number of bytes read

// read until Read method returns 0 (end of the stream has been reached)

while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)

sum += count; // sum is a buffer offset for next reading

finally

fileStream.Close();

return buffer;
}

114
Python
Pajton (engl. Python) je programski jezik visokog nivoa op te namjene. Podr ava, u
prvom redu imperativni, objektno-orijentisan i funkcionalni stil programiranja.
Sintaksa
jezika Pajton omoguæava pisanje veoma preglednih programa. Jezik se brzo i lako
uèi.Programi pisani u Pajton jeziku se najèe æe interpretiraju. Uz interpretator se obièno
isporuèuje i veoma razvijena standardna biblioteka modula.

Autor ovog jezika je Gvido van Rosum sa Univerziteta Stièing u Holandiji.


Ime programskog jezika asocira na zmiju piton ali, po rijeèima autora, inspiraciju
za ime je
dobio vezano za Leteæeg cirkusa Montija Pajtona (engl. Monty Python's Flying Circus)
,
BBC-evu seriju komedija aktuelnu sedamdesetih godina.

Programski jezik Pajton nastao je poèetkom devedesetih godina pro log vijeka. Njegov
autor je Gvido van Rosum. On je u vreme nastanka jezika bio zaposlen u Stiching
Mathematish Centrum (CWI) u Holandiji. Znaèajan uticaj na koncept ovog jezika, po
reèima autora, imao je autorov rad na kreiranju programskog jezika ABC.

Programski jezik Pajton postepeno stièe veliku popularnost. U izgradnju jezika i o


noga to
ga okru uje ukljuèuje se veliki broj ljudi, iako Gvido ostaje njegov glavni autor. S
va
autorska prava za ovaj programski jezik dr i neprofitna organizacija Python Softwa
re
Foundation (PSF).

Svako mo e da koristi programski jezik Pajton besplatno bilo u komercijalne ili u


druge
svrhe. Takoðe, svako mo e da postane donator Python Software Foundation u novcu, ili
svojim doprinosom u izgradnji jezika ili u srodnim oblastima.
Njihov oficijalni sajt je www.python.org.

2. Razvoj programa
2.1. Interpretatori i prevodioci
Programski jezik Pajton se uglavnom interpretira. Interpretatori i standardne bi
blioteke
modula se stalno razvijaju i prenose na veliki broj razlièitih platformi. Glavne p
odr ane
platforme su Linuks, BSD, Mac OS X, Majkrosoft Vindouz i Java. Slijedi spisak dr
ugih
platfomi koje podr avaju Pajton: AIX operating system, Amiga, AROS, AS/400, BeOS,
BSD, FreeBSD, Mac OS 9, NetBSD, OpenBSD, OS/2, OS/390, Palm OS, Plan 9,
PlayStation 2, Psion, QNX, RISC OS (ranije Acorn), Sharp Zaurus, SPAR Solaris,
Symbian OS, VMS, VxWorks, Windows CE/Pocket PC, Xbox, z/OS ...
Postoje i pravi prevodioci, koji Pajton kod prevode u ma inski jezik. Oni omoguæavaj
u da
se stvore izvr ni moduli nezavisni od interpretatora, te da se programi izvr avaju (
malo)
br e. Ono to se gubi ovakvim prevoðenjem je prenosivost ovako prevedenog programa
na razlièite hardverske i softverske platforme.
115
2.2. Standardne biblioteke modula
Za programski jezik Pajton razvijen je veliki broj standardnih modula koji omoguæa
vaju
efikasan rad u mnogim oblastima. Veæina ovih modula prenosiva je na razlièite platfo
rme
to omoguæava da èesto kompletni programi bez prilagoðavanja rade na razlièitim
ma inama i pod razlièitim operativnim sistemima.
Standardna biblioteka modula omoguæava pisanje programa vezanih za Internet
podr avajuæi veliki broj standardnih formata i protokola. Postoje moduli za kreiranj
e
grafièkog korisnièkog interfejsa, vezu ka relacionim bazama podataka, za aritmetiku
sa
proizvoljnim eljenim brojem decimala, za rad na leksièkoj analizi primenom regularn
ih
izraza, kao i standardni moduli za mnoge druge poslove.
2.3. Razvoj novih modula
Ukoliko je potrebno razviti novi modul, to je moguæe izvesti u Pajtonu ili u nekom
drugom
podr anom jeziku. Obièno je to C jezik, kada je potrebno sistemsko programiranje ili
kada
je brzina izvr avanja kritièna. Ali to mo e da bude na primer i Java ili Pyrex jezik k
oji
predstavlja me avinu programskog jezika Pajton i C jezika.
3. Organizacija podataka
3.1. Predstavljanje podataka
Podaci u programskom jeziku Pajton su predstavljeni objektima (engl. objects). S
vaki
podatak je predstavljen objektom ili relacijom meðu objektima. Sam kod programa je
zika
Pajton je takoðe predstavljen objektima.
3.2. Promjenljive i tip podataka
Tip podatka u programskom jeziku Pajton nije vezan za promjenljivu. Svakoj promj
enljivoj
tokom izvr avanja programa mo e da bude dodjeljena vrijednost bilo kog tipa kao i da
ta
vrednost bude zamjenjena drugom razlièitog tipa.
Tip podatka vezan je za vrijednost koju sadr i promenljiva. Sve vrijedosti promjen
ljivih su
objekti.
116
4. Objekti
Svaki objekat sadr i tip objekta i njegovu vrijednost. Jednom kreirani objekat ne
mo e da
mijenja tip, dok vrijednost nekih objekata mo e da bude promijenjena. Promjenljivo
st
objekata odreðena je njihovim tipom. Postoje:
-nepromjenljivi (engl. immutable) objekti
na primjer: brojevi, niske (engl. strings) i n-torke
-promjenljivi (engl. mutable) objekti
na primjer: rijeènici i liste
4.1. Objekti ugraðeni u jezik
Pajton posjeduje jedan broj tipova objekata koji su ugraðeni u jezik. Jezik mo e da
se
pro iri dodatnim tipovima preko modula.
Sljedeæi spisak sadr i neke od tipova objekata koji su ugraðeni u programski jezik Paj
ton:
. Brojevi (engl. Numbers)
Ovi objekti bivaju kreirani iz numerièkih leksema u izvornom programu, ili kao rez
ulat
aritmetièkih operatora ili funkcija. Jednom kreirani, ne mijenjaju vrijednost.
Postoje tri vrste brojeva. To su cijeli brojevi, brojevi sa pokretnim zarezom i
kompleksni
brojevi:
. . Cijeli brojevi (engl. Integers)
Predstavljaju elemente matematièkog skupa celih brojeva.
Postoje tri tipa cijelih brojeva:

1. Obièni cijeli brojevi (engl. Plain integers)


Cijeli brojevi u rasponu od -2147483648 do 2147483647, ili irem.
2. Dugi cijeli brojevi (engl. Long integers)
Cijeli brojevi u neogranièenom rasponu koji je jedino limitiran kolièinom raspolo ive
virtuelne memorije.
3. Bulov tip (engl. Booleans)
Bulov tip sadr i samo dvije vrijednosti koje predstavljaju istinosne vrijednosti t
aèno i
netaèno. U veæini situacija one se pona aju kao cijeli brojevi 0 i 1, osim kod konverz
ije u
niske kada se dobijaju vrijednosti "False" i "True".
.. Brojevi sa pokretnim zarezom (engl. Floating point numbers)
Na ma inskom nivou predstavljeni su brojevima sa pokretnim zarezom u dvostrukoj
taènosti.

.. Kompleksni brojevi (engl. Complex numbers)


Na ma inskom nivou predstavljeni su parom brojeva u obliku sa pokretnim zarezom u
dvostrukoj taènosti.

. Nizovi (engl. Sequences)


Oni predstavljaju konaène ureðene skupove èiji su indeksi nenegativni cijeli brojevi.
Mogu
da se podjele na nepromjenljive i promjenljive nizove:
.. Nepromenljivi nizovi (engl. Immutable sequences)
Objekat koji po tipu spada u nepromjenljive nizove ne mo e da bude izmjenjen nakon
117
njegovog kreiranja (ali nepromjenljivost ne va i za eventualne izmjenljive objekte
èije
reference sadr i nepromjenjivi niz).
Sljedeæi tipovi spadaju u nepromjenljive nizove:

-Niske (engl. Strings)


Elementi niske su znakovi. Ne postoji poseban znakovni tip podataka. Pojedinaèni z
nak je
predstavljen nizom od jednog znaka. Niske mogu da se koriste i kao nizovi bajtov
a i da se
iskoriste, na primjer, da bi sadr ali podatke uèitane iz datoteke.
-Unikod (engl. Unicode)
Elementi ovakvog niza su unikod kodovi.
-n-torke (engl. Tuples)
Elementi n-torki su proizvoljni Pajton objekti. Sintaksno gledano n-torke se for
miraju iz liste
izraza meðusobno razdvojenih zarezom.
.. Promenljivi nizovi (engl. Mutable sequences)
Po kreiranju omoguæavaju izmjenjivanje:
-Liste (engl. Lists)
Sadr e kao elemente proizvoljne Pajton objekte. Sintaksno gledano dobijaju se
upisivanjem liste izraza razdvojenih zarezom u uglaste zagrade.
. Preslikavanja (engl. Mappings)
Predstavljaju konaèan skup objekata indeksiran proizvoljnim skupom indeksa:
.. Rijeènici (engl. Dictionaries)
To su konaèni skupovi objekata indeksirani vrijednostima gotovo bilo kog tipa. Jed
ini tipovi
objekata koji nisu prihvatljivi kao indeksi su objekti tipa listi ili rijeènika il
i drugi promjenljivi
tipovi.

. Izvr ivi tipovi (engl. Callable types)


Ovo su objekti na koje mo e da se primjeni poziv (izvr enje) funkcije:
.. Funkcije koje defini u korisnici (engl. User-defined functions)
Za svaku definisanu funkciju, u trenutku izvr avanja programa, kreira se jedan ova
kav
objekat. On se poziva (izvr ava) uz listu parametara koja treba da sadr i isti broj
parametara kao i lista formalnih parametara definicije funkcije.

.. Metode koje defini u korisnici (engl. User-defined methods)


Ovakvi objekti povezuju klasu, primerak klase i bilo koji izvr ivi tip (obièno funkc
iju koju
defini u korisnici).

5. Opis jezika
Osnovna svojstva jezika opisana su kroz niz jednostavnih primjera. Veæina primjera
napisana je kao da se izvr avaju u interaktivnom modu interpretatora. Oznake ">>>"
i "..."
na poèetku linije oznaèavaju ono to je korisnik upisao, dok je odgovor interpretatora

118
napisan bez ovih uvodnih znakova.
. Cijeli brojevi
Primjeri rada sa cijelim brojevima:
>>> 2 + 3
5
>>> 4 + 8 # Komentar pocinje iza znaka "#" i zavrsava se na kraju linije
12
>>> 3*2 # Mnozenje
6
>>> 4 + 3*5 # Koristi se u matematici uobicajeni redosled racunanja
19
>>> 5*(4 + 3*(2 + 1)) # Grupisanje operanada se vrsi jedino malim (oblim)
zagradama
65
>>> 6/2 # Celobrojno deljenje
3
>>> 7/2 # Ostatak pri celobrojnom deljenju se zanemaruje (u rezultatu)
3

U radu sa cijelim brojevima uvek se dobija taèan rezultat. Ovo omoguæuje prelazak (p
o
potrebi) na brojeve proizvoljne du ine:
>>> 2**1024 # 2 na stepen 1024

. Brojevi u obliku sa pokretnim zarezom


Kompletno je podr an rad sa brojevima sa pokretnim zarezom. Sintaksno, oni se razl
ikuju
od cijelih brojeva po prisustvu decimalne taèke ili eventualno eksponencijalne not
acije.
Ukoliko oprerator ima kao operande cijele i brojeve u pokretnom zarezu, vr i se ko
nverzija
svih operanada u oblik sa pokretnim zarezom.
>>> 7.0/2

3.5
>>> 1e1/4 # Deset (jedan puta deset na prvi stepen) podeljeno na cetiri dela
2.5
>>> 5*3.25/2.5
6.5
. Kompleksni brojevi
Podr ani su i kompleksni brojevi. Imaginarni dio kompleksnog broja se oznaèava sufik
som
"j" ili "J". Kompleksni brojevi èiji je realni deo razlièit od nule pi u se u oblim za
gradama.
>>> (5+4j) - (3+1j)
(2+3j)
>>> (3+5j) + (0+2j)
(3+7j)
>>> (3+5j) + 2j
(3+7j)
>>> 1j * 1j
(-1+0j)
>>> (2+3j) * 3
(6+9j)

119
>>> 2 + 3j*3
(2+9j)
>>> (4+9.5j) / (1.5+2j)
(4+1j)

. Dodjeljivanje vrijednosti
Znak "=" koristi se kod dodeljivanja vrednosti promenljivim:
>>> cijena = 3.50
>>> brojKomada = 4
>>> cijena * brojKomada

14.0

Podr ano je vi estruko dodjeljivanje vrijednosti:

>>> x = y = z = 17
>>> x
17
>>> y
17
>>> z
17

. Niske
Rad sa niskama (engl. Strings) je sna no podr an u Pajtonu. Niske sadr e nizove znakov
a
i nisu izmenljive.
Evo nekoliko naèina da se kreira niska:
>>> 'Ovo je niska'
'Ovo je niska'
>>> "Mogu da se koriste i dvostruki navodnici"
'Mogu da se koriste i dvostruki navodnici'
>>> niska = 'Mujo je rekao "Ja volim da programiram".'
>>> print niska
Mujo je rekao "Ja volim da programiram".

Niske mogu da se pove u upotrebom operatora "+" i da se ponove


vi e puta pomoæu operatora "*":

>>> 'Ja' + 'Mislim'


'JaMislim'
>>> 'Ja' + 3*' mislim,' + '...'
'Ja mislim, mislim, mislim,...'

Djelovima niske mo e da se pristupi putem indeksa. Poèetni indeks je nula.


>>> rijec = "prestolonaslednica"
>>> rijec[0]
'p'
>>> len(rijec)
18
# Vraca duzinu objekta
>>> rijec[17]
'a'
# Vraca poslednji znak ove niske u obliku niske duzine jedan
>>> rijec[3:6]
'sto'
# Deo niske od pozicije 3 do, ali ne ukljucujuci, pozicije 6
>>> rijec[:6] # Prvih sest znakova
120
'presto'
>>> rijec[8:] # Sve osim prvih osam znakova
'naslednica'

Podr ane su i niske koje sadr e unikodni skup znakova.


. Liste
Liste omoguæavaju da se vi e objekata istog ili razlièitog tipa pove u u jednu cjelinu.
Predstavljaju se kao spisak objekata razdvojenih zarezom u uglastim zagradama.
>>> lista = ['Prvi', 'Drugi', 23, 119]
>>> lista
['Prvi', 'Drugi', 23, 119]

Djelovima lista mo e da se pristupa, slièno kao i niskama, putem indeksa:


>>> lista[0]
'Prvi'
>>> lista[3]
119
>>> lista[1:3]
['Drugi', 23]
>>> lista[1:]
['Drugi', 23, 119]
>>> lista[:1]
['Prvi']
>>> lista[2:]
[23, 119]
>>> lista[:2]
['Prvi', 'Drugi']

Liste kao i niske mogu da se povezuju i multiplikuju :


>>> 3*lista[:2] + ['Treci', 2*2]
['Prvi', 'Drugi', 'Prvi', 'Drugi', 'Prvi', 'Drugi', 'Treci', 4]

Za razliku od niski, liste su promenljive:


>>> lista
['Prvi', 'Drugi', 23, 119]
>>> lista[2] = 0
>>> lista
['Prvi', 'Drugi', 0, 119]
>>> lista.append('Kraj')
>>> lista
['Prvi', 'Drugi', 0, 119, 'Kraj']
>>> lista[2:4] = []
>>> lista
['Prvi', 'Drugi', 'Kraj']
>>> lista[2:2] = ['Treci', 'Cetvrti']
>>> lista
['Prvi', 'Drugi', 'Treci', 'Cetvrti', 'Kraj']

Liste mogu da sadr e kao svoje elemente druge liste:


>>> b = [3, 4]
>>> a = [1, 2, b, 6]
>>> a

121
[1, 2, [3, 4], 6]
>>> a[2]
[3, 4]
>>> a[2][1]

>>> a[2].append(5)
>>> a
[1, 2, [3, 4, 5], 6]
>>> b
[3, 4, 5]

. Skupovi
Skupovi su okupljajuæi tip podataka u kome nije definisan redoslijed elemenata i n
e postoje
duplikati. Obièno se koriste za ispitivanje pripadnosti nekog elementa skupu kao i
za
eliminisanje duplikata. Implementirane su i matematièke operacije kao to su unija,
presjek, razlika i simetrièna razlika skupova.
>>> terarij = ['sarka', 'poskok', 'sarka', 'sarka', 'poskok']
>>> otrovnice = set(terarij) # Formiram skup eliminisuci duplikate
>>> otrovnice
set(['poskok', 'sarka'])
>>> 'poskok' in otrovnice
True
>>> 'belouska' in otrovnice
False

Skupovne operacije:
>>> A = set([1, 2, 3, 4])
>>> B = set([3, 4, 5])
>>> A | B # Unija
set([1, 2, 3, 4, 5])
>>> A & B # Presjek
set([3, 4])
>>> A - B # A razlika B
set([1, 2])
>>> A ^ B # Simetricna razlika
set([1, 2, 5])

6. Kontrolne strukture
6.1. IF iskaz
U najjednostavnijem obliku if iskaza izraèunava se izraz koji mora da rezultira je
dnom
Bulovom vrijedno æu (True ili False). Ako je izraèunata vrijednost True izrv iæe se blok
iskaza iza dvotaèke.
122
Blok iskaza koji pripada if iskazu oznaèava se pisanjem ispod i uvlaèenjem u odnosu
na
rezervisanu reè if udesno. Ovo oznaèavanje bloka iskaza uvlaèenjem koristi se kod svih
kontrolnih struktura.
>>> b = 'Popokatepetl'
>>> if b != 'Popokatepetl':
... print 'Hocu u Meksiko!'
... print 'Drugi red bloka naredbi'
... print 'treci red koji se takoðe izvrsava ako je uslov tacan'

Postoji forma if iskaza koja sadr i else deo. Blok naredbi koji odgovara else reze
rvisanoj
reèi izvr ava se jedino ako je uslov rezultirao False vredno æu.
>>> a = 12
>>> if a < 0:
... print 'a je negativno'
... else:
... print 'a je nenegativno'

a je nenegativno

Ako elimo da izvr imo detaljnije ispitivanje neke vrednosti mo emo da upotrebimo iska
z
koji sadr i rezervisanu reè elif. Iza ove reèi nalazi se uslov koji se testira i odgov
arajuæi
blok naredbi koji se izvr ava ako je uslov zadovoljen.
>>> if a < 0:
... print 'a ima negativnu vrednost'
... elif a == 0:
... print 'a sadrzi nulu'
... elif a == 12:
... print 'a sadrzi broj dvanaest'
... else:
... print 'nesto cetvrto'

a sadrzi broj dvanaest

Programski jezik Pajton ne sadr i kontrolnu strukturu switch-case. Umjesto nje se


koristi
iskaz if ... elif ... elif ... else. elif blok mo e da se ponovi proizvoljan broj
puta.
6.2. FOR iskaz
For iskaz Pajton jezika se djelimièno razlikuje od istoimene kontrolne strukture u
paskalskim jezicima. Ovaj iskaz se koristi za prolaz kroz jedan niz vrijednosti,
na primjer
listu ili nisku. Pridru eni blok naredbi izvr ava se jedanput za svaki element niza.
>>> drugari = ['Pera', 'Mika', 'Cokula']
>>> for clan in drugari:
... print 'drug', clan

123
drug Pera
drug Mika
drug Cokula

Za generisanje nizova brojeva mo e da poslu i Pajtonova range() funkcija. Ona vraæa li


stu
brojeva koja predstavlja aritmetièku progresiju izmeðu dva broja.
>>> range(12)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> range(5, 15)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> range(1, 20, 2) # Svi brojevi od 1 do 19 korak 2
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

6.3. WHILE iskaz


Blok naredbi se izvr ava sve dok je kontrolni izraz taèan (True).
Izraèunavam 5! odnosno proizvod brojeva od 1 do 5:
>>> fakt = 1
>>> i = 5
>>> while i != 0:
... fakt = fakt*i
... i -= 1

>>> fakt
120

7. Funkcije
Definicija funkcije poèinje rezervisanom reèi def iza koje u zagradama slijedi lista
formalnih
parametara. Sve promjenljive navedene u definiciji funkcije su lokalne, osim ako
se
direktno ne navede drugaèije (upotrebom iskaza global). Funkcija vraæa vrijednost po
moæu
iskaza return. Ukoliko takav ne postoji radi se o proceduri.
Slijedi definicija funkcije koja za dati prirodni broj izraèunava njegov faktorije
l:
>>> def fakt(n):
... rezultat = 1
... for i in range(1, n + 1):
... rezultat *= i
... return rezultat

>>> fakt(5)
120
>>> fakt(50)
30414093201713378043612608166064768844377641568960512000000000000L

Podr ane su rekurzivne definicije funkcija.


124
Funkcija koja vraæa faktorijel datog broja definisana je na rekurzivan naèin u skupu
nenegativnih cijelih brojeva:
>>> def f(n):

... if n == 0:
... return 1
... else:
... return n*f(n - 1)
>>> f(5)
120
>>> f(50)
30414093201713378043612608166064768844377641568960512000000000000L

8. Moduli
Ako interpretator stane sa radom sve definicije koje su kreirane u interaktivnom
modu biæe
izgubljene. Da bi ih saèuvali mo emo na e definicije funkcija i promjenljivih da smjes
timo u
jednu ili vi e datoteka. Za to mo emo da upotrebimo tekst editor. Takve datoteke se
zovu
moduli.
Potom definicije iz tako kreiranih modula mo emo da uve emo i koristimo bilo u
interaktivnom modu ili u nekom drugom modulu. Kreiranje du ih programa sastoji se
obièno iz pisanja modula koji mogu da budu grupisani u pakete (packages).
Evo jednog jednostavnog modula koji kreiram kao datoteku u trenutnom direktoriju
mu sa
nazivom mm.py koja sadr i sledeæi tekst:
nula = 0
jedan = 1

def uvecaj(x, korak = 1):


return x + korak

def umanji(x, korak = 1):


return x - korak

Sada mogu da uvezem ovaj modul u interaktivnom modu:


>>> import mm

Poslije uvoza koristim definicije na sljedeæi naèin:


>>> mm.jedan
1
>>> mm.nula
0
>>> mm.uvecaj(10)
11
>>> mm.umanji(mm.nula)
-1
>>> mm.uvecaj(10, 5)
15

Moguæ je i direktan uvoz pojedinih imena definicija, ili svih imena odjednom kao u
sljedeæem primjeru:
125
>>> from mm import *
>>> umanji(34, 7)
27
>>> uvecaj(nula)
1

8.1. Standardni moduli


Standardni moduli u velikoj mjeri pro iruju moguænosti jezika.
Kao primjer uvozim standardni matematièki modul. Funkcija dir() vraæa listu svih ime
na
definisanih u modulu.
>>> import math
>>> dir(math)
['__doc__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh',
'degrees', 'e', 'exp', 'fabs', 'floor',
'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow',
'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
>>> print math.__doc__
This module is always available. It provides access to the
mathematical functions defined by the C standard.
>>> math.pi
3.1415926535897931
>>> math.sin(math.pi/2)

1.0
>>> from math import sin, pi
>>> sin(pi/2)
1.0
9. Klase
Definicija klase u svom najjednostavnijem obliku izgleda ovako:
class ImeKlase:
iskaz 1
iskaz 2
iskaz 3
...
iskaz n

Iskazi u definiciji klase su obièno definicije funkcija, ali dozvoljeni su i drugi


iskazi.
Evo jednog jednostavnog primjera:
class ProbnaKlasa:
"Ovo je jedna probna klasa."
podatak = 12
def f(self):

print 'Ovo je metod klase'

126
Ovako kreirana definicija mora da se izvr i da bi klasa mogla da se koristi. Po iz
vr enju,
ako sve proðe u redu, formira se objekat tipa klase.
Pojedinaèni primjerci klase kreiraju se upotrebom funkcijske notacije. Na primer:
>>> x = ProbnaKlasa()

Sada je kreiran primjerak klase ProbnaKlasa i smje ten u promenljivu x. Ovaj primj
erak
mo emo da koristimo na sljedeæi naèin:
>>> x.__doc__
'Ovo je jedna probna klasa.'
>>> x.f()
Ovo je metod klase
>>> x.podatak
12

Èesto se oèekuje da primjerak klase bude inicijalizovan prije njegove upotrebe. Ovo
mo emo da uradimo defini uæi metod __init__() unutar klase.
class Tacka:

def __init__(self, x, y):


self.x = x
self.y = y

Ovako definisanu klasu i njene primjerke mo emo da koristimo na sljedeæi naèin:


>>> a = Tacka(3, 5)
>>> a.x
3
>>> a.y
5

10. Primjena
Internet
Programski jezik Pajton stekao je dio svoje popularnosti nudeæi efikasna rije enja z
a
internet. U ove svrhe izgraðene su standardni moduli koji se isporuèuju zajedno sa
interpretatorom. Na primjer, na strani klijenta postoji podr ka za FTP, Gopher, PO
P3,
IMAP4, NNTP, SMTP, Telnet protokole. Takoðe u okviru standardnih modula, postoje
bazièna re enja za izradu HTTP servera...
Slede neke internet tehnologije na bazi jezika Pajton koje su nastale van matiène
kuæe:
Zope
Zope (Z Object Publishing Environment) je veb server i skup alata napisan u Pajt
on jeziku.
Osnovni skript jezik kojim se ovaj server prilagoðava specifiènim potrebama je takoðe
Pajton jezik. Ovo je tehnologija koja omoguæava veb dizajnerima da formiraju veb s
ajt i
aplikacije koje se izvr avaju na strani servera kroz publikovanje hijerarhije Pajt
on objekata
na vebu. Programer mo e da se usredsredi na pisanje objekata ostavljajuæi da se Zope
brine o HTTP i CGI detaljima.
127
Plone
Zope je moæno sredstvo, ali ako je potrebno znatno jednostavnije re enje za kreiranj
e i
odr avanje sadr aja veb sajta mo e da se upotrjebi, na primjer, Plone. Ovaj sistem za
upravljanje sadr ajima (CMS) sajta baziran je na Zope tehnologiji i Pajton jeziku.

Jython
Jython je implementacija programskog jezika Pajton u Javi. Mo e da uvozi veæinu Java
klasa i da se prevodi u Java bajt kod. Ovo omoguæava pisanje programa koji se izvr a
vaju
na Java platformi bilo na strani klijenta ili servera.
Ruby
Yukihiro Matsumoto, tvorac Ruby.
Ruby je zami ljen na Februar 24, 1993 od Yukihiro Matsumoto-a koji je elio stvoriti
novi
jezik koji balansira izmeðu funkcionalnog programiranja sa imperativnim programira
njem,o
sam skriptni jezik koji je bio sna niji od Perl, i vi e objektno-orijentiran nego Py
thon. Zato
sam odluèio dizajnirati svoj jezik ". [2]
Etimologija imena "Ruby"
Da se program zove "Ruby", odluèeno je na vrijeme on-line chat sesije izmeðu
Matsumoto i Keiju Ishitsuka na Februar 24, 1993, prije nego to je bilo koji kod b
io napisan
za jezik. U poèetku dva imena su predlo ena: "Coral" i "Ruby" , a bili su izabrani o
d strane
Matsumoto-a u kasnijim e-mail za Ishitsuka. Coral ima veæ dugu povijest kao ime
programskog jezika koji potjeèe iz 1964 na osnutka Royal Radar u Velikoj Britaniji
, na
sreæu drugi naziv je izabran da iskljuèiti pometnju. Matsumoto kasnije je izjavio da
faktor u
odabiru imena "Ruby" je jer je Birthstone jednog od njegovih kolega.
Prvi objave
Prvi javni izlazak Ruby 0,95 najavljen je na domaæem japanskom newsgrupa 21.
decembra 1995. Nakon toga jo tri verzije Ruby su pu teni u dva dana. Izdavanja su s
e
poklopila sa lansiranjem japanskog jezika rubin-lista mailing lista koja je bila
prva mailing
listu za novi jezik.
Veæ predstavljne u ovoj fazi razvoja su mnoge od znaèajki upoznat u kasnijim izdanji
ma
Ruby, ukljuèujuæi i objektno-orijentirani dizajn, klase s nasljeðivanjem, mixins, iter
ators,
zatvaraèi, iznimka rukovanja, i odvoz smeæa.
Ruby 1,0
Ruby je dosegao verziju 1.0 25. decembra 1996.
Nakon objavljivanja Ruby 1,3 u 1999 prvi engleski jezik mailing lista ruby-talk
je poèela, to
je signalizirao veæe zanimanje za jezik izvan Japana. U septembru 2000 prva knjiga
na
engleskom jeziku je tiskana za programiranje u Ruby-u, koja je kasnije i besplat
no
objavljena u javnosti zbog daljnjeg irenja usvajanja Ruby meðu engleskog govornika.

128
Ruby on Rails
Oko 2005, interes za Ruby je skoèio u Ruby on Rails web aplikacijskog framework-
a napisan u Ruby.
Ruby 1.9.1
Zadnji stabilna verzija referentne implementacije je 1.9.1.
Ruby 1.9.1 uvodi mnoge znaèajne promjene na verziju 1.8.6. Neki primjeri su:
Blok lokalne varijable (varijable koje su lokalne za blok u kojem su objavljene)
Dodatna lambda sintakse (zabava = -> (a, b) (puts + B))
Per-string karakter kodiranja su podr ani
Filozofija
Matsumoto je rekao da je Ruby dizajniran za produktivnost i zabavu programera,
prateæi naèela dobrog dizajna korisnièkog suèelja. Nagla ava da oblikovanje sustava treba
istaknuti ljude, a ne raèunala, potrebama:
''Èesto ljudi, osobito raèunarski in enjeri, usredotoèeni su na strojeve. Oni misle, "Ra
deæi
ovo, stroj æe raditi br e. Radeæi ovo, stroj æe se pokretati uèinkovitije. Radeæi ovo, stro
æe
ne to ne to ne to." Oni se usredotoèuju na strojeve. Ali, u stvari trebamo se usredotoèiti
na ljude, o tome kako se ljudi brinu o pisanju programa ili rukovanja aplikacija
ma za
programe. Mi smo gospodari. Oni su robovi."
Ruby slijedi princip najmanjeg iznenaðenja (Pols), to znaèi da se jezik treba pona ati
na
takav naèin kako bi se smanjila konfuzija za iskusne korisnike. Matsumoto je rekao
da je
njegov glavni dizajnerski cilj bio napraviti jezik u kojem je i sam u ivao koristeæi
ga,
umnjujuæi programerski rad i moguæe konfuzije. On je rekao da on nije primijeniti naèe
lo
najmanjeg iznenaðenja za dizajn Ruby, ali ipak je do ao do izraza usko povezan s Rub
y
programskim jezikom. Fraza i sama je izvor iznenaðenje, kao novajlija korisnik mo e
poduzeti da to znaèi da se pona anje Ruby poku ava najbli e podudariti sa pona anjrm
poznatih drugih jezika. U maju 2005 raspravu o comp.lang.ruby interesne grupe,
Matsumoto je poku ao udaljiti Ruby od POLS, obja njavajuæi da æe odabir bilo kojeg
dizajna biti iznenaðenje za nekoga,ali on koristi osobni standard u procjeni iznen
aðenje.
Ako taj osobni standard ostane dosljedan on æe biti malo iznenaðenje za one upoznati
s
standardnim.
Matsumoto ga je definirao na ovaj naèin u intervjuu:
'' Svatko ima individualne pozadinu. Netko je do ao iz Python, netko drugi mo da
dolazi iz Perl, i mogu biti iznenaðeni razlièitim aspektima jezika. Onda su do li do m
ene i
ka u: 'Bio sam iznenaðen ovim odlikama jezika, pa Ruby kr i naèelo najmanjeg
iznenaðenja.' Prièekajte. Prièekajte. Princip najmanje iznenaðenje nije samo za vas.
Naèelo najmanje iznenaðenje znaèi naèelo najmanjeg mojeg iznenaðenja. A to znaèi
naèelo najmanjeg iznenaðenje nakon to ste upoznali Ruby vrlo dobro. Na primjer, bio
sam C + + programer prije nego sam poèeo projektiranje Ruby. Programirao sam u C +
+
tokom dvije ili tri godine. I nakon dvije godine C + + programiranje, to me jo uv
ijek
iznenaðuje.
"
Moguænosti
Temeljito objektno-orijentiran s nasljeðivanjem, mixins i metaclasses
Dinamièki tipovi i duck tipovi
129
Sve je izraz (èak i izjave) i sve je izvr eno imperativno (èak deklaracije)
Jezgrovita i fleksibilna sintaksa koja minimizira buku sintaktièke i slu i kao temel
j za
domenu odreðenih jezika
Dinamièko razmi ljanje i mijenjanje objekata kako bi se olak alo metaprogramming
Leksièki zatvaraèi, Iterators i generatora, uz jedinstvenu blok sintaksu
Doslovna notacija za polja, presjeci, regularnih izraza i simbola
Ugradnja koda u ice (interpolacija)
Standardni argumenata
Èetiri razine varijable opsega (globalno, klase, na primjer, i lokalne) obilje eni s
igils i
kapitalizaciju
Automatski odvoz smeæa
First-class nastavak
Stroga pravila boolean prisile (sve je istina osim la ne i nil)
Iznimka rukovanje
Operator preoptereæenja
Izgraðena podr ka za racionalne brojeve, kompleksne brojeve i proizvoljne preciznost
i
aritmetièke
Custom otpreme pona anja (kroz method_missing i const_missing)
Native teme i suradnièki vlakana
Potpuna podr ka za Unicode kodiranja i vi estruke karaktera (od verzije 1.9)
Native API plug-in u C
Interactive Ruby Shell (repl)
Centralizirano upravljanje paketima putem RubyGems
Implementiran na sve platforme
Velika standardna biblioteka
class Person
attr_reader :name, :age
def initialize(name, age)

@name, @age = name, age


end
def <=>(person) # Comparison operator for sorting

@age <=> person.age


end
def to_s

"#@name (#@age)"
end
end

group = [
Person.new("Bob", 33),
Person.new("Chris", 16),
Person.new("Ash", 23)

]
puts group.sort.reverse

130
Deklarativno programiranje
U kompjuterskim naukama, deklarativno programiranje je paradigma programiranja k
oja
izra ava logiku izraèunavanja bez opisivanja svoje kontrole toka. Mnogi jezici primj
enom ovog stila
poku avaju da smanje ili elimini e ne eljene efekte koji opisuju ta program treba da os
tvari, a ne
opisuju kako da se to ostvari. To je u suprotnosti sa imperativom programa, koji
zahtijeva izrièito
odreðeni algoritam.
Deklarativno programiranje èesto smatra programe kao teoriju formalne logike, i pr
oraèune
kao odbitke u toj logici prostora. Deklarativno programiranje je postalo od pose
bnog znaèaja u
posljednje vrijeme, kao to je to da se u velikoj mjeri mo e pojednostaviti pisanje
paralelnih
programa.
Zajednièki jezici ukljuèuju one deklarativno regularne izraze, logiku programiranja,
i funkcionalno
programiranje.
Deklarativno programiranje je èesto definisano kao bilo koji stil programiranja ko
ji nije
imperativ. Broj drugih zajednièkih definicija postoji tako da poku avaju da daju ter
min definicija
osim jednostavnih kontrasta sa imperativom programiranja. Na primjer:
program koji opisuje ta izraèunavanja treba izvr iti, a ne kako da ga izraèunamo;
bilo koji programski jezik koji nema ne eljenih efekata (ili preciznije, to je ref
erentially
transparent)
jezik sa jasnim prepiskama u matematièkoj logici.
SQL

SQL, èesto zvan Structured Query Language, je kompjuterski programski jezik dizajn
iran
za upravljanje podacima u sistemima relacionih baza podataka (RDBMS relational d
atabase
management system), i izvorno baziran na relacionoj algebri. Njegov opseg ukljuc
uje upite (data
query) i izmjene (update), kreiranje ema i kontrolu pristupa podacima.
SQL nije Turing kompletan programski jezik.
HISTORIJAT
SQL je razvijen od strane Donald D. Chamberlin-a i Raymond F. Boyce-a iz IBM-a r
anih
1970-ih godina. Ova verzija, koja se u poèetku zvala SEQUEL, je dizajnirana za man
ipulaciju i
dobavljanje podataka smje tenih u IBM-ovom originalnom proizvodu relacionih baza p
odataka,
System R.
Tokom 1970-ih, tim iz IBM San Jose Research Laboratory istrazivackog laboratorij
a je
razvio System R, sistem upravljanja relacionim bazama podataka. Donald D. Chambe
rlin i
Raymond F. Boyce su zatim napravili Structured English Query Language (SEQUEL il
i SEQL) za
upravljanje podacima smje tenim u System R. Skraæenica SEQUEL je kasnije promijenjen
a u SQL
jer je SEQUEL bio za titni znak Hawker Siddeley avionske kompanije.
Prvi sistem za upravljanje relacionim bazama podataka (RDBMS) je bio RDMS, razvi
jen u
MIT-u ranih 1970-ih, a praæen jako brzo Ingres-om, razvijenim 1974. godine u U. C.
Berkeley-u.
Ingres je koristio upitni jezik (query language) QUEL, kojeg je kasnije potisnuo
sa tr i ta SQL.
131
Kasnih 1970-ih, Relation Software Inc. (sada Oracle Corporation) je primjetio po
tencijal koncepta
kojeg su opisali Codd, Chamberlin i Boyce i razvio svoj SQL-bazirani RDBMS te eæi da
ga proda
amerièkoj mornarici, CIA-i i ostalim amerièkim vladinim agencijama. Na ljeto 1979. g
odine, Relation
Software Inc. je predstavio prvu komercijalno dostupnu implementaciju SQL-a, Ora
cle V2 (version
2) za VAX kompjutere. Oracle V2 je pobijedio IBM-ovo izdanje System/38 RDBMS-a n
a tr i tu za
par sedmica.
Nakon testiranja SQL-a na korisnièkim testnim mjestima da se utvrdi korisnost i pr
aktiènost
sistema, IBM je poèeo razvijati komercijalne proizvode zasnovane na njihovom Syste
m R
prototipu, ukljuèujuæi System/38, SQL/DS i DB2, koji su bili komercijalno dostupni 1
979., 1981. i
1983. godine, redom.
Èeste kritike SQL-a ukljuèuju manjak vi eplatformske prenosivosti, neodgovarajuæe
rukovanje nedostajuæim podacima, i èesto nepotrebno kompleksna i povremeno dvosmisle
na
gramatika i semantika. Takoðer mu nedostaje èvrstina formalnijih jezika poput relaci
one algebre.
JEZIÈKI ELEMENTI
SQL jezik je podijeljen u nekoliko jezièkih elemenata, ukljuèujuæi:

Klauzule (Clauses), koje su u nekim sluèajevima neobavezne, sastavni dijelovi


iskaza i upita.
Izrazi (Expressions), koji prave bilo skalarne vrijednosti ili tabele koje se sa
stoje od
kolona i redova podataka.
Predikati, koji odreðuju uslove koji mogu biti proslijeðeni u SQL-ove three-valuedlo
gic
(3VL) logièke istinitosne vrijednosti koji se koriste za ogranièavanje efekata
iskaza i upita, ili za izmjenu programskog toka.
Upiti (Queries), koji dobavljaju podatke na osnovu nekih odreðenih kriterija.
Iskazi (Statements), koji mogu imati trajan efekt na eme i podatke, ili koji mogu
kontrolisati transakcije, programski tok, veze, sesije ili dijagnoze.
o
SQL iskazi takoðer ukljuèuju ; (taèka-zarez) za oznaèavanje kraja iskaza.
Iako ne nu an na svakoj platformi, definisan je kao standardni dio SQL
gramatike.
Nebitan prazan prostor (Whitespace), uglavnom je ignorisan u SQL iskazima i
upitima, olak avajuæi time formatiranje SQL koda za veæu èitljivost.
UPITI
Najèe æa operacija u SQL-u je upit, izveden deklarativnim SELECT iskazom. SELECT uzima
podatke iz jedne ili vi e tabela ili izraza. Standardni SELECT iskazi nemaju nikak
av trajni efekat na
bazu podataka. Neke nestandardne implementacije SELECT iskaza mogu imati trajne
efekte, kao
kod SELECT INTO komande koja postoji u nekim bazama podataka.
Upiti omoguæavaju korisniku da opi e eljene podatke, ostavljajuæi sistemu za upravljanj
e
databazom (DBMS) odgovornost planiranja, optimiziranja, i izvr avanja fizièkih opera
cija potrebnih
za pravljenje rezultata u eljenoj formi. Upit se sastoji od liste kolona koje tre
ba ukljuèiti u krajnji
rezultat, koje odmah slijede SELECT rijeè. Zvjezdica ( * -asterix) se mo e koristiti
da se naznaèi
da upit treba vratiti sve kolone ispitivanih tabela. SELECT je najslo eniji iskaz
u SQL-u, sa
dodatnim opcijama i klauzulama koje ukljuèuju:

FROM klauzula koja odreðuje tabelu (tabele) iz kojih se podaci dohvataju. FROM
klauzula mo e sadr avati dodatnu JOIN potklauzulu koja odreðuje pravilo spajanja
tabela.
WHERE klauzula dodaje poredbeni predikat koji ogranièava redove koje upit
dohvata. WHERE klauzula elimini e sve redove iz skupa rezultata kojim poredbeni
132
predikat ne dodijeli vrijednost True.

GROUP BY klauzula se koristi za grupisanje redova koji imaju zajednièke vrijednost


i
u manje skupove redova. GROUP BY se èesto koristi zajedno sa SQL funkcijama
gomilanja tokova podataka ili za eliminisanje duplih redova iz skupa rezultata.
WHERE klauzula se primjenjuje prije GROUP BY klauzule.
HAVING klauzula ukljuèuje predikat koji se koristi za filtriranje redova rezultata
iz
GROUP BY klauzule. Zato to se primjenjuje na rezultat GROUP BY klauzule,
funkcije za gomilanje toka podataka se mogu koristiti u predikatu HAVING klauzul
e.
ORDER BY klauzula identifikuje kolone koje se koriste za sortiranje rezultujuæih
podataka, i smjer u kojem trebaju biti sortirani (rastuæe ili opadajuæe). Bez ORDER
BY klauzule, redoslijed redova vraæenih SQL upitom je nedefinisan.
Slijedi primjer SELECT upita koji vraæa listu skupih knjiga. Upit vraæa sve redove i
z tabele
Books u kojoj kolona price sadr i vrijednost veæu od 100.00. Rezultat se sortira u r
astuæem poretku
po nazivu (kolona title). Zvjezdica ( * ) u listi kolona oznaèava da sve kolone Book
tabele trebaju
biti ukljuèene u skup redova rezultata.
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;

Primjer ispod demonstrira upit vi e tabela, grupisanje i gomilanje vraæajuæi listu knj
iga i broj
autora povezanih sa svakom knjigom.
SELECT Book.title,
count (*) AS Authors
FROM Book
JOIN Book_author ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
Rezultat primjera bi mogao izgledati kao:
Title
Authors
SQL Examples and Guide 4
The Joy of SQL 1
An Introduction to SQL 2
Pitfalls of SQL 1
Pod uslovom da je isbn jedino zajednicko ime kolona dvije tabele i da kolona tit
le postoji
samo u Books tabeli, navedeni upit bi se mogao napisati u formi:
SELECT title,
count (*) AS Authors
FROM Book
NATURAL JOIN Book_Author
GROUP BY title;
133
Ipak, mnoge platforme ili ne podr avaju ovakav pristup ili zahtjevaju konvencije i
menovanja
kolona.
SQL sadr i operatore i funkcije za izraèune nad pohranjenim vrijednostima. SQL dozvo
ljava
kori tenje izraza u select listi za dohvatanje podataka, kao u slijedeæem primjeru k
oji vraæa listu
knjiga koje ko taju vi e od 100.00 sa dodatnom kolonom sales_tax koja sadr i porez na
prodaju od
6% cijene.
SELECT isbn,
title,
price,
price * 0.06 AS sales_tax
FROM Book
WHERE price > 100.00
ORDER BY title;
NULTA VRIJEDNOST (NULL) I THREE-VALUED LOGIC (3VL)
Ideja sa Null je uvedena u SQL za rukovanje nepostojeæim informacijama u relaciono
m
modelu. Uvoðenje Null (ili nepoznate vrijednosti) zajedno sa True i False je osnov
alo 3VL. Null
nema vrijednosti (i nije èlan nijednog domena podataka) nego je oznaka za izostana
k informacije.
Tako da poreðenja sa Null ne mogu rezultirati logièkom vrijedno æu True ili False nego t
reæom
vrijedno æu, Unknown (nepoznato).
SQL koristi Null za rukovoðenje izostavljenim informacijama. SQL podr ava 3VL i prav
ila
upravljanja SQL 3VL logikom su obja njena u tabelama ispod ( p i q predstavljaju l
ogièka stanja).
Rijeè Null je takoðer rezervisana kljuèna rijeè u SQL-u koja se koristi za identifikovan
je specijalnog
Null markera.
Kako SQL operatori vraæaju Unknown poreðenjem bilo èega sa Null, SQL pru a dva
posebna poredbena predikata: IS NULL i IS NOT NULL provjeravaju da li je (ili da
li nije) podatak
NULL. Primjetite da SQL vraæa samo rezultate za koje klauzula WHERE vrati vrijedno
st True, tj.
iskljuèuje rezultate i sa False i sa Unknown.
Univerzalni kvantifikator nije eksplicitno podr an u SQL-u i mora se izvoditi kao
negirani
egistencijalni kvantifikator.
Takoðer postoji i infiksni operator <redni izraz> IS DISTINCT FROM <redni izraz> koj
i
vraæa True ako su oba operanda jednaka ili su oba NULL. Slièno, <redni izraz> IS NOT
DISTINCT
FROM <redni izraz> je negacija gornjeg operatora.
MANIPULACIJA PODATAKA
Data Manipulation Language (DML) je dio SQL-a koji se koristi za dodavanje, izmj
ene i
brisanje podataka.
· INSERT dodaje redove u postojeæu tabelu. Npr.:
INSERT INTO My_table
(field1, field2, field3)
VALUES
('test', 'N', NULL);

· UPDATE modifikuje skup postojeæih redova tabele. Npr.:


134
UPDATE My_table
SET field1 = 'updated value'
WHERE field2 = 'N';

DELETE uklanja postojeæe redove tabele. Npr.:


DELETE FROM My_table
WHERE field2 = 'N';

TRUNCATE brzo uklanja sve podatke iz tabele. Obièno koristi COMMIT operaciju
sukcesivno.
MERGE se koristi za spajanje sadr aja vi e tabela. Kombinuje INSERT i UPDATE
elemente. Ta je naredba definisana u SQL:2003 standardu. Prije toga, neke
databaze su pru ale sliènu funkcionalnost preko razlièitih sintaksi, ponekad zvanih
upsert .
KONTROLE TRANSAKCIJA
Transakcije, ako su dostupne, se koriste za objedinjavanje DML operacija:

START TRANSACTION (ili BEGIN WORK, ili BEGIN TRANSACTION, zavisno od


SQL dijalekta) oznaèava poèetak transakcije databaze koja se ili izvr i u potpunosti
ili se uop te ne izvr i.
SAVE TRANSACTION (ili SAVEPOINT) spa ava stanje databaze u trenutnom
vremenu transakcije.
CREATE TABLE tbl1_(id int);
INSERT INTO tbl_1(id) value(1);
INSERT INTO tbl_1(id) value(2);

COMMIT;
UPDATE tbl_1 SET id=200 WHERE id=1;
SAVEPOINT id-1upd;
UPDATE tbl_1 SET id=1000 WHERE id=2;
ROLLBACK TO id-1upd;
SELECT id FROM tbl_1;

COMMIT pravi sve promjene podataka u transakciji stalnim.


ROLLBACK odbacuje sve promjene od zadnjeg COMMIT-a ili ROLLBACK-a,
ostavljajuæi stanje podataka onakvo kakvo je bilo prije promjena.
Jednom kada se COMMIT iskaz zavr i, promjene napravljene transakcijom se ne mogu
vratiti.
COMMIT i ROLLBACK prekidaju trenutnu transakciju i oslobaðaju podatke. U odsustvu
START TRANSACTION ili sliènog iskaza, semantika SQL-a zavisi od implementacije. Na
primjer, klasièni transfer sa bankovnog raèuna:
START TRANSACTION;
UPDATE Account SET amount=amount-200 WHERE account_number=1234;
UPDATE Account SET amount=amount+200 WHERE account_number=2345;
IF ERRORS=0 COMMIT;
IF ERRORS<>0 ROLLBACK;

135
DEFINISANJE PODATAKA
Data Definition Language (DDL) upravlja strukturom tabela i indeksa. Osnovne stv
ari u
DDL-u su CREATE, ALTER, RENAME, DROP i TRUNCATE iskazi.

CREATE kreira objekat u databazi (npr. tabelu).


DROP bri e objekaz u databazi, uglavnom zauvijek.
ALTER modifikuje strukturu postojeæeg objekta na razne naèine npr., dodajuæi
kolonu u postojeæu tabelu.
Na primjer:

CREATE TABLE My_table


(
my_field1 INT,
my_field2 VARCHAR(50),
my_field3 DATE NOT NULL,
PRIMARY KEY (my_field1, my_field2)

);
TIPOVI PODATAKA
Svaka kolona SQL tabele odreðuje tip sadr aja kolone. ANSI SQL sadr i slijedeæe tipove.
Znakovni nizovi

CHARACTER (n) ili CHAR (n) string taèno odreðene du ine n, po potrebi
nadopunjen praznim prostorom.
CHARACTER VARYING (n) ili VARCHAR (n) string neodreðene du ine ali koja
mo e najvi e biti n.
NATIONAL CHARACTER (n) ili NCHAR (n) string taèno odreðene du ine koji
podr ava internacionalne znakove.
NATIONAL CHARACTER VARYING (n) ili NVARCHAR (n) NCHAR string
neodreðene du ine.
Bit nizovi

BIT (n) niz od n bita.


BIT VARYING (n) niz od najvi e n bita.
Brojevi

INTEGER i SMALLINT
FLOAT, REAL i DOUBLE PRECISION
NUMERIC (precision, scale) ili DECIMAL (precision, scale)
Datum i vrijeme
KONTROLA PODATAKA
Data Control Language (DCL) daje korisnicima i grupama ovlasti za pristup i mani
pulaciju
podacima. Njegova dva glavna iskaza su:
136
· GRANT daje ovlasti za izvoðenje operacija nad objektima.
· REVOKE ukida GRANT.
Na primjer:
GRANT SELECT, UPDATE
ON My_table
TO some_user, another_user;
REVOKE SELECT, UPDATE
ON My_table
FROM some_user, another_user;
PROCEDURALI DODACI
SQL je dizajniran za specifiènu namjenu: za dohvatanje podataka iz relacione baze
podataka. SQL je skupovno-bazirani deklarativni upitni jezik, ne naredbeni jezik
kao C ili BASIC.
Ipak, postoje dodaci za standardni SQL koji dodaju funkcionalnosti proceduralnih
programskih
jezika, na primjer kontrola toka programa. To su:
Izvor
Puni naziv
ANSI/ISO

Uobièajeni naziv
SQL/PSM SQL/Persistent Stored Modules
Standard
Interbase/Firebird PSQL Procedural SQL
IBM SQL PL SQL Procedural Language (koristi SQL/PSM)
Microsoft/Sybase T-SQL Transact-SQL

Mimer SQL SQL/PSM SQL/Persistent Stored Module (koristi SQL/PSM)


MySQL SQL/PSM SQL/Persistent Stored Module (koristi SQL/PSM)
Oracle PL/SQL Procedural Language/SQL (baziran na Ada)
Procedural Language/PostgreSQL Structured Query
PostgreSQL PL/pgSQL
Language (baziran na Oracle PL/SQL)
Procedural Language/Persistent Stored Modules
PostgreSQL PL/PSM
(koristi SQL/PSM)
Uz standardne SQL/PSM dodatke i zakonske SQL-ove dodatke, proceduralno i objektn
oorijentisano
programiranje je dostupno na mnogim SQL platformama preko DBMS integracije sa
ostalim jezicima. SQL standard preko SQL/JRT ekstenzija (SQL rutine i tipovi za
Java programski
jezik) podr ava Java kod u SQL databazama. SQL Server 2005 koristi SQLCLR (SQL Ser
ver
Common Language Runtime) za smje tanje .NET komponenti u databazu, dok su ranije v
erzije
SQL Server-a bile ogranièene na kori tenje pro irenih procedura za smje tanje koje su ug
lavnom
bile pisane u C-u. Ostale platforme, poput MySQL i Postgres, dozvoljavaju da fun
kcije budu pisane
u mnogim razlièitim jezicima poput Perla, Pythona, Tcl-a i C-a.
KRITIKE SQL-a
SQL je deklarativni kompjuterski jezik za kori tenje uz relacione baze podataka.
137
Interesantno, mnoge od osnovnih moguænosti SQL-a su ispirisane od strane relaciono
g modela, ali
se nisu slagale sa njim. Nedavni dodaci za SQL su postigli relacionu kompletnost
, ali su pogor ali
neslaganja.
Praktiène primjedbe SQL-u ukljuèuju:

Implementacije su nekonzistentne i uglavnom platformski meðusobno


nekompatibilne. Npr. sintaksa datuma i vremena, spajanja stringova, Null
vrijednosti, i case sensitivity prilikom poreðenja se razlikuju od platforme do
platforme.
Jezik previ e olak ava pravljenje kartezijanskih spajanja (Cartesian join - spajanja
svih moguæih kombinacija), to rezultira pogre nim skupovima podataka kada se
WHERE klauzule pogre no unesu. Cartezijanska spajanja se tako rijetko koriste u
praksi da je uglavnom neophodno kori tenje posebne kljuène rijeèi CARTESIAN.
SQL 1992 je uveo CROSS JOIN koji omoguæava korisniku da naznaèi da je u
pitanju kartezijansko spajanje.
Takoðer je moguæe da se pogre no konstrui e WHERE klauzula unutar UPDATE ili
DELETE iskaza i time sluèajno izmjeni vi e podataka unutar tabele nego to je
trebalo.
Gramatika SQL-a je mo da nepotrebno slo ena, posuðujuæi pristup kljuènih rijeèi
kao kod COBOL-a, dok bi sintaksa inspirisana funkcijama mogla rezultirati èe æim
kori tenjem manje gramatièkih i sintaksnih pravila.
Multiplatformska prenosivost
Popularne implementacije SQL-a obièno izostavljaju podr ku osnovnim moguænostima SQL
standarda, kao DATE ili TIME tipove podataka. Kao rezultat toga, SQL kod se rije
tko mo e
prenositi meðu sistemima baza podataka bez modifikacija. Postoji nekoliko razloga
za ovaj
nedostatak prenosivosti meðu sistemima.

Kompleksnost i velièina SQL standarda znaèi da veæina implementacija ne


podr ava cijeli standard.
Standard ne navodi pona anje databaze u nekim bitnim podruèjima (indeksi,
smje taj podataka itd.), ostavljajuæi implementatorima da odluèuju o tome.
SQL standard precizno navodi sintaksu koju usklaðeni sistem baza podataka mora
implementirati. Ipak, specifikacija semantike jezièkih konstrukcija standarda nije
tako precizno obraðena, to vodi dvosmislenosti.
Mnoge platforme imaju velike korisnièke baze tako da ukoliko doðe do konflikta
izmeðu SQL standarda sa prethodnim pona anjem baze isporuèioca, isporuèioci
rijetko ele prekinuti kompatibilnost unazad.
Razvojni timovi èesto namjerno prave nekompatibilnosti sa ostalim proizvodima,
time stvarajuæi prinudnu lojalnost kod korisnika.
Funkcionalno programiranje
U raèunarstvu, funkcionalno programiranje je programiranje paradigme koja se treti
ra
kao obraèun procjene matematièkih funkcija i izbjegava stanja i promjenljive podatke
. Ona se u
istièe primjeni funkcija, u suprotnosti sa imperativnim programskim stilom. Funkci
onalno
138
programiranje ima svoje korijene u lambda raèunu, formalnom sistemu razvijenom tok
om 1930-ih
da istra i definiciju funkcije, funkcije aplikacije i rekurzija. Mnogi funkcionaln
i programski jezici
mogu se posmatrati kao elaborati na lambda raèunu.
U praksi, razlika izmeðu matematièke funkcije i pojma "funkcija" se koristi u impera
tivnom
programiranju gdje imperativi funkcije imaju ne eljena dejstva, promijene vrijedno
st veæ
izraèunatog raèunanja. Zbog toga to nemaju referentne transparentnosti, odnosno isti
izraz jezika
mo e da dovede do razlièitih vrijednosti u razlièito vrijeme u zavisnosti od stanja iz
vr avanja
programa. Sa druge strane, u funkcionalnom kodu izlazna vrijednost funkcije zavi
si samo od
argumenata koji su na ulazu funkcija, tako da pozivanje funkcije f dva puta sa i
stom vredno æu za
argument x koji æe proizvesti isti rezultat f (x) oba puta. Eliminisanje ne eljenih
efekata mo e se
uèiniti mnogo lak e za razumijevanje i predviðanje pona anja programa, koji je jedan od
kljuènih
motiva za razvoj funkcionalnog programiranja.
Funkcionalni programski jezici, posebno oni èisto funkcionalni, su u velikoj mjeri
nagla eni u
akademskim krugovima nego u komercijalnom razvoju softvera. Meðutim, istaknuti fun
kcionalni
programski jezici kao to su Scheme, Erlang, OCaml, i Haskell su se koristili u in
dustrijske i
komercijalne aplikacije od strane raznih organizacija. Funkcionalno programiranj
e takoðe nalazi
primjenu u industriji kroz domena specifiènih programskih jezika kao to su R (stati
stika),
Mathematica (simbolièka matematika), J i K (finansijska analiza), i XSLT (XML ). N
aleti
deklarativnog domena odreðenim jezicima kao to su SQL i Lex / Yacc, koriste neke el
emente
funkcionalnog programiranja, naroèito u escheving promenljivoj vrednosti tabele i
mo e se
posmatrati kao funkcionalni programski jezik.
Programiranje u funkcionalnom stilu mo e biti ostvareno na jezicima koji nisu pose
bno dizajnirani
za funkcionalno programiranje. Na primjer, imperativ Perl programskoi jezik koji
mo e biti predmet
knjige, opisuje kako da primjenite koncepte funkcionalnog programiranja JavaScri
pt, jedan od
najèe æe kori tenih jezika danas.
Historija
Lambda raèun je teoretski okvir za opisivanje funkcija i njihove procjene. Iako je
vi e
matematièka apstrakcija, nego programski jezik, on èini osnovu gotovo svih funkciona
lnih
programskih jezika danas. Ekvivalent teorijske formulacije, Kombinacijski logika
, se obièno smatra
vi e apstraktnom nego lambda raèun i prethodio je u izumu. Koristi se u nekim ezoter
iènim
jezicima, ukljuèujuæi Unlambda. Kombinacijska logika i lambda raèun su bili prvobitno
razvijeni da
se postigne jasniji pristup osnovama matematike.
Rani funkcionalni jezik je LISP, razvio je D on Makarti, dok je na MIT-za IBM 700/
7000
serije nauènih raèunara u kasnim 1950-im. LISP je uveo mnoge funkcije, koje se sada
nalaze u
funkcionalnim jezicima, iako je LISP je tehnièki multi-paradigmalni jezik. Scheme
i Dillan su kasnije
poku avali da unaprijede I pobolj aju LISP.
Information Processing Language (IPL) se ponekad navodi kao prvi raèunar zasnovan
na
funkcionalnom programskom jeziku. To je monta a u stilu jezika za manipulaciju lis
te simbola. Ona
ima pojam "generator",koji iznosi funkciju iprihvata je kao argument, a æ
na
budu ida je skup tina
nivou jezika,kod se
koristiti kao podatak,tako da se IPL
smatrati kao to funkcija
moe moe
vi eg reda.
Kenneth E. Iverson je razvio programski jezik APL u ranim 1960-im, opisan u njeg
ovoj
knjizi AProgramming Language. APL je imao primarni uticaj na D on Bekusovo FP prog
ramiranje
jezika. U ranim 1990-im, Ajverson i Rod er Hui napravili se nasljednika APL-u, pro
gramski jezik J.
Sredinom 1990-ih, Artur Vitni, koji je prethodno radio sa Ajverson, napravio je
programski jezik K,
koji se komercijalno koristi u finansijskim industriji.
D on Bekus predstavio je FP programski jezik u 1977 na dodjeli Tjuringove nagrade
odr av i predavanje Mo e li programiranje biti osloboðeno od von Neumann-ovog stila?
Funkcionalni stil I Algebra programa. On defini e funkcionalne programe kao hijerar
hiju pomoæu
"kombinovanja oblika", koji omoguæava "algebre programa", u modernom jeziku to znaèi
da
funkcionalne programe prate princip komponovanja. Bekusov papir je popularizovao
istra ivanja u
139
funkcionalnom programiranju, iako je naglasio funkciua na nivou programiranja a
ne kao lambda
kalkulus-stil, koji je bio povezan sa funkcionalnim programiranjem.
Tokom 1970-ih ML programski jezik je stvorio Robin Milner na Univerzitetu u Edin
burgu, i
Dejvid Tarner razvio u poèetku SASL jezik na Univerzitetu u Sent Endruz, a kasnije
i Miranda jezik
na Univerzitetu u Kentu. ML na kraju razvio u nekoliko dijalekata, od kojih su n
ajèe æi Caml i
standardni ML. Takoðe u 1970-ih, razvoj eme programskih jezika (delimièno funkcionala
n dijalekat
LISP), kao to je opisano kod uticajnih lambda radova 1985. I u ud benicima Struktur
a i
Tumaèenje kompjuterskih programa, to je donijelo svijest o moæi funkcionalnog program
iranja ire
programske jezièke-zajednice.
U 1980, Per Martin-Luf je razvio Intuitivni tip teorije (koji se jo nazivao Konst
ruktivni tip
teorije), koji povezuje funkcionalne programe sa konstruktivnim dokazima proizvo
ljno slo ene
matematièke propozicije.
Godine 1987 programski jezik Haskell je u ao u upotrebu, u formi otvorenog standar
da za
funkcionalno programsko istra ivanje, implementacija izdanja je bila od 1990.
Koncepti
Broj koncepata i paradigmi su specifiène za funkcionalno programiranje, i generaln
o strano
imperativno programiranje (ukljuèujuæi Objektno orijentisano programiranje).
Funkcije vi eg reda
Funkcije vi eg reda su funkcije koje mogu da preuzmu druge funkcije kao argumente
i vrate
ih u rezultatu (diferencijalni operator d / dx koji proizvodi izvod funkcije f j
e primjer za to raèunanje).
Funkcije vi eg reda su blisko povezane sa prvoklasnim funkcijama. Razlikujemo dvij
e vrste: "vi eg
reda", koje opisuju matematièki koncept funkcija koje rade na drugim funkcijama, d
ok su "prve
klase" koje u raèunarskim naukama opisuje programski jezik subjekata koji nemaju o
granièenja u
upotrebi (na taj naèin prvoklasne funkcije se mogu pojaviti bilo gdje u programu g
dje druge prve
klase mogu biti kao to su brojevi, ukljuèujuæi i argumente druge funkcije, kao i njiho
vo vraæanje
vrijednosti).
Funkcije vi eg reda omoguæavaju currying, tehniku u kojoj se funkcija primjenjuje na
svoje
argumente jedan po jedan, uz svaku aplikaciju vraæa novu funkciju koja prihvata sl
jedeæi argument.
èiste funkcije
èisto funkcionalne funkcije (ili izrazi) nemaju memorija ili I / O nuspojave (osim
ako se
izraèunavanje rezultata u sebi raèuna kao strani-efekat). To znaèi da èiste funkcije ima
ju nekoliko
korisnih osobina, od kojih se mnoge mogu koristiti za optimizovanje koda:
Ako je rezultat èist, izraz se ne koristi, ona se mo e ukloniti bez uticaja na druge
izraze.
Ako se èista funkcija zove funcija sa parametrima koje ne izazivaju nikakve spored
ne efekte,
rezultat je konstantan u odnosu na tu listu parametara (ponekad se naziva refere
ntna
transparentnost), odnosno ako je èista funkcija ponovo sa istim parametrima, isti
rezultat æe biti
vraæen.
Ako nema podataka zavisnosti izmeðu dva èista izraza, a zatim njihov redoslijed mo e b
iti ukinut,
ili se mogu izvr iti paralelno i ne ometaju jedna drugu (u drugim uslovima,svaka p
rocjena je bila
sigurna).
Ako se cio jezik ne dozvoljava da se ne eljena dejstva, a zatim svaka strategija p
rocjene mo e
koristiti, to daje slobodu kompajleru da preuredi ili kombinuje procjene izraza
u programu (npr,
pomoæu krèenje uma).
Rekurzija
Glavni èlanak: Rekurzija (raèunarstvo)

Iteracija (petlje) ufunkcionalnim jezicimase posti u preko rekurzije. Rekurzivne


funkcije

140
pozivaju se, to omogu ava æ
da se radizvodiiznova iiznova. Rekurzija mo e
zahtijevati odr avanje

stek, ali rep rekurzija se


prepoznati i optimizovati kompajler u istom kodu k
mo e oji se koristi za
sprovoðenje iteracija u imperativ jezika. Scheme programski jezik standardne imple
mentacije
zahtjeva da se prepoznaju i optimizuju rep rekurzije. Optimizacija rep rekurzije
se mo e primijeniti
na transformaciju programa u stilu nastavka koji prolazi vrijeme kompilacije, iz
meðu ostalog,
pristupa.
Zajednièke obrasce rekurzije mogu se uzeti uz pomoæ funkcija vi eg reda. Takve funkcij
e vi eg
reda igraju ulogu analognu ugraðene kontrolne strukture kao to su petlje u imperati
vnim jezicima.
Veæina op te namjene funkcionalnih programskih jezika omoguæava neogranièene rekurzije
I Turing complete, to èini problem u zaustavljanju neodluèivog, mo e izazvati defektnos
t
rezonovanja, i uop te zahtjeva uvoðenja nedoslijednosti u logici izra enoj po vrsti si
stema jezika.
Neke posebne namjene jezika kao to su Coq dozvoljavaju samo dobro osnovanu rekurz
ije i
sna nu normalizaciju. Funkcionalno programiranje ogranièeno je na dobro zasnovanoj r
ekurziji sa
nekoliko drugih ogranièenja, naziva se ukupno funkcionalno programiranje.
Strogi odnosi na ne-strogoj procjeni
Glavni èlanak: Procjena strategije
Funkcionalni jezici mogu se svrstati po tome da li se oni koriste strogo (nestrp
ljiv) ili nestrogo
(lijen), koncepti koji se odnose na to kako se argumenti funcija obraðuju kada se
izraz
vrijednuje. Tehnièka razlika je u semantici oznaèavanja izraza koji sadr e neizvr avanje
ili
divergentna raèunanja. Pod strogim evaluacijama, ako izraz sadr i neki element koji
neæe uspjeti,
cijeli izraz æe pasti. Na primjer, izraz
print length([2+1, 3*2, 1/0, 5-4])

neæe uspjeti pod strogom procjenom jer imamo dijeljenje nulom u treæem elementu list
, toznaèi da
æe taj elementbiti neuspje an. Kod nestrogihprocjena,duina funkcije e æ
vratiti vrijednost 4,jer
-
procjena je da ne e æ
poku ati da ocjeni uslove koje èine listu. Ukratko, stroga evaluacija u
potpunosti procjenjuje funkciju, sve njene argumente prije nego to pozove funkcij
u. Ne-stroga
procjena ne procenjuje argumente funkcije, osim ako njihove vrijednosti moraju d
a procjene
funkciju poziva se.
Uobièajeno sprovoðenje strategije za ne-strogu evaluaciju u funkcionalnim jezicima j
e graf
smanjenje. Ne-stroga procjena koristi kao defaltna u nekoliko èisto funkcionalnih
jezika, ukljuèujuæi
Miranda, Clean i Haskell.
Tipièni sistemi i uzrok pogaðanja
Posebno od razvoja Hindley-Milner tipa zakljuèka u 1970-im, funkcionali programski
h
jezika imaju tendenciju koristiti tipiène lambda raèune, za razliku od netipiènih lamb
da raèuna
kori tenih u LISP-u i njegove varijante (kao to su ema). Kori tenje algebarskih tipova
podataka i
uzorka pogaðanja èini manipulacije slo enih struktura podataka vi e zgodnim i izra ajanim,
prisustvo jakih compile-time tipovaomoguæava provjeru programa i èini ih pouzdanijim
, dok tip
zakljuèak oslobaða programera od potrebe da ruèno proglasi tipove kompajler.
Neka istra ivanja orijentisanim funkcionalnim jezicima kao to su Coq, Agda, Cayenne
, i
Epigram su bazirani na Institucijskoj teoriji tipova, koja omoguæava vrste koje za
vise od uslova.
Nazivaju se zavisne vrste. Ove vrste sistema nemaju odluèujuæe tipove zakljuèivanja i
te ko je
razumjeti i program. Ali zavisni tipovi mogu da izraze proizvoljne prijedloge u
logici predikata. Kroz
Curry-Howard izomorfizam, onda, dobro otkucani programiu ovim jezicima dobijaju
znaèenje
pisanja u formi matematièkih dokaza iz koje kompajler mo e da generi e certificirani k
od.
Compcert je kompajler za podskup C programskog jezika koji je pisan u Coq-u i fo
rmalno
verifikovan.
Ogranièena forma zavisnih vrsta naziva se generalizovani algebarski tipovi podatak
a
141
(GADT -Generalized Algebraic Data Types) mo e da se sprovodi na naèin koji obezbjeðuje
neke od prednosti zavisnih tipova programiranje izbjegav i veæinu neprijatnosti. GAD
T su dostupni
u Glasgow Haskell kompajleru i u Scala (kao "sluèajne klase"), a predlo eni su kao d
odaci na
druge jezike, ukljuèujuæi Java i C# .
Funkcionalno programiranje u ne funkcionalnim jezicima
Moguæe je da se koriste funkcionalnim stilom programiranja u jezicima koji nisu
tradicionalno smatrani funkcionalnim jezicima. Neki ne-funkcionalni jezici su po
sudili funkcije kao
to su funkcije vi eg reda, kao i listu shvatanja iz funkcionalnih programskih jezik
a.. Ovo olak ava
usvajanje funkcionalnog stila kada koristite te jezike. Funkcionalne konstrukcij
e kao to su funkcije
vi eg reda i lijene liste mogu se dobiti u C + + preko biblioteka. U C, taèkasta fun
cija se mo e
koristitida bi se dobili neki od efekata funkcija vi eg reda. Na primjer, zajednièka
funkcija se mo e
implementirati kori æenjem taèkaste funkcije. U C # verziju 3.0 i vi e, lambda funkcije
mogu da se
koriste za pisanje programa u funkcionalnom stilu. U Javi, anonimne klase poneka
d moge da se
koriste za simulaciju zatvaraèa, meðutim anonimne klase nisu uvijek odgovarajuæe zamen
e za
zatvaraèe, jer imaju vi e ogranièenih moguænosti.
Mnogi objektno-orijentisani projektni uzorci su izra eni u funkcionalno programira
nim
uslovima: npr, Strategija ablon jednostavno diktira kori æenje funkcije vi eg reda, a z
a posjetioce
uzorak odgovara otprilike Catamorphism-u ili fold.
Prednosti nepromenljivih podataka mogu se vidjeti èak i u imperativnim programima,
tako da
programeri èesto nastoje da naprave neke podatke nepromenljivi i u imperativnim pr
ogramima.
Poreðenje funkcionalnog i imperativnog programiranja
Funkcionalno programiranje se veoma razlikuje od imperativnog programiranja. Naj
znaèajnije
razlike proizilaze iz èinjenice da funkcionalno programiranje izbjegava ne eljene ef
ekte, koji se
koriste u imperativnom programiranju da sprovede dr avne i I / O. èisto funkcionalno
programiranje
zabranjuje ne eljena dejstva u potpunosti. Zabranjena ne eljena dejstva obezbeðuje ref
erencijalnu
transparentnost, to olak ava provjeru, optimizuje i uporeðuje programe, i lak e je za p
isanje s
automatizovanim alatima za obavljanje tih poslova.
Funkcije vi eg reda se rijetko koriste u starijem imperativnom programiranju. Gdje
tradicionalno imperativno programiranje mo e koristiti petlje da prolaze kroz list
u, funkcionalni stil
se èesto koristi funkcijama vi eg reda, mapa, koja se uzima kao argumenti funkcije i
liste,
primenjuje funkciju na svaki element liste, i vraæa spisak rezultata.
Efikasnost pitanja
Funkcionalni programski jezici se percipiraju kao manje efikasni u kori tenju proc
esora i
memorije nego imperativni jezici kao to su C i Pascal. Za èisto funkcionalne jezike
u najgorem
sluèaju usporavanja je logaritamski broj memorijskih æelija koje se koriste, jer pro
menljiva memorija
mo e da se predstavi èisto funkcionalnim strukturama podataka sa logaritamskim vreme
nom
pristupa. Meðutim, usporavanja se javljaju vrlo rijetko u praksi. Za programe koji
obavljaju
intenzivna numerièka izraèunavanja, funkcionalni jezici kao to su OCaml i Clean obièno
su slièni
po brzini od C. Za programe koji rukuju velikim matricama i vi edimenzionalnim baz
ama podataka,
niz funkcionalnih jezika (kao to su J i K) je dizajniran sa brzinom optimizacije.

Dalje, nepromjenljivost podataka mo e, u mnogim sluèajevima, dovesti do izvr enja


efikasnosti koje omoguæava kompajleru da pretpostavi da su nesigurni u imperativno
m jeziku,
znatno poveæava moguænosti za umetanje.
Pasivno vrednovanje mo e da ubrza program, èak i asimptotski, a mo e se usporiti u veæin
i
od konstantnog faktora (meðutim, mo e se desiti gubljenej memorije kada se koristi n
epropisno).
Stilovi programiranja
142
Imperativni programi imaju tendenciju da se naglasi niz koraka preduzetih od str
ane
programa u sprovoðenju akcije, dok funkcionalni programi imaju tendenciju da se na
glasi sastav i
raspored funkcija, èesto bez navoðenja eksplicitnih koraka. Jednostavan primjer dva
re enja na isti
programski cilj (koristeæi isti multi-paradigmalni jezik Python) ilustruje ovo:
# imperative style
target = [] # create empty list
for item in source_list: # iterate over each thing in source

trans1 = G(item) # transform the item with the G() function

trans2 = F(trans1) # second transform with the F() function

target.append(trans2) # add transformed item to target

Funcionalna verzija je ne to drugaèija:


# functional style
# FP-oriented languages often have standard compose()
compose2 = lambda A, B: lambda x: A(B(x)) # Define how to apply two
generic transformations
target = map(compose2(F, G), source_list) # Apply two specific functions
F and G to each item in source

Za razliku od imperativnog stila koji opisuje korake koji su ukljuèeni u izgradnji


cilja,
funkcionalni stil opisuje matematièki odnos izmeðu izvorne liste i cilja. Python kod
, u praksi je èesto
napisana sa listom razumijevanja, oblik sintaksièki eæer za for petlje sa implicitno
dodaje:
target = [F(G(item)) for item in source_list]

Upotreba u industriji
Funkcionalno programiranje ima reputaciju èisto akademskih interesa. Meðutim, nekoli
ko
uglednih funkcionalnih programskih jezika se koristi u komercijalne i industrijs
ke primjene. Na
primjer, Erlang programski jezik, koji je razvijen od strane vedske kompanije Eri
csson u kasnim
1980-im, bio je prvobitno kori æen za sprovoðenje gre aka otpornih na sisteme telekomuni
kacije.
On je postao popularan, jer je izgradio spektar aplikacija u kompanijama kao to s
u T-Mobile,
Nortel, i Facebook. ema dijalekta u LISP-u je kori tena kao osnova za nekoliko apli
kacija u
ranijim Apple Macintosh raèunarima. OCaml, koji je uveden sredinom 1990-ih godina,
je do ivio
komercijalnu upotrebu u oblastima kao to su finansijska analiza, verifikacije voz
aèa, industrijski
programiranih robota, kao i statièke analize ugraðenih softvera. Haskell, iako je pr
vobitno bio
namijenjen kao istra ivaèki jezik, takoðe se primjenjuje u nizu kompanija, u oblastima
kao to su
zraèni sistemi, hardverski dizajn i web programiranje.
Ostali funkcionalni programski jezici koji su primjenjivani u industriji su: Ska
la, F #, LISP,
Standardni ML, i Clojure.
Lisp
Lisp je najstariji i najpoznatiji funkcionalni programski jezik. Kod ovog jezika
je vi a razina
apstrakcije od imperativnih jezika (npr. C), jer izvoðenje ovisi o tipovima parame
tara, a
program i podaci mogu se modificirati tijekom izvoðenja. LISP se pokreæe funkcijama:
funkcije prenose rezultate drugim funkcijama, koje prenose daljnjim funkcijama i
td. LISP je
visoko rekurzivan glede struktura podataka (liste, stabla, ) i algoritama. Odr ava
jednakost programa i podataka. Temeljna struktura podataka je lista. LISP progra
mi su
takoðer formulirani kao liste. Suprotno C-u, funkcije u LISP-u objekti prvoga reda
: mogu se
143
kreirati, modificirati i evaluirati kao da su jednostavne varijable. Tip varijab
le ne mora se
deklarirati unaprijed. Podaci nose tip pa funkcije za vrijeme izvoðenja odluèuju o
specifiènoj akciji (kasnije prihvaæeno u OO paradigmi). Ima implicitan rad s pokaziv
aèima.
Zbog interpreterskog rada i brzog oblikovanja prototipa, LISP je pogodan za prob
leme koji
poèetno nisu potpuno razumljivi, kao to je oblikovanje ekspertnih (inteligentnih) s
ustava.

Sintaksu èine simbolièki izrazi, t.j. s-izrazi (engl. s-expressions).


S-izrazi su atomi ili liste.
Atomi:
Brojevi (3.14, 100, )
Niz znakova = string ( ovo je string )
Simboli (ana, x101, blok, b, )
Liste - rekurzivan definicija
Atom je s-izraz.
Ako su S1, S2, , Sn s-izrazi, tada je s-izraz (S1, S2, , Sn) lista.

Semantiku odreðuje petlja izvoðenja: èitaj-evaluiraj-ispi i svakog s-izraza.


Evaluiraj znaèi: naði pridijeljenu vrijednost.
Primjer programa u Lispu

;One way of doing comments (line comments)


;-=-=-=-=-=-=-=-=-=-=-=
;Section 3.5 Iteration and Recursion
;-=-=-=-=-=-=-=-=-=-=-=
;

(defun sqrt-iter (guess x)

(if (good-enough-p guess x)


guess
(sqrt-iter (improve guess x) x)))

(defun improve (guess x)


(mean (list guess (/ x guess))))

;see format page 121-122

(defun good-enough-p (guess x)


(format t "~% Guess =~7,4f Guess^2 = ~7,4f Error= ~7,4f" guess
(* guess guess) (abs (- (* guess guess) x)))
(< (abs (- (* guess guess) x)) .001))

(defun factorial (n)

(if (= n 1)
1
(* n (factorial (- n 1)))))

(defun fact-iter (product counter n)

(if (> counter n)


product
(fact-iter (* counter product) (+ counter 1) n)))

(defun factorial (n)


(fact-iter 1 1 n))

(dotimes (i 10)
(format t "~% ~d" i))

(dolist (i (* (iseq 10) 2))

144
(format t "~% ~d" i))

ML
ML je opæe namjene funkcionalni programski jezik razvijen od strane Robin Milner i
ostali u
kasnim 1970-ih na Sveuèili tu u Edinburghu, [1] èija je sintaksa inspirirana ISWIM.
Povijesno, ML stoji za metajezik: to je bio zami ljen za razvoj taktike u dokaze t
eorem
komora LCF (èiji jezik, pplambda, kombinacija prvog reda predikat raèun i jednostavn
o tip
polimorfnih lambda-raèuna, ML imala kao metajezik). On je poznat po kori tenju Milne
rtipa
zakljuèak Hindley algoritma, koja mo e automatski zakljuèiti vrstama najlak e izraza
bez zahtijeva eksplicitne komentare tipa.
Pregled
ML se èesto naziva i funkcionalni neèisti jezik, jer ne bismo ukratko opisali nuspoj
ava, za
razliku od èisto funkcijske programske jezike kao to je Haskell.
Znaèajke ukljuèuju ML-po-vrijednost vrednovanja strategije poziv, prvoklasne funkcij
ama,
automatsko upravljanje memorijom putem odvoz smeæa, parametarska polimorfizam,
statièna tipkanje, vrsta zakljuèivanja, algebarske tipove podataka, uzorak podudaran
ja, a
iznimka rukovanje.
Za razliku od Haskell, ML koristi eljni ocjenjivanja, to znaèi da su sve subexpressi
ons
uvijek procjenjuju. Meðutim, sporo vrednovanje se mo e postiæi kroz kori tenje zatvaraèa.
Tako se mo e stvoriti i koristiti beskonaèan potocima kao u Haskellu, meðutim, njihov
izraz
je relativno neizravne.
Danas postoji nekoliko jezika u ML obitelji; dva glavna narjeèja su Standard ML (S
ML) i
Caml, ali drugi postoje, ukljuèujuæi i F # -jezik koji podr ava Microsoft za svoje. NE
T
platforma. Ideje iz ML utjecale brojne druge jezike, kao to je Haskell, ciklona,
i Nemerle.
ML je snaga uglavnom se primjenjuju u jeziku dizajn i manipulacije (kompilatora,
analizatori, teorem provers), ali to je opæe namjene jezik se takoðer koristi u bioi
nformatici,
financijskih sustava i aplikacija, ukljuèujuæi genealo ka baza podataka, peer-to-peer
klijent
/ poslu iteljski program, itd.
ML koristi statièke odreðivanja pravila.
Primjeri
Sljedeæi primjeri uporabe sintaksu Standard ML. Drugi najèe æe kori tene ML dijalekt,
OCaml, razlikuje, u ovim jednostavnim primjerima, na razlièite naèine bez osnova.
Faktorijel
"Hello World" funkcionalne jezika funkciju faktorijela. Izra eno kao èista ML:
145
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n-1)

Ovo opisuje kao faktorijela rekurzivna funkcija, sa samo jednim prestanka osnovn
og
scenarija. To je slièno opisima faktorijela naæi u ud benicima matematike. ML Velik di
o
koda je slièan matematike u pogonu i sintakse.
Dio definicije prikazano je opcionalno, i opisuje vrste ove funkcije. Oznaka E:
t mo e se
èitati kao izraz ima tip E t. Na primjer, argument je n cijeli broj dodijeljen tip
a (int), a
rezultat primjene fac do n (FAC (n)) ima i tipa integer. Funkcija èimbenika kao cj
elina tada
je tip funkcije cijeli u integer (int -> int). Zahvaljujuæi vrstu zakljuèivanja, pri
mjedbe tipa
mogu se izostaviti, te æe biti izveden od strane kompajlera. Prepisivati bez primj
edbe tipa,
primjer izgleda ovako:
fun fac 0 = 1
| fac n = n * fac (n-1)

Funkcija je takoðer oslanja na sparivanje uzoraka, va an dio ML programiranja. Imajt


e na
umu da parametri funkcije nisu nu no u zagradama, ali odvojene razmakom. Kada je
funkcija argument je 0 (nula) ona æe se vratiti cijeli broj 1 (jedan). Za sve drug
e sluèajeve
u drugom redu je poku ao. Ovo je rekurzije, te obavlja funkciju sve do osnovnog sc
enarija
je postignut.
Ovo provedbu funkciju faktorijela nije zajamèena raskinuti, jer negativni argument
uzrokuje beskonaène padajuæe lancu rekurzivni pozivi. Vi e robustan provedba èek za
nenegativne argument prije rekurziji, kako slijedi:
fun fact n = let

fun fac 0 = 1

| fac n = n * fac (n - 1)

in

if (n < 0) then raise Fail "negative argument"

else fac n

end
Problematièna sluèaj (kad je n negativna) pokazuje kori tenje ML moæni iznimka sustava.
Funkcija se mo e dodatno pobolj ali pi uæi svojoj unutarnjoj petlji u rep-rekurzivna sti
lu,
kao da stoga ne treba rasti proporcionalno broju funkcije poziva. To se posti e
dodavanjem dodatnih, "akumulator", parametar za unutarnje funkcije. Napokon, dol
azimo
do
fun factorial n = let

fun fac (0, acc) = acc

| fac (n, acc) = fac (n-1, n*acc)

in

if (n < 0) then raise Fail "negative argument"

else fac (n, 1)

end

146
Popis Obrnut
Sljedeæa funkcija "obræe" elemenata u popis. Toènije, vraæa novu listu èiji su elementi u
obrnutom redoslijedu u odnosu na dane popis.
fun reverse [] = []
| reverse (x::xs) = (reverse xs) @ [x]

Ova implementacija obrnutog, dok toèna i jasna, je neefikasan, zahtijeva kvadratni


h
vrijeme za izvr enja. Funkcija se mo e prepisivati izvr iti u linearnom vremenu u slje
deæim
uèinkovitije, iako manje lako za èitanje, style:
fun reverse xs = let
fun rev nil acc = acc
| rev (hd::tl) acc = rev tl (hd::acc)
in
rev xs nil
end

Naime, ova funkcija je primjer polimorfizma parametarskih. To jest, mo e konzumira


ti liste
èiji su elementi svih vrsta, i vratiti liste iste vrste.
Miranda
Miranda je non-strogi èisto funkcionalni programski jezik dizajniran David Turner
kao
nasljednik njegovih ranijih programskih jezika SASL i KRC, koristeæi neke koncepte
iz ML i
nade. Producirao ga je istra ivanje Software Ltd Engleske (koja ima ig na ime Miran
da) i
bila je prva èisto funkcionalni jezik koji se komercijalno podr ana.
Miranda je prvi put objavljena u 1985, kao brza prevoditelja u C-za Unix operaci
jskim
sustavima okusa, s kasnijim tisak u 1987 i 1989. Kasnije Haskell programski jezi
k je slièan
u mnogo naèina da se Miranda.
Pregled
Miranda je lijen, èisto funkcionalni programski jezik. To je, to nema nuspojava i
imperativ
programiranje znaèajke. Miranda program (zove skripta) je skup jednad bi koje defini
raju
razlièite matematièke funkcije i algebarske tipove podataka. Rijeè je va no postaviti ov
dje:
redoslijed jednad bi, opæenito, neva no je, i nema potrebe za definiranje subjekta pri
je
njegove upotrebe.
Buduæi da ra èlanjivanjem algoritam omoguæuje inteligentno kori tenje izgleda
(uvlaèenje), postoji rijetko potreba za pojaèanje izjava i izmjenjivaèi bilo izjave su
obavezna. Ova znaèajka, inspiriran ISWIM se takoðer koristi u Occam i Haskell i kasn
ije
popularizirala Python.
Komentar je uvedena u redoviti skripte koje likovi | | i nastavite do kraja iste
linije.
147
Alternativna komentirajuæi konvenciju utjeèe na cjelokupni kod datoteku izvor, pozna
t kao
"pismen original", u kojima svaki red se smatra komentirajte osim ako poèinje isti
m>
znakom.
Miranda je osnovnih tipova podataka su char, broj i bool. Znakova je jednostavno
popis
char, dok je broj tiho se pretvaraju izmeðu dvije osnovne forme: proizvoljno preci
znosti
cijelih brojeva (tzv. bignums) po defaultu, i redovne s pomiènim zarezom vrijednos
ti prema
potrebi.
Torke su nizovi elemenata potencijalno mije ani tip, analogne zapise u Pascal-kao t
o su
jezici, a razgranièene su napisane sa zagradama:
this_employee = ("Folland, Mary", 10560, False, 35)

Lista umjesto je najèe æe koristi struktura podataka u Mirandu. Pisano je ogranièila


uglatim zagradama i razdvojene zarezom elemenata, od kojih svi moraju biti istog
tipa:
week_days = ["Mon","Tue","Wed","Thur","Fri"]

Popis ulanèavanje je + +, oduzimanje je -, izgradnji je:, dimenzioniranje je # i i


ndeksiranje
je!, Tako da:
days = week_days ++ ["Sat","Sun"]

days = "Nil":days

days!0

"Nil"
days = days -- ["Nil"]
#days
Nakon objavljivanja od strane Miranda Research Software Ltd, 1985, interes za li
jene
funkcionalnim jezicima rastao: od 1987, vi e od desetak ne-strogi, èisto funkcijskih
programskih jezika su postojale. Od tih, Miranda je najèe æe kori tena, ali nije bio u j
avnoj
domeni. Na konferenciji na funkcijske programske jezike i raèunalne arhitekture (F
PCA
'87) u Portland, Oregon, odr an je sastanak na kojem sudionici rasporede u obliku
jak
konsenzus da odbor treba biti formirana za definiranje otvoreni standard za te j
ezike.
Svrha je Odbora za konsolidaciju postojeæe funkcionalne jezika u zajednièkim koja æe
poslu iti kao osnova za buduæa istra ivanja u funkcionalnom jeziku dizajn. [10]
Haskell
Haskell 1,0
Prva verzija Haskell ("Haskell 1.0") je definiran u 1990 [11]. Odbora napori rez
ultirali u
nizu jezika definicije.
148
Haskell 98
Krajem 1997, serija je kulminirao u Haskellu 98, namijenjen za odreðivanje stabiln
o,
minimalan, prenosiv inaèici jezik i prateæih standardne biblioteke za nastavu, te ka
o baza
za buduæe ekstenzije. Odbor izrièito pozdravio stvaranje pro irenja i inaèica Haskell pr
eko
98 dodavanja i ukljuèuje eksperimentalne znaèajke. [10]
U veljaèi 1999, 98 Haskell jezièni standard je izvorno objavljen kao "Haskell 98 Rep
ort".
[10] U sijeènju 2003, revidirana verzija je objavljena kao "Haskell 98 Jezik i knj
i nice:
Revised Report". [12] jezik nastavlja razvijati ubrzano, s Glasgow Haskell Compi
ler (GHC)
provedba koja predstavlja trenutni de facto standard.
Haskell premijer
Poèetkom 2006, postupak definiranja nasljednik Haskell 98 standardu, neformalno zo
ve
Haskell "(" Haskell Prime "), je poèeo. [13] To je u tijeku proces preispitivanja
rastuæi jezik
definiciji, stvarajuæi nova revizija jednom godi nje. Prva revizija, nazvana Haskell
2010,
bio je najavljen u studenom 2009. [14]
Haskell 2010
Haskell 2010 dodaje vanjskih Funkcija suèelje (FFI) u Haskellu, èime povezivanja s
drugim programskim jezicima, popravci neki sintaksa problema (promjene u formaln
a
gramatika) i zabrana takozvani "n-k-plus-uzorci", to jest, definicije oblika Fak
(n +1) = (n
+1) * n fak vi e nisu dozvoljeni. Uvodi jezik-Pragma-sintaksa-ekstenziju koja omog
uæuje
za oznaèivanje Haskell izvor kao Haskell 2010 ili odreðene obveze Pro irenje Haskell
Jezik. Imena ekstenzija uveden u Haskellu 2010 su DoAndIfThenElse,
HierarchicalModules, EmptyDataDeclarations, FixityResolution, ForeignFunctionInt
erface,
LineCommentSyntax, PatternGuards, RelaxedDependencyAnalysis, LanguagePragma,
NoNPlusKPatterns.
Moguænosti
Glavni èlanak: Haskell znaèajke
Vidi takoðer: Glasgow Haskell kompajler # Pro irenje Haskell
Haskell znaèajke sporo vrednovanje, sparivanje uzoraka, liste spoznaja, typeclasse
s, i tip
polimorfizma. To je èisto funkcionalni jezik, to znaèi da se opæenito, funkcija u Haske
llu
nemaju nuspojava. Tu je razlièita tipa za zastupanje nuspojave, ortogonalna o vrst
i
funkcija. Èista funkcija mo e vratiti nuspojava koje su naknadno proveden, modeliran
je
neèistu funkcije drugih jezika.
Haskell je jaka, statièki, vrsta sustava temelji na Hindley-Milner tipa zakljuèak. H
askell
glavni inovacijama na ovom podruèju je dodati tip nastave, koji su izvorno zami ljen
kao
principijelan naèin za dodavanje preoptereæenja na jezik, [15], ali su od prona ao mno
go
vi e koristi. [16]
Tip koji predstavlja nuspojava je primjer monada. Monadama su opæi okvir koji mo e
149
modela razlièite vrste raèunanja, ukljuèujuæi i rukovanje pogre kama, nondeterminism,
parsing, i software transakcijski memorije. Monadama su definirani kao obièni tipo
vima
podataka, ali daje neke Haskell sintaktièka eæera za njihovu upotrebu.
Jezik ima otvoren, objavljeni rad, specifikaciji, [12] i vi estruke implementacije
postoji.
Tu je aktivna zajednica oko jezika, i vi e od 1700 drugih open-source biblioteka i
alata koji
su dostupni u paketu online repozitorij Hackage. [17]
Glavni provedbu Haskell, GHC, je i tumaè i izvorni-prevodilac koja radi na veæini
platforma. GHC je poznata po svojim high-performance provedbu konkurentnosti i
paralelizma, [18] i za to to bogati tip sustava koji ukljuèuju nedavne inovacije, k
ao to su
generalizirana algebarske tipove podataka i Tip obitelji.
Primjer programa u Haskellu
-- using recursion
factorial 0 = 1
factorial n = n * factorial (n - 1)

-- using lists
factorial n = product [1..n]

-- using recursion but written without pattern matching


factorial n = if n > 0 then n * factorial (n-1) else 1

-- using fold
factorial n = foldl (*) 1 [1..n]

-- using only prefix notation and n+k-patterns


factorial 0 = 1
factorial (n+1) = (*) (n+1) (factorial n)

An efficient implementation of the Fibonacci series, as an infinite sequence, is


this:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Logièko programiranje
Logièko programiranje nastalo je kao rezultat radova na mehanièkom dokazivanju
teorema. Jedna od prvih ozbiljnih studija mehanièkog procesa zakljuèivanja napisao j
e u
XVII vijeku matematièar Gottfried Leibniz ("Calculus Ratiocintator"). Nakon rada J
.
Herbranda objavljenog 1930. godine problemu mehanièkog dokazivanja teorema
posveæeno je dosta pa nje. Poveæanje zanimanja koje je rezulturalo podruèjem logièkog
programiranja u dana njem obliku mo e se prouèavati od èlanka J.A.Robinsona
objavljenog 1965. godine, gdje je prvi put opisan princip rezolucije.
Rezolucija je generalizacija principa "modus ponens" i omoguæava kori tenje operacij
a
uporedjivanja i prepoznavanja nazvanih unifikacija (izjednaèavanja).
Poèetkom 70-ih godina ideju kori tenja logike kao programskog jezika razvili su Robe
rt
Kowalski (teoretski) i Maarten van Emden (eksperimentalna demonstracija) u Edinb
urghu,
te Colmerauer (implementacija) u Marseillesu.
Osnovna teza logièkog programiranja prema Kowalskom glasi: "algoritam se mo e korisn
o
150
izraziti sa dvije komponente: logikom i kontrolom."
Logièka komponenta predstavlja izjavu o problemu, o osobinama problema i o rje enju
(" ta" je problem).
Kontrolna komponenta govori o naèinu rje avanja problema ("kako"). Idealni cilj logièk
og
programiranja je da programer specificira samo logièku komponentu algoritma, a o
kontrolnoj se brine raèunar. Taj ideal jo do sada nije postignut. Prednosti logièkog
programiranja su:
·jednostavnije razmi ljanje i zakljuèivanje o problemu,
·jednostavan prikaz metodologije rje avanja problema,
·veæe moguænosti za iskori tavanje pararelizma
·kori tenje jednog uniformnog formalnog sistema mo e imati korisne posljedice na
programski in enjering
Za postizanje ovog cilja treba rije iti dva problema. Prvi problem je kontrola izv
odjenja. Za
sada programer mora osigurati malu kolièinu kontrolnih informacija, djelomièno pravi
lnim
poretkom klauzula i ciljeva u programu, a djelomièno kori tenjem izvanlogièkih osobina
jezika.
Drugi problem jeste problem negacije. Kako samo pozitivne informacije mogu biti
logièke
posljedice baze podataka, za dedukciju negativnih informacija treba koristiti po
sebna
pravila.
Postojeæi interpreteri ne mogu implementirati negaciju, veæ samo problematiène verzije
pravila "negacija preko neuspjeha" (negation by failure).
Terminologija logièkog zakljuèivanja:
Sintaksa logièkog programiranja obuhvaæa slijedeæe pojmove:
·term
·atom, literal
·klauzula oblika Kowalskog je formula oblika A1,...,Ak B1,...,Bn gdje su
i B (i=1,...,k ; t = 1,...,n) atomi. Bse naziva prethodnik ili uslov, a Ai
Aitt
posljedica, zakljuèak, rezultat ili konzekvent.
·konaèna klauzula je formula oblika A B1,...,Bn, gdje su A i Bt atomi. Konaèna klauzula
oblika A naziva se jedinièna klauzula
·ciljna klauzula je formula oblika B1,...,Bn, gdje su Bt atomi.
·Ako je A B1,...,Bn konaèna klauzula tada se A naziva glava, a B1,...,Bn tijelo klauz
ule.
·Hornova klauzula je ciljna ili konaèna klauzula.
Prolog
Prolog je programski jezik koji se koristi za istra ivanje programske logike. Kori
jeni Prologa
(Programming in Logic) su u matematèkoj logici. Osnovna razlika u odnosu na klasiène
,
proceduralno orijentirane jezike je Prologov deskriptivni (opisni) i dekalrativn
i pristup.
Prolog se vrlo uspje no primjenjuje u podruèju umjetne inteligencije ("artificial
engineering") i in enjering znanja ("knowledge engineering").
Prolog je programski jezik baziran na malom skupu osnovnih mehanizama ukljuèujuæi

151
prepoznavanje uzoraka ("pattern matching"), stablaste strukture podataka i autom
atsko
povlaèenje ("backtracking").Ovaj mali skup formira fleksibilnu i djelotvornu progr
amsku
okolinu. Prolog je posebno pogodan za probleme koji ukljuèuju objekte, pogotovo
strukturirane objekte i relacije medju njima, te uglavnom za nenumerièko programir
anje.

Program u Prologu sastoji se od skupa procedura. Svaka procedura definira odredj


en broj
logièki odnos ili predikat.
Procedura se sastoji od jedne ili vi e tvrdnji ili klauzula. Klauzula mo e biti èinjen
ica ili
pravilo,a prikazana je termima.

Term je konstanta, varijabla ili strukutra. Konstante su atomske ili cjelobrojne


(neke verzije
Prologa dozvoljavaju realne brojeve i negativne cijele brojeve). Strukture se po
nekad
nazivaju slo eni termi ("complex terms" ili "compound terms").

Taèna sintaksa terma varira u razlièitim verzijama Prologa ali najèe æe se koristi tako
zvana Edinburgh sintaksa. Atomi se sastoje od alfanumerièkih atoma i znakovnih ato
ma
("sign").
Alfanumerièki atom je skup znakova koji poèinju malim slovom i mogu sadr avati sva
slova, brojeve i znak "_". Atomi znakova su stringovi koji se sastoje od znakova
+,>,?,$,itd.
Takodjer se svaki string okru en znakovima navoda (') smatra atomom. Varijable su
stringovi koji pocinju velikim slovom ili znakom "_". Strukture se sastoje od fu
nktora (koji je
atom) i jedne ili vi e komponenata (koji su termi). Funktor koji ima dimenziju N i
ma N

komponenata. Strukture se oznaèavaju funktorom iza koga slijedi otvorena okrugla


zagrada, a zatim dolazi N komponenata razdvojenih zarezima i zatvorena okrugla
zagrada.
Kao to je reèeno klauzule su èinjenice ili pravila i oznaèavaju se kao termi. Klauzulam
a se
mo e dati deklarativna ili proceduralna interpretacija. Pretpostavimo da su A,B1,.
..,Bn termi.
Pravilo (klauzula):
A :- B1,...,Bn,
u kojoj se Bi naziva cilj (goal) mo e èitati na dva naèina:
·kao deklarativnu izjavu: Dokazivost A proizilazi iz dokazivosti Bi ,
·ili proceduralno: Procedura A mo e se izvesti ako su izvedene sve procedure koje
,...,B pozivaju. Klauzule koje nemaju ciljeva nazivaju se èinjenice.
B1n
Tipovi podataka:
Prolog definira relativno malo tipova podataka, kao to se mo e vidjeti na slici 1.1
. Tip
podatka je jedinstveno odreðen sintaksom. Varijable se od atoma razlikuju po velik
om
poèetnom slovu, i mogu biti vezane za objekt bilo kojeg tipa ukljuèujuæi i neku drugu
nevezanu varijablu.

Atomi mogu imati jedan od sljedeæa tri oblika:


1.niz slova, brojeva i znakova "_" koji poèinju malim poèetnim slovom (jedan, dva, x
_Z5_y)
2.niz specijalnih znakova (<__>, ..., ::=)

152
3.niz znakova unutar literala ('Bosna', 'Sarajevo')

Brojevi mogu biti cijeli ili sa pomiènim zareom, uz prikaz koji se koristi u ostal
im
programskim jezicima.

Dozvoljeni oblik varijabli je niz slova, brojeva, i znak "_", koji poèinje ili vel
ikim slovom ili
znakom "_".

Strukture su objekti koji se sastoje od vi e komponenata. Primjer takvog objekta b


io bi
datum(17,oktobar,2001). U ovom primjeru, datum predstavlja ime strukture (tzv. F
unktor),
dok su objekti odvojeni zarezom u zagradama.
Funktor je definisan imenom koje ima sintaksu atoma i brojem argumenata.

Unifikacija:
Unifikacija je najèe æe kori tena operacija nad podacima. Dva izraza se medjusobno
mogu unificirati (prilagoditi) ako su ili identièni, ili mogu postati identièni uz o
dgovarajuæa
vezivanja varijabli. Slijede dva primjera unifikacije struktura u kojima _GXXX p
redstavlja
novu varijablu koju u cilju unifikacije uvodi prevodioc:
?-datum(D,M,1983) = datum(D1,april,G)
D=D1=_G283
M=april
G=1983
Opisivanje relacija:
Upotreba èinjenica u Prologu se mo e ilustrirati na primjeru relacije roditelj. Tako
se,
naprimjer, èinjenica da je Armin Jasminov roditelj, mo e predstaviti sljedeæom stavkom
:
roditelj(armin, jasmin)
U prethodnom stavku roditelj oznaèava relaciju, dok armin i jasmin oznaèavaju objekt
e nad
kojima ta relacija vrijedi.
Prethodnom programu se mogu postaviti razna "pitanja". Naprimjer, ako elimo sazna
ti da
li je Armin Ivanov roditelj, mo emo postaviti upit:

?- roditelj(armin, ruzica)
No
Znak "?-" oznaèava da je Prolog spreman za "pitanje", dok je "No" dobiveni odgovor
.
Opisivanje pravila:
Pravilima se na temelju postojeæih relacija definiraju nove. Mo e se reæi da svako pra
vilo
definira jednu uzroèno posljediènu vezu. Tako se na temelju relacije roditelj iz pre
thodnog
primjera te novih dviju elementarnih unarnih relacija musko i zensko, mogu opisa
ti nove
relacije majka i otac.
roditelj(armin, jasmin)
153
musko(armin)
....
otac(X,Y) :roditelj(
X,Y), musko(X)

Rekruzivna pravila:
Veliki broj problema u raèunarstvu se rje ava iterativnim pristupom. U konvencionaln
im
jezicima, ti problemi se opisuju programskim petljama. U Prologu se, medjutim, o
ni
prirodno opisuju rekruzijom.
Najjednostavnija primjena rekruzije je modeliranje rekruzivnih relacija. Slijedeæi
ilustrativni
program iz pro log primjera roditelj mo e se definirati rekruzivna relacija predak:
% predak je roditelj
predak(X,Y) :

roditelj(X,Y).
% ... ali i roditelj od bilo kojeg drugog predaka
roditelj(X,Z)
roditelj(Y,Z),
Relacija predak je opisana sa dva stavka to znaèi da vrijedi ako je zadovoljen bilo
koji od
njih. Vi e stavki koji definiraju jednu relaciju èine proceduru.
Operatorska sintaksa predikata i strukutra:
Operatorski prikaz je posebno pogodan za èitko predstavljanje èestih operacija:
2*a + b*c, (*).
U izrazu (*), + i * predstavljaju operatore, dok su 2,a,b,c njihovi argumenti. I
zraz (*) se u
Prologu standardno mo e predstaviti strukturiranim objektom, u tkz. prefiksnom obl
iku sa
zagradama:
+(*(2,a), (b,c)), (**)
gdje su + i * funktori, a 2,a,b,c atomi.
Artimetièke operacije:
Prolog nije namjenjen za opisivanje numerièkih postupaka. Zato je podr ka za numerièke
operacije u Prologu relativno skromna,a temelji se na evaluacijskom predikatu is
/2.
Predikat is/2 vraæa istinu ako mu se prvi argument mo e unificirati sa artimetièkom
vrijedno æu drugog argumenta. Pri tome drugi argument mo e biti i slo en aritmetièki
izraz, èija vrijednost se odredjuje ugradjenim procedurama koje su pridru ene
predefiniranim aritmetièkim funktorima (+,*,pi,random,**,sqrt). Buduæi da se vrijedn
ost
aritmetièkog izraza odredjuje konvencionalnim metodama, eventualne varijable u dru
gom
argumentu predikata is/2 moraju biti vezane u trenutku poziva predikata. Nepo tiva
nje tog
ogranièenja dovodi do iznimke, koja obièno rezultira nasilnim prekidom izvodjenja
programa.
?- X=1+2
X=1+2
?- X is 1+2

154
X=3
Izvan-logièke osobine:
Kori tenje Prologa u "stvarnim" aplikacijama zahtjeva ponekad kori tenje jeziènih osob
ina
koje ne ulaze u èistu logiku.Ove osobine omoguæene su ugradjenim predikatima koji se
mogu klasificirati u pet kategorija: aritmetièki predikati i operatori, baratanje
znakovnim
nizovima, ulaz i izlaz, predikati za modificiranje programa i kontrola izvodjenj
a.
Ulaz i izlaz su potrebni zbog komunikacije s korisnikom. Ulazno/izlazne operacij
e
karakterizirane su popratnim djelovanjem pa su stoga izvan-logièke.
Ugradjeni predikati za modificiranje programa koriste se za dodavanje i brisanje
klauzula iz
baze podataka. Na taj je nacèin moguæe napraviti samomodificirajuæe procedure.
Primjeri u Prologu:
Primjer programa Hello world:
?- write('Hello World!'), nl.
Primjer programa Quicksort(algoritam za sortiranje):
partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :

(
X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)

).

quicksort([]) --> [].

quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).

Primjer programa za trazenja najveæeg zajednièkog djelitelja i najmanji zajednièkog


sadr aoca:
gcd(X,0,X).
gcd(X,Y,D) :- R is X mod Y, gcd(Y,R,D).
lcm(X,Y,M) :-gcd(X,Y,D),M is (X*Y)/D
Primjer programa Fibonaæijevi brojevi:
fib(1,1)
fib(2,1)
fib(N,R) :-N >= 3, N1 is N-1, N2 is N-2,
fib(N1,R1), fib(N2,R2),R is R1+R2

155
156

You might also like