Mga computerProgramming

Broadcaster - ay ... Mga uri ng compiler. I-convert at broadcast programa

Mga programa, pati na rin ang mga tao na i-translate mula sa isang wika papunta sa isa pa kailangan ng interpreter o translator.

pangunahing mga konsepto

Ang programa ay isang linguistic representasyon ng mga kalkulasyon: i → P → P (i). Ang isang interpreter ay isang programa na kung saan ay ibinibigay sa mga input program P at ang ilang mga input x. Ito ay gumaganap sa P x: I (P, x) = P (x). Ang katotohanan na mayroon lamang isang translator ay may kakayahang magsagawa ng lahat ng posibleng mga programa (na maaaring kinakatawan sa pormal na system) ay isang napaka-malalim at makabuluhang pagtuklas Turing.

Ang processor ay isang tagasalin ng mga programa sa wikang machine. Sa pangkalahatan masyadong mahal na magsulat ng interpreter para sa mataas na antas ng wika, kaya sila ay isalin sa isang form na ay mas madaling i-interpret.

Ang ilang mga uri ng mga tagapagsalin ay may napaka-kakaiba mga pangalan:

  • assembler Ang sinasalin programa assembly wika sa wika machine.
  • Ang tagatala isasalin ang isang mataas na antas ng wika sa isang mas mababang wika.

Broadcaster - ay isang programa na tumatagal ng tulad ng data input sa programa sa ilang mga wika S at naglalabas ng T program sa isang paraan na sila ay parehong magkaroon ng parehong semantics: P → X → Q. Iyon ay, ∀x. P (x) = Q (x).

Kung i-broadcast sa buong programa sa isang bagay interpretable, ito ay tinatawag na isang compilation bago pagpapatupad, o AOT compilation. AOT compiler ay maaaring gamitin sa serye, ang huli na kung saan ay madalas na ang assembler, halimbawa:

Ang source code compiler → (tagasalin) → → assembly code assembler (compiler) → → CPU machine code (interpreter).

Pagpapatakbo o dynamic compilation ay nangyayari kung ang programa ay broadcast, kapag isinagawa ng ibang dati nang naipon bahagi. JIT-compiler matandaan kung ano ang mayroon na nagawa na nila sa gayon ay hindi na maulit ang source code muli at muli. Maaari silang kahit na makabuo ng agpang compilation at recompilation batay sa pag-uugali ng programa pagpapatupad kapaligiran.

Maraming wika payagan upang maipatupad code at itala oras at ipunin ang bagong code sa runtime.

translation stage

Broadcast Binubuo ang mga hakbang ng pag-aaral at synthesizing:

Ang source code analyzer → → → pangkonseptong representasyon generator (synthesizer) → Target code.

Ito ay dahil sa mga kadahilanang ito:

  • Anumang iba pang mga pamamaraan ay hindi angkop. Pagsasalin ng salita lamang ay hindi gumagana.
  • Magandang engineering solusyon: kung nais mong magsulat ng mga tagasalin para sa M at N mapagkukunan wika targeted na kailangang isulat lamang ang M + N simpleng programa (polukompilyatorov) sa halip na M × N complex (kabuuan ng mga tagasalin).

Subalit, sa pagsasanay, ang isang pangkonseptong view ng isang napaka-bihira nagpapahayag ng sapat at malakas na sapat na upang masakop ang bawat nalilikhang isip pinagmulan at target na wika. Habang ang ilang ay na dumating malapit sa ito.

Real compiler ipasa sa pamamagitan ng maraming mga antas. Kapag gumagawa ng iyong sariling mga compiler ay hindi kailangan upang ulitin ang lahat ng mga hirap sa trabaho na ang mga tao ay may tapos na upang lumikha ng mga pagkatawan at generators. Maaari mong i-translate ang iyong wika direkta sa JavaScript o C at samantalahin ng mga umiiral na JavaScript engine at ang C compiler na ang bahala. Maaari mo ring gamitin ang mga umiiral na mga intermediate na representasyon at virtual machine.

record tagasalin

Broadcaster - ay isang programa o hardware, na kung saan kasangkot tatlong mga wika: ang pinagmulan, ang patutunguhan at ang base. Maaari silang dapat nakasulat sa isang T-hugis, paglalagay ng orihinal na kaliwa, kanan at target na base sa ibaba.

May tatlong mga uri ng mga compiler:

  • Broadcaster - ay samokompilyator kung ito ay tumutugon sa pangunahing pinagmulang wika.
  • Compiler na nagta-target na wika ay ang baseline, na tinatawag na samorezidentnym.
  • Broadcaster - isang cross-tagatala, kung siya ay naka-target at pangunahing iba't-ibang mga wika.

Bakit ito mahalaga?

Kahit na hindi mo gumawa ng isang tunay na compiler, isang mahusay na kaalaman sa teknolohiya ng paglikha nito, dahil ang konsepto na ginagamit para sa layuning ito ay ginagamit malawakan, halimbawa:

  • pag-format ng teksto;
  • query wika sa mga database;
  • advanced computer architecture;
  • generalized optimization problema;
  • GUI;
  • scripting wika;
  • controllers;
  • virtual machine;
  • Machine translation.

Bilang karagdagan, kung nais mong magsulat preprocessors, linkers, Loader, debuggers at profilers, kailangan mong pumunta sa pamamagitan ng parehong mga hakbang tulad ng kapag sumusulat ng isang tagatala.

Maaari mo ring malaman kung paano sumulat ng mas mahusay na mga programa, dahil ang paglikha ng translator para sa wika ay nangangahulugan ng isang mas mahusay na-unawa ng kanyang mga intricacies at ambiguities. Ang pag-aaral ng pangkalahatang mga prinsipyo ng pagsasahimpapawid ay nagbibigay-daan din sa iyo upang maging isang mahusay na taga-disenyo wika. Kaya ang bagay na ito kung gaano kataas ang wika kung hindi ito ay maaring ipatupad epektibong?

komprehensibong technology

compiler teknolohiya ay sumasaklaw sa maraming iba't-ibang mga lugar ng computer science:

  • pormal na teorya ng wika: grammar, pag-parse, computability;
  • computer architecture. set ng pagtuturo, RISC o CISC, pipelined processing core clock cycles, atbp;
  • konsepto ng programming wika, halimbawa, na magsagawa ng isang pagkakasunod-sunod control, conditional execution, pag-ulit, recursion, pagganap na agnas, modularity, pag-synchronize, meta-programming, saklaw, pare-pareho ang sub-uri, mga template, output uri, modelo, annotation, flow, monads, mailbox, patuloy , wildcard, regular na expression, transactional memory, inheritance, polymorphism, mga setting ng mode, at iba pa etc..
  • abstract wika at virtual machine;
  • algorithm at data istruktura: regular na mga expression, pag-parse ng algorithm, graphics algorithm, dynamic programming, pagsasanay;
  • programming wika: syntax, semantika (static at dynamic), suporta paradigms (structural, OOP, functional, lohikal, stack, paralelismo, meta-programming);
  • paglikha ng software (compiler, kadalasan malaki at kumplikadong): localization, caching, componentize, API-interface, muling gamitin, pag-synchronize.

compiler design

Ang ilan sa mga problema ay nakatagpo sa pag-unlad ng real translator:

  • Mga problema sa pinagmulang wika. madaling upang ipunin ito ay ito? Mayroon bang isang pre-processor? Paano kinakalkula ang mga uri? Mayroon bang isang library?
  • Ang paggrupo compiler passes: single o multi-way?
  • Ang antas ng pag-optimize ninanais. Mabilis at marumi broadcast mga programa na may kaunti o walang pag-optimize ay maaaring maging normal. Over-optimization compiler ay mabagal, ngunit mas mahusay na code sa runtime ay maaaring maging katumbas ng halaga.
  • Ang kinakailangang antas ng error detection. Puwede ng isang translator lang humihinto sa unang error? Kailan dapat itong itigil? Kahit na magtiwala sa compiler error pagwawasto?
  • Ang availability ng mga tool. Kung ang orihinal na wika ay hindi masyadong maliit, ang mga scanner at generator analyzers ay kinakailangan. Mayroon ding mga generators, code generators, ngunit ang mga ito ay hindi kaya karaniwan.
  • Uri ng target na code upang mabuo. Mapili mula purong pupunan o virtual machine code. O kaya lang magsulat ng entry bahaging ito na lumilikha ng isang popular na intermediate representasyon tulad ng LLVM, RTL, o JVM. O gumawa ng isang salin ng orihinal na sa source code sa C o JavaScript.
  • Ang format ng target code. Maaari kang pumili ng isang pagpupulong na wika, isang portable machine code, machine code memory imahe.
  • Retargeting. Kapag ang hanay ng mga generators ay mabuti na magkaroon ng isang pangkaraniwang pumapasok bahagi. Para sa kadahilanang ito ito ay pinakamahusay na magkaroon ng isang generator para sa mga pag-input ng maraming bahagi.

compiler Arkitektura: components

Ang mga ito ay ang mga pangunahing pagganap ng mga bahagi ng isang tagatala na bumubuo ng native na code (kung ang output ng programa ay isang programa sa C o isang virtual machine, hindi mo kailangan kaya maraming yugto):

  • Ang input programa (daloy marks) ay fed sa ang scanner (leksiko analisador), na nag-convert ito sa isang stream ng mga token.
  • Parser (parser) paggawa ng isang abstract syntax puno.
  • Semantiko analyzer decomposes ang semantiko impormasyon at sumusuri sa puno nodes para sa mga error. Bilang isang resulta, na binuo semantic graph - abstract syntax puno na may karagdagang mga ari-arian at ang mga itinatag na mga link.
  • Intermediate code generator ay nagbubuo ng isang daloy graph (tuples ay ipinapangkat sa pangunahing mga bloke).
  • Machine-independent code optimizer ay nagsasagawa ng parehong lokal (sa loob ng unit base) at global (sa lahat ng mga bloke) optimization isa lamang ang natitira sa loob routines. Binabawasan ang kalabisan code at pinapasimple ang mga kalkulasyon. Ang resulta ay isang binagong daloy graph.
  • Generator binds target code basic bloke sa isang rectilinear transmission control code, ang paglikha ng isang bagay na file assembler virtual registers (marahil ay hindi epektibo).
  • Machine-umaasa optimizer, linker allocates memorya sa pagitan registers at ginagawang pagpaplano koponan. Ito ay gumaganap sa programa ng conversion sa pagpupulong na wika sa pagpupulong na ito na may isang mahusay na paggamit ng pipelining.

Sa karagdagan, ang paggamit ng mga error detection subsystem manager at simbolo talahanayan.

Leksiko analysis (pag-scan)

scanner ang nag-convert ang mga pinagmumulan ng stream ng mga character sa isang stream ng mga token, pag-alis whitespace, mga komento at pagpapalawak ng macros.

Scanner madalas ng mga problema, tulad ng kung o hindi na kumuha sa account ang kaso, margin, mga line break at naka-embed komento.

Mga error na maaaring mangyari sa panahon ng pag-scan, na tinatawag na leksiko at isama ang:

  • character na hindi sa alpabeto;
  • labis sa bilang ng mga character sa isang salita o linya;
  • hindi isang closed sign o isang string literal;
  • pagtatapos ng file sa komento.

Pag-parse (parse)

parser nagpalit ang pagkakasunod-sunod ng mga token sa isang abstract syntax puno. Ang bawat node sa tree ay naka-imbak bilang isang object na may pangalang patlang, na marami nito ay ang kanilang mga sarili sa puno node. Sa yugtong ito, walang mga cycles. Kapag lumikha ka ng isang parser ay kinakailangan upang bigyang-pansin ang antas ng pagiging kumplikado ng grammar (LL o LR) at malaman kung mayroong anumang mga patakaran disambiguation. Ang ilang mga wika ay mangangailangan semantiko pagtatasa.

Nahanap ang mga error sa yugtong ito ay tinatawag na syntax. Halimbawa:

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

semantiko pagtatasa

Sa panahon ng semantiko pagtatasa upang suriin ang pagpapahintulot sa mga patakaran at iugnay ang mga bahagi ng parse tree (na nagpapahintulot sa mga pangalan reference pagpasok pagpapatakbo para sa implicit i-type ang mga conversion, at iba pa. D.) Para sa bumubuo ng semantic graph.

Malinaw naman, ang hanay ng mga admissibility ng mga panuntunan sa iba't ibang wika na naiiba. Kung ipunin mo ang Java-tulad ng mga wika, compiler ay maaaring makahanap ng:

  • maramihang mga variable na deklarasyon loob ng saklaw nito;
  • isang reference sa isang variable bago deklarasyon nito;
  • mga sanggunian sa mga pangalan ng hindi nagbigay-alam;
  • paglabag sa mga karapatan ng patent;
  • labis o hindi sapat na dami ng mga argument sa isang paraan ng tawag;
  • i-type ang hindi pagtutugma.

henerasyon

Intermediate code generation gumagawa daloy graph binubuo ng tuples, naka-grupo sa mga pangunahing mga bloke.

code generation gumagawa ng isang real machine code. Sa tradisyunal na compiler para sa RISC-machines sa unang hakbang, lumikha ka ng isang assembler na may isang walang-katapusang bilang ng mga virtual registers. Para sa CISC-machine ay marahil hindi ang mangyayari.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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