Пређи на садржај

Пасцал (програмски језик)

Извор: Wikipedija

Пасцал је програмски језик настао на ЕТХ Зüрицх институту 1970. године. Дизајнирао га је Никлаус Wиртх, швицарски рачунални знанственик, и назвао према француском филозофу, физичару и математичару, Блаисеу Пасцалу, који је 1641. изумио механички калкулатор.

Пасцал је императивни програмски језик, првобитно с процедуралним, и неким функцијским могућностима, а касније је преко својих варијаната и дијалеката еволуирао у језик који подржава објектно-оријентирано програмирање. Својевремено је смишљен с намјером да омогући и популаризира структурирано програмирање, које је у доба доминације Фортрана било релативно непопуларна програмска парадигма. Настао је по узору на Алгол, најстарији структурирани програмски језик, као неизравна посљедица и "колатерална корист" покушаја да се Алгол 60 варијанта измијени и побољша.

Повијест

[уреди | уреди извор]

Никлаус Wиртх је био члан Радне скупине 2.1 (Wоркинг Гроуп 2.1), која је од 1963. радила на измјени језика Алгол 60, с циљем да се развије и стандардизира његова нова и напреднија варијанта. Унутар WГ-2.1 дошло је до подјеле на двије фракције: "теоретичари" (Алгол Y група) су захтијевали снажан програмски језик с огромним бројем могућности, док су "практичари" (Алгол X група), с изкуством у имплементацији програмских језика, имали стога умјереније, минималистичке амбиције. Wиртх је, као "практичар", 1965. године представио своју верзију измјена, која је касније под његовим водством имплементирана на ИБМ 360/50 рачуналу и која је од 1966. постала позната под називом Алгол-W, док је Алгол Y скупина наставила у смјеру који ће касније завршити као стандард Алгол 68, коначно имплементиран 1972.[1]

Медјутим, незадовољан праксом крпљења постојећих језика, као и гломазноћу те непотребним могућностима Алгола, одлучио је "прекинути компатибилност" и почео од 1968. на бази Алгола радити сасвим нови програмски језик, Пасцал, који је објавио 1970. године.[2][3]

Први Пасцал преводилац био је написан у Фортрану за ЦДЦ 6000 рачунало. Друга верзија преводитеља је написана у самом програмском језику Пасцал и објављена 1971. године (Тхе Программинг Лангуаге Пасцал, Ацта Информатица, 1, 35-63, 1971 и Тхе Десигн оф а Пасцал Цомпилер, Софтwаре - Працтице анд Еxпериенце, 1, 309-333, 1971). Побољшана верзија Пасцала објављена је 1973. у облику формализиране синтаксе БНФ (Хоаре & Wиртх: Ан Аxиоматиц Дефинитион оф тхе Программинг Лангуаге Пасцал, Ацта Информатица, 2, 335-355, 1973). Године 1974. објављена је средјена верзија (Пасцал Усер Мануал анд Репорт) која је узета као основа за стандард језика објављен 1983. (ИСО 7185:1983).[4]

Пасцал је брзо постао популаран и тражен због своје једноставности. Као језик који је задовољавао најосновније захтјеве структуриранога програмирања, био је идеалан избор за учење ове дисциплине кодирања, као и програмирања опћенито. Напори многих универзитета у свијету да се пренесе Пасцал с ИБМ-а на друге рачунарске платформе допринијели су рапидној популаризацији новога програмскога језика. Да би се олакшао пријенос Пасцала на различите платформе, смишљен је концепт хипотетичкога рачунала (данас то зовемо виртуални строј); Пасцал компилатор, односно његов кôд-генератор је емитирао тзв. п-код (скр. од псеудо-цоде, сад се то зове бyтецоде); п-код се извршавао на емулатору који је било релативно лако написати у асемблеру за било коју архитектуру рачунала, тако да није требало изнова програмирати компилатор (парсер, генератор кôда итд), него само интерпретер п-кôда ("емулатор"), на којем се онда могао покретати и оригинални Пасцал компилатор (у п-коду). Оваква метода је много допринијела брзом ширењу Пасцала.[5]

Пасцал преводилац био је послан, измедју осталих, и на Университy оф Цалифорниа у Сан Диегу, гдје је настала варијанта УЦСД Пасцал и у њему кодирани п-Сyстем виртуални строј.[6] п-Сyстем се могло пренијети на велики број тадашњих рачунала захваљујући чињеници да је требало програмирати само дијелове специфичне за хардвер. Програм преведен УЦСД-Пасцалом у виду п-кода могао се извршавати на сваком рачуналу које има п-Сyстем.

У исто вријеме (1972) Деннис Ритцхие направио је програмски језик C за прву верзију УНИX операцијскога система на ДЕЦ ПДП-7 рачуналу, по узору на нешто старији Б језик Кена Тхомпсона, његова раднога колеге на АТ&Т Белл Лабс.[7] C је био заснован на истој процедуралној филозофији као и Пасцал; за разлику од првобитнога Пасцала, C је подржавао и основне типове података као што су реални бројеви двоструке прецизности (double). Медјутим, Wиртх се критички односи према овом сувременику Пасцала, поредећи га с асемблером више разине, јер, иако C декларативно подржава типове података, типови према његову мишљењу немају никаква смисла ако програмски језик не потенцира строгу типизираност, односно компајлер не провјерава конзистентност типова.[8] Сличан критички став Wиртх има и у односу на C++, који је својевремено био уназад-компатибилна, објекто-оријентирана надоградња на C; C++ је, према Wиртху, огромни монструм који временом расте и са сваком новом верзијом добива нове сувишне могућности, постајући све већи, све тежи за имплементирање и одржавање.[9] Уз то је C++ као објектно-оријентирани језик и језик високе разине базиран на погрешној основи, "C-ассемблеру".

Први масовно доступни комерцијални Пасцал компајлер био је Турбо Пасцал компаније Борланд, за операцијске системе ЦП/M и ДОС. Турбо Пасцал је као прво интегрирано развојно окружење (ИДЕ) омогућио лакши и бржи развој софтвера обједињавањем у једну цјелину едитора, компајлера и других помоћних програма (Греп, Маке, Тоуцх итд); масовну популарност дуговао је и својој релативно малој цијени од педесетак долара.[10]

Операцијски системи за Аппле рачунала Лиса и Мацинтосх с краја седамдесетих и почетка осамдесетих били су програмирани у Пасцалу,[11] због чега писање програма у C-у за наведене системе није имало смисла, јер су програми морали радити с типовима података које подржава стандардни Пасцал као и АПИ Аппле ОС-а. Првобитни Објецт Пасцал је најприје настао у твртки Аппле Цомпутерс, гдје је служио за системско и апликацијско програмирање. Касније је Објецт Пасцал имплементиран у Борланду, кроз комерцијалне варијанте Турбо Пасцал и Делпхи.

Програмска парадигма Пасцала

[уреди | уреди извор]

Пасцал својом парадигматском филозофијом и дизајном потенцира структурирано програмирање, приступ кодирању гдје се податци (и њихове декларације) строго раздвајају од директива, процедура и функција који врше обраду тих података.

Структуриран програм је програм који је темељито разрадјен као скуп акција над дефинираним скупом података, а структура података заправо дефинира структуру програма.[12] Прије појаве Пасцала доминирали су неструктурирани, секвенцијални програмски језици као што су Фортран и Басиц, у којима је контрола тока била ријешена употребом гото наредбе и означавањем програмских линија редним бројевима, у недостатку процедуралнога или било каква структуралнога рјешења у дизајну језика.

Процедурални и функцијски модел у Пасцалу значи да се програмски ток може имплементирати подјелом програма на подпрограме (процедуре и/или функције), да би се на тај начин повећала модуларност и могућност рециклирања мањих абстракцијских цјелина програмскога кôда. Треба напоменути да је функцијски модел у Пасцалу подржан тек увјетно речено, зато што функције у Пасцалу, као и у другим процедуралним језицима, нису чисте функције у смислу функцијске парадигме програмирања, јер осим што евалуирају изразе и враћају неку вриједност, допуштају унутар себе директиве и промјене стања (сиде-еффецтс); такве функције се суштински не разликују од императивних процедура, па се могу исто тако имплементирати и као процедуре с варијабилним параметрима.

Пасцал је строго-типизирани језик, што значи да не допушта употребу појединога типа податка на мјесту гдје оператор или функцијски односно процедурни параметар захтијева другачији тип. Изузетак су компатибилни типови, као што су рецимо Integer и Byte, или ShortInt, LongInt и слични типови који се не разликују медјусобно по врсти, него само по максималној величини или хардверској имплементацији, под увјетом да се могу промовирати мањи типови на мјесто већих, али не и обрнуто, јер би дошло до губитка прецизности податка.

Синтакса Пасцала

[уреди | уреди извор]
Илустрација изворнога кôда у Пасцалу, креирана помоћу ЛаТеXа

Пасцал спада у програмске језике код којих је капитализација небитна, што значи да се било који идентификатор или резервирана, кључна ријеч (кеywорд) може написати на различитим мјестима наизмјенично малим или великим словима, или комбинирано, без икакве разлике; преводилац у сваком случају сматра да се ради о истом идентификатору или ће препознати резервирану ријеч без обзира како је капитализирана. Језици као што су C, C++, C# и Јава разликују идентификаторе и по капитализацији назива, па је промјена само једнога слова из малога у велико или обрнуто, довољна да компајлер пријави грешку, јер не препознаје варијаблу или директиву.

Основни елементи Пасцал програма су директиве или наредбе (енгл. статемент), које се могу састојати од израза (експресија) и других директива. Изрази се састоје од оператора и операнада. Операнди могу бити литералне (дословне) вриједности, или референце идентификатора.

У директиве спадају декларације (константи, варијабли, лабела, процедура и функција), дефиниције (типова података, процедура, функција), те три основне врсте наредби за секвенцију (ток), итерацију (понављање) и селекцију (избор).

Декларације података

[уреди | уреди извор]

Пасцал је програмски језик који с обзиром на своју строго структурирану парадигматску опредијељеност захтијева декларирање свих података прије него што се они у програму референцирају. Ово је начин да се постигне читљивост и модуларна употребљивост програмскога кôда, као и одредјена врста програмерске дисциплине. Оваква филозофија програмирања је доста различита од приступа многих интерпретираних и скриптних програмских језика (од Басица до ЈаваСцрипта и других тзв. динамичких језика), који допуштају имплицитно референцирање варијабли без декларација, или чак имплицитну промјену типа (тзв. лоосе-тyпинг). Основне врсте директива за опис података у Пасцалу су декларације констаната, варијабли и дефиниције типова.

Константе су идентифициране дословне (литералне) вриједности чијим се референцирањем у програму експандира њихова (алфа)нумеричка вриједност и на тај начин се избјегава вишеструко уредјивање на свим мјестима у програму гдје се та вриједност користи. Декларирају се директивом const, након које слиједе идентификатори и вриједности, медјусобно раздвојене знаком једнакости.

Варијабле се декларирају директивом var, те наводјењем имена идентификатора и назива типа података, измедју којих се ставља двоточка; може се декларирати и више варијабли истога типа у једној директиви, у којем случају се измедју имена варијабли ставља зарез.

Изведени типови података дефинирају се директивом type, која захтијева име(на) идентификатора и дефиниције, измедју којих је знак једнакости. Примјер декларација и дефиниција:

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;

Дефиниције типова (type) морају у програму бити наведене прије декларација варијабли (var) које су од тога типа. Исто вриједи и за дефиниције типова података које се позивају на неки други изведени тип. Једини изузетак је дефиниција типа показивача, која се може навести прије или послије дефиниције слога (record) или објекта (object у Објецт Пасцалу) на који тај показивач указује, када тај објект у себи садржи као члан исти такав тип показивача, јер у оваком случају не постоји начин да се избјегне циркуларно референцирање; у том случају, измедју декларације показивача и дефиниције слога (или објекта) не смије стојати никаква друга дефиниција типа или директива, тј. ове двије директиве морају бити сусједне.

Генерално, у Пасцалу свака директива која се позива на неки идентификатор захтијева да тај идентификатор буде унапријед деклариран или дефиниран. За потребе референцирања процедуре или функције прије њезине имплементације користи се директива forward након декларације.

Врсте података

[уреди | уреди извор]

Типови података у Пасцалу дијеле се на основне (скаларне) и структуриране (изведене), који се углавном дефинирају као поља и слогови састављени од основних или других структурираних података.

Основни типови

[уреди | уреди извор]

Скаларне врсте података у Пасцалу су:

Надаље, поједини типови података се класифицирају као ординарни, што значи да се могу сортирати према величини и манипулирати стандардним функцијама Pred(), Succ(), Ord(). Од основних типова података, у ординарне спадају сви осим Real,[13] јер децимални број не може имати предходника или сљедбеника по величини.

Структурирани типови

[уреди | уреди извор]

У структуриране врсте података спадају:

Посебни типови

[уреди | уреди извор]

Показивач је метаподатак који указује на адресу некога податка у меморији. Овисно о томе показују ли на специфични тип податка или на меморијску локацију с недефинираним типом података, показивачи се дијеле на типизиране и генеричке.[14] Генерички показивачи се декларирају помоћу типа података Pointer, за разлику од типизираних који се декларирају оператором ^ прије назива типа (нпр: ^Integer).[15]

Слично као што се за типизиране показиваче објект у меморији ствара и брише процедурама New() и Dispose(), тако и за генеричке показиваче постоје процедуре GetMem() и FreeMem() којима се алоцира и ослобадја блок меморије одредјене величине:[16]

procedure GetMem(var P: Pointer; Size: Word);
procedure FreeMem(var P: Pointer; Size: Word);

Усмјеравање показивача на адресу неке варијабле, односно очитавање те адресе и њезино записавање у показивач врши се оператором @ прије назива варијабле којој се жели приступити (нпр: PtrInt := @IntVar).

Референцирањем (позивањем) самога имена показивача добије се адреса варијабле на коју он показује, а стави ли се оператор ^ иза имена, добива се вриједност варијабле на коју показивач показује умјесто њезине адресе (нпр: IntVar^); овај поступак се зове дереференцирање показивача.

Дакле, укратко:

  • оператор ^ прије имена типа (^Integer) служи за декларирање типизиранога показивача;
  • оператор ^ послије имена варијабле показивача (IntVar^) служи за дереференцирање (приступ податку);
  • оператор @ служи за адресирање (придруживање варијабле показивачу);

За информацију о количини меморије коју заузима неки тип варијабле или објекта постоји функција SizeOf(). Примјер употребе SizeOf() за приказ величине у бајтовима неких типова података:

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.

Наведени програм, овисно о преводитељу, операцијском систему и архитектури рачунала може приказивати различите резултате (с тим да ће HoByte свугдје бити 8 Hobbit, без обзира на хардвер или софтвер, зато што смо тај тип дефинирали унутар програма).

Енумерације

[уреди | уреди извор]

Енумерације или побројани тип су изведени ординарни тип података. Нпр:[17]

type
  TMonth = (Jan, Feb, Mar, Apr, May, Jun,
            Jul, Aug, Sep, Oct, Nov, Dec);

Типови досега

[уреди | уреди извор]

Пасцал подржава варијабле у одредјеном досегу (подручју, подобсегу) некога другога ординарнога типа података:

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

Могуће је такодјер декларирати варијаблу у досегу енумериранога типа којега смо предходно дефинирали, па с обзиром на горњи примјер дефиниције типа можемо имати:

var
  Summer: Jun..Aug;

Иста се синтакса за досеге, наравно, може употријебити и за дефинирање типова:

type
  TDay = 1..31;

Једна од дистинктивних карактеристика Пасцала у односу на друге програмске језике јест подржка за операције са скуповима, односно тип података set.

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

Ова врста синтакснога сладора (енгл. сyтацтиц сугар) омогућује писање елегантнијега и концизнијега кôда. Провјера припадности елемента (вриједности варијабле) неком скупу врши се помоћу оператора in. Дакле, можемо написати ово:

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

... или још боље ово, с обзиром да смо декларирали SmallNum:

if Number in SmallNum then
  { ... }

... умјесто овога:

if (Number > 0) and (Number < 129) then
  { ... }

Ово је нарочито згодно кад треба извршити провјеру припадности у већем броју не-сусједних подручја вриједности:

if Number in [1..5, 17, 23, 25..32] then
  { ... }

Контрола тока

[уреди | уреди извор]

Констукције избора (гранања), односно контроле тока су Иф-Тхен, Иф-Тхен-Елсе и Цасе.

Иф-Тхен се употребљава за контролу тока на основи услова наведена у изразу иза кључне ријечи if. Ако је услов изпуњен, извршава се слиједећа наредба или блок након кључне ријечи then, а ако није, програмски ток прескаче наредбу или блок иза then, то јест наставља с извршавањем наредне директиве која није у склопу Иф-Тхен конструкције, уколико постоји.

if Izraz then
  Naredba;

За извршење вишеструких наредби користи се begin { ... } end блок:

if Izraz then
begin
  Naredba1;
  Naredba2;
  Naredba3;
  { ... }
end;

Иф-Тхен-Елсе

[уреди | уреди извор]

За избор измедју двају могућих токова употребљава се Иф-Тхен-Елсе конструкција; први ток извршава се у случају да је изпуњен услов написан измедју if (ако) и then (онда), други у случају да није, а стоји након резервиране ријечи else (иначе):

if Izraz then
  Naredba1
else
  Naredba2;

Овдје вриједи исто правило о затварању блокова вишеструких директива измедју begin { ... } end; директива:

if Izraz then
begin
  Naredba1;
  Naredba2;
  Naredba3;
  { ... }
end { ovdje ne ide ";" }
else
begin
  Naredba4;
  Naredba5;
  Naredba6;
  { ... }
end;

Цасе конструкција се употребљава као прегледнија алтернатива за вишеструко гранање тока, умјесто вишестуких иф-тхен директива или иф-тхен-елсе блокова у концентричном, каскадном и ланчаном стилу.

case Varijabla of
  1: Naredba1;
  2: Naredba2;
  3: Naredba3;
  4: Naredba4;
     { ... }
else { / otherwise }
  Naredba5; { default }
end; { case }

Наведени case блок еквивалентан је ланчаном елсе-иф у примјеру који слиједи:

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 }

Секвенција тока

[уреди | уреди извор]

У Пасцалу свака директива мора завршавати знаком ; (точка-зарез), осим ако је задња у досегу (блоку, процедури, функцији или програму), у којем случају се може изоставити, али је добра пракса ипак ставити ; иза сваке наредбе, због евентуалних каснијих додавања нових.

Изузетак је и задња директива прије кључне ријечи else у Иф-Тхен-Елсе конструкцији, али у овом случају се може сматрати да је Иф-Тхен-Елсе једна наредба, посебна врста и другачија од Иф-Тхен. Ово је једна од карактеристика Пасцала које га разликују од језика као што су C и C++, који захтијевају точка-зарез иза свакога иф-тхен, што практично значи да се else у C/C++ преводитељима сматра посебном наредбом, умјесто дијелом једне Иф-Тхен-Елсе конструкције, а точка-зарез служи у тим језицима као терминатор наредби, умјесто као само сепаратор; терминатор наредби се у C/C++ језицима чак рачуна и као посебан статемент, јер се може ставити у изворни кôд самостално један или више узастопних точка-зареза, а да компајлер то уредно преведе и не пријави синтаксну грешку. Ово, наравно, није могуће у Пасцалу.

За резервирану ријеч else, ако је дио case конструкције, такодјер не вриједи наведени "изузетак", па се и крајњи случај case блока прије else директиве мора терминирати точка-зарезом; за цасе-елсе конструкцију постоји и резервирана ријеч otherwise, која се може употријебити умјесто else.

Блокови директива у Пасцалу се затварају измедју кључних ријечи begin и end, што је још једна од његових карактеристичних разлика у односу на језике C, C++, C#, Јава итд, који користе витичасте заграде { }. У програмерском жаргону ови језици се називају језици витичастих заграда (енгл. цурлy-браце лангуагес). Медју познатије језике који имају begin и end спада програмски језик Ада.

Задња end директива у програму завршава точком (.) умјесто точка-зарезом, и то је уједно наредба затварања блока главне процедуре програма.

Директиве понављања или петље су for, while и repeat, а њихова употреба изгледа овако:

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;

Петља for се понавља точно одредјен број пута, а варијабла бројача се наводи као подручје измедју двију цјелобројних вриједности, оддвојених резервираном ријечју to. Петља while провјерава неки увјет наведен у изразу прије понављања наредбе или блока наредби, за разлику од repeat, која се најприје извршава једанпут, а затим провјерава увјет у изразу.

Оператори

[уреди | уреди извор]

Оператори се дијеле, с обзиром на то колико операнда обрадјују, на унарне (један операнд) и бинарне (два операнда).

Пасцал користи оператор := за придруживање вриједности, насупрот језицима као што су C или C++, гдје за то служи обични знак једнакости (=). У Пасцалу је знак = релацијски оператор за логичке изразе - експресије (C/C++ за то употребљава двоструки знак једнакости, ==). Ова разлика може довести до конфузије и грешака у програмирању, нарочито код програмера с изкуством у Пасцалу који тек почињу програмирати у језицима C/C++, јер се израз if (i = 0) (умјесто if (i == 0)) преводи у C/C++ компилаторима као ваљан статемент.

Слиједи попис оператора у Пасцалу.[18]

Аритметички оператори

[уреди | уреди извор]
+    : sabiranje;
-    : oduzimanje;
*    : množenje;
/    : dijeljenje;
div  : cjelobrojno dijeljenje;
mod  : ostatak cjelobrojnoga dijeljenja (modulus);

Релацијски оператори

[уреди | уреди извор]
=    : jednako;
<>   : nejednako;
<    : manje;
<=   : manje ili jednako;
>    : veće;
>=   : veće ili jednako;

Логички оператори

[уреди | уреди извор]
not  : logička negacija;
and  : logičko i;
or   : logičko uključivo ili;
xor  : logičko izključivo ili (or s negacijom);

Оператори битова

[уреди | уреди извор]
shl  : lijevo pomjeranje;
shr  : desno pomjeranje;

Остали оператори

[уреди | уреди извор]
with : 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;

Процедуре и функције

[уреди | уреди извор]

Пасцал разликује двије врсте подпрограма, процедуре и функције. Функције за разлику од процедура враћају неку вриједност, па се према типу података који враћају разликују и типови функција, што се наводи у декларацији. Други програмски језици углавном све подпрограме називају исто, функције (C/C++), субрутине (Басиц) итд. Напримјер, у програмском језику C, процедура је обична функција која враћа вриједност void (ништа). Примјери декларација процедуре и функције, без имплементација:

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

Параметри

[уреди | уреди извор]

Параметри неке функције или процедуре су деклариране уносне вриједности, а декларирају се у у малим заградама иза имена функције или процедуре, на исти начин као и варијабле у var секцијама.

Параметри могу бити вриједностни или варијабилни. Варијабилни параметри мијењају вриједност варијабле приступајући јој директно (позив по референци) умјесто да раде с њезином копијом (позив по вриједности), што се специфицира директивом var прије декларације параметра.

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

За разлику од вриједностних параметара, варијабилни параметри не могу прихватити константне вриједности (рецимо неки број или стринг), него само идентификаторе варијабли које мијењају. Вриједностни параметри могу примати обје врсте аргумената, и дословне вриједности, и имена варијабли.

Групирање

[уреди | уреди извор]

Насупрот већини програмских језика, Пасцал подржава имплементирање подпрограма (процедуре и/или функције) један унутар другога. Ова могућност се, медјутим, нерадо употребљава у програмерском свијету, јер не доприноси нимало читљивости и употребљивости изворнога кôда, чак напротив. Препоруке "доброга стила" програмирања у Пасцалу обезхрабрују употребу унутарњега групирања процедура за више од једне разине.[19] Неке имплементације Пасцала, као Делпхи, ову могућност не подржавају. Постоје, ипак, ситуације кад је згодно имплементирати једну процедуру унутар друге, као што је случај с qуицк-сорт алгоритмом у слиједећем примјеру:[20]

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;

Стандардне процедуре и функције

[уреди | уреди извор]

Стандардне процедуре за унос су Read и ReadLn; Read захтијева најмање један параметар, назив варијабле чија се вриједност учитава, док ReadLn прави нови редак за сваку учитану варијаблу. Примјер:

var
  Number: LongInt;

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

За изпис постоје процедуре Write и WriteLn. Разлика измедју њих је у томе што ова друга изписује текст скупа са пријеломом реда (линије), односно знаком за нови ред (CR/LF).

Аритметичке операције

[уреди | уреди извор]

Неке од стандардно уградјених аритметичких функција у Пасцалу су:

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);

Операције са стринговима

[уреди | уреди извор]

Неке од стандардних функција за рад с низовима знакова (стринговима):

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;

Програмски примјери

[уреди | уреди извор]

Факторијел

[уреди | уреди извор]

Наредни програм рачуна Факторијел заданих бројева.[21]

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.

Фибонаццијеви бројеви

[уреди | уреди извор]

Слиједи програм који изписује Фибонаццијев низ.[22]

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.

Варијанте и дијалекти Пасцала

[уреди | уреди извор]
  • ИСО Пасцал - Стандардни Пасцал, према спецификацијама ИСО/ИЕЦ 7185:1990 Пасцал и ИСО/ИЕЦ 10206:1990 Еxтендед Пасцал
  • Турбо Пасцал - Уводи могућности којих нема у ИСО варијанти: програмске модуле (од верзије 4.0), подржку за ООП (с верзијом 5.5).[23]
  • Објецт Пасцал - Објектно оријентирани Пасцал, данас заступљен у двама дијалектима: Делпхи и Фрее Пасцал. Објецт Пасцал први пут је имплементиран на Аппле рачуналима 1985.[24]

Развојна окружења

[уреди | уреди извор]
  • Фрее Пасцал - Мултиплатформски Пасцал и Објецт Пасцал компилатор, у подпуности компатибилан с Турбо Пасцал дијалектом и с дјеломичном подржком за Делпхи. Програмски пакет садржи Фрее Пасцал Цомпилер (ФПЦ) и ФП ИДЕ, едитор који изгледом и функционалношћу имитира Турбо Пасцал ИДЕ. Постоје верзије ФП пакета за слиједеће ПЦ ОС-ове: ДОС, ОС/2, Wиндоwс, Линуx, БСД, МацОС, Нетwаре и МорпхОС, те друге платформе: Wиндоwс ЦЕ, Гаме Боy Адванце, Нинтендо ДС, затим за различите процесорске архитектуре: x86 (и386), x86-64 (амд64), ППЦ, ППЦ64, СПАРЦ и арм. Линк: фреепасцал.орг
  • Лазарус ИДЕ - Графичко сучеље за Фрее Пасцал Цомпилер (ФПЦ) и визуално Пасцал/Делпхи програмирање. Подржава Wиндоwс, Линуx и МацОС. Лазарус је скоро у подпуности о АПИ-ју неовисна платформа, тако да се исти изворни кôд може преводити на свим системима с ФПЦ-ом. ("Напиши једанпут, компилирај свугдје."[25]) Линк: лазарус.фреепасцал.орг
  • Виртуал Пасцал - Самосталан пројект аутора Аллана Мертнера и Виталyја Мирyанова од 1995 до 2005. Виртуал Пасцал је развојно окружење за Wиндоwс и ОС/2 с експерименталном подржком за Линуx. Виртуал Пасцал Цомпилер (ВПЦ) може линковати 32-битне егзекутивне датотеке за Wиндоwс (ПЕ) и ОС/2; у подпуности је компатибилан с Турбо Пасцалом, док ВП ИДЕ едитор изгледом имитира Турбо Пасцал ИДЕ, па је стога ВП својеврстна прилагодба ТП-а с 16-битнога ДОС-а на 32-битни Wиндоwс. Линк: впасцал.цом | Архивирано: https://web.archive.org/web/20051229123611/http://www.vpascal.com/news.php | Софтпедиа линк за преузимање задње верзије 2.1.279 из 2004: http://www.softpedia.com/get/Programming/Coding-languages-Compilers/Virtual-Pascal.shtml
  • ПасцалАБЦ.НЕТ - Развојно окружење за .НЕТ Фрамеwорк. Линк: пасцалабц.нет
  • МиниПасцал ИДЕ - Још један едитор за ФПЦ. Линк: минипасцал.цлан.ст

Комерцијална

[уреди | уреди извор]
  • Борланд / ЦодеГеар Делпхи

Библиографија

[уреди | уреди извор]

Литература

[уреди | уреди извор]
  • А. Ловрић: Пасцал. Основе програмирања | Техничка књига, Загреб, 1983.
  • З. Влашић: Пасцал. Приручник с ријешеним примјерима (6. допуњено издање) | Техничка књига, Загреб, 1991.
  • I. Братко, V. Рајкович: Рачунарство с програмским језиком Паскал | Нолит, Београд, 1986.
  • I. Хладни: Пасцал & Делпхи програмирање | Школска књига, Загреб, 2004.

Дигитални документи

[уреди | уреди извор]
  • Са бејзика на пасцал - Новински прилог часописа Рачунари из 1987 | бас2пас.зип
  1. Wиртх: Цомпутерс & Цомпутинг, стр. 14-15
  2. Wиртх, стр. 16
  3. Влашић, стр. 9
  4. Влашић, стр. 9
  5. Wиртх, стр. 16
  6. Wиртх, стр. 16
  7. Деннис M. Ритцхие: Тхе Девелопмент оф тхе C Лангуаге | АЦМ, Април 1993
  8. Wиртх, стр. 17
  9. Wиртх, стр. 24
  10. Wиртх, стр. 17
  11. http://www.taoyue.com/tutorials/pascal/history.html
  12. Влашић, стр. 9
  13. https://freepascal.org/docs-html/ref/refsu4.html
  14. Хладни, стр. 132
  15. Хладни, стр. 138
  16. Хладни, стр. 139
  17. https://wiki.freepascal.org/Enumerated_types
  18. https://www.pilotlogic.com/sitejoom/index.php/104-wiki/pascal-basics/chapter-1/118-pascal-operators
  19. Хоw То Цоде: Пасцал, бy Стан Сиелер. Линк: https://allegrosupport.com/papers/htpp.html
  20. Турбо Пасцал 5.5 Демос, Турбо Сорт (qsort.pas)
  21. http://progopedia.com/language/pascal/
  22. http://progopedia.com/language/pascal/
  23. http://dn.codegear.com/article/20693
  24. http://www.experiencefestival.com/object_pascal_-_early_history_at_apple
  25. http://www.lazarus.freepascal.org/index.php?page=about