Zhvillimi i gjuhës adaptive RAYA të sistemit të programimit interaktiv DSSP Moskë Universiteti Shtetëror Fakulteti i Matematikës Kompjuterike dhe Kibernetikës N.P. Brusentsov, V.B. Zakharov, I.A. Rudnev, S.A. Sidorov, N.A. Chanyshev Moskë, 1987
Përshkrimi i përgjithshëm i gjuhës së Xhenetit
Qëllimi dhe qëllimi i zhvillimit të gjuhës
RAYA (Evolving Adaptive Language) është gjuha bazë e Sistemit të Programimit të Strukturuar të Dialogut DSSP. Themelore do të thotë se është baza për të gjitha ndërtimet e mëtejshme të kryera në DSSP duke zhvilluar (zgjeruar, forcuar) gjuhën bazë dhe, ndoshta, duke përshtatur mjetet gjuhësore të krijuara në këtë mënyrë për një aplikacion specifik. Në ndryshim nga të ashtuquajturat gjuhë të nivelit të lartë, PAYA nuk ofron lloje dhe operacione të gatshme të të dhënave, por vetëm elemente dhe primitivë për përcaktimin efikas të llojeve të kërkuara. Për shembull, formatet origjinale të të dhënave janë byte 8-bit, fjalë 16-bit dhe fjalë e gjatë 32-bit, të interpretuara në varësi të operacioneve të kryera në to si numra të plotë, vektorë Boolean, kode karakteresh, boolean, tregues të të dhënave dhe procedurave. Në këtë rast, është e mundur, nga njëra anë, të manipulohen pjesët individuale të bajteve dhe fjalëve, dhe nga ana tjetër, të formohen njësi të dhënash të përbëra (fjalë me gjatësi të shumta, vektorë, vargje, rreshta teksti, etj.) , duke vendosur për ta një ose një interpretim tjetër prezantim të operacioneve të duhura. Kështu, mund të futen numra realë të gjatësisë dhe gamës së kërkuar të vlerave, numra komplekse dhe objekte të tjera, dhe versioni i gjuhës i fokusuar në një aplikacion të caktuar do të përfshijë objekte dhe mjete karakteristike të këtij aplikacioni dhe nuk do të përfshijë asgjë që nuk përfshin zbatohet për të, - gjuha do të përshtatet (përshtatet) për përdorim. Zhvillimi i DSSP kishte për qëllim krijimin e një dhe gjerësisht të aksesueshme ilaç efektiv programimi i mikrokompjuterit, d.m.th. kompjuterë të ndërtuar mbi mikroprocesorë. Një tipar thelbësor i arkitekturës së mikroprocesorit është natyra elementare e llojeve dhe operacioneve të të dhënave, që nënkupton, nga njëra anë, universalitet, dhe nga ana tjetër, programim intensiv të punës. Për shkak të shkathtësisë së tyre, mikroprocesorët dhe mikrokompjuterët e krijuar në bazë të tyre kanë mundësi aplikimi potencialisht të pakufishme. Megjithatë, zbatimi praktik i këtyre aftësive është i kufizuar kryesisht nga kompleksiteti i zhvillimit të programeve të nevojshme të aplikimit. Për më tepër, programe aplikimi të kënaqshme mund të krijohen vetëm me një njohuri të thellë dhe delikate të specifikave të aplikacioneve përkatëse, d.m.th. Ato duhet të zhvillohen jo vetëm nga programues, por nga specialistë të kualifikuar në një fushë të caktuar. Prandaj, sistemi i programimit jo vetëm që duhet të rrisë shumë produktivitetin e punës së programuesit, por edhe të jetë aq i thjeshtë sa të mund të zotërohet dhe të përdoret në mënyrë efektive nga programues joprofesionistë.
Një zgjidhje radikale e këtij problemi do të duket të jetë një thjeshtim domethënës i arkitekturës kompjuterike. Por, për fat të keq, arkitektura e mikrokompjuterëve po zhvillohet në drejtim diametralisht të kundërt - përgjatë rrugës së rritjes së kompleksitetit dhe sofistikimit, kështu që nuk është e lehtë për një programues profesionist të zotërojë në mënyrë të përsosur gjuhën e montimit të mikrokompjuterëve sot. Gjuhët e programimit të sistemit si C ose PL/M e kanë reduktuar intensitetin e punës së zhvillimit të programit në një masë të caktuar (megjithëse larg nga të mjaftueshme), por ato vështirë se mund t'u rekomandohen njerëzve që nuk kanë përvojë në programim. Një gjuhë gjerësisht e aksesueshme, natyrisht, duhet të jetë më e thjeshtë dhe më e natyrshme dhe duhet të bazohet, sa më shumë që të jetë e mundur, në idetë e përditshme, të njohura për thelbin dhe teknikën e programimit.
Përveç aksesit dhe reduktimit të ndjeshëm të intensitetit të punës së zhvillimit të programit në krahasim me programimin në gjuhën e asamblesë, DSSP-së iu kërkua të kishte universalitet të gjuhës, të njëjtë me atë të gjuhës së asamblesë, efikasitet të lartë të makinës (d.m.th. kompaktësia dhe shpejtësia e kodit ), besueshmërinë e verifikueshmërisë së programeve të krijuara dhe mirëmbajtjen dhe modifikueshmërinë e tyre, si dhe lëvizshmërinë (transportueshmërinë) e sistemit dhe programeve të zhvilluara në të në makina të arkitekturave të ndryshme.
Programimi procedural
Programimi në gjuhën PARADISE është mjaft i ngjashëm me lloje të tilla të përhapura të veprimtarisë njerëzore si planifikimi dhe organizimi i veprimeve, punëve, proceseve të ndërlidhura ose projektimi i objekteve materiale komplekse - makina, njësi, struktura. Ashtu si një stilist që realizon idenë e tij duke e grumbulluar atë komponentët(blloqe, njësi, pjesë), programuesi sintetizon veprimin kompleks të kërkuar nga veprimet e thjeshta të ofruara nga gjuha. Mund të themi gjithashtu se programimi (projektimi) konsiston në zbërthimin (zbërthimin) gradual të objektit që zbatohet në komponentë gjithnjë e më të vegjël.
Në gjuhën e PARADISE, "ndërtimi" kryesor është një procedurë - një veprim i emërtuar. Gjuha bazohet në një grup të kufizuar procedurash të thjeshta (primitive), të përfaqësuara nga emrat e tyre (shënimet). Për shembull: + do të thotë "shto", NEG do të thotë "shenjë ndryshimi", VCTR do të thotë "krijo vektor". Në veçanti, ka primitivë: dhe; (dy pika dhe pikëpresje) duke ju lejuar të prezantoni një procedurë të re, për shembull, me emrin P, duke e përcaktuar atë si një sekuencë të procedurave P1, P2, ..., PN në formën
: P P1 P2 ... PN ;
Nëse procedura P përfaqëson veprimin që duhet të kryejë programi i krijuar, ndërtimi i këtij programi duke përdorur mjetet gjuhësore PAYA reduktohet në detajimin sekuencial të procedurave P1, P2, ..., PN. Kjo do të thotë se secila prej këtyre procedurave duhet të përcaktohet nga një sekuencë procedurash më të vogla, të cilat më pas përcaktohen nga sekuenca të procedurave edhe më të vogla, e kështu me radhë, derisa të përftohen përkufizime që përbëhen vetëm nga primitive.
Ky lloj ndërtimi programi, duke filluar nga një qëllim i caktuar dhe duke zbërthyer gradualisht procedurat e përdorura në nivelin e mjeteve bazë të gjuhës, njihet si programim nga lart-poshtë. Është mënyra kryesore për të marrë programe në gjuhën PARA për zgjidhjen e problemeve individuale, të mirëpërcaktuara. E kundërta është programimi nga poshtë-lart - ndërtimi, bazuar në mjetet bazë të një gjuhe të sistemit, i procedurave të zgjeruara gradualisht të fokusuara në një zonë të caktuar problemore. Në këtë mënyrë, gjuha zhvillohet dhe përshtatet me një aplikacion specifik.
Në të dyja rastet, strukturimi i kujdesshëm i programeve të krijuara është thelbësor: çdo program dhe çdo pjesë e programit duhet të përbëhet nga një numër i vogël pjesësh të veçanta, secila prej të cilave kryen një funksion specifik dhe lejon verifikimin autonom. Në lidhje me gjuhën PARA, kjo do të thotë, në veçanti, që përkufizimet e procedurës duhet të jenë të shkurtra: sekuenca përcaktuese, si rregull, nuk duhet të përmbajë më shumë se 5-7 terma. Strukturimi siguron që programi të jetë i kuptueshëm, i verifikueshëm dhe i modifikueshëm dhe redukton ndjeshëm kompleksitetin e krijimit dhe mirëmbajtjes së tij.
Përkufizimi i shembullit të mësipërm të procedurës P është një përkufizim i thjeshtuar. Në fakt, sekuenca përcaktuese mund të përmbajë si anëtarë jo vetëm emra procedurash, por edhe deklarata (komanda) që përbëhen nga më shumë se një fjalë. Emri i një procedure, kur përdoret jashtë kombinimit me fjalë të tjera, është një komandë për të ekzekutuar procedurën e përcaktuar prej saj. Sekuenca e emrave të procedurës specifikon se këto procedura ekzekutohen në rendin në të cilin emrat e tyre shfaqen njëri pas tjetrit (në rend linear). Për të specifikuar sekuenca të tjera të ekzekutimit, RAYA ofron fjalë të veçanta (parashtesa) që përshkruajnë ekzekutimin e procedurave të emërtuara në kombinim me to, në varësi të gjendjes së specifikuar, si dhe ekzekutimin e përsëritur (ciklik) të procedurës.
Për shembull, sekuenca lineare P0 P1 bën që procedura P0 të ekzekutohet dhe më pas të ekzekutohet procedura P1. Nëse procedura P1 nuk ka nevojë të ekzekutohet gjithmonë, por vetëm me kushtin që të fitohet një numër pozitiv si rezultat i ekzekutimit të P0, atëherë në vend të P1, shkruani komandën e ekzekutimit sipas kushtit: IF+ P1, d.m.th. në vend të P0 P1 do të ketë P0 IF+ P1. RAYA përfshin një grup parashtesash të kushtëzuara që ju lejojnë të shprehni në mënyrë efektive ekzekutimin sipas kushtit, si dhe një zgjedhje prej dy, tre ose më shumë procedurash.
Ekzekutimi i përsëritur i një procedure specifikohet duke përdorur prefiksin RP. Kështu, komanda RP P shkakton ekzekutimin e procedurës P pa pushim derisa të krijohen kushtet në të cilat aktivizohet EX që gjendet në trupin e kësaj procedure - duke dalë nga cikli, pas së cilës ekzekutohet komanda tjetër në rend linear. Kushti për daljen nga cikli mund të jetë, për shembull, barazia e disa ndryshoreve X me zero, e cila shprehet si:
Një procedurë, emri i së cilës përfshihet në përkufizimin e një procedure tjetër, thuhet se është e vendosur brenda saj. Një procedurë e mbivendosur, nëse nuk është primitive, nga ana tjetër mund të përmbajë procedura të mbivendosura, d.m.th. foleja mund të jetë e shumëfishtë. Për më tepër, rregullat e gjuhës RAY nuk e ndalojnë përfshirjen në përkufizimin e një procedure me emrin e saj ose emrin e një procedure që përmban këtë emër, d.m.th. RAYA lejon rekursion.
Një procedurë e ekzekutuar në mënyrë të përsëritur gjithashtu mund të futet brenda një procedure të ekzekutuar në mënyrë të përsëritur. Në këtë rast, ndodh foleja e lakut. PARA lejon fole të shumta të sytheve.
Sekuenca lineare e komandave, foleja, foleja e kushteve dhe ciklike e procedurave - kjo shter mundësitë e ndërtimit të programeve në gjuhën PARA. Mungesa, homogjeniteti dhe natyraliteti i këtyre mjeteve është çelësi i lehtësisë së zotërimit dhe përdorimit të gjuhës. Në të njëjtën kohë, është një gjuhë programimi e strukturuar strikte, e cila siguron një reduktim të ndjeshëm të intensitetit të punës së zhvillimit dhe besueshmërisë së programit.
Procedurat dhe të dhënat
Gjithçka që është thënë deri më tani është një karakteristikë e gjuhës PARA si një mjet për të përshkruar veprime, për të ndërtuar veprime arbitrare nga një grup i kufizuar veprimesh primitive. Ana tjetër e gjuhës përbëhet nga mjetet e paraqitjes së objekteve mbi të cilat kryhen operacionet. veprime, mjete prezantimi dhe organizimi i të dhënave.
Jashtëzakonisht element i thjeshtë të dhënat janë një element me dy vlera - pak. Të gjitha formatet dhe llojet e tjera të të dhënave janë ndërtuar nga bit. Në gjuhën RAYA, formatet bazë janë byte 8-bit, fjalë 16-bit dhe fjalë e gjatë 32-bit. Në varësi të veprimeve që kryhen mbi to, bajtët, fjalët dhe fjalët e gjata lejojnë shumë interpretime, d.m.th. mund të shërbejë si bazë për lloje të ndryshme të dhëna. Përveç kësaj, ato janë elementet fillestare për formimin e formateve dhe llojeve të përbëra.
Në fakt, RAYA nuk përmban as lloje të thjeshta ose të përbëra të të dhënave - ka vetëm formate bazë (bajt, fjalë, fjalë të gjata) dhe mjete për ndërtimin e formateve të përbëra prej tyre: vektorë dhe vargje shumëdimensionale. Në këtë rast, të njëjtat bajtë (fjalë, fjalë të gjata), në varësi të veprimeve që kryhen mbi to, interpretohen si vektorë bit, ose si numra të plotë binarë të nënshkruar dhe të panënshkruar, ose si karaktere të alfabetit hyrës/dalës etj. Llojet e të dhënave dhe kufizimet dhe kontrollet e lidhura me to mund të futen në shtesat e gjuhës specifike për problemin.
Në gjuhën bazë, deklarimi i emrave të të dhënave kryen vetëm funksionin e sigurimit të aksesit në të dhëna sipas emrit: emri shoqërohet me numrin e qelizave të memories që kërkohen nga deklarata dhe mekanizmin për t'iu qasur atyre. Operacionet e testimit dhe transformimit nuk aplikohen drejtpërdrejt në të dhënat e emërtuara. Këto operacione përcaktohen në pirgun e operandit, i cili është një sekuencë fjalësh të gjata 32-bit (elementë të stivës) që modifikohet në mënyrë dinamike duke shtuar (shtyrë) elementë të rinj në fund të tij, si dhe duke hequr elementë nga i njëjti fund ( duke dalë nga pirgu). Artikujt hiqen në rendin e kundërt në të cilin janë dërguar: i pari hiqet dërgimi i fundit. Të dhënat që do të testohen ose konvertohen dërgohen në pirg, ku kryhen operacionet e përshkruara mbi të, pas së cilës rezultatet e përpunimit mund të hiqen nga pirgu.
Për shembull, nëse ekziston një ndryshore X e deklaruar si një fjalë e gjatë 32-bit, atëherë vetëm dy operacione mund të kryhen drejtpërdrejt në të:
1) shtyrja e vlerës së saj në pirg, e cila ndodh automatikisht sa herë që përmendet emri X,
2) caktimi i tij në ekip! X është vlera e elementit të fundit (të lartë) të hequr nga pirgu.
Nëse, të themi, dëshironi të dyfishoni vlerën e X duke e shtuar atë në vetvete, atëherë mund ta bëni këtë duke ekzekutuar komandat e mëposhtme njëra pas tjetrës:
Dy kopje të vlerës X do të shtyhen në pirg, pastaj komanda + do t'i heqë ato, do t'i shtojë dhe do ta shtyjë shumën që rezulton në pirg, pas së cilës komanda! X do të marrë këtë shumë dhe do t'i caktojë vlerën e saj ndryshores X.
Regjistrimi i zakonshëm i shembullit të mësipërm në formën X:=X+X për gjuhët e nivelit të lartë është më i njohur për programuesin, por nuk është një pasqyrim i drejtpërdrejtë i sekuencës së komandave të ekzekutuara nga procesori, por është një lloj formule matematikore. Kjo është e përshtatshme kur programoni detyra llogaritëse, megjithatë, në gjuhën bazë, korrespondenca e paqartë me komandat që ekzekutohen duket më e rëndësishme, pasi verifikimi komandues i programit mund të bëhet drejtpërdrejt në gjuhën e programimit dhe nuk ka nevojë të di një gjuhë të ndryshme nga gjuha e procesorit.
Por një përfitim veçanërisht i vlefshëm i përpunimit të të dhënave të grumbulluara është se procedurat e testimit dhe transformimit mund të përcaktohen dhe zbatohen pavarësisht nga të dhënat në të cilat ato aplikohen. Operacionet e testimit dhe konvertimit nuk formulohen në lidhje me identifikuesit e të dhënave (ose emrat e konstanteve dhe variablave, parametrat formalë), por në lidhje me elementët e stivës, të cilëve duhet t'u caktohen vlerat e operandit në kohën kur operacioni të ekzekutohet. Për shembull, operacioni i mbledhjes së dy numrave, i kryer duke përdorur komandën + (shto), konsiston në marrjen e dy elementeve të sipërme (kulmin dhe nënverteksin) nga pirgu si shtesa, duke llogaritur shumën e tyre dhe duke e shtyrë atë në pirg. Për të shtuar dy numra, duhet të shtyni vlerat e tyre në pirg dhe të ekzekutoni komandën +, rezultati do të jetë në krye të pirgut.
Një procedurë test-transformimi me një numër arbitrar të parametrave hyrës dhe dalës mund të përkufizohet në këtë mënyrë thjesht si një veprim i emërtuar (pa një listë parametrash) i kryer në një pirg që përmban vlerat e argumentit, të rregulluar në një rend të përcaktuar dhe, pas ekzekutimi, vlerat e rezultatit. Për të aplikuar një procedurë të tillë në një grup të caktuar të dhënash specifike, duhet t'i shtyni këto të dhëna në sekuencën e duhur në pirg. Pasi t'i konsumoni ato, procedura do t'i lërë rezultatet e saj në pirg (gjithashtu të vendosura në një sekuencë të caktuar).
Me fjalë të tjera, emrat e procedurave në gjuhën RAY përdoren në të njëjtën mënyrë si shenjat e operacionit dhe në thelb janë simbole të operacioneve me një numër arbitrar operandësh. Në përputhje me parimin e funksionimit të stivit, operacionet shkruhen në formë postfix, d.m.th. emri i operacionit vendoset pas emrave ose vlerave të operandëve të tij. Për shembull, nëse shënojmë veprimin e fitimit të shumës së tre numrave me simbolin ++, atëherë shuma e numrave A, 5 dhe B do të shprehet si më poshtë:
Do të ishte e mundur të vendoseshin rregulla formale të një gjuhe postfix dhe të udhëhiqesh prej tyre gjatë shkrimit të programeve, por është më e lehtë dhe më e besueshme për një person të merret jo me rregullat, por me modelin e procesorit të stivës, d.m.th. me një model të makinës për të cilën krijohen programe dhe e cila do t'i ekzekutojë ato. Në rastin e gjuhës PARA, një makinë e tillë është një procesor DSSP - një grup pajisjesh dhe programesh që zbatojnë veprimet e përshkruara në këtë gjuhë.
procesor DSSP
Fizikisht, procesori DSSP mund të zbatohet në formën e një mikroprocesori të një arkitekture të thjeshtë dhe të programueshme në mënyrë efikase që do të zgjidhte problemin e pajisjeve softuerike për mikrokompjuterët. menyra me e mire. Por një mikroprocesor i tillë ende nuk është krijuar dhe arkitektura e tij duhet të imitohet në mikrokompjuterët ekzistues në mënyrë që të përmirësohet programueshmëria e tyre. Natyrisht, emulimi shoqërohet me kosto - kërkon memorie dhe kohë kompjuteri, por në rastin e imitimit të një procesori DSSP, këto kosto janë relativisht të vogla.
Nga këndvështrimi i një programuesi, një karakteristikë e një procesori është arkitektura e tij, d.m.th. informacione rreth asaj se çfarë është një procesor i caktuar si mjet përpunimi i të dhënave, cilat janë mundësitë për paraqitjen e të dhënave në hyrje dhe brenda procesorit, çfarë operacionesh testimi dhe konvertimi të të dhënave janë të disponueshme, si është organizuar memoria e vetë procesorit, si dhe aksesi në memoria kryesore dhe e jashtme, cilat janë mjetet e kontrollit ecurinë e programit, ndërveprimi me mjedisi i jashtëm, duke iu përgjigjur ngjarjeve të jashtëzakonshme, etj. Zotërimi i arkitekturës është kusht i nevojshëm programim kuptimplotë (joformal), i cili redukton ndjeshëm numrin e gabimeve dhe rrit besueshmërinë e programeve.
Lidhja qendrore e procesorit DSSP është staku i operandit i përmendur tashmë. Në fakt, përpunimi bëhet në stack dhe, si rregull, të dhënat dërgohen përmes stek. Komandat individuale dhe sekuencat e shkurtra të komandave në pirg mund të ekzekutohen duke i kaluar ato te hyrja e procesorit direkt nga tastiera e terminalit. Në këtë rast, procesori DSSP simulon funksionimin e një kalkulatori postfix. Numrat dhe kodet mnemonike të funksionimit të futura nga tastiera janë të ndara me hapësira. Teksti i futur shfaqet si një rresht në ekranin e terminalit. Sinjali për përfundimin e hyrjes dhe komandën për procesorin "Ekzekutoni urdhrin e futur" është shtypja e tastit.
Për shembull, për të vlerësuar shprehjen (2-5)*3 dhe për të shfaqur rezultatin e marrë, futni:
2 5 - 3 * .
Pasi të keni shtypur tastin
* 2 5 - 3 * . -90
Një yll në fillim të një rreshti lëshohet nga procesori si një sinjal se ai është duke pritur për hyrje.
Në shembullin e konsideruar, procesori perceptoi dhe përpunoi numrat hyrës si numra të plotë dhjetorë. Në realitet, kur futeshin, këta numra konvertoheshin në kodin e plotësimit binar dhe kur dilnin, ktheheshin përsëri në sistemin dhjetor. Procesori DSSP gjithashtu lejon modalitetet binar, oktal dhe heksadecimal hyrje/dalje. Për të kaluar në modalitetin e dëshiruar, duhet të ekzekutoni përkatësisht një nga komandat B2, B8, B10, B16.
Shtypja e tastit shkakton dërgimin e kodeve në hyrjen e procesorit, që përfaqësojnë karakteret e treguara në këta çelësa (shkronjat, numrat, shenjat e pikësimit, simbolet e funksionimit). Sekuenca e karaktereve të futura formon një varg hyrje - një zinxhir bajtësh që përmbajnë kode karakteresh, një bajt për karakter. Gjatësia maksimale e vargut të hyrjes është 80 litra.
Gjatë përpunimit të vargut të hyrjes, procesori izolon fjalët në të - kombinime karakteresh të ndara nga njëri-tjetri me hapësira, dhe i interpreton ato. Nëse fjala që përpunohet është emri i një operacioni (procedure) ose i të dhënave të njohura për procesorin, atëherë procesori kryen veprimet që ky emër duhet t'i thërrasë sipas definicionit. Nëse fjala nuk është e njohur për procesorin, atëherë ai përpiqet ta interpretojë atë si një numër, duke marrë parasysh modalitetin e vendosur I/O.
Numrat janë fjalë që përbëhen nga shifra të pranueshme në një sistem të caktuar numrash dhe, ndoshta, që përmbajnë një shenjë minus si shkronjën e parë. Në modalitetin heksadecimal I/O, shkronjat e vlefshme, së bashku me numrat, përfshijnë gjithashtu shkronjat latine A, B, C, D, E, F. Numri i marrë konvertohet në kodin e komplementit binar dy dhe futet në pirgun e operandit si një Fjalë e gjatë 32-bit. Për më tepër, nëse vlera e numrit është jashtë gamës së vlerave të përfaqësueshme -2147483648: 2147483647, atëherë ajo zëvendësohet nga një modul i krahasueshëm 2**32 nga ky varg.
Në rastin kur fjala që përpunohet nuk është e njohur për procesorin dhe nuk mund të pranohet si numër, procesori shfaq mesazhin në ekranin e terminalit: "Nuk e di"<обрабатываемое слово>" dhe pret që të futen udhëzime të mëtejshme.
Futja e të dhënave në formën e tekstit arbitrar (një sekuencë bajtash-literale) bëhet në formën e tekstit literal, të cilët janë tekst të mbyllur në thonjëza të dyfishta, për shembull: "Tekst literal". Ardhja e një teksti literal në hyrjen e procesorit bën që teksti i mbyllur midis thonjëzave të shkruhet në memorien kryesore në formën e një zinxhiri bite-literalësh. Në këtë rast, adresa e bajtit të parë dhe numri i bajteve (gjatësia e tekstit) shtyhen në pirg. Një tekst tekstual i paraprirë nga një pikë perceptohet nga procesori si një komandë për të "treguar tekstin midis thonjëzave në ekranin e terminalit". Për shembull, dërgimi i kombinimit të karaktereve "Pa memorie" në hyrjen e procesorit do të bëjë që mesazhi të shfaqet në ekran: Nuk ka memorie.
Kodi i një karakteri individual shtyhet në pirg si bajt i ulët i kulmit kur ky karakter merret në hyrjen e procesorit së bashku me shenjën # të paraprirë prej tij. Për shembull, kombinimi i karaktereve #L do të dërgojë kodin e shkronjës L në pirg, kombinimi i karaktereve #5 do të dërgojë kodin e numrit 5. Komanda TOB për të nxjerrë një bajt në terminal shfaq shkronjën kodi i së cilës është të përfshira në bajtin e ulët të majës së stivit.
Edhe në mënyrën e ekzekutimit të drejtpërdrejtë të komandave, procesori DSSP tejkalon shumë aftësitë e një kalkulatori konvencional, duke i siguruar përdoruesit, përveç operacioneve të përpunimit të të dhënave, edhe mjetet e deklarimit të të dhënave të emërtuara dhe përcaktimit të procedurave që më pas mund të përdoren së bashku me operacionet bazë. Deklarimi i emrave të të dhënave dhe përcaktimi i procedurave bëhet duke përdorur komanda të veçanta.
Për shembull, për të krijuar një variabël 16-bit të quajtur, të themi, TEMP, duhet të shkruani në tastierë dhe të aplikoni çelësin në hyrjen e procesorit
VAR TEMP
Mund ta caktoni atë në një variabël së bashku me deklaratën vlera fillestare, për shembull, 0:
VAR TEMP 0! TEMP
Tani ardhja e emrit TEMP në hyrjen e procesorit do të bëjë që vlera aktuale e kësaj variabli të shtyhet në pirg dhe caktimi i një vlere të re të hequr nga pirgja mund të bëhet me komandën! TEMP.
Një përkufizim i procedurës futet me komandën: (dy pika), që përmban emrin e procedurës që përcaktohet dhe një zinxhir përcaktues komandash me një shkronjë; (pikëpresje) si karakteri fundor i përkufizimit. Le të demonstrojmë përkufizimin dhe përdorimin e procedurave duke përdorur shembullin e llogaritjes së faktorialit të një numri natyror N duke përdorur formulën
N!=N*(N-1)*(N-2)*...*2*1, d.m.th. N-1 shumëzim.
Për të marrë rezultatin e dëshiruar, procedura FCT duhet të shumëzojë numrin e dhënë N me zvogëlimin e njëpasnjëshëm të numrave, duke filluar nga N-1 në 1, d.m.th. vetëm N-1 herë. Në gjuhën PARA, kjo programohet duke ekzekutuar procedurën P t herë: DO P, ku P është emri i procedurës, t është vlera aktuale në krye të stivit, duke treguar se sa herë duhet të ekzekutohet procedura P.
Le të supozojmë se përpara aplikimit të procedurës FCT, numri N shtyhet në pirg dhe ndodhet në krye të tij. Për ta bërë procedurën më të kuptueshme, le të imagjinojmë shumëzuesin e modifikuar të ndryshores K:
Ne prezantojmë përkufizimin e procedurës FCT në formën:
FCT [N] ! K K K 1- DO F. [N] ;
Komentet jepen në kllapa katrore, duke pasqyruar gjendjen aktuale të pirgut të operandit. Ekipi! K, e cila fillon procedurën e përcaktuar, cakton vlerën e numrit N të marrë nga pirgja në variablin K. Më pas K shtyhet dy herë në pirg dhe duke zbritur 1 në krye të pirgut, numrin e ekzekutimeve të përsëritura. formohet procedura F, e barabartë me N-1. Më pas vjen komanda DO F, e cila specifikon një lak, pas përfundimit të të cilit pjesa e sipërme e stivit do të përmbajë vlerën e dëshiruar të faktorialit - N!. Ekipi. (pika) printon një kopje të kësaj vlere në ekranin e terminalit. Mbetet për të përcaktuar një procedurë F që modifikon vlerën e K duke zbritur 1 dhe shumëzon rezultatin e pjesshëm të llogaritjes R që gjendet në pirg me K:
F [R] K 1- ! K[R]K*;
Korrektësia e të dy procedurave kontrollohet duke ekzekutuar komandën e përkufizimeve të tyre me komandë, duke shfaqur përmbajtjen e stivit të operandit dhe vlerën e ndryshores K në ekranin e terminalit pas çdo komande. Pas përfundimit të procedurës FCT, pjesa e sipërme e pirgut duhet përmbajnë vlerën N!, dhe vlera e ndryshores K duhet të jetë e barabartë me 1.
Procedurat e verifikuara dhe korrigjuara (nëse janë identifikuar gabime gjatë procesit të verifikimit) testohen duke i zbatuar ato në vlerat individuale të numrit N. Meqenëse procedura F është e përfshirë në FCT, testimi i saj kryhet automatikisht gjatë procesit të testimit të këtij të fundit. . Duhet të kihet parasysh se vlerat e rezultateve nuk duhet të kalojnë numrin maksimal pozitiv të paraqitur në kodin e plotësimit të dyve si një fjalë e gjatë 32-bit: 2147483647, d.m.th. FCT prodhon vetëm rezultate të sakta për N=1, ..., 13.
Përdorimi i FCT nuk ndryshon nga përdorimi i udhëzimeve të vetë procesorit: për të marrë rezultatin, duhet të vendosni vlerën e operandit dhe të shkruani emrin e procedurës:
5 FCT
7 FCT
Zbatimi i mësipërm i procedurës FCT kërkon futjen e një ndryshoreje ndihmëse K, por një procedurë ekuivalente funksionale mund të zbatohet pa një ndryshore ndihmëse, duke përdorur operacionin C, i cili shtyn një kopje të majës së saj në pirg, dhe operacionet E2 dhe E3, të cilat e shkëmbejnë pjesën e sipërme përkatësisht me elementët e dytë dhe të tretë të pirgut. Përkufizimi i kësaj procedure është si më poshtë.
: FCTA [N] C 1- C DO FA D . ;
: FA C E3 * E2 1- ;
Avantazhi i një procedure të tillë të "stackit të pastër" është se është plotësisht autonome: ashtu si operacionet bazë të stakut të procesorit, ai kryhet vetëm në pirgun e operandit, pa kërkuar ndonjë memorie tjetër ose pa shkaktuar ndonjë ndryshim në komponentët e tjerë të procesorit.
Emrat e procedurave të përcaktuara dhe të dhënave të deklaruara futen në fjalorin e procesorit, i cili vendos një lidhje midis këtyre emrave dhe objekteve të emërtuar, domethënë me trupat e procedurës të vendosura në memorien kryesore dhe me elementët e kësaj memorie të caktuar për ruajtjen e të dhënave të deklaruara. Kur përpunon fjalën tjetër nga rrjedha e hyrjes, procesori shikon përmes fjalorit dhe, pasi ka gjetur një fjalë që përputhet në të, kryen veprimet që lidhen me këtë fjalë. Nëse kërkimi është i pasuksesshëm, atëherë, siç është përmendur tashmë, bëhet një përpjekje për të interpretuar numerikisht fjalën e dhënë, dhe nëse kjo dështon, atëherë shfaqet një mesazh që fjala nuk është e njohur për procesorin.
Si rezultat i përpilimit të një përkufizimi të procedurës, emri i kësaj procedure dhe treguesi (adresa) e trupit të saj, i cili është një sekuencë treguesish për procedurat dhe të dhënat që përbëjnë përkufizimin, futen në fjalor. Me fjalë të tjera, paraqitja e brendshme e trupit të një procedure merret duke zëvendësuar emrat e procedurave dhe të dhënave në përkufizimin e saj me tregues të trupave përkatës, të cilët nga ana tjetër janë të njëjtat sekuenca treguesish, dhe në rastin e primitivëve, zinxhirët e komandave të makinës. Ne e quajmë këtë paraqitje të brendshme të një kodi procedural të programit.
Kur së bashku me përpilimin e përkufizimit të procedurës P, përpilohen edhe përkufizimet e të gjitha procedurave të mbivendosura të panjohura më parë për procesorin, krijohet një hierarki e plotë e treguesve, duke bërë të mundur ekzekutimin e procedurës P duke dërguar vetëm emrin e saj në hyrjen e procesorit. . Në të njëjtën kohë, nuk ka kuptim të ruhen emrat e procedurave të ndërlidhura të përpiluara në lidhje me përkufizimin e P, nëse nuk ka nevojë për t'i qasur këto procedura veçmas. Në një numër rastesh, rezulton të jetë e këshillueshme që të mbyllet qasja në një ose një pjesë tjetër të fjalorit, duke lënë, ndoshta, aftësinë për të kryer vetëm disa procedura.
Për të përmbushur këto kërkesa, fjalori zbatohet si një grup nën-fjalorësh, mbi të cilët përcaktohen operacione që lejojnë krijimin dhe shkatërrimin e nën-fjalorëve dhe pjesëve të tyre, fshirjen e emrave, mbylljen dhe hapjen e aksesit në nën-fjalorë të caktuar. Çdo nënfjalë ka një emër që përdoret në komandat që lidhen me të. Emrat e nënfjalës duhet të fillojnë me shkronjën $, për shembull: $PRIME, $EDIT, $FLOAT, $TEXTPROC, $GRAPHICS.
Nën-fjalori $PRIME, që përmban grupin bazë të fjalëve DSSP, pas fillimit të procesorit, është i hapur si për akses në fjalët që përmban, ashtu edhe për shtimin e fjalëve të reja. Fjalët e reja të futura në të, nëse është e nevojshme, mund të fshihen së bashku me trupat e lidhur me to duke përdorur komandën FORGET $PRIME. Pas kësaj, mundësia e futjes së mëtejshme të fjalëve në këtë nën-fjalë sigurohet duke ekzekutuar komandën GROW $PRIME, e cila lejon që nëndarja $PRIME të zgjerohet përsëri dhe gjithçka që është futur në të mund të fshihet përsëri me komandën FORGET $PRIME, etj. . Në këtë mënyrë, DSSP përdoret kur eksperimentoni me fragmente të vogla programesh, shembuj individualë, vlerësime dhe gjithashtu, nëse është e nevojshme, duke përfshirë fjalë të reja në nën-fjalorin $PRIME sipas rendit të zhvillimit të gjuhës së sistemit.
Në rastin e krijimit të një programi të veçantë, ata krijojnë nën-fjalorin e tyre për të, dhe kjo arrihet duke filluar tekstin e programit me komandën
PROGRAM$<имя программы>
Një person e percepton këtë komandë si një titull, i cili duhet të pasohet nga një koment në kllapa katrore, duke karakterizuar me pak fjalë funksionin e zbatuar nga programi. Për procesorin është e barabartë me një sekuencë komandash
HARRONI $<имя>RRITET $<имя>
Prandaj, çdo mbërritje e tekstit të programit në hyrjen e procesorit do të shkaktojë fshirjen e versionit të tij të mëparshëm dhe hapjen e nën-fjalorit të pastruar në këtë mënyrë për hyrje version i ri program me të njëjtin emër. Kjo është e përshtatshme kur bëni korrigjime në programin që po krijohet, si dhe kur e modifikoni atë në të ardhmen.
Teksti i programit që po ndërtohet nuk futet në hyrjen e procesorit direkt nga tastiera, por gjenerohet në buferin e redaktuesit të tekstit. Komanda E (Edit) vendos modalitetin e redaktimit, në të cilin fjalët e shtypura në tastierë nuk perceptohen më nga procesori si komanda që duhen ekzekutuar menjëherë, por janë thjesht tekst i shkruar në një buffer dhe shfaqen njëkohësisht në ekran. Duke përdorur tastet speciale që kontrollojnë lëvizjen e treguesit të pozicionit aktual (kursorin) nëpër ekran, si dhe redaktimi i komandave të dhëna duke shtypur butona të tjerë, teksti i futur mund të korrigjohet dhe ndryshohet, duke bërë fshirje dhe futje, duke lëvizur fragmentet e tij nga një vend në tjetrin. vend etj.
Pas përfundimit të futjes dhe redaktimit të tekstit, redaktori fiket duke shtypur tastin E njëkohësisht me (ose më mirë, me tastin e shtypur më parë).
Pasi të përfundojë ngarkimi, procedurat dhe të dhënat janë të disponueshme për referencë me emrat e tastierës së tyre dhe korrektësia e programit mund të verifikohet duke ekzekutuar procedurat në rend rritës, d.m.th. duke filluar me ato përkufizimet e të cilëve nuk përmbajnë procedura të patestuara. Para se të filloni të kontrolloni, është e përshtatshme të siguroheni që programi të mos përdor emra të papërcaktuar. Procesori i shfaq ato në ekran duke përdorur komandën UNDEF. Për të plotësuar tekstin e programit me përkufizimet e këtyre emrave, si dhe për të korrigjuar gabime të tjera të zbuluara gjatë procesit të kontrollit, duhet të përdorni komandën E për të thirrur redaktorin dhe për të bërë modifikimin e duhur të tekstit të programit burimor që ndodhet në buferin e redaktuesit. , dhe më pas kaloni procesorin në modalitetin kryesor dhe ngarkoni përmbajtjen e buferit me komandën PF.
Pas kontrollit dhe testimit të programit, teksti burimor i tij mund të kopjohet nga buferi i redaktorit në disk duke përdorur komandën OE f, ku f është emri i skedarit në të cilin programi do të shkruhet në disk. Në të ardhmen, përmbajtja e skedarit mund të ngarkohet në hyrjen e procesorit me komandën LOAD f, dhe gjithashtu të kopjohet në buferin e redaktuesit si shtesë e tekstit në të duke përdorur komandën IE f. Si parazgjedhje, skedarët kanë shtesën .DSP. Buffer mund të pastrohet së pari me komandën KE. Është gjithashtu e mundur të printoni përmbajtjen e buferit duke përdorur komandën LPE.
Pas ngarkimit të një programi të gatshëm për ekzekutim, është e mundur të pastrohet nëndarja e krijuar për të $<имя>Komanda CLEAR $<имя>. Duke ekzekutuar këtë komandë, procesori heq emrat e pafiksuar nga nëndikimi i emërtuar, d.m.th. të gjithë emrat, përveç atyre, përkufizimet e të cilëve paraprihen nga një parashtesë fiksuese:: (dy dy pika). Në këtë rast, vetëm emrat (hyrjet e fjalorit) fshihen dhe organet e procedurës dhe të dhënat e lidhura me to ruhen dhe të aksesueshme gjatë ekzekutimit të programit nëpërmjet lidhjeve të brendshme të krijuara gjatë përpilimit, por ato nuk janë më të aksesueshme nga jashtë. Për të rikthyer mundësinë për të hyrë nga jashtë, për shembull, nëse keni nevojë të përpiloni ndonjë shtesë ose ndryshim, duhet të rishkarkoni kodin burimor të programit.
Emrat mund të bëhen të paarritshëm nga jashtë pa i hequr nga fjalori duke përdorur komandën SHUT $<имя>, i cili bllokon aksesin në të gjitha fjalët e nën-fjalorit të emërtuar në të. Hapja e një nën-fjalori për të përdorur fjalët e tij bëhet me komandën USE $<имя>. Ekziston gjithashtu një komandë ONLY $<имя>, i cili mbyll të gjithë nën fjalorët përveç atij të emërtuar dhe komandës CANCEL, e cila anulon këtë kufizim. Komandat e listuara ju lejojnë të kontrolloni përdorimin e fjalorit gjatë përpilimit dhe të kufizoni grupin e emrave të disponueshëm për përdoruesin e programit në minimumin e kërkuar.
Kërkimi i emrit në fjalor bëhet duke kërkuar fjalët e tij në rendin e kundërt të renditjes në të cilën janë futur në fjalor, d.m.th. duke filluar me të fundit të futur. Prandaj, për një emër të përcaktuar më shumë se një herë në fjalor, përkufizimi i fundit do të jetë i vlefshëm. Nëse nën-fjalori që përmban këtë përkufizim të fundit është i mbyllur, atëherë kërkimi vazhdon në hyrjen e parë të disponueshme të fjalorit me emrin e dhënë dhe do të përdoret përkufizimi i treguar nga ai hyrje.
Disa fjalë për hyrjen dhe daljen e të dhënave. Siç është përmendur tashmë, procesori përpiqet të interpretojë një fjalë të programit të ekzekutueshëm që nuk gjendet në fjalor si numër dhe, nëse ka sukses, e shtyn ekuivalentin binar të këtij numri në pirg. Futja e një numri në pirg mund të bëhet me komandën TIN, e cila kërkon të shtypni numrin e hyrjes në tastierë. Ekzistojnë gjithashtu komanda që bëjnë që një karakter i futur nga tastiera të shtyhet në pirg: TIB - me ekran, TRB - pa shfaqur këtë karakter në ekran. Në këtë rast, kodi i karakterit përfaqësohet nga bajt i ulët i një fjale 32-bit të shtyrë në pirg, 3 bajtë më të lartë të së cilës janë të barabarta me zero.
Përmbajtja e pjesës së sipërme të pirgut mund të futet përkatësisht si numër ose si shkronjë. Komanda TON shkakton shfaqjen e vlerës numerike të nënverteksit në ekran në fushën e daljes, gjerësia e së cilës përcaktohet nga kulmi, në sistemin e përfaqësimit të numrave të vendosur në kohën e ekzekutimit të tij. Komanda TOB shfaq karakterin, kodi i të cilit gjendet në bajtin e ulët të pjesës së sipërme të stivit. Në të dyja rastet, prodhimi shoqërohet me argumentet që hiqen nga pirgja.
Procesori DSSP ka një aparat për ndërprerje të jashtme dhe të brendshme (komanduese) dhe ofron mjetet e mëposhtme për përpunimin e tyre. Procedura që synon të trajtojë një ndërprerje të jashtme përcaktohet në të njëjtën mënyrë si një procedurë normale, por me parashtesën INT të shtuar përpara dy pikave. Emri i një procedure të tillë shoqërohet me adresën e vektorit të ndërprerjes me komandën:
<адрес вектора>LIDHJE<имя процедуры>
Një ndërprerje komanduese është një operacion i emërtuar që thërret një procedurë përgjigjeje. Emri i këtij operacioni përcaktohet nga komanda TRAP, e cila shoqëron me të të ashtuquajturën procedurë të përgjigjes përfundimtare, e cila ekzekutohet nëse përgjigja përfundimtare nuk zëvendësohet me një procedurë tjetër reagimi duke përdorur komandën ON ose EON. Të tre komandat kanë të njëjtin format:
KURT<имя вызова> <процедура реагирования>
AKTIV<имя вызова> <процедура реагирования>
EON<имя вызова> <процедура реагирования>
Procedura e lidhur me emrin e thirrjes nga instruksioni EON ekzekutohet me një dalje paraprake nga trupi i procedurës që përmban instruksionin EON, dhe me vlerën e treguesit të stivës së operandit që ekzistonte në kohën kur u ekzekutua EON.
Sintaksa e gjuhës RAYA
Alfabeti i gjuhës RAY përfshin latinisht dhe rusisht, shkronja të vogla dhe të mëdha, numra dhjetorë, matematikë dhe karaktere të tjera të veçanta. Elementet (anëtarët) e alfabetit quhen shkronja. Paraqitja e jashtme e një letre është imazhi i saj i printuar (shenja e printuar). Brenda procesorit DSSP, çdo karakter i printuar përfaqësohet nga një bajt, vlera e të cilit është kodi binar i këtij karakteri. Shndërrimi i paraqitjes së jashtme në të brendshme dhe anasjelltas kryhet nga një pajisje hyrëse/dalëse (tastierë, ekran, printer). Për rehati vlerë numerike kodet shprehen në sisteme dhjetore, heksadecimale ose oktale, duke e quajtur numrin përkatës një shkronjë të kodit dhjetor, heksadecimal ose oktal.
Të gjitha objektet e gjuhës RAYA janë ndërtuar nga karaktere dhe përfaqësojnë zinxhirë linearë karakteresh me gjatësi të kufizuar, të quajtur fjalë. Ndarësi i fjalëve që pasojnë njëra-tjetrën është një karakter (hapësirë) jo i printueshëm. Një varg hapësirash është e barabartë me një hapësirë të vetme. Për më tepër, funksioni i ndarësit të fjalëve kryhet nga komanda "Shko në fillim të rreshtit tjetër", e treguar në tastierat e pajisjeve hyrëse me simbolin
Shembuj të fjalëve: CLEAR NOP STACK2 & 1+ -366 X Sonda.
Procesori DSSP i dallon fjalët me shtatë shkronjat e para, duke i njohur ato nga krahasimi politeral me fjalët në fjalorin e tij. Fjalori përmban fjalë që janë emra (emërtime) të operacioneve të vetë procesorit, të quajtura operacione bazë ose primitive, dhe mund të plotësohen me emra objektesh (të dhëna, procedura) të përcaktuara nga përdoruesi. Kështu, fjalët e përfshira në fjalor janë ose emra veprimesh (operacione, procedura) ose emra të dhënash (konstante, variabla, vargje).
Kur një fjalë e identifikueshme nuk është në fjalor, procesori përpiqet ta caktojë atë në një nga rastet e mëposhtme:
fjalë për fjalë numerike, d.m.th. një sekuencë numrash, ndoshta duke filluar me një shenjë minus, për shembull: 0, 4096, -25;
literal literal: një fjalë që fillon me karakterin #, e cila bën që procesori të marrë fjalë për fjalë menjëherë në vijim si një kod të dhënë, për shembull: #A - fjalë për fjalë e shkronjës latine të madhe A, #5 - fjalë për fjalë e numrit 5, # - fjalëpërfjalë e hapësirës, ## - shkronja të mirëfillta #;
teksti literal: teksti arbitrar i mbyllur në thonjëza të dyfishta dhe i ndarë me kufizues fjalësh, për shembull: "Tekst", "Skedari hyrës N3";
komanda për shfaqjen e një mesazhi me tekst: teksti i mesazhit të shfaqur, i kufizuar në të majtë nga kombinimi i karaktereve, thonjëza e dyfishtë dhe thonjëza e dyfishtë në të djathtë dhe e ndarë me kufizues fjalësh, për shembull: "Stepi është bosh";
koment: tekst arbitrar i mbyllur në kllapa katrore dhe i ndarë me kufizues, për shembull: .
Literalet dhe komanda për të shfaqur një mesazh në ekran veprojnë si objekte të gjuhës DSSP së bashku me fjalët e identifikuara nga fjalori, ndërsa komentet injorohen plotësisht nga procesori DSSP - ato janë të destinuara për një person, jo për një makinë. Nëse fjala nuk gjendet në fjalor dhe nuk ka lidhje me konstruksionet e listuara, procesori shfaq mesazhin: "Nuk e di<неопознанное слово>".
Për shkak të kuptimit të veçantë të bashkangjitur shkronjave #, "dhe kombinimi." në fillim të një fjale, d.m.th. pas ndarësit, si dhe shkronjës " përpara ndarësit, ato nuk duhet të përdoren në pozicionet e specifikuara në fjalët e përcaktuara për t'u përfshirë në fjalor.
Sekuenca e fjalëve në hyrjen e procesorit interpretohet si një sekuencë udhëzimesh të ekzekutuara nga procesori. Ekzistojnë tre lloje fjalësh:
1) kryhet në mënyrë të pavarur, d.m.th. që përfaqëson komandat me një fjalë (njëfjalë);
2) kryhet në lidhje me një ose më shumë fjalë të mëpasshme, d.m.th. duke qenë fjalët (parashtesat) fillestare të komandave me dy, tre ose shumë fjalë;
3) paraprirja e një komande si një sqarim ose tregues i një mënyre të veçantë ekzekutimi (parashtesa).
Fjalët e vetme përfshijnë fjalë për fjalë, emrat e të dhënave, shumicën e operacioneve I/O, testimin dhe konvertimin e të dhënave në stack, dhe procedurat e përcaktuara nga përdoruesi. Për shembull: 1987 - fjalë për fjalë numerike, #5 - fjalë për fjalë e numrit 5, "Lista e skemave" - teksti fjalëpërfjalshëm, LENGTH - emri i ndryshores, TOB, NEG, +, &,<, = - имена (обозначения) операций, SORT, CONVERT, ЧИСТКА, СНЯТЬ - имена процедур пользователя.
Prefikset janë të natyrshme në komandat për përshkrimin e të dhënave dhe përcaktimin e procedurave, si dhe manipulimin e të dhënave të emërtuara, ekzekutimin e kushtëzuar dhe të përsëritur të procedurave dhe menaxhimin e një fjalori. Shembuj të komandave me parashtesa:
VAR SUM - krijoni një variabël SUM,
: Tek [x] 1 & ; - krijoni një procedurë tek që zëvendëson një numër tek me 1, një numër çift me 0,
0 X - caktoni vlerën 0 në ndryshoren X,
BR+ P1 P2 - nëse vlera e majës së saj të marrë nga pirgu është pozitive, atëherë ekzekutoni P1, përndryshe ekzekutoni P2,
RP CHECK - kryeni procedurën CHECK përsëri dhe përsëri,
PËRDORNI $REAL - hapni për përdorim nën fjalorin $REAL.
Në mënyrë tipike, një parashtesë specifike kërkon një numër të caktuar fjalësh pas tij. Pra, në shembujt e sapo dhënë, prefikset VAR, !0 dhe USE kërkojnë secila nga një fjalë, dhe parashtesa BR+ kërkon dy fjalë. Megjithatë, parashtesa: (dy pika) ju lejon të krijoni një komandë të çdo gjatësie, duke filluar me tre fjalë. Fundi i komandës është fjala; (pikëpresje). Një gjatësi arbitrare është gjithashtu karakteristike për komandën e përshkruesit konstant CNST A1 ... AJ ; dhe procedura komanda e përzgjedhjes së shumëfishtë BR A1 P1 ... AJ PJ TJETËR PN.
Prefikset janë fjalë të veçanta që, kur shtohen në pjesën e përparme të një komande, modifikojnë përmbajtjen e saj ose përcaktojnë një mënyrë të veçantë ekzekutimi. Për shembull, komanda VAR X pa një parashtesë është një udhëzim për të krijuar një variabël 16-bitësh X. Nëse i bashkëngjitni parashtesën BYTE, ju merrni komandën BYTE VAR X, e cila ju udhëzon të krijoni një 8-bit. variabël (byte) me emrin X. Nëse përdorni një prefiks LONG, atëherë marrim LONG VAR X - një udhëzim për të krijuar një variabël 32-bit të quajtur X.
Një parashtesë e një lloji tjetër, domethënë:: (dy dy pika) e bën rezultatin e komandës rezistente ndaj procedurës CLEAR, e cila heq fjalët e lira nga fjalori. Emrat e futur në fjalor gjatë ndërtimit të një programi nga komandat e përshkrimit të të dhënave dhe përcaktimit të procedurës mund të hiqen nga fjalori pasi programi të jetë krijuar dhe testuar, me përjashtim të disave që janë të nevojshëm për të ruajtur programin e përfunduar. Heqja kryhet me komandën CLEAR $<имя подсловаря>, i cili udhëzon të pastrohet nëndarja e lidhur me programin, duke mbajtur në të vetëm ato fjalë, përkufizimet e të cilave përmbajnë parashtesën ::. Shembuj të komandave që gjenerojnë fjalë të pafshira:
:: BYTE CNST LITCODE # #0 #A ;
:: : MOD / [int(a,b),res(a,b)] E2 D [res(a,b)] ;
Siç tregon shembulli i dytë, i cili përmban prefikset :: dhe BYTE, një komandë mund të ketë më shumë se një prefiks.
Kështu, një komandë në një DSSP mund të jetë ose një fjalë (njëfjalë) ose një frazë (frazë), duke filluar me një parashtesë dhe që përmban numrin e fjalëve të vendosura për këtë parashtesë, dhe nëse parashtesa lejon një numër arbitrar fjalësh, atëherë ka një fjalë kufizuese në fund, ose mund të jetë një frazë e plotësuar në pjesën e përparme me fjalë të veçanta parashtese.
Gjuha bazë DSSP nuk përmban ndërtime sintaksore më komplekse se komanda dhe në përgjithësi nuk përmban asnjë ndërtim tjetër përveç atyre të diskutuara më sipër. Edhe gjëra të tilla si të domosdoshme në gjuhët e programimit si shprehja dhe funksioni, mungojnë në gjuhën bazë dhe mund të futen, nëse është e nevojshme, vetëm gjatë zhvillimit të saj.
Një program në një gjuhë bazë është thjesht një koleksion komandash të ekzekutuara në rendin në të cilin ato shfaqen në tekst. Për më tepër, çdo komandë, me përjashtim të atyre që përmbajnë vetëm primitivë, gjatë ekzekutimit të saj përfshin një sekuencë komandash që përcaktojnë fjalët e përfshira në të. Komandat e përfshira mund të përmbajnë fjalë që tregojnë zinxhirët e komandës, të cilat gjithashtu mund të përmbajnë fjalë që i referohen zinxhirëve të tyre të lidhur, etj. deri në nivelin ku komandat përmbajnë vetëm primitivë.
Përshkrimi i përgjithshëm i gjuhës PARA, e cila formoi përmbajtjen e këtij kapitulli, iu kushtua karakteristikave të strukturës së kësaj gjuhe dhe grupit bazë (fillestar) të komandave të saj, i cili është një grup komandash të integruara (primitive) të procesorit DSSP. Zhvillimi i mëtejshëm i gjuhës dhe rritja përkatëse e aftësive të procesorit kryhet duke futur procedura të reja, komanda, formate dhe lloje të dhënash të ndërtuara duke përdorur mjete bazë. Si rregull, një zhvillim i tillë është i orientuar drejt problemit në natyrë dhe kryhet në formën e paketave të procedurave të ngarkuara në hyrjen e procesorit përveç sistemit bazë.
Nga ana tjetër, sistemi bazë mund të plotësohet me mjete speciale të zbatuara në bazë të tij për të rritur efikasitetin e makinerive të programeve DSSP. Këto veçori përfshijnë aftësinë për të përcaktuar procedurat individuale drejtpërdrejt në kodin komandues të makinës që përdoret. Metoda e përcaktimit të një procedure nuk ka ndonjë ndikim në përdorimin e mëtejshëm të saj: emrat e të gjitha procedurave futen në një fjalor të përbashkët dhe janë plotësisht të barabartë. Një numër i programeve të bibliotekës ju lejojnë të përdorni procedura ose programe të tëra të shkruara në gjuhë të tjera.
Përshkrimi i operacioneve dhe komandave
Operacionet e kryera në pirg
Staku i operandit është një nga elementët kryesorë të arkitekturës së procesorit DSSP. Shumica e udhëzimeve të procesorit përdorin stek, duke konsumuar operandët që u nevojiten prej tij dhe duke i shtyrë rezultatet në të. Interpretimi i të dhënave në stek varet nga thelbi i problemit që zgjidhet, d.m.th., në fund të fundit është përgjegjësi e programuesit. Për shkak të faktit se një vlerë e shtyrë në pirg në fakt humbet emrin e saj, është e vështirë të përcaktohet nga teksti i programit se në cilët operanë zbatohet një operacion i caktuar dhe cilat janë rezultatet e tij. Prandaj, komentet përdoren për të treguar në mënyrë eksplicite operandët dhe rezultatet e procedurave në gjuhën RAYA. Në këtë rast, nuk është e nevojshme (dhe jo gjithmonë e mundur) të përshkruhet e gjithë përmbajtja e pirgut. Është absolutisht e nevojshme të komentohet pjesa e sipërme e stekit, e cila ndikohet nga procedura e kryer në të, pasi pa këtë qartësia e programit humbet dhe verifikimi i tij bëhet i vështirë.
Për të arritur uniformitetin e programit, këto komente duhet të shkruhen duke marrë parasysh disa rregulla të thjeshta. Si çdo koment, përshkrimi i të dhënave në pirg është i mbyllur në kllapa katrore. Ky përshkrim është një listë e operandëve që janë në pirg në një pikë të caktuar të programit. Çdo element i listës karakterizon përmbajtjen e një pozicioni të stivës; një presje përdoret si një kufizues. Vlerat e pozicionit të pirgut renditen nga e majta në të djathtë, duke filluar me elementin më të thellë dhe duke përfunduar me majën e pirgut. Përshkrimi i një operandi individual mund të jetë një numër, një emër, një shprehje ose çdo hyrje tjetër kuptimplotë që shpjegon kuptimin e një vlere të vendosur në pirg. Ndonjëherë ka vlera të shumta të mundshme për një pozicion të pirgut. Në këtë rast, vlerat renditen të ndara me një prerje.
Këtu është një shembull i një komenti që pasqyron gjendjen e pirgut të operandit:
[adresa e fillimit, N+1,1/0]
Në pikën e programit ku ndodhet ky koment, pirgu i operandit duhet të përmbajë të paktën tre pozicione, me një 1 ose 0 në krye, një vlerë numerike të barabartë me N+1 në nën-krye dhe një numër nën të. , interpretuar si adresa fillestare.
Për lehtësinë e përcaktimit të pozicionit të kërkuar të pirgut, ne do të përdorim konceptin e thellësisë. Ne do të supozojmë se pjesa e sipërme e pirgut shtrihet në thellësinë 1, nën-maja në thellësinë 2, etj. Në veçanti, vlera e treguar në shembull si "start.address". shtrihet në thellësi 3.
Ne do të fillojmë studimin tonë të gjuhës bazë DSSP me komanda për shtyrjen e vlerave në pirg. Komanda më e thjeshtë (dhe më e përdorur) e këtij lloji është një literal numerik, domethënë një tregues i qartë i një konstante që duhet të shtyhet në pirg. Le të, për shembull, duam të shtyjmë numrat 28, -5 dhe 11 në pirg. Për ta bërë këtë, duhet të futim rreshtin nga tastiera:
28 -5 11 dhe shtypni tastin
Për të shfaqur të gjithë përmbajtjen e stivit në ekran, DSSP ka komandën .. (dy pika). Pasi e kemi ekzekutuar, marrim linjën në ekran:
Siç mund ta shihni, forma e printimit ndjek konventat për komentimin e gjendjes së stivës (përveç që përdoret një hapësirë në vend të presjes). Komanda .. nuk e ndryshon përmbajtjen e stivit.
Një fjalë 32-bitësh (4 bajt) përdoret për të përfaqësuar një pozicion stek në memorien e makinës; numrat përfaqësohen në plotësimin e dy. Prandaj, procesori DSSP mund të perceptojë saktë vetëm numrat e plotë që shtrihen në rangun nga -2147483648 në 2147483647. Nëse numri i futur nuk mund të përfaqësohet me 32 bit (duke marrë parasysh shenjën), atëherë bitet më domethënëse që nuk përshtaten hidhen. .
Në shembujt e shqyrtuar, supozohej se procesori DSSP është në modalitetin e hyrjes/daljes dhjetore. Për të vendosur këtë modalitet në gjuhën PARA ekziston një komandë B10.
Në shumë detyra, është e nevojshme të interpretohen të dhënat e përpunuara jo si numra, por si kode binare, domethënë vektorë bit me 32 përbërës. DSSP ka aftësinë për të punuar me kodet e paraqitura në sistemet e numrave binar, oktal ose heksadecimal. Për të vendosur mënyrën e dëshiruar, mjafton të ekzekutoni një nga tre komandat: B2, B8 ose B16, pas së cilës procesori do të pranojë dhe printojë të gjitha kodet e futura në sistemin e numrave të specifikuar.
Kjo veçori mund të përdoret për të kthyer numrat dhjetorë në sisteme numrash me bazat 2, 8 dhe 16. Për shembull, për të kthyer numrin 29 duhet të futni dhe ekzekutoni rreshtin e mëposhtëm:
B10 29 B2. B8. B16. Si rezultat, procesori do të shfaqë një seri numrash në ekran: 00000000035 0000001D që janë paraqitje të numrit dhjetor 29 në tre sistemet e numrave të specifikuar. Vini re se kodet janë shtypur në paraqitjen e tyre të makinës, d.m.th. me zero kryesore dhe pa shenjat "+", "-". Gjatë ekzekutimit të linjës B10 -2 B8 . do të prodhojë numrin 37777777776, i cili është përfaqësimi oktal i të dyve prej -2.
Kur punoni me kode heksadecimal, mund të ndodhin përplasje midis literaleve numerike dhe emrave të komandave të procesorit DSSP. Për shembull, fjala B8 në modalitetin heksadecimal I/O mund të interpretohet si një komandë e modalitetit oktal dhe si një konstante heksadecimal. Për të shmangur paqartësinë, duhet të filloni fjalë për fjalë numerike me një zero jo të rëndësishme, për shembull 0B8.
Baza e sistemit të komandës së procesorit DSSP janë operacionet e konvertimit të të dhënave të vendosura në pirg. Rregulli i përgjithshëm që rregullon funksionimin e këtyre operacioneve është që çdo operacion konsumon (heq) operandët që kërkon nga pirgu dhe shtyn vlerat e rezultatit (nëse ka) në vendin e tyre.
Le të shqyrtojmë udhëzimet e procesorit që zbatojnë katër operacione aritmetike: mbledhje, zbritje, shumëzim dhe pjesëtim të numrave të plotë. Për t'i përshkruar ato në gjuhën e PARADISE përdoren përkatësisht fjalët: +, -, * dhe /. Për të marrë shumën e dy numrave në pirg, për shembull 123 dhe 45, duhet t'i shtyni këta numra në pirg dhe të ekzekutoni komandën +. Për ta bërë këtë, thjesht futni rreshtin e mëposhtëm nga tastiera (duke supozuar se modaliteti i hyrjes/daljes dhjetore është vendosur):
123 45 +
Nëse tani e shfaqni përmbajtjen e pirgut në ekran (duke përdorur komandën ..), do të shihni rezultatin e shtimit:
Operacioni i shumëzimit komutativ funksionon në mënyrë të ngjashme.
Gjatë kryerjes së veprimeve jokomutative të zbritjes dhe pjesëtimit, nënverteksi i pirgut merret si minuend (i ndashëm), dhe pjesa e sipërme merret si nëntrahend (pjesëtues). Për shembull, për të llogaritur diferencën 151-68, duhet të ekzekutoni linjën:
151 68 -
Programi për kryerjen e një veprimi aritmetik në gjuhën PARA karakterizohet nga fakti se operacioni ndodhet pas operandëve përkatës. Ky shënim i shprehjeve aritmetike quhet shënim postfiks (ose i kundërt polak) dhe përdoret gjerësisht në mikrollogaritësit e stivës. Le të, për shembull, duhet të llogarisim vlerën e shprehjes aritmetike ((127+81)*15-(31+117)*21)*3
Në shënimin postfiks, kjo shprehje do të duket kështu:
127 81 + 15 * 31 117 + 21 * - 3 *
Ky rresht (në të cilin fjalët ndahen nga njëra-tjetra me hapësira) është një program i gatshëm për llogaritjen e shprehjes sonë nga procesori DSSP.
Ndarja / komanda ndryshon nga operacionet e tjera aritmetike në atë që rezultati i saj është dy vlera - herësi dhe pjesa e mbetur. Koeficienti përfundon në fund të pirgut, dhe pjesa e mbetur në krye. Koeficienti është negativ nëse dividenti dhe pjesëtuesi kanë shenja të ndryshme. Pjesa e mbetur ka gjithmonë shenjën e dividentit. Këtu janë disa shembuj të përdorimit të komandës ndarje.
125 7 / [-17,-6] / / /
Gjatë kryerjes së llogaritjeve, mund të ndodhin situata gabimi: tejmbushje dhe pjesëtim me zero. Procesori DSSP nuk reagon ndaj tyre në asnjë mënyrë (në veçanti, kur pjesëtohet me zero, përmbajtja e pirgut nuk ndryshon), dhe kontrolli mbi përdorimin e saktë të operacioneve i takon programuesit.
Kur programoni, shpesh duhet të rrisni ose ulni vlerën e një vlere me 1 ose 2. Komandat speciale janë futur në gjuhën PARA që kryejnë veprime të specifikuara në krye të stivit. Ato përcaktohen me fjalët: 1+, 1-, 2+, 2-. Ekzekutimi i këtyre komandave është i barabartë me shtyrjen e konstantës së kërkuar (1 ose 2) në pirg dhe më pas kryerjen e operacionit të kërkuar aritmetik (+ ose -). Për shembull, 2+ është ekuivalente me çiftin e fjalëve 2+. Futja e këtyre komandave në gjuhë u nxit nga konsideratat e efikasitetit.
Gjithashtu, për të rritur efikasitetin, gjuha bazë e procesorit DSSP përmban komandat T0 dhe T1, të cilat zëvendësojnë vlerën në krye të stackit me përkatësisht 0 dhe 1, pavarësisht se çfarë vlere ishte në krye para komandës së specifikuar. Shembuj:
Komandat NEG, ABS dhe SGN janë gjithashtu të destinuara për të punuar me të dhëna numerike. Komanda NEG kthen shenjën e majës së pirgut, ABS zëvendëson vlerën e majës së pirgut me modulin e tij, SGN konsumon një vlerë numerike nga maja e pirgut dhe vendos shenjën e numrit të nxjerrë në vend të tij: -1 - nëse numri është negativ, 1 - nëse është pozitiv, 0 - nëse është i barabartë me zero. Për shembull:
5 NEG [-5] ABS SGN
Komandat e gjuhës bazë MIN dhe MAX ju lejojnë të gjeni minimumin dhe maksimumin e dy numrave të plotë. Operandët për këto udhëzime janë dy numra të vendosur në krye dhe në nënkrye të pirgut. Komanda MIN lë numrin minimal të parametrave në pirg, MAX - maksimumin e tyre. Për shembull:
5 0 15 MIN [-5,0] MAX
Për të gjetur minimumin (maksimumin) prej tre numrave në pirg, thjesht përdorni komandën MIN (MAX) dy herë:
MIN MIN [-2]
Komanda SEG kontrollon nëse numri i përfshirë në krye të pirgut bie në intervalin e specifikuar nga a në b (përfshirë kufijtë) dhe lë një shenjë në pirg si rezultat: 1 nëse numri është në interval dhe 0 nëse jo:
SEG [shenjë] për shembull:
Përveç komandave të fokusuara në punën me të dhëna numerike, grupi i komandave të procesorit DSSP përfshin një numër operacionesh të dizajnuara për të kthyer kodet 32-bit. Këto operacione trajtojnë një element stack si një vektor bit me 32 komponentë, përbërësit e të cilit numërohen nga e djathta në të majtë në mënyrë që biti më i majtë të numërohet 31 dhe biti më i djathtë numërohet 0. Numri zbritës i komponentëve ndjek numërimin e bitet e fjalëve makine të miratuara për shumë mikroprocesorë.
Komandat e kryera në vektorët bit përfshijnë kryesisht operacionet e algjebrës Boolean bit:
përmbysja bit e majës së pirgut INV, duke ndryshuar vlerën e secilit bit të pjesës së sipërme, d.m.th., duke zëvendësuar 0 me 1 dhe 1 me 0;
lidhja bitale e majës dhe nënverteksit të stekit &, duke vendosur bitin i-të të rezultatit, i=31,30,...,0, në vlerën 1 nëse bitat i-të të të dy operandëve janë të barabartë me 1, dhe në raste të tjera vendosja e bitit i-të të barabartë me 0;
disjuksioni bit i majës dhe nënverteksit të pirgut &0, duke vendosur bitin i-të të rezultatit, i=31,30,...,0, në vlerën 0 nëse bitet i-të të të dy operandëve janë të barabartë me 0, dhe në raste të tjera vendosja e bitit i-të të barabartë me 1;
shtimi bit (jo ekuivalent) "+" i një kulmi dhe nënverteksi, duke vendosur bitin i-të të rezultatit në 0 nëse bit-të i-të të të dy operandëve kanë të njëjtat vlera, dhe duke vendosur bitin e i-të të rezulton në 1 nëse vlerat e biteve të i-të të operandëve janë të ndryshme.
525 INV 722 & 136 & 0 325 "+"
Lidhja bitwise përdoret shpesh për të rivendosur (pastruar) pjesët e një fjale. Për ta bërë këtë, ata kryejnë një lidhje të fjalës origjinale me një maskë që përmban zero në ato pjesë që duhet të pastrohen dhe një në pjesët e mbetura. Për shembull, nëse duhet të rivendosni bitet 3 deri në 5 në ndonjë fjalë X, duhet të kryeni lidhjen e saj bitale me maskën 37777777707. Për X=235 marrim:
Ndarja bitwise mund të përdoret për të vendosur kombinimin e dëshiruar të biteve në një grup të pastruar më parë të bitave të fjalëve. Le të, për shembull, duhet të vendosni kombinimin binar 010 në bitet 3 deri në 5 të fjalës që mbetet në pirg si rezultat i shembullit të fundit. Kjo mund të bëhet si kjo:
Operacionet e manipulimit të biteve përfshijnë gjithashtu komandat e zhvendosjes logjike:
zhvendosja majtas SHL - çdo bit i majës së pirgut, duke filluar nga 31, merr vlerën e tjetrit në rend zbritës, dhe biti i fundit zero merr vlerën 0;
Shift djathtas SHR - çdo bit i majës së pirgut, duke filluar nga 0, merr vlerën e tjetrit në rend rritës, dhe biti i 31-të merr vlerën 0;
zhvendosja në krye SHT - elementi i sipërm hiqet nga pirgu dhe trajtohet si një numër i plotë N, duke treguar se sa zhvendosje dhe në çfarë drejtimi duhet të bëhen në krye të pirgut: kur N>0 bëhet një zhvendosje në të majtë , kur N<0 - вправо.
B8 125 SHR SHL -2 SHT
Operacionet e zhvendosjes majtas mund të përdoren për të shumëzuar numrat me 2 me fuqinë e N, ku N është një numër natyror që përcakton numrin e ndërrimeve. Për shembull, shumëzimi i numrit -5 me 8 mund të bëhet duke zhvendosur numrin 3 në të majtë:
B10 -5 3 SHT [-40]
Duhet të merret parasysh mundësia e tejmbushjes.
Zhvendosja djathtas mund të përdoret si pjesëtim me 2 në fuqinë e N vetëm për numrat pozitivë, pasi biti (shenja) më i rëndësishëm vendoset në zero gjatë zhvendosjeve djathtas. Për shembull:
kurse
Komandat për të zhvendosur në mënyrë ciklike pjesën e sipërme të pirgut 1 bit në ROR djathtas dhe ROL majtas janë të ngjashme me komandat e zhvendosjes logjike, me përjashtim të faktit se biti më i largët i shtyrë nuk zhduket, por shtyhet në hapësirën e lirë në skajin e kundërt të Fjalë e gjatë 32-bit. Për shembull (numrat heksadecimal):
Komandat e procesorit DSSP SWB dhe SWW janë gjithashtu të destinuara për përpunimin e kodeve binare. Funksioni SWB është të ndërrojë bajtet e gjysmës së rendit të ulët të pjesës së sipërme të pirgut, dhe funksioni SWW është të ndërrojë gjysmat e pjesës së sipërme të pirgut. Le të ilustrojmë se si funksionojnë këto komanda duke përdorur modalitetin heksadecimal I/O (në këtë mënyrë, çdo bajt përfaqësohet nga dy shifra heksadecimal):
B16 0ABCD SWB SWB
0ABCDEF12 SWW SWB
Komandat e manipulimit të stivës luajnë një rol të rëndësishëm në gjuhën PARA. Ata nuk ndryshojnë vlerat e të dhënave të vendosura në pirg, por ndryshojnë vetëm vendndodhjen e tyre, duke e bërë më të lehtë aksesin e operandëve të vendosur thellë në pirg.
Ekzistojnë tre komanda për fshirjen e elementeve të stivit: D, DD, DS (Drop). Komanda D heq një element (sipër) nga pirgu, DD heq dy elementë, për shembull:
D DD D DS heq të gjithë elementët nga pirgja (pastron pirgun):
Komanda për të kopjuar pjesën e sipërme të pirgut C (Copy) shtyn një kopje të vlerës aktuale të majës së saj në pirg. Kjo është e barabartë me dyfishimin e elementit të sipërm të pirgut: pjesa e sipërme e vjetër bëhet subvertex dhe kopja e saj bëhet pjesa e re e sipërme. Shembull:
Le të tregojmë përdorimin e kësaj komande duke përdorur shembullin e llogaritjes së polinomit p(x)=3*x**2+4*x-5 duke përdorur skemën e Hornerit: p(x)=(3*x+4)*x- 5. Supozojmë se vlera x gjendet në krye të pirgut.
[x] C 3 * 4 + * 5 -
Së bashku me komandën për të kopjuar pjesën e sipërme të stivit, gjuha PARA ka edhe komanda C2, C3, C4, të cilat kopjojnë elementët e vendosur në thellësi 2, 3, 4. Puna e tyre mund të shpjegohet me shembujt e mëposhtëm:
C2 C4
Ekziston gjithashtu një komandë CT për të kopjuar një element të vendosur në një thellësi të specifikuar në krye të pirgut. Kur kryen CT, procesori heq elementin e sipërm nga pirgja, përdor vlerën e tij si një tregues të thellësisë së elementit të kopjuar dhe shtyn një kopje të këtij të fundit në pirg. Kështu, kopjimi i një elementi të vendosur në thellësinë 5 specifikohet nga një palë 5 instruksionesh CT, duke i ekzekutuar procesori do të shtyjë numrin 5 në pirg dhe më pas do të ekzekutojë instruksionin CT. Ekzekutimi i CT me parametrat 1, 2, 3, 4 është ekuivalent me komandat C, C2, C3, C4, përkatësisht.
Komandat e shkëmbimit E2, E3, E4 (Exchange) riorganizojnë elementin e parë (sipër) të pirgut, përkatësisht, me 2, 3, 4, d.m.th., me elementin e vendosur në një thellësi prej 2, 3, 4. Për shembull:
E3 E2
Për të shkëmbyer në një thellësi më të madhe, përdorni komandën ET, e cila, si CT, përdor vlerën e majës së pirgut si një tregues të thellësisë së elementit që shkëmbehet me elementin e parë. Për shembull:
5 ET
Komanda ET me parametrat 2, 3, 4 është ekuivalente me komandat E2, E3, E4.
Për të ilustruar përdorimin e komandave të kopjimit dhe ndarjes, merrni parasysh një detyrë mësimore. Tre numra janë dhënë në pirg. Kërkohet të merret në pirg: . Ju mund të sugjeroni programin e mëposhtëm, kuptimi i të cilit duket qartë nga komentet.
C3 C3 C3+
E4+E4
Ky shembull tregon mirë se sa i rëndësishëm është roli i komenteve, duke pasqyruar gjendjen e stivit të operandit.
Në programe, shpesh është e nevojshme të krahasohen vlerat numerike me njëra-tjetrën dhe të kryhen procedura të ndryshme në varësi të rezultateve të krahasimit. Gjuha RAYA ka komanda krahasimi<, =, >. Ato përcaktohen mbi numra dhe si rezultat prodhojnë vlerat numerike 0 dhe 1. Pra, komanda< потребляет из стека два элемента и засылает в стек число 1, если значение нижнего элемента оказалось меньше значения верхнего, а в противном случае засылает 0. Например, в результате выполнения последовательности 5 -20 < в стек будет заслан 0. Команда = засылает 1 в случае равенства потребленных ею элементов. Команда >dërgon 1 kur elementi i poshtëm është më i madh se elementi i sipërm. Për të programuar krahasime jo të rrepta (më pak ose e barabartë, më e madhe ose e barabartë), përdoret instruksioni NOT, i cili zëvendëson vlerën në krye të pirgut që nuk është e barabartë me zero me zero dhe e barabartë me zero me një. Për shembull, vlerësimi i shprehjes logjike x>=5, ku x është një numër i vendosur në krye të pirgut, mund të specifikohet si më poshtë:
[x] 5< NOT
Zgjerimi i mëtejshëm i aftësive programuese të kushteve sigurohet nga përdorimi, së bashku me komandat e krahasimit, të operacioneve logjike të lidhjes & (logjike AND) dhe ndarjes &0 (logjike OR). Le të, për shembull, dëshironi të merrni 1 në pirg nëse numri x në kulm i përket gjysmësegmentit C 5< NOT C2 10 <
&E2 2 = &0
Kontrollet e programit në varësi të rezultateve të krahasimit do të diskutohen më vonë.
Përcaktimi i Procedurave
Si një teknikë bazë programimi, DSSP i ofron përdoruesit aftësinë për të përcaktuar sekuencat e emërtuara të operacioneve të quajtura procedura. Le të, për shembull, duhet të llogaritni vlerat e trinomit kuadratik 3*x**2-4*x+9 për vlerat e dhëna të x. Në këtë rast, duhet të përcaktoni një procedurë që zbaton formulën trinomiale dhe nxjerr rezultatin në terminal, dhe më pas ta zbatoni këtë procedurë në vlera specifike të x. Procedura e kërkuar, le ta quajmë PX, përcaktohet si më poshtë: PX [x] C 3 * 4 - * 9 + . D ; Dy pika tregon një operacion "përcaktoni procedurën", me emrin e procedurës të ndjekur nga një dy pika pas një hapësire ndarëse. Sekuenca përcaktuese e komandave (trupi i procedurës) ndodhet pas emrit të procedurës dhe përfundon me një pikëpresje. Shkurtimisht, procedura përcaktohet në formën:
: <имя процедуры> <тело процедуры> ;
Gjuha RAYA kërkon komentimin e gjendjes së pirgut të operandit në fillim dhe në fund të një procedure. Në trupin e procedurës, komentet vendosen në diskrecionin e programuesit në vende që janë të vështira për t'u kuptuar.
Komentet i ndihmojnë njerëzit të kuptojnë dhe përdorin procedurën; procesori thjesht injoron çdo gjë të mbyllur në kllapa. Prandaj, kur futni përkufizimin e një procedure individuale nga terminali, komentet mund të hiqen.
Pasi futet përkufizimi i procedurës dhe shtypet tasti
* 2 PX
*3 PX
* 4 PX
Le të përcaktojmë një procedurë më të përgjithshme për llogaritjen e një trinomi të formës a2*x**2+a1*x+a0, e cila ju lejon të specifikoni vlerat e x dhe a0, a1, a2. Le ta quajmë atë PXA:
: PXA C E4 E3 * + * + ;
Kur përdorni PXA, vlerat a0, a1, a2, x duhet të jenë në sekuencën e kërkuar në pirg. Për shembull: a0=1, a1=2, a2=-3, x=4
* 1 2 -3 4 PXA . D
Trupi i një procedure, së bashku me operacionet bazë të procesorit, mund të përmbajë procedura të përcaktuara nga përdoruesi. Për shembull, mund të përcaktoni një procedurë P që, përveç llogaritjeve të kryera nga PXA, do të printojë një kopje të rezultatit në terminal dhe do ta heqë rezultatin nga pirgja.
:PXA. D ;
Në veçanti, trupi i një procedure mund të përfshijë emrin e procedurës që përcaktohet vetë, domethënë procedura mund të jetë rekursive. Për shembull:
: KOHA [t] 1- KOHA ;
Kjo procedurë zvogëlon vlerën e majës së pirgut me 1 dhe përsëri i referohet vetes, d.m.th. funksionon si numërues i kohës.
Numëruesi TIME, në parim, nuk mund të ndalojë: procedura e zbritjes së njërit do të kryhet pa pushim ndërsa procesori është në punë. Por në DSSP ka mjete që ju lejojnë të kontrolloni përparimin e procesit në varësi të rezultateve të marra - funksionimin e kontrollit të përparimit të programit.
Ekzekutimi dhe përsëritja e kushtëzuar
Një program që është një sekuencë komandash të ekzekutuara në rendin që shfaqen njëra pas tjetrës në shënimin e tij quhet linear. Për ta bërë programin lehtësisht të dukshëm (të lexueshëm) dhe të kuptueshëm, ai ndahet në pjesë të emërtuara që kanë një kuptim të caktuar - procedura, secila e përcaktuar nga sekuenca e vet e procedurave, të cilat nga ana tjetër përcaktohen nga sekuenca procedurash më të vogla, etj. te procedurat e përcaktuara drejtpërdrejt nga sekuencat e komandave DSSP. Një program i tillë, i shkruar si një hierarki e përkufizimeve të procedurës, quhet i strukturuar. Metoda e ndërtimit të një programi të strukturuar, e cila konsiston në zbërthimin gradual të problemit që do të zgjidhet në nëndetyra gjithnjë e më të vogla, quhet programim i strukturuar.
Krijimi jo vetëm linear, por edhe i çdo programi duke përdorur metodën e programimit të strukturuar është i mundur nëse ka operacione të ekzekutimit të një procedure sipas një kushti, përsëritjes së një procedure dhe daljes nga një procedurë e përsëritur. Grupi i komandave të këtij lloji të disponueshëm në DSSP ofron mundësinë e ndërtimit të strukturuar të një programi arbitrar.
Kushtet për ekzekutimin ose mosekzekutimin e një procedure formulohen në lidhje me shenjën e numrit, më saktë, në lidhje me shenjën e vlerës që ka aktualisht pjesa e sipërme e stivit. Komanda kryesore e ekzekutimit të procedurës së kushtëzuar - BRS (BRanch on Sign) udhëzon të ekzekutohet një nga tre procedurat e emërtuara sipas BRS në varësi të shenjës së vlerës aktuale të majës së stivit. Gjatë ekzekutimit të BRS, procesori heq elementin e sipërm nga pirgu, teston vlerën e tij dhe nëse është negativ, atëherë kryen të parën nga këto procedura, nëse është zero, atëherë të dytin, dhe nëse është pozitiv, atëherë e treta. Pra ekip
do të bëjë që një element të hiqet nga steka dhe procedura N të ekzekutohet nëse vlera e hequr është negative, procedura P të ekzekutohet nëse është pozitive dhe procedura Z të ekzekutohet nëse është zero.
Një shembull i përdorimit të komandës BRS është përkufizimin e mëposhtëm Procedurat SGN
: SGN [X] BRS -1 0 1 ;
Kjo procedurë zëvendëson vlerën X në krye të pirgut me numrin -1 nëse X<0, числом 0, если X=0, и числом 1, если X>0. Procedura SGN është e disponueshme në DSSP si një operacion bazë i procesorit.
Komanda BRS, së bashku me zgjedhjen e një procedure nga tre të dhëna, ofron mundësinë për të zbatuar deklarata me dy vlera të formës IF-THEN dhe IF-THEN-ELSE. Për shembull, fjalia nëse x>0 atëherë P1 tjetër P0 korrespondon me komandën BRS P0 P0 P1, dhe fjalia nëse x<>0 pastaj P - komanda BRS P NOP P, në të cilën NOP është emri i një operacioni bosh. Por në DSSP ekziston një zbatim më efikas i kushteve me dy vlera - komandat IF-, IF0, IF+, BR-, BR0, BR+.
Komandat e grupit IF korrespondojnë me deklaratën IF-THEN. Për shembull, komanda IF-P udhëzon për të hequr elementin e sipërm nga pirgu dhe për të testuar shenjën e tij, dhe nëse ky element ka një shenjë minus, atëherë ekzekutoni procedurën P. Urdhri për ekzekutimin e procedurës P, respektivisht, urdhëron IF0 P dhe IF+ P. , në rastin kur elementi i hequr është i barabartë me zero, dhe në rastin kur vlera e tij është pozitive.
Si një shembull që ilustron përdorimin e komandave të grupit IF, ne japim përkufizimin e një komande në gjuhën bazë ABS që llogarit modulin e pjesës së sipërme të pirgut.
: ABS [X] C IF-NEG [|X|] ;
Komandat BR-, BR0 dhe BR+ korrespondojnë me deklaratën IF-THEN-ELSE, duke udhëzuar zgjedhjen e një prej dy procedurave të emërtuara sipas tyre. Nëse shenja e një elementi të hequr nga rafti përkon me atë në emërtimin e komandës, atëherë ekzekutohet procedura e emërtuar e para, dhe nëse nuk përputhet, atëherë ekzekutohet procedura e dytë. Për shembull, komanda BR0 P0 P1 udhëzon për të ekzekutuar procedurën P0 në rastin kur elementi i hequr nga steka është i barabartë me zero, dhe nëse ky kusht nuk plotësohet, atëherë ekzekutoni procedurën P1.
Komandat e marra ju lejojnë të programoni ekonomikisht ekzekutimin e një procedure në varësi të këtyre kushteve. Kushtet më të zakonshme të formës x<0, x=0, x>0 zbatohen drejtpërdrejt nga udhëzimet e grupit IF. Kushtet x<=0, x<>0, x>=0 janë programuar duke përdorur udhëzimet BR-, BR0, BR+ duke përdorur operacionin NOP bosh si procedurë të parë. Për shembull, klauzola if x<=0 then P соответствует команда BR+ NOP P. Примером использования команд группы BR может служить следующая реализация команды базового языка NOT, заменяющей нулевое значение вершины стека единицей, а ненулевое - нулем.
: JO [x] BR0 1 0 ;
Degëzimi i programit shpesh bëhet pas komandave të krahasimit (<, =, >), duke prodhuar një vlerë logjike prej 1 ose 0 në varësi të rezultatit të krahasimit të dy numrave. Komanda e gjuhës bazë MAX, për shembull, mund të programohet si më poshtë:
: MAX C2 C2< IF+ E2 D ;
Grupi i komandave të degëzimit përfshin gjithashtu komandën e përzgjedhjes BR, e shkruar në formën:
BR A1 P1 A2 P2 ... AK PK ... AN PN TJETER P0
Gjatë zbatimit të këtij udhëzimi, procesori fillimisht ekzekuton procedurën e treguesit A1 dhe krahason vlerën që shtyu në pirg me vlerën nën të nga maja e mëparshme e pirgut. Nëse vlerat përputhen, atëherë dy elementët e sipërm hiqen nga pirgu dhe ekzekutohet procedura P1 e lidhur me treguesin A1, pas së cilës bëhet kalimi në udhëzimin duke ndjekur udhëzimin BR (d.m.th., në shënimin e mësipërm, njëri pas fjalës P0 në tekstin e programit). Nëse vlerat e krahasuara nuk përputhen, atëherë elementi i sipërm hiqet nga pirgja (d.m.th., rezultati i A1) dhe të njëjtat veprime kryhen me çiftin A2 P2, atëherë, nëse nuk ka përputhje, atëherë me çifti A3 P3, etj. deri në AN PN përfshirëse. Nëse asnjë nga përpjekjet nuk dha rezultat, procedura P0 e emërtuar sipas fjalës ELSE ekzekutohet. Në mënyrë tipike, konstantet numerike veprojnë si procedura treguese, për shembull:
[x] C BR 5 NEG -3 ABS 0 JO TJETER T0 [y]
Si rezultat i ekzekutimit të kësaj rreshti, vlera y=-5 do të merret në krye të stivit nëse x=5; y=3 nëse x=-3; y=1 nëse x=0 dhe y=0 në të gjitha rastet e tjera.
Në përgjithësi, një procedurë treguese mund të jetë jo vetëm një konstante numerike, por edhe një variabël ose ndonjë procedurë tjetër që plotëson kërkesën e thjeshtë që të mos nxjerrë asgjë nga pirgu dhe të shtyjë një vlerë në pirg.
Për të ilustruar se si përdoren operacionet e ekzekutimit të procedurës së kushtëzuar, le të modifikojmë procedurën TIME në seksionin e mëparshëm në mënyrë që numëruesi të ndalojë kur ndodh një kusht i caktuar:
: KOHA [t] 1- C IF+ TIME ;
Tani kjo procedurë TIME e quan veten vetëm kur pjesa e sipërme e pirgut është pozitive. Numëruesi do të funksionojë saktësisht N herë nëse në fillim të ekzekutimit të parë të TIME kulmi përmban një numër pozitiv N. Për shembull, për të marrë 7 operacione, duhet të vendosni
7 KOHA<ВК>
Meqenëse IF+ në përkufizimin TIME, si çdo operacion i kushtëzuar, e heq elementin nën provë nga grumbulli dhe ky element është i nevojshëm për operacionet e mëvonshme, ai duhet të dyfishohet duke vendosur operacionin C (Copy) përpara IF+.
Rekursioni nuk është mjeti kryesor për të ekzekutuar një procedurë shumë herë. Për të programuar ciklet në gjuhën PARA ekzistojnë komanda RP (Përsërit - përsërit) dhe DO (Bëje - bëj, ekzekuto).
Komanda RP W ju udhëzon të kryeni procedurën W pa pushim një numër të pakufizuar herë. Në mënyrë që përsëritjet të ndalojnë, trupi i procedurës W duhet të përmbajë një operacion EX (Dalje) që ekzekutohet në një kusht të caktuar. Operacioni EX kalon në ekzekutimin e një procedure që ndjek në tekstin e programit procedurën e përsëritur që përmban këtë operacion EX. Kështu, numëruesi i zbatuar më sipër si procedurë rekursive TIME mund të programohet për të përsëritur procedurën W, e cila përcaktohet si më poshtë:
: W [t] 1- C IF0 EX ;
Për ta bërë numëruesin të funksionojë 25 herë, duhet të ekzekutoni rreshtin
Së bashku me operacionin EX, i cili përdoret në komandat e ekzekutimit të kushtëzuar, ekzistojnë operacionet e daljes me kusht EX-, EX0, EX+, të cilat prodhojnë të njëjtin efekt si komandat IF-EX, IF0 EX, IF+ EX, d.m.th., duke konsumuar elementin e sipërm. , duke testuar shenjën e saj dhe duke dalë nëse shenja përputhet me atë të specifikuar në përcaktimin e funksionimit. Operacionet EX, EX-, EX0, EX+ mund të përdoren jo domosdoshmërisht në trupin e vetë procedurës përsëritëse (në rastin tonë W), por edhe në procedurat të cilave i referohet.
Si shembull, merrni parasysh problemin e gjetjes së pjesëtuesit më të madh të përbashkët të dy numrave natyrorë duke përdorur metodën e Euklidit. Thelbi i metodës është që ju duhet të zbrisni një numër më të vogël nga një numër më i madh derisa numrat të bëhen të barabartë me njëri-tjetrin. Pasi të arrihet barazia, do të gjendet pjesëtuesi më i madh i përbashkët.
Programimi do të kryhet duke përdorur metodën e zhvillimit nga lart-poshtë. Së pari, ne përcaktojmë një procedurë GCD që kap skemën e përgjithshme të algoritmit. Parametrat e kësaj procedure janë dy numra M dhe N në pirg, për të cilët gjendet pjesëtuesi më i madh i përbashkët. Trupi i procedurës GCD duhet të specifikojë një proces ciklik për konvertimin e vlerave në pirg. Si rezultat i këtij procesi, dy numra të barabartë duhet të mbeten në pirg - secili prej tyre mund të merret si pjesëtuesi më i madh i përbashkët. Duke marrë parasysh këto konsiderata, procedura e GCD mund të përkufizohet si më poshtë.
: GCD RP HAPI [nod(M,N),nod(M,N)] D [nod(M,N)] ;
Tani është e nevojshme të programohet një hap i procesit iterativ, d.m.th. përcaktoni procedurën STEP. Parametrat për të janë dy numra në pirg. Ju duhet t'i krahasoni këta numra dhe të dilni nga cikli nëse janë të barabartë, përndryshe, zbrisni më të voglin nga më i madhi. Kjo mund të bëhet, për shembull, si kjo:
: HAPI C2 C2 - BRS NOP EX E2 C2 - ;
Tani nuk ka mbetur asnjë procedurë e papërcaktuar në program dhe mund të filloni ta kontrolloni atë. Kontrolli duhet të kryhet nga poshtë lart, d.m.th. së pari duhet të siguroheni që procedura STEP po funksionon si duhet dhe vetëm atëherë - GCD.
Një operacion DO i gjuhës bazë bën që procedura e emërtuar sipas saj të përsëritet N herë, ku N është numri që gjendet në krye të pirgut në kohën kur ekzekutohet DO. Për shembull, në mënyrë që procedura P të ekzekutohet 8 herë, ju duhet të vendosni
8 DO P
Nëse ka të paktën një operacion daljeje në trupin e procedurës P dhe kushti i ekzekutimit të tij plotësohet përpara se të ketë ndodhur numri i caktuar i përsëritjeve, atëherë përsëritjet do të ndërpriten duke dalë nga procedura në të njëjtën mënyrë siç bëhet në rastin e operacioni RP. Për shembull, kur DO përsërit procedurën e mësipërme W, përkufizimi i së cilës përmban IF0 EX, shkrimi i [T] 30 DO W do të shkaktojë 30 përsëritje të W nëse vlera e T>=30. Nëse 0 Nëse deri në kohën e ekzekutimit të operacionit DO ka një vlerë zero ose negative në krye të stivit, atëherë procedura pas DO nuk do të ekzekutohet as edhe një herë. Për të ilustruar përdorimin e operacionit DO, ne përcaktojmë një procedurë NUM që numëron numrin e biteve jozero në fjalën 32-bit x të dhënë në krye të stivit. Ne do të vendosim numëruesin për numrin e njësive në nënverteksin e pirgut. Njësitë e numërimit do të konsistojnë në përsëritjen e procedurës NUMI 32 herë, në të cilën do të shqyrtojmë një bit të fjalës x. Pas daljes nga laku, numri i kërkuar duhet të jetë në krye të pirgut. : NUM [x] 0 E2 32 DO NUMI D [N] ; Për të numëruar bit jo zero, përdorim faktin se një në bitin më domethënës (31) të një fjale shërben si shenjë e një numri negativ. Nëse fjala që studiohet është negative, atëherë duhet t'i shtohet N. Në fund të procedurës NUMI, duhet ta zhvendosni fjalën në studim një grimë majtas. : NUMI C IF- N+ SHL ; Zbatimi i procedurës N+ është mjaft i thjeshtë: ju duhet të shtoni një në pjesën e sipërme të pirgut pa ndryshuar pjesën e sipërme. : N+ E2 1+ E2 ; Procedurat e përsëritshme mund të përmbajnë operacione RP dhe DO në trupat e tyre, duke çuar në sythe të mbivendosur dhe çdo thellësi foleje lejohet. Në këtë rast, ekziston një operacion EXT për të dalë nga laku i mbivendosur, që tregon thellësinë e foleve në krye të pirgut. Për shembull, dalja nga dy sythe të mbivendosur mund të specifikohet si kjo: Duhet të kihet parasysh se përdorimi i komandës EXT kërkon kujdes të shtuar, pasi gjatë modifikimit të programit, thellësia e foleve të sytheve mund të ndryshojë dhe konstanta përkatëse para EXT do të duhet të ndryshohet. Stacki i operandit është mekanizmi kryesor, por jo i vetmi për manipulimin e të dhënave në DSSP. Është gjithashtu e mundur, së bashku me përkufizimet e procedurave, të deklarohen elementë dhe koleksione të organizuara në mënyrë standarde të elementeve (të ashtuquajturat struktura) të të dhënave, të cilat më pas janë të disponueshme për përdorim me emrat e tyre. Duke zbatuar deklaratat e të dhënave, procesori rezervon memorien e nevojshme për t'i ruajtur ato dhe siguron mekanizmat e nevojshëm për qasje në këtë memorie. Gjuha bazë DSSP përfshin një numër fjalësh udhëzuese të diskutuara më poshtë për deklarimin e variablave dhe vargjeve. Për të zgjeruar gjuhën e sistemit, fjalë të tjera të këtij lloji dhe, në përputhje me rrethanat, elementë të tjerë dhe struktura të dhënash mund të futen në të. Fjala VAR deklaron një ndryshore numerike 16-bit. Për shembull, regjistroni deklaron një ndryshore X, domethënë i tregon procesorit se emri X është emri i një ndryshoreje. Procesori lidh me këtë emër një qelizë memorie 16-bitëshe në të cilën do të ruhet vlera e kësaj ndryshore. Udhëzimi për caktimin e ndryshores X në vlerën e vendosur në krye të stivit të operandit ka formën Duke ekzekutuar këtë komandë, procesori heq elementin e sipërm nga pirgu dhe e shkruan vlerën e tij në qelizën e caktuar për ndryshoren X. Një komandë e përbërë vetëm nga një emër variabli, pa shkronjën ! përpara saj, bën që vlera e kësaj variabli të shtyhet në pirg, dhe shtytja bëhet duke kopjuar përmbajtjen e qelizës përkatëse të memories, d.m.th. variabli mbetet i pandryshuar. Kështu, çdo shfaqje e emrit të ndryshores X në një program, përveç nëse paraprihet menjëherë nga një fjalë që specifikon një veprim tjetër, do të shtyjë vlerën aktuale të kësaj ndryshoreje në pirg, ashtu si numrat e dhënë drejtpërdrejt (literalet numerikë) shtyhen në pirg. . Si shembull, ne japim një version tjetër të procedurës GCD të diskutuar më sipër, në të cilin përdoren dy variabla pune. : NOD! X! Y RP HAPI X [GCD] ; : HAPI X Y = EX+ X Y BR+ X-Y Y-X ; : X-Y X Y - ! X ; : Y-X Y X - ! Y ; Siç mund ta shihni, programi është bërë disi më i gjatë, por dukshmëria e tij është rritur. Fjala VCTR deklaron një grup (vektor) njëdimensional me qeliza 16-bitësh, me numrin e elementit më të lartë të këtij grupi të dhënë nga vlera e kulmit. Për shembull, si rezultat i regjistrimit 9 VCTR ROW, procesori rezervon 10 fjalë memorie 16-bitëshe të adresueshme në mënyrë sekuenciale, duke formuar një vektor ROW(0:9). Së pari, numri 9 shtyhet në pirg dhe më pas ekzekutohet procedura VCTR, duke përdorur elementin e sipërm të pirgut për të përcaktuar gjatësinë e vektorit ROW që do të krijohet. Shtyrja e vlerës së elementit j të vektorit ROW në pirg, 0<=j<=9, задается командой [j]ROW Duke përdorur një numër elementi në pirg si parametër, emri i vektorit ROW bën që ai numër të zëvendësohet me vlerën e elementit përkatës. Nëse fjala! është menjëherë përpara emrit të vektorit ROW, atëherë elementit të këtij vektori të treguar nga kulmi i caktohet vlera e nënverteksit dhe thellësia e pirgut zvogëlohet me 2. Për shembull, mund të rivendosni Elementi i 5-të i vektorit ROW si ky: Gjithashtu është e mundur të kombinohen vektorët konstantë, d.m.th. vektorët e numrave 16-bit, vlerat e të cilëve përcaktohen kur deklarohet dhe nuk ndryshojnë më pas. Kështu, një vektor me konstante 16-bitësh VC me gjatësi L+1 deklarohet duke përdorur fjalën CNST në formën: CNST VC k0 k1 ... kL ; ku k0, k1, ... kL janë komanda që shtyjnë një vlerë në pirg. Më shpesh këto janë thjesht fjalë për fjalë numerike, por mund të ketë edhe emra variablash, procedurash, si dhe komanda të përbëra nga çifte fjalësh, si p.sh., komanda për dërgimin e adresës së ndryshores "X" e diskutuar më poshtë. Qasja në elementet e një vektori konstant bëhet në të njëjtën mënyrë si në komponentët e vektorëve të zakonshëm. Për shembull: Një grup shumëdimensional i fjalëve 16-bit deklarohet duke përdorur fjalën ARR, të paraprirë nga vlerat maksimale të indeksit për çdo dimension dhe numri i dimensioneve. Për shembull, grupi tredimensional TIR(0:8,0:2,0:24) deklarohet si ky: Numri 3 menjëherë përpara ARR tregon madhësinë e grupit të deklaruar. Shtyrja e një elementi të grupit në pirg arrihet duke specifikuar indeksin e atij elementi të ndjekur nga emri i grupit. Për shembull, komanda për të shtyrë elementin TIR(0,2,2) në pirg shprehet si Prandaj, caktimi i këtij elementi vlerën aktuale të pjesës së sipërme të pirgut specifikohet nga komanda Të gjithë shembujt e shqyrtuar ilustruan krijimin e strukturave nga fjalët 16-bit. Sidoqoftë, gjuha ju lejon gjithashtu të përcaktoni strukturat e fjalëve 32-bit dhe bajtit 8-bit. Për ta bërë këtë, parashtesa LONG ose BYTE vendoset përkatësisht përpara fjalës që përcakton strukturën. Për shembull, 5 BYTE VCTR X - përkufizimi i një vektori bajt me 6 komponentë X; BYTE CNST Y 65 66 67; - përkufizimi i një konstante të vektorit bajt me 3 komponentë Y; 10 20 2 LONG ARR MTRX - përcaktimi i matricës së fjalëve të gjata MTRX(0:10,0:20). Leximi i elementeve të strukturave të fjalës dhe bajtit kryhet në të njëjtën mënyrë si në rastin e strukturave të fjalëve 16-bit. Nëse gjatësia e elementit është më pak se 32 bit, vlera që do të merret vendoset në fjalën ose bajtin e ulët të pjesës së sipërme të pirgut dhe pjesa e lartë e sipërme vendoset në zero. Vlera e caktuar për një element të një strukture fjalë ose bajt është gjithashtu fjala ose bajt i ulët i një fjale të gjatë 32-bit në pirg. Megjithëse formati i fjalës 16-bit përdoret kur përcaktohen të dhënat si parazgjedhje, ai gjithashtu ka shënimin WORD. Është e këshillueshme që të përdoret kjo parashtesë kur programi synohet të transferohet në makineri të tjera, ku është implementuar edhe DSSP dhe parazgjedhja mund të jetë e ndryshme. Strukturat e të dhënave bajt përdoren më shpesh për të ruajtur dhe përpunuar informacionin e tekstit. Kjo shpjegohet me faktin se një bajt është ndarë në kujtesën e kompjuterit për të koduar një karakter. Për të specifikuar kodet e karaktereve në gjuhën RAYA ekziston një ndërtim #l, ku l është çdo karakter i disponueshëm në tastierën e kompjuterit. Procesori DSSP e percepton këtë ndërtim si një komandë për të shtyrë kodin e shkronjës l në pirg. Për shembull: Ky konstruksion kryen të njëjtat veprime si një literal numerik i barabartë me kodin e shkronjës së specifikuar, por përdorimi i tij është më i preferueshëm, pasi, së pari, ju çliron nga nevoja për të mbajtur mend kodet dhe, së dyti, i bën programet më të kuptueshëm. Në veçanti, ne mund të japim përkufizimin e mëposhtëm të vektorit konstant Y: BYTE CNST Y #A #B #C ; Shpesh është i përshtatshëm për të përdorur një shënim simbolik për një konstante numerike në një program. Për të ofruar këtë aftësi, ekziston një kualifikues VALUE: Kjo komandë nxjerr elementin e sipërm nga pirgu dhe formon një fjalë me emrin menjëherë pas VALUE. Përdorimi i kësaj fjale është i barabartë me përdorimin e një konstante numerike. Për shembull: Mjetet e konsideruara ofrojnë mundësinë për të emërtuar të dhëna dhe për të manipuluar të dhënat pavarësisht nga sistemi i adresave të kompjuterit. Por gjuha bazë përfshin gjithashtu mjete që ju lejojnë të manipuloni adresat e elementeve të kujtesës. Adresa e një ndryshoreje ose elementi të grupit X shtyhet në pirg me komandën Në rastin e një elementi vargu, kësaj komande i paraprin vlera e indeksit(eve). Komanda e gjuhës bazë @ zëvendëson adresën e sipërme të një fjale me kujtesë të gjatë me vlerën që përmban atë fjalë. Për shembull, vlera e ndryshores Y mund të shtyhet në pirg duke ekzekutuar rreshtin e mëposhtëm: Instruksioni @B zëvendëson adresën me vlerën e bajtit përkatës, duke i vendosur bajtet e larta në krye të stivit në zero, dhe instruksioni @L zëvendëson adresën me një fjalë 32-bit. Ekzistojnë gjithashtu komanda për shkrimin e vlerave në kujtesë. Instruksioni!T shkruan vlerën 16-bit të subtopit në adresën e hequr nga pjesa e sipërme e stivit. Komanda!TB shkakton një shkrim të ngjashëm të bajtit të ulët të nënverteksit me bajtin e adresuar nga kulmi, dhe!TL shkruan fjalën 32-bit të nënverteksit me fjalën e adresuar nga kulmi. Për shembull, mund t'i caktoni vlerën 15 elementit të pestë të vektorit të bajtit BV(0:5) me komandat e mëposhtme: 15 5" BV!TB Nevoja për të punuar me kujtesën në adresat fizike zakonisht lind kur krijohen programe që varen nga arkitektura e një kompjuteri të caktuar, për shembull, kur krijohen drejtuesit e hyrjes/daljes. Për të arritur efikasitet dhe kompaktësi më të madhe të programeve, operacionet e mëposhtme janë futur në gjuhën PARA: 0 <имя переменной>- rivendosni variablin; 1 <имя переменной>- t'i caktojë një njësi një ndryshoreje; 1- <имя переменной>- zvogëloni vlerën e ndryshores me një; 1+ <имя переменной>- rrit vlerën e ndryshores me një; !- <имя переменной>- të zbresë vlerën e majës së pirgut nga ndryshorja; !+ <имя переменной>- shtoni vlerën e majës së pirgut në variabël. Secili prej këtyre operacioneve programohet lehtësisht duke përdorur komandat e ndryshueshme të leximit dhe shkrimit. Për shembull, 0 X është e barabartë me 0! X 1+ X është e barabartë me X 1+! X X është e barabartë me X E2 - ! X Përdorimi i këtyre operacioneve rrit efikasitetin dhe dukshmërinë e programeve. Në praktikë, shpesh dëshironi të caktoni një vlerë të vetme për të gjithë elementët e një grupi. Për këtë qëllim është një operacion në gjuhën e Xhenetit!!!<имя массива>. Efekti i tij është të caktojë vlerën e majës së pirgut për të gjithë përbërësit e grupit të specifikuar. Operacioni!!! i zbatueshëm për vargje me elementë të çdo formati. Shembull përdorimi: Kodi i hapësirës është shkruar në të gjithë komponentët e grupit të bajtit BUF. Shpesh është e nevojshme të merret informacion nga një program në lidhje me strukturën e të dhënave pas një emri. A ka disa komanda SIZE për këtë? - shfaqni formatin e elementit të të dhënave: 1, 2 ose 4 bajt dhe DIM? - shfaq numrin e elementeve të të dhënave në strukturë. Për shembull, nëse të dhënat deklarohen 3 4 2 LONG ARR Z atëherë, kur zbatohen për to, këto komanda do të japin rezultatin e mëposhtëm (numrat dhjetorë): SIZE? X SIZE? Y SIZE? Z DIM? X DIM? Y DIM? Z Grupi i komandave të procesorit DSSP përfshin, si shtesë, katër komanda që ju lejojnë të lexoni dhe shkruani pjesë individuale të qelizave të memories së kompjuterit. Këto janë komandat @BI, !BI, !BI0, !BI1. Parametrat për secilën prej tyre janë adresa e fjalës së kujtesës në stek dhe numri i bitit në këtë fjalë (mos harroni se bitet numërohen nga e djathta në të majtë, duke filluar nga zero). Komanda!BI supozon gjithashtu se ka një vlerë bit në pirg që duhet të shkruhet. Komanda @BI zëvendëson parametrat e specifikuar me vlerën e bitit të përzgjedhur (0 ose 1), komandat!BI0 dhe!BI1 e vendosin bitin e zgjedhur respektivisht në 0 dhe 1, duke hequr parametrat e tyre nga staku dhe!BI komanda e vendos bitin e përzgjedhur në vlerën e bitit më pak të rëndësishëm të elementit të tretë të pirgut dhe i heq të tre parametrat e tij nga pirgu. Për shembull, nëse vlera e ndryshores X është numri binar 101101, atëherë rezultatet e operacioneve të listuara do të jenë si më poshtë: " X [shto.X] 3 @BI - biti i tretë i X, 0" X 3 !BI - X është 100101, " X [shto.X] 0 !BI0 - X është 100100, " X [shto.X] 1 !BI1 - X është e barabartë me 100110. Gjuha PARA ka gjithashtu mjete për të punuar me vargjet e bajteve të vendosura në memorie. Për të specifikuar një varg bajt, dy parametra shtyhen në pirg: adresa fillestare e vargut (d.m.th. adresa e bajtit të tij të parë) dhe gjatësia e vargut (numri i bajteve në të). Komanda!!!MB përdoret për të caktuar të gjitha bajtet e një vargu një vlerë (të specifikuar në rafte). Ai konsumon tre parametra nga steka: , ku b është vlera e caktuar, a dhe l janë përkatësisht adresa fillestare dhe gjatësia e vargut të bajtit. Le të, për shembull, duhet të rivendosni elementët nga grupi 3 në 10 bajt TXT(0:20). Për ta bërë këtë, mund të ekzekutoni rreshtin e mëposhtëm: 0 3 "TXT 8!!!MB si rezultat, tetë elementë të njëpasnjëshëm të grupit të specifikuar, duke filluar nga i treti, do të marrin vlerën 0. Një komandë e ngjashme!!!MW synon të mbushë një sekuencë fjalësh 16-bitësh me të njëjtën vlerë (numri i fjalëve tregohet në krye të pirgut), dhe komanda !!M - për të mbushur një sekuencë fjalësh të gjata. Komanda!SB kryen një transferim të vargut bajt. Parametrat e tij janë: , ku a1 dhe l janë adresa fillestare dhe gjatësia e vargut të përcjellë, a2 është adresa fillestare e vargut në të cilin kryhet përcjellja. Si rezultat i ekzekutimit të komandës!SB, një varg bajt me gjatësi l do të vendoset në memorie nga adresa a2, e cila është një kopje e saktë e vargut të vendosur në adresën a1 përpara se të kryhet transferimi. Vargu burimor dhe vargu i destinacionit mund të mbivendosen. Le të, për shembull, dëshironi të lëvizni elementet e grupit të bajtit M(0:10) si më poshtë: M(10):=M(9), M(9):=M(8), ..., M(1):= M(0). Për ta bërë këtë, mund të përdorni komandën !SB: 0 " M 10 C2 1+ !SB Si rezultat, një varg prej 10 bytesh do të zhvendoset me një bajt drejt rritjes së adresave të memories. Komanda!SB është e përshtatshme për të punuar me grupe karakteresh (mos harroni se çdo karakter është i koduar nga një bajt). Ai lejon, për shembull, të caktojë vlerën e një vargu literal të specifikuar në mënyrë eksplicite në një grup bajt. Për të specifikuar një varg të tillë, përdorni një tekst literal, d.m.th. një sekuencë karakteresh të mbyllura në thonjëza, për shembull "TEXT LITERAL". Ky konstrukt, kur haset në një program, bën që adresa fillestare dhe gjatësia e një vargu bajt që përmban tekstin e cituar të shtyhet në pirg. Këto parametra më pas mund të përdoren nga komanda!SB. Për shembull, fragmenti "TABLE" 0 " TN !SB do të bëjë që "TABEL" literal të përcillet në grupin TN. Komanda SRCHB kërkon një bajt të caktuar në një varg. Parametrat: , ku b është bajt, ndodhja e parë e të cilit duhet të gjendet, a dhe n përkatësisht specifikojnë adresën e fillimit dhe gjatësinë e vargut në të cilin po kryhet kërkimi. Nëse n>0, atëherë kërkimi kryhet nga adresa a në adresën a+n-1 (në drejtim të rritjes së adresave), nëse n<0, то поиск ведется с адреса a до адреса a+n+1 (в сторону убывания адресов). В результате выполнения этой команды в стеке оказывается значение d, равное смещению относительно адреса a до первого вхождения байта b. Если такое вхождение не обнаружено, то d=n. Примеры: #T "TEXT" SRCHB #NJË "TEKST" SRCHB #E "TEXT" [#E,a,4] 1- + -4 [#E,a+3,-4] SRCHB [-2] Duke përfunduar shqyrtimin tonë të mjeteve për të punuar me të dhëna, le të ndalemi në çështjen që lidhet me ruajtjen e të dhënave në memorien e jashtme të një kompjuteri, d.m.th. në disqe magnetike. Ekziston një komandë SAVE në gjuhën PARA<имя файла>, i cili udhëzon për të ruajtur një kopje të memories kryesore të sistemit në disk së bashku me objektet e përcaktuara nga përdoruesi. Në këtë rast, zonat e kujtesës të alokuara për të dhënat nga operacionet VAR, VCTR, ARR nuk dalin në disk. Si rezultat, kur ngarkoni një sistem të ruajtur nga disku, vlerat e të dhënave të specifikuara nuk përcaktohen (ato duhet të përcaktohen gjatë ekzekutimit të programit). Në shumicën e rasteve, kjo është e justifikuar, pasi nuk ka nevojë të harxhohet memoria e diskut për të ruajtur variablat e punës, buferët, etj. Sidoqoftë, ka të dhëna, vlerat e të cilave duhet të përcaktohen menjëherë pas nisjes së sistemit nga disku. Një shembull është një variabël që ruan shpejtësinë e shkëmbimit të të dhënave me ndonjë pajisje të jashtme. Kur kaloni në një kurs tjetër këmbimi, mjafton të ndryshoni vlerën e kësaj variabli pa bërë asnjë korrigjim në program. Një tregues për procesorin që vlerat e elementeve të një strukture të caktuar të të dhënave duhet të dalin në disk duke përdorur komandën SAVE është prefiksi FIX i vendosur përpara përcaktimit të strukturës, për shembull. FIX VAR SPEED 20 FIX BYTE VCTR TABL Puna me strukturat e të dhënave të përcaktuara në këtë mënyrë nuk ndryshon nga puna me strukturat e përcaktuara në mënyrën e zakonshme. Gjuha PARA ka një grup të vogël komandash të krijuara për të kontrolluar procesorin DSSP, ose më saktë, emulatorin e procesorit DSSP. Komanda RESTART bën që procesori të rifillojë. Në këtë rast, pirgja pastrohet dhe shfaqet një mesazh Versioni DSSP XX.XX.XX Në dispozicion XXXXXW dhe procesori kalon në modalitetin e gatishmërisë për hyrjen e komandës. Kjo komandë mund të jetë e dobishme kur korrigjoni programet. Ai ekzekutohet gjithashtu kur ndodhin situata gabimi: indeksi shkon përtej kufijve të grupit, memoria e lirë shterohet, etj. Komanda \G përdoret për të vazhduar ekzekutimin e programit pas ndalimit në një fjalë të papërcaktuar. Nëse, gjatë ekzekutimit të një procedure, procesori ndeshet me një referencë për një fjalë të papërcaktuar, ai lëshon një mesazh: ndalo nuk e di<слово> . ku pika është prompti i procesorit DSSP, duke sinjalizuar se procesori është në gjendje të ndalur në një fjalë të papërcaktuar. Në këtë mënyrë, ju mund të ekzekutoni çdo komandë procesori, ashtu si në modalitetin normal, kur ylli është prompt. Ka dy mënyra për të dalë nga kjo mënyrë - ose duke ekzekutuar komandën \G (më pas procesori do të vazhdojë të ekzekutojë procedurën e ndërprerë, duke anashkaluar fjalën e papërcaktuar), ose duke përdorur komandën RESTART. Komanda EXEC i thotë procesorit të ekzekutojë një procedurë adresa e së cilës është në krye të stackit. Për të marrë adresën e një procedure, përdorni komandën "" (dy apostrofa), e ndjekur nga emri i procedurës. Për shembull, si rezultat i ekzekutimit të komandës Adresa e procedurës ABS do të shtyhet në pirg. Këto komanda ju lejojnë të kaloni një procedurë si parametër në një procedurë tjetër. Grupi i komandave të kontrollit të procesorit përfshin operacionin SAVE të përmendur tashmë<имя файла>, i cili udhëzon për të ruajtur një kopje të sistemit në disk, si dhe komandat që përcaktojnë burimin hyrës të informacionit të tekstit të dhënë në hyrjen e procesorit. Fillimisht, ky burim është tastiera e ekranit. Komanda LOAD<имя файла>ndërron hyrjen në skedarin e diskut me emrin e specifikuar. Komanda PF - ju udhëzon të futni komanda nga buferi i redaktuesit të tekstit. Komanda TEXEC kalon një varg teksti në hyrjen e procesorit, parametrat e të cilit janë të specifikuara në stek. Pas ekzekutimit të komandave të përfshira në burimet e specifikuara, hyrja kalon automatikisht në tastierën e ekranit. Rrjedha e komandës hyrëse e perceptuar nga procesori, në veçanti, mund të përmbajë komanda për përcaktimin e procedurave dhe të dhënave, duke shkaktuar kompilimin në një paraqitje të brendshme dhe ruajtjen e trupit të procedurës ose ndarjen e memories për të dhënat e specifikuara, si dhe futjen e emrit të procedurës së përpiluar ose strukturës së të dhënave në fjalorin DSSP. Fjalori vendos një korrespondencë midis emrave të jashtëm (të përdorur në tekstin e programit) dhe adresave të objekteve që korrespondojnë me këta emra në paraqitjen e brendshme. Kur përpunon një përkufizim të procedurës ose përshkrim të një të dhënë të emërtuar, përpunuesi zgjeron fjalorin, duke formuar një hyrje të re fjalori në të që përmban emrin (më saktë, 7 karakteret e para të emrit) dhe adresën e trupit të procedurës ose përshkruesi i të dhënave të lidhur me këtë emër. Kur programoni nga lart-poshtë, trupat e procedurës mund të përmbajnë referenca për objekte ende të pa përcaktuara. Në këtë rast, në fjalor formohen hyrjet (titujt) e fjalorit, të shënuara me shenjën e pasigurisë. Për të shfaqur të gjithë emrat e papërcaktuar në ekranin e ekranit, përdorni komandën UNDEF. Gjatë zgjerimit të fjalorit, është e mundur të formohen nën-fjalor - koleksione të emërtuara të hyrjeve të fjalorit. Një nënfjalë zakonisht kombinon procedurat dhe strukturat e të dhënave që lidhen me të njëjtën detyrë. Për të shmangur konfuzionin midis emrave të nën-fjalorve dhe objekteve të tjera të programit, emri i një nën-fjalori duhet të fillojë me shkronjën $. Qasja në nën-fjalë për zgjerimin ose përdorimin e tyre mund të hapet dhe mbyllet me komanda të veçanta, të cilat përfshijnë sa më poshtë (emri $v do të thotë çdo nën-fjalë i vlefshëm). GROW $v - rritni nëndarjen $v, domethënë, derisa të udhëzohet ndryshe, futni emrat e të gjitha procedurave dhe të dhënave të përpiluara në nën-fjalorin $v; USE $v - i hapur për përdorim (për të kërkuar emra në të) nën-fjalori $v; SHUT $v - mbyllni mundësinë për të përdorur nën-fjalorin $v; VETËM $v - bëjeni të disponueshëm për përdorim vetëm nën-fjalorin $v; ANULON - anuloni VETËM të fundit. Ekziston edhe një komandë?$, e cila printon në ekran emrat e të gjithë nën-fjalorve dhe statusin e tyre - nëse nëndarja është e hapur apo e mbyllur për kërkim. Nënfjalori emri i të cilit është shtypur në krye është gjithmonë i zgjeruar. Procedurat bazë të DSSP përbëjnë një nën-fjalor të quajtur $PRIME, i hapur për përdorim dhe shtrirje si parazgjedhje, domethënë nëse nuk kishte asnjë komandë që udhëzon zgjerimin e një nën-fjalori tjetër. Le të përdorim, për shembull, operacionin?$ për të printuar gjendjen tjetër të nën-fjalorve. $PRG është i hapur $PRIME është i hapur $EDIT është mbyllur $PRIME është i hapur SISTEMI është i mbyllur Kjo do të thotë që në momentin që nën-fjalori $PRG është i hapur për rritje dhe përdorim, $PRIME është vetëm për përdorim dhe $EDIT dhe SYSTEM nuk janë të disponueshme. Vini re se një nënfjalë mund të përbëhet nga disa seksione me të njëjtët emra. Ekzistojnë komanda për fshirjen nga fjalori të një grupi të veçantë hyrjesh fjalori dhe, ndoshta, objekte të brendshme që lidhen me to. Kështu, komanda FORGET $v fshin të gjithë emrat e futur në fjalor (jo vetëm në fjalorin $v) që nga ekzekutimi i fundit i komandës GROW $v, së bashku me objektet e përcaktuara me këta emra, dhe anulon rritjen e $v. nënfjalor. Komanda PROGRAM $v kryen të njëjtat veprime si komandat FORGET $v GROW $v të ekzekutuara në mënyrë sekuenciale. Prania e një komande të tillë në fillim të çdo programi çon në faktin se kur programi të ripërpilohet, kopja e tij e vjetër do të fshihet dhe do të formohet një nënfjalë për të ruajtur objektet e kopjes së re të programit. Për shembull, duke kryer operacionin FORGET $PRIME në fjalor, gjendja e të cilit u tregua më lart, marrim një gjendje të re: $EDIT është mbyllur $PRIME është i hapur SISTEMI është i mbyllur Gjatë ekzekutimit të komandës FORGET shfaqen emrat e seksioneve që do të fshihen. Ju lutemi vini re se emri i nën-fjalorit SYSTEM nuk fillon me shkronjën $. Kjo është e pranueshme, por çon në faktin se aplikimi i komandave FORGET dhe RPOGRAM në këtë nën-fjalë nuk shkakton asnjë veprim (nëndifjalori SYSTEM nuk duket se ekziston për ta). Për shkak të faktit se në një program të gatshëm, për shumicën dërrmuese të procedurave, nuk kërkohet qasja me emër të jashtëm, është e mundur që emrat e tyre të hiqen nga fjalori duke ruajtur objektet e brendshme që lidhen me to. Komanda CLEAR $v heq të gjithë emrat nga të gjitha seksionet e nën-fjalorit $v, me përjashtim të atyre që u paraprinë në tekstin e programit (kur ishin përcaktuar) me prefiksin:: (dy dy pika). Për shembull, si rezultat i procesorit që ekzekuton fragmentin e mëposhtëm të programit: :: : X+ Y !+ X ; CLEAR $EXAM Në nën-fjalorin $EXAM, do të mbeten vetëm emrat X dhe X+, hyrja e fjalorit Y do të hiqet (edhe pse ndryshorja që korrespondon me fjalën Y në paraqitjen e brendshme do të mbetet). Mjeti kryesor i ndërveprimit të përdoruesit me DSSP është terminali, i cili zakonisht është një ekran me rreze katodike me një tastierë. Nga terminali kryhet futja fillestare, redaktimi dhe korrigjimi i programeve, përgatitja e të dhënave dhe i gjithë menaxhimi i sistemit. Programet dhe të dhënat, si dhe vetë DSSP, ruhen si skedarë në disqe dhe mund të printohen në një printer. Për të kontrolluar hyrjen/daljet, grupi i procedurave bazë DSSP përmban mjetet e përshkruara më poshtë. Programimi i funksionimit të terminalit sigurohet nga komandat për hyrjen dhe daljen e numrave, karakteret individuale dhe sekuencat e karaktereve (strings), si dhe disa komanda shtesë. Komanda TIB (Terminal Input Byte) fillon një lak që pret që një tast të shtypet në tastierën e terminalit. Kur shtypet një tast, kodi 8-bit i karakterit përkatës futet në pirg si bajt më pak i rëndësishëm në pjesën e sipërme, me 3 bajt më të lartë që përmbajnë zero. Një kopje e karakterit të futur në këtë mënyrë shfaqet në ekran. Ekziston edhe një komandë TRB (Terminal Read Byte), e cila ndryshon nga TIB në atë që dërgimi i kodit të letrës së futur në stek nuk shoqërohet me shfaqjen e kësaj shkronje në ekran. Komanda TIN (Terminal Input Number) fillon një cikël të futjes së një numri në pirg dhe shfaqjes së një numri të shtypur nga tastiera. Numri që futni duhet të jetë një sekuencë shifrash që mund të fillojë me një shenjë minus dhe të përfundojë me Çdo komandë TIN fut një numër. Nëse duhet të futni një sekuencë numrash në një rresht, ato duhet të ndahen duke shtypur tastin Një sekuencë që përmban n karaktere të shtypura nga tastiera futet në memorien e kompjuterit në formën e n bajteve, të vendosura në adresa në rritje të vazhdueshme, duke filluar me adresën a, duke përdorur komandën TIS (Terminal Input String), përpara së cilës adresa a dhe numri e karaktereve n janë shtyrë në pirg. Për shembull, le të deklarohet një vektor me bajt X me gjatësi të mjaftueshme. Duhet të futni 9 karaktere, duke i caktuar vlerat e tyre elementeve të këtij vektori, duke filluar me elementin zero: Në mënyrë të ngjashme, duke përdorur komandën TOS, specifikohet dalja e një sekuence prej n bajt-litra me adresën fillestare a: Dalja në terminalin e elementeve të tekstit të përfshirë drejtpërdrejt në program sigurohet nga dizajni ."<текст>" Për shembull, në mënyrë që teksti ENTER OPTION NUMBER të shfaqet në ekran gjatë ekzekutimit të një fragmenti të caktuar programi, fragmenti duhet të përmbajë hyrjen "ENTER OPTION NUMBER". Komanda TON (Numri i daljes së terminalit) shfaq numrin e marrë nga pjesa e sipërme e pirgut dhe gjatësia e fushës së daljes duhet të specifikohet në krye. Numri i daljes është rreshtuar në skajin e djathtë të fushës, pozicionet e lira në të majtë janë të mbushura me hapësira dhe nëse gjatësia e numrit tejkalon gjatësinë e specifikuar të fushës, atëherë prerja ndodh në të majtë. Në modalitetin I/O dhjetore, numrat negativë fillojnë me një shenjë minus. Komanda TOB (bajti i daljes së terminalit) printon karakterin, kodi i të cilit specifikohet nga bajt i ulët i pjesës së sipërme të stivit. Thellësia e pirgut zvogëlohet me 1. Ekzistojnë gjithashtu komanda që kontrollojnë drejtpërdrejt kursorin e ekranit: CR - shkoni në fillim të një linje të re, SP - hapësira, domethënë lëvizja e një pozicioni në të djathtë. Komanda BELL shkakton një sinjal të shkurtër zanor ("zile"). Ndonjëherë, kur komunikoni me një terminal, është e nevojshme të kontrolloni nëse një tast tashmë është shtypur dhe nëse ekrani ka përpunuar tashmë komandën e mëparshme të daljes. Kjo mund të bëhet me komandat TTI (Terminal Test Input) dhe TTO (Terminal Test Output), të cilat lënë një 1 në pirg nëse ndodh ngjarja e specifikuar, dhe 0 ndryshe. Komandat e daljes së printerit janë të ngjashme me komandat e daljes së terminalit dhe bazohen në një kujtesë të ngjashme në të cilën shkronjat LP (Printer linjash) ose kanë zëvendësuar TO ose janë shtuar si karaktere kryesore. Për shembull, LPCR - kalimi në fillimin e një rreshti të ri, LPSP - hapësira, LPN - dalja e një numri nga një subvertex në fushën e specifikuar nga kulmi, LPB - prodhimi i një karakteri, LPS - prodhimi i një vargu karakteresh . Ekziston edhe komanda [N] LPT, e cila lëviz kokën e printimit në pozicionin N të rreshtit që do të printohet, dhe komanda LPFF, e cila ushqen një fletë letre. Për të printuar tekst të qartë, është e përshtatshme të përdorni një tekst literal dhe komandën LPS, për shembull: "TABELA E VLERAVE TË FUNKSIONIT" LPS Kur programoni pajisje periferike, bëhet e nevojshme të merreni me ndërprerje. Në DSSP ky përpunim programohet si më poshtë. Programi i krijuar për të trajtuar ndërprerjen është një procedurë e rregullt DSSP, përcaktimi i së cilës paraprihet nga prefiksi INT, për shembull INT: A !1+ I ; Prefiksi INT siguron që gjendja e procesorit të ruhet gjatë një ndërprerjeje dhe të rikthehet kur përpunohet ndërprerja. Për të lidhur një program përpunimi me një ndërprerje specifike, përdorni komandën LINK: <адрес вектора>LIDHJE<имя процедуры>kur ekzekutohet, një thirrje për procedurën e trajtimit të ndërprerjeve regjistrohet përgjatë vektorit përkatës. Komanda LINK mund të kryejë si lidhjen statike të një procedure me një ndërprerje, e cila ndodh në momentin e kompilimit të programit, ashtu edhe lidhjen dinamike, gjatë ekzekutimit të programit. Një ndërprerje e procesorit është një mënyrë që sistemi të njoftohet për një ngjarje që ka ndodhur në botën e jashtme. Ngjarjet që kërkojnë përpunim të menjëhershëm mund të ndodhin gjithashtu në program. Ato quhen situata të jashtëzakonshme. Shembuj të situatave të tilla: pjesëtimi me zero, gabimi i komunikimit me pajisjen, fundi i skedarit të hyrjes, etj. Në DSSP, situatat e përjashtimit regjistrohen duke përdorur ndërprerjet e komandës. Ndërprerja e komandës është një operacion i emërtuar i thirrjes së një procedure përgjigjeje dhe deklarohet si më poshtë: KURT<имя вызова> <конечная реакция> Për shembull: Kurthi S1 "Situata S1." Në rastin e parë, reagimi përfundimtar ndaj ndërprerjes S është procedura X, në të dytën, kur ndodh ndërprerja S1, në terminal do të shfaqet mesazhi i mëposhtëm: Situata S1. Një program ekzekutimi i të cilit mund të shkaktojë një ndërprerje mund të vendosë përgjigjen e tij ndaj tij duke përdorur komandën intercept. DSSP ofron dy lloje të përgjimeve: ON dhe EON. Komandat e përgjimit mund të përdoren vetëm brenda procedurave dhe kanë formatin: AKTIV<имя прерывания> <реакция> EON<имя прерывания> <реакция>Për shembull: : A ... ON S "Ndërprerje S" ... ; : A1 ... EON S1 ABC ... ; ON dhe EON vendosin lloje të ndryshme reagimesh. Nëse një reagim i ri specifikohet nga komanda ON, atëherë kur ndodh një ndërprerje, ekzekutohet procedura e reagimit, pas së cilës programi i ndërprerë vazhdon të funksionojë. Nëse një reaksion specifikohet nga instruksioni EON, atëherë së pari grumbulli i operandit merr thellësinë që kishte në momentin e ekzekutimit të instruksionit EON, atëherë reaksioni ekzekutohet dhe pas përfundimit ekzekutimi i procedurës në të cilën EON udhëzimi është përdorur ndalon menjëherë. Le të shohim shembuj. Procedura M fut shkronja nga tastiera e terminalit dhe kontrollon nëse është një numër. Nëse karakteri i futur nuk është një shifër, ndërprerja ND rritet. Kurthi ND "Jo një numër." : M RP M1 ; : M1 TRB [B] C #0< C2 #9 >&0 IF+ ND [B] TOB ; Reagimi përfundimtar ndaj një ndërprerjeje ND është mesazhi: Jo një numër. Nëse M thirret nga procedura P1, e cila ka përgjigjen e vet ndaj ndërprerjes ND: P1 ON ND PR1 M ; : PR1 [B] CR "Gabim." D #0 [#0] ; atëherë kur futet një karakter jo dixhital, ndërprerja ND do të përpunohet nga programi i reagimit PR1 të tipit ON, i cili do të bëjë që mesazhi të lëshohet në një linjë të re: Gabim. Karakteri i futur do të zëvendësohet me karakterin 0, pas së cilës M do të vazhdojë të punojë. Nëse M thirret nga procedura P2: P2 EON ND PR2 M ; : PR2 CR "Gabim. Fundi i hyrjes." ; atëherë kur futet një karakter jo dixhital, ndërprerja ND do të përpunohet nga programi i reagimit të tipit PR2 EON, i cili do të bëjë që mesazhi të lëshohet në një linjë të re: Gabim. Fundi i hyrjes., pas së cilës P2 do të dalë. Staku i operandit do të jetë bosh. Nëse është e nevojshme, ndërprerja mund të ngrihet përsëri në programin e reagimit, duke e shtrirë atë në programet e nivelit më të lartë. Në këtë rast, ose programi i specifikuar në komandën intercept në procedurën e mbylljes ose reagimi përfundimtar do të trajtojë ndërprerjen. Për shembull, nëse modifikoni PR2 si më poshtë: : PR2 CR "Gabim. Fundi i hyrjes." N.D.; atëherë mesazhi i shfaqur në terminal do të jetë si ky: Gabim. Fundi i hyrjes. Jo një numër. DSSP ka disa ndërprerje komanduese të integruara, përgjigja ndaj të cilave mund të sigurohet në programet e përdoruesve. Esselamu alejkum ue rohmetullahi ue berakatuhu! Ue alejkum selam ue rahmetullahi ue berakatuh! Et-Taberani në el-Ausat, nga fjalët e Ebu Hurejres, transmeton: Shejh el-Albani e solli te Silsila el-Daifa numri 161, duke i thënë: “Ky hadith është fiktiv (meudu). Në realitet, nuk ka asnjë hadith të vetëm të besueshëm që shpjegon se çfarë gjuhe do të flasin banorët e Xhenetit, prandaj është e nevojshme të heshtni dhe të mos zhyteni në biseda për këtë çështje, duke ia lënë diturinë Allahut të Madhëruar dhe të angazhoheni vetëm në çfarë do të çojë në kryerjen e atyre veprave që do të sjellin përfitime në botën tjetër! Gjuha është një sistem shenjash që ju lejon të kaloni nga kuptimi dhe kuptimi i një koncepti në përcaktimin e tij. Njeriu është një qenie verbale dhe, ndryshe nga kafshët, komunikon me llojin e tij duke përdorur gjuhën. Ndonjëherë ata flasin për "gjuhën e kafshëve", por është e qartë se një shprehje e tillë është e kushtëzuar - në pasurinë dhe aftësitë e saj, gjuha e kafshëve nuk është e ngjashme me atë të njeriut. Engjëjt nuk kanë nevojë fare për gjuhën për komunikimin e tyre - është e vështirë t'i imagjinosh ata duke folur rusisht ose anglisht. Funksionet e gjuhës mund të jenë të ndryshme - përveç transmetimit të informacionit, ajo ndihmon në shprehjen e ndjenjave dhe vlerësimeve. Gjuha e Kishës është gjuha e lutjes, e adhurimit dhe e Shkrimit. Në disa fe, tekstet e shenjta fillimisht ekzistojnë në një gjuhë dhe konsiderohen thelbësisht të papërkthyeshme. Kështu, Kurani mysliman fillimisht u përpilua në arabisht. Për më tepër, muslimanët besojnë se kështu është krijuar ky libër në fillim të kohës. Skribët hebrenj ishin gjithashtu të prirur drejt idesë së mundësisë së teksteve të shenjta vetëm në hebraisht. Ky nuk ishte rasti me Shkrimin e Krishterë në radhë të parë. Në shekullin III para Krishtit. Përfundoi i ashtuquajturi "përkthim i të shtatëdhjetëve" - Septuaginta - një përkthim i Dhiatës së Vjetër në greqisht. Për më tepër, disa studiues besojnë se ishte Septuaginta që luajti rolin e Shkrimit të Shenjtë në kohët ndërtestamentale. Ishte ekzistenca e Septuagintës që u bë argumenti kryesor në favor të përkthyeshmërisë themelore të Shkrimit. Megjithatë, ka një edhe më të fortë. Tani konsiderohet e provuar se Krishti u foli në gjuhën aramaike apostujve. Por hartuesit e ungjijve, pa dyshim, këto biseda i kanë përcjellë në greqisht. Tani ka një drejtim shkencor - rindërtimet gjuhësore. Përpiluesit e tyre po përpiqen të kuptojnë se si tingëlluan këto dialogë në origjinal. Por kjo është ende një temë e kërkimit shkencor. Kur përktheni një gjuhë në një gjuhë, ndonjëherë lindin probleme sepse gjuhët nuk janë gramatikisht identike. Kuptimet dhe nuancat e fjalëve në gjuhë të ndryshme janë gjithashtu të ndryshme. Për shembull, shprehja "parajsa është një vend i gjelbër dhe i freskët" tregon qartë se Shkrimi u krijua në vende me klimë të nxehtë, ku "freskia" është mjaft e këndshme. Në rusisht, shoqata të tilla vështirë se do të lindnin. Dhe folja "qetësohu" në kuptimin "relakso", "kalo një kohë të mirë" erdhi në rusisht si një letër gjurmuese nga hebraishtja në greqisht. Shkrimi nuk iu soll paraardhësve tanë në Rusisht. Kirili dhe Metodi - grekët e Selanikut - zhvilluan një gjuhë të re të shkruar të bazuar në gjuhën e folur të sllavëve të Selanikut. Ka shumë popuj në botë që përdorin gjuhë që nuk kanë gjuhë të shkruar. Për sa kohë që flasim për përditshmërinë, nuk ka probleme. Por, sapo një tekst fetar ose traktat filozofik duhet të përkthehet në një gjuhë të tillë, gjuha duhet të përmirësohet, gjë që bëri Kirili dhe Metodi. Nëse supozojmë se ishte më e lehtë për fiset sllave disa mijëra vjet më parë të pajtoheshin mes tyre sesa për popujt modernë sllavë, atëherë do të kemi të drejtë - gjuhët ishin më afër. Por kjo nuk do të thotë se përkthimi i Shkrimit i bërë nga Kirili dhe Metodi ishte më i kuptueshëm për njerëzit e Kievit dhe Novgorodit - gjuha letrare e shkruar ishte ndryshe. Ndoshta kjo është një veçori e situatës ruse, pasi gjuha letrare ruse është më afër me sllavishten kishtare sesa me dialektin e Moskës. Në fakt, e gjithë gjuha kishtare sllave hyri në rusisht si një "qetësi e lartë". Për shembull, edhe pjesët moderne - të tilla si qarja, vrapimi - formohen pikërisht sipas modelit sllav të kishës - në rusishten e vjetër do të ishte "qarë", "vrap". Ndonjëherë analogët e vjetër rusë u hoqën fare - "të mira" dhe "bologoe" në emrin "Bologoe"; "shelom", i cili është vetëm në epika, në kontrast me "helmet". Në Rusinë e lashtë ekzistonte një situatë diglosia. Kjo nuk është njësoj si "dygjuhësia". Diglosia është përdorimi i dy gjuhëve paralelisht në shoqëri. Për shembull, në shekullin e 19-të përdoreshin si rusisht ashtu edhe frëngjisht. Frëngjishtja ishte gjuha e shoqërisë së lartë, por, në parim, çdo tekst mund të përkthehej. Në diglossia, gjuhët nuk mbivendosen në sferën e tyre të përdorimit. Ata flisnin rusisht të vjetër dhe mund të shkruanin shënime të përditshme në rusishten e vjetër. Por ata u lutën në gjuhën sllave kishtare. Kjo situatë ekzistonte para Pjetrit; në shekullin e 18-të ajo gradualisht u shemb. Tani shkenca dhe letërsia mund të zhvillohen në rusisht, por vetëm lutjet ekzistojnë ende në sllavishten e kishës. Përkthejeni reklamën në sllavishten e kishës dhe do të duket si shaka ose blasfemi. Ne jetojmë në një epokë unike. Në Rusinë cariste, Bibla mund të lexohej në rusisht, në Rusinë e lashtë mund të dëgjohej në sllavishten kishtare. Por shumica e njerëzve ishin analfabetë ose të paarsimuar sa duhet për të lexuar dhe kuptuar Shkrimin. Në kohët sovjetike, të gjithë u bënë të shkolluar, por nuk kishte asnjë tekst të Shkrimit. Tani shkrim-leximi është ende i ruajtur dhe tekstet janë të aksesueshme. Përveç vetë Shkrimit, ne jemi të ftuar të zotërojmë një numër të caktuar tekstesh sllave - nga lutjet tek adhurimet. Vërtetë, përkthimi ekzistues në rusisht është disi i vështirë për t'u kuptuar. Në shekullin e 19-të, duke mos pasur analoge, përkthyesit shpesh transferuan sllavizmat në përkthim. Kështu u përkthye në përkthim shprehja “Unë jam bariu i mirë”. Dhe këtu ka disa vështirësi. Një përkthim fjalë për fjalë nga greqishtja do të ishte: "Unë jam një bari i mirë", por një përkthim i tillë perceptohet si i ulët. Nga ana tjetër, tani dëgjuesi i thjeshtë do ta perceptojë "bariun" sublim më tepër si "prift". Sidoqoftë, duhet pranuar se një përkthim fjalë për fjalë në rusisht i shumë thënieve biblike është i pamundur - fraza "përmes buzëve të një fëmije e vërteta flet" nuk do të perceptohet si një thënie filozofike. Por në përgjithësi, perceptimi i tekstit sllav të Biblës pengohet më shumë nga moskuptimi i kuptimit, sesa i fjalëve. Një vështirësi më vete janë strukturat gramatikore. Për shembull, ka një sërë përmirësimesh që vijnë nga greqishtja. "Fali mëkatet dhe shkeljet" thjesht do të thotë fali të gjitha mëkatet. Konstruksione të tilla si "Isha i zemëruar nga zemërimi" dhe "Kam dashur me dashuri" janë të ngjashme. Kur përkthen tekste të shenjta në gjuhë të tjera, lindin edhe probleme (megjithëse popujt në gjuhët e të cilëve Shkrimet ende nuk janë përkthyer janë, ndoshta, 5℅ e popullsisë së Tokës). Domethënë, puna që Kirili dhe Metodi bënë për sllavët vazhdon. Cyril dhe Methodius nuk ishin të parët - para kësaj kishte përkthime në Etiopi dhe Gotik. Pas Kirilit dhe Metodit, Stefani i Permit përktheu Shkrimet në gjuhën Zyryane. A konsiderohet çdo përkthim një tekst i shenjtë? Jo, por vetëm në masën që pranohet në bashkësitë kishtare. Për shembull, përkthimi sinodal si përkthim liturgjik nuk është i ndaluar, por nuk pranohet. Por si i tillë përdoret nga protestantët, për shembull, baptistët rusë. Madje ka lëvizje moderne të protestantizmit që besojnë se teksti biblik duhet të jetë i arritshëm për të gjithë. Botohen gjithashtu komike të bazuara në histori biblike. Nuk ka probleme me tekstin e Dhiatës së Re - burimi i tij është i njohur në greqisht. Por baza për përkthimin sinodal të Dhiatës së Vjetër ishte teksti hebraik. Fragmente nga përkthimi greqisht u futën vetëm kur mospërputhjet ishin thelbësore. Në versionin modern, do të ishte mirë të kishim dy përkthime - të dyja nga tekstet masoretike hebraike dhe nga greqishtja. Kjo do të ishte e përshtatshme për ata që nuk i dinë të dyja gjuhët. Pas fjalimit, kryepriftit Aleksandër iu drejtuan disa pyetje: – Çfarë gjuhe fliste Adami? - Vështirë të thuash. Nga njëra anë, gjuha ndryshon sa është gjallë. Por askush nuk e di nëse kjo ishte një pronë e re e gjuhëve që u shfaq pas ndërtimit të Kullës së Babelit. Por gjithsesi, gjuha e Adamit ndoshta nuk ngjante me asnjë gjuhë tjetër ekzistuese, përfshirë hebraishten. – A ka aktualisht një debat rreth përkthimit të shërbimeve hyjnore në Rusisht? – Kjo ide u diskutua edhe para revolucionit dhe pjesërisht u komprometua nga rinovatorët. Ata nuk shërbyen të gjithë në rusisht, por ideja u mbështet nga ata. Përkthimi i Biblës në Rusisht nuk ishte i lehtë, megjithëse ideja e Mitropolitit Filaret se ishte e nevojshme të përkthehej nga hebraishtja dhe greqishtja ishte një vendim i mençur. Edhe pse kjo nuk na dha përkthime shkencore nga të dyja gjuhët. Ka raste të izoluara të përdorimit të gjuhës ruse - lutja e pleqve të Optinës dhe akathistit "Lavdi Zotit për gjithçka" fillimisht u shkruan në Rusisht. Ka kaq shumë përkthime të tjera dhe aq shumë nuanca do të lindin gjatë kryerjes së tyre, sa që është më e lehtë të rusëzosh pak tekstet sesa t'i përkthen ato. Ky proces ka vazhduar në mënyrë spontane për një kohë të gjatë. Ndonjëherë ndodhin incidente: për shembull, në "Ritin e dasmës" numri i dyfishtë ndonjëherë zëvendësohet papritur nga shumësi, dhe në akathistët modernë përdoret në mënyrë jokonsistente. – Si merr pjesë Providenca Hyjnore në formimin e gjuhëve të ndryshme? – Gjuha ekziston jashtë vullnetit të njeriut. Një person mund të krijojë Esperanto, por gjuhët natyrore ekzistojnë sipas ligjeve të tyre. Cirili dhe Metodi u përkthyen në sllavishten kishtare me frymëzim nga lart, por edhe sipas modelit që ekzistonte në atë kohë. Me frymëzim nga lart, duke shkruar Ungjijtë në greqisht, apostujt hodhën idenë e përkthyeshmërisë së Ungjillit. Përgatitur nga Daria Mendeleeva Foto nga Dmitry Kuzmin PYETJE:
Assalamualaikum po! Kam hasur në këtë artikull. Nese nuk gabohem ke shkruar te kunderten. Nëse nuk është e vështirë, mund ta komentoni përsëri këtë artikull. musliman. Arabishtja është gjuha e Kuranit. Është zgjedhur ndër të gjitha gjuhët e botës dhe ka veti të jashtëzakonshme. Kjo gjuhë është edhe gjuha e profetit Muhamed a.s. Kjo gjuhë është e pasur dhe asnjë nga gjuhët botërore nuk mund të konkurrojë me të. Ka një efekt shpirtëror dhe fizik te folësi i gjuhës. Më parë, arabët organizonin konkurse poezie, por kur Profeti (a.s) mori Shpalljen, arabët u mahnitën aq shumë me një shprehje kaq të mrekullueshme të gjuhës, madje disa menduan se Kurani kishte një efekt magjik te një person. Nëse dikush dëshiron të korrigjojë një fjalë ose shkronjë nga Kurani, e gjithë harmonia e librit hyjnor do të prishet. Asnjë fjalë e Kuranit nuk duhet ndryshuar, përndryshe do të ndryshojë kuptimi dhe fonetika. Ne e dimë se disa fjalë kanë tendencë të bëhen të vjetëruara me kalimin e kohës dhe ne nuk i përdorim ato. Dhe gjuha e Kuranit nuk e ka humbur rëndësinë e saj për 1439 vjet ... Mësoj Kuranin për më shumë se 10 vjet dhe deri më sot nuk kam parë kurrë një nga nxënësit e mi të më bëjë pyetjen: “Pse e studiojmë Kuranin? Nga erdhi? Çfarë përfitimesh ka? Çfarë e bën atë të ndryshëm nga leximi nga e majta në të djathtë? Ditë pas dite, numri i njerëzve që dëshirojnë të mësojnë alfabetin arab dhe rregullat e Tazhuid, në mënyrë që më pas të lexojnë Kuranin nga origjinali, po rritet. Por pak njerëz mendojnë për përgjigjen e pyetjeve të mësipërme. Dhe së fundi, kur u shpjegoj atyre dobitë e Kuranit, për përfitimet e tij, shumë fillojnë të thellohen në të. Arabishtja ka 29 shkronja. Tingujt formohen në kufirin e laringut, në mes të laringut, gjoksit, midis rrënjës së gjuhës dhe zgavrës me gojë. Tingujt e gjuhës arabe "pastrojnë" zgavrën me gojë dhe janë më pak të ndjeshëm ndaj sëmundjeve. Gjithashtu, arabishtja është një terapist i mirë i të folurit. Shëron buzët dhe shqiptimin e gabuar të shkronjës "r". Kjo gjuhë ndihmon edhe ata me dëmtime shikimi. Sepse leximi i tekstit arab nga e majta në të djathtë përmirëson aparatin vizual të një personi dhe e relakson atë. Forma ovale dhe e rrumbullakët e shkronjave gjithashtu ka një efekt të mirë në psikikën. Të gjitha shkronjat e alfabetit arab kanë tinguj bashkëtingëllore. Nuk ka shkronja të veçanta për të përfaqësuar tingujt e zanoreve. Ka zanore të shkurtra dhe të gjata. Zanoret e shkurtra përcillen me shkrim duke përdorur zanoret - mbishkrimet dhe shenjat e nënshkrimit. Gjithashtu, nga 28 shkronja, 22 shkronja janë të lidhura në të dyja anët, dhe 6 shkronja janë të lidhura vetëm në të djathtë. Kurani ka arritur tek ne pa shtrembërim për 23 vjet. Kurani është libri i fundit hyjnor dhe pas tij nuk do të ketë libra të tjerë. Ajo iu dërgua mbarë njerëzimit. Ligjet e Kuranit do të mbeten në fuqi deri në ditën e gjykimit dhe nuk do të ndryshojnë. Kurani është një mrekulli e përjetshme, e madhe e të Plotfuqishmit, dhënë Profetit Muhamed (a.s.). Leximi i Kuranit është një formë adhurimi. Unë i këshilloj të gjithëve ta lexojnë çdo ditë këtë libër pakrahasueshëm të mrekullueshëm dhe të dinë kuptimin e tij. Nxitoni të mësoni të lexoni dhe të flisni me Krijuesin tuaj. Allahu na dhëntë që të jemi banorë të Xhenetit dhe të flasim arabisht, të cilën Ai vetë e zgjodhi. Dilyar Bektaeva, ustaz Aktobe rajonale xhamia qendrore "Nur Gasyr" http://nurgasyr.kz/index.php/ma-alar/1826-yazyk-zhitelej-dzhannata
PËRGJIGJE:
ue alejkum si selam vëlla! Njerëzit si ajo, "ustazët e rremë" të rritur në shtëpi dhe injorantë, duhet të largohen nga muslimanët që të mos i mashtrojnë ata me të. Meqenëse xhamia e Aktobe përhap të tilla marrëzi dhe mban mësues injorantë, ndoshta kjo është arsyeja pse ka kaq shumë sektarë ekstremistë në këtë qytet. Nuk ka as një aluzion të largët as në Kuran dhe as në Sunet se arabishtja do të jetë gjuha e përbashkët për të gjithë banorët e Xhenetit. Mendoni vetë, si do të komunikojnë përfaqësuesit e kombësive të tjera me njëri-tjetrin në Parajsë nëse nuk dinë arabisht?!! Më parë iu përgjigj një pyetjeje të ngjashme:Të dhënat e emërtuara
Puna me kujtesën sipas adresave fizike
Operacione shtesë për të punuar me të dhëna dhe memorie
Komandat e kontrollit të procesorit
Komandat e kontrollit të fjalorit
Komandat I/O
Trajtimi i ndërprerjeve dhe përjashtimeve
“Arabishtja është gjuha e banorëve të Xhenetit!” (kuptimi i përafërt)
Të nderuar vëllezër, ju kërkoj të sqaroni pyetjen në lidhje me këtë hadith, a është i besueshëm? Në përgjithësi, a janë këto fjalë fjalët e profetit Muhamed, alejhi selam?
BarakAllahu fikum ue xhazakumullahu khair!
“I Dërguari i Allahut, lavdia dhe paqja e Allahut qofshin mbi të, ka thënë: “Unë jam arab, Kurani është në gjuhën arabe dhe gjuha e vendbanimeve të Xhenetit do të jetë arabishtja.”
Shejhul-Islam Ibn Tejmije, Allahu e mëshiroftë, është pyetur: “Çfarë gjuhe do të flasin njerëzit në Ditën e Kiametit? A do t'u drejtohet Allahu i Plotfuqishëm njerëzve në arabisht? Dhe a është e vërtetë që gjuha e banorëve të Xhehenemit është persishtja dhe ajo e banorëve të Xhenetit është arabishtja?
Për të cilën ai u përgjigj: “Falënderimi i takon Allahut, Zotit të botëve! Nuk dihet se çfarë gjuhe do të flasin njerëzit atë ditë, ashtu siç nuk dihet se në çfarë gjuhe do t'u flasë Zoti i tyre i madh dhe i lavdishëm. As Allahu i Madhëruar dhe as i Dërguari i tij, paqja dhe bekimet qofshin mbi të, nuk na kanë thënë asgjë për këtë, dhe gjithashtu nuk është e besueshme që gjuha e banorëve të Xhehenemit të jetë persishtja, kurse gjuha e banorëve të Xhenetit do të jetë arabishtja. Dhe ne nuk e dimë se për këtë çështje ka pasur ndonjë mosmarrëveshje mes sahabëve, Allahu qoftë i kënaqur me ta. Përkundrazi, ata nuk e bëjnë këtë, sepse të flasësh për këtë është e kotë. Megjithatë, midis gjeneratave të mëvonshme u ngritën mosmarrëveshje lidhur me këtë çështje. Disa thanë se do të komunikonin në arabisht, të tjerë thanë se kjo nuk vlen për banorët e Xhehenemit, pasi ata do të përgjigjen në persisht dhe kjo është gjuha e tyre në Ferr. E treta është që njerëzit do të komunikojnë në asirianisht, pasi kjo është gjuha e Adamit, nga e cila kanë origjinën të gjitha gjuhët e tjera. E katërta - se kjo nuk vlen për banorët e Xhenetit, pasi ata do të komunikojnë në gjuhën arabe. Megjithatë, asnjëri prej tyre nuk ka asnjë provë për të mbështetur fjalët e tyre, qoftë nga arsyeja apo nga burimet e Sheriatit, por këto janë vetëm deklarata pa asnjë provë. Allahu i Madhëruar e di më mirë!” Shih Mexhmu'ul Fetava 4/299.A mund të përkthehet Shkrimi?
A është vërtet në parajsë?–Ftohtë?
A e kuptuan të gjithë sllavët Biblën?
Gjuhët janë të afërta dhe... paralele
Prift apo bari?
Përkthime të shenjta dhe profane
Përgjigjet në pyetje