Kas yra sąlyginis kompiliavimas?

Kompiuterių programavime sąlyginis kompiliavimas apibūdina programinės įrangos kompiliatoriaus arba šaltinio kodo procesoriaus gebėjimą įtraukti arba ignoruoti tam tikras komandas ar kodo blokus, pagrįstus konkrečiai kalbai būdingomis instrukcijomis, kurios techniškai nėra pagrindinės programavimo kalbos specifikacijos dalis. Komandos, kurios naudojamos sąlyginiam kompiliavimui programoje suaktyvinti, dažnai vadinamos išankstinio procesoriaus direktyvomis, nors jos taip pat gali būti žinomos kaip kompiliatoriaus nurodymai, sąlyginiai komentarai arba sąlyginiai apibrėžimai. Priklausomai nuo naudojamo kompiliatoriaus ar kalbos, sąlyginės direktyvos gali būti vartotojo apibrėžti kintamieji arba makrokomandos, arba jos taip pat gali būti kompiliatoriaus arba operacinės sistemos nustatyti sistemos kintamieji. Sąlyginis kompiliavimas dažnai naudojamas konfigūruoti vieną šaltinio kodo failų rinkinį, kad juos būtų galima kompiliuoti skirtingose ​​aplinkose arba operacinėse sistemose nekeičiant arba nekeičiant šaltinio failų.

Sąlyginiai apibrėžimai, naudojami tikrinant sąlyginį kompiliavimą, įvairiose kalbose gali skirtis, tačiau dažniausiai tai yra makrokomandos arba kitos metaduomenų išraiškos, nepatenkančios į įprastų programos kintamųjų sritį. Tokiose kalbose kaip C kintamieji paprastai yra makrokomandos, kurias nuskaito išankstinis procesorius. Dažniausiai makrokomandos nepasiekiamos naudojant faktinį vykdomosios programos šaltinio kodą, net jei jos yra tuose pačiuose šaltinio failuose.

Nurodymai, naudojami apibrėžtiems sąlyginiams kintamiesiems tikrinti, yra elementarios ir vadovaujasi tokia pačia logika kaip ir jei-tada teiginys. Pagrindiniai bandymai, kuriuos galima atlikti atliekant sąlyginį kompiliavimą, yra tai, ar reikšmė apibrėžta, neapibrėžta, arba kai kuriais atvejais, ar du apibrėžti kintamieji yra lygiaverčiai. Patys kintamieji ar makrokomandos paprastai neturi jokios reikšmingos reikšmės, nes juos apibrėžiant tikrina direktyvos. Tačiau kai kuriose kalbose ir kompiliatoriuose apibrėžto kintamojo reikšmė gali būti svarbi, jei jie vertinami pagal Būlio būseną.

Kai kompiliatorius susiduria su direktyvomis, naudojamomis sąlyginiam kompiliavimui, direktyvos įvertinamos siekiant išsiaiškinti, ar jos patikrinamos kaip teisingos, ar klaidingos. Jei tiesa, kodas, kuris seka direktyvą, sukompiliuojamas kaip įprasta; kitu atveju kompiliatorius visiškai praleis kodą, esantį pagal direktyvą. Tai skiriasi nuo sąlyginių loginių teiginių pačiame vykdomajame programos kode, nes net jei logika turi kodo bloką, kurio negalima vykdyti, daugeliu atvejų jis vis tiek bus interpretuojamas ir sukompiliuojamas. Naudojant sąlygines išankstinio procesoriaus direktyvas, praleistas kodas niekada neįtraukiamas, interpretuojamas ar nekompiliuojamas. Taip pat reikia pažymėti, kad kai išankstinis procesorius įvertina visus sąlyginius kintamuosius ir nurodymus, jie nėra kompiliuojami su likusia programos dalimi, nes jie skirti tik nukreipti kompiliatorių.

Sąlyginis kompiliavimas dažniausiai naudojamas norint įtraukti arba neįtraukti kodo, būdingo konkrečiai operacinei sistemai ar aplinkai. Tai reiškia, kad bibliotekos, esančios vienoje operacinėje sistemoje, gali būti sąlyginai įtrauktos, jei direktyvos nustato, kad programa kompiliuojama pagal tą operacinę sistemą. Be to, direktyvos taip pat gali būti naudojamos kodui įtraukti arba neįtraukti pagal vartotojo apibrėžtus kintamuosius. Tai galima padaryti taip, kad derinimo arba profiliavimo kodas nebūtų įtrauktas į galutinę programos versiją, arba tam tikras funkcijas galima įjungti arba išjungti, neturėdami atskirų kodo kopijų.