Aina za wafasiri. Idadi ya majimbo ya LR(1) kwa sarufi ya kuvutia pia ni kubwa sana. Sarufi kama hizo mara chache huwa na sifa ya LR(0). Kwa mazoezi, njia ya kati kati ya LR(0) na LR(1), inayojulikana kama LALR(1), hutumiwa mara nyingi zaidi.

Mtafsiri kawaida pia hugundua makosa, hukusanya kamusi za kitambulisho, hutoa maandishi ya programu kwa uchapishaji, nk.

Matangazo ya programu- mabadiliko ya programu iliyotolewa katika moja ya lugha za programu katika programu katika lugha nyingine na, kwa maana fulani, sawa na ya kwanza.

Lugha ambayo programu ya kuingiza inawasilishwa inaitwa lugha asilia, na programu yenyewe - msimbo wa chanzo. Lugha ya pato inaitwa lugha lengwa au msimbo wa kitu.

Wazo la tafsiri linatumika sio tu kwa lugha za programu, lakini pia kwa lugha zingine za kompyuta, kama vile lugha za alama, sawa na HTML, na lugha asilia, kama Kiingereza au Kirusi. Walakini, nakala hii inahusu lugha za programu tu; kwa lugha asilia, ona: Tafsiri.

Aina za wafasiri

  • Anwani. Kifaa kinachofanya kazi, ambayo inabadilisha anwani pepe (Anwani ya Virtual) kuwa anwani halisi ya kumbukumbu (Anwani ya Kumbukumbu).
  • Mazungumzo. Hutoa matumizi ya lugha ya programu katika hali ya kushiriki wakati.
  • Pasi nyingi. Huunda moduli ya kitu juu ya maoni kadhaa ya programu chanzo.
  • Nyuma. Sawa na kitafsiri. Tazama pia: decompiler, disassembler.
  • Pasi moja. Huunda moduli ya kitu katika utazamaji mmoja mfululizo wa programu chanzo.
  • Kuboresha. Hutekeleza uboreshaji wa msimbo katika moduli ya kitu kilichozalishwa.
  • Yenye mwelekeo wa kisintaksia (inayoendeshwa na kisintaksia). Hupokea kama ingizo maelezo ya sintaksia na semantiki ya lugha na maandishi katika lugha iliyofafanuliwa, ambayo hutafsiriwa kwa mujibu wa maelezo yaliyotolewa.
  • Mtihani. Seti ya macros ya lugha ya kusanyiko ambayo inakuwezesha kuweka taratibu mbalimbali za utatuzi katika programu zilizoandikwa kwa lugha ya mkusanyiko.

Utekelezaji

Kusudi la tafsiri ni kubadilisha maandishi kutoka lugha moja hadi nyingine, ambayo inaeleweka kwa mpokeaji wa maandishi. Kwa upande wa programu za watafsiri, anayeandikiwa ni kifaa cha kiufundi (mchakataji) au mpango wa mkalimani.

Kuna idadi ya mifano mingine ambayo usanifu wa mfululizo ulioendelezwa wa kompyuta ulitegemea au ulitegemea sana mfano fulani wa muundo wa programu. Kwa hivyo, mfululizo wa GE/Honeywell Multics ulitokana na mfano wa kisemantiki utekelezaji wa programu zilizoandikwa katika lugha ya PL/1. Katika Kigezo:Haijatafsiriwa B5500, B6700 ... B7800 ilitokana na muundo wa programu ya wakati wa utekelezaji iliyoandikwa katika lugha iliyopanuliwa ya ALGOL. ...

Kichakataji cha i432, kama usanifu huu wa awali, pia inategemea muundo wa semantic wa muundo wa programu. Walakini, tofauti na watangulizi wake, i432 haitegemei mfano maalum wa lugha ya programu. Badala yake, lengo kuu la wasanidi programu lilikuwa kutoa usaidizi wa moja kwa moja wa wakati wa utekelezaji kwa wote wawili data abstract(Hiyo ni, programu na aina za data dhahania), na kwa mifumo ya uendeshaji mahususi ya kikoa. …

Faida ya mkusanyaji: programu imeundwa mara moja na hakuna mabadiliko ya ziada yanahitajika kila wakati inapotekelezwa. Ipasavyo, mkusanyaji hauhitajiki kwenye mashine inayolengwa ambayo programu imeundwa. Hasara: Hatua tofauti ya ujumuishaji hupunguza kasi ya uandishi na utatuzi na inafanya kuwa vigumu kuendesha programu ndogo, rahisi, au za mara moja.

Ikiwa lugha chanzi ni lugha ya kusanyiko (lugha ya kiwango cha chini karibu na lugha ya mashine), basi mtunzi wa lugha kama hiyo anaitwa. mkusanyaji.

Njia tofauti ya utekelezaji ni wakati programu inatekelezwa kwa kutumia mkalimani hakuna matangazo kabisa. Mkalimani kwa utaratibu anafanya mfano wa mashine ambayo mzunguko wake wa utekelezaji wa kuleta hufanya kazi na amri katika lugha ngazi ya juu, na sio kwa amri za mashine. Hii uundaji wa programu huunda mashine pepe inayotekeleza lugha. Njia hii inaitwa tafsiri safi. Tafsiri safi kawaida hutumiwa kwa lugha zilizo na muundo rahisi (kwa mfano, APL au Lisp). Wakalimani wa mstari wa amri huchakata amri katika hati katika UNIX au faili za kundi (.bat) katika MS-DOS, pia kwa kawaida katika hali halisi ya ukalimani.

Faida ya mkalimani safi: kutokuwepo kwa vitendo vya kati vya tafsiri hurahisisha utekelezaji wa mkalimani na kuifanya iwe rahisi zaidi kutumia, pamoja na katika hali ya mazungumzo. Ubaya ni kwamba mkalimani lazima awepo kwenye mashine inayolengwa ambapo programu itatekelezwa. Na mali ya mkalimani safi, kwamba makosa katika programu iliyotafsiriwa hugunduliwa tu wakati jaribio linafanywa kutekeleza amri (au mstari) na kosa, inaweza kuchukuliwa kuwa hasara na faida.

Kuna maelewano kati ya mkusanyiko na tafsiri safi katika utekelezaji wa lugha za programu, wakati mkalimani, kabla ya kutekeleza programu, anaitafsiri kwa lugha ya kati (kwa mfano, kwa bytecode au p-code), rahisi zaidi kwa tafsiri (ambayo ni, tunazungumza juu ya mkalimani aliye na mtafsiri aliyejengewa ndani) . Njia hii inaitwa utekelezaji mchanganyiko. Mfano wa utekelezaji wa lugha mchanganyiko ni Perl. Mbinu hii inachanganya faida zote mbili za mkusanyaji na mkalimani (kasi kubwa zaidi ya utekelezaji na urahisi wa utumiaji) na hasara (tafsiri na uhifadhi wa programu katika lugha ya kati inahitaji rasilimali za ziada; Lazima mkalimani awepo ili kutekeleza programu kwenye mashine inayolengwa.) Pia, kama ilivyo kwa mkusanyaji, utekelezaji mchanganyiko unahitaji hiyo kabla ya kutekeleza chanzo haikuwa na makosa (leksimu, kisintaksia na kisemantiki).

Pamoja na ongezeko la rasilimali za kompyuta na upanuzi wa mitandao tofauti (pamoja na mtandao) inayounganisha kompyuta za aina tofauti na usanifu, aina mpya ya tafsiri imeibuka, ambayo msimbo wa chanzo (au wa kati) unajumuishwa katika msimbo wa mashine moja kwa moja wakati wa kukimbia. , "kwa kuruka." Sehemu zilizokusanywa za msimbo tayari zimehifadhiwa ili zinapofikiwa tena, zinapokea udhibiti mara moja, bila kulipwa tena. Njia hii inaitwa mkusanyiko wa nguvu.

Faida ya mkusanyiko wa nguvu ni kwamba kasi ya tafsiri ya programu inakuwa sawa na kasi ya utekelezaji wa programu katika lugha za kawaida zilizokusanywa, wakati programu yenyewe inahifadhiwa na kusambazwa kwa fomu moja, bila ya majukwaa lengwa. Hasara ni utata mkubwa wa utekelezaji na mahitaji makubwa ya rasilimali kuliko katika kesi ya watunzi rahisi au wakalimani safi.

Njia hii inafanya kazi vizuri kwa

Tuma kazi yako nzuri katika msingi wa maarifa ni rahisi. Tumia fomu iliyo hapa chini

Kazi nzuri kwa tovuti">

Wanafunzi, wanafunzi waliohitimu, wanasayansi wachanga wanaotumia msingi wa maarifa katika masomo na kazi zao watakushukuru sana.

Iliyotumwa kwenye http://www.allbest.ru

Utangulizi

1.1 Uchambuzi wa juu chini

1.2 Uchambuzi wa chini-juu

1.2.1 LR(k) - sarufi

1.2.1.1 LR(0) - sarufi

1.2.2 LALR(1) - sarufi

2. Ukuzaji wa mfasiri

2.1 Uchambuzi wa mahitaji

2.2 Muundo

2.2.1 Kubuni kichanganuzi cha kileksika

2.2.4 Utekelezaji wa programu ya kichanganuzi

2.3 Kuweka msimbo

2.4 Upimaji

Hitimisho

Orodha ya vyanzo vilivyotumika

Kiambatisho A. Uorodheshaji wa maandishi ya programu ya mfasiri

Kiambatisho B. Matokeo ya mtihani

Kiambatisho B. Mchoro wa programu ya Mtafsiri

Utangulizi

Siku nyingi zimepita wakati, kabla ya kuandika programu, ilibidi uelewe na kukumbuka maagizo kadhaa ya mashine. Msanidi programu wa kisasa hutengeneza majukumu yake katika lugha za kiwango cha juu cha programu na hutumia lugha ya kusanyiko tu katika hali za kipekee. Kama inavyojulikana, lugha za algorithmic hupatikana kwa programu tu baada ya kuunda watafsiri kutoka kwa lugha hizi.

Lugha za programu ni tofauti kabisa kutoka kwa kila mmoja kwa kusudi, muundo, ugumu wa semantic, na njia za utekelezaji. Hii inaweka vipengele vyake maalum juu ya maendeleo ya watafsiri maalum.

Lugha za programu ni zana za kutatua shida katika maeneo tofauti ya somo, ambayo huamua maalum ya shirika lao na tofauti za kusudi. Mifano ni pamoja na lugha kama vile Fortran, ambayo inaelekezwa kwa mahesabu ya kisayansi, C, ambayo imekusudiwa kwa programu ya mifumo, Prolog, ambayo inaelezea kwa ufanisi shida za uelekezaji, na Lisp, ambayo hutumiwa kwa usindikaji wa orodha inayojirudia. Mifano hii inaweza kuendelea. Kila eneo la somo huweka mahitaji yake juu ya shirika la lugha yenyewe. Kwa hiyo, tunaweza kutambua aina mbalimbali za uwakilishi wa waendeshaji na maneno, tofauti katika kuweka shughuli za msingi, kupunguzwa kwa ufanisi wa programu wakati wa kutatua matatizo yasiyohusiana na eneo la somo. Tofauti za kiisimu pia hujitokeza katika muundo wa wafasiri. Lisp na Prolog mara nyingi hutekelezwa katika hali ya ukalimani kutokana na ukweli kwamba hutumia uzalishaji wa aina za data wakati wa kukokotoa. Watafsiri wa Fortran wana sifa ya uboreshaji mkali wa msimbo wa mashine unaosababishwa, ambao unawezekana kwa sababu ya semantiki rahisi ya muundo wa lugha - haswa, kwa sababu ya kukosekana kwa njia za kutaja mbadala wa vigeu kupitia viashiria au marejeleo. Uwepo wa viashiria katika lugha C huweka mahitaji maalum usambazaji wa nguvu kumbukumbu.

Muundo wa lugha unaashiria uhusiano wa kidaraja kati ya dhana zake, ambazo zinaelezewa na kanuni za kisintaksia. Lugha za programu zinaweza kutofautiana sana kutoka kwa kila mmoja katika shirika la dhana za mtu binafsi na uhusiano kati yao. Lugha ya programu ya PL/1 inaruhusu uwekaji kiota kiholela wa taratibu na utendakazi, ilhali katika C vipengele vyote lazima ziwe katika kiwango cha nje cha kuota. Lugha ya C++ inaruhusu vigeu kufafanuliwa wakati wowote kwenye programu kabla ya matumizi yake ya kwanza, na katika vigeu vya Pascal lazima vifafanuliwe. eneo maalum maelezo. Kuchukua hii hata zaidi ni PL/1, ambayo inaruhusu kutofautisha kutangazwa baada ya kutumika. Au unaweza kuacha maelezo kabisa na kutumia sheria chaguo-msingi. Kulingana na uamuzi uliofanywa, mtafsiri anaweza kuchambua programu kwa njia moja au kadhaa, ambayo inathiri kasi ya tafsiri.

Semantiki za lugha za programu hutofautiana sana. Wanatofautiana sio tu katika vipengele vya utekelezaji wa shughuli za mtu binafsi, lakini pia katika dhana za programu, ambazo huamua tofauti za msingi katika mbinu za maendeleo ya programu. Maelezo mahususi ya utekelezaji wa shughuli yanaweza kuhusisha muundo wa data inayochakatwa na sheria za kuchakata aina sawa za data. Lugha kama vile PL/1 na APL inasaidia matrix na uendeshaji wa vekta. Lugha nyingi hufanya kazi hasa na scalars, kutoa taratibu na kazi zilizoandikwa na watengeneza programu kwa ajili ya usindikaji wa safu. Lakini hata wakati wa kufanya operesheni ya kuongeza nambari mbili, lugha kama C na Pascal zinaweza kuishi tofauti.

Pamoja na upangaji wa kitaratibu wa kitamaduni, unaoitwa pia lazima, kuna dhana kama vile upangaji kazi, upangaji wa mantiki na upangaji unaolenga kitu. Muundo wa dhana na vitu vya lugha hutegemea sana dhana iliyochaguliwa, ambayo pia huathiri utekelezaji wa mtafsiri.
Hata lugha moja inaweza kutekelezwa kwa njia kadhaa. Hii ni kutokana na ukweli kwamba nadharia ya sarufi rasmi inaruhusu mbinu mbalimbali kuchanganua sentensi sawa. Kwa mujibu wa hili, watafsiri wanaweza kupata matokeo sawa (mpango wa kitu) kutoka kwa maandishi asilia kwa njia tofauti.
Wakati huo huo, lugha zote za programu zina idadi ya sifa za jumla na vigezo. Hali hii ya kawaida pia huamua kanuni za kupanga wafasiri ambazo zinafanana kwa lugha zote.
Lugha za programu zimeundwa ili kurahisisha programu. Kwa hivyo, waendeshaji wao na miundo ya data ina nguvu zaidi kuliko ile ya lugha za mashine.
Ili kuongeza mwonekano wa programu, badala ya nambari za nambari, uwakilishi wa kielelezo au picha wa muundo wa lugha hutumiwa, ambayo ni rahisi zaidi kwa mtazamo wa mwanadamu.
Kwa lugha yoyote inafafanuliwa:
- alama nyingi ambazo zinaweza kutumika kuandika programu sahihi (alfabeti), vipengele vya msingi,
- programu nyingi sahihi (syntax),
- "maana" ya kila mpango sahihi (semantiki).
Bila kujali maalum ya lugha, mtafsiri yeyote anaweza kuchukuliwa kuwa kigeuzi kazi F, kutoa ramani ya kipekee kutoka X hadi Y, ambapo X ni programu katika lugha ya chanzo, Y ni programu katika lugha ya pato. Kwa hiyo, mchakato wa tafsiri yenyewe unaweza kuwakilishwa rasmi kwa urahisi na kwa uwazi kabisa: Y = F(X).
Rasmi, kila mmoja programu sahihi X ni mfuatano wa herufi kutoka kwa baadhi ya alfabeti A, iliyogeuzwa kuwa mfuatano wake Y, unaojumuisha herufi kutoka kwa alfabeti B.
Lugha ya programu kama yoyote mfumo tata, hufafanuliwa kupitia safu ya dhana inayofafanua uhusiano kati ya vipengele vyake. Dhana hizi zimeunganishwa kwa mujibu wa kanuni za kisintaksia. Kila programu iliyojengwa kulingana na sheria hizi ina muundo wa kihierarkia unaolingana.
Katika suala hili, sifa zifuatazo za kawaida zinaweza kutofautishwa zaidi kwa lugha zote na programu zao: kila lugha lazima iwe na sheria zinazoruhusu kutengeneza programu zinazolingana na lugha hii au kutambua mawasiliano kati ya programu zilizoandikwa na lugha fulani.

Kipengele kingine cha tabia ya lugha zote ni semantiki zao. Huamua maana ya utendakazi wa lugha na usahihi wa oparesheni. Minyororo ambayo ina muundo sawa wa kisintaksia katika lugha tofauti za programu inaweza kutofautiana katika semantiki (ambayo, kwa mfano, inazingatiwa katika C ++, Pascal, Msingi). Ujuzi wa semantiki za lugha hukuruhusu kuitenganisha na sintaksia yake na kuitumia kwa ubadilishaji hadi lugha nyingine (kutoa msimbo).

Madhumuni ya kazi hii ya kozi ni kukuza mfasiri wa kielimu kutoka kwa toleo lililorahisishwa lugha ya maandishi ngazi ya juu.

1. Mbinu za uchanganuzi wa sarufi

Hebu tuangalie mbinu za kimsingi za uchanganuzi wa kisarufi.

1.1 Uchambuzi wa juu chini

Wakati wa kuchanganua kutoka juu hadi chini, miongozo ya kati husogea kando ya mti kwa mwelekeo kutoka kwa mizizi hadi majani. Katika kesi hii, wakati wa kutazama mnyororo kutoka kushoto kwenda kulia, hitimisho la mkono wa kushoto litapatikana kwa kawaida. Katika uchanganuzi wa kubainisha, tatizo litakuwa ni sheria ipi itatumika kutatua nonterminal ya kushoto kabisa.

1.1.1 LL(k) - lugha na sarufi

Fikiria mti wa uelekezaji katika mchakato wa kupata pato la kushoto la mnyororo. Msururu wa kati katika mchakato wa uelekezaji unajumuisha msururu wa vituo w, sehemu ya kushoto kabisa isiyo ya mwisho A, sehemu iliyoelekezwa chini ya x:

-S--

/ \

/ -A-x-\

/ | \

-w---u----

Kielelezo cha 1

Ili kuendelea kuchanganua, ni muhimu kuchukua nafasi ya nonterminal A kulingana na moja ya sheria za fomu A:y. Ikiwa unataka uchanganuzi uwe wa kuamua (hakuna marejesho), sheria hii inahitaji kuchaguliwa kwa namna ya pekee. Sarufi inasemekana kuwa na sifa ya LL(k) ikiwa, ili kuchagua sheria, inatosha kuzingatia tu wAx na herufi za k za kwanza za mfuatano ambao haujachunguzwa u. Herufi ya kwanza L (Kushoto) inahusu kutazama mnyororo wa pembejeo kutoka kushoto kwenda kulia, ya pili inahusu pato la kushoto linalotumika.

Wacha tufafanue seti mbili za minyororo:

a) KWANZA(x) ni seti ya mifuatano ya mwisho inayotokana na x, iliyofupishwa hadi herufi k.

b) FUATA (A) - seti ya minyororo ya mwisho iliyofupishwa kwa herufi k, ambayo inaweza kufuata mara moja A kwenye minyororo ya pato.

Sarufi ina sifa ya LL(k) ikiwa, kutokana na kuwepo kwa minyororo miwili ya makisio ya kushoto:

S:: wAx: wzx:: wu

S:: wAx: wtx:: wv

kutoka kwa hali ya KWANZA(u)=KWANZA(v) inafuata z=t.

Katika kesi ya k = 1, kuchagua sheria kwa A, inatosha kujua tu isiyo ya terminal A na a - tabia ya kwanza ya mnyororo u:

- kanuni A:x inapaswa kuchaguliwa ikiwa a imejumuishwa katika FIRST(x),

- kanuni A:e inapaswa kuchaguliwa ikiwa a imejumuishwa katika FOLLOW(A).

Sifa ya LL(k) inaweka vizuizi vikali kwenye sarufi. Kwa mfano, LL(2) sarufi S: as | a haina mali ya LL(1), kwa sababu KWANZA(aS)=KWANZA(a)=a. Katika kesi hii, unaweza kupunguza thamani ya k kwa kutumia "factorization" (kuondoa sababu kwenye mabano):

S: aA

A: S | e

Sarufi yoyote ya LL(k) haina utata. Sarufi ya urejeshaji wa kushoto si ya darasa LL(k) kwa k yoyote. Wakati mwingine inawezekana kubadilisha sarufi isiyo ya LL(1) kuwa sarufi LL(1) sawa kwa kuondoa urejeshaji wa kushoto na uanzishaji. Hata hivyo, tatizo la kuwepo kwa sarufi LL(k)-sawa kwa sarufi kiholela isiyo ya LL(k)-haliwezi kuamuliwa.

1.1.2 Mbinu ya mteremko wa kujirudia

Njia ya asili ya kujirudia inalenga matukio hayo wakati mkusanyaji amepangwa katika mojawapo ya lugha za kiwango cha juu, wakati matumizi ya taratibu za kurudia inaruhusiwa.

Wazo kuu la asili ya kujirudia ni kwamba kila nonterminal ya sarufi ina utaratibu unaolingana ambao unatambua mlolongo wowote unaozalishwa na nonterminal hii. Taratibu hizi huitana zinapohitajika.

Asili ya kujirudi inaweza kutumika kwa sarufi yoyote ya LL(1). Kila isiyo ya mwisho ya sarufi ina utaratibu unaolingana, ambao huanza na mpito kwa lebo iliyohesabiwa na ina msimbo unaofanana na kila kanuni kwa hii isiyo ya mwisho. Kwa alama hizo za ingizo ambazo ni za seti ya uteuzi wa kanuni fulani, mpito uliokokotwa huhamisha udhibiti kwa msimbo unaolingana na sheria hiyo. Kwa alama za pembejeo zilizobaki, udhibiti huhamishiwa kwa utaratibu wa kushughulikia makosa.

Nambari ya sheria yoyote ina utendakazi kwa kila herufi iliyojumuishwa upande wa kulia kanuni. Shughuli zimepangwa kwa utaratibu ambao alama zinaonekana katika sheria. Kufuatia operesheni ya mwisho, msimbo una kurudi kutoka kwa utaratibu.

Kutumia asili ya kujirudia katika lugha ya kiwango cha juu hurahisisha upangaji na utatuzi.

1.2 Uchambuzi wa chini-juu

Wacha tuzingatie uchanganuzi wa chini-juu, ambao pini za kati huhamishwa kando ya mti kuelekea mzizi. Ukisoma herufi kwenye kamba kutoka kushoto kwenda kulia, mti wa kuchambua utaonekana kama hii:

-S--

/ \

/-x-\

/ | \

--w--b--u-

Kielelezo cha 2

Pato la kati lina fomu ya xbu, ambapo x ni mlolongo wa vituo na zisizo za vituo, ambayo sehemu inayotazamwa ya mnyororo wa mwisho w ni pato, bu ni sehemu isiyoonekana ya mnyororo wa terminal, b ni ishara inayofuata. Ili kuendelea na uchanganuzi, unaweza kuongeza herufi b kwenye sehemu inayotazamwa ya mnyororo (fanya kinachojulikana kama "shift"), au uchague mwisho wa x mnyororo kama huo z (x=yz) ambayo moja ya sheria za sarufi B:z zinaweza kutumika kwa z na kubadilishwa x kwa mnyororo yB (kufanya kinachojulikana kama "convolution"):

-S-- -S--

/ \ / \

/-x-b-\ /yB-\

/ | \ / | \

--w--b--u- --w--b--u-

Kielelezo 3 - Baada ya zamu Kielelezo 4 - Baada ya ubadilishaji

Ikiwa convolution inatumika tu kwa wahusika wa mwisho x, basi tutapokea matokeo sahihi ya mnyororo. Uchanganuzi huu unaitwa LR, ambapo ishara L (Kushoto, kushoto) inarejelea kutazama mnyororo kutoka kushoto kwenda kulia, na R (Kulia, kulia) inarejelea matokeo yanayotokana.

Mlolongo wa shughuli za kuhama na kukunja ni muhimu. Kwa hivyo, uchanganuzi wa kibainishi unahitaji kuchagua kati ya mabadiliko na ubadilishaji (na sheria tofauti za ubadilishaji) kwa kila wakati.

1.2.1 LR(k) - sarufi

Ikiwa, katika mchakato wa uchanganuzi wa LR, inawezekana kufanya uamuzi wa kuamua kuhusu kuhama/kupunguza, kwa kuzingatia tu kamba x na herufi za k ya kwanza za sehemu isiyoonekana ya kamba ya pembejeo u (herufi hizi za k huitwa kamba ya mapema. ), sarufi inasemekana kuwa na mali ya LR(k).

-S--

/ \

/-x-\

--w----u--

Kielelezo cha 5

Tofauti kati ya sarufi LL(k) na LR(k) katika suala la mti wa uelekezaji:

-S-

/ | \

/A\

/ / \ \

-w---v---u-

Kielelezo cha 6

Kwa upande wa LL(k)-sarufi, kanuni inayotumika kwa A inaweza kuamuliwa kipekee na w na herufi k ya kwanza ya vu, na katika kesi ya LR(k)-sarufi, kwa w,v na k ya kwanza. wahusika wa u. Hoja hii isiyo ya ukali inaonyesha kuwa LL(k)-lugha< LR(k)-языки (при k > 0).

1.2.1.1 LR(0) - sarufi

Hebu kwanza tuzingatie sarufi rahisi zaidi za darasa hili - LR(0). Wakati wa kuchanganua mfuatano katika lugha ya LR(0), si lazima utumie mnyororo wa mapema hata kidogo - chaguo kati ya shift na fold hufanywa kulingana na mnyororo x. Kwa kuwa wakati wa kuchanganua hubadilika tu kutoka mwisho wa kulia, inaitwa stack. Wacha tufikirie kuwa hakuna alama zisizo na maana katika sarufi na ishara ya mwanzo haionekani kwenye pande za sheria - basi ubadilishaji kwa ishara ya awali huashiria kukamilika kwa mafanikio ya uchanganuzi. Wacha tujaribu kuelezea seti ya minyororo ya vituo na visivyo vya vituo vinavyoonekana kwenye rafu wakati wote wa uchanganuzi wa LR (kwa maneno mengine, makisio yote ya mkono wa kulia kutoka kwa sarufi).

Wacha tufafanue seti zifuatazo:

L(A:v) - muktadha wa kushoto wa sheria A:v - seti ya hali za rafu mara moja kabla ya v kukunjwa kuwa A wakati wa uchanganuzi wote wa LR uliofaulu. Ni wazi, kila mlolongo katika L(A:v) unaishia katika mst. Ikiwa mkia v wa minyororo yote kama hiyo umekatwa, basi tunapata seti ya minyororo inayotokea upande wa kushoto wa A wakati wa makisio yote ya mkono wa kulia yaliyofaulu. Wacha tuonyeshe seti hii kama L(A) - muktadha wa kushoto wa nonterminal A.

Wacha tujenge sarufi kwa seti ya L(A). Viingilio vya sarufi mpya vitakuwa viambishi na viambishi visivyo vya sarufi asilia; viambishi visivyo vya sarufi mpya vitaashiriwa na ,... - maadili yao yatakuwa muktadha wa kushoto wa nonterminals ya sarufi asili. Ikiwa S ndio herufi ya mwanzo ya sarufi asilia, basi sarufi ya miktadha ya kushoto itakuwa na kanuni : e - muktadha wa kushoto S ina mnyororo tupu Kwa kila kanuni ya sarufi asili, kwa mfano, A: B C d E

na ongeza sheria kwa sarufi mpya:

: - L(B) inajumuisha L(A)

: B - L(C) inajumuisha L(A) B

: B C d - L(E) inajumuisha L(A) B C d

Sarufi inayotokana ina aina maalum(sarufi kama hizo huitwa mstari wa kushoto), kwa hivyo, seti za miktadha ya kushoto

- mara kwa mara. Inafuata kwamba ikiwa mfuatano ni wa muktadha wa kushoto wa nonterminal inaweza kuhesabiwa kwa kufata kwa kutumia mashine ya hali ya kikomo, kuchanganua mfuatano kutoka kushoto kwenda kulia. Hebu tueleze mchakato huu kwa kujenga.

Wacha tuite hali ya LR(0) kuwa sheria ya sarufi iliyo na alama moja kati ya alama za upande wa kulia wa sheria. Kwa mfano, kwa sarufi S:A; A:aAA; A:b LR(0)-hali zifuatazo zipo: S:_A; S:A_; A:_aAA; A:a_AA; A:aA_A; A:aAA_; A:_b; A:b_. (nafasi inaonyeshwa kwa kusisitiza).

Tutasema kwamba mnyororo x unalingana na hali A:b_c ikiwa x=ab na a ni ya L(A). (Kwa maneno mengine, matokeo ya LR yanaweza kuendelezwa x_... = ab_...:: abc_...:: aA_...:: S_.) Kwa maneno haya, L(A:b) ni seti ya masharti yanayolingana na hali A:b_, L(A)

- minyororo inayolingana na hali A:_b, kwa kanuni yoyote A:b.

Acha V(u) iwe seti ya hali zinazolingana na u. Hebu tuonyeshe kwamba chaguo la kukokotoa V ni la kufata neno.

Ikiwa seti V(u) inajumuisha hali A:b_cd, basi hali A:bc_d ni ya V(uc). (c - terminal au isiyo ya mwisho; b, d - mlolongo (inaweza kuwa tupu) ya vituo na zisizo za mwisho). Hakuna hali zingine za fomu A:b_d, na isiyo tupu b katika V(uc). Inabakia kuongeza hali za fomu C:_... kwa V(uc), kwa kila C isiyo ya terminal ambayo muktadha wake wa kushoto una uc. Ikiwa hali A:..._C... (C-nonterminal) ni ya seti V(uc), basi uc ni ya L(C) na V(uc) inajumuisha hali za fomu C:_... kwa kanuni zote za C za sarufi.

V(e) ina hali S:_... (S-starting character), pamoja na hali A:_... ikiwa nonterminal A hutokea mara baada ya _ katika hali ambazo tayari zimejumuishwa katika V(e).

Hatimaye, tuko tayari kufafanua sarufi ya LR(0). Wacha uwe yaliyomo kwenye rafu wakati wa uchanganuzi wa LR, na V(u) iwe seti ya hali za LR(0) zinazolingana na u. Ikiwa V(u) ina hali ya fomu A:x_ (x-mfuatano wa vituo na visivyo vituo), basi u ni mali ya L(A:x) na ubadilishaji wa x hadi A unaruhusiwa. Ikiwa V(u ) ina hali A:..._a. .. (a-terminal), basi mabadiliko yanaruhusiwa. Mzozo wa mabadiliko ya mabadiliko unasemekana kuwepo ikiwa mabadiliko na ubadilishaji vinaruhusiwa kwa mfuatano ule ule. Mzozo wa kupunguza mapinduzi unasemekana kuwepo iwapo mienendo kwa mujibu wa sheria tofauti itaruhusiwa.

Sarufi inaitwa LR(0) ikiwa hakuna migongano ya kupunguza-badilisha au kupunguza mara kwa hali zote za rafu wakati wa makisio ya LR.

1.2.1.2 LR(k) - sarufi

Hali ya mrundikano pekee ndiyo inatumika kuamua kati ya kugeuza na kukunja katika uchanganuzi wa LR(0). Uchanganuzi wa LR(k) pia huzingatia herufi k za kwanza za sehemu isiyoonekana ya mnyororo wa kuingiza data (kinachojulikana kama mnyororo wa mapema). Ili kuhalalisha njia, unapaswa kurudia kwa uangalifu hoja ya aya iliyotangulia, ukifanya mabadiliko kwa ufafanuzi.

Pia tutajumuisha mlolongo wa mapema katika muktadha wa kushoto wa sheria. Ikiwa pato la kulia linatumia pato wAu: wvu, basi jozi wv,FIRSTk(u) ni ya Lk(A:v), na jozi w,FIRSTk(u) ni ya Lk(A). Seti ya muktadha wa kushoto, kama ilivyo kwa LR(0), inaweza kuhesabiwa kwa kutumia induction kwenye mnyororo wa kushoto. Wacha tuite hali ya LR(k)-jozi: kanuni ya sarufi iliyo na alama na mlolongo wa urefu usiozidi k. Tutatenganisha utawala kutoka kwa mlolongo wa mapema na mstari wa wima.

Tutasema kwamba mnyororo x unalingana na hali A:b_c|t ikiwa kuna pato la LR: x_yz = ab_yz:: abc_z:: aA_z:: S_, na FIRSTk(z) = t. Sheria za kuhesabu kwa inductive seti ya majimbo Vk ni kama ifuatavyo.

Vk(e) ina hali S:_a|e kwa sheria zote S:a, ambapo S ndio herufi inayoanza. Kwa kila hali A:_Ba|u kutoka Vk(e), kila kanuni B:b na mnyororo x mali ya FIRSTk(au), ni muhimu kuongeza hali B:_b|x kwa Vk(e).

Ikiwa Vк(w) inajumuisha hali A:b_cd|u, basi hali A:bc_d|u itakuwa ya Vk(wc). Kwa kila hali A:b_Cd|u kutoka Vk(wc), kila kanuni C:f na mnyororo x mali ya FIRSTk(du) ni muhimu kuongeza hali C:_f|x kwa Vk(wc).

Tunatumia seti zilizoundwa za majimbo ya LR(k) kutatua suala la mabadiliko ya mabadiliko. Wacha uwe yaliyomo kwenye safu na x uwe mkufunzi. Ni wazi, ubadilishaji kulingana na sheria A:b unaweza kufanywa ikiwa Vk(u) ina hali A:b_|x. Kuamua ikiwa zamu inaruhusiwa kunahitaji uangalifu ikiwa sarufi ina sheria za kielektroniki. Katika hali A:b_c|t (c sio tupu), mabadiliko yanawezekana ikiwa c inaanza kutoka kwa terminal na x ni ya FIRSTk(ct). Kuzungumza kwa njia isiyo rasmi, unaweza kushinikiza ishara ya kushoto kabisa ya upande wa kulia wa sheria kwenye rundo, ukitayarisha ubadilishaji unaofuata. Ikiwa c inaanza na nonterminal (hali inaonekana kama A:b_Cd|t), kisha kusukuma alama kwenye rundo ili kujiandaa kwa ubadilishaji kuwa C kunawezekana tu ikiwa C haitoi mnyororo tupu. Kwa mfano, katika hali V(e)= S:_A|e; A:_AaAb|e,a, A:_|e,a hakuna zamu zinazoruhusiwa, kwa sababu Wakati wa kupata minyororo ya mwisho kutoka kwa A, kwa hatua fulani inahitajika kutumia sheria A: e kwa isiyo ya mwisho A iko kwenye mwisho wa kushoto wa mnyororo.

Wacha tufafanue seti ya EFFk(x), inayojumuisha vitu vyote vya seti FIRSTk(x), wakati wa kupata ambayo nonterminal kwenye mwisho wa kushoto wa x (ikiwa kuna moja) haijabadilishwa na mnyororo tupu. Katika masharti haya, mabadiliko yanaruhusiwa ikiwa katika kuweka Vk(u) kuna hali A:b_c|t, c sio tupu na x ni ya EFFk(ct).

Sarufi inaitwa LR(k)-sarufi ikiwa hakuna hali ya LR(k) iliyo na hali mbili A:b_|u na B:c_d|v kwamba wewe ni wa EFFk(dv). Jozi kama hizo zinalingana na mzozo wa mara ikiwa d haina kitu, na mzozo wa shift-fold ikiwa d sio tupu.

Kwa mazoezi, sarufi ya LR(k) haitumiki kwa k>1. Kuna sababu mbili za hii. Kwanza: sana idadi kubwa LR(k) inasema. Pili: kwa lugha yoyote inayofafanuliwa na LR(k)-sarufi, kuna LR(1)-sarufi; Zaidi ya hayo, kwa lugha yoyote ya kibainishi ya KS kuna sarufi ya LR(1).

Idadi ya majimbo ya LR(1) kwa sarufi ya kuvutia pia ni kubwa sana. Sarufi kama hizo mara chache huwa na sifa ya LR(0). Kwa mazoezi, njia ya kati kati ya LR(0) na LR(1), inayojulikana kama LALR(1), hutumiwa mara nyingi zaidi.

1.2.2 LALR(1) - sarufi

Mbinu hizi mbili zinatokana na wazo moja. Wacha tujenge seti ya kanuni za LR(0)-hali za sarufi. Ikiwa seti hii haina migogoro, basi kichanganuzi cha LR(0) kinaweza kutumika. Vinginevyo, tutajaribu kutatua migogoro ambayo imetokea kwa kuzingatia mlolongo wa mapema wa herufi moja. Kwa maneno mengine, wacha tujaribu kuunda kichanganuzi cha LR(1) na majimbo mengi ya LR(0).

Mbinu ya LALR(1) (Angalia Mbele) ni kama ifuatavyo. Hebu tuanzishe uhusiano wa usawa kwenye seti ya LR(1)-situations: tutazingatia hali mbili kuwa sawa ikiwa zinatofautiana tu katika minyororo yao inayoongoza. Kwa mfano, hali A:Aa_Ab|e na A:Aa_Ab|a ni sawa. Wacha tuunde seti ya kisheria ya majimbo ya LR(1) na tuchanganye majimbo yanayojumuisha seti ya hali sawa.

Ikiwa seti inayotokana ya majimbo haina migogoro ya LR(1), na kwa hivyo inaruhusu ujenzi wa kichanganuzi cha LR(1), basi sarufi inasemekana kuwa na mali ya LR(1).

2. Ukuzaji wa mfasiri

2.1 Uchambuzi wa mahitaji

Katika hili kazi ya kozi inahitajika kukuza mfasiri wa kielimu katika mfumo wa mkalimani kutoka kwa lugha iliyofafanuliwa na sarufi rasmi inayolingana. Kuna hatua kuu nne za kukuza mkalimani:

Kubuni kichanganuzi cha kileksika;

Ubunifu wa mashine ya kuuza;

Utekelezaji wa programu ya mchanganuzi;

Maendeleo ya moduli ya tafsiri.

Maendeleo yatafanywa kwa kutumia chumba cha upasuaji Mifumo ya Windows XP kwenye IBM PC na Kichakataji cha Intel Pentium IV.

Kulingana na mitindo ya ukuzaji programu, lugha ya utayarishaji ya C# katika mazingira ya Visual Studio 2010 ilichaguliwa ili kutekeleza mfasiri wa elimu.

2.2 Muundo

2.1.1 Kubuni kichanganuzi cha kileksika

Lexical uchanganuzi unahusisha kuchanganua programu (chanzo) iliyotafsiriwa na kutambua leksimu zinazounda sentensi za matini chanzi. Ishara ni pamoja na, haswa, maneno muhimu, ishara za operesheni, vitambulisho, viunga, vibambo maalum, nk.

Matokeo ya kazi ya uchanganuzi wa lexical (skana) ni mlolongo wa ishara, na kila ishara kawaida huwakilishwa na msimbo fulani wa urefu usiobadilika (kwa mfano, nambari kamili), na vile vile kizazi cha ujumbe kuhusu makosa ya kisintaksia (lexical). , kama ipo. Ikiwa ishara ni, kwa mfano, neno la msingi, basi kanuni yake inatoa taarifa zote muhimu. Katika kesi ya, kwa mfano, kitambulisho, jina la kitambulisho kinachotambuliwa linahitajika zaidi, ambalo kawaida hurekodiwa kwenye jedwali la vitambulisho, lililopangwa, kama sheria, kwa kutumia orodha. Jedwali sawa linahitajika kwa mara kwa mara.

Leksemu inaweza kuelezewa na sifa kuu mbili. Mojawapo ni kama leksemu ni ya tabaka fulani (vigeu, viunga, utendakazi, n.k.) Sifa ya pili huamua. kipengele maalum wa darasa hili.

Aina mahususi ya jedwali la ishara (muundo wa data) haijalishi kwa mchanganuzi au mchanganuzi. Zote mbili zinahitaji tu kutoa uwezo wa kupata faharasa ambayo hutambulisha kwa njia ya kipekee, kwa mfano, kigezo fulani na kurudisha thamani ya faharasa ili kujaza maelezo kuhusu jina fulani tofauti katika jedwali la ishara.

Kuangalia jedwali la kitambulisho hufanya kazi kuu mbili:

a) kurekodi jina jipya kwenye jedwali wakati wa kuchakata maelezo tofauti;

b) kutafuta jina lililorekodiwa hapo awali kwenye jedwali.

Hii hukuruhusu kutambua hali zenye makosa kama vile maelezo mengi ya kigezo na uwepo wa kigezo ambacho hakijabainishwa.

Ukuzaji wa kichanganuzi cha kileksika hujumuisha sehemu ya uundaji wa otomatiki tofauti ili kutambua vitambulishi, viunga, maneno yaliyohifadhiwa, n.k. Ikiwa ishara za aina tofauti huanza na herufi sawa au mlolongo sawa wa wahusika, inaweza kuwa muhimu kuchanganya utambuzi wao.

Kwa kuendesha kichanganuzi cha lexical, tunavunja programu yetu kuwa ishara, baada ya hapo kila ishara hupita hundi ya urefu (ishara haiwezi kuwa zaidi ya wahusika 11). Baada ya kukamilisha hatua hii kwa ufanisi, tunaangalia eneo sahihi la ishara (maneno muhimu var, start, end, for, to, do, end_for). Kisha tunachambua leksemu zinazobadilika - hazipaswi kuwa na nambari katika maelezo yao na hazipaswi kurudiwa. Katika hatua ya mwisho, tunaangalia tahajia sahihi ya leksemu ( maneno muhimu, vitambulisho visivyojulikana). Ikiwa angalau moja ya hundi itashindwa, kichanganuzi cha lexical huchapisha hitilafu.

Mchoro wa programu ya uchanganuzi wa kileksika umeonyeshwa katika Kiambatisho B katika Kielelezo B.1.

2.2.2 Muundo wa mashine ya kuuza

Hebu tufafanue sarufi ifuatayo:

G: (Vt, Va, I, R),

ambapo Vt ni seti ya alama za mwisho, Va ni seti ya alama zisizo za mwisho, mimi ni hali ya awali ya sarufi, R ni seti ya kanuni za sarufi.

Kwa sarufi hii, tunafafanua seti za alama za mwisho na zisizo za mwisho:

Wacha tutunge sheria za sarufi yetu G na kuziwasilisha katika Jedwali 1.

Jedwali 1 - sheria za sarufi

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

f ID = EX t EX d LE n;

Muendelezo wa jedwali 1.

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

Uteuzi wa leksemu, tafsiri ya leksemu katika misimbo na orodha ya majina ya sarufi yametolewa katika jedwali 2, 3, 4, mtawalia.

Jedwali 2 - Uteuzi wa leksemu

Uteuzi wa ishara

neno kuu "anza" (mwanzo wa maelezo ya vitendo)

neno kuu "mwisho" (mwisho wa maelezo ya kitendo)

neno kuu "var" (maelezo ya kutofautisha)

neno kuu "soma" (opereta wa kuingiza data)

neno kuu "andika" (opereta wa pato la data)

neno kuu "kwa" (taarifa ya kitanzi)

neno kuu "kwa"

neno kuu "fanya"

neno kuu "end_case" (mwisho wa taarifa ya kitanzi)

aina tofauti "integer"

operesheni ya kuongeza

operesheni ya kutoa

operesheni ya kuzidisha

kitenganishi herufi ":"

mhusika wa kitenganishi ";"

kitenganishi herufi "("

kitenganishi herufi ")"

kitenganishi herufi ","

Uteuzi wa ishara

herufi ya kitenganishi "="

Jedwali la 3 - Tafsiri ya leksemu kuwa misimbo

<цифра>

<буква>

Jedwali 4 - Orodha ya alama za sarufi

Uteuzi

Maelezo

Mpango

Maelezo ya mahesabu

Maelezo ya Vigezo

Orodha ya vigezo

Opereta

Mgawo

Kujieleza

Usemi mdogo

Uendeshaji wa binary

Operesheni za Unary

Orodha ya kazi

Kitambulisho

Mara kwa mara

Wacha tujenge kitambulisho cha kuamua kutoka chini kwenda juu.

Fikiria uhusiano ufuatao ili kuunda kitambuaji kinachoamua kutoka chini kwenda juu:

a) Iwapo kuna alama ya kundi B kiasi kwamba kanuni fulani ya sarufi inajumuisha mnyororo AB na kuna ishara xFIRST"(B), basi tutachukulia kwamba mahusiano x BAADA ya A yamebainishwa kati ya alama x na A.

b) Ikiwa katika sarufi fulani kuna kanuni B -> bAb A, BV a, b basi uhusiano A JALADA x huamuliwa kati ya A na x.

Sarufi yetu yote inabaki sawa, ambayo ni:

G: (Vt, Va, I, R),

na kanuni za sarufi G zimetolewa katika Jedwali la 5.

Jedwali la 5 - sheria za sarufi

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

f ID = EX t EX d LE n;?

Muendelezo wa jedwali 5.

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

Wapi? - alama kwa mwisho wa mnyororo.

Wacha tufafanue kesi kadhaa:

a) Kitambulisho kina herufi nyingi za alfabeti ya Kilatini, yaani, tutachukulia kuwa u = ( a, b, c, d, e, f,g, h, i,j,k, l,m, n. , o, p,q,r,s, t, u, v, w, x, y, z)

b) CO mara kwa mara ina nambari, ambayo ni, tutafikiria kuwa k = (0,1,2,3,4,5,6,7,8,9)

Ili sarufi yetu iwe mkakati mseto wa utangulizi, masharti yafuatayo lazima yatimizwe:

a) Ukosefu wa sheria za kielektroniki

b) Je, kuna sheria chini yake, x BAADA ya A? A VERT x =?

c) A -> bYg

na ni muhimu kwamba KATIKA AFTER x? B VERT x =?

yaani, katika sarufi watatekelezwa KATIKA AFTER x au A AFTER x, ambapo x ni ishara ya kihusishi cha mnyororo b.

a) KWANZA"(PG)=(PG?)

KWANZA"(RG) = KWANZA(DE) = (RG, v,:, i,;)

KWANZA" (AL) = KWANZA (b LE e)= (AL, b, e)

KWANZA" (DE) = KWANZA (v LV: i;) = (DE, v,:, i,;)

KWANZA" (LV) = KWANZA (Kitambulisho, LV) = (LV, kitambulisho)

KWANZA" (OP) =(OP, ID, CO)

KWANZA" (EQ) = KWANZA(KITAMBULISHO = EX;) = (EQ, =,;)

KWANZA" (EX) = (EX, SB, -)

KWANZA" (BO) =(B0, +,*,-)

KWANZA" (SB) = KWANZA((EX)SB) ? KWANZA(OP) ? KWANZA(BO)=(SB, (,), OP, BO);

KWANZA" (LE) = KWANZA(EQ) = (LE, (,), =,;, f, t, d, n, w, r)

KWANZA" (UO) = (UO,-)

KWANZA" (ID)= KWANZA" (u) = (u)

KWANZA" (CO) = KWANZA" (k) = (k) KWANZA" (e) =( e)

KWANZA" (b) =( b)

KWANZA" (e) =( e)

KWANZA" (v) =( v)

KWANZA" (w) =( w)

KWANZA" (r) =( r)

KWANZA" (i) =( i)

KWANZA" (f) =( f)

KWANZA" (d) =(d)

KWANZA" (n) =( n)

KWANZA" (c) =( c)

KWANZA" (+) =( +)

KWANZA" (*) =( *)

KWANZA" (-) =( -)

KWANZA" (,) =(,)

KWANZA" (;) =(;)

KWANZA" (:) =(:)

KWANZA" (=) = ( =)

KWANZA" (() =( ()

KWANZA" ()) =())

KWANZA" (u) =(u)

KWANZA" (k) =(k)

b) TRACE `(AL) = (?)? TRACE"(PG)=(?,b,e)

INAYOFUATA ` (DE) = (?)? KWANZA"(AL)= (?, b, e)

INAYOFUATA ` (LV) = (?)?KWANZA"(:)= (?,:)

INAYOFUATA ` (OP) = (?)?KWANZA"(SB)= (?,;,), d, t, +, -, *)

FUATILIA ` (EQ) = (?)?KWANZA"(LE)=(?, (,),;, f, =, t, d, n,w,r )

FUATILIA ` (EX) = (?)?KWANZA"(t)?KWANZA"(d)?KWANZA"(;)?KWANZA"())=(?, t,d,;,))

INAYOFUATA ` (BO) = (?)? KWANZA"(SB)= (?, (,), OP, BO)

INAYOFUATA ` (UO) = (?)? KWANZA"(SB)= (?, (,), OP, BO)

TRACE ` (SB) = (?)? TAFUTA"(EX)= (?, t,d,;,), +, *, -)

FUATILIA ` (LE) = (?) ?KWANZA"(e) ?KWANZA"(n) = (?, e, n)

TAFUTA `(ID)= (?)? INAYOFUATA" (OP) ? KWANZA" (=) =(?,;,), d, t, +, -, *, =)

TAFUTA `(CO) = (?)? TRACE" (OP)= (?,;,), d, t, +, -, *, =)

INAYOFUATA ` (b) =(?)?KWANZA"(LE)= (?, u, =,;)

FUATILIA ` (e) =(?)? FUATILIA"(AL)= (?, b)

INAYOFUATA ` (v) =(?)?KWANZA"(LV)= (?, u)

INAYOFUATA ` (w) =(?)? KWANZA"(()= (?, ()

INAYOFUATA ` (r) =(?)?KWANZA"(() = (?, ()

INAYOFUATA ` (i) =(?)?KWANZA"(;)= (?,;)

INAYOFUATA ` (f) =(?)?KWANZA"(Kitambulisho) = (?, u)

INAYOFUATA ` (d) =(?)?KWANZA"(LE)= (?, u, =,;)

INAYOFUATA ` (n) =(?)? KWANZA"(i) = (?, i )

FUATILIA ` (+) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (-) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (*) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (;) =(?)?FUATILIA" (DE)?FUATILIA `(LE1)?TRACK" (EQ) = (?, b, e, l, u)

INAYOFUATA ` (:) =(?)? KWANZA"(i)= (?, i )

INAYOFUATA ` (=) = (?)? KWANZA"(EX) = (? (,), u, k, +, -, *)

INAYOFUATA ` (() =(?)?KWANZA"(DE)= (?, v,:, i,;)

TAFUTA ` ()) =(?)? KWANZA"(;) = (?,;)

TAFUTA ` (,) =(?)? KWANZA"(LV) = (?, u)

TAFUTA `(u) =(?)? KWANZA" (ID)= ( u, ?)

TAFUTA `(k) =(?)? KWANZA (CO)= (?, k)

c) PG ->DE AL

AL BAADA YA DE = (b,e) BAADA YA DE = ((b DE), (e DE) )

e BAADA YA LE = ((e LE))

LE AFTER b = ((,), =,;, f, t, d, n, w, r) BAADA ya b = ((b), ()b), (=b), (;b), ( f b), (t b), (d b), (n b), (w b), (r b))

;BAADA ya mimi = ((; i))

i BAADA YA: = ( (i:) )

: BAADA YA LV = ( (: LV) )

LV BAADA YA v = ( (Kitambulisho, v) )

LV BAADA, = ((Kitambulisho,))

BAADA YA ID = ((,u))

LE AFTER EQ = ((,), =,;, f, t, d, n, w, r ) BAADA YA EQ = (((EQ), () EQ), (= EQ), (; EQ), ( f EQ), (t EQ), (d EQ), (n EQ), (w EQ), (r EQ))

LE -> r (DE);

; BAADA) = ((;)))

) BAADA YA DE = (((DE))

DE AFTER (= (= ((v)), (:)), (i)), (;)), (e)))

(BAADA r = (((r)))

LE -> w (DE);

; BAADA) = ((;)))

) DE MWISHO = (((DE))

DE AFTER (= ((v)), (:)), (i)), (;)), (e)))

(BAADA ya w = (((w)))

LE -> f ID = EX t EX d LE n;

; BAADA ya n = ((;n))

n BAADA YA LE = ( (n, LE))

LE AFTER d = ( ((,), =,;, f, t, d, n, w, r)) ? BAADA ya d = (((d), ()d), (;d), (f d), (t d), (d d), (n d), (w d), (r d))

d BAADA YA EX = ((d, EX))

EX AFTER t = (BO, -) ? BAADA YA t = ((BO t), (- t))

t BAADA YA EX = ( t EX)

EX BAADA = = ((BO, -) ? BAADA = = ((BO =), (- =))

BAADA YA ID = ((= ID))

KITAMBULISHO BAADA YA f = ((ID f))

EQ -> ID = EX;

; BAADA YA EX = ((; EX )

EX BAADA = = (BO, -) ? BAADA = = ((BO =), (- =))

BAADA ya wewe = ((=u))

SB AFTER UO = ( (,), OP, BO ) AFTER UO = (((UO), (OP UO), (BO UO) )

) BAADA YA EX = ( () EX) )

EX BAADA YA (= (BO, -) ? BAADA YA (= ((BO (), (- ())

SB->SB BO SB

SB BAADA YA BO = ((,), OP, BO) BAADA YA BO = ((BO), ()BO), (OP BO), (BO BO))

BO BAADA YA SB = (+,*,-) BAADA YA SB = ((+SB), (*SB), (-SB))

KITAMBULISHO BAADA YA u = ((u, u))

G) PG ->DE AL

AL COLLECTION PG = AL COLLECTION TRACE" (PG) = ((AL?))

e KUKUSANYA AL = e UFUATILIAJI WA KUKUSANYA"(AL)= ((eb), (e?))

=; NJIA YA KUSANYA"(DE) = ((;b), (;?))

UKUSANYAJI WA LV LV = NJIA YA KUKUSANYA YA LV" (LV) = ((LV:), (LV?))

UKUSANYAJI WA KITAMBULISHO LV = NJIA YA KUKUSANYA KITAMBULISHO" (LV) = ((KITAMBULISHO:), (KITAMBULISHO ?))

; KUNJA LE =; NJIA YA KUKUSANYA" (LE) = ((; e), (;?), (; n))

LE -> f ID = EX t EX d LE n;

; KUNJA LE =; NJIA YA KUKUSANYA" (LE) = ((; e), (;?), (; n))

EQ COLLECTION LE = EQ COVER TRACE" (LE) = ((EQ e), (EQ?), (EQ n))

EQ -> ID = EX;

; KUNJA EQ =; NJIA YA KUSANYA" (EQ) = ((; (), (;)), (;;), (;f), (;?), (;=), (;t), (;d), (; n), (;w), (;r))

SB COLLECTION EX = SB COVER TRACE" (EX) = ((SB t), (SB?), (SB d), (SB)), (SB;), (SB(), (SB=), (SBf ), (SBn), (SBw), (SBr))

) KUKUSANYA SB = UFUATILIAJI WA KUKUSANYA WA SB" (SB) = (() t), ()?), () d), ())), ();))

OP COLLECTION SB = OP COLLECTION TRACE" (SB) = ((OP t), (OP?), (OP d), (OP)), (OP;))

SB->SB BO SB

SB KUKUSANYA SB = SB COVER TRACE" (SB) = ((SB, t), (SBd), (SB;). (SB)), (SB+), (SB-), (SB*), (SB? ) }

KUKUSANYA UO = - NJIA YA KUKUSANYA" (UO) = ( (-?), (--))

BO YA KUKUSANYA = + TRACK YA KUKUSANYA" (BO) = ((++), (+?), (+*), (+-))

* KUKUSANYA BO = * NJIA YA KUSANYA" (BO) = ((*), (*?), (**), (*-))

BO YA KUKUSANYA = - NJIA YA KUKUSANYA" (BO) = ((-+), (-?), (-*), (--))

KUKUSANYA KITAMBULISHO OP = UFUATILIAJI WA UFUATILIAJI WA KITAMBULISHO" (OP) = ((KITAMBULISHO+), (KITAMBULISHO?), (KITAMBULISHO*), (KITAMBULISHO-))

JALADA OP = UFUATILIAJI WA JALADA" (OP) = ((CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

KITAMBULISHO CHA KUKUSANYA = NJIA YA KUKUSANYA KITAMBULISHO" (KITAMBULISHO) = ((KITAMBULISHO)), (KITAMBULISHO ?), (Kitambulisho k), (KITAMBULISHO+), (KITAMBULISHO-), (KITAMBULISHO*), (ID=), (IDt) , (ID)))

u KITAMBULISHO CHA KUKUSANYA = l NJIA YA KUKUSANYA" (KITAMBULISHO) = ((u)), (u?), (uk), (u+), (u-), (u*), (u=), (ut), (ud)))

COVER CO = TRACE COVER" (CO) = (CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

k KUKUSANYA CO = k UFUATILIAJI WA KUKUSANYA" (CO) = (k+), (k?), (k*), (k-), (k;), (kd), (kt), (k)))

Moja kupatikana hali ya migogoro wakati wa kuvunja sheria

OP -> ID na ID -> u ID

Tunaingiza ID1 -> ID, kwa hivyo tunaandika upya kanuni ID1 -> u ID

Kwa hiyo, tutafanya shughuli za convolution.

KITAMBULISHO CHA KUKUSANYA CHA ID1 = NJIA YA KUSANYA ID1" (ID) = ((ID1)), (ID1 ?), (ID1 k), (ID1+), (ID1-), (ID1*), (ID1=), (ID1t) , (ID1d)))

Kwa kila jozi (x, A)? x BAADA ya A tunaunda kitendakazi cha mpito ambacho huamua kitendo cha kuhamisha??(S 0 , x, A) = (S 0 , A)

? (S0, b, DE) = (S0, DEb)

? (S0, e, DE) = (S0, DEe)

? (S0, e, LE) = (S0, LEe)

? (S0,), b) = (S0, b))

? (S0,;, b) = (S0, b;)

? (S0, (, b) = (S0, b()

? (S0, =, b) = (S0, b=)

? (S0, f, b) = (S0, bf)

? (S0, t, b) = (S0, bt)

? (S0, d, b) = (S0, bd)

? (S0, n, b) = (S0, bn)

? (S0, w, b) = (S0, bw)

? (S0, r, b) = (S0, br)

? (S0,;, i) = (S0, i;)

? (S0, i,:) = (S0, i:)

? (S0,:LV) = (S0,LV:)

? (S0, ID, v) = (S0, vID)

? (S0,ID,) = (S0,ID)

? (S0, u) = (S0, u,)

? (S0, (, EQ)= (S0, EQ()

? (S0,), EQ)= (S0, EQ))

? (S0, =, EQ)= (S0, EQ=)

? (S0,;, EQ)= (S0, EQ;)

? (S0, f, EQ)= (S0, EQf)

? (S0, t, EQ)= (S0, EQt)

? (S0, d, EQ)= (S0, EQd)

? (S0, n, EQ)= (S0, EQn)

? (S0, w, EQ)= (S0, EQw)

? (S0, r, EQ)= (S0, EQr)

? (S0,;,)) = (S0,);)

? (S0, (, DE) = (S0, DE()

? (S0, v,)) = (S0,)v)

? (S0,;,)) = (S0,);)

? (S0, i,)) = (S0,)i)

? (S0,:,)) = (S0,):)

? (S0, e,)) = (S0,)e)

? (S0, (, r) = (S0, r()

? (S0, (, w) = (S0, w()

? (S0,;, n) = (S0, n;)

? (S0, n, LE) = (S0, LEn)

? (S0, (, d) = (S0, d()

? (S0,), d) = (S0, d))

? (S0,;, d) = (S0, d;)

? (S0, f, d) = (S0, df)

? (S0, t, d) = (S0, dt)

? (S0, d, d) = (S0, dd)

? (S0, n, d) = (S0, dn)

? (S0, w, d) = (S0, dw)

? (S0, r, d) = (S0, dr)

? (S0, d, EX) = (S0, EXd)

? (S0, BO, t) = (S0, tBO)

? (S0, -, t) = (S0, t-)

? (S0, t, EX) = (S0, EXt)

? (S0, BO, =) = (S0, =BO)

? (S0, -, =) = (S0, =-)

? (S0, =, ID) = (S0, ID=)

? (S0, ID, f) = (S0, fID)

? (S0,;, EX) = (S0, EX;)

? (S0, =, u) = (S0, u=)

? (S0, (, UO) = (S0, UO()

? (S0, OP, UO) = (S0, UO OP)

? (S0, BO, UO) = (S0, UO BO)

? (S0,), EX) = (S0, EX))

? (S0, BO, () = (S0, (BO)

? (S0, BO, -) = (S0, -BO)

? (S0, (, BO) = (S0, BO()

? (S0,),BO) = (S0,)BO)

? (S0, OP, BO) = (S0, BOOP)

? (S0, +, SB) = (S0, SB+)

? (S0, *, SB) = (S0, SB*)

? (S0, -, SB) = (S0, SB-)

? (S0, u, u) = (S0, uu)

Kwa kila jozi (x, A)? Na CONVERT x tunaunda kitendakazi cha mpito ambacho huamua kitendo cha ubadilishaji? * (S 0, x, bA) = (S 0, B), ambapo B->bA

? * (S 0 , AL, ?) = (S 0 , PG)

? * (S 0 , e, b) = (S 0 , AL)

? * (S 0 , n, ?) = (S 0 , AL)

? * (S 0 ,;, b) = (S 0, DE)

? * (S 0 ,;, ?) = (S 0 , DE)

? * (S 0 ,;, e) = (S 0, DE)

? * (S 0 , LV,:) = (S 0, LV)

? * (S 0 , LV, ?) = (S 0, LV)

? * (S 0 , ID, ?) = (S 0 , LV)

? * (S 0 , ID, e) = (S 0, LV)

? * (S 0 ,;, e) = (S 0, LE)

? * (S 0 ,;, ?) = (S 0 , LE)

? * (S 0 ,;, n) = (S 0, LE)

? * (S 0 , EQ, n) = (S 0, LE)

? * (S 0 , EQ, e) = (S 0, LE)

? * (S 0 , EQ, ?) = (S 0 , LE)

? * (S 0 ,;, e) = (S 0, LE)

? * (S 0 ,;, ?) = (S 0 , LE)

? * (S 0 ,;, () = (S 0, EQ)

? * (S 0 ,;,)) = (S 0, EQ)

? * (S 0 ,;, f) = (S 0, EQ)

? * (S 0 ,;, =) = (S 0, EQ)

? * (S 0 ,;, t) = (S 0, EQ)

? * (S 0 ,;, d) = (S 0, EQ)

? * (S 0 ,;, n) = (S 0, EQ)

? * (S 0 ,;, w) = (S 0, EQ)

? * (S 0 ,;, r) = (S 0, EQ)

? * (S 0 , SB, ?) = (S 0 , EX)

? * (S 0 , SB, d) = (S 0 , EX)

? * (S 0 , SB,)) = (S 0 , EX)

? * (S 0 , SB,;) = (S 0 , EX)

? * (S 0 , SB, w) = (S 0 , EX)

? * (S 0 , SB, r) = (S 0 , EX)

? * (S 0 , SB, f) = (S 0 , EX)

? * (S 0 , SB, =) = (S 0 , EX)

? * (S 0 , SB, t) = (S 0 , EX)

? * (S 0 , SB, ?) = (S 0 , SB)

? * (S 0 , SB, () = (S 0, SB)

? * (S 0 , SB,)) = (S 0 , SB)

? * (S 0 , SB, u) = (S 0, SB)

? * (S 0 , SB, k) = (S 0, SB)

? * (S 0 , SB, +) = (S 0 , SB)

? * (S 0 , SB, -) = (S 0 , SB)

? * (S 0 , SB, *) = (S 0 , SB)

? * (S 0 , SB, e) = (S 0, SB)

? * (S 0 ,), t) = (S 0, SB)

? * (S 0 ,), ?) = (S 0 , SB)

? * (S 0 ,), t) = (S 0, SB)

(S 0 ,),)) = (S 0 , SB)

? * (S 0 ,),;) = (S 0, SB)

? * (S 0 , -, ?) = (S 0 , UO)

? * (S 0 , -, -) = (S 0 , UO)

? * (S 0 , +, +) = (S 0, BO)

? * (S 0 , +, ?) = (S 0, BO)

? * (S 0 , +, *) = (S 0, BO)

? * (S 0 , -, +) = (S 0, BO)

? * (S 0 , -, ?) = (S 0 , BO)

? * (S 0 , -, *) = (S 0, BO)

? * (S 0 , -, -)) = (S 0 , BO)

? * (S 0 , *, +) = (S 0, BO)

? * (S 0 , *, ?) = (S 0 , BO)

? * (S 0 , *, *) = (S 0, BO)

? * (S 0 , *, -)) = (S 0 , BO)

? * (S 0 , u, +) = (S 0, BO)

? * (S 0 , u, ?)= (S 0 , BO)

? * (S 0 , u, *) = (S 0, BO)

? * (S 0 , u, -)) = (S 0 , BO)

? * (S 0 , k, +) = (S 0, BO)

? * (S 0 , k, ?) = (S 0 , BO)

? * (S 0 , k, *) = (S 0, BO)

? * (S 0 , k, -)) = (S 0 , BO)

? * (S 0 , CO, ?) = (S 0, OP)

? * (S 0 , CO, +) = (S 0, OP)

? * (S 0 , CO, *) = (S 0, OP)

? * (S 0 , CO, -) = (S 0 , OP)

? * (S 0 , CO,;) = (S 0, OP)

? * (S 0 , CO, d) = (S 0, OP)

? * (S 0 , CO, t) = (S 0, OP)

? * (S 0 , ID, -) = (S 0 , OP)

? * (S 0 , ID, *) = (S 0 , OP)

? * (S 0 , ID, ?) = (S 0 , OP)

? * (S 0 , ID, () = (S 0 , OP)

? * (S 0 , ID,)) = (S 0 , OP)

? * (S 0 , ID, u) = (S 0 , OP)

? * (S 0 , ID, k) = (S 0 , OP)

? * (S 0 , ID, -) = (S 0 , OP)

? * (S 0 , ID, +) = (S 0 , OP)

? * (S 0 , u,)) = (S 0, I OP)

? * (S 0 , ID1, *) = (S 0 , ID)

? * (S 0 , ID1, ?) = (S 0 , ID)

? * (S 0 , ID1, () = (S 0 , ID)

? * (S 0 , ID1,)) = (S 0 , ID)

? * (S 0 , ID1, u) = (S 0 , ID)

? * (S 0 , ID1, k) = (S 0 , ID)

? * (S 0 , ID1, -) = (S 0 , ID)

? * (S 0 , ID1, +) = (S 0 , ID)

? * (S 0 , u,)) = (S 0 , ID)

? * (S 0 , u, ?) = (S 0 , BO)

? * (S 0 , u, k) = (S 0 , ID)

? * (S 0 , u, *)) = (S 0 , ID)

? * (S 0 , u, -)) = (S 0 , ID)

? * (S 0 , u, +)) = (S 0 , ID)

? * (S 0 , u, d)) = (S 0 , ID)

? * (S 0 , u, t)) = (S 0 , ID)

? * (S 0 , u, =)) = (S 0 , ID)

? * (S 0 , CO, ?) = (S 0 , CO)

? * (S 0 , CO, +) = (S 0 , CO)

? * (S 0 , CO, -) = (S 0 , CO)

? * (S 0 , CO, *) = (S 0, CO)

? * (S 0, CO,;) = (S 0, CO)

? * (S 0 , CO, d) = (S 0, CO)

? * (S 0 , CO, t) = (S 0 , CO)

? * (S 0 , CO,)) = (S 0 , CO)

? * (S 0 , k, +) = (S 0, CO)

? * (S 0 , k, -) = (S 0 , CO)

? * (S 0 , k, *) = (S 0 , CO)

? * (S 0 , k,;) = (S 0, CO)

?? * (S 0 , k, d) = (S 0 , CO)

? * (S 0 , k, t) = (S 0 , CO)

? * (S 0 , k,)) = (S 0 , CO)

? * (S 0 , k, () = (S 0 , CO)

2.2.3 Utekelezaji wa programu ya kichanganuzi

Kichanganuzi cha kisintaksia (kichanganuzi) husoma faili ya leksemu inayotolewa na kichanganuzi cha kileksika, hufanya uchanganuzi wa kisarufi, na kutoa ujumbe kuhusu makosa ya sintaksia ikiwa inapatikana, na huunda aina ya kati ya kurekodi programu asili. Msingi wa ukuzaji wa kichanganuzi ni muundo na utekelezaji wa mashine inayolingana ya jarida.

Kwa uchanganuzi wa chini-juu kwa kichanganuzi kinachoamua kutoka chini-juu baada ya kuipunguza aina sahihi Inahitajika kutumia vipengele vya BAADA na ROLL ili kuunda mashine ya duka yenye maelezo ya kina ya mabadiliko yote ndani ya chaguo la kukokotoa la mpito.

Wakati wa kutengeneza mashine ya kuuza, tulijenga kazi za mpito ambazo zitakuwa msingi wa kichanganuzi. Kazi zote za mpito zinaweza kugawanywa katika aina mbili:

Mzunguko wa uendeshaji wa mashine ya gazeti bila kusoma alama ya pembejeo (mzunguko tupu);

Mbinu ya uendeshaji wa mashine ya gazeti kwa kusoma ishara ya ingizo.

Wakati wa kutekeleza uchanganuzi wa kileksika, tuligawa programu katika leksemu na kuziandika katika orodha. Kisha tunachakata orodha hii kwenye kichanganuzi. Tunatuma programu yetu (orodha), ishara ya awali (PG) na alama ya chini ya mashine ya duka (h0) kwa pembejeo, baada ya hapo kazi ya mpito inayohitajika inachaguliwa na simu ya kujirudia inafanywa.

Mchoro wa programu ya uchanganuzi umeonyeshwa katika Kiambatisho B katika Mchoro B.2.

2.2.4 Maendeleo ya moduli ya tafsiri

Wakati wa kuunda moduli ya tafsiri kama aina ya kati ya programu asili Njia ya postfix ya nukuu hutumiwa mara nyingi, ambayo inafanya kuwa rahisi sana kutekeleza mchakato wa kutekeleza (kutafsiri) programu iliyotafsiriwa.

Wacha tuzingatie kanuni za msingi za kuunda na kutekeleza fomu ya maandishi ya maandishi.

Sheria za msingi za kubadilisha usemi wa infix kuwa postfix ni kama ifuatavyo.

Operesheni zilizosomwa huongezwa kwa nukuu ya urekebishaji wa posta na shughuli zimeandikwa kwenye rafu.

Ikiwa operesheni iliyo juu ya stack ina kipaumbele cha juu (au sawa) kuliko uendeshaji uliosomwa sasa, basi operesheni kwenye stack huongezwa kwenye ingizo la postfix, na operesheni ya sasa inasukumwa kwenye stack. Vinginevyo (kwa kipaumbele cha chini), operesheni ya sasa tu inasukumwa kwenye stack.

Mabano ya ufunguzi yaliyosomwa yanasukumwa kwenye rafu.

Baada ya kusoma kwa brace ya kufunga, shughuli zote hadi ufunguzi wa kwanza wa ufunguzi hupigwa kutoka kwenye stack na kuongezwa kwenye uingizaji wa postfix, baada ya hapo vifungo vyote vya kufungua na kufunga vinatupwa, i.e. hazijawekwa kwenye rekodi ya postfix au kwenye stack.

Baada ya usemi mzima kusomwa, shughuli zilizobaki kwenye mrundikano huongezwa kwenye ingizo la postfix.

Nukuu ya postfix ya usemi inaruhusu kuhesabiwa kama ifuatavyo.

Ikiwa ishara ni operand, imeandikwa kwa stack. Ikiwa ishara ni operesheni, basi operesheni maalum inafanywa kwenye vipengele vya mwisho (kipengele cha mwisho) kilichoandikwa kwa stack, na vipengele hivyo (kipengele) vinabadilishwa kwenye stack na matokeo ya operesheni.

Ikiwa uchanganuzi wa kileksia na kisintaksia umekamilika kwa mafanikio, basi tunaendelea na tafsiri. Kwanza, tunatengeneza sentensi kutoka kwa maneno, kisha tunatafsiri misemo kuwa nukuu ya postfix na kuhesabu.

Mchoro wa operesheni ya mkalimani umeonyeshwa katika Kiambatisho B katika Kielelezo B.3.

2.3 Kuweka msimbo

Mpango huo unatekelezwa katika lugha ya C# katika mazingira Programu ya kuona Studio 2010. Maandishi ya programu yanawasilishwa katika Kiambatisho A.

Programu ina madarasa matano. Kiolesura cha mtumiaji kinatekelezwa kwa kutumia darasa la MainForn. Kwa kutumia darasa la LexAnalysis, moduli ya uchanganuzi wa kileksia inatekelezwa, SynAnalysis ni moduli ya uchanganuzi wa kisintaksia, Mfasiri ni moduli ya tafsiri, ProgramisciJakPolska ni darasa kisaidizi la kutafsiri semi kwa nukuu ya Kipolandi kinyume (postfix).

Madhumuni ya taratibu na kazi zinazotekelezwa katika programu zimeelezwa katika meza 6,7,8.

Jedwali 6 - Madhumuni ya taratibu na kazi za uchanganuzi wa kileksika

Nyaraka zinazofanana

    Mtafsiri kama programu au njia za kiufundi, kutangaza kipindi. Kuzingatia sifa kuu za ujenzi wa analyzer ya lexical. Utangulizi wa hatua za kukuza mtafsiri kutoka sehemu ndogo ya lugha ya kiwango cha juu.

    kazi ya kozi, imeongezwa 08/06/2013

    Muundo wa uchanganuzi wa kileksika na kisintaksia kwa lugha ya kielimu. Sheria za kubadilisha misemo yenye mantiki kuwa POLYZ. Uundaji wa triads, uboreshaji wa orodha yao. Muundo wa kimantiki programu. Kujaribu moduli za mfasiri-mkalimani.

    kazi ya kozi, imeongezwa 05/28/2013

    Tabia za jumla na tathmini ya uwezo wa lugha ya programu ya C-Sharp, vipengele vyake sawa na tofauti kutoka kwa C ++ na Java. Ukuzaji wa uchanganuzi wa kileksika na kisintaksia kwa kutumia lugha hii ya utayarishaji. Kukusanya meza za uchanganuzi.

    kazi ya kozi, imeongezwa 06/11/2010

    Kubuni programu ya uchanganuzi inayojumuisha sehemu mbili: kichanganuzi cha kileksika ambacho hugawanya matini chanzo cha programu katika leksemu na kujaza jedwali la majina; kichanganuzi kinachokagua maandishi kwa kufuata sarufi fulani.

    kazi ya kozi, imeongezwa 06/14/2010

    Kuandika programu ambayo hufanya uchanganuzi wa kileksika na kisintaksia wa lugha ya programu ya ingizo, hutoa jedwali la leksemu zinazoonyesha aina na maadili yao, na pia huunda mti wa sintaksia; maandishi ya lugha ya pembejeo huingizwa kutoka kwa kibodi.

    kazi ya kozi, imeongezwa 02/23/2012

    Mbinu ya ukuzaji na utekelezaji wa sehemu ya mfasiri wa lugha ya C kwa kutumia lugha ya C++, ambayo hugawanya msururu wa wahusika katika miundo midogo isiyoweza kugawanywa kulingana na msamiati wa lugha. Uchambuzi wa uendeshaji wa programu.

    kazi ya kozi, imeongezwa 03/19/2012

    Muundo, uainishaji na mahitaji ya utekelezaji wa mkusanyaji. Ubunifu na utekelezaji wa sehemu ya kuchanganua ya mkusanyaji wa lugha ya C++. Mbinu za kutekeleza uchanganuzi wa kileksika. Algorithm ya uendeshaji wa kichanganuzi. Kanuni za utekelezaji wa programu.

    kazi ya kozi, imeongezwa 01/26/2013

    Uundaji wa mtafsiri ambaye huchakata msimbo wa programu katika Pascal na, kwa kutumia waendeshaji sawa, hutengeneza programu katika C. Makala ya vipimo vya nje na uendeshaji wa analyzer lexical. Muundo wa programu, kuonyesha matokeo kwenye skrini.

    kazi ya kozi, imeongezwa 07/02/2011

    Mbinu za uchanganuzi wa kisarufi. Ukuzaji wa muundo wa mfasiri wa elimu katika lugha ya msingi ya programu Kitu Pascal katika mazingira ya programu ya kuona yenye mwelekeo wa kitu Borland DELPHI 6.0 kwa kutumia mfumo wa uendeshaji wa Windows XP.

    kazi ya kozi, imeongezwa 05/12/2013

    Utekelezaji wa programu ya programu ya eneo-kazi kwa kutumia lugha ya programu ya C#. Kubuni na muundo kiolesura cha mtumiaji, mahitaji yake na tathmini ya utendakazi. Maendeleo ya mwongozo wa mtumiaji na matumizi yake.

  • Anwani. Kifaa kinachofanya kazi ambacho hubadilisha anwani pepe kuwa anwani halisi.
  • Mazungumzo. Hutoa matumizi ya lugha ya programu katika hali ya kushiriki wakati.
  • Pasi nyingi. Huunda moduli ya kitu juu ya maoni kadhaa ya programu chanzo.
  • Nyuma. Sawa na kitafsiri. Tazama pia: decompiler, disassembler.
  • Pasi moja. Huunda moduli ya kitu katika utazamaji mmoja mfululizo wa programu chanzo.
  • Kuboresha. Hutekeleza uboreshaji wa msimbo katika moduli ya kitu kilichozalishwa.
  • Inayoelekezwa kisintaksia (inaendeshwa kisintaksia). Hupokea kama ingizo maelezo ya sintaksia na semantiki ya lugha na maandishi katika lugha iliyofafanuliwa, ambayo hutafsiriwa kwa mujibu wa maelezo yaliyotolewa.
  • Mtihani. Seti ya amri kuu za lugha ya kusanyiko ambazo hukuruhusu kuweka taratibu mbalimbali za utatuzi katika programu zilizoandikwa kwa lugha ya kusanyiko.

Kusudi la utangazaji- kubadilisha maandishi kutoka lugha moja hadi nyingine, ambayo inaeleweka kwa mpokeaji wa maandishi. Kwa upande wa programu za watafsiri, anayeandikiwa ni kifaa cha kiufundi (processor) au programu ya mkalimani.

Lugha ya wasindikaji (msimbo wa mashine) kawaida huwa ya kiwango cha chini. Kuna majukwaa ambayo hutumia lugha ya kiwango cha juu cha mashine (kwa mfano, iAPX-432), lakini ni ubaguzi kwa sheria kutokana na utata wao na gharama kubwa. Mtafsiri anayebadilisha programu kuwa lugha ya mashine inayopokelewa na kutekelezwa moja kwa moja na kichakataji huitwa mkusanyaji.

Mchakato wa ujumuishaji kawaida huwa na hatua kadhaa: uchanganuzi wa kileksia, kisintaksia na kisemantiki (uchambuzi wa Semantiki ya Kiingereza), uundaji wa msimbo wa kati, uboreshaji na uundaji wa msimbo wa mashine unaosababishwa. Kwa kuongeza, mpango hutegemea huduma zinazotolewa na mfumo wa uendeshaji na maktaba za watu wengine (kwa mfano, faili ya I/O au kiolesura cha picha), na msimbo wa mashine ya programu lazima uunganishwe na huduma hizi. Kuunganisha na maktaba ya tuli hufanywa na kiunganishi au kiunganishi (ambacho kinaweza kuwa programu tofauti au sehemu ya mkusanyaji), huku kuunganishwa na mfumo wa uendeshaji na maktaba yenye nguvu hufanyika wakati kipakiaji kinapoanza kutekeleza programu.

Faida ya mkusanyaji: programu imeundwa mara moja na hakuna mabadiliko ya ziada yanahitajika kila wakati inapotekelezwa. Ipasavyo, mkusanyaji hauhitajiki kwenye mashine inayolengwa ambayo programu imeundwa. Hasara: Hatua tofauti ya ujumuishaji hupunguza kasi ya uandishi na utatuzi na inafanya kuwa vigumu kuendesha programu ndogo, rahisi, au za mara moja.

Njia nyingine ya utekelezaji ni wakati programu inatekelezwa kwa kutumia mkalimani hakuna matangazo kabisa. Programu ya mkalimani ni mfano wa mashine ambayo mzunguko wake wa utekelezaji wa kuleta hufanya kazi kwa maagizo katika lugha za kiwango cha juu, badala ya maagizo ya mashine. Uigaji huu wa programu huunda mashine pepe inayotekeleza lugha. Njia hii inaitwa tafsiri safi. Tafsiri safi kawaida hutumiwa kwa lugha zilizo na muundo rahisi (kwa mfano, APL au Lisp). Wakalimani mstari wa amri kuchakata amri katika hati katika UNIX au faili za bechi (.bat) katika MS-DOS, pia kwa kawaida katika hali halisi ya ukalimani.

Faida ya mkalimani safi: kutokuwepo kwa vitendo vya kati vya tafsiri hurahisisha utekelezaji wa mkalimani na kuifanya iwe rahisi zaidi kutumia, pamoja na katika hali ya mazungumzo. Ubaya ni kwamba mkalimani lazima awepo kwenye mashine inayolengwa ambapo programu itatekelezwa.

Kuna maelewano kati ya mkusanyiko na tafsiri safi katika utekelezaji wa lugha za programu, wakati mkalimani, kabla ya kutekeleza programu, anaitafsiri kwa lugha ya kati (kwa mfano, kwa bytecode au p-code), rahisi zaidi kwa tafsiri (ambayo ni, tunazungumza juu ya mkalimani aliye na mtafsiri aliyejengewa ndani) . Njia hii inaitwa utekelezaji mchanganyiko. Mfano wa utekelezaji wa lugha mchanganyiko ni Perl. Mbinu hii inachanganya faida zote mbili za mkusanyaji na mkalimani ( kasi kubwa utekelezaji na urahisi wa utumiaji) na hasara (tafsiri na uhifadhi wa programu katika lugha ya kati inahitaji rasilimali za ziada; mkalimani lazima atolewe kutekeleza programu kwenye mashine inayolengwa). Pia, kama ilivyo kwa mkusanyaji, utekelezaji mchanganyiko unahitaji kwamba msimbo wa chanzo usiwe na makosa (lexical, syntactic na semantic) kabla ya utekelezaji.

Tangaza Na tafsiri - michakato tofauti: Tafsiri inahusika na tafsiri ya programu kutoka lugha moja hadi nyingine, huku ukalimani unawajibika kwa utekelezaji wa programu. Hata hivyo, kwa kuwa madhumuni ya tafsiri ni kawaida kuandaa programu kwa ajili ya tafsiri, taratibu hizi kwa kawaida huzingatiwa pamoja. Kwa mfano, lugha za programu mara nyingi hujulikana kama "iliyokusanywa" au "iliyofasiriwa", kulingana na ikiwa mkusanyiko au tafsiri hutawala matumizi ya lugha. Aidha, karibu lugha zote za programu kiwango cha chini na lugha za kizazi cha tatu, kama vile mkusanyiko, C, au Modula-2, hutungwa, wakati lugha za kiwango cha juu, kama vile Python au SQL, zinafasiriwa.

Kwa upande mwingine, kuna mwingiliano wa michakato ya utafsiri na ukalimani: wakalimani wanaweza kuwa wanatunga (pamoja na mkusanyo unaobadilika), na watafsiri wanaweza kuhitaji tafsiri ya miundo ya upangaji programu (kwa mfano, kwa macros katika lugha ya mkusanyiko, mkusanyiko wa masharti katika C, au kwa violezo katika C++).

Zaidi ya hayo, lugha sawa ya programu inaweza kutafsiriwa na kutafsiriwa, na katika hali zote mbili lazima iwepo hatua za jumla uchambuzi na utambuzi wa miundo na maagizo ya lugha chanzi. Hii inatumika kwa utekelezaji wa programu na maunzi - kwa mfano, wasindikaji wa familia ya x86, kabla ya kutekeleza maagizo ya lugha ya mashine, fanya usimbaji wao, ukiangazia katika opcodes nyanja za uendeshaji (rejista, anwani za kumbukumbu, maadili ya haraka), kina kidogo, n.k. ., na ndani Wasindikaji wa Pentium kwa usanifu wa NetBurst, msimbo wa mashine kwa ujumla hutafsiriwa katika mfuatano wa utendakazi mdogo kabla ya kuhifadhiwa kwenye akiba ya ndani.

Malengo na malengo ya taaluma. Dhana za kimsingi na ufafanuzi. Sifa za Jumla lugha za programu na watafsiri. Muundo wa jumla wa mtafsiri. Chaguo za mwingiliano wa vizuizi vya watafsiri.

Malengo na malengo ya taaluma

Kwa sasa lugha za bandia, ambayo hutumia uwakilishi wa maandishi kuelezea eneo la somo, hutumiwa sana sio tu katika programu, lakini pia katika maeneo mengine. Kwa msaada wao, muundo wa kila aina ya nyaraka, tatu-dimensional ulimwengu wa kweli, violesura vya picha mtumiaji na vitu vingine vingi vinavyotumiwa katika mifano na katika ulimwengu wa kweli. Ili maelezo haya ya maandishi yameundwa kwa usahihi, na kisha kutambuliwa kwa usahihi na kufasiriwa, mbinu maalum za uchambuzi na mabadiliko yao hutumiwa. Njia hizo zinatokana na nadharia ya lugha na sarufi rasmi, na pia nadharia ya automata. Mifumo ya programu iliyoundwa kuchambua na kutafsiri maandishi huitwa watafsiri.

Licha ya ukweli kwamba maelfu ya lugha tofauti na watafsiri wao wameendelezwa hadi sasa, mchakato wa kuunda programu mpya katika eneo hili hauacha. Hii inaunganishwa na maendeleo ya teknolojia ya uzalishaji mifumo ya kompyuta, na hitaji la kutatua shida zinazotumika zinazozidi kuwa ngumu. Kwa kuongezea, vipengele vya nadharia ya lugha na sarufi rasmi vinatumika katika maeneo mengine tofauti, kwa mfano, wakati wa kuelezea muundo wa data, faili, picha, ambazo hazijawasilishwa kwa maandishi, lakini katika muundo wa binary. Njia hizi pia ni muhimu wakati wa kuunda watafsiri wako mwenyewe, hata pale ambapo analogi zinazolingana tayari zipo. Maendeleo hayo yanaweza kuwa kutokana na sababu mbalimbali, hasa, mapungufu ya kazi, ukosefu wa ujanibishaji, na ufanisi mdogo. Kwa mfano, moja ya maendeleo ya hivi karibuni ya Microsoft ni lugha ya programu ya C #, na moja ya sababu za kuundwa kwake ni tamaa ya kupunguza umaarufu wa lugha ya programu ya Java. Kuna mifano mingine mingi ambapo kukuza mtafsiri wako mwenyewe kunaweza kuwa muhimu. Kwa hivyo, misingi ya nadharia ya lugha na sarufi rasmi, na vile vile mbinu za vitendo maendeleo ya watafsiri yapo katika msingi wa elimu ya uhandisi katika sayansi ya kompyuta na teknolojia ya kompyuta.

Nyenzo iliyopendekezwa inagusa misingi ya njia za kukuza watafsiri na ina habari muhimu kusoma mantiki ya utendakazi wao, vifaa vya hesabu vilivyotumika (nadharia). lugha rasmi na sarufi rasmi, lugha za metali). Inatumika kama sehemu ya kozi za mihadhara ya muhula mrefu zinazotolewa kwa taaluma mbali mbali katika Kitivo cha Informatics na Sayansi ya Kompyuta cha Chuo Kikuu cha Ufundi cha Jimbo la Krasnoyarsk. Wakati wa kazi ya maabara, ujuzi wa moja kwa moja na mbinu za mtu binafsi za kuunda watafsiri hufanyika.

Kusudi la taaluma: kutoa maarifa juu ya misingi ya nadharia ya lugha na sarufi rasmi, nadharia ya automata, njia za kukuza watafsiri.

Ili kufikia lengo hili, kazi zifuatazo zinatatuliwa wakati wa kufundisha nidhamu:

  1. Kozi ya mihadhara inachunguza kanuni za jumla za kuandaa mchakato wa tafsiri na muundo wa wafasiri. Misingi ya nadharia ya kuwajenga wafasiri inasomwa.
  2. Katika madarasa ya maabara na wakati wa kazi ya kujitegemea, ujumuishaji wa vitendo wa maarifa yaliyopatikana ya kinadharia hufanywa: mtafsiri anaandaliwa kwa lugha rahisi kupanga programu.

Dhana za kimsingi na ufafanuzi

Ufafanuzi mwingi unaozingatiwa umekopwa kutoka [ARNFTS Kamusi ya ufafanuzi ya Kiingereza-Kirusi-Kijerumani-Kifaransa juu ya teknolojia ya kompyuta na usindikaji wa data, maneno 4132. Chini ya. mh. A.A. Dorodnitsyna. M.: 1978. 416 p.) ].

Mfasiri - programu ya huduma inayobadilisha programu chanzo iliyotolewa katika lugha ya programu ya kuingiza kuwa programu ya kazi, inawakilishwa katika lugha ya kitu.

Ufafanuzi ulio hapo juu unatumika kwa aina zote za programu za utangazaji. Hata hivyo, kila moja ya programu hizi inaweza kuwa na sifa zake katika kuandaa mchakato wa utangazaji. Hivi sasa, watafsiri wamegawanywa katika vikundi vitatu kuu: wakusanyaji, wakusanyaji na wakalimani.

Mkusanyaji - programu ya matumizi ya mfumo ambayo inabadilisha miundo ya ishara kuwa maagizo ya lugha ya mashine. Kipengele maalum cha wakusanyaji ni kwamba hufanya tafsiri ya neno moja ya maagizo ya mfano katika maagizo ya mashine moja. Kwa hivyo, lugha ya mkutano (pia inaitwa autocode) imeundwa ili kuwezesha mtazamo wa mfumo wa amri ya kompyuta na kuharakisha programu katika mfumo huu wa amri. Ni rahisi zaidi kwa mpanga programu kukumbuka uteuzi wa mnemonic wa maagizo ya mashine kuliko msimbo wao wa binary. Kwa hiyo, faida kuu haipatikani kwa kuongeza nguvu za amri za mtu binafsi, lakini kwa kuongeza ufanisi wa mtazamo wao.

Wakati huo huo, lugha ya kusanyiko, pamoja na analogues ya amri za mashine, ina maagizo mengi ya ziada ambayo yanawezesha, hasa, kusimamia rasilimali za kompyuta, kuandika vipande vya kurudia, na kujenga programu za moduli nyingi. Kwa hiyo, uwazi wa lugha ni tajiri zaidi kuliko lugha ya ishara ya coding, ambayo inaboresha sana ufanisi wa programu.

Mkusanyaji - ni programu ya huduma inayotafsiri programu iliyoandikwa katika lugha chanzo cha programu hadi lugha ya mashine. Kama tu mkusanyaji, mkusanyaji hubadilisha programu kutoka lugha moja hadi nyingine (mara nyingi, hadi lugha ya kompyuta mahususi). Wakati huo huo, amri za lugha chanzi hutofautiana sana katika shirika na nguvu kutoka kwa amri za lugha ya mashine. Kuna lugha ambazo amri moja ya lugha ya asili hutafsiriwa kwa amri za mashine 7-10. Walakini, pia kuna lugha ambazo kila amri inaweza kuwa na amri 100 au zaidi za mashine (kwa mfano, Prolog). Kwa kuongezea, lugha chanzo mara nyingi hutumia uchapaji madhubuti wa data, unaofanywa kupitia maelezo yao ya awali. Kupanga kunaweza kutegemea si kusimba algoriti, lakini kufikiria kwa makini kuhusu miundo au madarasa ya data. Mchakato wa kutafsiri kutoka kwa lugha kama hizo kawaida huitwa mkusanyiko, na lugha asilia kawaida ni lugha za kiwango cha juu cha programu (au. lugha za hali ya juu) Kuondolewa kwa lugha ya programu kutoka kwa mfumo wa amri ya kompyuta ilisababisha kuundwa kwa kujitegemea kwa aina mbalimbali za lugha zinazozingatia kutatua matatizo maalum. Lugha zimeonekana kwa mahesabu ya kisayansi, mahesabu ya kiuchumi, ufikiaji wa hifadhidata, na zingine.

Mkalimani - programu au kifaa kinachotekeleza tafsiri ya opereta-kwa-opereta na utekelezaji wa programu asili. Tofauti na mkusanyaji, mkalimani haitoi programu ndani lugha ya mashine. Baada ya kutambua amri katika lugha ya chanzo, huitekeleza mara moja. Wakusanyaji na wakalimani hutumia mbinu sawa kuchanganua msimbo wa chanzo wa programu. Lakini mkalimani hukuruhusu kuanza usindikaji wa data baada ya kuandika hata amri moja. Hii inafanya mchakato wa kuunda na kurekebisha programu kubadilika zaidi. Kwa kuongezea, kutokuwepo kwa msimbo wa mashine ya pato hufanya iwezekane "kutokusanya" vifaa vya nje na faili za ziada, na mkalimani yenyewe inaweza kubadilishwa kwa urahisi kwa usanifu wowote wa mashine, baada ya kuitengeneza mara moja tu katika lugha ya programu inayotumiwa sana. Kwa hivyo, lugha zilizotafsiriwa kama Hati ya Java na Hati ya VB zimeenea. Ubaya wa wakalimani ni kasi ya chini utekelezaji wa programu. Programu zinazotafsiriwa kwa kawaida hufanya mara 50-100 programu polepole iliyoandikwa kwa nambari ya mashine.

Kiigaji - programu au zana ya maunzi ambayo hutoa uwezo, bila kupanga upya, kutekeleza kwenye kompyuta fulani programu inayotumia misimbo au mbinu za kufanya shughuli tofauti na kompyuta husika.. Emulator ni sawa na mkalimani kwa kuwa inatekeleza moja kwa moja programu iliyoandikwa katika lugha fulani. Walakini, mara nyingi ni lugha ya mashine au nambari ya kati. Zote mbili zinawakilisha maagizo katika msimbo wa binary ambayo yanaweza kutekelezwa mara tu baada ya msimbo wa uendeshaji kutambuliwa. Tofauti na programu za maandishi, hakuna haja ya kutambua muundo wa programu au kuchagua uendeshaji.

Emulators hutumiwa mara nyingi kwa madhumuni anuwai. Kwa mfano, wakati wa kuunda mifumo mpya ya kompyuta, emulator huundwa kwanza ambayo inaendesha programu zilizotengenezwa kwa kompyuta ambazo bado hazipo. Hii inakuwezesha kutathmini mfumo wa amri na kuendeleza msingi programu hata kabla ya vifaa vinavyofanana kuundwa.

Mara nyingi, emulator hutumiwa kuendesha programu za zamani kwenye mpya. kompyuta. Kwa kawaida, kompyuta mpya zaidi zina kasi zaidi na zina vifaa vya pembeni vyema zaidi. Hii hukuruhusu kuiga programu za zamani kwa ufanisi zaidi kuliko kuziendesha kwenye kompyuta za zamani. Mfano wa mbinu hii ni maendeleo ya emulators kompyuta ya nyumbani ZX Spectrum yenye microprocessor ya Z80. Bado kuna watu ambao wanapenda kucheza michezo kwenye emulator ambayo imepitwa na wakati, lakini bado hawajapoteza rufaa yao ya zamani, programu za mchezo. Emulator pia inaweza kutumika kama analog ya bei nafuu ya kisasa mifumo ya kompyuta, huku ikitoa utendaji unaokubalika sawa na mifano ya hali ya chini ya familia fulani ya usanifu. Mfano ni emulators za IBM PC kompyuta zinazoendana, kutekelezwa kwenye kompyuta za Apple zenye nguvu zaidi. Idadi ya emulators zilizoandikwa kwa ajili ya IBM PC kwa mafanikio kuchukua nafasi ya consoles mbalimbali za mchezo.

Emulator ya uwakilishi wa kati, pamoja na mkalimani, inaweza kuhamishwa kwa urahisi kutoka kwa usanifu wa kompyuta hadi nyingine, kuruhusu kuundwa kwa programu ya simu. Ni mali hii ambayo ilitanguliza mafanikio ya lugha ya programu ya Java, ambayo programu inatafsiriwa kuwa nambari ya kati. Mashine pepe ya Java inayotekeleza nambari hii si chochote zaidi ya emulator inayoendesha chini ya mfumo wowote wa kisasa wa uendeshaji.

Transcoder - programu au kifaa cha programu, kutafsiri programu zilizoandikwa katika lugha ya mashine ya kompyuta moja katika programu katika lugha ya mashine ya kompyuta nyingine. Ikiwa emulator ni analog isiyo na akili ya mkalimani, basi transcoder hufanya kwa uwezo sawa kuhusiana na mkusanyaji. Vile vile, msimbo wa mashine ya chanzo (na kawaida ya binary) au uwakilishi wa kati hubadilishwa kuwa msimbo mwingine sawa na maagizo moja na bila uchanganuzi wowote wa jumla wa muundo wa programu chanzo. Transcoders ni muhimu wakati wa kuhamisha programu kutoka kwa usanifu wa kompyuta hadi nyingine. Zinaweza pia kutumiwa kuunda upya maandishi ya programu ya kiwango cha juu kutoka kwa msimbo wa binary uliopo.

Macroprocessor - programu ambayo inachukua nafasi ya mlolongo mmoja wa wahusika na mwingine[Brown]. Hii ni aina ya mkusanyaji. Inazalisha maandishi ya pato kwa usindikaji kuingiza maalum, yapatikana maandishi ya chanzo. Viingilio hivi vimeundwa kwa njia maalum na ni vya miundo ya lugha inayoitwa lugha kubwa. Macroprocessors mara nyingi hutumiwa kama nyongeza kwa lugha za programu, ikiongezeka utendakazi mifumo ya programu. Karibu mkusanyiko wowote una macroprocessor, ambayo huongeza ufanisi wa kuendeleza programu za mashine. Mifumo kama hiyo ya programu kawaida huitwa macroassemblers.

Macroprocessors pia hutumiwa na lugha za kiwango cha juu. Wanaongeza utendakazi wa lugha kama vile PL/1, C, C++. Wasindikaji wa Macro hutumiwa sana katika C na C ++, na kuifanya iwe rahisi kuandika programu. Mfano wa matumizi makubwa ya wasindikaji macroprocessors ni maktaba ya darasa la Microsoft Foundation Classes (MFC). Inatekelezea ramani za ujumbe na vitu vingine vya programu kupitia viingizi vingi. Wakati huo huo, macroprocessors huongeza ufanisi wa programu bila kubadilisha syntax na semantics ya lugha.

Sintaksia - seti ya kanuni za lugha fulani zinazoamua uundaji wa vipengele vyake. Kwa maneno mengine, hii seti ya kanuni za uundaji wa mfuatano muhimu wa kisemantiki wa wahusika katika lugha fulani. Sintaksia hubainishwa kwa kutumia kanuni zinazoelezea dhana za lugha. Mifano ya dhana ni: kutofautiana, kujieleza, opereta, utaratibu. Mlolongo wa dhana na matumizi yao yanayokubalika katika sheria huamua miundo sahihi ya kisintaksia inayounda programu. Ni safu ya vitu, na sio jinsi wanavyoingiliana, ambayo hufafanuliwa kupitia syntax. Kwa mfano, taarifa inaweza tu kutokea kwa utaratibu, kujieleza katika taarifa, kutofautiana kunaweza kuwa na jina na fahirisi za hiari, nk. Sintaksia haihusiani na matukio kama hayo katika programu kama vile "kuruka kwenye lebo ambayo haipo" au "kigeu kilicho na jina lililotolewa hakijafafanuliwa." Hivi ndivyo semantiki hufanya.

Semantiki - kanuni na masharti ambayo huamua uhusiano kati ya vipengele vya lugha na maana zao za kisemantiki, pamoja na tafsiri ya maana ya maana ya miundo ya kisintaksia ya lugha.. Vitu vya lugha ya programu haziwekwa tu katika maandishi kwa mujibu wa uongozi fulani, lakini pia huunganishwa kwa ziada kupitia dhana nyingine zinazounda vyama mbalimbali. Kwa mfano, kigezo, ambacho syntax inafafanua eneo halali tu katika matamko na baadhi ya taarifa, ina aina maalum, inaweza kutumika kwa idadi ndogo ya shughuli, ina anwani, ukubwa, na lazima itangazwe kabla haijaweza. kutumika katika programu.

Kichanganuzi cha kisintaksia - kijenzi cha mkusanyaji ambacho hukagua taarifa za chanzo kwa utiifu wa kanuni za kisintaksia na semantiki za lugha fulani ya programu.. Licha ya jina lake, analyzer huangalia syntax na semantiki. Inajumuisha vitalu kadhaa, ambayo kila mmoja hutatua matatizo yake mwenyewe. Itajadiliwa kwa undani zaidi wakati wa kuelezea muundo wa mfasiri.

Vipengele vya jumla vya lugha za programu na watafsiri

Lugha za programu ni tofauti kabisa kutoka kwa kila mmoja kwa kusudi, muundo, ugumu wa semantic, na njia za utekelezaji. Hii inaweka vipengele vyake maalum juu ya maendeleo ya watafsiri maalum.

Lugha za programu ni zana za kutatua shida katika maeneo tofauti ya somo, ambayo huamua maalum ya shirika lao na tofauti za kusudi. Mifano ni pamoja na lugha kama vile Fortran, ambayo inaelekezwa kwa mahesabu ya kisayansi, C, ambayo imekusudiwa kwa programu ya mifumo, Prolog, ambayo inaelezea kwa ufanisi shida za uelekezaji, na Lisp, ambayo hutumiwa kwa usindikaji wa orodha inayojirudia. Mifano hii inaweza kuendelea. Kila eneo la somo huweka mahitaji yake juu ya shirika la lugha yenyewe. Kwa hiyo, tunaweza kutambua aina mbalimbali za uwakilishi wa waendeshaji na maneno, tofauti katika seti ya shughuli za msingi, na kupungua kwa ufanisi wa programu wakati wa kutatua matatizo yasiyohusiana na eneo la somo. Tofauti za kiisimu pia hujitokeza katika muundo wa wafasiri. Lisp na Prolog mara nyingi hutekelezwa katika hali ya ukalimani kutokana na ukweli kwamba hutumia uzalishaji wa aina za data wakati wa kukokotoa. Watafsiri wa Fortran wana sifa ya uboreshaji mkali wa msimbo wa mashine unaosababishwa, ambao unawezekana kwa sababu ya semantiki rahisi ya muundo wa lugha - haswa, kwa sababu ya kukosekana kwa njia za kutaja mbadala wa vigeu kupitia viashiria au marejeleo. Uwepo wa viashiria katika lugha C huweka mahitaji maalum ya ugawaji wa kumbukumbu ya nguvu.

Muundo wa lugha unaashiria uhusiano wa kidaraja kati ya dhana zake, ambazo zinaelezewa na kanuni za kisintaksia. Lugha za programu zinaweza kutofautiana sana kutoka kwa kila mmoja katika shirika la dhana za mtu binafsi na uhusiano kati yao. Lugha ya programu ya PL/1 inaruhusu uwekaji kiota kiholela wa taratibu na utendakazi, ilhali katika C vipengele vyote lazima ziwe katika kiwango cha nje cha kuota. Lugha ya C++ inaruhusu vigeu kutangazwa wakati wowote katika programu kabla ya matumizi yake ya kwanza, wakati katika vigeu vya Pascal lazima vifafanuliwe katika eneo maalum la tamko. Kuchukua hii hata zaidi ni PL/1, ambayo inaruhusu kutofautisha kutangazwa baada ya kutumika. Au unaweza kuacha maelezo kabisa na kutumia sheria chaguo-msingi. Kulingana na uamuzi uliofanywa, mtafsiri anaweza kuchambua programu kwa njia moja au kadhaa, ambayo inathiri kasi ya tafsiri.

Semantiki za lugha za programu hutofautiana sana. Wanatofautiana sio tu katika vipengele vya utekelezaji wa shughuli za mtu binafsi, lakini pia katika dhana za programu, ambazo huamua tofauti za msingi katika mbinu za maendeleo ya programu. Maelezo mahususi ya utekelezaji wa shughuli yanaweza kuhusisha muundo wa data inayochakatwa na sheria za kuchakata aina sawa za data. Lugha kama vile PL/1 na APL inasaidia matrix na uendeshaji wa vekta. Lugha nyingi hufanya kazi hasa na scalars, kutoa taratibu na kazi zilizoandikwa na watengeneza programu kwa ajili ya usindikaji wa safu. Lakini hata wakati wa kufanya operesheni ya kuongeza nambari mbili, lugha kama C na Pascal zinaweza kuishi tofauti.

Pamoja na upangaji wa kitaratibu wa kitamaduni, unaoitwa pia lazima, kuna dhana kama vile upangaji kazi, upangaji wa mantiki na upangaji unaolenga kitu. Natumai kwamba dhana ya upangaji wa kiutaratibu-parametric niliyopendekeza itachukua nafasi yake katika mfululizo huu [Legalov2000]. Muundo wa dhana na vitu vya lugha hutegemea sana dhana iliyochaguliwa, ambayo pia huathiri utekelezaji wa mtafsiri.

Hata lugha moja inaweza kutekelezwa kwa njia kadhaa. Hii ni kutokana na ukweli kwamba nadharia ya sarufi rasmi inaruhusu mbinu mbalimbali za kuchanganua sentensi zilezile. Kwa mujibu wa hili, watafsiri wanaweza kupata matokeo sawa (mpango wa kitu) kutoka kwa maandishi asilia kwa njia tofauti.

Wakati huo huo, lugha zote za programu zina idadi ya sifa na vigezo vya kawaida. Hali hii ya kawaida pia huamua kanuni za kupanga wafasiri ambazo zinafanana kwa lugha zote.

  1. Lugha za programu zimeundwa ili kurahisisha programu. Kwa hivyo, waendeshaji wao na miundo ya data ina nguvu zaidi kuliko ile ya lugha za mashine.
  2. Ili kuongeza mwonekano wa programu, badala ya nambari za nambari, uwakilishi wa kielelezo au picha wa muundo wa lugha hutumiwa, ambayo ni rahisi zaidi kwa mtazamo wa mwanadamu.
  3. Kwa lugha yoyote inafafanuliwa:
  • Alama nyingi ambazo zinaweza kutumika kuandika programu sahihi (alfabeti), vipengele vya msingi.
  • Programu nyingi sahihi (syntax).
  • "Maana" ya kila mpango sahihi (semantiki).

Bila kujali maalum ya lugha, mtafsiri yeyote anaweza kuchukuliwa kuwa kigeuzi kazi F, kutoa ramani ya kipekee kutoka X hadi Y, ambapo X ni programu katika lugha ya chanzo, Y ni programu katika lugha ya pato. Kwa hivyo, mchakato wa tafsiri yenyewe unaweza kuwasilishwa rasmi kwa urahisi na kwa uwazi:

Hapo awali, kila mpango sahihi X ni msururu wa alama kutoka kwa baadhi ya alfabeti A, iliyobadilishwa kuwa mnyororo wake Y, unaojumuisha alama za alfabeti B.

Lugha ya programu, kama mfumo wowote changamano, inafafanuliwa kupitia safu ya dhana ambayo inafafanua uhusiano kati ya vipengele vyake. Dhana hizi zimeunganishwa kwa mujibu wa kanuni za kisintaksia. Kila programu iliyojengwa kulingana na sheria hizi ina muundo wa kihierarkia unaolingana.

Katika suala hili, sifa zifuatazo za kawaida zinaweza kutofautishwa zaidi kwa lugha zote na programu zao: kila lugha lazima iwe na sheria zinazoruhusu kutengeneza programu zinazolingana na lugha hii au kutambua mawasiliano kati ya programu zilizoandikwa na lugha fulani.

Uhusiano kati ya muundo wa programu na lugha ya programu inaitwa ramani ya kisintaksia.

Kama mfano, fikiria uhusiano kati ya muundo wa daraja na safu ya alama zinazofafanua usemi ufuatao wa hesabu:

Katika lugha nyingi za programu usemi huu inafafanua safu ya vitu vya programu, ambavyo vinaweza kuonyeshwa kama mti (Mchoro 1.1.):

Miduara inawakilisha alama zinazotumika kama miundo msingi, na mistatili inawakilisha dhana zenye mchanganyiko ambazo zina muundo wa daraja na uwezekano wa kujirudia. Uongozi huu unafafanuliwa kwa kutumia kanuni za kisintaksia zilizoandikwa kwa lugha maalum inayoitwa metalanguage (metalanguage zitajadiliwa kwa undani zaidi wakati wa kusoma sarufi rasmi):

<выражение> ::= <слагаемое> | <выражение> + <слагаемое>

<слагаемое> ::= <множитель> | <слагаемое> * <множитель>

<множитель> ::= <буква> | (<выражение>)

<буква>

Kumbuka. Alama "::=" inasomwa kama "hii ni". Bomba "|" inasomeka kama "au".

Ikiwa sheria zimeandikwa tofauti, basi muundo wa kihierarkia. Mfano ni njia ifuatayo maingizo ya kanuni:

<выражение> ::= <операнд> | <выражение> + < операнд > | <выражение> * < операнд >

<операнд> ::= <буква> | (<выражение>)

<буква>::=a | b | c | d | mimi | f | g | h | mimi | j | k | l | m | n | o | p | q | r | s | t | wewe | v | w | x | y | z

Kama matokeo ya kuchanganua sawa usemi wa hesabu muundo wa kihierarkia utajengwa, umeonyeshwa kwenye Mtini. 1.2.


Ikumbukwe kwamba muundo wa hierarkia katika kesi ya jumla hauwezi kuhusishwa na semantiki ya usemi. Katika hali zote mbili, kipaumbele cha shughuli kinaweza kutekelezwa kwa mujibu wa sheria zinazokubaliwa kwa ujumla, wakati kuzidisha kunatangulia kuongezwa (au kinyume chake, shughuli zote zinaweza kuwa na kipaumbele sawa chini ya seti yoyote ya sheria). Hata hivyo, muundo wa kwanza unaunga mkono kwa uwazi utekelezaji zaidi wa kipaumbele kinachokubalika kwa ujumla, wakati wa pili unafaa zaidi kwa kutekeleza shughuli kwa kipaumbele sawa na kuzitekeleza kutoka kulia kwenda kushoto.

Mchakato wa kutafuta muundo wa kisintaksia programu iliyotolewa kuitwa kuchanganua.

Muundo wa kisintaksia ambao ni sahihi katika lugha moja unaweza kuwa si sahihi katika lugha nyingine. Kwa mfano, katika lugha ya Forth usemi uliotolewa hautatambuliwa. Walakini, kwa lugha hii usemi sahihi wa postfix ni:

Muundo wake wa kisintaksia unaelezewa na sheria:

<выражение> ::= <буква> | <операнд> <операнд> <операция>

< операнд > ::= < буква > | < выражение >

< операция > ::= + | *

<буква>::=a | b | c | d | mimi | f | g | h | mimi | j | k | l | m | n | o | p | q | r | s | t | wewe | v | w | x | y | z

Mti wa kihierarkia unaofafanua muundo wa kisintaksia umewasilishwa kwenye Mtini. 1.3.

Kipengele kingine cha tabia ya lugha zote ni semantiki zao. Huamua maana ya utendakazi wa lugha na usahihi wa oparesheni. Minyororo ambayo ina muundo sawa wa kisintaksia katika lugha tofauti za programu inaweza kutofautiana katika semantiki (ambayo, kwa mfano, inazingatiwa katika C ++, Pascal, Msingi kwa kipande cha juu cha usemi wa hesabu).

Ujuzi wa semantiki za lugha hukuruhusu kuitenganisha na sintaksia yake na kuitumia kwa ubadilishaji hadi lugha nyingine (kutoa msimbo).

Ufafanuzi wa semantiki na utambuzi wa usahihi wake ni kawaida sehemu inayohitaji nguvu kazi nyingi na yenye nguvu zaidi ya mfasiri, kwani ni muhimu kuhesabu na kuchambua chaguzi nyingi kwa mchanganyiko halali wa shughuli na uendeshaji.

Muundo wa mtafsiri wa jumla

Sifa na muundo wa kawaida ni asili katika lugha tofauti za programu na watafsiri kutoka lugha hizi. Wanapitia michakato sawa ya kubadilisha maandishi chanzo. Licha ya ukweli kwamba mwingiliano wa taratibu hizi unaweza kupangwa kwa njia tofauti, inawezekana kutambua kazi ambazo utekelezaji wake husababisha matokeo sawa. Wacha tuite kazi kama hizi awamu za mchakato wa tafsiri.

Kwa kuzingatia kufanana kati ya mkusanyaji na mkalimani, hebu tuangalie awamu zilizopo kwenye mkusanyaji. Inaangazia:

  1. Awamu ya uchanganuzi wa kimsamiati.
  2. Awamu ya uchanganuzi inayojumuisha:
  • utambuzi wa muundo wa kisintaksia;
  • uchambuzi wa kisemantiki, wakati ambapo kazi na majedwali inafanywa, kutoa uwakilishi wa kati wa kisemantiki au mfano wa kitu lugha.
  • Awamu ya utengenezaji wa kanuni, ambayo:
    • uchambuzi wa kisemantiki wa vipengele vya uwakilishi wa kati au kielelezo cha kitu cha lugha;
    • kutafsiri kiwakilishi cha kati au kielelezo cha kitu katika msimbo wa kitu.

    Pamoja na awamu kuu za mchakato wa tafsiri, awamu za ziada pia zinawezekana:

      2a. Awamu ya uchunguzi wa uwakilishi wa kati na uboreshaji, inayojumuisha:
    2a.1. kuchambua usahihi wa uwakilishi wa kati;
    2a.2. uboreshaji wa uwakilishi wa kati.
      3a. Awamu ya uboreshaji wa msimbo wa kitu.

    Mkalimani hutofautiana kwa kuwa awamu ya kuunda msimbo kawaida hubadilishwa na awamu ya kuiga vipengele vya uwakilishi wa kati au modeli ya kitu cha lugha. Kwa kuongezea, mfasiri kwa kawaida hatoi uwakilishi wa kati, lakini huiga mara moja.

    Kwa kuongeza, inawezekana kutofautisha mchakato wa uchambuzi na urekebishaji wa makosa yaliyopo katika maandishi ya chanzo yaliyochakatwa ya programu ambayo ni sare kwa awamu zote.

    Muundo wa jumla wa mkusanyaji, kwa kuzingatia awamu zilizopo ndani yake, umewasilishwa kwenye Mtini. 1.4.

    Inajumuisha uchanganuzi wa kileksika, kichanganuzi, jenereta ya msimbo, na uchanganuzi wa makosa. Badala ya jenereta ya kificho, mkalimani hutumia emulator (Mchoro 1.5), ambayo, pamoja na vipengele vya uwakilishi wa kati, data ya chanzo huhamishwa. Pato la emulator ni matokeo ya mahesabu.

    Kichanganuzi cha kileksika (pia hujulikana kama kichanganuzi) husoma mfuatano wa vibambo na kuziweka katika miundo msingi inayoitwa leksemu. Kila ishara ina darasa na maana. Kwa kawaida, watahiniwa wa dhima ya leksemu ni viunzi vya lugha ya msingi, kwa mfano, kitambulisho, nambari halisi, maoni. Ishara zinazosababishwa hupitishwa kwa mchanganuzi. Scanner sio sehemu ya lazima ya mfasiri. Hata hivyo, inakuwezesha kuongeza ufanisi wa mchakato wa tafsiri. Uchambuzi wa kileksika unajadiliwa kwa undani zaidi katika mada: "Shirika la uchanganuzi wa kileksika."

    Kichanganuzi huchanganua programu chanzo kwa kutumia leksemu zinazoingia, huunda muundo wa kisintaksia wa programu na uchanganuzi wa kisemantiki kwa kuunda kielelezo cha kitu cha lugha. Kielelezo cha kitu kinawakilisha muundo wa kisintaksia, unaokamilishwa na uhusiano wa kisemantiki kati ya dhana zilizopo. Viunganisho hivi vinaweza kuwa:

    • marejeleo ya vigezo, aina za data na majina ya utaratibu yaliyowekwa kwenye jedwali la majina;
    • viunganisho vinavyoamua mlolongo wa utekelezaji wa amri;
    • miunganisho ambayo huamua uwekaji wa vipengee vya modeli ya kitu cha lugha na zingine.

    Kwa hivyo mchanganuzi yuko sawa block tata mfasiri. Kwa hivyo, inaweza kugawanywa katika sehemu zifuatazo:

    • kitambua;
    • kizuizi cha uchambuzi wa semantic;
    • kielelezo cha kitu, au uwakilishi wa kati, unaojumuisha jedwali la majina na muundo wa kisintaksia.

    Muundo wa jumla wa kichanganuzi unaonyeshwa kwenye Mtini. 1.6.

    Mtambuaji hupokea mlolongo wa leksemu na, kwa kuzingatia hilo, hufanya uchanganuzi kwa mujibu wa sheria zinazotumiwa. Ishara, juu ya uchanganuzi mzuri wa sheria, huhamishiwa kwa mchanganuzi wa semantic, ambao huunda jedwali la majina na rekodi za vipande vya muundo wa kisintaksia. Kwa kuongezea, miunganisho ya ziada ya kisemantiki imerekodiwa kati ya jedwali la majina na muundo wa kisintaksia. Matokeo yake, mfano wa kitu cha programu huundwa, huru kutoka kwa kuunganisha kwa syntax ya lugha ya programu. Mara nyingi, badala ya muundo wa kisintaksia ambao unakili kabisa safu ya vitu vya lugha, analog yake iliyorahisishwa huundwa, ambayo inaitwa uwakilishi wa kati.

    Mchanganuzi wa makosa hupokea habari kuhusu makosa yanayotokea vitalu tofauti mfasiri. Kwa kutumia taarifa iliyopokelewa, inazalisha ujumbe kwa mtumiaji. Mbali na hilo, block hii inaweza kujaribu kurekebisha hitilafu ili kuendelea na uchambuzi zaidi. Pia anajibika kwa vitendo vinavyohusiana na ukamilishaji sahihi wa programu katika tukio ambalo haiwezekani kuendelea na utangazaji.

    Jenereta ya msimbo huunda msimbo wa mashine ya kitu kulingana na uchanganuzi wa muundo wa kitu au uwakilishi wa kati. Ujenzi wa kanuni unaambatana na ziada uchambuzi wa kisemantiki, inayohusishwa na hitaji la kubadilisha amri za jumla kuwa misimbo ya kompyuta mahususi. Katika hatua ya uchambuzi huo, uwezekano wa mabadiliko hatimaye umeamua, na chaguzi za ufanisi huchaguliwa. Uzalishaji wa kanuni yenyewe ni kuweka upya amri moja hadi nyingine.

    Chaguo za mwingiliano wa vizuizi vya watafsiri

    Shirika la michakato ya tafsiri, ambayo huamua utekelezaji wa awamu kuu, inaweza kufanyika kwa njia mbalimbali. Hii imedhamiriwa na chaguzi mbalimbali za mwingiliano wa vizuizi vya mtafsiri: kichanganuzi cha lexical, kichanganuzi na jenereta ya msimbo. Licha ya matokeo sawa ya mwisho, chaguo tofauti za vizuizi vinavyoingiliana vya watafsiri hutoa chaguo tofauti za kuhifadhi data ya kati. Kuna chaguzi kuu mbili za mwingiliano wa vizuizi vya watafsiri:

    • shirika la kupita nyingi, ambalo kila awamu ni mchakato wa kujitegemea ambao huhamisha udhibiti kwa awamu inayofuata tu baada ya usindikaji kamili wa data zake;
    • shirika la kupitisha moja, ambapo awamu zote zinawakilisha mchakato mmoja na kusambaza data kwa kila mmoja katika vipande vidogo.

    Kulingana na chaguzi kuu mbili, unaweza pia kuunda mchanganyiko mbalimbali wao.

    Shirika la pasi nyingi la mwingiliano kati ya vizuizi vya watafsiri

    Toleo hili la mwingiliano wa vitalu, kwa kutumia mkusanyaji kama mfano, linawasilishwa kwenye Mchoro 1.7.


    Kichanganuzi cha kileksika huchakata kikamilifu matini chanzi, na kutengeneza msururu wa pato unaojumuisha leksemu zote zilizopokewa. Tu baada ya hii ni kudhibiti kuhamishiwa kwa kichanganuzi. Kichanganuzi hupokea msururu unaozalishwa wa leksemu na, kwa kuzingatia hilo, huunda uwakilishi wa kati au kielelezo cha kitu. Baada ya kupokea mfano mzima wa kitu, hupitisha udhibiti kwa jenereta ya msimbo. Jenereta ya msimbo, kulingana na mfano wa kitu cha lugha, huunda msimbo wa mashine unaohitajika

    Faida za mbinu hii ni pamoja na:

    1. Kutengwa kwa awamu za mtu binafsi, ambayo inaruhusu utekelezaji wao wa kujitegemea na matumizi.
    2. Uwezo wa kuhifadhi data iliyopatikana kama matokeo ya uendeshaji wa kila awamu kwenye vifaa vya uhifadhi wa nje na kuzitumia kama inahitajika.
    3. Uwezo wa kupunguza kiasi cha RAM kinachohitajika kuendesha kitafsiri kwa kupiga simu kwa awamu mfululizo.

    Hasara ni pamoja na:

    1. Uwepo wa idadi kubwa ya habari ya kati, ambayo wakati huu Sehemu ndogo tu ya wakati inahitajika.
    2. Kupungua kwa kasi ya utangazaji kwa sababu ya utekelezaji mfuatano wa awamu na matumizi ya vifaa vya hifadhi ya nje ili kuokoa RAM.

    Njia hii inaweza kuwa rahisi wakati wa kuunda watafsiri kutoka kwa lugha za programu na muundo changamano wa kisintaksia na kisemantiki (kwa mfano, PL/I). Katika hali kama hizi, tafsiri ni ngumu kutimiza kwa kupita moja, kwa hivyo ni rahisi kuwakilisha matokeo ya kupita zilizopita kama data ya ziada ya kati. Ikumbukwe kwamba miundo changamano ya kisemantiki na kisintaksia ya lugha inaweza kusababisha vipashio vya ziada vinavyohitajika ili kuweka vitegemezi vinavyohitajika. Jumla ya idadi ya pasi inaweza kuwa zaidi ya kumi. Idadi ya pasi pia inaweza kuathiriwa na matumizi ya programu ya vipengele maalum vya lugha, kama vile kutangaza vigezo na taratibu baada ya kutumika, kutumia sheria za tamko chaguo-msingi, na kadhalika.

    Shirika la pasi moja la mwingiliano kati ya vizuizi vya watafsiri

    Moja ya chaguzi za mwingiliano wa vizuizi vya mkusanyaji na shirika la kupitisha moja imewasilishwa kwenye Mtini. 1.8.

    Katika kesi hii, mchakato wa kutafsiri unaendelea kama ifuatavyo. Kichanganuzi cha kileksika husoma kipande cha matini chanzi kinachohitajika ili kupata leksemu moja. Baada ya ishara kuundwa, huita kichanganuzi na kuipitisha ishara iliyoundwa kama parameta. Ikiwa mchanganuzi anaweza kuunda kipengele kinachofuata cha uwakilishi wa kati, basi hufanya hivyo na kupitisha kipande kilichojengwa kwa jenereta ya kanuni. Vinginevyo, kichanganuzi kinarejesha udhibiti kwa kichanganuzi, na hivyo kuweka wazi kuwa ishara inayofuata imechakatwa na data mpya inahitajika.

    Jenereta ya msimbo hufanya kazi kwa njia sawa. Kulingana na kipande kilichopokelewa cha uwakilishi wa kati, huunda kipande kinachofanana cha msimbo wa kitu. Baada ya hayo, udhibiti unarudi kwa kichanganuzi.

    Baada ya kukamilisha maandishi ya chanzo na kukamilika kwa usindikaji wa data zote za kati kwa kila moja ya vitalu, analyzer ya lexical huanzisha mchakato wa kusitisha programu.

    Mara nyingi, watafsiri wa moja-pass hutumia mpango tofauti wa udhibiti, ambao mpangaji ana jukumu la kizuizi kikuu (Mchoro 1.9).

    Kichanganuzi cha kileksika na jenereta ya msimbo hufanya kama njia ndogo ambazo inaita. Mara tu kichanganuzi kinahitaji ishara nyingine, huita kichanganuzi. Wakati wa kupokea kipande cha uwakilishi wa kati, simu inapigwa kwa jenereta ya msimbo. Kukamilika kwa mchakato wa tafsiri hutokea baada ya ishara ya mwisho kupokelewa na kuchakatwa na kuanzishwa na mchanganuzi.

    Faida za mpango wa kupitisha moja ni pamoja na kutokuwepo kwa kiasi kikubwa cha data ya kati, kasi ya juu ya usindikaji kutokana na mchanganyiko wa awamu katika mchakato mmoja, na kutokuwepo kwa upatikanaji wa vifaa vya hifadhi ya nje.

    Ubaya ni pamoja na: kutowezekana kwa utekelezaji wa mpango kama huo wa kutafsiri kwa lugha zilizo na muundo tata na ukosefu wa data ya kati ambayo inaweza kutumika kwa uchanganuzi mgumu na utoshelezaji.

    Mpango huu mara nyingi hutumiwa kwa lugha za programu ambazo ni rahisi katika miundo ya semantic na kisintaksia, katika watunzi na wakalimani. Mfano wa lugha kama hizi ni Msingi na Pascal. Mkalimani wa kawaida hujengwa kwa kutumia mpango wa kupita moja, kwani utekelezaji wa moja kwa moja unafanywa kwa kiwango cha vipande vya mtu binafsi vya uwakilishi wa kati. Shirika la mwingiliano kati ya vizuizi vya mkalimani kama huyo linaonyeshwa kwenye Mtini. 1.10.

    Miingiliano iliyojumuishwa ya vizuizi vya watafsiri

    Michanganyiko ya miradi ya tafsiri ya kupita nyingi na pasi moja hutoa chaguzi mbalimbali za pamoja, ambazo nyingi hutumiwa kwa mafanikio. Kwa mfano, tunaweza kufikiria baadhi yao.

    Katika Mtini. Mchoro 1.11 unaonyesha mchoro wa mwingiliano wa vizuizi vya watafsiri, ukigawanya mchakato mzima katika kupita mbili. Pasi ya kwanza hutoa uwakilishi kamili wa kati wa programu, na ya pili hutoa msimbo. Kutumia mpango kama huo hukuruhusu kuhamisha kwa urahisi mtafsiri kutoka kwa mfumo mmoja wa kompyuta hadi mwingine kwa kuandika tena jenereta ya nambari.

    Kwa kuongeza, badala ya jenereta ya kificho, ni rahisi kuunganisha emulator ya uwakilishi wa kati, ambayo inakuwezesha kwa urahisi kuendeleza mfumo wa programu katika lugha fulani, inayoelekezwa kwa mazingira mbalimbali ya utekelezaji. Mfano wa shirika kama hilo la mwingiliano kati ya vizuizi vya watafsiri huonyeshwa kwenye Mtini. 1.12.


    Pamoja na miradi inayohusisha kubadilisha jenereta ya msimbo na emulator, kuna watafsiri wanaowaruhusu. kugawana. Moja ya mipango kama hii imeonyeshwa kwenye Mtini. 1.13.

    Mchakato wa kutafsiri, pamoja na utengenezaji wa msimbo, unaweza kukamilishwa kwa idadi yoyote ya kupita (mfano unatumia tafsiri ya pasi moja iliyowasilishwa hapo awali). Hata hivyo, msimbo wa kitu kilichozalishwa haujatekelezwa kwenye mfumo wa kompyuta unaofanana, lakini unaigwa kwenye kompyuta yenye usanifu tofauti. Mpango huu hutumiwa katika mazingira yaliyojengwa karibu na lugha Upangaji wa Java. Mtafsiri mwenyewe hutoa msimbo Mashine pepe ya Java, uigaji ambao unafanywa kwa njia maalum kwa uhuru na katika mazingira ya kivinjari cha Mtandao.

    Mpango uliowasilishwa unaweza pia kuwa na tafsiri pana zaidi kuhusiana na mkusanyaji yeyote anayezalisha msimbo wa mashine. Jambo ni kwamba kompyuta nyingi za kisasa zinatekelezwa kwa kutumia udhibiti wa microprogram. Kifaa cha kudhibiti programu ndogo kinaweza kuzingatiwa kama programu inayoiga msimbo wa mashine. Hii inaruhusu sisi kuzungumza juu ya kuenea kwa matumizi ya mpango wa hivi karibuni uliowasilishwa.

    Maswali ya mtihani na kazi

    1. Taja tofauti:
      • mkalimani kutoka kwa mkusanyaji;
      • mkusanyaji kutoka kwa mkusanyiko;
      • transcoder ya mtafsiri;
      • emulator kutoka kwa mkalimani;
      • sintaksia kutoka kwa semantiki.
    1. Tuambie kuhusu maendeleo ya hivi punde katika lugha za programu unazozijua. Toa sifa kuu za lugha hizi.
    2. Lete mifano maalum matumizi ya mbinu za kutafsiri katika maeneo ambayo hayahusiani na lugha za programu.
    3. Toa mifano maalum ya lugha za programu zilizokusanywa.
    4. Toa mifano maalum ya lugha za programu zilizofasiriwa.
    5. Toa mifano maalum ya lugha za programu ambazo watunzi na wakalimani wanapatikana.
    6. Faida kuu na hasara za compilers.
    7. Faida kuu na hasara za wakalimani.
    8. Eleza tofauti kuu katika syntax ya lugha mbili za programu unazojua.
    9. Eleza tofauti kuu katika semantiki za lugha mbili za programu unazojua.
    10. Taja awamu kuu za mchakato wa tafsiri na madhumuni yao.
    11. Taja vipengele mahususi vya tafsiri ya pasi moja.
    12. Taja vipengele mahususi vya tafsiri ya pasi nyingi.
    13. Toa mifano ya michanganyiko inayowezekana ya tafsiri ya pasi moja na pasi nyingi. Tuambie kuhusu matumizi ya vitendo miradi hii.

    Lugha za programu zinaweza kugawanywa katika kukusanywa na kufasiriwa.

    Programu katika lugha iliyokusanywa, kwa kutumia programu maalum ya mkusanyaji, inabadilishwa (imekusanywa) kuwa seti ya maagizo ya aina fulani ya processor (msimbo wa mashine) na kisha kuandikwa kwa moduli inayoweza kutekelezwa, ambayo inaweza kuzinduliwa kwa utekelezaji kama programu tofauti. Kwa maneno mengine, mkusanyaji hutafsiri msimbo wa chanzo cha programu kutoka kwa lugha ya kiwango cha juu cha programu hadi nambari za binary za maagizo ya kichakataji.

    Ikiwa mpango umeandikwa katika lugha iliyotafsiriwa, basi mkalimani anatekeleza moja kwa moja (anafasiri) matini chanzi bila tafsiri ya awali. Katika kesi hii, programu inabaki katika lugha asilia na haiwezi kuzinduliwa bila mkalimani. Tunaweza kusema kwamba processor ya kompyuta ni mkalimani wa kanuni ya mashine.

    Kwa kifupi, mkusanyaji hutafsiri msimbo wa chanzo wa programu katika lugha ya mashine mara moja na kwa ukamilifu, wakati wa kuunda tofauti. programu inayoweza kutekelezwa, na mkalimani atekeleze maandishi chanzo moja kwa moja wakati wa utekelezaji wa programu.

    Mgawanyiko katika lugha zilizokusanywa na kufasiriwa ni za kiholela. Kwa hivyo, kwa lugha yoyote iliyokusanywa jadi, kama vile Pascal, unaweza kuandika mkalimani. Kwa kuongezea, wakalimani wengi wa kisasa "safi" hawatekelezi muundo wa lugha moja kwa moja, lakini badala yake wanazikusanya katika uwakilishi wa kiwango cha juu cha kati (kwa mfano, na uondoaji wa kutofautisha na upanuzi wa jumla).

    Mkusanyaji anaweza kuunda kwa lugha yoyote iliyotafsiriwa - kwa mfano, lugha ya Lisp, ambayo inatafsiriwa asili, inaweza kukusanywa bila vizuizi vyovyote. Nambari inayotolewa wakati wa utekelezaji wa programu inaweza pia kukusanywa kwa nguvu wakati wa utekelezaji.

    Kama sheria, programu zilizokusanywa hufanya haraka na haziitaji programu za ziada kutekeleza, kwani tayari zimetafsiriwa kwa lugha ya mashine. Wakati huo huo, kila wakati maandishi ya programu yanabadilishwa, inahitaji kurejeshwa, ambayo huleta matatizo wakati wa maendeleo. Kwa kuongeza, programu iliyokusanywa inaweza tu kutekelezwa kwenye aina moja ya kompyuta, na kwa kawaida chini ya mfumo huo wa uendeshaji, ambayo compiler iliundwa. Ili kuunda inayoweza kutekelezwa kwa aina tofauti ya mashine, mkusanyiko mpya unahitajika.

    Lugha zilizofasiriwa zina maalum vipengele vya ziada(tazama hapo juu), kwa kuongeza, mipango juu yao inaweza kuzinduliwa mara baada ya mabadiliko, ambayo inawezesha maendeleo. Programu katika lugha iliyotafsiriwa mara nyingi inaweza kuendeshwa aina tofauti magari na mifumo ya uendeshaji bila juhudi za ziada.

    Walakini, programu zilizofasiriwa huendesha polepole sana kuliko zilizokusanywa, na haziwezi kutekelezwa bila programu ya ziada ya mkalimani.

    Lugha zingine, kama vile Java na C#, huanguka kati ya zilizokusanywa na kufasiriwa. Yaani, mpango haujajumuishwa katika lugha ya mashine, lakini katika kanuni ya kiwango cha chini inayojitegemea ya mashine, bytecode. Bytecode kisha inatekelezwa na mashine ya kawaida. Ufafanuzi kwa kawaida hutumiwa kutekeleza bytecode, ingawa sehemu zake mahususi zinaweza kutafsiriwa katika msimbo wa mashine moja kwa moja wakati wa utekelezaji wa programu kwa kutumia Ukusanyaji wa Muda wa Wakati (JIT) ili kuharakisha programu. Kwa Java, bytecode inatekelezwa na Java Virtual Machine (JVM), kwa C # - na Runtime ya Lugha ya Kawaida.

    Njia hii, kwa maana, hukuruhusu kutumia faida za wakalimani na wakusanyaji. Inafaa pia kutaja lugha asilia ya Forth, ambayo ina mkalimani na mkusanyaji.

    Kwa kuwa maandishi yaliyoandikwa katika lugha ya programu hayaeleweki kwa kompyuta, inahitaji kutafsiriwa kwenye msimbo wa mashine. Tafsiri kama hiyo ya programu kutoka kwa lugha ya programu hadi lugha ya nambari ya mashine inaitwa tafsiri, na inafanywa programu maalum- watafsiri.

    Mtafsiri ni programu ya huduma inayobadilisha programu chanzo iliyotolewa katika lugha ya programu ya kuingiza kuwa programu ya kufanya kazi inayowasilishwa katika lugha ya kifaa.

    Hivi sasa, watafsiri wamegawanywa katika vikundi vitatu kuu: wakusanyaji, wakusanyaji na wakalimani.

    Kikusanyaji ni programu ya matumizi ya mfumo ambayo inabadilisha miundo ya ishara kuwa amri za lugha ya mashine. Kipengele maalum cha wakusanyaji ni kwamba hufanya tafsiri ya neno moja ya maagizo ya mfano katika maagizo ya mashine moja. Kwa hivyo, lugha ya mkutano (pia inaitwa autocode) imeundwa ili kuwezesha mtazamo wa mfumo wa amri ya kompyuta na kuharakisha programu katika mfumo huu wa amri. Ni rahisi zaidi kwa mpanga programu kukumbuka uteuzi wa mnemonic wa maagizo ya mashine kuliko msimbo wao wa binary.

    Wakati huo huo, lugha ya kusanyiko, pamoja na analogues ya amri za mashine, ina maagizo mengi ya ziada ambayo yanawezesha, hasa, kusimamia rasilimali za kompyuta, kuandika vipande vya kurudia, na kujenga programu za moduli nyingi. Kwa hiyo, uwazi wa lugha ni tajiri zaidi kuliko lugha ya ishara ya coding, ambayo inaboresha sana ufanisi wa programu.

    Mkusanyaji ni programu ya huduma ambayo hutafsiri programu iliyoandikwa katika lugha ya programu ya chanzo hadi lugha ya mashine. Kama tu mkusanyaji, mkusanyaji hubadilisha programu kutoka lugha moja hadi nyingine (mara nyingi, hadi lugha ya kompyuta mahususi). Wakati huo huo, amri za lugha chanzi hutofautiana sana katika shirika na nguvu kutoka kwa amri za lugha ya mashine. Kuna lugha ambazo amri moja ya lugha ya asili hutafsiriwa kwa amri za mashine 7-10. Walakini, pia kuna lugha ambazo kila amri inaweza kuwa na amri 100 au zaidi za mashine (kwa mfano, Prolog). Kwa kuongezea, lugha chanzo mara nyingi hutumia uchapaji madhubuti wa data, unaofanywa kupitia maelezo yao ya awali. Kupanga kunaweza kutegemea si kusimba algoriti, lakini kufikiria kwa makini kuhusu miundo au madarasa ya data. Mchakato wa kutafsiri kutoka kwa lugha kama hizo kawaida huitwa mkusanyiko, na lugha asilia kawaida huainishwa kama lugha za kiwango cha juu cha programu (au lugha za kiwango cha juu). Kuondolewa kwa lugha ya programu kutoka kwa mfumo wa amri ya kompyuta ilisababisha kuundwa kwa kujitegemea kwa aina mbalimbali za lugha zinazozingatia kutatua matatizo maalum. Lugha zimeonekana kwa mahesabu ya kisayansi, mahesabu ya kiuchumi, ufikiaji wa hifadhidata, na zingine.

    Mkalimani - programu au kifaa kinachotekeleza tafsiri ya opereta-kwa-opereta na utekelezaji wa programu chanzo. Tofauti na mkusanyaji, mkalimani hatoi programu ya lugha ya mashine kama pato. Baada ya kutambua amri katika lugha ya chanzo, huitekeleza mara moja. Wakusanyaji na wakalimani hutumia mbinu sawa kuchanganua msimbo wa chanzo wa programu. Lakini mkalimani hukuruhusu kuanza usindikaji wa data baada ya kuandika hata amri moja. Hii inafanya mchakato wa kuunda na kurekebisha programu kubadilika zaidi. Kwa kuongezea, kutokuwepo kwa msimbo wa mashine ya pato hufanya iwezekane "kutokusanya" vifaa vya nje na faili za ziada, na mkalimani yenyewe inaweza kubadilishwa kwa urahisi kwa usanifu wowote wa mashine, baada ya kuitengeneza mara moja tu katika lugha ya programu inayotumiwa sana. Kwa hivyo, lugha zilizotafsiriwa kama Hati ya Java na Hati ya VB zimeenea. Hasara ya wakalimani ni kasi ya chini ya utekelezaji wa programu. Kwa kawaida, programu zilizotafsiriwa huendesha polepole mara 50 hadi 100 kuliko programu za asili.

    Emulator ni programu au zana ya maunzi ambayo hutoa uwezo, bila kupanga upya, kutekeleza kwenye kompyuta fulani programu inayotumia misimbo au mbinu za kufanya shughuli ambazo ni tofauti na kompyuta husika. Emulator ni sawa na mkalimani kwa kuwa inatekeleza moja kwa moja programu iliyoandikwa katika lugha fulani. Walakini, mara nyingi ni lugha ya mashine au nambari ya kati. Zote mbili zinawakilisha maagizo katika msimbo wa binary ambayo yanaweza kutekelezwa mara tu baada ya msimbo wa uendeshaji kutambuliwa. Tofauti na programu za maandishi, hakuna haja ya kutambua muundo wa programu au kuchagua uendeshaji.

    Emulators hutumiwa mara nyingi kwa madhumuni anuwai. Kwa mfano, wakati wa kuunda mifumo mpya ya kompyuta, emulator huundwa kwanza ambayo inaendesha programu zilizotengenezwa kwa kompyuta ambazo bado hazipo. Hii inakuwezesha kutathmini mfumo wa amri na kuendeleza programu ya msingi hata kabla ya kuunda vifaa vinavyolingana.

    Mara nyingi, emulator hutumiwa kuendesha programu za zamani kwenye kompyuta mpya. Kwa kawaida, kompyuta mpya zaidi zina kasi zaidi na zina vifaa vya pembeni vyema zaidi. Hii hukuruhusu kuiga programu za zamani kwa ufanisi zaidi kuliko kuziendesha kwenye kompyuta za zamani.

    Transcoder ni programu au kifaa cha programu ambacho hutafsiri programu zilizoandikwa kwa lugha ya mashine ya kompyuta moja hadi programu katika lugha ya mashine ya kompyuta nyingine. Ikiwa emulator ni analog isiyo na akili ya mkalimani, basi transcoder hufanya kwa uwezo sawa kuhusiana na mkusanyaji. Vile vile, msimbo wa mashine ya chanzo (na kawaida ya binary) au uwakilishi wa kati hubadilishwa kuwa msimbo mwingine sawa na maagizo moja na bila uchanganuzi wowote wa jumla wa muundo wa programu chanzo. Transcoders ni muhimu wakati wa kuhamisha programu kutoka kwa usanifu wa kompyuta hadi nyingine. Zinaweza pia kutumiwa kuunda upya maandishi ya programu ya kiwango cha juu kutoka kwa msimbo wa binary uliopo.

    Macroprocessor ni programu ambayo inachukua nafasi ya mlolongo mmoja wa wahusika na mwingine. Hii ni aina ya mkusanyaji. Inazalisha maandishi ya pato kwa kuchakata viingilio maalum vilivyo katika maandishi chanzo. Viingilio hivi vimeundwa kwa njia maalum na ni vya miundo ya lugha inayoitwa lugha kubwa. Macroprocessors mara nyingi hutumiwa kama nyongeza kwa lugha za programu, na kuongeza utendaji wa mifumo ya programu. Karibu mkusanyiko wowote una macroprocessor, ambayo huongeza ufanisi wa kuendeleza programu za mashine. Mifumo kama hiyo ya programu kawaida huitwa macroassemblers.

    Macroprocessors pia hutumiwa na lugha za kiwango cha juu. Wanaongeza utendakazi wa lugha kama vile PL/1, C, C++. Wasindikaji wa Macro hutumiwa sana katika C na C ++, na kuifanya iwe rahisi kuandika programu. Macroprocessors huboresha ufanisi wa programu bila kubadilisha sintaksia au semantiki ya lugha.

    Sintaksia ni seti ya kanuni za lugha zinazobainisha uundaji wa vipengele vyake. Kwa maneno mengine, hii ni seti ya sheria za uundaji wa mlolongo muhimu wa alama katika lugha fulani. Sintaksia hubainishwa kwa kutumia kanuni zinazoelezea dhana za lugha. Mifano ya dhana ni: kutofautiana, kujieleza, opereta, utaratibu. Mlolongo wa dhana na matumizi yao yanayokubalika katika sheria huamua miundo sahihi ya kisintaksia inayounda programu. Ni safu ya vitu, na sio jinsi wanavyoingiliana, ambayo hufafanuliwa kupitia syntax. Kwa mfano, taarifa inaweza tu kutokea kwa utaratibu, kujieleza katika taarifa, kutofautiana kunaweza kuwa na jina na fahirisi za hiari, nk. Sintaksia haihusiani na matukio kama hayo katika programu kama vile "kuruka kwenye lebo ambayo haipo" au "kigeu kilicho na jina lililotolewa hakijafafanuliwa." Hivi ndivyo semantiki hufanya.

    Semantiki - sheria na masharti ambayo huamua uhusiano kati ya vipengele vya lugha na maana zao za kisemantiki, pamoja na tafsiri ya maana ya maana ya miundo ya kisintaksia ya lugha. Vitu vya lugha ya programu haziwekwa tu katika maandishi kwa mujibu wa uongozi fulani, lakini pia huunganishwa kwa ziada kupitia dhana nyingine zinazounda vyama mbalimbali. Kwa mfano, kigezo, ambacho syntax inafafanua eneo halali tu katika matamko na baadhi ya taarifa, ina aina maalum, inaweza kutumika kwa idadi ndogo ya shughuli, ina anwani, ukubwa, na lazima itangazwe kabla haijaweza. kutumika katika programu.

    Kichanganuzi ni kijenzi cha mkusanyaji ambacho hukagua taarifa za chanzo ili kupata utiifu wa kanuni za kisintaksia na semantiki za lugha fulani ya programu. Licha ya jina lake, analyzer huangalia syntax na semantiki. Inajumuisha vitalu kadhaa, ambayo kila mmoja hutatua matatizo yake mwenyewe. Itajadiliwa kwa undani zaidi wakati wa kuelezea muundo wa mfasiri. upangaji wa lugha ya mkusanyaji wa lugha

    Mtafsiri yeyote hufanya kazi kuu zifuatazo:

    • - inachambua programu iliyotafsiriwa, haswa huamua ikiwa ina makosa ya syntax;
    • - huzalisha programu ya pato (mara nyingi huitwa mpango wa kitu) katika lugha ya amri ya mashine;
    • - hutenga kumbukumbu kwa programu ya kitu.1.1 Wakalimani

    Faida moja inayotajwa mara nyingi ya utekelezaji wa ukalimani ni kwamba inaruhusu "hali ya haraka". Hali ya moja kwa moja hukuruhusu kuuliza kompyuta kazi kama vile PRINT 3.14159*3/2.1 na kukuletea jibu mara tu unapobonyeza. INGIA ufunguo(hii inaruhusu kompyuta ya $3,000 kutumika kama kikokotoo cha $10). Kwa kuongeza, wakalimani wana sifa maalum ambazo hurahisisha utatuzi. Unaweza, kwa mfano, kukatiza usindikaji wa programu ya mkalimani, kuonyesha yaliyomo ya vigezo fulani, skim programu, na kisha kuendelea utekelezaji.

    Kile ambacho waandaaji wa programu wanapenda zaidi kuhusu wakalimani ni uwezo wa kupata jibu la haraka. Hakuna haja ya ujumuishaji hapa, kwani mkalimani yuko tayari kila wakati kuingilia programu yako. Andika RUN na matokeo ya mabadiliko yako ya hivi karibuni yanaonekana kwenye skrini.

    Walakini, lugha za mkalimani zina shida. Ni muhimu, kwa mfano, kuwa na nakala ya mkalimani katika kumbukumbu wakati wote, wakati uwezo mwingi wa mkalimani, na kwa hiyo uwezo wake, hauwezi kuwa muhimu kwa utekelezaji wa programu fulani.

    Ubaya wa hila wa wakalimani ni kwamba wana mwelekeo wa kukatisha tamaa mtindo mzuri wa upangaji. Kwa kuwa maoni na maelezo mengine yaliyorasimishwa huchukua kiasi kikubwa cha kumbukumbu ya programu, watu huwa hawayatumii. Ibilisi hana hasira kidogo kuliko mpanga programu anayefanya kazi katika mkalimani BASIC akijaribu kupata programu ya 120K kuwa kumbukumbu ya 60K. lakini jambo baya zaidi ni kwamba wafasiri wanaenda polepole.

    Wanatumia muda mwingi kujaribu kujua nini cha kufanya badala ya kufanya kazi hiyo. Wakati wa kuigiza waendeshaji wa programu, mfasiri lazima kwanza achanganue kila taarifa ili kusoma yaliyomo (mtu huyu ananiuliza nifanye nini?) kisha afanye operesheni iliyoombwa. Waendeshaji katika vitanzi huchanganuliwa kupita kiasi.

    Zingatia mpango huu: katika mkalimani MSINGI WA 10 KWA N=1 HADI 1000 20 CHAPISHA N,SQR(N) 30 IJAYO Mara ya kwanza unapopitia mpango huu, Mkalimani wa MSINGI lazima atambue mstari wa 20 unamaanisha nini:

    • 1. kubadilisha kigezo cha nambari N hadi kamba
    • 2. tuma kamba kwenye skrini
    • 3. sogeza hadi eneo linalofuata la kuchapisha
    • 4. hesabu mzizi wa mraba wa N
    • 5. badilisha matokeo kuwa mfuatano
    • 6. tuma kamba kwenye skrini

    Wakati wa kupita kwa pili kwa mzunguko, utatuzi huu wote unarudiwa tena, kwani matokeo yote ya kusoma mstari huu baadhi ya millisecond iliyopita yamesahaulika kabisa. Na kadhalika kwa pasi zote 998 zinazofuata. Ni wazi, ikiwa ungeweza kutenganisha awamu ya skanning/ufahamu kutoka kwa awamu ya utekelezaji, ungekuwa na zaidi. programu ya haraka. Na hii ndio hasa watunzi ni wa.