- Abstraktne süntaksipuu (AST) esindab programmi loogilist struktuuri, eemaldades ebaolulised süntaktilised detailid.
- AST-d ehitatakse tähestikest koos ariteedifunktsioonide ja puugrammatikatega, mis määravad, millised sõlmed ja struktuurid on kehtivad.
- Dewey-tähistused ja operaatorid, näiteks "." või "/", võimaldavad täpset viitamist alampuudele ja radadele nendes struktuurides.
- Kompilaatorid, interpretaatorid ja koodianalüüsi tööriistad toetuvad AST-le programmide usaldusväärseks optimeerimiseks, teisendamiseks ja mõistmiseks.

Abstraktsed süntaksipuud programmeerimises on üks neist kontseptsioonidest, mis esmapilgul kõlavad väga teoreetiliselt, aga kui neist aru saad, saad aru, et neid on kõikjal: kompilaatorites, interpretaatorites , koodianalüüsis, refaktoreerimistööriistades ja isegi struktureeritud andmete päringukeeltes. Need on sisuliselt viis, kuidas masin programmi struktuuri tavalisest tekstist kaugemale "mõistab".
Kuigi abstraktseid süntaksipuid (AST) aetakse mõnikord segi klassikaliste parsimispuudega, on neil oma reeglid. Abstraktne süntaksipuu ei ole lihtsalt ilus joonis: see on kompaktne ja hästi disainitud andmestruktuur, mis kõrvaldab konkreetsest süntaksist kõik üleliigse (sulud, komad, üleliigsed märksõnad jne) ja keskendub olulisele: milliseid toiminguid, milliste väärtustega ja millises järjekorras tehakse.
Mis täpselt on abstraktne süntaksipuu (AST)?
Programmeerimiskeele teoorias on abstraktne süntaksipuu (AST) puulaadne struktuur, mis esitab programmi süntaksit, kuid lihtsustatud kujul võrreldes konkreetse parsimispuuga. See sisaldab sama olulist teavet kui parsimispuu, kuid on korraldatud kompaktsemal ja hallatavamal viisil.
Parsimispuu sisaldab kõiki grammatika produktsioone ja kõiki lõppsümboleid, sealhulgas sulgusid, komasid, semikooloneid ja muid puhtsüntaktilisi elemente. AST seevastu eemaldab need detailid, mis ei lisa semantilist tähendust, ja säilitab ainult avaldiste ja lausete loogilise struktuuri.
Rakenduse mõttes koosneb AST tavaliselt sõlmeobjektidest , mille tüüp näitab, millist süntaktilist konstruktsiooni see on (konstant, identifikaator, funktsiooni rakendus, binaaroperaator jne), ja lisaomadustest, mis kirjeldavad selle sisu: väärtus, nimi, lapsed, argumentide loend jne.
AST-i ilu seisneb selles, et see hõlbustab kompilaatori või interpretaatori hilisemaid etappe, nagu tüübikontroll, optimeerimine või koodi genereerimine , kuna see pakub programmi struktuurist selget ülevaadet ilma süntaktilise mürata.
Erinevus konkreetse süntaksipuu ja abstraktse süntaksipuu vahel
AST panuse täielikuks mõistmiseks on kasulik kõigepealt võrrelda konkreetset parsimispuud abstraktse parsimispuuga. Kujutage ette lihtsat grammatikat, mis tunneb ära aritmeetilisi avaldisi nagu "a + 4 * 5" . Konkreetne parsimispuu peegeldab täpselt iga grammatikareegli rakendamist: mitteterminaalsed sümbolid, terminalid, sulud, operaatorid jne.
See konkreetne puu on tavaliselt sügav ja sellel on palju vahesõlmi, mis aitavad säilitada ainult grammatika formaalset struktuuri. Näiteks võivad seal olla sõlmed "Avaldis", "Termin", "Tegur" ja seejärel lõppsümbolid nagu "+" , "*" , identifikaatorid ja numbrid. Iga produktsioon saab puu haruks, suurendades struktuurilist keerukust.
Sama avaldise abstraktne süntaksipuu piirdub seevastu tegelike operatsioonide ja operandide esitamisega . Seega mitme "Avaldise" ja "Term" taseme asemel võiks meil olla liitmist esindav juursõlm, millel on kaks last: vasakul identifikaator a ja paremal korrutamissõlm, mille lapsed on väärtused 4 ja 5. Puhtgrammatilised sõlmed kaovad ja struktuuri osad järjestatakse ümber või tihendatakse.
See tähendab, et AST ja konkreetne süntaksipuu sisaldavad sama semantilist teavet , kuid esimene esitab selle palju otsesemal ja kompaktsemal kujul. See tihendamine on analüüsi- või täitmistööriistades koodiga tõhusa töötamise võti.
Puud ja tähestikud ariteedifunktsiooniga
Nende puude matemaatiliseks formaliseerimiseks kasutatakse tavaliselt ariteedifunktsiooniga tähestiku ideed . Lihtsalt sümbolite komplekti asemel defineeritakse tähestik, kus iga sümbol on seotud numbriga, mis näitab, mitu last sellel puus olla saab.
Ariteedifunktsiooniga tähestik on mitteametlikult paar, mis koosneb lõplikust hulgast sümbolitest ja funktsioonist, mis määrab igale sümbolile naturaalarvu (kaasa arvatud null). See arv näitab sümboli ariteeti: kui see on 0, käitub sümbol lehena; kui see on 1, käitub see unaarse sõlmena; kui see on 2, on see binaarne; ja nii edasi. Samuti on tavaline lubada operaatoritele argumentide loenditena muutuva ariteediga sümboleid.
Ariteediga 0 sümbolid vastavad puu lehtedele (näiteks konstandid või identifikaatorid). Ariteediga 1 sümboleid kasutatakse konstruktsioonide puhul, mis hõlmavad ühte alam-avaldist. Ariteediga 2 sümbolid esindavad klassikalisi binaaroperatsioone, nagu liitmine, korrutamine, omistamine jne. Ja muutuva ariteediga sümbolid võimaldavad modelleerida konstruktsioone, mis aktsepteerivad määramata arvu alampuid, näiteks mitme parameetriga funktsioonikõnet.
Sellest ariteediga tähestikust saab defineerida kõigi võimalike puude hulga: alustades tühjast puust (kui seda vaadeldakse), lisades kõik ariteediga 0 ja muutujaga sümbolid ning laiendades induktiivselt: kui sümbol on k-aarne, saab selle paigutada k juba konstrueeritud alampuu ülemsõlmeks. See annab tähestikuga seotud puukeele (või termini).
Puukeel ja sõlme mõiste
Tähestiku ja selle ariteedifunktsiooni abil moodustatud puude hulka nimetatakse selles kontekstis puukeeleks või termide keeleks . See on samaväärne, kuid puustruktuuride osas, sellega, mida Kleene'i sulgemine on stringide jaoks.
Nii nagu stringide analüüsimisel kasutame terminit tokenid tähestikuliste sümbolite esinemiste tähistamiseks järjestuses, kasutame puudega töötamisel tavaliselt terminit sõlmed . Sõlm on sisuliselt tähestikulise sümboli konkreetne esinemine, mille ariteet asub puus kindlas positsioonis.
Sellest vaatenurgast on see puukeel sõlmede jaoks sama, mis stringide komplekt sümbolite esinemiste jaoks. Iga puud tõlgendatakse tähestikust samm-sammult üles ehitatud struktuurina ning sõlmed on üksikud tükid, mis füüsiliselt selle sümboleid materialiseerivad.
Selline vaatenurk on väga kasulik parserite ja AST-generaatorite loomisel , sest see võimaldab arutleda nende puude konstruktsioonireeglite üle analoogselt stringigrammatikaga, kuid töötades otse hierarhiliste struktuuride kallal.
Sõlmede ariteet konkreetses AST-s: Eggi juhtum
Liikudes teooriast praktilise näite juurde, kasutavad paljud õppematerjalid AST-de konstrueerimise ja manipuleerimise illustreerimiseks munakeelt . Selles kontekstis kasutatakse mitut peamist tüüpi sõlmi, millel kõigil on täpselt määratletud ariteet , mis muudab nende manipuleerimise väga lihtsaks.
Tüüpilises Egg AST-s peetakse VALUE- sõlmi lehtedeks: nad esindavad literaale, näiteks stringe või numbreid. Neil pole lapsi; nad salvestavad ainult väärtuse. Samamoodi käsitletakse WORD-sõlmi , mida kasutatakse identifikaatorite (muutujate nimed, funktsioonide nimed jne) jaoks, samuti lehtedena, millel on omadus, mis salvestab nime.
Egg'i võtmesõlm on APPLY tüüp , mis esindab funktsiooni või operaatori rakendamist. Sellel sõlmetüübil on kaks kontseptuaalset last: OPERATOR laps , mis osutab rakendatavale avaldisele; ja ARGS laps , mis on tegelikult spetsiaalne ARRAY sõlm, mis vastutab alampuude kogumi haldamise eest, üks iga argumendi kohta.
Seega on massiivid loomulik viis muutujate ariteedi AST-i sisseviimiseks: APPLY-l on alati kaks komponenti (operaatorite ja argumentide loend), kuid see sisemine loend võib sisaldada nulli, ühte või mitut alampuud, olenevalt konkreetsest esitatavast kutsetest.
AST-sõlmede detailne anatoomia Munas
Rakendustasandil on Egg'i AST-sõlmed tavaliselt esindatud objektidena , millel on omadused , mis sobib ideaalselt selliste keeltega nagu JavaScript. Kõigil sõlmedel on ühine omadus: `type` , mis määrab sõlme tüübi (VALUE, WORD, APPLY, ARRAY jne) ja seega ka ülejäänud objekti struktuuri.
VALUE-sõlmi kasutatakse literaalkonstantide jaoks . Need sisaldavad omadust, mida sageli nimetatakse väärtuseks ja kuhu salvestatakse arv või string, mida nad esindavad. Neil pole täiendavaid lapsi, kuna nende sisu kirjeldab täielikult see literaal.
Sõnasõlmed on reserveeritud identifikaatoritele : muutujate nimed, funktsioonide nimed, parameetrite nimed ja muu sarnane. Tavaliselt on neil omadus „nimi” , mis salvestab identifikaatori stringina. Sarnaselt VALUE-sõlmedega toimivad nad puus lehtedena, kuna nende ainus eesmärk on anda see nimi.
Rakendussõlmed esindavad rakendusi või kutseid. Need sisaldavad operaatori omadust , mis osutab rakendatavale avaldisele (teisele sõlmele) ja args omadust , mis lingib ARRAY sõlmega. Viimane on spetsiifiline sõlm AST-s, mille eesmärk on hoida rakenduse argumentide loendit .
ARRAY sõlme võib mõista kui struktureeritud konteinerit teistele sõlmedele, mis esindab alampuude jada. Ariteedi seisukohast pakub see paindlikkust, kuna see võimaldab väljakutseid ilma argumentideta, ühe argumendiga või mitme argumendiga sama APPLY-lause sees, ilma et peaks muutma peasõlme tüübi definitsiooni.
AST näide: lihtne rakendus ühe väärtusega
Kõige eelneva visualiseerimiseks mõelgem lihtsa käsu esitusele, näiteks funktsiooni X rakendusele ühe argumendiga 5. Parseri genereeritud AST vastab terminile, mis on konstrueeritud VALUE, WORD ja APPLY sõlmede abil , järgides Egg'i reegleid.
Kontseptuaalsel tasandil oleks meil juursõlm APPLY . Selle operaatoromadus osutaks WORD-sõlmele nimega X ja selle args omadus viitaks ARRAY-sõlmele, mis sisaldab ühte elementi: VALUE-sõlme numbrilise väärtusega 5. Sel viisil peegeldab struktuur selgelt, kellele ja millele rakendatakse.
Kui me tahaksime kõik atribuudid selgesõnaliseks muuta, saaksime kirjutada detailsema tähistuse, mis näitab tüüpi, operaatorit, argumente, nime ja väärtust. See üksikasjalikum tähistus on väga kasulik parseri silumiseks või selle mõistmiseks, kuidas tekstiline avaldis interpretaatoris puuobjektiks tõlgitakse.
Reaalsetes rakendustes on see puu tavaliselt JSON- vormingus serialiseeritav , et seda oleks lihtne salvestada, edastada või kontrollida. Tegelikult pakuvad tööriistad ja moodulid, näiteks npm-ökosüsteemi pakett evm2term , nende AST-de kompaktseid esitusi hõlpsamaks analüüsiks või teisendamiseks.
AST näide: pesastatud liitmine ja korrutamine
Teine tüüpiline juhtum on veidi keerulisem avaldis, näiteks "+(a, *(4, 5))" . Siin on meil liitmisoperatsioon, mille esimene argument on identifikaator a ja teine argument on 4 korrutamine 5-ga. Sellest avaldisest tulenev AST peegeldab seda pesastatud struktuuri.
Puu juures oleks meil jällegi liitmisoperatsiooni esindav APPLY sõlm. Selle operaator oleks WORD sõlm nimega "+", samas kui argumendid oleksid kahe elemendiga ARRAY sõlmes: esimene on WORD nimega "a" ja teine on korrutamist esindav APPLY sõlm.
Sellel teisel APPLY käsul oleks operaatoriks SÕNA nimega "*" ja argumentideks MASSIIVI kahe VALUE sõlmega: üks väärtusega 4 ja teine väärtusega 5. Tervikuna vaadatuna näitab struktuur selgelt, et hindamise järjekord seisneb 4 korrutamises 5-ga ja seejärel tulemuse liitmises a-ga.
Kui laiendaksime tähistust nii, et see hõlmaks kõiki atribuute, näeksime kõigi sõlmede tüüpe, nende nimesid või konkreetseid väärtusi ja nendevahelisi seoseid. See selgesõnaline kirjeldus vastab tegelikule implementatsioonile Egg interpreteris, kus iga sõlm on objekt eelpoolmainitud omadustega.
Puugrammatika ja parserigrammatika
Nende AST-de genereerimise viis ei ole suvaline: see põhineb nn puugrammatikale . Tüüpilises formuleeringus on selline grammatika defineeritud kui nelik, mis koosneb ariteediga tähestikust, lõplikust hulgast süntaktilistest (mitteterminaalsetest) muutujatest, lõplikust hulgast produktsioonireeglitest ja algussümbolist.
Igas produktsioonireeglis asendatakse muutuja puuga, mille juur on ariteediga tähestiku sümbol ja mille lapsed on omakorda muutujad või juba defineeritud puud. See struktuur meenutab klassikalisi regulaarseid või kontekstivabu grammatikaid, kuid on kohandatud puude otseseks genereerimiseks sümbolite stringide asemel.
Selle formaalsema definitsiooniga on seotud spetsiifiline grammatika, mida Egg'i parser oma puude loomiseks kasutab. See grammatika, mis on dokumentatsioonis tavaliselt mitteametlikult esitatud, kirjeldab täpselt, milliseid märksõnade, operaatorite, sulgude jms kombinatsioone keeles aktsepteeritakse ja kuidas need tõlgitakse VALUE, WORD, APPLY ja ARRAY tüüpi sõlmedeks.
Seda puugrammatikat võib vaadelda kui erijuhu sellest, mida kirjanduses tuntakse tavalise puugrammatikana . Idee seisneb täpselt määratletud reeglites sisendmärkide jada teisendamiseks struktureeritud AST-ks, mida saab seejärel tõlgendada või kompileerida.
Dewey tähistus: koordinaadid puu sees
Kui AST on olemas, peame sageli viitama konkreetsetele alampuudele : näiteks funktsiooni teisele argumendile, avaldise operaatorile jne. Väga elegantne viis selleks on nn Dewey kümnendsüsteemi tähistus, mis laenab skeemi, mida kasutatakse dokumentides sektsioonide ja alajaotiste nummerdamiseks.
Selles tähistuses tähistatakse puust t alustades alampuud punktidega eraldatud numbrijadaga . Iga number näitab lapse positsiooni (tavaliselt algab 1-st) ja jada liigub puud mööda allapoole. Seega viitab avaldis nagu t/2.1.3 puu t teise lapse esimese lapse kolmandale lapsele.
Selle tähistuse induktiivne definitsioon on lihtne: tühi string viitab kogu puule endale; kui string koosneb numbrist, millele järgneb rohkem punktidega eraldatud numbreid, tõlgendatakse seda nii, et kõigepealt võetakse näidatud indeksile vastav lapse alampuu ja seejärel rakendatakse sama loogikat rekursiivselt ülejäänud stringile.
Näiteks kui meil on puu t, mis esitab avaldist nagu "+(a, *(4,5))", mille juursõlm on APPLY liitmiseks, tütarsõlm nimega "+" ja kolmas tütarsõlm korrutamiseks, saame tuvastada kindlad positsioonid. Seega võib t/1 olla SÕNAsõlm operaatoriga "+", t/2.1 identifikaatoriga "a" ja t/2.2.2.1 VALUE-sõlm väärtusega 4, kui nummerdame tütarsõlmed vastavalt.
See AST-s "koordinaatide" andmise viis on väga kasulik konkreetsete asukohtade osutamiseks vigadest teatamisel, puus navigeerimisel või konkreetsetele sõlmedele kohalike teisenduste rakendamisel ilma üheselt mõisteta.
Ekvivalendid programmeerimises ja tööriistades
Dewey tähistuse idee ei ole ainuomane puuteooriale; tegelikult ilmub see korduvalt paljudes praktilistes tähistustes , mida me iga päev programmeerimisel ja struktureeritud andmete käsitlemisel kasutame, isegi kui me pole sellest alati teadlikud.
Kui kirjutame programmeerimiskeeles avaldisi punktiga (nt object.property.subproperty), teeme midagi väga sarnast: läbime pesastatud objektide puud, valides igal sammul lapse nime, mitte positsiooninumbri järgi. Alustades juursõlmest, laskume alla sisemiste sõlmedeni.
Sama muster ilmneb Unixi-laadsetes failisüsteemides, kus kaldkriipsuoperaatorit (/) kasutatakse kataloogide eraldamiseks: /src/js/tutu.js kirjeldab teed failisüsteemi juurest kindla ressursini, läbides puustruktuuri järjestikuseid tasemeid.
Struktureeritud dokumentide maailmas kasutavad keeled nagu XPath XML-puu sõlmede valimiseks väga sarnaseid tähistusi. Päring nagu "A//B/*" valib iga elemendi B esimese lapse (olenemata selle nimest), mis on elemendi A järglane praeguse konteksti suhtes sobivas positsioonis, kasutades sügavustasemete tähistamiseks ühe- ja kahekordseid kaldkriipse.
Teine tuntud tööriist, jq keel , kasutab JSON-struktuuride navigeerimiseks paralleelset süsteemi, mis võimaldab alamobjektide valimist liitteede, filtrite ja avaldiste abil. Kõik need tähistused on lihtsalt erinevad viisid teede väljendamiseks puus , mis on väga kooskõlas Dewey kümnendsüsteemi tähistusega, kuid kohandatud vastavatele domeenidele.
Parsi puud keeleteaduses ja programmeerimises
Lisaks kompilaatorite maailmale kasutatakse süntaksipuid ka keeleteaduses lausestruktuuri esitamiseks. Seal nimetatakse neid tuletuspuudeks või parsimispuudeks, mis näitavad, kuidas lause jaguneb fraasideks, sõnadeks ja grammatilisteks kategooriateks.
Nagu programmeerimises, leiame ka nendes puudes kolme põhitüüpi sõlmi: juursõlm , mis esindab terviklikku lauset või globaalset struktuuri; sisemised ehk hargnevad sõlmed, mis toimivad ülemsõlmedena ja rühmitavad lause alamhulki; ja lehesõlmed, mis tavaliselt vastavad sisendstringis esinevatele konkreetsetele sõnadele.
Juursõlm on unikaalne: kogu puustruktuur ripub sellest kinni. Hargnevad sõlmed asuvad vahetult juur- või muude vanemsõlmede all ja nende eesmärk on lause või programmi osade hierarhiline korraldamine . Lehesõlmed seevastu asuvad puu madalaimal tasemel ja neil pole lapsi, mis sulgeb hargneva struktuuri.
Neid puid peetakse võimsateks pedagoogilisteks tööriistadeks, kuna need aitavad keerulisi lauseid hallatavateks elementideks jagada. Sama kehtib ka programmeerimise kohta: hästi üles ehitatud AST võimaldab teil lühidalt näha, millised tehted on omavahel aheldatud, millised avaldised on pesastatud ja kuidas hindamine toimub.
Sõltuvalt analüüsi eesmärgist võime leida erinevat tüüpi analüüsipuid . Mõned rõhutavad sõnade või komponentide vahelisi sõltuvusi (näiteks kes kellest lauses sõltub), teised aga keskenduvad fraasideks või koostisosadeks rühmitamisele, mille tulemuseks on kaks peamist perekonda.
Süntaksipuud sõltuvuse ja valijaskonna järgi
Üks tuntumaid tüüpe on sõltuvustel põhinev süntaksipuu . Selles variandis käsitletakse kõiki lauses olevaid sõnu või kõiki asjakohaseid elemente lehesõlmedena ning nendevahelised seosed näitavad otseseid sõltuvussuhteid (näiteks põhiverb ja selle subjekt). Selle tulemusena luuakse sageli puid, milles on vähem sõlmi kui teistes skeemides.
See lihtsus muudab need eriti mugavaks algajatele ja teatud keeletöötlusülesannete jaoks, sest struktuur keskendub sellele, kes kellest sõltub, ilma et oleks sisse toodud nii palju vahesõlmi. Programmeerimises rakendatuna on idee jääda ainult oluliste seoste juurde, jättes välja grammatilised kaunistused.
Teises äärmuses on meil koostisosadel või koostisosadel põhinevad süntaksipuud , mis eristavad juursõlmi, sisemisi hargnemissõlmi ja lehesõlmi ning muudavad kõik asjakohased rühmitused nähtavaks. Need puud sisaldavad tavaliselt rohkem sõlmi ja peegeldavad lause või programmi hierarhilist struktuuri detailsemalt.
Levinud valimisringkonna puumallid kuvavad pikki lauseid arvukate lehesõlmede, mitme hargnemistaseme ja täpselt määratletud juursõlmega. Need on eriti kasulikud keerukate lausete või mitme pesastatud struktuurikihiga programmide lahkamiseks.
Nii sõltuvus- kui ka valimispuude puhul on näited ja visuaalsed ressursid mallidena saadaval, mis võimaldab teil lihtsalt sõlmi soovitud teabega täita. See säästab aega ja väldib vajadust iga kord struktuuri illustreerimiseks nullist diagrammi kujundada.
AST-ga seotud praktilised rakendused ja tööriistad
AST-d ei ole pelgalt teoreetiline kontseptsioon: neid kasutab aktiivselt arvukates igapäevastes tööriistades igaüks, kes töötab koodiga. Kompilaatorid, interpretaatorid, minimeerijad, koodivormindajad ja staatilised analüsaatorid toetuvad oma funktsioonide täitmiseks peaaegu alati AST-le.
Tüüpiline kompilaator võtab lähtekoodi, tokeniseerib selle, parsib selle ja genereerib abstraktse süntaksipuu. Seejärel teostab see semantikakontrolle (tüübid, muutujate ulatus, konstruktide vale kasutamine) ja rakendab koodi optimeerimist , läbides ja teisendades AST-d enne masinkoodi ehk baitkoodi loomist.
Sellised tööriistad nagu linterid või vormindajad töötavad samuti AST-ga: nad analüüsivad struktuuri, et tuvastada problemaatilisi mustreid, halbu tavasid või vastuolusid ning pakuvad välja muudatusi, mis säilitavad puu semantilise struktuuri , kuid kohandavad koodi esitlust.
Näiteks JavaScripti ökosüsteemis on mitu teeki, mis avaldavad AST-i JSON-vormingus, muutes teiste tööriistade jaoks selle kasutamise refaktoriseerimise, automaatse dokumentatsiooni genereerimise või keerukate programmide struktuuri visualiseerimise lihtsamaks.
Isegi mõnevõrra spetsialiseeritumates valdkondades, nagu näiteks testide katvuse mõõtmise instrumenteerimine või lähtekoodi teisendamine teistesse keeltesse, on AST paljude tänapäevaste lahenduste aluseks, kuna see võimaldab töötada väga mugaval abstraktsioonitasemel toorteksti ja masinkoodi vahel.
Kokkuvõttes on abstraktsed süntaksipuud võtmeelement, mis ühendab keele formaalset grammatikat, selle sisemist esitust kompilaatoris või interpretaatoris ning täiustatud tööriistu, mida me kasutame koodi turvaliseks ja tõhusaks kirjutamiseks, analüüsimiseks ja teisendamiseks. Nende ülesehituse, nende navigeerimise (näiteks Dewey kümnendsüsteemi tähistuse abil) ja kaasatud sõlmede tüüpide (VALUE, WORD, APPLY, fikseeritud või muutuva ariteediga struktuurid jne) mõistmine aitab meil palju selgemini näha, mida masin programmi töötlemisel tegelikult teeb.

