Što je uvjetna kompilacija?

U računalnom programiranju uvjetna kompilacija opisuje sposobnost softverskog prevoditelja ili procesora izvornog koda da uključi ili zanemari određene naredbe ili blokove koda na temelju uputa specifičnih za jezik koje tehnički nisu dio specifikacije jezgrenog programskog jezika. Naredbe koje se koriste za pokretanje uvjetne kompilacije u programu često se nazivaju predprocesorskim direktivama, iako također mogu biti poznate kao direktive prevoditelja, uvjetni komentari ili uvjetne definicije. Ovisno o kompajleru ili jeziku koji se koristi, uvjetne direktive mogu biti korisnički definirane varijable ili makronaredbe, ili također mogu biti varijable sustava koje postavlja prevodilac ili operativni sustav. Uvjetna kompilacija često se koristi za konfiguriranje jednog skupa datoteka izvornog koda kako bi se mogle kompilirati u različitim okruženjima ili operativnim sustavima bez potrebe za zamjenom ili mijenjanjem izvornih datoteka.

Uvjetne definicije koje se koriste za testiranje uvjetne kompilacije mogu se razlikovati od jezika do jezika, ali općenito su makronaredbe ili drugi izrazi metapodataka izvan opsega normalnih programskih varijabli. U jezicima kao što je C, varijable su obično makronaredbe koje čita predprocesor. Većinu vremena makronaredbe nisu dostupne stvarnom izvršnom izvornom kodu programa, iako postoje u istim izvornim datotekama.

Smjernice koje se koriste za testiranje definiranih uvjetnih varijabli su rudimentarne i slijede istu logiku kao if-then izjava. Osnovni testovi koji se mogu izvesti za uvjetnu kompilaciju su da li je vrijednost definirana, nije definirana ili, u nekim slučajevima, jesu li dvije definirane varijable ekvivalentne. Same varijable ili makronaredbe općenito nemaju nikakvu vrijednost od značaja, jer je čin njihovog definiranja ono što direktive provjeravaju. Međutim, kod nekih jezika i prevoditelja vrijednost definirane varijable može biti važna ako se procjenjuju za Booleovo stanje.

Kada prevodilac naiđe na direktive koje se koriste za uvjetnu kompilaciju, direktive se procjenjuju kako bi se vidjelo jesu li testirane kao istinite ili netočne. Ako je istinito, kod koji slijedi direktivu se kompilira normalno; inače će prevodilac u potpunosti preskočiti kod sadržan u direktivi. Ovo je za razliku od uvjetnih logičkih izraza unutar samog izvršnog programskog koda jer, čak i ako logika ima blok koda koji se ne može izvršiti, on će se u većini slučajeva ipak interpretirati i prevesti. S uvjetnim predprocesorskim direktivama, preskočeni kod se nikada ne uključuje, interpretira ili kompajlira. Također treba napomenuti da nakon što je predprocesor procijenio sve uvjetne varijable i direktive, one se ne kompajliraju s ostatkom programa, jer su namijenjene samo da pruže smjer prevodiocu.

Uvjetna kompilacija najčešće se koristi za uključivanje ili isključivanje koda koji je specifičan za određeni operativni sustav ili okruženje. To znači da se knjižnice koje postoje u jednom operacijskom sustavu mogu uvjetno uključiti ako direktive određuju da se program kompilira pod tim operacijskim sustavom. Alternativno, direktive se također mogu koristiti za uključivanje ili isključivanje koda na temelju korisnički definiranih varijabli. To se može učiniti tako da kod za otklanjanje pogrešaka ili profiliranje nije uključen u konačnu verziju programa ili da se određene značajke mogu omogućiti ili onemogućiti bez potrebe za održavanjem zasebnih kopija koda.