Poređenje Paskala i C-a

Kompjuterski programski jezici C i Paskal imaju isto vreme porekla, stila i ciljeva. Oba jezika su korišćena za dizajniranje (i kompajliranje) sopstvenih kompajlera u početku. Paskal u svom originalu se pojavio 1969. i prvi put je kompajliran 1970. god  svoje prevodioce u samom početku njihovog života. Prva verzija C-a se pojavila 1972. godine.

Programerka posmatra Paskalov kod na IBM 3270 terminalu, 1983.

Oba jezika su potomci ALGOL serija jezika. ALGOL uvedi u programske jezike strukturno programiranje, gde su programi konstruisani od pojedinih komandi, kao što su if, while, for i case. Paskal direktno proizilazi iz ALGOL W-a, iako on deli neke nove ideje ALGOL 68. Jezik C je više indirektno u vezi sa ALGOL-om, u početku je bio u vezi sa  B, BCPL, i CPL (na primer, u slučaju struct i union), kao i Paskal (na primer, u slučaju inicijalizacije, const, typedef).

Ono što je dokumentovano je da je Paskal jezik koji je napravio Niklaus Virta, standardizovan kao ISO 7185 u 1982. godini. C je jezik koji su napravili Brian Kernigan i Denis Riči, standartizirovan 1989. godine. Razlog je u tome što obe ove verzije predstavljaju zrelu verziju jezika, kao i zato što su relativno blizu u vremenu. ANSI C i S99 (kasniji standardi C-a) karakteristike i kasnie implementacijama jezika Paskala (Turbo Paskal, Free Paskal) ne ulazi u poređenje, bez obzira na poboljšanja pouzdanosti i funkcionalnosti koja su im dodeljena

Sintaksa uredi

Sintaksički, Paskal je više sličan ALGOL-u nego C. Engleske ključne reči se čuvaju, a C koristi interpunkcijske simbole – Paskal and, or, i mod, gde C koristi &&, || i % na primer. Međutim, C je zapravo više sličan ALGOL-u od Paskala zbog jednostavnijih deklaracija, ostavljajući type-name variable-name sintaksu. Na primer, C prihvata deklaracije u bilo kom blou, ne samo u gornjem delu funkcije.

Korišćenje tačke i zareza uredi

Druga, suptilnija, razlika jeste uloga tačke i zareza. U Paskalu tačka-zarez odvojaju svaku pojedinu operaciju, dok one određuju operaciju u S-u. Oni su takođe sintaksički deo operacije u C-u. Ova razlika se manifestuje uglavnom u dve situacije:

  • ne može biti tačka-zarez direktno pre else u Paskalu, dok je obavezna u C-u (ukoliko se ne koristi blok izjave)
  • poslednja operacija pre end ili until ne zahteva naknadno tačkom i zarezom

Dodatna tačka i zarez može se staviti u poslednjoj liniji pre end-a, čime će se zvanično ubaciti prazna izjava.

Komentari uredi

U C-u, postoji samo /* блок коментара */. Ovo je podržano samo na pojedinim vrstama Paskala kao MIDletPascal.

U Paskalu, postoje { блок коментара } i (* блок коментара *).

Moderan Paskal, kao i Object Pascal(Delphi,FPC) kao i moderan C omogućavaju implementaciju C++ načina komentara // коментар

Imena i ključne reči uredi

C i Paskal, imaju različite predstave o velikim i malim slovima. S je osetljiv na veličinu slova, a a Paskal nije, s obzirom da mylabel iМyLabel su različita imena u C-u, a u Paskalu su identična. U razlikuju imena u C, ali istih u Paskale. U oba jezika, imena promenljivih se sastoje od slova i brojeva, sa pravilom da prvo slovo ne sme biti cifra, pa je sa tim i primer _abc legitiman. U C-u imena sa vodećom podvučenom crtom se koriste često za druge svrhe.

C i Paskal koristite ključne reči (reči su rezervisani za upotrebu samog jezika). Primeri - if, while, const, for i goto, to su ključne reči koje su zajedničke za oba jezika. 

Definicije, deklaracije i blokovi uredi

U Paskalu, procedura počinje sa ključnom rečju procedure ili function i određivanje tipa sa type. U C-u, funkcija su definisane određivanjem sintaksičke veze, dok određivanje tipa počinje se ključnom rečju typedef

U Paskalu funkcije, begin i end ograničavaju blok komandi, dok u C-u se koriste "{" i "}" .

Implementacija uredi

Gramatika oba jezika imajsličan veličinu. Sa gledišta implementacije, glavna razlika između dva jezika je u tome što za razdvajanje  u C-u, potrebno je imati pristup tabeli sa tipovima, dok u Paskalu postoji samo jedan takav pristup, dodela. Na primer u C-u X * Y;može biti deklaracija X , može biti deklaracijaY koji je objekat čiji je pokazivač X. Odgovarajući fragment Paskala je  var Y:^X;.

Jednostavni tipovi uredi

Celobrojni brojevi uredi

Paskal zahteva od svih promenljivih i funkcija da jasno odrede njihov tip. U tradicionalnom C-u, tip može biti izostavljen u većini slučajeva i tada je podrazumevani tip int (što odgovarainteger u Paskalu) - to je ono što se podrazumeva (međutim, kao što su podrazumevane vrednosti se smatra da je loša praksa u C-u i često se dobija upozorenje).

C se prilagođava različitim veličinama i signed and unsigned modelima za integer-e tako što se koriste odgovarajući parametri kao što su unsigned, long, short, signedi sl. 

Karakteri uredi

U C-u karakter se definiše kao  char , koji je neka vrsta celog broj, samo što više nije short int, . Izrazi kao što su "x" +1 , dakle, su potpuno legalni, kao i deklaracije, kao što su int i='i'; i char c=74;.

Celobrojna priroda char (jedan bajt) ilustruje se deklaracijom: gde je char tip koji treba posmatrati kao signed ili unsigned, zavisi od implementacije.

U Paskalu, simboli i brojevi su različiti tipovi. Ugrađene funkcije ord() i chr() se mogu koristiti za prebacivanje pojedinih znakova u njihove celebrojne vrednosti, koje su zadate u ASCII tabeli. ord('1') = 49 a chr(9) - to je tabulator.

Logički tipovi uredi

U Paskalu logički tip - je prebrojiv tip podataka. Moguće vrednosti tipa boolean su lažne (false) i istinite (true). Za konvertovanje u ceo broj, ord se koristi: Nema standardne funkcije za prebacivanje iz integer-a u boolean, međutim, jednostavna konverzija u praksi je: C ima binarne operatore (<, >, ==, !=, <=, >=) koji se mogu smatrati kao logični u smislu da oni uvek daju rezultate, koji su ili nula ili jedan. Kao i sve testove (&&, ||, ?:, if, while i dr.) izvršavaju nula provere, false predstavlja nulu, a true postavio bilo koju drugu vrednost.

Operacije nad bitovima uredi

Sa vam omogućava da koristite pobitovыe operateri obavlja logičke operacije. Briga treba da bude proяvlena, budući da semantika je drugačija, kada operanada se koriste više od jednog bita za podnošenje vrednosti.

Paskal ima još jednu apstraktnu metodu za obradu nad bitovima a to su setovi (sets). Sets omogućavaju programeru da postavi, izbriše, uradi presek i uniju bitova.

Decimalni tipovi podataka uredi

C ima manje stroži model decimalnih brojeva od Paskala. U C-u, celi brojevi mogu biti implicitno pretvoreni u decimalni, i obrnuto (iako je moguće gubitak preciznosti, javiće se oznaka upozorenja). U Paskalu celi brojevi mogu biti implicitno pretvoren u real, ali pretvaranje real u integer (gde se informacije mogu biti izgubljene) mora se uraditi eksplicitno pomoću funkcije trunc() i round(), koji otsecaju ili zaokrugljuju  broj.

Prebrojivi tipovi uredi

C i Paskal uključuju prebrojive tipove. Međutim, ponašanje tipova u dva jezika je veoma različito. U C-u, red će biti samo sinonim za 0, green za 1, blue za 2, i ništa ne sprečava vrednosti van ovog opsega treba da budu dodeljena promenljivoj а. Pored toga, operacije, kao što su А = А + 1; strogo su zabranjene u Paskalu; umesto toga, morate da koristite A := succ(А);. U C-u, prebrojivi tip može biti konvertovan u int i obrnuto, ali u Paskalu, funkcije ord() treba da se koristi za konvertovanje iz prebrojivog tipa u ceo tip podataka, a ne postoji funkcija za obrnut proces.

Strukturni tipovi uredi

Nizovi uredi

C i Paskal dozvoljavaju nizove drugih složenih tipova, uključujući i druge nizove. Međutim, postoji sličnost između jezika. Nizovi C-a su samo određeni osnovnim tipom i broju elemenata i uvek je indeksirano od 0 do size-1.

U Paskalu opseg je često određen u trenutku definisanja. Deset elemenata će biti sa indeksom 0..9 (baš kao u C-u u ovom slučaju). Elementi niza mogu biti bilo koji tipovi podataka. Stringovi koji se sastoje od N (>1) karaktera, su definisani kao paket u nizu u opsegu od 1 do n.

Nizovi i pokazivači uredi

U C-u, identifikator koji  predstavlja niz obrađuje kao konstantni pokazivač na prvi element niza, na taj način, s obzirom na naredbe int а[10] i int *p; dodela p=a je validna i uzrokuje to da p i a pokazuju na isti niz.eluje i izaziva i isto vreme. Pošto je pokazivač konstantna adresa, а=p nije validna naredba.

Dok su nizovi u C-u fiksirani, pokazivači na njih su zamenljivi. Ova fleksibilnost omogućava C-u da upravlja bilo kojom dužinom niza, koristeći isti kod. On je takođe programeru ostavlja mogućnost koju on mora da ispoštuje, a to je da ne piše van opsega niza, zato što nisu ugrađeni nikakvi čekeri u sam jezik.

U Paskalu nizovi su poseban tip pokazivača. To čini proveru granica nizova mogućom sa strane kompajlera. Skoro svi Paskalovi kompajleri podržavaju proveru opsega, kao opciju. Mogućnosti da oba niza menjaju svoju dužinu istovremeno, i da je to moguće proveriti u kontroli jezika, često se nazivaju  "dinamičkim nizovima". U Paskalu broj elemenata u nizu se utvrđuje prilikom kompajliranja i nije je moguće promeniti tokom egzekucije programa. Samim tim, nemoguće je da se utvrdi niz, čija dužina zavisi od bilo koje vrednosti podataka.

C ima mogućnost da pokrene nizovi proizvoljne dužine. sizeof operator se koristi da bi se dobila veličina početnog inicijalizovanog niza u C-u. Na primer, u sledećem kodu, konačan broj ciklusa se automatski prilagođava kako se lista stringova menja. Paskal ni inicijalizacijz niza, ni sredstvo definisanja slučajnih nizova za vreme kompajliranja.

Jedan od načina realizacije primer iznada, u Paskalu, ali bez automatskog podešavanja veličine.

Stringovi uredi

Stringovi u oba jezika su primitivni nizovi simbola.

U Paskale postoji string dužine N, kompatibilan sa tipom packed array [1..n] of char. U C-u string obično ima oblik типа char[n].

Paskal nema podršku nizova promenljivih dužina, i tako svaki skup rutina za obavljanje operacija nad stringovima zavisi od konkretne dužine stringa. 

S automatski okončava string sa null karakterom koji se nalazi na kraju stringa. Terminana nula mora biti ručno uneta za svaki string koji se unosi.

C nema ugrađenu dodelu niza i stringa, tako da string nije stvarno prebačen u p, već je p postao pokazivač na konstantan string u memoriji.

U Paskalu, za razliku od C-a, stringov prvi karakter je element koji ima indeks 1, a ne 0. To je zato što Paskal čuva dužinu reda na nultom elementu niza znakova.[1]

Slogovi uredi

C i Paskal mogu imati slogove. U C-u se nazivaju strukturama, a u Paskalu rekordima. U Paskale možemo koristiti frazu "with <name_of_record> do" da bi koristili direktno polja iz sloga, kao i lokalne promenljive, a ne da pišemo <name_of_record>.<name_of_field>. Nema ekvivalenta funkciji with u S-u.

Ova funkcija je dostupna u Paskalu uz pomoć konstrukcije (3 bita daje opseg od 0 do 7) kojoj se pridružuje ključna reč packed. C i Paskal podržavaju slogove koji uključuju različita polja koja se međusobno preklapaju. Oba jezička procesora su omogućena  da lociraju onoliko prostora za ove slogove koliko je potrebno za najveći tip u tom slogu.

Najveća razlika je između C-a i Paskala je da Paskal podržava određenu upotrebu "tagfield", sposoban da dodeli promenljivoj određeni tip u zavisnosti od tipa druge promenljive.

Pokazivači uredi

U C-u, pokazivači mogu da ukažu na većinu softverskih entiteta, uključujući objekte ili funkcije.

Za kreiranje dinamičkih podataka, koriste se функције malloc() i free(). Dakle, dinamička alokacija memorije nije ugrađen u jezik procesora. Ovo je posebno važno kada se C koristi u jezgru operativnog sistema ili u ugrađenim svrhama.

Paskal nema istu vrstu pokazivača kao C, ali ima indirektnog operatora, koji pokriva najčešće upotrebe pokazivača u C-u. Svaki pokazivač povezan je sa jednim dinamičkim elementom podataka, i može da se pomera samo po dogovoru. Pokazivači u Paskalu su sigurnog tipa, tj. pokazivač na jedan tip podataka može se dodeliti samo istom tipu podataka. Takođe, pokazivač ne može biti povezan sa drugim tipovima koji nemaju pokazivače. Aritmetičke operacije nad pokazivačima nisu dozvoljene u Paskalu.

Sva ova ograničenja smanjuju mogućnosti greške koje su povezane sa pokazivačima u Paskalu, u odnosu na C. Može doći do greške kada pokazivač poveže iako pokazivač još nije inicijalizovan, ili nakon što se pokazivač ukloni. jeziku Paskal u celini. Na primer, u vreme izvršenja je došlo do greške, ako pokazivač odnosi pre pokrene ili nakon što je uklonjen.

Izrazi uredi

Nivoi prioriteta uredi

Jezici se razlikuju kada je u pitanju izračunavanje izraza, ali u celini oni su uporedivi.

Paskal
  1. Logička negacija: not
  2. Multiplikativni: * / див и мод
  3. Dodavanje: + - или
  4. Relacioni: = <> < > <= >= у
C
  1. Unarni postfiks: [] () . -> ++ --
  2. Unarni prekifs: & * + - ! ~ ++ -- (Тип) Величина
  3. Multiplikativni: * / %
  4. Dodavanje: + -
  5. Pomeraj: << >>
  6. Relacioni: < > <= >=
  7. Jednakosti: == !=
  8. Bitovno  i: &
  9. Bitovno ili: ^
  10. Bitovno ili: |
  11. Logičko i: &&
  12. Logičko ili: ||
  13. Uslovni: ? :
  14. Poređenje: = += -= *= /= %= <<= >>= &= ^= |=
  15. Zarezi:: ,

Funkcije, procedure uredi

Paskalove rutine, koje vraćaju vrednost nazivaju se funkijama, a rutine koje ne vraćaju vrednost nazivaju se procedurama. Sve rutine u C-u nazivaju se funkcije; funkcije u C-u ne moraju da vraćaju vrednost i deklarišu se povratnog tipa void.

Paskalove procedure smatraju se ekvivalentnim sa "void" funkcijama C-a, a Paskalove funkcije su ekvivalentne funkcije u C-u u kojima se vraća vrednost.

Datoteke uredi

Datoteke u C-u ne postoje kao ugrađeni tipovi (oni su definisani u zaglavlju sistema) i ceo ulaz-izlaz vrši se kroz pozive biblioteka. Paskal ima ugrađen u jezik rad sa datotekama. Glavna razlika je u tome, da je C koristi "format string", koji omogućava da se pronađu argumenti u funkciji printf i da ih konvertuje, dok Paskal to obavlja pod kontrolom jezičkog procesora. Paskalove metode su brže, zato što ne dolazi do prevoda, ali su metode C-a više proširenije.

Vidi još uredi

Reference uredi

  1. ^ Kamp, Poul-Henning (25. 7. 2011), „The Most Expensive One-byte Mistake”, ACM Queue, 9 (7), ISSN 1542-7730, Pristupljeno 2. 8. 2011 

Literatura uredi