Pipedija - tautosaka, gandai, kliedesiai ir jokios tiesos! Durniausia wiki enciklopedija durnapedija!


Kompiliuojamos kalbos

Iš Pipedijos - durniausios enciklopedijos.
Jump to navigation Jump to search

Kompiliuojama kalba - tai tokia programavimo kalba, kuri gali būti visiškai pilnavertiškai išverčiama į mašininį kodą taip, kad neliktų interpretuojamų fragmentų. Kitaip tariant, kompiliuojama kalba parašytą programą galima automatinėmis priemonėmis išversti į logiškai tapatų asemblerio kodą.

Automatiškai išversti programą į kokį nors mašininį kodą ne visada paprasta, nes pvz., koks nors kintamasis vienoje vietoje gali būti naudojamas kaip skaičius, kitoje - kaip tekstas, o trečioje - kaip dar kas nors. Gali būti sunkumų ir verčiant programos kodą, nes pvz., kokios nors kalbos konstrukcijos gali tiesiog neturėti išverčiamo ekvivalento.

Kaip pvz., itin sunkus, visiškai nekompiliuojamas atvejis yra "eval" tipo funkcija, kuri leidžia įvykdyti ta pačia kalba parašytą kodą. Jei kodas yra iš anksto neapibrėžtas, o generuojamas programos vykdymo metu, tai kompiliatorius iš principo negali žinoti, koks tenai bus kodas, o tai reiškia, kad negali ir sukompiliuoti jo į mašininį kodą. Kitaip tariant, toksai fragmentas lieka nekompiliuojamu, o tiktai interpretuojamu.

Kadangi kompiliavimui keliama daug įvairių reikalavimų, kompiliuojamos kalbos paprastai turi daug visokių apribojimų ir smarkiai griežtesnę sintaksę. Šiais laikais klasikinėmis kompiliuojamomis kalbomis laikomos Algol tipo kalbos, kurios išsprendė daugelį ankstesnių programavimo kalbų problemų. Nors kompiliuojamų kalbų buvo ir iki tol, visgi Algol ištaisė tiek bėdų, kad faktiškai viskas, kas kompiliuojama, istoriškai dabar jau siejasi su šia kalba.

Iš Algol išaugo dvi esminės kompiliuojamų kalbų grupės - Pascal, kuri dar pertaisė Algol idėjas taip, kad gavosi vienu perėjimu kompiliuojama kalba, o taip pat C kalba, kuri buvo tyčia pakankamai supaprastinta, kad nors ir buvo kompiliuojama dviem perėjimais, kompiliatoriai būdavo paprasti. Šių dviejų kalbų įtaka nulėmė daugumos vėlesnių kompiliuojamų, o taip pat ir daugelio nekompiliuojamų kalbų gramatiką.

Šiuo atžvilgiu ypatingai išskirtinė yra Pascal, nes kadaise ji, o paskui ir jos USCD Pascal realizacija nulėmė daugybės kitų kalbų ir kompiliatorių vystymąsi - buvo netgi periodas, kai apie 90% pasaulio kompiliatorių viename ar kitame kūrimo etape patys naudojo Pascal kompiliatorius. Pascal išskirtinumas - kad jau pačios kalbos pagrinduose buvo atsižvelgta į kompiliavimą taip, kad pavyktų programą sukompiliuoti vienu praėjimu: t.y., buvo griežta tipizacija, privaloma kintamųjų, funkcijų ir procedūrų išankstinė deklaracija, apribotas GOTO ir rekursijos naudojimas ir panašiai. Dėl to kalba gavosi visai paprasta, bet nepaprastai efektyviai kompiliuojama ir optimizuojama, o jos įtaka labai pasijuto daugybėje kitų programavimo kalbų.

Kompiliuojamos kalbos yra daug pranašensės už interpretuojamas kalbas, nes jomis parašytos programos po kompiliacijos gali būti vykdomos kaip tikros mašininės programos. Kitaip tariant, kompiliatorius vieną kartą gerokai padirbėjo, išvertė programą į realų mašininį kodą ir tada jau programa dirba dideliu greičiu. Praktiškai tai reiškia, kad netgi neefekytivai ir menkai optimizuojant kompiliuotos programos dirba bent 10-30 kartų greičiau už greičiausias interpretuojamas programas. Dažniausiai greičių skirtumas būna dar didesnis, iki šimtų ar tūkstnačių kartų.

Tiesa, šitoks greičių skirtumas būna su tam tikromis išlygomis: interpretuojamose programose naudojamos interpretatorių funkcijos dažniai būna kompiliuotos, tad jų vykdymo greitis nesiskiria nuo kompiliuotos programos. Taigi, toksai greičio palyginimas tinka tiktai būtent pačiam interpretuojamam ir kompiliuojamam kodui, o ne iškviečiamoms funkcijoms palyginti. Jei esminę vykdomo kodo dalį sudaro iškviečiamos funkcijos, kompiliuojamų ir interpretuojamų programų greitis gali likti praktiškai vienodas.

Esminis kompiliuojamų kalbų trūkumas - jų reiklumas gramatikai. Šiomis kalbomis negalima rašyti belenkaip, tikintis, kad visvien kažkaip kažkas suveiks. Klaidos čia lemia daug, o kai kada būna ir nepastebimos, išlendančios tik ilgiau ta kalba parašytą programą naudojant. Taigi, toli gražu ne visi programuotojai šias kalbas mėgsta ir toli gražu ne visiems uždaviniams šios kalbos gerai tinka.

Svarbu neužmiršti, kad kai kurių interpretuojamų kalbų kūrėjai visiškai melagingai aiškina, kad jų kalbos esą yra kompiliuojamos, nors niekas tenai nėra kompiliuojama, o tiesiog sutransliuotas pseudokodas prikabinamas prie interpretatoriaus ir pasakoma, kad čia binarinis vykdomasis failas. Tai tokių kalbų rimtai vertinti neverta, nes nesąmonės nenusipelno jūsų dėmesio. Tiesa, norint atskirti tas kompiliuojamas kalbas nuo interpretuojamų, kartais reikia šiek tiek pasiaiškinti apie realizacijas, nes kartais būna nemažų makaronų. Kaip pvz., paskaitę kokią nors Vikipediją galite atrasti kliedesių apie tai, kad kompiliuoamos kalbos esą yra kokia nors ActionScript, Basic ar Java, nors nei viena iš jų nėra kompiliuojama.

Visgi naujesniais laikais griežtą ribą tarp kompiliuojamų ir interpretuojamų kalbų nustatyti sunku, nes pvz., Java kompiliuojama į pseudokodą, o C plus plus gali naudoti kokį nors objektų brokerį, kuris faktiškai veikia kaip specialus interpretatorius. Taigi, visai jau griežtos ribos nebelieka, nes kai kurios realizacijos būna truputį hibridinės. Vėlgi, faktiškai visos kompiliuojamos programavimo kalbos turi ir principines interpretavimo galimybes, tad gali būti vykdomos ir interpretuojant.

Populiarios kompiliuojamos programavimo kalbos

Tarp žinomesnių pilnai kompiliuojamų programavimo kalbų yra šios: