Kompilyator

Esaplawda **kompilyator** − bir programmalastırıw tilinde (dáslepki til) jazılǵan kompyuter kodın basqa tilge (maqsetli tilge) awdaratuǵın kompyuter programması. "Kompilyator" atı tiykarınan derek kodın joqarı dárejeli programmalastırıw tilinen tómen dárejeli programmalastırıw tiline (mısalı, assembler tili, obyekt kodı yamasa mashina kodı) orınlanıwshı (ingl. executable) programmanı jaratıw ushın awdaratuǵın programmalar ushın qollanıladı.: p1 

Kóplegen hár túrli túrdegi kompilyatorlar bar, olardıń shıǵısları hár túrli paydalı formalarda boladı. Kross-kompilyator kompilyatordıń ózi jumıs isleytuǵın CPU yamasa operaciyalıq sistemaǵa qaraǵanda basqasha CPU yamasa operaciyalıq sistema ushın kod jaratadı.  Bootstrap (júklewshi) kompilyatorı  kóbinese waqıtlı kompilyator bolıp, til ushın  turaqlıraq yamasa jaqsı optimallastırılǵan kompilyatordı kompilyaciyalaw ushın qollanıladı. 

Baylanıslı programmalıq támiynatlarǵa dekompilyatorlar, tómen dárejeli tillerden joqarı dárejeli tillerge awdaratuǵın programmalar; joqarı dárejeli tiller arasında awdaratuǵın programmalar, kóbinese derek kodtan derekke kompilyatorlar yamasa transpilyatorlar dep ataladı; tildi qayta jazıwshılar, kóbinese tildi ózgertip, ańlatpanıń formasın awdaratuǵın programmalar; hám kompilyator-kompilyatorlar, kompilyatorlardı (yamasa olardıń bir bólimin) jaratuǵın kompilyatorlar, kóbinese kóplegen hár túrli kompilyatorlardı jaratıw imkaniyatına iye bolıw ushın ulıwma hám qayta paydalanıwǵa jaqın túrde boladı.

Kompilyator tómendegilerdiń ayırımların, kóbinese fazalar dep atalatuǵın operaciyaların ámelge asırıwı múmkin: aldınnan qayta islew, leksikalıq analiz, tallaw, semantikalıq analiz (sintaksisli baǵdarlanǵan awdarma), kiris programmaların aralıq kóriniske túrlendiriw, kodtı optimallastırıw hám mashinaǵa tiyisli koddı jaratıw. Kompilyatorlar usı fazalardı ónimli dizaynı hám dáslepki kirgiziwdi maqsetli shıǵarıwǵa túrlendiriwdiń durıslıǵın xoshametleytuǵın modullik komponentler retinde ámelge asıradı. Kompilyatordıń durıs emes háreketi sebepli payda bolǵan programmalıq qátelerdi izlew hám sheshiw júdá qıyın bolıwı múmkin; sonlıqtan kompilyator ámelge asırıwshılar kompilyatordıń durıslıǵın támiyinlew ushın aytarlıqtay kúsh jumsaydı.

Kompilyatorlar derek programmaların túrlendiriw ushın qollanılatuǵın jalǵız til processorı emes. Interpretator − kórsetilgen operaciyalardı bir waqıtta orınlap, túrlendiretuǵın kompyuter programmalıq támiynatı.: p2  Awdarma procesi kompyuter tilleriniń dizaynına tásir etedi, bul kompilyaciyalaw yamasa interpretaciyalawǵa ústemlik beredi. Teoriyalıq jaqtan, programmalastırıw tili kompilyatorǵa da, interpretatorǵa da bolıwı múmkin. Ámeliyatta programmalastırıw tilleri ádette tek birewine (kompilyatorǵa yamasa interpretatorǵa) baylanıslı.

## Tariyxı

Ekinshi dúnyajúzilik urıs gezinde alımlar, matematikler hám injenerler islep shıqqan teoriyalıq esaplaw koncepciyaları cifrlı zamanagóy esaplawlardıń rawajlanıwınıń tiykarın quradı. Ápiwayı ekilik tiller cifrlı qurılmalar tek birlik penen nollerdi hám tiykarǵı mashina arxitekturasındaǵı sxema úlgilerin túsinetuǵınlıqtan rawajlandı. 1940-jıllardıń sońında assembler tilleri kompyuter arxitekturasınıń abstrakciyasın anaǵurlım ónimli usınıw ushın jaratıldı.[5] Dáslepki kompyuterlerdiń sheklewli yadı sıyımlılıǵı dáslepki kompilyatorlar islep shıǵarılǵanda aytarlıqtay texnikalıq qıyınshılıqlarǵa alıp keldi. Sonlıqtan kompilyaciya procesin bir neshe kishi programmalarǵa bóliw kerek boldı. Frontend-tiń sońǵı programmaları maqsetli kodtı jaratıw ushın artqı (backend) programmalar paydalanatuǵın tallaw ónimlerin shıǵaradı. Kompyuter texnologiyaları kóbinese resurslar menen támiyinlenetuǵınlıqtan, kompilyator dizaynı kompilyaciya procesine jaqsıraq sáykes keliwi múmkin.

Baǵdarlamashı ushın joqarı dárejeli tildi qollanıw kóbinese ónimli, sonlıqtan joqarı dárejeli tillerdiń rawajlanıwı cifrlı kompyuterler támiyinleytuǵın imkaniyatlardan tábiyiy túrde kelip shıqtı. Joqarı dárejeli tiller − sintaksisi hám semantikası qatań túrde anıqlanǵan rásmiy tiller bolıp, olardıń joqarı dárejeli til arxitekturasın qáliplestiredi. Bul rásmiy tillerdiń elementlerine tómendegiler kiredi:

* Alfavit, hár qanday sheklengen simvollar jıynaǵı;
* Qatardıń, simvollardıń sheklengen izbe-izligi;
* Til, hár qanday simvollardıń izbe-izligi jıynaǵı.

Backus-Naur forması (BNF) − tildiń «gápleriniń» sintaksisin sáwlelendiredi. Onı Djon Bakus islep shıqqan hám Algol 60-tıń sintaksisi ushın paydalanǵan. Ideyalar lingvist Noam Xomskidiń kontekstsiz grammatika koncepciyalarınan kelip shıqqan. «BNF hám onıń keńeytpeleri programmalastırıw jazbalarınıń sintaksisin táriyiplewdiń standart quralları bolıp qaldı. Kóplegen jaǵdaylarda, kompilyatorlardıń bólimleri BNF táriyipinen avtomat túrde jaratıladı.»

1942-jıldan 1945-jılǵa shekem Konrad Zuse kompyuterler ushın birinshi (algoritmlik) programmalastırıw tilin dizaynladı, onı Plankalkul («Plan esaplaw») dep atadı. Zuse sonday-aq programmanıń matematikalıq qáliplestiriwin avtomat túrde mashina oqıy alatuǵın perfolentalıq  plenka qorına awdarıw ushın Planfertigungsgerät («Plan jıynaw qurılmasın») oylap taptı. 1970-jıllarǵa shekem haqıyqıy ámelge asırıw bolmaǵanı menen, ol keyinirek 1950-jıllardıń ayaǵında Ken Iverson tárepinen dizaynlanǵan APL-de kórinetuǵın koncepciyalardı usındı. APL − matematikalıq esaplawlarǵa arnalǵan til.

1949-jıldan 1951-jılǵa shekem, Xeyns Rutixauzer joqarı dárejeli til hám avtomatlı awdarmashı bolǵan Superplan-dı usındı. Onıń ideyaları keyinirek Fridrix L. Bauer hám Klaus Samelson tárepinen jetilistirildi.

Cifrlı esaplawlardıń qáliplesiwshi jıllarındaǵı joqarı dárejeli til dizaynı hár túrli qollanıwlar ushın paydalı programmalastırıw qurallardı usındı:

* FORTRAN (Formula Translation) − injenerlik hám ilimiy qosımshalar ushın, haqıyqıy ámelge asırılǵan dáslepki joqarı dárejeli tillerdiń biri hám birinshi optimallastırıwshı kompilyator bolıp esaplanadı.
* COBOL (Common Business-Oriented Language) − A-0 hám FLOW-MATIC-ten rawajlanǵan hám biznes qosımshaları ushın basım joqarı dárejeli tilge aylandı.
* LISP (List Processor) − simvollı esaplaw ushın.

Kompilyator texnologiyası joqarı dárejeli derek programmanı cifrlı kompyuter ushın tómen dárejeli maqsetli programmaǵa qatań túrde anıqlanǵan túrlendiriwge bolǵan zárúrlikten kelip shıqtı. Kompilyatordı derek kodtı tallaw menen  shuǵıllanatuǵın frontend  hám tallawdı  maqsetli kodqa  sintezlew ushın backend retinde  qarawǵa boladı. Frontend  hám  backend arasındaǵı  optimallastırıw  ónimli maqsetli kodtı  jaratıwı  múmkin.

Kompilyator texnologiyasınıń rawajlanıwındaǵı  ayırım dáslepki  basqıshlar:

* 1952-jıl, May:  Remington Rendtegi Greys Xoperdiń  komandası  A-0 programmalastırıw tili ushın  kompilyatordı jazdı (hám olardı táriyplew ushın  kompilyator terminin oylap taptı),  degen  menen, A-0 kompilyatorı tutas kompilyatordıń zamanagóy túsinigine qaraǵanda kóbirek júklewshi  yamasa biriktiriwshi retinde jumıs islegen.  
* 1952-jıl, sentyabrge shekem: Manchester universitetindegi Manchester Mark I kompyuteri ushın  Alik Glenni tárepinen islep shıǵarılǵan Autocode  kompilyatorın ayırım alımlar birinshi  kompilyaciyalanǵan  programmalastırıw tili dep esaplaydı.
* 1954-1957: IBM-de Djon Bakus basqarǵan komanda, ádette birinshi joqarı dárejeli til dep esaplanatuǵın FORTRAN-dı islep shıqqan. 1957-jıl olardıń birinshi anıq tolıq kompilyatordı kirgizgen dep esaplanatuǵın FORTRAN kompilyatorın ámelge asırıwı juwmaqlandı.
* 1959-jıl: Maǵlıwmatlar sisteması tili boyınsha konferenciya (CODASYL) COBOL islep shıǵarıwdı basladı. COBOL  dizaynı A-0 hám FLOW-MATIC tiykarında jaratılǵan. 1960-jıllardıń basında COBOL kóplegen arxitekturada kompilyaciyalanǵan.
* 1958–1960: Algol 58, Algol 60-tıń prekursorı boldı. Ol strukturalıq programmalastırıwdıń kórsetiwinde tiykarǵı jetiskenlik bolǵan kod blokların engizdi. Algol 60 leksikalıq kólemdegi ornatılǵan funkcional anıqlamalarǵa imkaniyat beretuǵın dáslepki til boldı. Oǵan rekursiya kiritilgen. Onıń sintaksisi BNF-ti paydalanıp anıqlanǵan. Algol 60 onnan keyingi kóplegen tillerdi ilhamlandırdı. Toni Xore: "... ol tek aldınǵı versiyalardan ǵana emes, al onıń barlıq derlik miyrasxorlarına da jaqsılaw boldı" dep atap ótti.
* 1958–1962: MIT-te Djon Makkarti LISP-ti islep shıqtı. Simvollıq qayta islew imkaniyatları jasalma intellekt izertlewleri ushın paydalı imkaniyatlardı berdi. 1962-jılı LISP 1.5 shıǵarılımında Stephen Rassel menen Daniel Dj. Edvards tárepinen jazılǵan interpretator, Tim Xart penen Mayk Levin tárepinen jazılǵan kompilyator hám assembler sıyaqlı ayırım qurallar atap ótildi.

Dáslepki operacion sistemalar hám programmalıq támiynatlar assembler tilinde jazılǵan. 1960-jıllar hám 1970-jıllardıń basında resurslar sheklewleri sebepli sistemalı programmalastırıwda joqarı dárejeli tillerdi qollanıw ele de dawlı máseleleri boldı. Degen menen bir qatar izertlew hám sanaat háreketleri joqarı dárejeli sistemalı programmalastırıw tillerine almasıwǵa túrtki boldı, mısalı, BCPL, BLISS, B hám C.

BCPL (Basic Combined Programming Language) 1966-jılı Kembridj universitetinde Martin Richards tárepinen islep shıǵarılǵan, dáslebinde kompilyator jazıw quralı retinde islep shıǵarılǵan Bir neshe kompilyatorlar ámelge asırıldı, Richardstıń kitabı tilge hám onıń kompilyatorına túsinik beredi. BCPL tek tásirli sistemalı programmalastırıw tili ǵana emes, ol ele de izertlewlerde qollanıladı, biraq sonıń menen bir qatarda B hám C tilleriniń dizaynı ushın negiz bolǵan.

BLISS (Basic Language for Implementation of System Software) − Digital Equipment Corporation (DEC) PDP-10 kompyuteri ushın W.A.Ulftiń Karnegi Mellon universitetiniń (CMU) izertlewshiler toparı tárepinen islep shıǵarılǵan. CMU toparı 1970-jılı bir jıldan keyin BLISS-11 kompilyatorın islep shıǵardı.

Multics (Multiplexed Information and Computing Service) − waqıttı bólistiriwshi operacion sistemasınıń proekti, MIT, Bell Labs, General Electric (keyinirek Honeywell) qatnasıwı menen hám MIT-de Fernando Korbato tárepinen jetekshilik etilgen. Multics IBM hám IBM User Group tárepinen islep shıǵarılǵan PL/I tilinde jazılǵan. IBM-niń maqseti biznes, ilimiy hám sistemalı programmalastırıw talapların qanaatlandıratuǵın edi. Qollawdıń basqa tilleri de bolıwı múmkin edi, biraq ámelge asırılmaǵanı menen PL/I eń tolıq sheshimdi usındı. Multics proektiniń birinshi bir neshe jılında, tildiń ishki jıynaǵı Bell Labs-ten Dug Makllory menen Bob Morris tárepinen Early PL/I (EPL) kompilyatorı járdemi menen assembler tiline kompilyaciyalanıwı múmkin edi. EPL tolıq PL/I ushın boot-strapping kompilyator islep shıǵarılǵanǵa shekem proektti qollap-quwatladı.

1969-jılı Bell Labs Multics proektinen ketti hám Dennis Ritchi hám Ken Tompson jazǵan BCPL koncepciyalarına tiykarlanǵan B sistemalı programmalastırıw tilin islep shıǵardı. Ritch B tiline arnalǵan boot-strapping kompilyatordı jarattı hám PDP-7 ushın B tilinde Unics (Uniplexed Information and Computing Service) operacion sistemasın jazdı. Unics aqırında Unix dep jazıldı.

Bell Labs B hám BCPL tiykarında C tilin islep shıǵarıwdı hám keńeytiwdi basladı. BCPL kompilyatorın Bell Labs Multics sistemasına jetkizgen hám BCPL Bell Labs-te tańlawlı til boldı. Dáslebinde C kompilyatorı islep shıǵarılǵan waqıtta Bell Labs-tiń B kompilyatorına arnalǵan frontend programma qollanıldı. 1971-jılı jańa PDP-11 B-ge keńeytpelerdi anıqlaw hám kompilyatordı qayta jazıw ushın resurslar berdi. 1973-jılǵa kelip C tiliniń dizayni derlik tolıq tamamlandı hám PDP-11 ushın Unix yadrosı C tilinde qayta jazıldı. Stiven Djonson jańa mashinalarǵa C kompilyatorların qayta baǵdarlawdı qollap-quwatlaw ushın  Portable C Compiler (PCC) islep shıǵarıwdı basladı.

Obyektke baǵdarlanǵan programmalastırıw (OBP) qosımshalardı islep shıǵarıw hám saqlaw ushın ayırım qızıqlı imkaniyatlardı usındı. OBP koncepciyaları burınnan bar, biraq LISP hám Simula til iliminiń bólimi edi. Bell Labs C++ islep shıǵarıw arqalı OBP-ǵa qızıǵıwshılıq bildirdi. C++ dáslepki ret 1980-jılı sistemalı programmalastırıw ushın qollanıldı. Dáslepki dizayn C tiliniń sistemalı programmalastırıw imkaniyatların Simula koncepciyaları menen biriktirdi. 1983-jılı obyektke baǵdarlanǵan imkaniyatlar qosıldı. Cfront programması C84 tiliniń kompilyatorına arnalǵan C++ interfeysin ámelge asırdı. Keyingi jılları C++ kompilyatorları C++ tiliniń ataqlılıǵı ósken sayın islep shıǵarıldı.

Kóplegen qollanıw tarawlarında, joqarı dárejeli tildi qollanıw ideyası tez tarqaldı. Jańa programmalastırıw tilleri támiyinleytuǵın keńeytiw imkaniyatlarına hám kompyuter arxitekturalarınıń artıqsha quramalılıǵına baylanıslı, kompilyatorlar da quramalılıǵı arta basladı.

DARPA (Defense Advanced Research Projects Agency) − Wulftiń CMU izertlewshiler toparı menen 1970-jılı kompilyator proektine qáwenderlik etti. Production Quality Compiler-Compiler PQCC dizaynı dáslepki tildiń hám maqsettiń formal anıqlamalarınan Production Quality Compiler (PQC) jaratıwǵa ámelge asırıladı. PQCC kompilyator generatorın kóbirek paydalanıwǵa qaraǵanda, ulıwma mánistegi kompilyator generatorı (mısalı, Yacc) retinde kompilyator-kompilyator terminin keńeytiwge háreket etti. PQCC-ti kompilyator generatorı retinde dep aytıwǵa boladı.

PQCC kodtı jaratıw procesine qaratılǵan izertlewleri haqıyqıy avtomatlı kompilyator jazıw sistemasın dúziwge háreket etti. Bul háreket PQC-diń fazalıq strukturasın ashıp, proektlestirdi. BLISS-11 kompilyatorı tiykarǵı strukturanı támiyinledi. Fazalar analizlerdi (frontend),  virtual mashinaǵa aralıq túrlendiriwdi (orta basqısh) hám maqsetke túrlendiriwdi (backend)  qamtıdı. TCOL − aralıq kóriniste tilge tiyisli konstrukciyalarǵa qollanıw ushın PQCC izertlewleri ushın islep shıǵarılǵan. TCOL-diń variaciyaları hár túrli tillerdi qolladı. PQCC proekti avtomatlı kompilyatordı dúziw texnikaların izertledi. Dizayn koncepciyaları (1995-jıldan baslap obyektke baǵdarlanǵan) programmalastırıw tili Ada ushın kompilyatorlardı hám kompilyatorlardı optimallastırıwda paydalı ekenligin kórsetti.

Ada STONEMAN hújjeti programmanı qollap-quwatlaw ortalıǵın (APSE)  tiykarı (KAPSE) hám minimal (MAPSE)  menen birge rásmiy túrde belgiledi. AQSH Milliy standartlar institutı (ANSI) hám Xalıqaralıq standartlar shólkemi (ISO) menen birgelikte rawajlanıw hám standartlastırıw háreketlerin qollap-quwatlaytuǵın, Ada interpretatorı NYU/ED islep shıǵarıldı. AQSH áskeriy xızmetleri tárepinen ámelge asırılǵan dáslepki Ada kompilyatorın islep shıǵarıw  STONEMAN hújjetine sáykes  tolıq integraciyalasqan dizayn ortalıǵında kompilyatorlardı qamtıydı. Armiya hám Áskeriy teńiz kúshleri Ada til sisteması (ALS) proekti ushın DEC/VAX arxitekturasına baǵdarlanǵan, al Hawa kúshteri IBM 370 seriyasına baǵdarlanǵan Ada integrallıq ortalıǵın (AIE) basladı. Proektler kútilgen nátiyjelerdi bermese de, olar Ada rawajlanıwı boyınsha ulıwma háreketke úles qostı.

Basqa Ada kompilyator háreketleri Ullıbritaniyada York universitetinde hám Germaniyada Karlsruhe universitetinde ámelge asırıldı. AQSH-ta Verdix (keyinirek Rational tárepinen satıp alınǵan) Armiyaǵa Verdix Ada Development System (VADS)-ti jetkizdi. VADS kompilyatordı qosqanda, islep shıǵarıw qurallarınıń jıynaǵın támiyinledi. Unix/VADS DEC Ultrix hám Sun 3/60 Solaris platformaları,  Armiya CECOM bahalawında Motorola 68020-ǵa baǵdarlanǵan, hár túrli Unix platformalarında xosting etildi. Kóp uzamay, Ada Validaciya testlerinen ótken kóplegen Ada kompilyatorları qoljetimli boldı.  Erkin Programmalıq támiynat Fondınıń GNU proekti, birneshe tillerdi hám maqsetlerdi qollap-quwatlaytuǵın tiykarǵı imkaniyattı támiyinleytuǵın GNU Compiler Collection (GCC) islep shıǵardı. GNAT versiyası eń keńnen qollanılatuǵın Ada kompilyatorlarınıń biri. GNAT erkin, biraq kommerciyalıq qollap-quwatlaw da bar, mısalı, AdaCore 1994-jılı Ada ushın kommerciyalıq programmalıq támiynat sheshimlerin usınıw ushın qurılǵan. GNAT Pro-ǵa integraciyalanǵan islep shıǵarıw ortalıǵın támiyinlew ushın qurallar jıynaǵı bar GNU GCC tiykarındaǵı GNAT kiredi.

Joqarı dárejeli tiller kompilyatorlardı izertlew hám rawajlandırıwǵa dawam etti. Itibar berilgen tarawlarǵa optimallastırıw hám avtomatlı kodtı jaratıw kiredi. Programmalastırıw tillerindegi hám islep shıǵarıw ortalıqlarındaǵı úrdisler kompilyator texnologiyasına tásir etti. Kóplegen kompilyatorlar tildiń tarqatıwlarǵa (PERL, Java Development Kit) hám IDE-niń komponentleri retinde (VADS, Eclipse, Ada Pro) qosıldı. Texnologiyalar arasındaǵı baylanıs hám qarım-qatnas ósti. Veb-xızmetlerdiń payda bolıwı veb-tiller menen skript tilleriniń ósiwine túrtki boldı. Skriptler paydalanıwshı sistema tárepinen orınlanatuǵın buyrıqlardi kirgiziwge bolatuǵın Command Line Interfaces (CLI) dáwirinen baslanǵan. Shell programmaların jazıw ushın shell túsinikleri tiller menen rawajlandı. Dáslepki Windows dizaynları ápiwayı paket programmalastırıw imkaniyatın usındı. Bul tillerdiń dástúrli túrlendiriwi interpretatordı qollanǵan. Keń tarqalǵan emes bolsa da, Bash hám Batch kompilyatorları jazılǵan. Keyingi waqıtta, islep shıǵarıwshılardıń qural jıynaǵınıń bir bólimi retinde jetilisken interpretatordıń tilleri payda boldı. Zamanagóy skript tillerine PHP, Python, Ruby hám Lua kiredi. (Lua keń tarqalǵan oyın islep shıǵarıwda qollanıladı.) Bulardıń barlıǵı interpretator hám kompilyator qollap-quwatıwına iye.

"Kompilyaciya tarawı 1950-jıllar sońında baslanǵanda, olardıń itibarı joqarı dárejeli til programmaların mashina kodına  awdarıwǵa sheklengen edi...  Kompilyaciya tarawı  kóbinese kompyuter arxitekturası, programmalastırıw tilleri, formal usıllar, programmalıq támiynat injeneriyası hám kompyuter qáwipsizligi sıyaqlı basqa tarawlar menen  birlestirilgen." "Kompilyaciya izertlewleri: Keyingi 50 jıl" maqalasında obyektke baǵdarlanǵan tiller menen Javanıń  zárúrligi atap ótildi. Qáwipsizlik hám parallel esaplaw keyingi izertlew maqsetleri arasında kórsetildi.

## Kompilyator qurılısı
Kompilyator joqarı dárejeli derek programmanı tómen dárejeli maqsetli programmaǵa rásmiy túrlendiriwdi ámelge asıradı. Kompilyatordı dizaynlaw tolıq sheshimdi anıqlawǵa yamasa kompilyaciya quralları menen, mısalı aldınnan qayta islewshiler menen, assemblerler menen, biriktiriwshi menen, ózara háreketlesetuǵın anıqlanǵan ishki jıynaqtı sheshiwge imkaniyat beredi. Dizayn talapları, ishki kompilyator komponentleri arasında hám  sırttan qollap-quwatlaytuǵın qural jıynaqları arasında, qatań túrde anıqlanǵan interfeyslerdi qamtıydı.

Dáslepki kúnlerde kompilyatordı dizaynlawdıń usılı qayta islenetuǵın kompyuter tiliniń quramalılıǵı, onı dizaynlaytuǵın adam(lar)dıń tájiriybesi hám qoljetimli resurslar menen tikkeley baylanıslı boldı. Resurslar sheklewleri derek kodın bir neshe ret ótkeriw zárúrligine alıp keldi.

Bir adam tárepinen jazılǵan salıstırmalı túrde ápiwayı tilge arnalǵan kompilyator, bir, monolitli programmalıq támiynat bolıwı múmkin. Degen menen, derek til quramalılıǵı ósken sayın, dizayn bir neshe óz-ara baylanıslı fazalarǵa bóliw múmkin.  Bólek fazalar kompilyaciya procesindegi funkciyalarǵa rawajlanıwdı  baǵdarlaw ushın dizayn jaqsılawların usınadı.

### Kóp ótiwli kompilyatorlarǵa qarsı bir retlik
Kompilyatorlardı ótiwler sanı boyınsha klassifikaciyalaw kompilyatorlar júdá kóp jumıs isleytuǵınlıǵına baylanıslı kompyuter resursları sheklewleri menen baylanıstırılǵan. Kompilyaciya kóplegen jumıstı óz ishine aladı hám dáslepki kompyuterlerde bul barlıq jumıstı ámelge asıratuǵın bir programmanı saqlaw ushın jetkilikli yad bolmaǵan. Nátiyjesinde kompilyatorlar kishi programmalarǵa bólindi, olardıń hár qaysısı kerekli analizler menen túrlendiriwlerdi ámelge asırıw arqalı derek kodqa (yamasa onıń ayırım kórinislerine) bir ret ótedi.

Bir ótiwde kompilyaciyalaw imkaniyatı klassikalıq jaqtan artıqmashılıq retinde qarastırıladı, óytkeni bul kompilyatordı jazıw jumısın jeńilletedi hám bir ótiw kompilyatorları kóbinese kóp ótiw kompilyatorlarına qaraǵanda tezirek kompilyaciyalawdı ámelge asıradı. Usılayınsha, dáslepki sistemalardıń resurs sheklewleri sebepli kóplegen dáslepki tiller, ásirese Paskal tili, bir ótiwde kompilyaciyalanıw ushın arnawlı dizaynlanǵan.

Ayırım jaǵdaylarda tildiń imkaniyatın dizaynlaw kompilyatordı derek kodǵa birden kóplep ótiwdi ámelge asırıwǵa májbúr etiwi múmkin. Mısalı, derek kodınıń 20-qatarda payda bolatuǵın, 10-qatarda payda bolatuǵın operatordıń túrlendiriwine tásir etetuǵın járiyalanıwdı qarastırıń. Bul jaǵdayda birinshi ótiw keyingi  operatorlardıń  nátiyjesine tásir etetuǵın járiyalanıwlar tuwralı informaciyanı jıynaw kerek, nátiyjede túrlendiriw keyingi ótiw gezinde orınlanadı. 

Bir ótiwde kompilyaciyalawdıń kemshiligi − joqarı sapalı koddı jaratıw ushın kerekli kóbirek jetilistirilgen optimallastırıwlardı ámelge asırıw múmkin emesligi. Optimallastırıwshı kompilyator qansha ótiwdi ámelge asırǵanın dál esaplaw qıyın bolıwı múmkin. Mısalı, optimallastırıwdıń hár túrli fazaları bir ańlatpanı bir neshe ret analizlewı múmkin, biraq basqa ańlatpanı tek bir ret analizleydi.

Kompilyatordı kishi programmalarǵa bóliw, dállengen durıs kompilyatorlar dúziwge qızıǵıwshı izertlewshiler tárepinen qollanılatuǵın metod bolıp tabıladı. Kishi programmalar jıynaǵınıń durıslıǵın dálillew, kóbirek, jeke, ekvivalent programma durıslıǵın dálillewge qaraǵanda, kóbinese az kúshti talap etedi. 

### Úsh basqıshlı kompilyator strukturası

Kompilyator dizaynınan qanday dárejede fazalar bolǵanlıǵına qaramastan, fazalardı úsh basqıshtıń birewine tayınlawǵa boladı. Basqıshlarǵa frontend (aldınǵı tárepi), orta basqısh hám backend (artqı tárepi) kiredi.

* Frontend kirgiziwdi skanerleydi hám sintaksisti hám semantikanı belgili bir dáslepki tilge sáykes tekseredi. Statikalıq túrde terilgen tiller ushın, ol tip informaciyasın jıynap, tipti tekseriwdi ámelge asıradı. Eger kiris programması sintaksislik jaqtan durıs emes bolsa yamasa tiptegi qátege iye bolsa, ol ádette máseleniń anıqlanǵan ornın kórsetip, qáteler menen/yamasa eskertiw xabarların jaratadı. derek kodında; ayırım jaǵdaylarda haqıyqıy qáte programmada aldınnan bolıwı múmkin. Frontendtiń aspektlerine leksikalıq analiz, sintaksisli analiz hám semantikalıq analiz kiredi. Frontend kiris programmasın orta basqıshta keyingi qayta islew ushın aralıq kóriniske (IR) túrlendiredi. Bul IR ádette dáslepki kodqa qaraǵanda programmanıń tómen dárejeli kórinisi bolıp tabıladı.
* Orta basqısh IR-de maqsetli CPU arxitekturasına ǵárezsiz bolǵan optimallastırıwlardı orınlaydı. Bul derek kodı/mashina kodınıń ǵárezsizligi hár túrli tillerdi hám maqsetli processorlardı qollap-quwatlaytuǵın kompilyator versiyaları arasında ulıwma optimallastırıwlardı bólisip alıwǵa baǵdarlanǵan. Orta basqısh optimallastırıwlarınıń mısalları: paydasız kodtı (óli-kodtı óshiriw) yamasa qoljetimsiz kodtı (qoljetimlilikti analizlew) alıp taslaw, turaqlı mánislerdi tabıw hám tarqatıw (turaqlı tarqatıw), esaplawdı siyrek orınlanatuǵın orınǵa (mısalı, cikldan tıs) ótiw yamasa kontekstke tiykarlanǵan esaplawdı qánigelestiriw, aqırǵı jaǵdayda backend tárepinen qollanılatuǵın «optimallastırılǵan» IR-di jaratıw.
* Backend orta basqıshtaǵı optimallastırılǵan IR-di qabıl etedi. Ol maqsetli CPU arxitekturasına tiyisli bolǵan kóbirek analizlerdi, túrlendiriwlerdi hám optimallastırıwlardı ámelge asırıwı múmkin. Backend maqsetke ǵárezli assembler kodın jaratadı, proceste registr bóliwdi ámelge asıradı. Backend kórsetpelerdi keńeytiwdi ámelge asıradı, ol kórsetpelerdi parallel orınlaw birlikleri basına, keńeytiw orınların toltırıw arqalı qayta tártiplestiredi. Kóplegen optimallastırıw máseleleri NP-qıyınshılıqta bolsa da, olardı sheshiw ushın evristikalıq usıllar jaqsı rawajlanǵan hám ónimlilikke arnalǵan kompilyatorlarda ámelge asırılǵan. Tipik túrde backendtiń shıǵısı belgili bir processorǵa hám operacion sistemaǵa qánigelestirilgen mashina kodı bolıp tabıladı.

Bul frontend/orta basqısh/backend usılı hár túrli tiller ushın frontendlerdi hám hár túrli CPU-lar ushın backendlerdi birlestiriwge, orta basqıshtaǵı optimallastırıwlardı bólisip alıwǵa imkaniyat beredi. Bul usıldıń ámeliy mısalları – GNU Compiler Collection, Clang (LLVM-ge tiykarlanǵan C/C++ kompilyatorı), hám Amsterdam Compiler Kit, olardıń kóplegen frontendleri, bólingen optimallastırıwları menen kóplegen backendleri bar.

#### Front end

Frontend derek kodın analizlew arqalı programmanıń ishki kórinisin dúzedi, onı aralıq kórinis (IR) dep atadı. Ol sonday-aq simvollar kestesin basqaradı, bul derek kodındaǵı hárbir simvoldı orın, tip hám kólem sıyaqlı baylanıslı informaciyaǵa salıstırıwǵa arnalǵan maǵlıwmatlar strukturası.

Frontend skanersiz tallawshıdaǵıday, tek bir monolitli funkciya yamasa programma bolıwı múmkin bolsa da, ol ádette bir neshe fazalarǵa bólinip ámelge asırıladı hám analizlenedi, olar izbe-iz yaǵnıy bir waqıtta ótiwi múmkin. Bul usıl modullik hám  alańlawlardı ajıratıwǵa baylanıslı qolaylı. Kóbinese frontend úsh fazaga bólinedi: leksikalıq analiz (sonday-aq leksika yamasa skanerlew dep te ataladı), sintaksisli analiz (sonday-aq skanerlew yamasa tallaw dep te ataladı) hám semantikalıq analiz. Leksing hám tallaw sintaksisli analizdi (sáykesinshe, sóz sintaksisi hám fraza sintaksisi) qamtıydı hám ápiwayı jaǵdaylarda, bul moduller (lekser hám tallawshı) tilge arnalǵan grammatikadan avtomat túrde jaratıwǵa boladı, biraq quramalılıǵı joqarı jaǵdaylarda qol menen ózgertiw kerek. Leksikalıq grammatika hám frazalar grammatikası ádette kontekstsiz grammatikalar bolıp tabıladı, bul analizdi ádewir jeńilletedi, kontekstke sezimtallıq semantikalıq analiz basqıshında qayta islenedi. Semantikalıq analiz basqıshı kóbinese quramalılıǵı joqarı hám qol menen jazılǵan, biraq atribut grammatikaların paydalanıw arqalı bólek túrde yamasa tolıq avtomatlastırıwǵa boladı. Bul fazalardıń ózlerin taǵı da bóliwge boladı: leksikanı skanerlew hám bahalaw retinde, al tallawdı konkret sintaksis teregin (CST, tallaw teregi) dúziw hám keyin onı abstrakt sintaksis teregine (AST, sintaksis teregi) túrlendiriw retinde. Ayırım jaǵdaylarda qosımsha fazalar qollanıladı, ásirese qatar qayta dúziw hám aldınnan qayta islew, biraq olar siyrek ushırasadı. 

Frontendtiń tiykarǵı fazaları tómendegilerdi qamtıydı:

* Kiris belgi izbe-izligin tallawshıǵa tayar bolǵan kanonikalıq formaǵa aylandıradı. Gilt sózlerin qısqartatuǵın yamasa identifikatorlarda erikli bos orınlarǵa ruqsat beretuǵın tiller bul fazanı talap etedi. 1960-jıllarda qollanılǵan, joqarıdan tómenge, rekursiv-túsiriwge, kestege tiykarlanǵan tallawshılar ádette derekti bir belgiden oqıydı hám  bólek tokenlew fazanı talap etpeydi. Atlas Autocode hám Imp (hám Algol hám Coral 66-nıń ayırım ámelge asırıwları) − kompilyatorları Qatar Qayta Dúziw fazası bolatuǵın qısqartılǵan tillerdiń mısalları.
* Aldınnan qayta islew makro almastırıwdı hám shártli kompilyaciyanı qollap-quwatlaydı. Kóbinese  aldınnan qayta islew fazası sintaksisli yamasa semantikalıq analizden aldın júz beredi; mısalı, C jaǵdayında  aldınnan qayta islewshi sintaksisli formalardan góre, leksikalıq tokenlerdi qayta isleydi. Degen menen, Scheme sıyaqlı ayırım tiller sintaksisli formalarǵa tiykarlanǵan makro almastırıwlardı qollap-quwatlaydı. 
* Leksikalıq analiz (sonday-aq leksika yamasa tokenlew dep te ataladı) derek kodınıń tekstin leksikalıq tokenler dep atalatuǵın kishi bólekler izbe-izligine bóledi. Bul fazanı eki basqıshqa bóliwge boladı: skanerlew, kiris tekstin leksikalıq birlikler dep atalatuǵın sintaksislik birlikke bóledi hám olarǵa kategoriya tayınlaydı; hám bahalaw, leksemalardı qayta islengen mániske aylandıradı. Token − token atı menen minnetli emes token mánisinen ibarat jup bolıp tabıladı. Ulıwma token kategoriyalarına identifikatorlar, gilt sózler, ajıratqıshlar, operatorlar, literallar hám kommentariyalar kiriwi múmkin, biraq token kategoriyaları jıynaǵı hár túrli programmalastırıw tillerinde ózgeshelenedi. Leksema sintaksisi ádette turaqlı til bolıp tabıladı, sonlıqtan turaqlı sóz dizbegine qurılǵan sheklengen jaǵdaylı avtomat onı tanıw ushın qollanıwǵa boladı. Leksikalıq analizdi ámelge asıratuǵın programmalıq támiynat leksikalıq analizator dep ataladı. Bul bólek basqısh bolmaydı − ol skanersiz tallawda tallaw basqıshı menen birlestiriledi, bul jaǵdayda tallaw token dárejesinde emes, belgi dárejesinde orınlanadı.
* Sintaksisli analiz (sonday-aq tallaw dep te ataladı) programmanıń sintaksislik strukturasın anıqlaw ushın token izbe-izligin tallawdı qamtıydı. Bul faza ádette tallaw teregin dúzedi, bul tokenlerdiń sızıqlı izbe-izligin tildiń sintaksisin anıqlaytuǵın rásmiy grammatikanıń qaǵıydalarına sáykes qurılǵan terek strukturası menen almastıradı. Tallaw teregin kóbinese kompilyatordaǵı keyingi fazalar tárepinen analizlenedi, keńeytiledi hám túrlendiriledi.
* Semantikalıq analiz tallaw teregine semantikalıq informaciyanı qosadı hám simvollar kestesin dúzedi. Bul faza tipti tekseriw (tip qátelerdi tekseriw), yamasa obyektti baylanıstırıw (ózgeriwshi hám funkciya siltemeleriniń anıqlamaları menen baylanıstırıw), yamasa anıq tayınlaw (jergilikli ózgeriwshi mánislerdi paydalanıwdan aldın inicializaciyalanıwın talap etiw) sıyaqlı semantikalıq tekseriwlerdi ámelge asıradı, durıs emes programmalarǵa bas tartıw yamasa eskertiwlerdi usınadı. Semantikalıq analiz ádette tolıq tallaw teregin talap etedi, yaǵnıy bul faza logikalıq jaqtan tallaw fazasınan keyin kelip, logikalıq jaqtan kodtı jaratıw fazasınan aldın ámelge asıradı, biraq kompilyatordı ámelge asırıwda kóplegen fazalardı bir ótiwge jiyi birlestiriwge boladı.

#### Orta basqısh
Orta basqısh, sonday-aq optimallastırıwshı dep te ataladı, jaratılǵan mashina kodınıń ónimliligin hám sapasın jaqsılaw ushın aralıq kóriniste optimallastırıwlardı orınlaydı. Orta basqısh maqsetli CPU arxitekturasına ǵárezsiz bolǵan optimallastırıwlardı óz ishine aladı.

Orta basqıshtıń tiykarǵı fazaları tómendegilerdi qamtıydı:

* Analiz: Bul kiris kórinisinen alınǵan aralıq kórinisinen programma informaciyasın jıynaw; maǵlıwmatlar aǵımın analizlew, baylanıslı analiz, psevdo analiz, kórsetkishti analizlew, qashıw analiz t.b. menen birgelikde paydalanıw-anıqlaw shınjırların dúziw ushın qollanıladı.  Dál analiz − kompilyatordı optimallastırıwdıń qálegen tiykarı bolıp tabıladı. Hárbir kompilyaciyalanǵan  funkciyanıń basqarıw aǵımı grafigi hám programmanıń shaqırıw grafigi ádette analiz basqıshında dúzilgen. 
* Optimallastırıw: aralıq tildiń kórsetiw modeli funkcional jaqtan ekvivalent, biraq tezirek (yamasa kishi) formalarǵa túrlendiriledi. Ataqlı optimallastırıwlar:  orınǵa keńeytiw,  óli kodtı óshiriw,  turaqlı tarqatıw,  cikldi túrlendiriw hám  hátte avtomatlı parallellew.

Kompilyatordı analizlew −  hár qanday  kompilyatordı optimallastırıwdıń aldınǵı shárti bolıp, olar bir-biri menen  tıǵız jumıs  isleydi. Mısalı,  baylanıslı analiz  cikldı túrlendiriw ushın júdá zárúr.

Kompilyator analiziniń hám optimallastırıwlardıń kólemi aytarlıqtay ózgeshelenedi;  olardıń kólemi baslanǵısh  blok ishinde jumıs islewden baslap, tolıq proceduralarǵa yamasa hátte pútkil programmaǵa shekem bolıwı múmkin. Optimallastırıw dárejesi menen kompilyaciyanıń  bahası arasında kelisim bar. Mısalı, vizual optimallastırıwları kompilyaciya gezinde tez orınlanadı, biraq tek koddıń kishi jergilikli fragmentine tásir etedi hám kod fragmentiniń payda bolǵan kontekstinen ǵárezsiz túrde orınlanıwı múmkin. Kerisinshe, proceduralar aralıq optimallastırıw kóbirek kompilyaciyalaw waqıtın hám yad keńisligin talap etedi, biraq bir waqıtta birneshe funkciyanıń háreketin qarastırıw arqalı ǵana múmkin bolatuǵın optimallastırıwlardı  qosadı.

Proceduralar aralıq analiz benen optimallastırıwlar HP, IBM, SGI, Intel, Microsoft hám Sun Microsystems kompaniyasınıń zamanagóy kommerciyalıq kompilyatorlarında jiyi usırasadı. Biypul programmalıq támiynatı GCC uzaq waqıt dawamında quwatlı proceduralar aralıq optimallastırıwlardıń joqlıǵı ushın sınǵa ushrıǵan, biraq bul jaǵdayda ózgermekte. Tolıq analiz benen optimallastırıw infrastrukturası bar basqa bir ashıq kodlı kompilyator  – Open64 bolıp, ol kóplegen shólkemler tárepinen izertlew hám kommerciyalıq maqsetler ushın paydalanıladı.

Kompilyator analizi hám optimallastırıw ushın kerek bolǵan qosımsha waqıt hám keńislikke baylanıslı, ayırım  kompilyatorlar olardı ádepki  boyınsha ótkizip jiberedi.  Paydalanıwshılar qanday optimallastırıwlardı qosıw kerekligin kompilyatorǵa anıq aytıw ushın kompilyaciyalaw opciyaların paydalanıwı kerek.

#### Back end
Backend CPU arxitekturasına tiyisli bolǵan optimallastırıwlarǵa hám koddı jaratıwǵa  júwapker.

Backendtiń tiykarǵı fazaları tómendegilerdi qamtıydı:

* Mashinaǵa ǵárezli  optimallastırıwlar: kompilyatordıń maqsetli  CPU arxitekturasınıń  detallarına baylanıslı  optimallastırıwlar. Ańsat mısal, vizual optimallastırıwlar bolıp, ol assembler kórsetpeleriniń qısqa izbe-izligin anaǵurlım ónimli kórsetpelerge túrlendiredi.
* Kodtı jaratıw: túrlendirilgen aralıq til shıǵıs tilge, ádette sistemanıń tiykarǵı mashina tiline awdarıladı. Bul resurslar hám saqlaw qararların, mısalı, qálegen ózgeriwshi mánislerdi registrler menen yadqa jaylastırıw hám sáykes baǵdarlawdıń rejimi menen birge sáykes mashina kórsetpelerin tańlaw hám keńeytiwdi qamtıydı (sonday-aq Sethi-Ullman algoritmin qarań). Qátelerdi ámelge asırıwǵa jáne jeńilletetuǵın qátelerdi tallaw maǵlıwmatların da jaratıw kerek bolıwı múmkin.

### Kompilyatordıń durıslıǵı
Kompilyatordıń durıslıǵı - kompilyatordıń óziniń til specifikaciyasına sáykes háreket etetuǵın kórsetiw háreketi menen shuǵıllanatuǵın programmalıq injeneriya tarawı. Usıllarǵa formal metodlardı qollanıw arqalı kompilyatordı islep shıǵıw hám bar kompilyatorda qatań testlewdi (kóbinese kompilyatordı tekseriw dep ataladı) paydalanıw kiredi.

## Derekler

## Sırtqı siltemeler
 

* Compilers at Curlie
* Incremental Approach to Compiler Construction – a PDF tutorial
* Basics of Compiler Design at the Wayback Machine (archived 15 May 2018)
* Short animation on YouTube explaining the key conceptual difference between compilers and interpreters
* Syntax Analysis & LL1 Parsing on YouTube
* Let's Build a Compiler, by Jack Crenshaw
* Forum about compiler development at the Wayback Machine (archived 10 October 2014)