Pascal (programski jezik) – razlika između verzija

Izvor: Wikipedija
Prijeđi na navigaciju Prijeđi na pretragu
Uklonjeni sadržaj Dodani sadržaj
m Update syntaxhighlight tags - remove use of deprecated <source> tags
m Poništena izmjena 40987430 korisnika DannyS712 (razgovor)
oznake: poništenje mobilno uređivanje mobilno veb-uređivanje napredna mobilna izmjena
Red 45: Red 45:
''Konstante'' i ''varijable'' se deklariraju ključnim riječima <code>const</code> i <code>var</code>.
''Konstante'' i ''varijable'' se deklariraju ključnim riječima <code>const</code> i <code>var</code>.


<syntaxhighlight lang="pascal">
<source lang="pascal">
const
const
PROG_NAME = 'Custom Program (C) 2019 by Custom Company';
PROG_NAME = 'Custom Program (C) 2019 by Custom Company';
Red 54: Red 54:
TheValue: Integer;
TheValue: Integer;
By1, By2: Byte;
By1, By2: Byte;
</source>
</syntaxhighlight>


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


<syntaxhighlight lang="pascal">
<source lang="pascal">
type
type
TShortString = array [1..128] of Char;
TShortString = array [1..128] of Char;
Red 67: Red 67:
Phone: LongInt;
Phone: LongInt;
end;
end;
</source>
</syntaxhighlight>


=== Naredbe izbora - grananja ===
=== Naredbe izbora - grananja ===
Red 75: Red 75:
''If-Then'' se koristi za odlučivanje o jednom od mogućih ishoda toka programa na osnovi uvjeta navedena u ''izrazu'' iza ključne riječi <code>if</code>. Ako je uvjet ispunjen, izvršava se sljedeća naredba ili blok nakon ključne riječi <code>then</code>, a ako nije, programski tok preskače naredbu ili blok iza <code>then</code> direktive, to jest nastavlja s izvršavanjem sljedeće naredbe koja nije u sklopu ''If-Then'' strukture, ukoliko postoji.
''If-Then'' se koristi za odlučivanje o jednom od mogućih ishoda toka programa na osnovi uvjeta navedena u ''izrazu'' iza ključne riječi <code>if</code>. Ako je uvjet ispunjen, izvršava se sljedeća naredba ili blok nakon ključne riječi <code>then</code>, a ako nije, programski tok preskače naredbu ili blok iza <code>then</code> direktive, to jest nastavlja s izvršavanjem sljedeće naredbe koja nije u sklopu ''If-Then'' strukture, ukoliko postoji.


<syntaxhighlight lang="pascal">
<source lang="pascal">
if { izraz } then { naredba };
if { izraz } then { naredba };
</source>
</syntaxhighlight>


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


<syntaxhighlight lang="pascal">
<source lang="pascal">
if { izraz } then
if { izraz } then
begin
begin
Red 89: Red 89:
{ ... }
{ ... }
end;
end;
</source>
</syntaxhighlight>


==== If-Then-Else ====
==== If-Then-Else ====
Za izbor između dvaju mogućih tokova programa koristi se ''If-Then-Else'' struktura; prvi tok izvršava se u slučaju da je ispunjen uvjet napisan između <code>if</code> (''ako'') i <code>then</code> (''onda''), drugi u slučaju da nije, a stoji nakon ključne riječi <code>else</code> (''inače''):
Za izbor između dvaju mogućih tokova programa koristi se ''If-Then-Else'' struktura; prvi tok izvršava se u slučaju da je ispunjen uvjet napisan između <code>if</code> (''ako'') i <code>then</code> (''onda''), drugi u slučaju da nije, a stoji nakon ključne riječi <code>else</code> (''inače''):


<syntaxhighlight lang="pascal">
<source lang="pascal">
if { izraz } then { naredba1 } else { naredba2 };
if { izraz } then { naredba1 } else { naredba2 };
</source>
</syntaxhighlight>


Ovdje vrijedi isto pravilo o zatvaranju blokova višestrukih naredbi između <code>begin { ... } end;</code> direktiva:
Ovdje vrijedi isto pravilo o zatvaranju blokova višestrukih naredbi između <code>begin { ... } end;</code> direktiva:


<syntaxhighlight lang="pascal">
<source lang="pascal">
if { izraz } then
if { izraz } then
begin
begin
Red 115: Red 115:
{ ... }
{ ... }
end;
end;
</source>
</syntaxhighlight>


==== Case ====
==== Case ====
''Case'' grananje koristi se kao preglednija alternativa za izbor višestrukih ishoda toka programa.
''Case'' grananje koristi se kao preglednija alternativa za izbor višestrukih ishoda toka programa.


<syntaxhighlight lang="pascal">
<source lang="pascal">
case Varijabla of
case Varijabla of
1: { naredba1 };
1: { naredba1 };
Red 128: Red 128:
{ ... etc. }
{ ... etc. }
end; { case }
end; { case }
</source>
</syntaxhighlight>


=== Naredbe ponavljanja - petlje ===
=== Naredbe ponavljanja - petlje ===
Naredbe ponavljanja su <code>for</code>, <code>while</code> i <code>repeat</code>, a njihova upotreba izgleda ovako:
Naredbe ponavljanja su <code>for</code>, <code>while</code> i <code>repeat</code>, a njihova upotreba izgleda ovako:


<syntaxhighlight lang="pascal">
<source lang="pascal">
for Counter := X to Y do { naredba };
for Counter := X to Y do { naredba };
while { izraz } do { naredba };
while { izraz } do { naredba };
repeat { naredba } until { izraz };
repeat { naredba } until { izraz };
</source>
</syntaxhighlight>


Petlja <code>for</code> izvršava neku naredbu ili blok naredbi točno određen broj puta, a varijabla brojača se navodi kao područje između dviju cjelobrojnih vrijednosti, odvojenih ključnom riječju <code>to</code>. Petlja <code>while</code> provjerava neki uvjet naveden u ''izrazu'' prije izvršavanja ''naredbe'' (engl. ''statement'') ili bloka naredbi, za razliku od <code>repeat</code> petlje, koja najprije izvršava naredbu ili blok najmanje jedanput, a zatim provjerava uvjet u izrazu.
Petlja <code>for</code> izvršava neku naredbu ili blok naredbi točno određen broj puta, a varijabla brojača se navodi kao područje između dviju cjelobrojnih vrijednosti, odvojenih ključnom riječju <code>to</code>. Petlja <code>while</code> provjerava neki uvjet naveden u ''izrazu'' prije izvršavanja ''naredbe'' (engl. ''statement'') ili bloka naredbi, za razliku od <code>repeat</code> petlje, koja najprije izvršava naredbu ili blok najmanje jedanput, a zatim provjerava uvjet u izrazu.
Red 208: Red 208:
''Enumeracije'' ili ''pobrojani tip'' su izvedeni ordinarni tip podataka. Primjer:<ref>https://wiki.freepascal.org/Enumerated_types</ref>
''Enumeracije'' ili ''pobrojani tip'' su izvedeni ordinarni tip podataka. Primjer:<ref>https://wiki.freepascal.org/Enumerated_types</ref>


<syntaxhighlight lang="pascal">
<source lang="pascal">
type
type
TMonth = (January, February, March, April, May, June,
TMonth = (January, February, March, April, May, June,
July, August, September, October, November, December);
July, August, September, October, November, December);
</source>
</syntaxhighlight>


==== Tipovi dosega ====
==== Tipovi dosega ====
Pascal podržava varijable u određenom dosegu (području, podopsegu) nekoga drugoga ordinarnoga tipa podataka:
Pascal podržava varijable u određenom dosegu (području, podopsegu) nekoga drugoga ordinarnoga tipa podataka:


<syntaxhighlight lang="pascal">
<source lang="pascal">
var
var
SmallNum: 1..128;
SmallNum: 1..128;
SmallLtr: 'a'..'z';
SmallLtr: 'a'..'z';
</source>
</syntaxhighlight>


Moguće je također deklarirati varijablu u dosegu enumeriranoga tipa kojega smo prethodno definirali, pa s obzirom na gornji primjer definicije tipa možemo imati:
Moguće je također deklarirati varijablu u dosegu enumeriranoga tipa kojega smo prethodno definirali, pa s obzirom na gornji primjer definicije tipa možemo imati:


<syntaxhighlight lang="pascal">
<source lang="pascal">
var
var
Summer: June..August;
Summer: June..August;
</source>
</syntaxhighlight>


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


<syntaxhighlight lang="pascal">
<source lang="pascal">
type
type
TDay = 1..31;
TDay = 1..31;
</source>
</syntaxhighlight>


==== Setovi ====
==== Setovi ====
Jedna od distinktivnih karakteristika Pascala u odnosu na druge programske jezike jest podrška za operacije sa [[Teorija skupova|skupovima]], odnosno tip podataka <code>set</code>.
Jedna od distinktivnih karakteristika Pascala u odnosu na druge programske jezike jest podrška za operacije sa [[Teorija skupova|skupovima]], odnosno tip podataka <code>set</code>.


<syntaxhighlight lang="pascal">
<source lang="pascal">
var
var
SmallNum: set of 1..128;
SmallNum: set of 1..128;
SmallLtr: set of 'a'..'z';
SmallLtr: set of 'a'..'z';
</source>
</syntaxhighlight>


Ova vrsta ''sintaksnog šećera'' (engl. ''sytactic sugar'') omogućuje pisanje elegantnijega i konciznijega koda. Provjera pripadnosti elementa (vrijednosti varijable) nekom skupu vrši se pomoću operatora <code>in</code>. Dakle, možemo napisati ovo:
Ova vrsta ''sintaksnog šećera'' (engl. ''sytactic sugar'') omogućuje pisanje elegantnijega i konciznijega koda. Provjera pripadnosti elementa (vrijednosti varijable) nekom skupu vrši se pomoću operatora <code>in</code>. Dakle, možemo napisati ovo:


<syntaxhighlight lang="pascal">
<source lang="pascal">
if Number in [1..128] then
if Number in [1..128] then
{ ... }
{ ... }
</source>
</syntaxhighlight>


... ili još bolje ovo, s obzirom da smo deklarirali <code>SmallNum</code>:
... ili još bolje ovo, s obzirom da smo deklarirali <code>SmallNum</code>:


<syntaxhighlight lang="pascal">
<source lang="pascal">
if Number in SmallNum then
if Number in SmallNum then
{ ... }
{ ... }
</source>
</syntaxhighlight>


... umjesto ovoga:
... umjesto ovoga:


<syntaxhighlight lang="pascal">
<source lang="pascal">
if (Number > 0) and (Number < 129) then
if (Number > 0) and (Number < 129) then
{ ... }
{ ... }
</source>
</syntaxhighlight>


Ovo je naročito zgodno kad treba izvršiti provjeru pripadnosti u većem broju ne-susjednih područja vrijednosti:
Ovo je naročito zgodno kad treba izvršiti provjeru pripadnosti u većem broju ne-susjednih područja vrijednosti:


<syntaxhighlight lang="pascal">
<source lang="pascal">
if Number in [1..5, 17, 23, 25..32] then
if Number in [1..5, 17, 23, 25..32] then
{ ... }
{ ... }
</source>
</syntaxhighlight>


=== Potprogrami (funkcije i procedure) ===
=== Potprogrami (funkcije i procedure) ===
Pascal razlikuje dvije vrste potprograma, ''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 potprograme nazivaju isto, ''funkcije'', ''subrutine'' itd. Naprimjer, u programskom jeziku ''C'', procedura je obična funkcija koja vraća vrijednost <code>void</code> (ništa). Primjeri deklaracija procedure i funkcije, bez ''definicija'':
Pascal razlikuje dvije vrste potprograma, ''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 potprograme nazivaju isto, ''funkcije'', ''subrutine'' itd. Naprimjer, u programskom jeziku ''C'', procedura je obična funkcija koja vraća vrijednost <code>void</code> (ništa). Primjeri deklaracija procedure i funkcije, bez ''definicija'':


<syntaxhighlight lang="pascal">
<source lang="pascal">
function FileExists(Name: string): Boolean;
function FileExists(Name: string): Boolean;
procedure PrintFile(Name: string);
procedure PrintFile(Name: string);
</source>
</syntaxhighlight>


==== Parametri ====
==== Parametri ====
Red 287: Red 287:
Parametri mogu biti ''vrijednosni'' 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 <code>var</code> ispred deklaracije parametra.
Parametri mogu biti ''vrijednosni'' 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 <code>var</code> ispred deklaracije parametra.


<syntaxhighlight lang="pascal">
<source lang="pascal">
procedure CheckIfFileExists(Name: string; var Exists: Boolean);
procedure CheckIfFileExists(Name: string; var Exists: Boolean);
procedure MergeFiles(File1, File2: string; var NewFile: file);
procedure MergeFiles(File1, File2: string; var NewFile: file);
</source>
</syntaxhighlight>


Za razliku od vrijednosnih parametara, varijabilni parametri ne mogu prihvatiti konstantne vrijednosti (recimo neki broj ili string), nego samo ''identifikatore'' varijabli koje mijenjaju. Vrijednosni parametri mogu primati obje vrste ''argumenata'', i doslovne vrijednosti, i imena varijabli.
Za razliku od vrijednosnih parametara, varijabilni parametri ne mogu prihvatiti konstantne vrijednosti (recimo neki broj ili string), nego samo ''identifikatore'' varijabli koje mijenjaju. Vrijednosni parametri mogu primati obje vrste ''argumenata'', i doslovne vrijednosti, i imena varijabli.
Red 298: Red 298:
Standardne procedure za unos su <code>Read</code> i <code>ReadLn</code>; <code>Read</code> zahtijeva najmanje jedan parametar, naziv varijable čija se vrijednost učitava, dok <code>ReadLn</code> pravi novi redak za svaku učitanu varijablu. Primjer:
Standardne procedure za unos su <code>Read</code> i <code>ReadLn</code>; <code>Read</code> zahtijeva najmanje jedan parametar, naziv varijable čija se vrijednost učitava, dok <code>ReadLn</code> pravi novi redak za svaku učitanu varijablu. Primjer:


<syntaxhighlight lang="pascal">
<source lang="pascal">
var
var
Number: LongInt;
Number: LongInt;
Red 308: Red 308:
ReadLn;
ReadLn;
end.
end.
</source>
</syntaxhighlight>


Za ispis postoje procedure <code>Write</code> i <code>WriteLn</code>. Razlika između njih je u tome što ova druga ispisuje tekst skupa sa prijelomom reda (linije), odnosno znakom za novi red (<code>CR/LF</code>).
Za ispis postoje procedure <code>Write</code> i <code>WriteLn</code>. Razlika između njih je u tome što ova druga ispisuje tekst skupa sa prijelomom reda (linije), odnosno znakom za novi red (<code>CR/LF</code>).
Red 334: Red 334:
Najjednostavniji program koji ispisuje pozdrav na zaslonu:
Najjednostavniji program koji ispisuje pozdrav na zaslonu:


<syntaxhighlight lang="pascal">
<source lang="pascal">
program DobarDan;
program DobarDan;


Red 341: Red 341:
ReadLn;
ReadLn;
end;
end;
</source>
</syntaxhighlight>


=== Fibonaccijevi brojevi ===
=== Fibonaccijevi brojevi ===
Red 347: Red 347:
Program koji ispisuje [[Fibonaccijev niz]]:<ref>http://progopedia.com/language/pascal/</ref>
Program koji ispisuje [[Fibonaccijev niz]]:<ref>http://progopedia.com/language/pascal/</ref>


<syntaxhighlight lang="pascal">
<source lang="pascal">
program fibonacci;
program fibonacci;


Red 367: Red 367:
writeln('...');
writeln('...');
end.
end.
</source>
</syntaxhighlight>


=== Faktorijel ===
=== Faktorijel ===
Naredni program računa [[Faktorijel]] zadanih brojeva:<ref>http://progopedia.com/language/pascal/</ref>
Naredni program računa [[Faktorijel]] zadanih brojeva:<ref>http://progopedia.com/language/pascal/</ref>


<syntaxhighlight lang="pascal">
<source lang="pascal">
program factorial;
program factorial;


Red 390: Red 390:
writeln(n, '! = ', fact(n):-1:0);
writeln(n, '! = ', fact(n):-1:0);
end.
end.
</source>
</syntaxhighlight>


== Varijante i dijalekti Pascala ==
== Varijante i dijalekti Pascala ==

Verzija na datum 28 juni 2021 u 16:02

Pascal je programski jezik nastao na ETH Zürich institutu 1970. godine. Dizajnirao ga je Niklaus Wirth, švicarski računalni znanstvenik, i imenovao prema francuskom 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. Veliku popularnost stekao je tokom 70-ih i 80-ih godina 20. stoljeća, zahvaljujući svojoj zastupljenosti kao jezika na kojem se podučavalo programiranje na sveučilištima.

Kasnija izvedba jezika, Object Pascal, proširuje strukturiranu imperativnu paradigmu, omogućujući pored proceduralnoga i objektno-orijentirano programiranje.

Povijest

Rani razvoj

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 koji dovršava 1970. Rad na Algolu i Pascalu poduzet je radi savladavanja poteškoća koje su se javljale 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, sljedeć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 potprograme, 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. Uvođenjem potprograma izbjegava se nužnost da program sekvencijalno, to jest redoslijedno izvrši sve blokove koda dok ne dođe 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 isprogramirati module 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.

Sedamdesetih godina Pascal stiče veliku popularnost jer se puno koristi za aplikacijsko i sistemsko programiranje. 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 puno smisla, jer su programi morali biti pisani tako da rade 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]

Borlandov Pascal

Godine 1983. pojavljuje se Turbo Pascal tvrtke Borland, prvo integrirano razvojno okruženje (IDE) za sisteme CP/M i DOS.[5] Turbo Pascal objedinjuje sve funkcije ciklusa razvoja softvera u jedan cjelovit program (pisanje koda, kompilacija, linkovanje, ispravljanje grešaka). To je doprinijelo još većoj popularizaciji Pascala u softverskoj industriji, jer su programeri do tad morali pokretati zasebno nekoliko različitih programa (editor, kompilator, linker) da bi dovršili konačan program. IDE Turbo Pascal je mnogo korišten, kako zbog mogućnosti velike uštede vremena pri razvoju softvera, tako i zbog svoje povoljne cijene i "knjižne licence" koja je omogućivala kupovinu samo jedne kopije proizvoda bez obzira na broj instalacija. Osim Turbo Pascala, Borland je prodavao i skuplju varijantu IDE-a pod nazivom Borland Pascal koja se od Turbo Pascala neznatno razlikovala po mogućnostima i imala uključen izvorni kod standardnih modula. Vremenom se Turbo Pascal razvija kao zasebna varijanta programskoga jezika i ostaje u širokoj uporabi sve do početka devedesetih, kada Pascal gubi prvenstvo u odnosu na C++ i Javu. Već 1999. Pascal je zamijenjen C-plus-plusom kao standardom na svim američkim sveučilištima.[6]

Od novosti koje uvodi Borland u Turbo Pascal dijalekt značajna je mogućnost dijeljenja koda na odvojene datoteke, takozvane module (unit). Ovaj koncept preuzet je iz Pascalu slična programskoga jezika Modula, odnosno Modula-2[7] (kasnija revizija jezika), za čije je kreiranje također zaslužan Niklaus Wirth, autor prvobitnoga Pascala. Mogućnost je dodana počev s verzijom 4.00 Turbo Pascal IDE-a, a u programski paket sadržavao je i standardnu zbirku modula, spočetka u jednoj datoteci TURBO.TPL (.TPL = Turbo Pascal Library), a kasnije u broju odvojenih binarnih .TPU (Turbo Pascal Unit) datoteka. Sedma verzija TP-a uključivala je sljedeće module: APP, COLORSEL, CRT, CURSU, DIALOGS, DRIVERS, EDITORS, GRAPH, GRAPH3, HISTLIST, MEMORY, MENUS, MSGBOX, OBJECTS, OUTLINE, STDDLG, STRINGS, TEXTVIEW, TGKSI, TURBO3, VALIDATE, VIEWS, WINDOS.

Posljednja verzija Turbo Pascala izišla je 1993. pod brojem 7.0. Nakon toga, Borland napušta dalji razvoj ovoga proizvoda[8] i umjesto njega 1995. izdaje Delphi za 16-bitni Windows 3x, RAD okružje za Borland Pascal koji se od tad razvija kao poseban programski jezik Delphi. Delphi, kao objektno-orijentirani Pascal osobito pogodan za razvijanje grafičkih Windows aplikacija zadržao se u širokoj upotrebi sve do danas, a stekao je i široku popularnost zbog lakoće korištenja i vizualnoga sučelja za kreiranje GUI-ja. Od 2006. razvojem Delphija bavi se CodeGear, Borlandova podružnica za razvojne programe ranije poznata kao Borland Developers Tool Group (DTG).[9] OpenSource alternativa Delphiju su Free Pascal Compiler i Lazarus IDE.

Sintaksa Pascala

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 identifikatori. Identifikatori su imena deklariranih varijabli i potprograma (procedura i funkcija).

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 posljednja 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 također posljednja 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 između 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).

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

Deklaracije podataka

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 - grananja

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

If-Then

If-Then se koristi za odlučivanje o jednom od mogućih ishoda toka programa na osnovi uvjeta navedena u izrazu iza ključne riječi if. Ako je uvjet ispunjen, izvršava se sljedeć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 sljedeć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-Else

Za izbor između dvaju mogućih tokova programa koristi se If-Then-Else struktura; prvi tok izvršava se u slučaju da je ispunjen uvjet napisan između 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 između begin { ... } end; direktiva:

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

Case

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

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

Naredbe ponavljanja - petlje

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 određen broj puta, a varijabla brojača se navodi kao područje između dviju cjelobrojnih vrijednosti, odvojenih 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.

Operatori

Operatori se dijele, s obzirom na to koliko operanda obrađuju, 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 iskustvom 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.[10]

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 operatori

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

Operatori bitova

shl  : lijevo pomjeranje;
shr  : desno pomjeranje;

Ostali operatori

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

Vrste podataka

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 tipovi

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,[11] jer decimalni broj ne može imati prethodnika ili sljedbenika po veličini.

Strukturirani tipovi

U 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 samo na memorijsku lokaciju, pokazivači se dijele na tipizirane i generičke.

Enumeracije

Enumeracije ili pobrojani tip su izvedeni ordinarni tip podataka. Primjer:[12]

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

Tipovi dosega

Pascal podržava varijable u određenom dosegu (području, podopsegu) nekoga drugoga ordinarnoga tipa podataka:

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

Moguće je također deklarirati varijablu u dosegu enumeriranoga tipa kojega smo prethodno 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;

Setovi

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 sintaksnog šećera (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
  { ... }

Potprogrami (funkcije i procedure)

Pascal razlikuje dvije vrste potprograma, 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 potprograme 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);

Parametri

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 vrijednosni 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 ispred deklaracije parametra.

procedure CheckIfFileExists(Name: string; var Exists: Boolean);
procedure MergeFiles(File1, File2: string; var NewFile: file);

Za razliku od vrijednosnih parametara, varijabilni parametri ne mogu prihvatiti konstantne vrijednosti (recimo neki broj ili string), nego samo identifikatore varijabli koje mijenjaju. Vrijednosni parametri mogu primati obje vrste argumenata, i doslovne vrijednosti, i imena varijabli.

Standardne procedure i funkcije

I/O

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 ispis postoje procedure Write i WriteLn. Razlika između njih je u tome što ova druga ispisuje tekst skupa sa prijelomom reda (linije), odnosno znakom za novi red (CR/LF).

Aritmetičke operacije

Neke od standardno ugrađenih 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 : prethodnik 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);

Programski primjeri

"Dobar dan!"

Najjednostavniji program koji ispisuje pozdrav na zaslonu:

program DobarDan;

begin
  WriteLn("Dobar dan!");
  ReadLn;
end;

Fibonaccijevi brojevi

Program koji ispisuje Fibonaccijev niz:[13]

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.

Faktorijel

Naredni program računa Faktorijel zadanih brojeva:[14]

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 Pascala

  • ISO Pascal - standardni Pascal, prema specifikacijama ISO 7185 :1990. Sve druge implementacije manje ili više proširuju ISO izvedbu.
  • Turbo Pascal - uvodi mnoge nove mogućnosti kojih nema u ISO izvedbi, između ostalih podršku za objektno-orijentirano programiranje u jeziku Object Pascal (počev od verzije Turbo Pascal 5.5).[15]
  • 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.[16]

Razvojna okruženja za programiranje u Pascalu

Besplatna

  • 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 potpunosti 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"[17]) [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 potpunosti je kompatibilan s Turbo Pascalom, dok VP IDE editor izgledom imitira Turbo Pascal IDE, pa je zbog svega toga VP svojevrsna prilagodba TP-a s 16-bitnoga DOS-a na 32-bitni Windows. [link] na arhiviranu web stranicu; Softpedia link za preuzimanje posljednje 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 besplatno za download i korištenje kao jednostavniju alternativu XCode editoru na MacOS-u. [link].

Komercijalna

Navodi

Vanjske poveznice

Povijesni dokumenti

Standardi

Tutorijali