Računari 27, jun 1987

Sa bejzika na C

Dejan Ristanović (dejanr@sezam.com)

Upotreba kompajlera

Novi programski jezik teško može da se nauči na papiru - potreban je računar na kome mogu da se isprobaju razne naredbe i njihove kombinacije. Važnost ove teorijske konstatacija varira od jezika do jezika: poznavaoci bejzika će, na primer, "progovoriti" fortran čitajući par stranica uputstva (važi i obratno) dok će, sa druge strane, bejzik programer lišen računara imati mnogo muke sa paskalom ili algolom. C je jedan od "drugačijih" jezika što znači da ga nema smisla učiti bez kompjutera. Računar, naravno, nije dovoljan - treba vam i C kompajler.

Pripremajući ovaj umetak koristili smo IBM PC AT kompatibilnu mašinu i dva kompajlera: Lattice C (u daljem tekstu LC) i Mark Williams C (MWC). Drugi kompajler je, po nepodeljenom mišnjenju svetskih i domaćih programera, daleko bolji - jednostavnije se pokreće, kompajlira veće programe, proizvodi brži rezultujući kod, opremljen je čudesnim debagerom... Zašto smo onda uopšte koristili Lattice C? Zato što zauzima samo jednu disketu, radi iz RAM diska i, sve u svemu, daleko brže prevodi izvorni program u rezultujući mašinski kod. Podrazumeva se da ćemo, učeći C, pisati mahom kratke programe čije vreme izvršavanja nije kritično; u tom smislu je komfornije raditi sa LC kompajlerom. Sve programe koje budemo napisali ćemo, po potrebi, lako prevesti uz pomoć nekog drugog kompajlera kao što je MWC ili Microsoft C.

Na raspolaganju nam je, jasno, bila originalna dokumentacija oba kompajlera premda je upotrebljivost te dokumentacije, prilično mala: iako se prostiru na stotinama strana, uputstva su nepregledna, skaču sa teme na temu i, uopšte, predstavljaju štivo sasvim neprilagođeno početniku. Zato ćemo ostatak ovog poglavlja posvetiti upotrebi C kompajlera - videćete da je nekoliko pasusa i primera sasvim dovoljno da prevedete i izvršite sve primere iz ovog umetka i sve programe koje sami u početku budete pisali. Kada jednom poželite da koristite C kompajler za profesionalno programiranje, moraćete da pročitate i profesionalnu dokumentaciju!

C kompajleri, jasno, nisu privilegija vlasnika PC-ja: programiranje na C-u možete da naučite i ako ste vlasnik Atarija 520, Amige, QL-a, BBC-ja... Opisivanje kompajlera za razne kompjutere, na žalost, izlazi iz domena ovoga umetka - "Računari" će se njima baviti nekom drugom prilikom. Predlažemo vam da, bez obzira na tip računara ili prevodioca koji koristite, pročitate odeljke koji slede - teško da vaša konfiguracija može da bude bitno različita! Trudili smo se, uz to, da budemo sigurni da će svi primeri koje dajemo raditi na svakom iole kompletnom C komajleru. To, naoko, nije problem - C je, rekosmo, portabilan jezik. Pokazalo se, međutim, da ta portabilnost nije baš stoprocentna: neki programi koji rade sa pointerima (sa pointerima ćete se, kada dođe vreme, mučiti bar onoliko koliko smo se i mi mučili) savršeno rade na LC-u dok na MWC-u daju besmislene rezultate. Ovih smo se programa ovde odrekli ali postoji mogućnost da neki od primera ne radi na vašoj konfiguraciji. U tom slučaju morate sami da se snađete koristeći dokumentaciju koja vam je na raspolaganju.

Lattice C

Lattice C se isporučuje na jednoj disketi koju ćete, po potrebi, lako prepisati na hard disk: kreirajte direktorijum jezici i njegov poddirektorijum laticec pa otkucajte nešto poput copy a:*.* c:\jezici\laticec. Kompajler, međutim, ne morate da startujete sa hard diska ili diskete: u svakodnevnom će radu biti daleko korisniji RAM disk koji će uštedeti dosta vremena. Formirajte, dakle, BATch proceduru sa slike 2.1 i izvršite je kada god želite da radite sa C-om.

slika 2.1:
rem  cram.bat
copy c:\jezici\laticec\lc*.* d:
copy c:\jezici\laticec\link.* d:
copy c:\jezici\laticec\c.obj d:
copy c:\jezici\edit.exe d:
copy c:\jezici\laticec\cc.bat d:
d:

Procedura sa slike 2.1 kopira LC kompajler i linker na RAM disk koji je u našem slučaju drajv D. Kopiramo, naravno, i neki editor tekta, u našem slučaju IBM Professional Editor (kada više nismo mogli da podnosimo ovaj program, prešli smo na Word Perfect), i na kraju proglašavamo "disk" D za radni. Na njega ćemo prenositi i sve programe koje pišemo i testiramo pri čemu nikada ne smemo da zaboravimo da radni program prepišemo nazad na disk ili disketu pre nego što isključimo računar. Prepisivanje vam savetujemo i pre svakog startovanja nekog programa koji čačka po memoriji tj. može da "zbuni" računar.

slika 2.2:
rem cc.bat
lc1 %1
lc2 %1
link %1+c, %1,, lc       

Procedura sa slike 2.2 treba da olakša upotrebu LC kompajlera tj. da automatizuju proces prevođenja i povezivanja C programa. LC kompajler, naime, prevodi program u dve faze: ako na RAM disk prenesete program SQUARES.C (deo LC paketa) a zatim otkucate LC1 SQUARES, program iz datoteke SQUARES.C će biti preveden u program SQUARES.O. SQUARES.O je, na žalost, još daleko od izvršavanja: potrebna je druga faza kompilacije koju iniciramo sa LC2 SQUARES. Tako nastaje program SQUARES.OBJ koji i dalje ne može da se izvršava: treba ga povezati sa bibliotekom standardnih procedura. Povezivanje iniciramo sa LINK SQUARES+C; slovo C se odnosi na program C.OBJ koji je takođe prekopiran na RAM disk. Linker će postaviti nekoliko pitanja od kojih je samo poslednje važno: treba da otkucamo ime biblioteke sa standardnim funkcijama, u našem slučaju LC. Posle izvesnog vremena dobijamo program SQUARES.EXE koji ćemo, kucajući SQUARES, za trenutak izvršiti; na ekranu bi trebala da se pojavi tablica kvadrata prvih deset celih brojeva.

Ukoliko se, sa druge strane, opremimo procedurom sa slike 2.2, prevođenje se svodi na kucanje naredbe cc squares; računar sam obavlja sve ostalo. Možda ćete, sa druge strane, poželeti da odvojite procedure za prevođenje i povezivanje tj. da poslednju naredbu sa slike 2.2 prepišete u datoteku lnk.bat. Na taj način izbegavate panično pritiskanje na CTRL C kada, zbog greške u programu, linkovanje postane besmisleno.

Ukoliko budete analizirali prevedene C programe, zaprepastiće vas njihova dužina: zar se nekoliko linija izvornog programa prevodi u četrdesetak kilobajta mašinca? C kompajler i linker, u stvari, proizvode tridesetak kilobajta mašinca čak i kada prevodite prazan program: neophodna je obimna biblioteka programa pri čemu je linker preglup da bi povezao samo procedure koje su zaista pozvane. Verovatno ćete, čitajući ove redove, tužno uzdahnuti: zar da napustite bejzik koji je snimao samo ono što je neophodno? Ni bejzik, međutim, nije baš savršen: jeste da se na disk snima samo neophodni deo programa ali je za njegovo izvršavanje neophodan interpretator koji stalno zauzima dobrih tridesetak kilobajta. Autor ovoga umetka, na primer, nikada u životu nije upotrebio bejzik naredbu ERROR (namerno izazivanje greške) pa ipak ona već godinama opterećuje ROM i RAM raznih računara koje koristi!

Mark Williams C

MWC vam stiže na pet disketa koje ćete lako preneti na hard disk, na primer u direktorijum jezici\mwc. Ako želite da ga koristite sa RAM diska, otkucajte i izvršite proceduru sa slike 2.3 - u docnijem će radu biti potrebni i neki drugi programi ali su za sada dovoljni i ovi osnovni.

slika 2.3:
rem  mwcram.bat
copy c:\jezici\cc\cc.exe d:
copy c:\jezici\cc\cpp.exe d:
copy c:\jezici\cc\cc0.exe d:
copy c:\jezici\cc\ld.exe d:
copy c:\jezici\cc\cc1.exe d:
copy c:\jezici\cc\cc2.exe d:
copy c:\jezici\cc\crts0.o d:
copy c:\jezici\cc\libc.olb d:
d:

Da biste isprobali vaš MWC kompajler, prenesite datoteku HELLO.C na RAM disk i onda otkucajte CC HELLO.C. Ekstenziju .C ne smete, uzgred budi rečeno, da izostavite što je samo na izgled glupo - MWC kompajler može da prevodi i povezuje čak i mašinske rutine! Posle izvesnog vremena vaš će direktorijum biti obogaćen programom HELLO.EXE koji odmah može da se izvršava: nema potrebe za drugom fazom prevođenja pa čak ni za povezivanjem. Izvršite program i na ekranu će se pojaviti pozdravna poruka hello world!

Iako nas samo jedna naredba dovodi do izvršnog programa, upotreba MWC kompajlera nije baš tako jednostavna: ta jedna naredba bi mogla da se proprati sa dvadesetak opcionih parametara koje ćemo upoznati tek kada nam neki od njih zaista i bude potreban.