Pascal (programski jezik)Pascal je programski jezik nastao na ETH Zürich institutu 1970. godine. Dizajnirao ga je Niklaus Wirth, švicarski računalni znanstvenik, i nazvao prema francuskom filozofu, fizičaru i matematičaru, Blaiseu Pascalu, koji je 1641. izumio mehanički kalkulator. Pascal je imperativni programski jezik, prvobitno s proceduralnim, i nekim funkcijskim mogućnostima, a kasnije je preko svojih varijanata i dijalekata evoluirao u jezik koji podržava objektno-orijentirano programiranje. Svojevremeno je smišljen s namjerom da omogući i popularizira strukturirano programiranje, koje je u doba dominacije Fortrana bilo relativno nepopularna programska paradigma. Nastao je po uzoru na Algol, najstariji strukturirani programski jezik, kao neizravna posljedica i "kolateralna korist" pokušaja da se Algol 60 varijanta izmijeni i poboljša. HistorijaNiklaus Wirth je bio član Radne skupine 2.1 (Working Group 2.1), koja je od 1963. radila na izmjeni jezika Algol 60, s ciljem da se razvije i standardizira njegova nova i naprednija varijanta. Unutar WG-2.1 došlo je do podjele na dvije frakcije: "teoretičari" (Algol Y grupa) su zahtijevali snažan programski jezik s ogromnim brojem mogućnosti, dok su "praktičari" (Algol X grupa), s izkustvom u implementaciji programskih jezika, imali stoga umjerenije, minimalističke ambicije. Wirth je, kao "praktičar", 1965. godine predstavio svoju verziju izmjena, koja je kasnije pod njegovim vodstvom implementirana na IBM 360/50 računalu i koja je od 1966. postala poznata pod nazivom Algol-W, dok je Algol Y skupina nastavila u smjeru koji će kasnije završiti kao standard Algol 68, konačno implementiran 1972.[1] Medjutim, nezadovoljan praksom krpljenja postojećih jezika, kao i glomaznoću te nepotrebnim mogućnostima Algola, odlučio je "prekinuti kompatibilnost" i počeo od 1968. na bazi Algola raditi sasvim novi programski jezik, Pascal, koji je objavio 1970. godine.[2][3] Prvi Pascal prevodilac bio je napisan u Fortranu za CDC 6000 računalo. Druga verzija prevoditelja je napisana u samom programskom jeziku Pascal i objavljena 1971. godine (The Programming Language Pascal, Acta Informatica, 1, 35-63, 1971 i The Design of a Pascal Compiler, Software - Practice and Experience, 1, 309-333, 1971). Poboljšana verzija Pascala objavljena je 1973. u obliku formalizirane sintakse BNF (Hoare & Wirth: An Axiomatic Definition of the Programming Language Pascal, Acta Informatica, 2, 335-355, 1973). Godine 1974. objavljena je sredjena verzija (Pascal User Manual and Report) koja je uzeta kao osnova za standard jezika objavljen 1983. (ISO 7185:1983).[3] Pascal je brzo postao popularan i tražen zbog svoje jednostavnosti. Kao jezik koji je zadovoljavao najosnovnije zahtjeve strukturiranoga programiranja, bio je idealan izbor za učenje ove discipline kodiranja, kao i programiranja općenito. Napori mnogih univerziteta u svijetu da se prenese Pascal s IBM-a na druge računarske platforme doprinijeli su rapidnoj popularizaciji novoga programskoga jezika. Da bi se olakšao prijenos Pascala na različite platforme, smišljen je koncept hipotetičkoga računala (danas to zovemo virtualni stroj); Pascal kompilator, odnosno njegov kôd-generator je emitirao p-kod (skr. od pseudo-code, sad se to zove bytecode); p-kod se izvršavao na emulatoru koji je bilo relativno lako napisati u asembleru za bilo koju arhitekturu računala, tako da nije trebalo iznova programirati kompilator (parser, generator kôda itd), nego samo interpreter p-kôda ("emulator"), na kojem se onda mogao pokretati i originalni Pascal kompilator (u p-kodu). Ovakva metoda je mnogo doprinijela brzom širenju Pascala.[2] Pascal prevodilac bio je poslan, izmedju ostalih, i na University of California u San Diegu, gdje je nastala varijanta UCSD Pascal i u njemu kodirani p-System virtualni stroj.[2] p-System se moglo prenijeti na veliki broj tadašnjih računala zahvaljujući činjenici da je trebalo programirati samo dijelove specifične za hardver. Program preveden UCSD-Pascalom u vidu p-koda mogao se izvršavati na svakom računalu koje ima p-System. U isto vrijeme (1972) Dennis Ritchie napravio je programski jezik C za prvu verziju UNIX operacijskoga sistema na DEC PDP-7 računalu, po uzoru na nešto stariji B jezik Kena Thompsona, njegova radnoga kolege na AT&T Bell Labs.[4] C je bio zasnovan na istoj proceduralnoj filozofiji kao i Pascal; za razliku od prvobitnoga Pascala, C je podržavao i osnovne tipove podataka kao što su realni brojevi dvostruke preciznosti ( Prvi masovno dostupni komercijalni Pascal kompajler bio je Turbo Pascal kompanije Borland, za operacijske sisteme CP/M i DOS. Turbo Pascal je kao prvo integrirano razvojno okruženje (IDE) omogućio lakši i brži razvoj softvera objedinjavanjem u jednu cjelinu editora, kompajlera i drugih pomoćnih programa (Grep, Make, Touch itd); masovnu popularnost dugovao je i svojoj relativno maloj cijeni od pedesetak dolara.[5] Operacijski sistemi za Apple računala Lisa i Macintosh s kraja sedamdesetih i početka osamdesetih bili su programirani u Pascalu,[7] zbog čega pisanje programa u C-u za navedene sisteme nije imalo smisla, jer su programi morali raditi s tipovima podataka koje podržava standardni Pascal kao i API Apple OS-a. Prvobitni Object Pascal je najprije nastao u tvrtki Apple Computers, gdje je služio za sistemsko i aplikacijsko programiranje. Kasnije je Object Pascal implementiran u Borlandu, kroz komercijalne varijante Turbo Pascal i Delphi. Programska paradigma PascalaPascal svojom paradigmatskom filozofijom i dizajnom potencira strukturirano programiranje, pristup kodiranju gdje se podatci (i njihove deklaracije) strogo razdvajaju od direktiva, procedura i funkcija koji vrše obradu tih podataka. Strukturiran program je program koji je temeljito razradjen kao skup akcija nad definiranim skupom podataka, a struktura podataka zapravo definira strukturu programa.[3] Prije pojave Pascala dominirali su nestrukturirani, sekvencijalni programski jezici kao što su Fortran i Basic, u kojima je kontrola toka bila riješena upotrebom goto naredbe i označavanjem programskih linija rednim brojevima, u nedostatku proceduralnoga ili bilo kakva strukturalnoga rješenja u dizajnu jezika. Proceduralni i funkcijski model u Pascalu znači da se programski tok može implementirati podjelom programa na podprograme (procedure i/ili funkcije), da bi se na taj način povećala modularnost i mogućnost recikliranja manjih abstrakcijskih cjelina programskoga kôda. Treba napomenuti da je funkcijski model u Pascalu podržan tek uvjetno rečeno, zato što funkcije u Pascalu, kao i u drugim proceduralnim jezicima, nisu čiste funkcije u smislu funkcijske paradigme programiranja, jer osim što evaluiraju izraze i vraćaju neku vrijednost, dopuštaju unutar sebe direktive i promjene stanja (side-effects); takve funkcije se suštinski ne razlikuju od imperativnih procedura, pa se mogu isto tako implementirati i kao procedure s varijabilnim parametrima. Pascal je strogo-tipizirani jezik, što znači da ne dopušta upotrebu pojedinoga tipa podatka na mjestu gdje operator ili funkcijski odnosno procedurni parametar zahtijeva drugačiji tip. Izuzetak su kompatibilni tipovi, kao što su recimo Sintaksa Pascala![]() Pascal spada u programske jezike kod kojih je kapitalizacija nebitna, što znači da se bilo koji identifikator ili rezervirana, ključna riječ (keyword) može napisati na različitim mjestima naizmjenično malim ili velikim slovima, ili kombinirano, bez ikakve razlike; prevodilac u svakom slučaju smatra da se radi o istom identifikatoru ili će prepoznati rezerviranu riječ bez obzira kako je kapitalizirana. Jezici kao što su C, C++, C# i Java razlikuju identifikatore i po kapitalizaciji naziva, pa je promjena samo jednoga slova iz maloga u veliko ili obrnuto, dovoljna da kompajler prijavi grešku, jer ne prepoznaje varijablu ili direktivu. Osnovni elementi Pascal programa su direktive ili naredbe (engl. statement), koje se mogu sastojati od izraza (ekspresija) i drugih direktiva. Izrazi se sastoje od operatora i operanada. Operandi mogu biti literalne (doslovne) vrijednosti, ili reference identifikatora. U direktive spadaju deklaracije (konstanti, varijabli, labela, procedura i funkcija), definicije (tipova podataka, procedura, funkcija), te tri osnovne vrste naredbi za sekvenciju (tok), iteraciju (ponavljanje) i selekciju (izbor). Deklaracije podatakaPascal je programski jezik koji s obzirom na svoju strogo strukturiranu paradigmatsku opredijeljenost zahtijeva deklariranje svih podataka prije nego što se oni u programu referenciraju. Ovo je način da se postigne čitljivost i modularna upotrebljivost programskoga kôda, kao i odredjena vrsta programerske discipline. Ovakva filozofija programiranja je dosta različita od pristupa mnogih interpretiranih i skriptnih programskih jezika (od Basica do JavaScripta i drugih dinamičkih jezika), koji dopuštaju implicitno referenciranje varijabli bez deklaracija, ili čak implicitnu promjenu tipa (tzv. loose-typing). Osnovne vrste direktiva za opis podataka u Pascalu su deklaracije konstanata, varijabli i definicije tipova. Konstante su identificirane doslovne (literalne) vrijednosti čijim se referenciranjem u programu ekspandira njihova (alfa)numerička vrijednost i na taj način se izbjegava višestruko uredjivanje na svim mjestima u programu gdje se ta vrijednost koristi. Deklariraju se direktivom Varijable se deklariraju direktivom Izvedeni tipovi podataka definiraju se direktivom const
PROG_NAME = 'PhoneBook v1.0';
PROG_FILE = 'pb.db';
MAX_ITEMS = 1024;
type
TShortString = array [1..64] of Char;
TPhoneString = array [1..14] of '0'..'9';
PPhoneBookPt = ^TPhoneBookEntry;
TPhoneBookEntry = record
Name: TShortString;
Phone: TPhoneString;
Email: string;
Address: string;
Link: PPhoneBookPt;
end;
var
PhoneBookEntry: TPhoneBookEntry;
FPhoneBookData: file of TPhoneBookEntry;
procedure AddNewEntry; forward;
Definicije tipova ( Generalno, u Pascalu svaka direktiva koja se poziva na neki identifikator zahtijeva da taj identifikator bude unaprijed deklariran ili definiran. Za potrebe referenciranja procedure ili funkcije prije njezine implementacije koristi se direktiva Vrste podatakaTipovi podataka u Pascalu dijele se na osnovne (skalarne) i strukturirane (izvedene), koji se uglavnom definiraju kao polja i slogovi sastavljeni od osnovnih ili drugih strukturiranih podataka. Osnovni tipoviSkalarne vrste podataka u Pascalu su:
Nadalje, pojedini tipovi podataka se klasificiraju kao ordinarni, što znači da se mogu sortirati prema veličini i manipulirati standardnim funkcijama Strukturirani tipoviU strukturirane vrste podataka spadaju:
Posebni tipovi
Pokazivač je metapodatak koji ukazuje na adresu nekoga podatka u memoriji. Ovisno o tome pokazuju li na specifični tip podatka ili na memorijsku lokaciju s nedefiniranim tipom podataka, pokazivači se dijele na tipizirane i generičke.[9] Generički pokazivači se deklariraju pomoću tipa podataka Slično kao što se za tipizirane pokazivače objekt u memoriji stvara i briše procedurama procedure GetMem(var P: Pointer; Size: Word);
procedure FreeMem(var P: Pointer; Size: Word);
Usmjeravanje pokazivača na adresu neke varijable, odnosno očitavanje te adrese i njezino zapisavanje u pokazivač vrši se operatorom Referenciranjem (pozivanjem) samoga imena pokazivača dobije se adresa varijable na koju on pokazuje, a stavi li se operator Dakle, ukratko:
Za informaciju o količini memorije koju zauzima neki tip varijable ili objekta postoji funkcija type
Hobbit = Boolean;
HoByte = array [1..8] of Hobbit;
{ 1 HoByte = 8 Hobbit }
begin
WriteLn(' Byte = ', SizeOf(Byte));
WriteLn('ShortInt = ', SizeOf(ShortInt));
WriteLn('SmallInt = ', SizeOf(SmallInt));
WriteLn(' LongInt = ', SizeOf(LongInt));
WriteLn(' Int64 = ', SizeOf(Int64));
WriteLn;
WriteLn(' HoByte = ', SizeOf(HoByte), ' Hobbit');
end.
Navedeni program, ovisno o prevoditelju, operacijskom sistemu i arhitekturi računala može prikazivati različite rezultate (s tim da će EnumeracijeEnumeracije ili pobrojani tip su izvedeni ordinarni tip podataka. Npr:[12] type
TMonth = (Jan, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec);
Tipovi dosegaPascal podržava varijable u odredjenom dosegu (području, podobsegu) nekoga drugoga ordinarnoga tipa podataka: var
SmallNum: 1..128;
SmallLtr: 'a'..'z';
Moguće je takodjer deklarirati varijablu u dosegu enumeriranoga tipa kojega smo predhodno definirali, pa s obzirom na gornji primjer definicije tipa možemo imati: var
Summer: Jun..Aug;
Ista se sintaksa za dosege, naravno, može upotrijebiti i za definiranje tipova: type
TDay = 1..31;
SetoviJedna od distinktivnih karakteristika Pascala u odnosu na druge programske jezike jest podržka za operacije sa skupovima, odnosno tip podataka var
SmallNum: set of 1..128;
SmallLtr: set of 'a'..'z';
Ova vrsta sintaksnoga sladora (engl. sytactic sugar) omogućuje pisanje elegantnijega i konciznijega kôda. Provjera pripadnosti elementa (vrijednosti varijable) nekom skupu vrši se pomoću operatora if Number in [1..128] then
{ ... }
... ili još bolje ovo, s obzirom da smo deklarirali if Number in SmallNum then
{ ... }
... umjesto ovoga: if (Number > 0) and (Number < 129) then
{ ... }
Ovo je naročito zgodno kad treba izvršiti provjeru pripadnosti u većem broju ne-susjednih područja vrijednosti: if Number in [1..5, 17, 23, 25..32] then
{ ... }
Kontrola tokaKonstukcije izbora (grananja), odnosno kontrole toka su If-Then, If-Then-Else i Case. If-ThenIf-Then se upotrebljava za kontrolu toka na osnovi uslova navedena u izrazu iza ključne riječi if Izraz then
Naredba;
Za izvršenje višestrukih naredbi koristi se if Izraz then
begin
Naredba1;
Naredba2;
Naredba3;
{ ... }
end;
If-Then-ElseZa izbor izmedju dvaju mogućih tokova upotrebljava se If-Then-Else konstrukcija; prvi tok izvršava se u slučaju da je izpunjen uslov napisan izmedju if Izraz then
Naredba1
else
Naredba2;
Ovdje vrijedi isto pravilo o zatvaranju blokova višestrukih direktiva izmedju if Izraz then
begin
Naredba1;
Naredba2;
Naredba3;
{ ... }
end { ovdje ne ide ";" }
else
begin
Naredba4;
Naredba5;
Naredba6;
{ ... }
end;
CaseCase konstrukcija se upotrebljava kao preglednija alternativa za višestruko grananje toka, umjesto višestukih if-then direktiva ili if-then-else blokova u koncentričnom, kaskadnom i lančanom stilu. case Varijabla of
1: Naredba1;
2: Naredba2;
3: Naredba3;
4: Naredba4;
{ ... }
else { / otherwise }
Naredba5; { default }
end; { case }
Navedeni if Varijabla = 1 then
Naredba1
else if Varijabla = 2 then
Naredba2
else if Varijabla = 3 then
Naredba3
else if Varijabla = 4 then
Naredba4
else
Naredba5; { default }
Sekvencija tokaU Pascalu svaka direktiva mora završavati znakom Izuzetak je i zadnja direktiva prije ključne riječi Za rezerviranu riječ Blokovi direktiva u Pascalu se zatvaraju izmedju ključnih riječi Zadnja PetljeDirektive ponavljanja ili petlje su for Brojac := X to Y do
Naredba;
for Brojac := X to Y do
begin
{ blok };
end;
while Izraz do
Naredba;
while Izraz do
begin
{ blok };
end;
repeat
{ naredba / blok }
until Izraz;
Petlja OperatoriOperatori se dijele, s obzirom na to koliko operanda obradjuju, na unarne (jedan operand) i binarne (dva operanda). Pascal koristi operator Slijedi popis operatora u Pascalu.[13] Aritmetički operatori+ : sabiranje; - : oduzimanje; * : množenje; / : dijeljenje; div : cjelobrojno dijeljenje; mod : ostatak cjelobrojnoga dijeljenja (modulus); Relacijski operatori= : jednako; <> : nejednako; < : manje; <= : manje ili jednako; > : veće; >= : veće ili jednako; Logički operatorinot : logička negacija; and : logičko i; or : logičko uključivo ili; xor : logičko izključivo ili (or s negacijom); Operatori bitovashl : lijevo pomjeranje; shr : desno pomjeranje; Ostali operatoriwith : selekcija sloga (record); in : pripadnost skupu (set); to : područje vrijednosti (for petlja); .. : područje vrijednosti (array, set); ^ : deklariranje i dereferenciranje pokazivača; @ : adresiranje pokazivača; := : pridruživanje vrijednosti; Procedure i funkcijePascal razlikuje dvije vrste podprograma, procedure i funkcije. Funkcije za razliku od procedura vraćaju neku vrijednost, pa se prema tipu podataka koji vraćaju razlikuju i tipovi funkcija, što se navodi u deklaraciji. Drugi programski jezici uglavnom sve podprograme nazivaju isto, funkcije (C/C++), subrutine (Basic) itd. Naprimjer, u programskom jeziku C, procedura je obična funkcija koja vraća vrijednost function FileExists(Name: string): Boolean;
procedure PrintFile(Name: string);
ParametriParametri neke funkcije ili procedure su deklarirane unosne vrijednosti, a deklariraju se u u malim zagradama iza imena funkcije ili procedure, na isti način kao i varijable u Parametri mogu biti vrijednostni ili varijabilni. Varijabilni parametri mijenjaju vrijednost varijable pristupajući joj direktno (poziv po referenci) umjesto da rade s njezinom kopijom (poziv po vrijednosti), što se specificira direktivom procedure CheckIfFileExists(Name: string; var Exists: Boolean);
procedure MergeFiles(File1, File2: string; var NewFile: file);
Za razliku od vrijednostnih parametara, varijabilni parametri ne mogu prihvatiti konstantne vrijednosti (recimo neki broj ili string), nego samo identifikatore varijabli koje mijenjaju. Vrijednostni parametri mogu primati obje vrste argumenata, i doslovne vrijednosti, i imena varijabli. GrupiranjeNasuprot većini programskih jezika, Pascal podržava implementiranje podprograma (procedure i/ili funkcije) jedan unutar drugoga. Ova mogućnost se, medjutim, nerado upotrebljava u programerskom svijetu, jer ne doprinosi nimalo čitljivosti i upotrebljivosti izvornoga kôda, čak naprotiv. Preporuke "dobroga stila" programiranja u Pascalu obezhrabruju upotrebu unutarnjega grupiranja procedura za više od jedne razine.[14] Neke implementacije Pascala, kao Delphi, ovu mogućnost ne podržavaju. Postoje, ipak, situacije kad je zgodno implementirati jednu proceduru unutar druge, kao što je slučaj s quick-sort algoritmom u slijedećem primjeru:[15] procedure quicksort(var a: list; Lo,Hi: integer);
procedure sort(l,r: integer);
var
i,j,x,y: integer;
begin
i:=l; j:=r; x:=a[(l+r) DIV 2];
repeat
while a[i]<x do i:=i+1;
while x<a[j] do j:=j-1;
if i<=j then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
i:=i+1; j:=j-1;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin {quicksort};
sort(Lo,Hi);
end;
Standardne procedure i funkcijeI/OStandardne procedure za unos su var
Number: LongInt;
begin
Write('Number? ');
ReadLn(Number);
WriteLn('Number: ', Number);
ReadLn;
end.
Za izpis postoje procedure Aritmetičke operacijeNeke od standardno ugradjenih aritmetičkih funkcija u Pascalu su: abs : absolutna vrijednost broja (broj bez predznaka); exp : potenciranje; sqr : kvadrat; sqrt : kvadratni korijen; ln : prirodni logaritam; sin : sinus; cos : kosinus; tan : tangens; pred : predhodnik cijeloga broja; succ : sljedbenik cijeloga broja; round: zaokruživanje (vraća Integer); trunc: odbacivanje decimala (vraća Integer); int : cijeli dio razlomka (vraća Real); frac : decimalni dio razlomka (vraća Real); Operacije sa stringovimaNeke od standardnih funkcija za rad s nizovima znakova (stringovima): length : duljina stringa; copy : kopiranje stringa; pos : pozicija pojavljivanja podniza u nizu; delete : brisanje znakova; insert : umetanje znakova; str : pretvara broj u string; val : pretvara string u broj ili vraća grešku; Programski primjeriFaktorijelNaredni program računa Faktorijel zadanih brojeva.[16] program factorial;
function fact(n: integer): real;
begin
if (n = 0) then
fact := 1
else
fact := n * fact(n - 1);
end;
var
n: integer;
begin
for n := 0 to 16 do
writeln(n, '! = ', fact(n):-1:0);
end.
Fibonaccijevi brojeviSlijedi program koji izpisuje Fibonaccijev niz.[16] program fibonacci;
function fib(n: integer): integer;
begin
if (n <= 2) then
fib := 1
else
fib := fib(n - 1) + fib(n - 2);
end;
var
i: integer;
begin
for i := 1 to 16 do
write(fib(i), ', ');
writeln('...');
end.
Varijante i dijalekti Pascala
Razvojna okruženjaFreeware
Komercijalna
BibliografijaLiteratura
Digitalni dokumenti
Navodi
|