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 imenovao prema francuzkom filozofu, fizičaru i matematičaru, Blaiseu Pascalu, koji je 1641. izumio mehanički kalkulator.

Pascal je imperativni i proceduralni programski jezik, smišljen s namjerom da omogući i popularizira strukturirano programiranje, a nastao je po uzoru na stariji jezik ALGOL, nakon pokušaja da se isti izmijeni i poboljša.

Kasnije neformalne ekstenzije pod skupnim nazivom Object Pascal proširuju strukturiranu imperativnu paradigmu, omogućujući pored proceduralnoga i objektno-orijentirano programiranje.

PovijestUredi

Niklaus Wirth je sudjelovao u projektu ALGOL X, čija je svrha bila poboljšanje i standardizacija jezika ALGOL 60. Nakon što je njegov prijedlog izmjena pod nazivom ALGOL W odbijen 1968. godine, Wirth napušta projekt i dizajnira novi programski jezik kojega dovršava 1970. Rad na Algolu i Pascalu poduzet je radi prevladavanja problema koji su se javljali programiranjem u dotadašnjim programskim jezicima (FORTRAN, COBOL, ALGOL i BASIC), zbog njihove strogo sekvencijalne i nestrukturirane naravi; postojala je potreba za malim i laganim programskim jezikom za učenje u školama i na sveučilištima koji bi omogućivao strukturirano programiranje, za razliku od BASIC-a koji je isto tako smišljen kao edukativni programski jezik, jer se FORTRAN pokazao kao vrlo težak studentima za učenje.

Prva specifikacija programskoga jezika Pascala objavljena je 1971, sledeća revizija napravljena je 1973. Već od 1972. Pascal se počinje izučavati na sveučilištima kao jezik prikladan za uvod u programiranje.[1] Prvobitna standardizacija jezika dogodila se 1983. (ISO 7185:1983).

Pascal uvodi paradigmu strukturiranoga i proceduralnoga programiranja, što znači da se programski kod razlaže na samostalne strukture - podatke i podprograme, koji se ne izvršavaju nužno u istom redoslijedu kako su i navedeni, niti je potrebno numeriranje redaka kao u sekvencijalnim programskim jezicima (BASIC, ranije specifikacije Fortrana itd), nego se po potrebi pozivaju i izvode. Uvodjenjem podprograma izbjegava se nužnost da program sekvencijalno, to jest redoslijedno izvrši sve blokove koda dok ne dodje do naredbe koja označava kraj programa ili bezuvjetni skok (GoTo), što može uzrokovati probleme pri pisanju ili revidiranju ozbiljnijih programa, jer je korištenje goto naredbe vodilo do nepregledna i nečitljiva koda s jedne strane (fenomen nazvan Špageti-kod), s druge strane zahtijevalo učitavanje čitava programa u memoriju, umjesto pozivanja pojedinačnih procedura prema potrebi.

U isto vrijeme (1972) Amerikanac Dennis Ritchie razvija programski jezik C zasnovan na istoj proceduralnoj filozofiji kao i Pascal, koji je za razliku od prvobitnoga Pascala, podržavao i osnovne tipove podataka kao što su realni brojevi dvostruke preciznosti (double). Kao što je programski jezik C poslužio Kenu Thompsonu i Dennisu Ritchieju za programiranje UNIX-a sedamdesetih godina, tako je UCSD izvedba Pascala korištena na University of California u San Diegu za pisanje p-Systema, prvoga virtualnoga stroja.[2] p-System se moglo prenijeti na veliki broj tadašnjih računala zahvaljujući činjenici da je trebalo samo programirati dijelove specifične za hardver računala. Program preveden na nekom p-stroju pomoću UCSD Pascal prevoditelja može se izvršavati na svakom računalu koje ima p-System.

Operacijski sistemi za Apple računala Lisa i Macintosh s kraja sedamdesetih i početka osamdesetih bili su programirani u Pascalu,[3] 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 proširen, nadopunjen i populariziran u Borlandu, kroz komercijalne verzije jezika Turbo Pascal i Delphi.

Do 1980-ih Pascal je izučavan na većini sveučilišta i fakulteta informatičkoga usmjerenja u svijetu.[4]

Sintaksa PascalaUredi

 
Ilustracija izvornoga koda u Pascalu, kreirana pomoću programskoga tipografskoga podesivača LaTeX

Osnovni elementi Pascal programa su naredbe ili direktive (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), te tri osnovne vrste naredbi za sekvenciju (tok), iteraciju (ponavljanje) i selekciju (izbor).

Po pravilu naredbe moraju završavati znakom točka-zarez (;), osim ako je naredba zadnja u dosegu (bloku, proceduri, funkciji ili programu), u kojem slučaju se može izostaviti, ali je dobra praksa ipak staviti ; iza svake naredbe, zbog eventualnih kasnijih dodavanja novih naredbi. Izuzetak je i zadnja naredba prije ključne riječi else u If-Then-Else konstrukciji, ali u ovom se slučaju može smatrati da je If-Then-Else jedna naredba, posebna vrsta i drugačija od If-Then. Za else naredbu, ako je dio case konstrukcije, ne vrijedi ovaj "izuzetak". Ovo je jedna od karakteristika Pascala koje ga razlikuju od jezika kao što su C i C++, koji zahtijevaju točka-zarez iza svake if-then naredbe, što praktično znači da se else u C/C++ prevodiocima smatra posebnom naredbom, umjesto dijelom jedne strukture If-Then-Else, kao u Pascalu, a točka-zarez služi kao terminator naredbi, umjesto kao separator, što je slučaj u Pascalu.

Blokovi naredbi se zatvaraju izmedju ključnih riječi begin i end, što je još jedna od karakterističnih razlika Pascala u odnosu na jezike C, C++, C#, Java itd, koji koriste vitičaste zagrade { }. Ponekad se u programerskom žargonu ovi jezici nazivaju jezici vitičastih zagrada (engl. curly-brace languages).

Zadnja end naredba u programu završava točkom (.) umjesto točka-zarezom, i to je ujedno naredba zatvaranja bloka glavne procedure programa.

Deklaracije podatakaUredi

Konstante i varijable se deklariraju ključnim riječima const i var.

const
  PROG_NAME = 'Custom Program (C) 2019 by Custom Company';
  MAX_VALUE = 1024;

var
  SomeName: string;
  TheValue: Integer;
  By1, By2: Byte;

Izvedeni tipovi podataka deklariraju se pomoću ključne riječi type i drugih poznatih ili deklariranih tipova podataka. Npr:

type
  TShortString = array [1..128] of Char;

  TPhoneBookEntry = record
    Name: TShortString;
    Address: string;
    Phone: LongInt;
  end;

Naredbe izbora - grananjaUredi

Naredbe za izvršavanje izbora (grananja) toka programa su If-Then, If-Then-Else i Case.

If-ThenUredi

If-Then se koristi za odlučivanje o jednom od mogućih izhoda toka programa na osnovi uslova navedena u izrazu iza ključne riječi if. Ako je uslov izpunjen, izvršava se sledeća naredba ili blok nakon ključne riječi then, a ako nije, programski tok preskače naredbu ili blok iza then direktive, to jest nastavlja s izvršavanjem sledeće naredbe koja nije u sklopu If-Then strukture, ukoliko postoji.

if { izraz } then { naredba };

Za izvršenje višestrukih naredbi koristi se begin { ... } end blok:

if { izraz } then
begin
  { naredba1 };
  { naredba2 };
  { naredba3 };
  { ... }
end;

If-Then-ElseUredi

Za izbor izmedju dvaju mogućih tokova programa koristi se If-Then-Else struktura; prvi tok izvršava se u slučaju da je izpunjen uslov napisan izmedju if (ako) i then (onda), drugi u slučaju da nije, a stoji nakon ključne riječi else (inače):

if { izraz } then { naredba1 } else { naredba2 };

Ovdje vrijedi isto pravilo o zatvaranju blokova višestrukih naredbi izmedju begin { ... } end; direktiva:

if { izraz } then
begin
  { naredba1 };
  { naredba2 };
  { naredba3 };
  { ... }
end { ovdje ne ide ";" }
else
begin
  { naredba4 };
  { naredba5 };
  { naredba6 };
  { ... }
end;

CaseUredi

Case grananje koristi se kao preglednija alternativa za izbor višestrukih izhoda toka programa.

case Varijabla of
  1: { naredba1 };
  2: { naredba2 };
  3: { naredba3 };
  4: { naredba4 };
     { ... etc. }
end; { case }

Naredbe ponavljanja - petljeUredi

Naredbe ponavljanja su for, while i repeat, a njihova upotreba izgleda ovako:

for Counter := X to Y do { naredba };
while { izraz } do { naredba };
repeat { naredba } until { izraz };

Petlja for izvršava neku naredbu ili blok naredbi točno odredjen broj puta, a varijabla brojača se navodi kao područje izmedju dviju cjelobrojnih vrijednosti, oddvojenih ključnom riječju to. Petlja while provjerava neki uvjet naveden u izrazu prije izvršavanja naredbe (engl. statement) ili bloka naredbi, za razliku od repeat petlje, koja najprije izvršava naredbu ili blok najmanje jedanput, a zatim provjerava uvjet u izrazu.

OperatoriUredi

Operatori se dijele, s obzirom na to koliko operanda obradjuju, na unarne (jedan operand) i binarne (dva operanda).

Pascal koristi operator := za pridruživanje vrijednosti, nasuprot jezicima kao što su C ili C++, gdje za to služi obični znak jednakosti (=). U Pascalu je znak = relacijski operator za logičke izraze - ekspresije (C/C++ za to upotrebljava dvostruki znak jednakosti, ==). Ova razlika može dovesti do konfuzije i grešaka u programiranju, naročito kod programera s izkustvom u Pascalu koji tek počinju programirati u jezicima C/C++, jer se izraz if (i = 0) (umjesto if (i == 0)) prevodi u C/C++ kompilatorima kao valjan statement.

Slijedi popis operatora u Pascalu.[5]

Aritmetički operatoriUredi

+    : sabiranje;
-    : oduzimanje;
*    : množenje;
/    : dijeljenje;
div  : cjelobrojno dijeljenje;
mod  : ostatak cjelobrojnoga dijeljenja (modulus);

Relacijski operatoriUredi

=    : jednako;
<>   : nejednako;
<    : manje;
<=   : manje ili jednako;
>    : veće;
>=   : veće ili jednako;

Logički operatoriUredi

not  : logička negacija;
and  : logičko i;
or   : logičko ili;
xor  : logičko ili s negacijom;

Operatori bitovaUredi

shl  : lijevo pomjeranje;
shr  : desno pomjeranje;

Ostali operatoriUredi

with : selekcija sloga (record);
in   : pripadnost skupu (set);
:=   : pridruživanje vrijednosti;

Vrste podatakaUredi

Tipovi 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 tipoviUredi

Skalarne 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 Pred, Succ, Ord. Od osnovnih tipova podataka, u ordinarne spadaju svi osim Real,[6] jer decimalni broj ne može imati predhodnika ili sljedbenika po veličini.

Strukturirani tipoviUredi

U strukturirane vrste podataka spadaju:

Posebni tipoviUredi

Pokazivač je metapodatak koji ukazuje na adresu nekoga podatka u memoriji. Ovisno o tome pokazuju li na specifični tip podatka ili samo na memorijsku lokaciju, pokazivači se dijele na tipizirane i generičke.

EnumeracijeUredi

Enumeracije ili pobrojani tip su izvedeni ordinarni tip podataka. Npr:[7]

type
  TMonth = (January, February, March, April, May, June,
            July, August, September, October, November, December);

Tipovi dosegaUredi

Pascal 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: June..August;

Ista se sintaksa za dosege, naravno, može upotrijebiti i za definiranje tipova:

type
  TDay = 1..31;

SetoviUredi

Jedna od distinktivnih karakteristika Pascala u odnosu na druge programske jezike jest podržka za operacije sa skupovima, odnosno tip podataka set.

var
  SmallNum: set of 1..128;
  SmallLtr: set of 'a'..'z';

Ova vrsta sintaksnoga sladora (engl. sytactic sugar) omogućuje pisanje elegantnijega i konciznijega koda. Provjera pripadnosti elementa (vrijednosti varijable) nekom skupu vrši se pomoću operatora in. Dakle, možemo napisati ovo:

if Number in [1..128] then
  { ... }

... ili još bolje ovo, s obzirom da smo deklarirali SmallNum:

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
  { ... }

Procedure i funkcijeUredi

Pascal 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, subrutine itd. Naprimjer, u programskom jeziku C, procedura je obična funkcija koja vraća vrijednost void (ništa). Primjeri deklaracija procedure i funkcije, bez definicija:

function FileExists(Name: string): Boolean;
procedure PrintFile(Name: string);

ParametriUredi

Parametri 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 var sekcijama programa.

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 ključnom riječju var izpred deklaracije parametra.

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.

Standardne procedure i funkcijeUredi

I/OUredi

Standardne procedure za unos su Read i ReadLn; Read zahtijeva najmanje jedan parametar, naziv varijable čija se vrijednost učitava, dok ReadLn pravi novi redak za svaku učitanu varijablu. Primjer:

var
  Number: LongInt;

begin
  Write('Number? ');
  ReadLn(Number);
  WriteLn('Number: ', Number);
  ReadLn;
end.

Za izpis postoje procedure Write i WriteLn. Razlika izmedju njih je u tome što ova druga izpisuje tekst skupa sa prijelomom reda (linije), odnosno znakom za novi red (CR/LF).

Aritmetičke operacijeUredi

Neke 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 stringovimaUredi

Neke od 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 primjeriUredi

Fibonaccijevi brojeviUredi

Slijedi program koji izpisuje Fibonaccijev niz.[8]

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.

FaktorijelUredi

Naredni program računa Faktorijel zadanih brojeva.[9]

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.

Varijante i dijalekti PascalaUredi

  • Turbo Pascal - Uvodi mogućnosti kojih nema u ISO varijanti: programske module (počev od verzije Turbo Pascal 4.0), podržku za OOP (s verzijom Turbo Pascal 5.5).[10]
  • Object Pascal - Objektno orijentirani Pascal, danas zastupljen u dvama dijalektima: Delphi i Free Pascal. Object Pascal prvi put je implementiran na Apple računalima 1985.[11]

Razvojna okruženja za programiranje u PascaluUredi

FreewareUredi

  • Lazarus IDE - Grafičko sučelje za Free Pascal Compiler (FPC) i vizualno Pascal/Delphi programiranje. Podržava Windows, Linux i MacOS. Lazarus je skoro u podpunosti o API-ju neovisna platforma, tako da se jedanput napisan izvorni kôd može prevoditi na svim sistemima s FPC-om ("Napiši jedanput, kompiliraj svugdje"[12]) [link]
  • MSEide - još jedan Free Pascal IDE, za Linux i Windows, no puno jednostavniji i manji od Lazarusa. [link]
  • Virtual Pascal - Samostalan projekt autora Allana Mertnera i Vitalyja Miryanova od 1995 do 2005. Virtual Pascal je razvojno okruženje za Windows i OS/2 s eksperimentalnom podržkom za Linux. Virtual Pascal Compiler (VPC) može linkovati 32-bitne egzekutivne datoteke za Windows (PE) i OS/2; u podpunosti je kompatibilan s Turbo Pascalom, dok VP IDE editor izgledom imitira Turbo Pascal IDE, pa je zbog svega toga VP svojevrstna prilagodba TP-a s 16-bitnoga DOS-a na 32-bitni Windows. [link] na arhiviranu web stranicu; Softpedia link za preuzimanje zadnje verzije 2.1.279 iz 2004.
  • Pascal Gladiator IDE - IDE za FPC na MacOS platformi; autor Gladiatora Ryan Joseph tvrdi da ga programira za osobnu uporabu i nudi bezplatno za download i korištenje kao jednostavniju alternativu XCode editoru na MacOS-u. [link].

KomercijalnaUredi

Dokumenti i drugi resursiUredi

NavodiUredi