KompyutaProgramu

Mtangazaji - ni ... Aina ya compilers. Kubadilisha na mipango ya matangazo

Mipango, pamoja na watu wa kutafsiri kutoka lugha moja hadi nyingine haja mkalimani au translator.

dhana ya msingi

mpango uwakilishi ya lugha ya hesabu: i → P → P (i). mkalimani ni mpango ambayo ni hutolewa kwa mpango pembejeo P na baadhi x ingizo. Ni akiimba katika hafla P x: I (P, x) = P (x). ukweli kwamba kuna translator moja tu ni uwezo wa kutekeleza mipango yote inawezekana (ambayo inaweza kuwakilishwa katika mfumo rasmi wa) ni maana uliokwenda ugunduzi Turing.

processor ni mkalimani wa programu kwa lugha ya mashine. Kwa gharama kubwa mno kuandika wakalimani kwa ajili ya lugha kiwango cha juu cha, hivyo kutafsiri katika fomu kuwa ni rahisi kufafanua.

Baadhi ya aina ya Watafsiri na majina ya ajabu sana:

  • assembler tafsiri mipango lugha ya uundaji katika lugha ya mashine.
  • compiler tafsiri lugha kiwango cha juu cha kwa lugha ya chini.

Mtangazaji - ni programu ambayo inachukua kama data pembejeo mpango katika baadhi lugha S na hutoa T mpango kwa njia ambayo wao wote wana semantiki sawa: P → X → Swali: Hiyo ni, ∀x. P (x) = Q (x).

Kama matangazo mpango mzima katika kitu interpretable, inaitwa mkusanyiko kabla ya kuuawa, au AOT wa kuweka pamoja. AOT compiler inaweza kutumika katika mfululizo, ya mwisho ya ambayo mara nyingi assembler, kwa mfano:

chanzo kanuni compiler → (translator) → → mkutano code assembler (compiler) → → CPU mashine (mara mkalimani).

Uendeshaji au nguvu mkusanyiko hutokea kama mpango ni matangazo, wakati kunyongwa na wengine sehemu ya awali ulioandaliwa. JIT-compilers kumbuka kile tayari amefanya hivyo kama si kurudia chanzo kanuni tena na tena. Wanaweza hata kuzalisha adaptive mkusanyiko na recompilation kulingana na tabia ya mazingira ya mpango wa utekelezaji.

Lugha nyingi kuruhusu kutekeleza kanuni wakati kukusanya na kukusanya nambari mpya katika Runtime.

hatua tafsiri

Broadcast inajumuisha ngazi za kuchunguza na synthesizing:

chanzo kanuni analyzer → → → dhana ya uwakilishi jenereta (synthesizer) → Target code.

Hii ni kutokana na sababu hizi:

  • mbinu nyingine yoyote si mzuri. Neno la tafsiri tu haifanyi kazi.
  • Habari za uhandisi ufumbuzi: kama unataka kuandika Watafsiri kwa lugha M na N chanzo walengwa haja kuandika tu M + N mipango rahisi (polukompilyatorov) badala ya M × N tata (jumla ya Watafsiri).

Hata hivyo, katika mazoezi, mtazamo wa dhana ya nadra sana expressive kutosha na nguvu ya kutosha ili kufidia kila kuwaza chanzo na lengo lugha. Wakati baadhi walikuwa na uwezo wa kuja karibu na hii.

compilers Real kupita katika hatua nyingi. Wakati kujenga compiler yako mwenyewe hana haja ya kurudia kazi ngumu kuwa watu umefanya kuunda uwakilishi na jenereta. Unaweza kutafsiri lugha yako moja kwa moja katika JavaScript au C na kutumia zilizopo JavaScript injini na C compiler kufanya mapumziko. Unaweza pia kutumia zilizopo uwakilishi kati na mashine virtual.

rekodi translator

Mtangazaji - ni mpango au vifaa, ambayo kushiriki lugha tatu: chanzo, marudio na msingi. Zinaweza imeandikwa katika T-umbo, kuweka ya awali ya kushoto, kulia na lengo msingi hapa chini.

Kuna aina tatu za compilers:

  • Mtangazaji - ni samokompilyator kama inalingana na lugha ya msingi chanzo.
  • Compiler ambayo lengo lugha ni msingi, iitwayo samorezidentnym.
  • Mtangazaji - kuvuka compiler, kama walengwa na msingi lugha mbalimbali.

Kwa nini hii ni muhimu?

Hata kama huwezi kufanya compiler halisi, ujuzi wa teknolojia ya kuundwa kwake, kwa sababu dhana kutumika kwa ajili hiyo ni kutumika sana, kwa mfano:

  • formatting maandishi;
  • maswali lugha ya hifadhidata,
  • kompyuta ya juu ya usanifu,
  • ya ujumla matatizo optimization;
  • GUIs;
  • Lugha scripting,
  • controllers,
  • mashine virtual,
  • Machine tafsiri.

Aidha, kama unataka kuandika preprocessors, linkers, lastare, debuggers na profilers, lazima kupitia hatua sawa na wakati wa kuandika compiler.

Unaweza pia kujifunza jinsi ya kuandika programu bora, tangu kuundwa kwa translator kwa lugha ina maana uelewa mzuri wa intricacies wake na utata. utafiti wa kanuni za jumla ya utangazaji pia inaruhusu wewe kuwa nzuri lugha designer. Hivyo hiyo si kitu jinsi mwinuko lugha kama haiwezi kutekelezwa kwa ufanisi?

teknolojia ya kina

compiler teknolojia inashughulikia maeneo mbalimbali ya sayansi ya kompyuta:

  • nadharia rasmi ya lugha: sarufi, kuchanganua, computability,
  • usanifu wa kompyuta. maelekezo seti, RISC au CISC, pipelined usindikaji msingi saa mzunguko, nk;
  • dhana ya lugha ya programu, kwa mfano, kufanya udhibiti mlolongo, masharti ya utekelezaji, iteration, kujirudia, utendaji mtengano, modularity, usawazishaji, meta-programu, upeo, mara kwa mara ndogo aina, templates, aina pato, prototypes, ufafanuzi, kati yake, monads, mailboxes, kuendelea , wildcards, kujieleza mara kwa mara, kama biashara ya kumbukumbu, urithi, polymorphism, mipangilio ya hali, na kadhalika na kadhalika..;
  • Lugha dhahania na mashine virtual,
  • mipangilio na data miundo: maneno ya kawaida, kuchanganua mipangilio, michoro algorithms, nguvu programu, mafunzo,
  • Programu lugha: syntax, semantiki (tuli na nguvu), msaada dhana (miundo, OOP, kazi, mantiki, stack, parallelism, meta-programu);
  • viumbe programu (compilers, kawaida ni kubwa na tata): ujanibishaji, Caching, componentize, API-interfaces, kutumia tena, usawazishaji.

compiler kubuni

Baadhi ya matatizo yaliyojitokeza katika maendeleo ya translator halisi:

  • Matatizo na lugha asili. Je, ni rahisi kukusanya yake? Je, kuna preprocessor? Jinsi aina? Je, kuna maktaba?
  • Kambi compiler pasi: moja au multi-njia?
  • kiwango cha optimization taka. Haraka na chafu mipango matangazo na optimization kidogo au hakuna inaweza kuwa ya kawaida. Juu-optimization compiler polepole, lakini bora msimbo wakati Runtime inaweza kuwa thamani yake.
  • shahada inayotakiwa ya kugundua kosa. Je translator kuacha tu katika makosa ya kwanza? Wakati waache? Kama kuamini compiler kusahihisha makosa?
  • upatikanaji wa zana. Kama lugha ya asili si ndogo sana, Scanner na jenereta analyzers zinazohitajika. Pia kuna jenereta, kanuni jenereta, lakini si jambo la kawaida.
  • Aina ya lengo code kwa kuzalishwa. Kuchaguliwa kutoka safi kuongezewa au virtual mashine code. Au kuandika tu kuingia sehemu ambayo inajenga maarufu kati ya uwakilishi kama vile LLVM, RTL, au JVM. Au kufanya tafsiri ya awali katika chanzo code katika C au JavaScript.
  • muundo wa lengo code. Unaweza kuchagua lugha ya uundaji, portable mashine code, mashine code kumbukumbu picha.
  • Retargeting. Wakati seti ya jenereta ni nzuri ya kuwa na kawaida inlet sehemu. Kwa sababu hii ni bora na jenereta moja kwa mchango wa maeneo mengi.

compiler Architecture: vipengele

Hizi ni kubwa kazi sehemu ya compiler kwamba inazalisha code wenyeji (kama mpango pato ni mpango katika C au mashine virtual, unahitaji si hatua nyingi):

  • mpango ingizo (kati yake alama) ni kulishwa ndani ya skana (lexical analyzer), ambayo waumini ndani mkondo wa ishara.
  • Parser (parser) ujenzi wa moja dhahania syntax miti.
  • Semantic analyzer hutengana habari semantic na hundi nodes mti hitilafu. Kwa sababu hiyo, kujengwa semantic graph - abstract syntax mti na mali ya ziada na viungo imara.
  • Kati code generator hujenga mtiririko graph (tuples ni makundi ndani ya vitalu kuu).
  • Machine huru code optimizer inafanya wote wa ndani (ndani ya kitengo msingi) na kimataifa (kwa vitalu vyote) optimization kimsingi iliyobaki ndani ya routines. Hupunguza code redundant na simplifies mahesabu. Matokeo yake ni iliyopita kati yake graph.
  • Jenereta Yanahusu lengo kanuni vitalu msingi katika rectilinear maambukizi kudhibiti kanuni, kujenga kitu file assembler virtual rejista (pengine ufanisi).
  • Machine-tegemezi optimizer, linker kutenga kumbukumbu kati ya rejista na kufanya mipango ya timu. Ni hufanya mpango uongofu katika lugha ya uundaji saa mkutano huu kwa matumizi mazuri ya pipelining.

Aidha, matumizi ya sehemu ya mfumo meneja makosa kutambua na meza ishara.

uchambuzi Lexical (skanning)

skana hubadilisha wahusika mkondo chanzo katika mkondo wa ishara, kuondoa whitespace, maoni na kupanua macros.

Scanners mara nyingi matatizo, kama vile kama au kuchukua katika akaunti ya kesi, kingo, nafasi kati ya mistari na maoni iliyoingia.

Makosa ambayo yanaweza kutokea wakati skanning, aitwaye lexical na ni pamoja na:

  • wahusika ambao si katika alfabeti,
  • ziada ya idadi ya herufi katika neno au mstari,
  • si kufungwa ishara au mfululizo halisi,
  • mwisho wa faili katika maoni.

Kuchanganua (kuchanganua)

parser hubadilisha mlolongo wa ishara katika dhahania mti syntax. Kila nodi katika mti kuhifadhiwa kama kitu na nyanja zilizotajwa, wengi ambao ni wenyewe mti nodi. Katika hatua hii hakuna mzunguko. Unapofungua parser ni muhimu kwa makini na kiwango cha utata wa sarufi (LL au LR) na kujua kama kuna sheria yoyote kutoa utata. Lugha zingine zinahitaji uchambuzi semantic.

Makosa kupatikana katika hatua hii huitwa syntax. Kwa mfano:

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

uchambuzi semantic

Wakati wa uchambuzi semantic kuangalia ruhusa ya sheria na sehemu msaidizi la mti kuchanganua (kuruhusu majina ya kumbukumbu kuingiza kazi kwa mabadiliko ya aina thabiti, na kadhalika. D.) Kwa kutengeneza graph semantic.

Ni wazi, seti ya kukubaliwa ya sheria katika lugha mbalimbali tofauti. Kama kukusanya lugha Java-kama, compilers kupata:

  • nyingi kutofautiana tamko ndani ya wigo yake;
  • kumbukumbu ya kutofautiana kabla tamko yake;
  • marejeo ya jina la Kabla ya kutunukiwa,
  • ukiukwaji wa haki patent,
  • nyingi au haitoshi idadi ya hoja katika njia ya wito,
  • aina kutolingana.

kizazi

Kati code kizazi kiwasi graph linajumuisha tuples, ambazo zimepangwa katika vitalu ya msingi.

kanuni kizazi hutoa halisi mashine code. Katika compilers jadi kwa RISC-mashine ya hatua ya kwanza, wewe kujenga assembler na idadi ya usio wa rejista pepe. Kwa CISC-mashine pengine si kutokea.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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