Поређење Паскала и C-a

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

Компјутерски програмски језици C и Паскал имају исто време порекла, стила и циљева. Оба језика су коришћена за дизајнирање (и компајлирање) сопствених компајлера у почетку. Паскал у свом оригиналу се појавио 1969. и први пут је компајлиран 1970. год  своје преводиоце у самом почетку њиховог живота. Прва верзија C-а се појавила 1972. године.

Оба језика су потомци АЛГОЛ серија језика. АЛГОЛ уведи у програмске језике структурно програмирање, где су програми конструисани од појединих команди, као што су if, while, for и case. Паскал директно произилази из ALGOL W-а, иако он дели неке нове идеје ALGOL 68. Језик C је више индиректно у вези са ALGOL-ом, у почетку је био у вези са  B, BCPL, и CPL (на пример, у случају struct и union), као и Паскал (на пример, у случају иницијализације, const, typedef).

Оно што је документовано је да је Паскал језик који је направио Никлаус Вирта, стандардизован као ISO 7185 у 1982. години. C је језик који су направили Бриан Керниган и Денис Ричи, стандартизирован 1989. године. Разлог је у томе што обе ове верзије представљају зрелу верзију језика, као и зато што су релативно близу у времену. АNSI C и С99 (каснији стандарди C-a) карактеристике и касние имплементацијама језика Паскала (Турбо Паскал, Фрее Паскал) не улази у поређење, без обзира на побољшања поузданости и функционалности која су им додељена

Синтакса[уреди]

Синтаксички, Паскал је више сличан ALGOL-у него C. Енглеске кључне речи се чувају, а C користи интерпункцијске симболе – Паскал and, or, и mod, где C користи &&, || и % на пример. Међутим, C је заправо више сличан АЛГОЛ-у од Паскала због једноставнијих декларација, остављајући type-name variable-name синтаксу. На пример, C прихвата декларације у било ком блоу, не само у горњем делу функције.

Коришћење тачке и зареза[уреди]

Друга, суптилнија, разлика јесте улога тачке и зареза. У Паскалу тачка-зарез одвојају сваку поједину операцију, док оне одређују операцију у С-у. Они су такође синтаксички део операције у C-у. Ова разлика се манифестује углавном у две ситуације:

  • не може бити тачка-зарез директно пре else у Паскалу, док је обавезна у C-у (уколико се не користи блок изјаве)
  • последња операција пре end или until не захтева накнадно тачком и зарезом

Додатна тачка и зарез може се ставити у последњој линији пре end-a, чиме ће се званично убацити празна изјава.

Коментари[уреди]

У C-у, постоји само /* блок коментара */. Ово је подржано само на појединим врстама Паскала као MIDletPascal.

У Паскалу, постоје { блок коментара } и (* блок коментара *).

Модеран Паскал, као и Object Pascal(Delphi,FPC) као и модеран C омогућавају имплементацију C++ начина коментара // коментар

Имена и кључне речи[уреди]

C и Паскал, имају различите представе о великим и малим словима. С је осетљив на величину слова, а а Паскал није, с обзиром да mylabel иМyLabel су различита имена у C-у, а у Паскалу су идентична. У разликују имена у Ц, али истих у Паскале. У оба језика, имена променљивих се састоје од слова и бројева, са правилом да прво слово не сме бити цифра, па је са тим и пример _abc легитиман. У C-у имена са водећом подвученом цртом се користе често за друге сврхе.

C и Паскал користите кључне речи (речи су резервисани за употребу самог језика). Примери - if, while, const, for и goto, то су кључне речи које су заједничке за оба језика. 

Дефиниције, декларације и блокови[уреди]

У Паскалу, процедура почиње са кључном речју procedure или function и одређивање типа са type. У C-у, функција су дефинисане одређивањем синтаксичке везе, док одређивање типа почиње се кључном речју typedef

У Паскалу функције, begin и end ограничавају блок команди, док у C-у се користе "{" и "}" .

Имплементација[уреди]

Граматика оба језика имајсличан величину. Са гледишта имплементације, главна разлика између два језика је у томе што за раздвајање  у C-у, потребно је имати приступ табели са типовима, док у Паскалу постоји само један такав приступ, додела. На пример у C-у X * Y;може бити декларација X , може бити декларацијаY који је објекат чији је показивач X. Одговарајући фрагмент Паскала је  var Y:^X;.

Једноставни типови[уреди]

Целобројни бројеви[уреди]

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

C се прилагођава различитим величинама и signed and unsigned моделима за integer-е тако што се користе одговарајући параметри као што су unsigned, long, short, signedи сл. 

Карактери[уреди]

У C-у карактер се дефинише као  char , који је нека врста целог број, само што више није short int, . Изрази као што су "x" +1 , дакле, су потпуно легални, као и декларације, као што су int i='i'; и char c=74;.

Целобројна природа char (један бајт) илуструје се декларацијом: где је char тип који треба посматрати као signed или unsigned, зависи од имплементације.

У Паскалу, симболи и бројеви су различити типови. Уграђене функције ord() и chr() се могу користити за пребацивање појединих знакова у њихове целебројне вредности, које су задате у ASCII табели. ord('1') = 49 a chr(9) - то је табулатор.

Логички типови[уреди]

У Паскалу логички тип - је пребројив тип података. Могуће вредности типа boolean су лажне (false) и истините (true). За конвертовање у цео број, ord се користи: Нема стандардне функције за пребацивање из integer-а у boolean, међутим, једноставна конверзија у пракси је: C има бинарне оператоre (<, >, ==, !=, <=, >=) који се могу сматрати као логични у смислу да они увек дају резултате, који су или нула или један. Као и све тестове (&&, ||, ?:, if, while и др.) извршавају нула провере, false представља нулу, а true поставио било коју другу вредност.

Операције над битовима[уреди]

Са вам омогућава да користите побитовые оператери обавља логичке операције. Брига треба да буде проявлена, будући да семантика је другачија, када операнада се користе више од једног бита за подношење вредности.

Паскал има још једну апстрактну методу за обраду над битовима а то су сетови (sets). Sets омогућавају програмеру да постави, избрише, уради пресек и унију битова.

Децимални типови података[уреди]

C има мање строжији модел децималних бројева од Паскала. У C-у, цели бројеви могу бити имплицитно претворени у децимални, и обрнуто (иако је могуће губитак прецизности, јавиће се ознака упозорења). У Паскалу цели бројеви могу бити имплицитно претворен у real, али претварање real у integer (где се информације могу бити изгубљене) мора се урадити експлицитно помоћу функције trunc() и round(), који отсецају или заокругљују  број.

Пребројиви типови[уреди]

C и Паскал укључују пребројиве типове. Међутим, понашање типова у два језика је веома различито. У C-у, red ће бити само синоним за 0, green за 1, blue за 2, и ништа не спречава вредности ван овог опсега треба да буду додељена променљивој а. Поред тога, операције, као што су А = А + 1; строго су забрањене у Паскалу; уместо тога, морате да користите A := succ(А);. У C-у, пребројиви тип може бити конвертован у int и обрнуто, али у Паскалу, функције ord() треба да се користи за конвертовање из пребројивог типа у цео тип података, а не постоји функција за обрнут процес.

Структурни типови[уреди]

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

C и Паскал дозвољавају низове других сложених типова, укључујући и друге низове. Међутим, постоји сличност између језика. Низови C-а су само одређени основним типом и броју елемената и увек је индексирано од 0 до size-1.

У Паскалу опсег је често одређен у тренутку дефинисања. Десет елемената ће бити са индексом 0..9 (баш као у C-у у овом случају). Елементи низа могу бити било који типови података. Стрингови који се састоје од N (>1) карактера, су дефинисани као пакет у низу у опсегу од 1 до n.

Низови и показивачи[уреди]

У C-у, идентификатор који  представља низ обрађује као константни показивач на први елемент низа, на тај начин, с обзиром на наредбе int а[10] и int *p; додела p=a је валидна и узрокује то да p и а показују на исти низ.елује и изазива и исто време. Пошто је показивач константна адреса, а=p није валидна наредба.

Док су низови у C-у фиксирани, показивачи на њих су заменљиви. Ова флексибилност омогућава C-у да управља било којом дужином низа, користећи исти код. Он је такође програмеру оставља могућност коју он мора да испоштује, а то је да не пише ван опсега низа, зато што нису уграђени никакви чекери у сам језик.

У Паскалу низови су посебан тип показивача. То чини проверу граница низова могућом са стране компајлера. Скоро сви Паскалови компајлери подржавају проверу опсега, као опцију. Могућности да оба низа мењају своју дужину истовремено, и да је то могуће проверити у контроли језика, често се називају  "динамичким низовима". У Паскалу број елемената у низу се утврђује приликом компајлирања и није је могуће променити током егзекуције програма. Самим тим, немогуће је да се утврди низ, чија дужина зависи од било које вредности података.

C има могућност да покрене низови произвољне дужине. sizeof оператор се користи да би се добила величина почетног иницијализованог низа у C-у. На пример, у следећем коду, коначан број циклуса се аутоматски прилагођава како се листа стрингова мења. Паскал ни иницијализацијз низа, ни средство дефинисања случајних низова за време компајлирања.

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

Стрингови[уреди]

Стрингови у оба језика су примитивни низови симбола.

У Паскале постоји стринг дужине N, компатибилан са типом packed array [1..n] of char. У C-у стринг обично има облик типа char[n].

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

С аутоматски окончава стринг са null карактером који се налази на крају стринга. Терминана нула мора бити ручно унета за сваки стринг који се уноси.

C нема уграђену доделу низа и стринга, тако да стринг није стварно пребачен у p, већ је p постао показивач на константан стринг у меморији.

У Паскалу, за разлику од C-a, стрингов први карактер је елемент који има индекс 1, а не 0. То је зато што Паскал чува дужину реда на нултом елементу низа знакова.[1]

Слогови[уреди]

C и Паскал могу имати слогове. У C-у се називају структурама, а у Паскалу рекордима. У Паскале можемо користити фразу "with <name_of_record> do" да би користили директно поља из слога, као и локалне променљиве, а не да пишемо <name_of_record>.<name_of_field>. Нема еквивалента функцији with у С-у.

Ова функција је доступна у Паскалу уз помоћ конструкције (3 бита даје опсег од 0 до 7) којој се придружује кључна реч packed. C и Паскал подржавају слогове који укључују различита поља која се међусобно преклапају. Оба језичка процесора су омогућена  да лоцирају онолико простора за ове слогове колико је потребно за највећи тип у том слогу.

Највећа разлика је између C-a и Паскала је да Паскал подржава одређену употребу "tagfield", способан да додели променљивој одређени тип у зависности од типа друге променљиве.

Показивачи[уреди]

У C-у, показивачи могу да укажу на већину софтверских ентитета, укључујући објекте или функције.

За креирање динамичких података, користе се функције malloc() и free(). Дакле, динамичка алокација меморије није уграђен у језик процесора. Ово је посебно важно када се C користи у језгру оперативног система или у уграђеним сврхама.

Паскал нема исту врсту показивача као C, али има индиректног оператора, који покрива најчешће употребе показивача у C-у. Сваки показивач повезан је са једним динамичким елементом података, и може да се помера само по договору. Показивачи у Паскалу су сигурног типа, тј. показивач на један тип података може се доделити само истом типу података. Такође, показивач не може бити повезан са другим типовима који немају показиваче. Аритметичке операције над показивачима нису дозвољене у Паскалу.

Сва ова ограничења смањују могућности грешке које су повезане са показивачима у Паскалу, у односу на C. Може доћи до грешке када показивач повеже иако показивач још није иницијализован, или након што се показивач уклони. језику Паскал у целини. На пример, у време извршења је дошло до грешке, ако показивач односи пре покрене или након што је уклоњен.

Изрази[уреди]

Нивои приоритета[уреди]

Језици се разликују када је у питању израчунавање израза, али у целини они су упоредиви.

Паскал
  1. Логичка негација: not
  2. Мултипликативни: * / див и мод
  3. Додавање: + - или
  4. Релациони: = <> < > <= >= у
C
  1. Унарни постфикс: [] () . -> ++ --
  2. Унарни прекифс: & * + - ! ~ ++ -- (Тип) Величина
  3. Мултипликативни: * / %
  4. Додавање: + -
  5. Померај: << >>
  6. Релациони: < > <= >=
  7. Једнакости: == !=
  8. Битовно  и: &
  9. Битовно или: ^
  10. Битовно или: |
  11. Логичко и: &&
  12. Логичко или: ||
  13. Условни: ? :
  14. Поређење: = += -= *= /= %= <<= >>= &= ^= |=
  15. Зарези:: ,

Функције, процедуре[уреди]

Паскалове рутине, које враћају вредност називају се функијама, а рутине које не враћају вредност називају се процедурама. Све рутине у C-у називају се функције; функције у C-у не морају да враћају вредност и декларишу се повратног типа void.

Паскалове процедуре сматрају се еквивалентним са "void" функцијама C-а, а Паскалове функције су еквивалентне функције у C-у у којима се враћа вредност.

Датотеке[уреди]

Датотеке у C-у не постоје као уграђени типови (они су дефинисани у заглављу система) и цео улаз-излаз врши се кроз позиве библиотека. Паскал има уграђен у језик рад са датотекама. Главна разлика је у томе, да је C користи "format string", који омогућава да се пронађу аргументи у функцији printf и да их конвертује, док Паскал то обавља под контролом језичког процесора. Паскалове методе су брже, зато што не долази до превода, али су методе C-a више проширеније.

Види још[уреди]

Референце[уреди]

  1. ^ Kamp, Poul-Henning (25. 7. 2011), „The Most Expensive One-byte Mistake”, ACM Queue, 9 (7), ISSN 1542-7730, Приступљено 2. 8. 2011 

Литература[уреди]