КампутарыПраграмаванне

Транслятар - гэта ... Віды транслятар. Пераўтварэнне і трансляцыя праграмы

Праграмах, як і людзям, для перакладу з адной мовы на іншую патрабуецца перакладчык, або транслятар.

асноўныя паняцці

Праграма ўяўляе сабой лінгвістычнае ўяўленне вылічэнняў: i → P → P (i). Інтэрпрэтатар ўяўляе сабой праграму, на ўваход якой падаецца праграма Р і некаторыя ўваходныя дадзеныя x. Ён выконвае P на х: I (P, x) = P (x). Той факт, што існуе адзіны транслятар, здольны выконваць усе магчымыя праграмы (якія можна прадставіць у фармальнай сістэме), з'яўляецца вельмі глыбокім і значным адкрыццём Цьюрынга.

Працэсар з'яўляецца інтэрпрэтатарам праграм на машынным мове. Як правіла, занадта дорага пісаць інтэрпрэтатары для моў высокага ўзроўню, таму іх транслююць у форму, якую інтэрпрэтаваць лягчэй.

Некаторыя віды транслятар маюць вельмі дзіўныя імёны:

  • Асэмблер транслюе праграмы на асэмблеры ў машынны мову.
  • Кампілятар транслюе з мовы высокага ўзроўню на мову ніжэйшага.

Транслятар - гэта праграма, якая прымае ў якасці ўваходных дадзеных праграму на некаторай мове S і выдае праграму на мове T такім чынам, што абедзве яны маюць тую ж семантыку: P → X → Q. Гэта значыць, ∀x. P (х) = Q (х).

Калі трансляваць ўсю праграму ў нешта інтэрпрэтаваных, то гэта называецца кампіляцыяй перад выкананнем, або АОТ-кампіляцыяй. АОТ-кампілятары могуць выкарыстоўвацца паслядоўна, апошні з якіх часта з'яўляецца асэмблера, напрыклад:

Зыходны код → Кампілятар (транслятар) → зьмяняй код → Асэмблер (транслятар) → Машынны код → ЦПУ (інтэрпрэтатар).

Аператыўная або дынамічная кампіляцыя адбываецца, калі частка праграмы транслюецца, калі выконваюцца іншыя раней скампіляваныя часткі. JIT-транслятары запамінаюць тое, што яны ўжо выканалі, каб не паўтараць зыходны код зноў і зноў. Яны здольныя нават вырабляць адаптыўную кампіляцыю і перакампіляванне, заснаваную на паводзінах асяроддзя выканання праграмы.

Шматлікія мовы дазваляюць выконваць код падчас трансляцыі і кампіляваць новы код падчас выканання праграмы.

этапы трансляцыі

Трансляцыя складаецца з этапаў аналізу і сінтэзу:

Зыходны код → Аналізатар → Канцэптуальнае ўяўленне → Генератар (сінтэзатар) → Мэтавы код.

Гэта абумоўлена такімі прычынамі:

  • Любы іншы спосаб не падыходзіць. Пословный пераклад проста не працуе.
  • Добрае інжынернае рашэнне: калі трэба напісаць транслятары для M зыходных моў і N мэтавых, спатрэбіцца напісаць толькі M + N простых праграм (полукомпиляторов), а не M × N комплексных (поўных транслятар).

Тым не менш на практыцы канцэптуальнае ўяўленне вельмі рэдка бывае дастаткова выразным і магутным, каб ахапіць усе мажлівыя зыходныя і мэтавыя мовы. Хоць некаторыя і змаглі да гэтага наблізіцца.

Рэальныя кампілятары праходзяць праз мноства этапаў. Пры стварэнні ўласнага кампілятара ня трэба паўтараць ўсю цяжкую працу, якую людзі ўжо прарабілі пры стварэнні уяўленняў і генератараў. Можна трансляваць сваю мову прама ў JavaScript або C і скарыстацца існуючымі JavaScript-рухавікамі і кампілятарамі мовы C, каб зрабіць усё астатняе. Таксама можна выкарыстоўваць існуючыя прамежкавыя прадстаўлення і віртуальныя машыны.

запіс транслятара

Транслятар - гэта праграма або тэхнічны сродак, у якім задзейнічаны тры мовы: зыходны, мэтавай і базісны. Іх можна запісаць у Т-форме, размясціўшы зыходны злева, мэтавай справа і базісны ніжэй.

Існуе тры выгляду кампілятараў:

  • Транслятар - гэта самокомпилятор, калі ў яго зыходны мова адпавядае базісных.
  • Кампілятар, у якога мэтавай мова роўны базісных, называецца саморезидентным.
  • Транслятар - гэта крос-кампілятар, калі ў яго мэтавай і базісны мовы розныя.

Чаму гэта важна?

Нават калі вы ніколі не зробіце сапраўдны кампілятар, добра ведаць аб тэхналогіі яго стварэння, таму што выкарыстоўваюцца для гэтага канцэпцыі прымяняюцца паўсюдна, напрыклад у:

  • фарматаваньню тэкстаў;
  • мовах запытаў да баз даных;
  • пашыраных кампутарных архітэктурах;
  • абагульненых задачах аптымізацыі;
  • графічных інтэрфейсах;
  • мовах сцэнарыяў;
  • кантролерах;
  • віртуальных машынах;
  • машынных перакладах.

Акрамя таго, калі трэба напісаць препроцессора, зборшчыкі, загрузнікі, адладчык або профилировщики, неабходна прайсці праз тыя ж этапы, што і пры напісанні кампілятара.

Таксама можна даведацца, як лепш пісаць праграмы, так як стварэнне транслятара для мовы азначае лепшае разуменне яго тонкасцяў і няяснасцей. Вывучэнне агульных прынцыпаў трансляцыі таксама дазваляе стаць добрым дызайнерам мовы. Ці так гэта важна, наколькі крут мову, калі ён не можа быць рэалізаваны эфектыўна?

ўсёабдымная тэхналогія

Тэхналогія кампілятара ахоплівае мноства розных абласцей інфарматыкі:

  • фармальную тэорыю мовы: граматыку, парсінга, вычислимость;
  • кампутарную архітэктуру: наборы інструкцый, RISC або CISC, канвеерную апрацоўку, ядра, тактавыя цыклы і г.д .;
  • канцэпцыі моў праграмавання: напрыклад, кіраванне паслядоўнасцю выканання, ўмоўнае выкананне, ітэрацыі, рэкурсіі, функцыянальнае разлажэнне, модульнасць, сінхранізацыю, метапрограммирование, вобласць бачнасці, канстанты, падтыпы, шаблоны, тып вываду, прататыпы, анатацыі, патокі, манады, паштовыя скрыні, працягу , групавыя сімвалы, рэгулярныя выразы, транзакцыйных памяць, атрыманне ў спадчыну, палімарфізм, рэжымы параметраў і т. д .;
  • абстрактныя мовы і віртуальныя машыны;
  • алгарытмы і структуры дадзеных: рэгулярныя выразы, алгарытмы парсінга, графічныя алгарытмы, дынамічнае праграмаванне, навучанне;
  • мовы праграмавання: сінтаксіс, семантыку (статычную і дынамічную), падтрымку парадыгмаў (структурнай, ООП, функцыянальнай, лагічнай, стековых, паралелізму, метапрограммирования);
  • стварэнне ПА (кампілятары, як правіла, буйныя і складаныя): лакалізацыю, кэшаванне, компонентизацию, API-інтэрфейсы, паўторнае выкарыстанне, сінхранізацыю.

праектаванне кампілятара

Некаторыя праблемы, якія ўзнікаюць пры распрацоўцы рэальнага транслятара:

  • Праблемы з зыходным мовай. Ці лёгка яго скампіляваць? Ці ёсць препроцессор? Як апрацоўваюцца тыпы? Ці маюцца бібліятэкі?
  • Групоўка праходаў кампілятара: адно-або многоходовая?
  • Ступень пажаданай аптымізацыі. Хуткая і нячыстая трансляцыя праграмы практычна без аптымізацыі можа быць нармальнай. Празмерная аптымізацыя будзе тармазіць кампілятар, але лепшы код падчас выканання можа таго каштаваць.
  • Патрабаваная ступень выяўлення памылак. Ці можа транслятар проста спыніцца на першай памылцы? Калі ён павінен спыніцца? Даверыць Ці кампілятара выпраўленне памылак?
  • Наяўнасць інструментаў. Калі зыходны мова не з'яўляецца вельмі маленькім, сканер і генератар аналізатараў з'яўляюцца абавязковымі. Таксама існуюць генератары генератараў кода, але яны не так распаўсюджаны.
  • Выгляд мэтавага кода для генерацыі. Варта выбіраць з чыстага, дапоўненага або віртуальнага машыннага кода. Або проста напісаць ўваходныя частка, якая стварае папулярныя прамежкавыя прадстаўлення, такія як LLVM, RTL або JVM. Або зрабіць трансляцыю ад зыходнага у зыходны код на C ці JavaScript.
  • Фармат мэтавага кода. Можна выбраць мову асэмблера, пераносны машынны код, машынны код ладу памяці.
  • Перанакіраванне. Пры мностве генератараў добра мець агульную ўваходныя частку. Па гэтай жа прычыне лепш мець адзін генератар для многіх ўваходных частак.

Архітэктура кампілятара: кампаненты

Гэта галоўныя функцыянальныя кампаненты транслятара, генерыруючага машынны код (калі выхадны праграмай з'яўляецца праграма на З або віртуальная машына, то спатрэбіцца не так шмат этапаў):

  • Ўваходная праграма (паток знакаў) паступае ў сканер (лексічны аналізатар), які пераўтворыць яе ў струмень токенаў.
  • Парсер (сінтаксічны аналізатар) будуе з іх абстрактнае сінтаксічнае дрэва.
  • Семантычны аналізатар раскладвае семантычную інфармацыю і правярае вузлы дрэва на памылкі. У выніку будуецца семантычны граф - абстрактнае сінтаксічнае дрэва з дадатковымі ўласцівасцямі і усталяванымі спасылкамі.
  • Генератар прамежкавага кода будуе граф патоку (картэжы групуюцца ў асноўныя блокі).
  • Машинонезависимый аптымізатар кода праводзіць як лакальную (унутры базавага блока), так і глабальную (па ўсіх блоках) аптымізацыю, у асноўным застаючыся ў рамках падпраграм. Скарачае залішняя код і спрашчае вылічэнні. У выніку атрымліваецца мадыфікаваны граф патоку.
  • Генератар мэтавага кода звязвае базавыя блокі ў прамалінейны код з перадачай кіравання, ствараючы аб'ектны файл на асэмблеры з віртуальнымі рэгістрамі (магчыма, неэфектыўнымі).
  • Машинозависимый аптымізатар-кампаноўнік размяркоўвае памяць паміж рэгістрамі і вырабляе планаванне каманд. Ажыццяўляе пераўтварэнне праграмы на асэмблеры ў сапраўдны асэмблер з добрым выкарыстаннем канвеернай апрацоўкі.

Акрамя таго, выкарыстоўваюцца падсістэмы выяўлення памылак і менеджэр табліц знакаў.

Лексічны аналіз (сканаванне)

Сканер канвертуе паток знакаў зыходнага кода ў струмень токенаў, прыбіраючы прабелы, каментары і пашыраючы макрасы.

Сканеры часта сустракаюцца з такімі праблемамі, як прымаць або не прымаць пад увагу рэгістр, водступы, пераклад радка і ўкладзеныя каментары.

Памылкі, якія могуць сустрэцца пры сканаванні, называюцца лексічнымі і ўключаюць:

  • сімвалы, якія адсутнічаюць у алфавіце;
  • перавышэнне колькасці знакаў у слове або радку;
  • не зачынены знак або радковы литерал;
  • канец файла ў каментары.

Сінтаксічны аналіз (парсінга)

Парсер пераўтворыць паслядоўнасць токенаў у абстрактнае сінтаксічнае дрэва. Кожны вузел дрэва захоўваецца як аб'ект з найменных палямі, многія з якіх самі з'яўляюцца вузламі дрэва. На гэтым этапе цыклы адсутнічаюць. Пры стварэнні парсера неабходна звярнуць увагу на ўзровень складанасці граматыкі (LL або LR) і высветліць, ці ёсць якія-небудзь правілы зняцця неадназначнасці. У некаторых мовах сапраўды патрабуюць правядзення семантычнага аналізу.

Памылкі, якія сустракаюцца на гэтым этапе, называюцца сінтаксічнымі. напрыклад:

  • k = 5 * (7 - y;
  • j = / 5;
  • 56 = x * 4.

семантычны аналіз

Падчас правядзення семантычнага аналізу неабходна праверыць правілы дапушчальнасці і звязаць часткі сінтаксічнага дрэва (дазваляючы спасылкі імёнаў, устаўляючы аперацыі для няяўна прывядзення тыпаў і т. Д.) Для фарміравання семантычнага графа.

Відавочна, што набор правілаў дапушчальнасці ў розных моў розны. Калі кампілююцца Java-падобныя мовы, транслятары могуць знайсці:

  • множныя аб'явы зменнай у межах вобласці яе дзеяння;
  • спасылкі на зменную да яе аб'явы;
  • спасылкі на неаб'яўленай імя;
  • парушэнне правілаў даступнасці;
  • занадта вялікая ці недастатковае колькасць аргументаў пры выкліку метаду;
  • неадпаведнасць тыпаў.

генерацыя

Генерацыя прамежкавага кода праводзіць граф патоку, складзены з картэжаў, згрупаваных у базавыя блокі.

Генерацыя кода праводзіць рэальны машынны код. У традыцыйных кампілятарах для RISC-машын на першым этапе ствараецца асэмблер з бясконцым лікам віртуальных рэгістраў. Для CISC-машын, верагодна, гэтага не адбудзецца.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 be.delachieve.com. Theme powered by WordPress.