КомпьютерлерБағдарламалау

Аудармашы аудармашының түрлері. Бағдарламаны түрлендіру және аудару

Бағдарламалар, адамдар сияқты, аудармашының немесе аудармашыдан бір тілден екіншісіне аударылуын талап етеді.

Негізгі ұғымдар

Бағдарлама есептеудің лингвистикалық көрінісі болып табылады: i → P → P (i). Аудармашы P және кейбір кіріс деректерін қабылдайтын бағдарлама. Ол x: I (P, x) = P (x) бойынша P орындайды. Барлық мүмкін бағдарламаларды орындауға қабілетті (ресми жүйеде ұсынылуы мүмкін) бірыңғай аудармашы бар екендігі Тьюрингтің өте терең және маңызды ашылуы болып табылады.

Процессор машина тіліндегі бағдарламалардың аудармашы болып табылады. Аудармашыларды жоғары деңгейлі тілдерге жазу әдетте қымбат, сондықтан оларды түсіндіруге оңайырақ формаға аударылады.

Аудармашылардың кейбір түрлері өте қызықты есімдерге ие:

  • Ассемблер бағдарламаларды ассемблерге машина тіліне аударады.
  • Компилятор жоғары деңгейлі тілден төменгі деңгейлі тілге аударады.

Аудармашы - бұл бағдарламаны кейбір тілде S ретінде қабылдайтын және T бағдарламасының екеуі де бірдей семантикасына ие болатын бағдарлама ретінде қабылдайтын бағдарлама. P → X → Q. Яғни, ∀x. P (x) = Q (x).

Егер сіз бүкіл бағдарламаны түсіндірілген нәрсеге айналдырсаңыз, онда бұл орындалудан бұрын компиляция немесе AOT-компиляциясы деп аталады. AOT компиляторларын дәйекті түрде қолдануға болады, соңғысы жиі ассемблер болып табылады, мысалы:

Source code → Құрастырушы (компилятор) → Ассемблер коды → Ассемблер (аудармашы) → Машина коды → CPU (аудармашы).

Интернеттегі немесе динамикалық компиляция басқа компиляцияланған бөліктер орындалатын бағдарламаның бір бөлігі аударылған жағдайда орын алады. JIT-аудармашылары бастапқы кодты қайта-қайта қайталамау үшін олар жасағандарын есте сақтайды. Олар тіпті жұмыс уақытының ортасының мінез-құлқына негізделген адаптивті компиляция жасап, қайта құрастыра алады.

Көптеген тілдер аударма кезінде кодты орындауға және жаңа кодты орындау уақытында жинауға мүмкіндік береді.

Аударма кезеңдері

Аударма талдау мен синтездің кезеңдерінен тұрады:

Source code → Analyzer → Conceptual view → Generator (синтезатор) → Нысаналы код.

Бұл келесі себептерге байланысты:

  • Кез келген басқа әдіс жарамайды. Сөзді аудару оңай емес.
  • Жақсы инженерлік шешім: егер сіз М тілінің тілдері мен N мақсатты тілдері үшін аудармашылар жазатын болсаңыз, онда M + N кешенін (толық аудармашылар) емес, тек M + N қарапайым бағдарламаларын (жартылай комплектілер) жазыңыз.

Дегенмен, іс жүзінде тұжырымдамалық ұсыныс өте сирек сөйлейтін және барлық көзге көрінетін көздер мен мақсатты тілдерді қамту үшін күшті. Олардың кейбіреулері осыған жақын бола алар еді.

Нағыз компиляторлар көптеген кезеңдерден өтеді. Өзіңіздің компиляторыңызды құрған кезде, адамдарға көріністер мен генераторларды жасаған кезде жасаған барлық қиын әрекеттерді қайталаудың қажеті жоқ. Сіз тіліңізді JavaScript немесе C-ге тікелей аудара аласыз және қалған JavaScript-дың қозғалтқыштарын және С-құрастырушыларды пайдаланасыз. Сондай-ақ, сіз қолданыстағы аралық көріністерді және виртуалды машиналарды пайдалана аласыз .

Аудармашы жазбалары

Аудармашы - бұл үш тілдің қатысатын бағдарлама немесе техникалық құрал: дереккөз, мақсатты және негізгі. Олар T-пішімінде жазылуы мүмкін, оны сол жаққа, оң жағындағы мақсатқа және төменгі базаға қою.

Құрастырушылардың үш түрі бар:

  • Аудармашы - бұл өзіндік компилятор, егер оның бастапқы тілі негізгі тілге сәйкес келсе.
  • Мақсатты тіл базалық тілге тең компилятор өзін-өзі резидент деп атайды.
  • Аудармашы - егер басқа тілге және негізгі тілге ие болса, кросс-компилятор.

Неге бұл маңызды?

Тіпті ешқашан нақты компилятор жасамасаңыз да, оны жасау технологиясы туралы білу пайдалы, өйткені ол үшін қолданылатын ұғымдар барлық жерде қолданылады, мысалы:

  • Мәтінді пішімдеу;
  • Деректер базасына сұрау тілдері ;
  • Кеңейтілген компьютерлік сәулет;
  • Жалпыланған оңтайландыру мәселелері;
  • Графикалық интерфейстер;
  • Сценарий тілдері;
  • Контроллерлер;
  • Виртуалды машиналар;
  • Машина аудармалары.

Бұдан басқа, алдын ала өңдегіштерді, құрылысшыларды, жүктеушілерді, отладчиклерді немесе профильдерді жазуды қаласаңыз, компиляторды жазған кездегідей қадамдарды орындау керек.

Сонымен қатар, бағдарламаларды жақсы жазуды үйренуіңізге болады, өйткені тілге аудармашы жасау оның нәзіктігін және белгісіздігін жақсы түсінуді білдіреді. Аудармадағы жалпы принциптерді үйрену сонымен қатар жақсы тілдік дизайнер болуға мүмкіндік береді. Егер ол тиімді түрде іске асырылмаса, онда тіл өте өткір ме?

Кешенді технологиялар

Компиляторлық технологиялар информатиканың көптеген салаларын қамтиды:

  • Формальды тілдік теория: грамматика, талдау, есептеу мүмкіндігі;
  • Компьютерлік архитектура: нұсқаулық жиынтығы, RISC немесе CISC, құбыржолдау, ядро, сағаттар циклы және т.б .;
  • Бағдарламалау тілдерінің тұжырымдамалары: мысалы, жүйелі бақылау, шартты орындау, иерархия, рекурсия, функционалды ыдырау, модульдік, синхрондау, метапрограммалау, ауқым, тұрақтылар, подтиптер, үлгілер, шығу түрі, прототиптер, аннотациялар, ағындар, монадалар, пошта жәшіктері, кеңейтімдер , Глоккарттар, тұрақты өрнектер, транзакциялық жады, мұрагерлік, полиморфизм, параметрлік режимдер және т.б .;
  • Дерексіз тілдер мен виртуалды машиналар;
  • Алгоритмдер және деректер құрылымдары: тұрақты өрнектер, алгоритмдерді талдау, графикалық алгоритмдер, динамикалық бағдарламалау, оқыту;
  • Бағдарламалау тілдері: синтаксис, семантикасы (статикалық және динамикалық), парадигмаларға қолдау көрсету (құрылымдық, OOP, функционалды, логикалық, стек, параллельдік, метапрограммалау);
  • Бағдарламалық жасақтама жасау (компиляторлар, әдетте, үлкен және күрделі): оқшаулау, кэштеу, құрамдастыру, API интерфейстері, қайта пайдалану, синхрондау.

Компиляторды құрастыру

Нағыз аудармашы әзірлеу барысында пайда болатын кейбір мәселелер:

  • Негізгі тілдегі мәселелер. Оны құрастыру оңай ма? Препроцессор бар ма? Түрлер қалай өңделеді? Кітапханалар бар ма?
  • Топтау компиляторы: бір немесе көп жолақты?
  • Қажетті оңтайландыру дәрежесі. Бағдарламаны өте аз немесе оңтайландырмаған жылдам және кіршіксіз аудару қалыпты болуы мүмкін. Шамадан тыс оңтайландыру компиляторды баяулатады, бірақ орындау уақытында ең жақсы код оған тұрарлық болуы мүмкін.
  • Қатені анықтаудың қажетті жылдамдығы. Аудармашы алғашқы қателікте тоқтай ма? Ол қашан тоқтайды? Қателерді түзету үшін компиляторға сенесіз бе?
  • Құралдардың болуы. Егер бастапқы тіл өте аз болса, сканер мен анализатор генераторы міндетті болып табылады. Сондай-ақ код генераторларын генераторлары бар, бірақ олар соншалықты таралған.
  • Жасау үшін мақсатты кодтың түрі. Сіз таза, кеңейтілген немесе виртуалды машина кодын таңдауыңыз керек. Немесе LLVM, RTL немесе JVM сияқты танымал аралық көріністерді жасайтын енгізуді ғана жазыңыз. Немесе C немесе JavaScript ішіндегі бастапқы кодқа аударма жасаңыз.
  • Мақсатты код пішімі. Сіз жинақтау тілін, портативті машина кодын, жад суретінің машиналық кодын таңдай аласыз.
  • Perenatselivanie. Көптеген генераторлармен жалпы кіріс бөлігі болуы жақсы. Сол себепті көптеген кіріс бөліктерінде бір генератор болу керек.

Компилятор архитектурасы: компоненттер

Бұл машиналық кодты шығаратын аудармашының негізгі функционалды компоненттері (егер шығу бағдарламасы C бағдарламасы немесе виртуалды машина болса, онда көптеген қадамдар қажет емес):

  • Енгізу бағдарламасы (белгілер ағыны) сканерге (лексикалық анализатор) кіреді, оны оны таңбалау ағынына айналдырады.
  • Парсер (парсер) олардан дерексіз синтаксистік ағаш жасайды.
  • Семантикалық анализатор семантикалық ақпаратты ажыратады және қателіктер үшін ағаштың түйіндерін тексереді. Нәтижесінде, семантикалық графика - қосымша қасиеттері және орнатылған сілтемелері бар дерексіз синтаксистік ағаш.
  • Аралық коды генераторы ағымдық графикті құрастырады (тораптар негізгі блоктарға топтастырылады).
  • Машинадан тәуелсіз кодты оңтайландырушы негізінен кіші бағдарламалар ішінде қалады (негізгі блокта) және жаһандық (барлық блоктарды) оңтайландыруды орындайды. Қажетсіз кодты азайтады және есептеулерді жеңілдетеді. Нәтиже - өзгертілген ағын графикасы.
  • Мақсатты код генераторы базалық блоктарды басқару желісіне байланыстырады, виртуалды регистрлермен (ықтималсыз) ассемблерде нысан файлын жасайды.
  • Машинадан тәуелсіз байланыстырушы оңтайландырушы жадты регистрлер мен кестелер командалары арасында бөледі. Ассемблерге бағдарламаны шынайы ассемблерге бұруды тиімді пайдалану арқылы түрлендіреді.

Сонымен қатар, қателерді анықтау кіші және символдық кесте менеджері қолданылады.

Лексикалық талдау (сканерлеу)

Сканер бастапқы кодының таңбаларын ағымдық ағынға апарады, кеңістікті, түсініктемелерді және макростарды кеңейтеді.

Сканерлер жиі тіркелімді, шегіністерді, желілік арналарды және кірістірілген түсініктемелерді қабылдау немесе қабылдамау сияқты қиындықтарға жиі кездеседі.

Сканерлеу барысында туындауы мүмкін қателер лексикалық деп аталады және мыналарды қамтиды:

  • Алфавитке жатпайтын таңбалар;
  • Сөз немесе жолдағы таңбалардың санын асып кету;
  • Жабық таңба немесе жолдың литералы емес;
  • Түсініктемедегі файлдың соңы.

Синтаксистік талдау (талдау)

Сарптағыш терминдердің тізбегін дерексіз синтаксистік ағашқа түрлендіреді. Әрбір ағаш түйін атаулы өрістермен бірге сақталады, олардың көпшілігі ағаштың түйіндері болып табылады. Бұл кезеңде циклдар жоқ. Парсерін жасау кезінде грамматиканың күрделілігіне (LL немесе LR) назар аудару керек және анықсыздықты жоюдың қандай да бір ережелері бар-жоғын білуіңіз керек. Кейбір тілдер семантикалық талдауды талап етеді.

Осы кезеңде кездесетін қателер синтаксистік қателер деп аталады. Мысалы:

  • K = 5 * (7 - ші;
  • J = / 5;
  • 56 = x * 4.

Семантикалық талдау

Семантикалық талдау кезінде сандық дискінің графигін қалыптастыру үшін рұқсат етілетін ережелерді тексеріп, синтаксистік ағаштың бөліктерін байланыстыруға (аттардың сілтемелеріне рұқсат беру, түрлерді жалған кастациялау үшін операцияларды енгізу және т.б.).

Әртүрлі тілдер үшін рұқсат етілу ережелерінің жиынтығы әр түрлі. Егер Java-ға ұқсас тілдер жинақталған болса, аудармашылар келесі таба алады:

  • Өзінің ауқымы бойынша айнымалы көп мәлiмдемелер;
  • Айнымалыға оның мәлімдемесіне дейін сілтеме жасау;
  • Жарияланбаған атауға сілтеме;
  • Қолжетімділік ережелерін бұзу;
  • Әдіс шақырғанда аргументтердің үлкен немесе жеткіліксіз саны;
  • Сәйкес келмеді.

Ұрпақ

Аралық кодының генерациясы негізгі блоктарға топтастырылған кассалардан тұратын ағымдық графикті шығарады.

Кодты генерациялау нақты машина кодын жасайды. RISC-машиналары үшін дәстүрлі компиляторларда бірінші кезең виртуалды тіркелімдердің шексіз санына ие ассемберді жасайды. CISC машиналары үшін бұл, мүмкін, болмайды.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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