Divat stílus

Paradicsomi nyelv. Az interaktív programozási rendszer adaptív nyelve dsp. Fordítások szent és profán

Paradicsomi nyelv.  Az interaktív programozási rendszer adaptív nyelve dsp.  Fordítások szent és profán

1. Ez egy történet arról szól, hogy az emberek abbahagyták egymás megértését, és a modern világ számos nyelve megjelent. Mennyire népszerű ez a mítosz a különböző népek körében, és mi az értelmezése?

2. A Bábel-torony mítosza nemcsak azon a hiedelmen alapszik, hogy kezdetben az egész emberiség ugyanazt a nyelvet beszélte, hanem azon is, hogy ez a nyelv „ideális” volt: a tárgyak nevei a valódi lényegüket közvetítették. Más kultúrák képviselői osztják-e ezeket a nézeteket, és úgy gondolják, hogy az ő nyelvük áll a legközelebb az eredetihez?

Az első kérdésre a választ az Ószövetség 1Mózes 11:1-9-e kínálja, ahol azt mondják, hogy Isten úgy döntött, hogy megbünteti az emberi fajt a nyelvek összezavarásának átkával. A második kérdésre a válasz az 1Móz 2:19-ben található. Ebben a részben Isten elhozta Ádámhoz az összes állatot és madarat, hogy meghallja, hogyan hívja őket Ádám, és „ahogy az ember minden élőlényt hív, ez volt a neve”. Egy rögtönzött kulturális túra lehetővé teszi számunkra, hogy meglássuk, hogyan fedik le ezeket a kérdéseket. Ezek közül az elsőt illetően sokan egyetértenek az Ószövetséggel: a nyelvek sokfélesége az Úr büntetése, vagy legalábbis valamilyen kedvezőtlen tényező eredménye.

Az egyik ausztrál törzs legendája az idős emberek étkezéséről mesél. Azok a törzsek, amelyek magát a testet ették, „tiszta” nyelvet beszéltek, azok pedig, akik a belső szerveket ették, „tisztátlan” nyelvet. Az afrikai kabilok úgy vélik, hogy a konfliktus következtében az emberek különböző nyelveket kezdtek beszélni. Egy Assamból származó törzs szerint a nyelvek zavara annak a ténynek volt köszönhető, hogy egyszer három gyerek vadászott egy patkányt. Az egyik amazóniai törzs azon a véleményen van, hogy Isten megosztotta az embereket és nyelveiket, hogy engedelmesebbek legyenek neki. Amerika bennszülött lakossága körében, a Maidu törzsben (Kalifornia) úgy tartják, hogy kezdetben az emberek ugyanazt a nyelvet beszélték, de egy napon, a temetési szertartáson a nyelv megszűnt egy nyelv lenni. Az irokézek úgy vélik, hogy a nyelvek szétválása egy családi veszekedés miatt történt, amely egy gyermek halálához vezetett. De az a feltételezés, hogy a többnyelvűség átok, nem olyan gyakori, mint amilyennek látszik. A világon számos olyan változat létezik, amely szerint az elválás természetes folyamatok miatt következett be.

Az ősi indiai „Rigveda” szent himnusz megemlíti, hogy valaha volt egy Vak („szó”), és az istenek sokféle formára osztották. Az Indokínai-félsziget népei hat fajról beszélnek, amelyek mindegyikének megvolt a maga nyelve egy tökből kanyargó szár formájában. A Quiche törzs (Guatemala) egy mítosza szerint az emberek együtt éltek és ugyanazt a nyelvet beszélték, amíg csoportokra nem osztották őket. Mindegyik választott magának egy istent, és a saját nyelvén kezdett beszélni.

A dél-amerikai navahó törzs teremtési mítosza a "Változó Nőről" és az ő nyelvét beszélő valódi népek megjelenéséről mesél. Így teremtett szomszédos népeket - a pueblókat, a mexikói bennszülötteket és másokat, és a saját nyelvüket beszélték, és ezeket különböző irányokba terjesztették. Az iszlámban a Korán azt tanítja, hogy Ádám nem talált ki neveket vagy bármi mást, hanem Allah tanította meg mindenre. A nyelvek sokfélesége teljesen természetes, és Allah erejének megnyilvánulása. Minden ember képes megérteni a Korán kinyilatkoztatásait, bármilyen nyelven is írják.

A világ számos népének mitológiai rendszere nem tud magyarázatot adni a nyelvek összetévesztésére, amely egyszerűen magától értetődő, ezért kérdésünkre nem tud válaszolni. Azonban a világ szinte minden kultúrájában szó esik az „ideális” nyelvről (2. kérdés). Fentebb említettük az ausztrál törzset, amely úgy véli, hogy egyes emberek (az emberi testből táplálkozva) „tiszta” nyelvet beszélnek, amely a dolgok valódi lényegét közvetíti. Az ókori egyiptomiak szerint Ptah isten mindennek nevet adott, így a nyelv az istenek ajándéka lett. Kínában a "helyes" nyelvet a mitikus császárok tanították. A Korán a nyelvek sokféleségét egyetlen nyelv felosztásának tekinti, amely magában foglalja az összes többit.

Az emberek mindenhol megpróbálják megérteni, hogy az alany neve hogyan fedi fel a lényegét. Feltételezik, hogy vagy ma létezik az "ideális" nyelv, amely leírja a szubjektum valódi lényegét, vagy a múltban maradt. A második feltevés az igazság és a harmónia keresésének előfeltétele a világban. Úgy tűnik, a nyelvnek a való világgal és az emberi léttel való kapcsolatáról szóló elképzelések beágyazódnak elménkbe. Ezzel kapcsolatban felmerül egy kérdés, amely először Platón „Cratylus” című dialógusában hangzott el, és azóta is állandó vita tárgya: vajon természetes-e a kapcsolat a név és a dolgok objektív lényege között (amely az anyanyelvi beszélő szubjektív tudatában merül fel) ) vagy ez a kapcsolat feltételes és véletlenszerű?

A nyelv olyan jelrendszer, amely lehetővé teszi, hogy a fogalom jelentésétől és jelentésétől a megjelölésig elmozduljunk.

Az ember verbális lény, és az állatokkal ellentétben a nyelv segítségével kommunikál saját fajtájával. Néha az "állatok nyelvéről" beszélnek, de nyilvánvaló, hogy egy ilyen kifejezés feltételes - gazdagságában és képességeiben az állatok nyelve nem hasonlít az emberi nyelvhez. Az angyaloknak a kommunikációjukhoz egyáltalán nincs szükségük nyelvre - nehéz elképzelni, hogy oroszul vagy angolul beszéljenek.

A nyelv funkciói különbözőek lehetnek - az információ közvetítése mellett segíti az érzések, értékelések kifejezését.

Lefordítható a Szentírás?

Az Egyház nyelve az ima, az istentisztelet és a Szentírás nyelve.

Egyes vallásokban a szent szövegek kezdetben egy nyelven léteznek, és alapvetően lefordíthatatlanok. Így a muszlim Korán eredetileg arabul íródott. Sőt, a muszlimok úgy vélik, hogy ez a könyv így született az idők kezdetén.

A zsidó írástudók is hajlottak arra az elképzelésre, hogy a szent szövegek csak héberül lehetségesek. Kezdetben nem így volt a Keresztény Írásokkal.

A Kr.e. III. században. az úgynevezett "hetven fordítása" - a Septuaginta - az Ószövetség görögre fordítása. Sőt, egyes kutatók úgy vélik, hogy az intertestamentális időkben a Septuaginta játszotta a Szentírás szerepét.

A Septuaginta létezése volt az, ami a fő érv a Szentírás alapvető lefordíthatósága mellett szólt. Van azonban egy még erősebb is. Ma már bizonyítottnak tekintik, hogy Krisztus arámul beszélt az apostolokhoz. De az evangéliumok összeállítói habozás nélkül görögül közvetítették ezeket a beszélgetéseket.

Most van egy tudományos irány - a nyelvi rekonstrukciók. Összeállítóik megpróbálják megérteni, hogyan hangzottak ezek a párbeszédek az eredetiben. Ez azonban még mindig tudományos vizsgálatok tárgya.

A paradicsomban vanHideg?

Amikor egy nyelvet lefordítanak nyelvre, néha problémák merülnek fel, mert a nyelvek nyelvtanilag nem azonosak. A különböző nyelveken a szavak jelentése és árnyalata is eltérő.

Például a "paradicsom zöld és hűvös hely" kifejezés egyértelműen azt mutatja, hogy a Szentírást olyan országokban írták, ahol meleg éghajlat uralkodik, ahol a "hűvösség" meglehetősen kellemes. Oroszul ilyen asszociációk aligha merültek volna fel. A „lehűlni” ige pedig a „pihenni”, „jól érezni magát” értelemben pauszpapírként került az oroszba a hébertől a görögig.

Minden szláv megértette a Bibliát?

A Szentírást nem oroszul hozták el őseinkhez. Cirill és Metód – a szaloniki görögök – új írott nyelvet fejlesztettek ki a thesszalonikai szlávok beszélt nyelvén.

Sok nép van a világon, akik olyan nyelveket használnak, amelyeknek nincs írott nyelvük. Amíg az életről beszélünk, addig nincs gond. De amint egy vallási szöveget vagy egy filozófiai értekezést le kell fordítani egy ilyen nyelvre, a nyelvet javítani kell, amit Cirill és Metód meg is tett.

Ha feltételezzük, hogy több ezer évvel ezelőtt a szláv törzsek könnyebben megegyeztek egymással, mint a modern szláv népek, akkor igazunk lesz - a nyelvek közelebb voltak. De ez nem jelenti azt, hogy a Cirill és Metód által készített Szentírás-fordítás érthetőbb volt Kijev és Novgorod lakossága számára – az írott irodalmi nyelv más volt.

Talán ez az orosz helyzet sajátossága, hiszen az orosz irodalmi nyelv közelebb áll az egyházi szlávhoz, mint a moszkvai dialektushoz. Valójában az egész egyházi szláv nyelv „nagy nyugalomként” lépett be az orosz nyelvbe. Például még a modern tagmondatokat is - például sírást, futást - pontosan az egyházi szláv minta szerint alakítják ki - az óoroszban ez „sírás”, „futás” lesz.

Néha a régi orosz analógok teljesen kiestek - „jó” és „bologo” a „Bologoe” névben; "Sisak", ami csak az eposzokban van, ellentétben a "sisakkal".

Nyelvek közel és… párhuzamosak

Az ókori Ruszban diglosszia volt. Nem ez a "kétnyelvűség". A diglossia két nyelv párhuzamos használata a társadalomban. Például a 19. században az orosz és a francia nyelvet is használták. A francia a felsőoktatás nyelve volt, de elvileg bármilyen szöveget le lehetett fordítani.

A diglossziában a nyelvek nem metszik egymást a használat szempontjából. Óoroszul beszéltek, háztartási jegyzetet tudtak írni óoroszul. De ők egyházi szláv nyelven imádkoztak.

Ez a helyzet Péter előtt is fennállt, a 18. században fokozatosan összeomlott. Most a tudomány és az irodalom fejlődhetett oroszul, de egyházi szláv nyelven továbbra is csak az imák léteznek. Fordítsa le a hirdetést egyházi szláv nyelvre, és úgy fog kinézni, mint egy vicc vagy istenkáromlás.

Pap vagy lelkész?

Egyedülálló korszakban élünk. A cári Oroszországban a Bibliát oroszul, az ókori Ruszban egyházi szláv nyelven lehetett hallgatni. De a legtöbb ember írástudatlan volt, vagy nem volt elég képzett ahhoz, hogy olvassa és megértse a Szentírást.

A szovjet időkben mindenki írástudó lett, de a Szentírás szövege nem volt.

Az írástudás továbbra is megmaradt, és szövegek állnak rendelkezésre.

Magán a Szentíráson kívül további szláv szövegek elsajátítására is felkérünk minket – az imáktól az istentiszteletekig. Igaz, a meglévő orosz fordítást kissé nehéz megérteni. A 19. században a fordítók analógiák nélkül gyakran átültették a szlavonizmusokat fordításba.

Így az „én vagyok a jó pásztor” kifejezés átkerült a fordításba. És itt van néhány nehézség. Egy szó szerinti görög fordítás így hangzik: „Jó pásztor vagyok”, de az ilyen fordítást alacsonynak tartják. Másrészt ma már az egyszerű hallgató a magasztos „lelkészt” inkább „papként” fogja fel. Mindazonáltal el kell ismerni, hogy számos bibliai mondás szó szerinti orosz nyelvű fordítása lehetetlen – a „gyermek szája igazat mond” kifejezés – nem fogható filozófiai mondásnak.

De általában a Biblia szláv szövegének megértését inkább a jelentés félreértése nehezíti, mint a szavak.

Külön nehézséget jelentenek a nyelvtani szerkezetek. Például számos olyan erősítés létezik, amelyek görög nyelvből származnak. A „bocsásd meg a bűnöket és vétkeket” egyszerűen azt jelenti, hogy bocsáss meg minden bűnt. Hasonlóak a „haragtól mérges”, „szeretettel szeretve” típusú konstrukciók.

A szent szövegek más nyelvekre történő fordításakor is problémák merülnek fel (bár azok a népek, amelyek nyelvére még nem fordították le a Szentírást, a Föld lakosságának talán 5℅-át teszik ki). Vagyis folytatódik az a munka, amelyet Cirill és Metód a szlávok érdekében végzett.

Cirill és Metód nem voltak az elsők – előtte voltak etióp, gótikus fordítások. Cirill és Metód után a permi Stefan fordította le a Szentírást zír nyelvre.

Fordítások szent és profán

Minden fordítás szent szövegnek számít? Nem, de csak annyiban, amennyire az egyházi közösségekben elfogadják. Például a zsinati fordítás mint liturgikus fordítás nem tiltott, de nem is elfogadott. De a protestánsok, például az orosz baptisták így használják.

Még a protestantizmus modern áramlatai is úgy vélik, hogy a bibliai szövegnek mindenki számára hozzáférhetőnek kell lennie. Bibliai képregények is megjelennek.

Az Újszövetség szövegével nincs probléma – forrása görögül ismert. De az Ószövetség zsinati fordításának alapja a héber szöveg volt. A görög fordítás töredékeit csak akkor szúrták be, ha az eltérések alapvetőek voltak.

A modern változatban jó lenne két fordítás – mind a héber maszoréta szövegekből, mind a görögből. Kényelmes lenne azoknak, akik nem ismerik mindkét nyelvet.

Válaszok kérdésekre

A beszéd után Sándor főpapnak több kérdést tettek fel:

Milyen nyelven beszélt Ádám?

- Nehéz megmondani. Egyrészt a nyelv változik, amíg él. De senki sem tudja, hogy ez nem a nyelvek új tulajdonsága volt-e, amely a Bábel-torony építése után jelent meg.

De mindenesetre Ádám nyelve valószínűleg nem hasonlított egyetlen létező nyelvhez sem, beleértve a héber nyelvet is.

Van-e vita a szolgáltatás oroszra fordításáról?

– Ez az ötlet már a forradalom előtt is szóba került, részben a felújítók kompromittálták. Nem mindegyik oroszul szolgált, de az ötletet ők támogatták.

A Biblia oroszra fordítása nem volt könnyű, bár Philaret metropolita ötlete, hogy mind a héberről, mind a görögről le kell fordítani, bölcs döntés volt. Bár így nem kaptunk tudományos fordítást mindkét nyelvről.

Az orosz nyelv használatának külön esetei vannak - az Optina vének imája és az akatista "Dicsőség Istennek mindenért" eredetileg oroszul íródott.

Annyi más fordítás van, és annyi árnyalat lesz a megvalósításuk, hogy könnyebb oroszosítani a szövegeket, mint lefordítani.

Ez a folyamat már régóta spontán módon zajlik. Néha előfordulnak incidensek: például az „Esküvői rítusban” a kettős számot néha váratlanul többes számra cserélik, a modern akatistákban pedig következetlenül használják.

Hogyan vesz részt az isteni Gondviselés a különböző nyelvek kialakításában?

„A nyelv túlmutat az emberi akaraton. Egy személy létrehozhat eszperantót, de a természetes nyelvek saját törvényeik szerint léteznek.

Cirillt és Metódot a felülről jövő ihlet, de az akkoriban létező modell is lefordította egyházi szláv nyelvre.

Az apostolok felülről jövő sugallatra, az evangéliumok görög nyelvű lejegyzésével alapozták meg az evangélium lefordításának gondolatát.

Felkészítő: Daria Mendeleeva

Fotó: Dmitry Kuzmin

A DSSP interaktív programozási rendszer PARA adaptív nyelve.

A PARA nyelv általános leírása

A nyelvi fejlesztés célja és célja

A PARA (Evolved Adaptive Language) a DSSP Conversational System for Structured Programming alapnyelve. Basic - azt jelenti, hogy az alapnyelv fejlesztésével (bővítésével, megerősítésével) és esetleg az így létrehozott nyelvi eszközök egy adott alkalmazáshoz való adaptálásával minden további DSSP-ben végzett konstrukció alapja. Az úgynevezett magas szintű nyelvekkel ellentétben a PARA nem ad kész adattípusokat és műveleteket, hanem csak elemeket és primitíveket ad a szükséges típusok hatékony meghatározásához. Például az eredeti adatformátumok 8 bites bájt, 16 bites szó és 32 bites hosszú szó, amelyeket a rajtuk végrehajtott műveletek függvényében egész számokként, logikai vektorokként, karakterkódokként, logikai értékekként, adatokként és eljárásként értelmeznek. mutatók. Ebben az esetben lehetőség van egyrészt a bájtok és szavak egyes bitjeinek manipulálására, másrészt összetett adategységek (több hosszúságú szavak, vektorok, tömbök, szövegsorok stb.) kialakítására, ilyen vagy olyan értelmezést szabva számukra a megfelelő műveletek bevezetése. Tehát a szükséges hosszúságú és értéktartományú valós számok, komplex számok és egyéb objektumok bevezethetők, és a nyelv adott alkalmazásra fókuszált verziója tartalmazni fogja az alkalmazásban rejlő objektumokat és eszközöket, és nem tartalmazza azt, ami nem vonatkozik. hozzá - a nyelv az alkalmazáshoz lesz igazítva (igazítva). A DSSP fejlesztése egy széles körben elérhető és hatékony mikroszámítógép-programozási eszköz létrehozását tűzte ki célul, pl. mikroprocesszoron alapuló számítógépek. A mikroprocesszorok architektúrájának lényeges jellemzője az adattípusok és műveletek elemi jellege, ami egyrészt egyetemességet, másrészt a programozás összetettségét jelenti. Sokoldalúságuk miatt a mikroprocesszorok és az ezekre épülő mikroszámítógépek potenciálisan korlátlan alkalmazási területtel rendelkeznek. E lehetőségek gyakorlati megvalósítása azonban elsősorban a szükséges pályázati programok kidolgozásának bonyolultságán múlik. Ezen túlmenően kielégítő alkalmazási programok csak az adott alkalmazások sajátosságainak mély és finom ismeretében hozhatók létre, pl. ezeket nem csak programozóknak kell kidolgozniuk, hanem egy adott terület magasan képzett szakembereinek. Ezért a programozási rendszernek nemcsak a programozók termelékenységét kell nagymértékben növelnie, hanem olyan egyszerűnek kell lennie, hogy a nem professzionális programozók is elsajátíthassák és hatékonyan tudják használni.

A probléma radikális megoldása nyilvánvalóan a számítógép-architektúra jelentős egyszerűsítése lenne. De sajnos a mikroszámítógépek architektúrája homlokegyenest ellenkező irányba fejlődik - a növekvő komplexitás és kifinomultság útján, így a professzionális programozónak ma már nem könnyű elsajátítania a mikroszámítógép-összeállítás nyelvét. Az olyan rendszerprogramozási nyelvek, mint a C vagy a PL/M, bizonyos (bár messze nem elégséges) mértékig csökkentették a szoftverfejlesztés bonyolultságát, de a programozási szakmában járatlanoknak aligha ajánlhatók. A széles körben hozzáférhető nyelvnek természetesen egyszerűbbnek és természetesebbnek kell lennie, a programozás lényegéről és technikájáról a leghétköznapibb, megszokott elképzeléseken kell alapulnia.

A DSSP a hozzáférhetőségen és az assembly nyelvű programozáshoz képest a programok fejlesztésének összetettségének jelentős csökkentésén túlmenően megkövetelte a nyelv egyetemességét, ugyanúgy, mint az assembly nyelvét, nagy gépi hatékonyságot (azaz a kód tömörségét és gyorsaságát). , a létrehozott programok ellenőrizhetőségének megbízhatósága és szervizelhetősége.és módosíthatósága, valamint a rendszer és a benne fejlesztett programok mobilitása (hordozhatósága) különböző architektúrájú gépekre.

eljárási programozás

A PARADISE nyelvű programozás nagyon hasonlít az olyan elterjedt emberi tevékenységtípusokhoz, mint az egymással összefüggő tevékenységek, munkák, folyamatok tervezése és szervezése vagy összetett anyagi objektumok - gépek, aggregátumok, szerkezetek - tervezése. Mint egy konstruktor, amely az ötletét az alkotórészek (blokkok, összeállítások, alkatrészek) összesítésével valósítja meg, a programozó a nyelv által biztosított egyszerű műveletekből szintetizálja a szükséges összetett műveletet. Azt is mondhatjuk, hogy a programozás (konstrukció) a megvalósított objektum egyre kisebb komponensekre történő fokozatos szétbontásából (bontásából) áll.

A Paradicsom nyelvén a fő "konstruktív" egy eljárás - egy elnevezett cselekvés. A nyelv a legegyszerűbb eljárások (primitívek) korlátozott halmazán alapul, amelyeket saját nevükkel (jelöléseik) képviselnek. Például: + jelentése "hozzáadás", NEG jelentése "fordított előjel", VCTR jelentése "vektor létrehozása". Különösen vannak primitívek: és; (kettőspont és pontosvessző), lehetővé téve egy új eljárás bevezetését, például P névvel, P1, P2, ..., PN eljárások sorozataként definiálva a formában

: P P1 P2 ... PN ;

Ha a P eljárás azt a műveletet jelöli, amelyet a létrehozott programnak végre kell hajtania, akkor ennek a programnak a PARA nyelv segítségével történő felépítése a P1, P2, ..., PN eljárások egymás utáni részletezésére redukálódik. Ez azt jelenti, hogy ezen eljárások mindegyikét kisebb eljárások sorozatával kell meghatározni, amelyeket aztán még kisebb eljárások sorozatai határoznak meg, és így tovább, amíg csak primitívekből álló definíciókat nem kapunk.

A programnak ezt a felépítését, amely egy adott célból indul ki, és fokozatosan bontja le az alkalmazott eljárásokat az alapvető nyelvi jellemzők szintjére, felülről lefelé történő programozásnak nevezzük. Ez a fő módja a PARADISE nyelvű programok beszerzésének egyéni, jól definiált feladatok megoldására. Ennek ellentéte az alulról felfelé építkező programozás – egy bizonyos problématerületre fókuszáló, fokozatosan bővülő eljárások rendszerének alapnyelvére építve. Ezáltal a nyelv fejlesztése és egy adott alkalmazáshoz való adaptálása valósul meg.

Mindkét esetben elengedhetetlen a készülő programok gondos strukturálása: minden programnak és minden programrésznek kis számú különálló részből kell állnia, amelyek mindegyike meghatározott funkciót lát el, és lehetővé teszi az autonóm ellenőrzést. A PARA nyelvvel kapcsolatban ez különösen azt jelenti, hogy az eljárások definíciói legyenek rövidek: a definiáló sorozat általában nem tartalmazhat 5-7 tagnál többet. A strukturálás biztosítja a program érthetőségét, tesztelhetőségét és módosíthatóságát, jelentősen csökkenti létrehozásának és karbantartásának bonyolultságát.

A fenti példa a P eljárás meghatározására egyszerűsített. Valójában a definiáló sorozat tagjaiként nemcsak eljárások neveit, hanem több szóból álló előírásokat (parancsokat) is tartalmazhat. Az eljárás neve, más szavakkal nem kombinálva, az általa kijelölt eljárás végrehajtására szolgáló parancs. Az eljárásnevek sorrendje ezeknek az eljárásoknak a végrehajtását a nevük egymás utáni sorrendjében (lineáris sorrendben) utasítja. Egyéb végrehajtási szekvenciák beállításához a PARA speciális szavakat (előtagokat) biztosít, amelyek a velük együtt megnevezett eljárások végrehajtását írják elő a megadott feltételtől függően, valamint az eljárás többszöri (ciklikus) végrehajtását.

Például a P0 P1 lineáris sorozat a P0 eljárás végrehajtását, majd a P1 eljárás végrehajtását idézi elő. Ha a P1 eljárást nem mindig kell végrehajtani, hanem csak akkor, ha a P0 végrehajtása eredményeként pozitív számot kapunk, akkor a P1 helyett a végrehajtási parancs a következő feltétel szerint íródik: HA + P1, azaz. P0 P1 helyett P0 IF+ P1 lesz. A PARA tartalmaz egy sor előtag-feltételt, amely lehetővé teszi egy feltétel végrehajtásának hatékony kifejezését, valamint két, három vagy több eljárás közül választhat.

Egy eljárás többszörös végrehajtását az RP előtag adja meg. Tehát az RP P parancs a P eljárás újra és újra végrehajtását idézi elő, amíg létre nem jönnek azok a feltételek, amelyek mellett az eljárás törzsében lévő EX aktiválódik - kilépés a ciklusból, majd a következő parancs végrehajtásra kerül sor lineáris sorrendben. . A ciklusból való kilépés feltétele lehet például valamely X változó nullával való egyenlősége, amelyet a következőképpen fejezünk ki:

Azt az eljárást, amelynek neve egy másik eljárás definíciójában szerepel, beágyazottnak nevezzük. Egy beágyazott eljárás, ha nem primitív, viszont tartalmazhat beágyazott eljárásokat, pl. a fészkelés többféle lehet. Ezen túlmenően a PARA nyelv szabályai nem tiltják, hogy a definícióban szerepeljen saját elnevezésű eljárás, vagy ezt a nevet tartalmazó eljárás neve, pl. A PARA lehetővé teszi a rekurziót.

Egy többször végrehajtott eljárás is beágyazható egy többször végrehajtott eljárásba. Ebben az esetben a hurkok egymásba ágyazása történik. A PARADISE lehetővé teszi a hurkok többszörös egymásba ágyazását.

Parancsok lineáris sorrendje, egymásba ágyazás, eljárások feltételes és ciklikus egymásba ágyazása – ez kimeríti a RAYA nyelvű programok felépítésének lehetőségeit. Ezen eszközök szűkössége, homogenitása és természetessége a kulcsa a nyelv könnyű elsajátításának és használatának. Ugyanakkor ez egy szigorúan felépített programozási nyelv, amely jelentősen csökkenti a fejlesztés bonyolultságát és a programok megbízhatóságát.

Eljárások és adatok

Mindaz, ami eddig elhangzott, a PARADISE nyelv sajátossága, mint a cselekvések előírásának, a primitív műveletek véges halmazából tetszőleges cselekvések felépítésének eszköze. A nyelv másik oldala az olyan objektumok ábrázolásának eszközei, amelyeken műveleteket hajtanak végre - az adatok ábrázolásának és rendszerezésének eszközei.

Egy rendkívül egyszerű adatelem egy kétértékű elem - egy kicsit. A bitek az összes többi adatformátum és adattípus építőkövei. A PARADISE nyelvben a 8 bites bájt, a 16 bites szó és a 32 bites hosszú szó elfogadott alapformátumként. A rajtuk végrehajtott műveletektől függően a bájtok, szavak és hosszú szavak sokféle értelmezésnek vannak kitéve, pl. alapul szolgálhat különféle típusú adatokhoz. Ezenkívül ezek a kezdeti elemek az összetett formátumok és típusok kialakításához.

Valójában a PARADISE nem tartalmaz sem egyszerű, sem összetett adattípusokat – csak alapvető formátumok (byte, szó, hosszú szó) vannak, és ezekből összetett formátumok létrehozására szolgáló eszközök: vektorok és többdimenziós tömbök. Ebben az esetben ugyanazok a bájtok (szavak, hosszú szavak) a rajtuk végrehajtott műveletektől függően bitvektorokként, vagy előjeles vagy előjel nélküli bináris egészekként, vagy a bemeneti/kimeneti ábécé betűiként stb. Az adattípusok és a hozzájuk tartozó megszorítások és ellenőrzések bevezethetők a tartományspecifikus nyelvi kiterjesztésekbe.

Az adatnevek deklarálása az alapnyelvben csak azt a funkciót látja el, hogy név szerint hozzáférést biztosítson az adatokhoz: a névhez a deklaráció által megkívánt memóriacellák száma és az ezek elérésének mechanizmusa kapcsolódik. A tesztelési és átalakítási műveletek közvetlenül nem vonatkoznak a megnevezett adatokra. Ezeket a műveleteket az operandusverem határozza meg, amely 32 bites szavak (veremelemek) sorozata, amelyet dinamikusan módosítunk új elemek hozzáadásával (tolásával) a végére, valamint az azonos végű elemek eltávolításával (a Kazal). Az elemek visszavonása az elküldésükhöz képest fordított sorrendben történik: az utoljára elküldöttet vonják vissza először. A tesztelendő vagy átalakítandó adatok a verembe kerülnek, ahol az előírt műveleteket elvégzik rajtuk, majd a feldolgozás eredménye eltávolítható a veremből.

Például, ha van egy X változó 32 bites szóként deklarálva, akkor csak két művelet hajtható végre rajta közvetlenül:

1) értékét a verembe tolja, ami automatikusan megtörténik minden alkalommal, amikor az X nevet említik,

2) hozzárendelni a csapathoz! A veremből kikerülő utolsó (felső) elem X értéke.

Ha mondjuk meg szeretné duplázni az X értékét úgy, hogy hozzáadja önmagához, akkor ezt a következő parancsok egymás utáni végrehajtásával teheti meg:

Az X érték két példánya a verembe kerül, majd a + parancs eltávolítja őket, összeadja és a kapott mennyiséget a verembe tolja, majd a parancsot! X kivonja ezt az összeget, és az értékét az X változóhoz rendeli.

Az adott példa magas szintű nyelveknél szokásos X:=X+X formájú írása a programozó számára jobban ismert, de nem közvetlenül tükrözi a processzor által végrehajtott parancsok sorrendjét, hanem egy egyfajta matematikai képlet. Számítási problémák programozásakor ez kényelmes, azonban az alapnyelvben fontosabbnak tűnik a végrehajtott parancsokkal való egy-egy megfeleltetés, mivel a program parancsonként ellenőrizhető közvetlenül a programozási nyelvben, ill. általában nem szükséges a processzor nyelvén kívül más nyelv ismerete.

De az adathalmozás különösen értékes előnye, hogy a tesztelési és átalakítási eljárások az alkalmazott adatoktól függetlenül definiálhatók és implementálhatók. A tesztelési és transzformációs műveletek nem adatazonosítókhoz (vagy konstansok és változók neveihez, formális paraméterekhez), hanem veremelemekhez kapcsolódnak, amelyekhez a művelet végrehajtásának időpontjáig operandusértékeket kell rendelni. Például a + (add) paranccsal végrehajtott két szám összeadásának művelete abból áll, hogy a felső két elemet (felső és alsó) összegzésként kivesszük a veremből, kiszámítjuk az összegüket, és elküldjük a verembe. Két szám hozzáadásához el kell küldenie az értékeket a verembe, és végre kell hajtania a + parancsot, az eredmény a verem tetején lesz.

Egy tetszőleges számú bemeneti és kimeneti paraméterrel rendelkező teszt-transzformációs eljárás tehát egyszerűen egy elnevezett műveletként (paraméterlista nélkül) definiálható, amelyet az argumentumértékeket a megadott sorrendben tartalmazó veremen hajtanak végre, és a végrehajtás után az eredményértékeket. . Ahhoz, hogy egy ilyen eljárást alkalmazhassunk bizonyos adatok egyik vagy másik halmazára, ezeket az adatokat a megfelelő sorrendben kell elküldeni a verembe. Elfogyasztásuk után az eljárás a veremben (szintén egy bizonyos sorrendben) hagyja az eredményt.

Más szóval, az eljárások nevei a PARA nyelvben ugyanúgy használatosak, mint a műveletek előjelei, és lényegében tetszőleges számú operandust tartalmazó műveletek szimbólumai. A veremművelet elvének megfelelően a műveleteket postfix formában írjuk, pl. A művelet neve az operandusok nevének vagy értékeinek felsorolása után kerül elhelyezésre. Például, ha a három szám összegének megszerzésének műveletét a ++ szimbólummal jelöljük, akkor az A, 5 és B számok összegét a következőképpen fejezzük ki:

Lehetséges lenne a postfix nyelv formális szabályainak felállítása és ezek alapján vezérelni a programok írása során, de az embernek könnyebb és megbízhatóbb nem a szabályokkal, hanem a veremprocesszor modellel bánni, pl. annak a gépnek a modelljével, amelyre programokat készítenek, és amelyek végrehajtják azokat. A PARA nyelv esetében egy ilyen gép egy DSSP processzor - hardver és programok halmaza, amely végrehajtja az ezen a nyelven előírt műveleteket.

DSSP processzor

Fizikailag a DSSP processzor olyan egyszerű és hatékonyan programozható architektúrájú mikroprocesszor formájában valósítható meg, amely lehetővé teszi a mikroszámítógép-szoftverek problémájának a lehető legjobb megoldását. Ilyen mikroprocesszort azonban még nem hoztak létre, és az architektúráját emulálni kell a meglévő mikroszámítógépeken, hogy javítsák a programozhatóságukat. Természetesen az emuláció költségekkel jár - memóriát és számítógépes időt igényel, de PRSP processzor emulációja esetén ezek a költségek viszonylag kicsik.

A programozó szemszögéből a processzor jellemzője az architektúrája, pl. információk arról, hogy milyen ez a processzor, mint adatfeldolgozó eszköz, milyen lehetőségek vannak az adatok megjelenítésére a bemeneten és a processzoron belül, milyen műveletek vannak a teszteléshez és az adatkonverzióhoz, hogyan szerveződik a processzor saját memóriája, valamint a hozzáférés a fő és a külső memóriába, milyen vezérlők a program menete, interakció a külső környezettel, reagálás rendkívüli eseményekre stb. Az architektúra elsajátítása szükséges feltétele az értelmes (informális) programozásnak, amely jelentősen csökkenti a hibák számát és növeli a programok megbízhatóságát.

A DSSP processzor központi eleme a már említett operandusverem. Valójában a feldolgozás a veremben történik, és általában az adatok átvitele a veremen keresztül történik. Az egyes parancsok és a verem feletti rövid parancssorozatok úgy hajthatók végre, hogy közvetlenül a terminál billentyűzetéről adjuk a processzor bemenetére. Ebben az esetben a DSSP processzor egy postfix számológép működését imitálja. A billentyűzetről beírt számok és a műveletek mnemonikus kódjai szóközzel vannak elválasztva. A beírt szöveg karakterláncként jelenik meg a terminál képernyőjén. A bemenet végének jelzése és a processzornak adott „Végrehajtás a beírt utasítás” parancsa a gomb megnyomása is jelöli , . A processzor bemenetére érkező számok a verembe kerülnek, a parancsok pedig a verembe kerülnek végrehajtásra. A verem tetején kapott számítási eredmény a paranccsal a terminál képernyőjére másolható. (pont).

Például a (2-5)*3 kifejezés kiértékeléséhez és az eredmény megjelenítéséhez írja be:

2 5 - 3 * .

A gomb megnyomása után a processzor kiadja az eredményt, így az egész sor így fog kinézni

* 2 5 - 3 * . -90

A sor elején egy csillagot ad ki a processzor annak jelzésére, hogy bemenetre vár.

A vizsgált példában a processzor decimális egész számként érzékelte és dolgozta fel a beírt számokat. Valójában bevitelkor ezeket a számokat bináris komplementer kóddá alakították át, a kimenetnél pedig decimálisra. A PRSP processzor bináris, oktális és hexadecimális I/O módokat is lehetővé tesz. A kívánt módra váltáshoz végre kell hajtania a B2, B8, B10, B16 parancsok egyikét.

A gombok megnyomásával a billentyűkön jelzett betűket (betűket, számokat, írásjeleket, műveleti szimbólumokat) képviselő processzorkódok bevitelére kerül sor. A bemeneti karakterek sorozata egy bemeneti karakterláncot alkot - karakterkódokat tartalmazó bájtok láncát, karakterenként egy bájttal. A bemeneti karakterlánc maximális hossza 80 karakter.

A bemeneti karakterlánc feldolgozása során a processzor a benne lévő szavakat - egymástól szóközzel elválasztott betűkombinációkat - kinyeri és értelmezi. Ha a feldolgozott szó a processzor által ismert művelet (eljárás) vagy keresztnév, akkor a processzor végrehajtja azokat a műveleteket, amelyeket értelemszerűen ennek a névnek kell meghívnia. Ha a szót a processzor nem ismeri, akkor megpróbálja számként értelmezni, figyelembe véve a beállított bemeneti / kimeneti módot.

A számok olyan szavak, amelyek egy adott számrendszerben elfogadható számjegyekből állnak, és esetleg mínusz jelet tartalmaznak első betűként. Hexadecimális bemeneti/kimeneti módban a számjegyekkel együtt a latin A, B, C, D, E, F betűk is érvényesek.A kapott számot kettes komplementkódmá alakítja, és 32 bites szóként elküldi az operandusverembe. Ebben az esetben, ha a szám értéke kívül esik az ábrázolható értékek tartományán -2147483648: 2147483647, akkor ezt egy összehasonlítható modulo 2**32 értékkel helyettesítjük ebből a tartományból.

Abban az esetben, ha a feldolgozott szót a processzor nem ismeri, és nem fogadja el számként, a processzor egy üzenetet jelenít meg a terminál képernyőjén: "Nem tudom<обрабатываемое слово>és várja a további utasításokat.

Az adatbevitel tetszőleges szöveg formájában (byte-literálok sorozata) szövegliterálok formájában történik, amelyek idézőjelek közé vannak zárva, például: "Szöveg literál". A processzor bemenetén egy szövegliterál fogadása azt eredményezi, hogy az idézőjelek közé zárt szöveg egy bájt-literes sztring formájában a fő memóriába kerül. Ebben az esetben az első bájt címe és a bájtok száma (a szöveg hossza) a verembe kerül. A pont előtti szöveges literált a processzor úgy értelmezi, mint "a szöveget az idézőjelek közé helyezi a terminál képernyőjén". Például, ha a processzornak a „Nincs memória” karakterkombinációt adjuk meg, a képernyőn a következő üzenet jelenik meg: Nincs memória.

Egyetlen karakter kódja kerül a verembe, mint a felső alsó bájtja, amikor ez a karakter a processzor bemenetére érkezik, az előtte lévő # jellel együtt. Például az #L karakterkombináció az L betű kódját küldi el a veremnek, az 5-ös karakterkombináció az 5-ös szám kódját. A TOB parancs, amely egy bájtot ad ki a terminálnak, azt a karaktert jeleníti meg, amelynek kódja a verem tetejének alsó bájtjában található.

A PRSP processzor még az utasítások közvetlen végrehajtásának módjában is messze meghaladja a hagyományos számológépek képességeit, és az adatfeldolgozási műveleteken túlmenően lehetőséget biztosít a felhasználó számára a megnevezett adatok deklarálására és az eljárások meghatározására, amelyek azután használhatók. alapvető műveletek. Az adatnevek deklarálása és az eljárások meghatározása speciális parancsokkal történik.

Ha például egy 16 bites változót szeretne létrehozni, például TEMP névvel, akkor írja be a billentyűzeten, és a billentyűvel alkalmazza a processzor bemenetére. parancs

VAR TEMP

A deklarációval együtt egy kezdeti értéket is rendelhet a változóhoz, például 0:

VAR TEMP 0! TEMP

Most, hogy a TEMP név megérkezik a processzor bemenetére, ennek a változónak az aktuális értéke kerül a verembe, és a veremből eltávolított új érték hozzárendelése a paranccsal elvégezhető! TEMP.

Az eljárás definícióját a következő parancs vezeti be: (kettőspont), amely tartalmazza a definiálandó eljárás nevét és egy parancsláncot határoz meg egy betűvel; (pontosvessző) a definíció végének karaktereként. Mutassuk be az eljárások meghatározását és használatát egy N természetes szám faktoriálisának a képlettel való kiszámításának példáján.

N!=N*(N-1)*(N-2)*...*2*1, azaz. N-1 szorzás.

Az FCT eljárásnak a kívánt eredmény eléréséhez meg kell szoroznia az adott N számot egymás után csökkenő számokkal, N-1-től 1-ig kezdve, azaz. csak N-1 alkalommal. A PARA-ban ezt a P t-szeres végrehajtásával programozzuk: DO P, ahol P az eljárás neve, t a verem tetejének aktuális értéke, ami azt jelzi, hogy a P eljárást hányszor kell végrehajtani.

Tételezzük fel, hogy az FCT eljárás alkalmazása előtt az N számot a verembe toltuk, és a tetején van. Az eljárás érthetőbbé tétele érdekében bemutatjuk a K változó módosítható szorzóját:

Az FCT eljárás meghatározását a következő formában mutatjuk be:

FCT [N] ! K K K 1-DO F . [N];

A szögletes zárójelben lévő megjegyzések az operandusverem aktuális állapotát tükrözik. Csapat! A definiált eljárást elindító K a veremből vett N szám értékét rendeli a K változóhoz. Ezután K-t kétszer a verembe tolja, és a verem tetején lévő 1-ből kivonva az ismétlődő végrehajtások számát N-1-gyel egyenlő F eljárás jön létre. Ezt követi a DO F parancs, amely előír egy ciklust, amely után a verem tetején a faktoriális kívánt értéke - N! - fog megjelenni. Csapat. (pont) ennek az értéknek a másolatát jeleníti meg a terminál képernyőjén. Meg kell határozni egy F eljárást, amely módosítja K értékét 1-ből kivonva, és K-val megszorozza a veremben található R számítási részeredményt.

F [R] K 1- ! K [R] K*;

Mindkét eljárás helyességét a definícióik parancsonkénti végrehajtásával ellenőrzik, minden parancs után a terminál képernyőjén megjelenítve az operandusverem tartalmát és a K változó értékét Az FCT eljárás befejezése után az A veremnek tartalmaznia kell az N! értéket, a K változó értékének pedig 1-gyel kell egyenlőnek lennie.

Az ellenőrzött és javított (ha az ellenőrzési folyamat során hibákat észleltek) eljárások tesztelése az N szám egyedi értékeire történő alkalmazásával történik. Mivel az F eljárás az FCT-be van beágyazva, a tesztelése a tesztelés során automatikusan megtörténik. a levél. Nem szabad megfeledkezni arról, hogy az eredményértékek nem haladhatják meg a kettős komplementer kódban egy 32 bites szó által képviselt maximális pozitív számot: 2147483647, azaz. Az FCT csak N=1, ..., 13 esetén ad helyes eredményt.

Az FCT használata nem különbözik a natív processzor utasítások használatától: az eredmény eléréséhez meg kell adni az operandus értékét, és meg kell adni az eljárás nevét:

5 FCT 120

7 FCT 5040

Az FCT eljárás fenti megvalósítása megkövetelte egy K segédváltozó bevezetését, azonban egy funkcionálisan ekvivalens eljárás segédváltozó nélkül is végrehajtható a C művelettel, amely csúcsának másolatát a verembe tolja, és a műveleteket. E2 és E3, amelyek felcserélik a csúcsot a verem második és harmadik elemével. Ennek az eljárásnak a meghatározása a következő.

: FCTA [N] C 1- C DO FA D . ;

: FA C E3 * E2 1- ;

Az ilyen "tiszta verem" eljárás előnye a teljes autonómia: a processzor alapvető veremműveleteihez hasonlóan csak az operandusveremen hajtódik végre, anélkül, hogy további memóriát igényelne, és nem okozna semmilyen változást a processzor többi komponensében.

A definiálandó eljárások nevei és a deklarált adatok bekerülnek a processzor szótárába, amely kapcsolatot létesít e nevek és a megnevezett objektumok között, vagyis a fő memóriában található eljárások törzseivel és ennek elemeivel. a deklarált adatok tárolására lefoglalt memória. A bemeneti adatfolyam következő szójának feldolgozása során a processzor átnézi a szótárat, és miután talált benne egy megfelelő szót, végrehajtja a szóhoz kapcsolódó műveleteket. Ha a keresés sikertelennek bizonyult, akkor, mint már említettük, megkísérlik az adott szó numerikus értelmezését, és ha ez nem sikerül, akkor egy üzenet következik, hogy a processzor nem ismeri a szót.

Egy eljárásdefiníció összeállítása eredményeként bekerül a szótárba ennek az eljárásnak a neve és a törzsének mutatója (címe), amely a definíciót alkotó eljárások és adatok mutatóinak sorozata. Más szóval, egy eljárás törzsének belső reprezentációját úgy kapjuk meg, hogy a definíciójában az eljárások és adatok neveit a megfelelő testekre mutató mutatókra cseréljük, amelyek viszont ugyanazok a mutatósorozatok, és primitívek esetén gépi utasítások láncai. Ezt a program belső reprezentációját eljárási kódnak nevezzük.

Amikor a P eljárás definíciójának összeállítása mellett az összes eddig ismeretlen beágyazott eljárás definíciója is összeállításra kerül, akkor a mutatók teljes hierarchiája jön létre, amely biztosítja a P eljárás végrehajtásának lehetőségét úgy, hogy csak a nevét adja meg a processzor bemenet. Ebben az esetben a P definíciójához kapcsolódóan összeállított beágyazott eljárások nevei, ha ezeket az eljárásokat nem kell külön elérni, akkor nincs értelme a szótárban tárolni. Számos esetben helyénvalónak bizonyul a szótár egyik vagy másik részéhez való hozzáférés letiltása, így talán csak bizonyos eljárások végrehajtása marad meg.

Az ilyen követelmények teljesítése érdekében a szótár alszótárak halmazaként valósul meg, amelyen olyan műveletek vannak meghatározva, amelyek lehetővé teszik alszótárak és részeik létrehozását és megsemmisítését, nevek törlését, bizonyos alszótárak hozzáférésének bezárását és megnyitását. Minden alszótárnak van egy neve, amelyet a hozzá kapcsolódó parancsokban használnak. Az alszótárak nevének $ betűvel kell kezdődnie, például: $PRIME, $EDIT, $FLOAT, $TEXTPROC, $GRAPHICS.

A PRSP-szavak alapkészletét tartalmazó $PRIME alszótár a processzor elindítása után megnyílik a benne található szavak eléréséhez és új szavakkal való feltöltéséhez. A benne beírt új szavak szükség esetén törölhetők a hozzájuk tartozó testekkel együtt a FORGET $PRIME paranccsal. Ezt követően a GROW $PRIME parancs végrehajtása biztosítja a további szavak hozzáadásának lehetőségét az alszótárban, amely lehetővé teszi a $PRIME alszótár ismételt bővítését, és a FORGET $PRIME paranccsal újra törölhető minden, ami benne van. . Ebben a módban a PRSP-t kis programtöredékekkel, egyedi példákkal, becslésekkel való kísérletezéskor használjuk, és szükség esetén új szavak beillesztésére is a $PRIME alszótárba a rendszernyelv fejlődésének sorrendjében.

Külön program készítése esetén saját alszótárt készítenek hozzá, és ezt úgy érik el, hogy a program szövege a paranccsal kezdődik.

PROGRAM$<имя программы>

A személy ezt a parancsot fejlécként érzékeli, amit egy megjegyzés követ szögletes zárójelben, amely néhány szóban leírja a program által megvalósított funkciót. A processzor számára ez egy utasítássorozatnak felel meg

FELEJTSD EL $<имя>NÖVEKEDNI $<имя>

Ezért a programszöveg minden egyes bevitele a processzor bemenetére az előző verzió törlését okozza, és megnyitja az így törölt alszótárat, hogy belépjen a program azonos nevű új verziójába. Ez kényelmes a létrehozott program korrekcióinál, valamint a jövőbeni módosításoknál.

A megtervezett program szövege nem közvetlenül a billentyűzetről kerül a processzor bemenetére, hanem a szövegszerkesztő pufferében formálódik. Az E parancs (Edit - edit) beállítja azt a szerkesztési módot, amelyben a billentyűzetre beírt szavakat a processzor már nem azonnal végrehajtandó parancsként érzékeli, hanem egyszerűen a pufferbe íródik, és egyidejűleg megjelenik a képernyő szövegén. Az aktuális pozíciójelző (kurzor) képernyőn való mozgását vezérlő speciális billentyűk, valamint más billentyűk lenyomásával adott szerkesztési parancsok segítségével a beírt szöveg törléssel, beszúrással, töredékeinek mozgatásával javítható, módosítható. helyről helyre stb.

Szövegbevitel és szerkesztés végén a szerkesztő kikapcsolása az E gomb és a (pontosabban az előzőleg lenyomott) gomb egyidejű megnyomásával történik. , és a rendszer a fő PRSP parancsmódra vált. Hasonló művelet indítható egyszerűen egy gomb megnyomásával . Ebben a módban a szerkesztő pufferének tartalma a PF paranccsal (PerForm - execute) kiadható a processzornak. Ebben az esetben a szövegben található összes parancs végrehajtásra kerül, különösen a PROGRAM $ parancs<имя>eltávolítja a $ alszótárt<имя>ennek a parancsnak a legutóbbi végrehajtása óta az adatok és eljárások nevei, valamint a megfelelő testek, újból megnyitva ezt az alszótárt a növekedéshez. Az adatdeklarációs parancsok és eljárásdefiníciós parancsok beírják az általuk beírt neveket, az ezekkel a nevekkel jelölt adatokra és a definíciók szerint összeállított eljárási testekre mutató mutatókat.

A betöltés befejeztével az eljárások és adatok a billentyűzetről begépelt nevükkel hivatkozásként rendelkezésre állnak, és lehetőség van a program helyességének ellenőrzésére az eljárások növekvő sorrendben történő végrehajtásával, pl. kezdve azokkal, amelyek definíciói nem tartalmaznak nem tesztelt eljárásokat. Az ellenőrzés megkezdése előtt érdemes megbizonyosodni arról, hogy a program nem használ meghatározatlan neveket. A processzor az UNDEF paranccsal megjeleníti őket a képernyőn. A programszöveg ezen nevek definícióival való kiegészítéséhez, valamint az ellenőrzés során észlelt egyéb hibák kijavításához hívja meg a szerkesztőt az E paranccsal és végezze el a szerkesztő pufferben található program forrásszöveg megfelelő módosítását, majd kapcsolja a processzort fő módba és töltse be a puffer tartalmát a PF paranccsal.

A program ellenőrzése és tesztelése után a forráskódja a szerkesztő pufferéből a lemezre másolható az OE f paranccsal, ahol f annak a fájlnak a neve, amelyben a program lemezre kerül. A jövőben a fájl tartalma a LOAD f paranccsal betölthető a processzor bemenetére, illetve az IE f paranccsal a benne lévő szöveg kiegészítéseként a szerkesztő pufferébe is másolható. Alapértelmezés szerint a fájlok kiterjesztése .DSP. A puffer előre törölhető a KE paranccsal. Lehetőség van a puffer tartalmának kinyomtatására is az LPE paranccsal.

A végrehajtásra kész program betöltése után lehetőség van a hozzá készített $ alszótár tisztítására.<имя>parancs CLEAR $<имя>. A parancs végrehajtásával a processzor eltávolítja a nem rögzített neveket a megnevezett alszótárból, pl. minden név, kivéve azokat, amelyek definícióit a fixáló előtag előzi meg:: (két kettőspont). Ebben az esetben csak maguk a nevek (szótári bejegyzések) törlődnek, míg a hozzájuk tartozó eljárástestek és adatok megőrződnek, és a fordítás során kialakított belső hivatkozásokon keresztül a programvégrehajtás során elérhetőek, de kívülről már nem hozzáférhetők. A kívülről való hozzáférés lehetőségének visszaállításához, például ha valamilyen kiegészítést vagy változtatást kell fordítani, akkor újra kell tölteni a program forráskódját.

A SHUT $ paranccsal a nevek kívülről elérhetetlenné tehetők anélkül, hogy eltávolítanák őket a szótárból.<имя>, amely lezárja a hozzáférést a benne megnevezett alszótár összes szavához. Az alszótár megnyitása a szavai használatához a USE $ paranccsal történik<имя>. Van egy ONLY $ parancs is<имя>, amely bezárja az összes alszótárt, kivéve a megnevezettet, és a CANCEL parancsot, amely megszünteti ezt a korlátozást. A felsorolt ​​parancsok lehetővé teszik a szótár használatának szabályozását a fordítás során, és a program felhasználója számára elérhető névkészletet a szükséges minimumra korlátozzák.

A név keresése a szótárban úgy történik, hogy a szavait a szótárba való beírásuk fordított sorrendjében nézzük meg, pl. az utolsó bejegyzéssel kezdve. Ezért a szótárban többször meghatározott névre a legfrissebb definíció érvényes. Ha az utolsó definíciót tartalmazó alszótár be van zárva, akkor a keresés az adott névvel rendelkező első elérhető szótárbejegyzésre folytatódik, és a szócikk által megadott definíció kerül felhasználásra.

Néhány szó az adatbevitelről és -kiadásról. Mint már említettük, a processzor megpróbálja számként értelmezni a végrehajtott program szótárban nem található szavát, és ha sikerül, ennek a számnak a bináris megfelelőjét a verembe tolja. Számot a verembe tolni a TIN paranccsal lehet, amihez be kell gépelni a beviteli számot a billentyűzeten. Vannak olyan parancsok is, amelyek hatására a billentyűzetről beírt karakter a verembe kerül: TIB - kijelzővel, TRB - anélkül, hogy ez a karakter megjelenne a képernyőn. Ebben az esetben a karakterkódot a verembe küldött 32 bites szó alsó bájtja reprezentálja, amelynek első 3 bájtja nulla.

A verem tetejének tartalmának bevitele szám, illetve betű formájában lehetséges. A TON parancs hatására az alcsomópont számértéke megjelenik a képernyőn a kimeneti mezőben, melynek szélességét a csúcs határozza meg, a végrehajtáskor kialakított számábrázolási rendszerben. A TOB parancs megjeleníti azt a karaktert, amelynek kódja a verem tetejének alsó bájtjában található. Mindkét esetben a kimenetet követi az argumentumok eltávolítása a veremből.

A DSSP processzor külső és belső (parancs) megszakításokra alkalmas berendezéssel rendelkezik, és ezek feldolgozásához a következő eszközöket biztosítja. A külső megszakítás kezelésére szolgáló eljárás a normál eljáráshoz hasonlóan definiálható, de a kettőspont elé az INT előtagot kell hozzáadni. Egy ilyen eljárás neve a megszakítási vektor címéhez van társítva a következő paranccsal:

<адрес вектора>LINK<имя процедуры>

A parancsmegszakítás egy elnevezett művelet egy válaszeljárás meghívására. Ennek a műveletnek a nevét a TRAP parancs határozza meg, amely hozzárendeli az úgynevezett végső válasz eljárást, amely akkor hajtódik végre, ha a végső reakciót nem váltja fel másik válaszeljárás az ON vagy EON parancs segítségével. Mindhárom parancs formátuma azonos:

CSAPDA<имя вызова> <процедура реагирования>

TOVÁBB<имя вызова> <процедура реагирования>

eon<имя вызова> <процедура реагирования>

Az EON utasítás által egy hívásnévre leképezett eljárás az EON utasítást tartalmazó eljárás törzséből való kilépés után és az EON végrehajtása idején a helyén lévő operandus veremmutató értékével kerül végrehajtásra.

PARA nyelvi szintaxis

A PARADISE nyelvi ábécé latin és orosz nyelvet, kis- és nagybetűket, tizedesjegyeket, matematikai és egyéb speciális karaktereket tartalmaz. Az ábécé elemeit (tagjait) betűknek nevezzük. A betű külső ábrázolása a nyomtatott képe (nyomtatott karakter). A PRSP processzoron belül minden nyomtatott karaktert egy bájt képvisel, amelynek értéke az adott karakter bináris kódja. A külső ábrázolás belsővé alakítását és fordítva a beviteli/kimeneti eszköz (billentyűzet, kijelző, nyomtató) végzi. Az egyszerűség kedvéért a kód számértékét decimális, hexadecimális vagy oktális rendszerben adjuk meg, a megfelelő számot decimális, hexadecimális vagy oktális karakterkódnak nevezzük.

A PARADISE nyelv minden objektuma betűkből épül fel, és véges hosszúságú betűk lineáris láncai, amelyeket szavaknak neveznek. Az egymást követő szavak határolója egy nem nyomtatható karakter (szóköz). A szóközök karakterlánca egyetlen szóköznek felel meg. Ezenkívül a szóelválasztó funkcióját a "Ugrás a következő sor elejére" parancs látja el, amelyet a beviteli eszközök billentyűzetén a szimbólum jelzi vagy és a betűkkel együtt van egy belső reprezentációja kódbájtként. Így nincs szükség szóközök elválasztására a karakterlánc elején és végén.

Példaszavak: CLEAR NOP STEK2 & 1+ -366 X Probe.

A PRSP processzor az első hét betű alapján különbözteti meg a szavakat, és a szótárában szereplő szavakkal való politerminális összehasonlítással ismeri fel őket. A szótár olyan szavakat tartalmaz, amelyek a processzor saját műveleteinek nevei (megnevezései), amelyeket alapműveleteknek vagy primitíveknek neveznek, és kiegészíthetők a felhasználó által meghatározott objektumok (adatok, eljárások) neveivel. Így a szótárban szereplő szavak vagy műveletek (műveletek, eljárások) vagy adatok (konstansok, változók, tömbök) nevei.

Ha egy felismerhető szó nem szerepel a szótárban, a processzor megpróbálja hozzárendelni a következő esetek egyikéhez:

    numerikus literál, azaz. számjegyek sorozata, amely esetleg mínuszjellel kezdődik, például: 0, 4096, -25;

    szó szerinti literál: # karakterrel kezdődő szó, amelynek hatására a processzor adott kódként megkapja a közvetlenül utána következő karaktert, például: #A - a latin A nagybetű literálja, #5 - az 5-ös szám literálja , # - szóköz, ## - betűk #;

    szöveg literál: tetszőleges szöveg idézőjelbe zárva és szóelválasztókkal elválasztva, például: "Szöveg", "Beviteli fájl N3";

    parancs szöveges üzenet megjelenítéséhez a kijelzőn: a kimeneti üzenet szövege, amelyet bal oldalon egy pont-dupla idézőjel karakterkombináció és a jobb oldalon kettős idézőjel határol el, és szóelválasztókkal elválasztva, például: "A verem üres";

    megjegyzés: tetszőleges szöveg, szögletes zárójelbe zárva és határolójelekkel elválasztva, például: .

A literálok és a kijelzőn üzenetet kibocsátó parancs a PRSP nyelv objektumaiként működnek a szótárból felismert szavakkal együtt, míg a megjegyzéseket a PRSP processzor teljesen figyelmen kívül hagyja - személynek szánják, nem gépnek. Ha a szó nem található a szótárban, és nem kapcsolódik a felsorolt ​​konstrukciókhoz, a processzor egy üzenetet ad ki: "Nem tudom<неопознанное слово>".

Tekintettel a #, "és kombináció" betűk különleges jelentésére. egy szó elején, azaz. az elválasztó után, valamint az elválasztó előtti "betűt" nem szabad a szótárba való felvételre meghatározott szavakban a megadott helyeken használni.

A processzor bemenetén lévő szavak sorozatát a processzor által végrehajtott utasítások sorozataként értelmezzük. Háromféle szó létezik:

1) önállóan végzett, azaz egyszavas parancsok (monoszavak) ábrázolása;

2) egy vagy több következő szóval együtt hajtják végre, pl. melyek a két-, három- vagy többszavas parancsok kezdőszavai (előtagjai);

3) a parancs előtt egy speciális végrehajtási mód (előtagok) tisztázásaként vagy jelzéseként.

A monoszavak közé tartoznak a literálok, az adatnevek, a legtöbb I/O, teszt és adatkonverziós művelet a veremben, valamint a felhasználó által definiált eljárások. Például: 1987 - numerikus literál, #5 - az 5-ös szám literálja, "Sémák listája" - szövegliterál, LENGTH - változó neve, TOB, NEG, +, &,<, = - имена (обозначения) операций, SORT, CONVERT, ЧИСТКА, СНЯТЬ - имена процедур пользователя.

Az előtagok az adatok leírására és az eljárások meghatározására, valamint a megnevezett adatok manipulálására, az eljárások feltételes és többszörös végrehajtására, valamint a szótárkezelésre szolgáló parancsok velejárói. Példák előtagot tartalmazó parancsokra:

VAR SUM – SUM változó létrehozása,

: ODD [x] 1 & ; - hozzon létre egy páratlan eljárást, amely a páratlan számot 1-re, a páros számot 0-ra cseréli,

0 X - rendelje hozzá a 0 értéket az X változóhoz,

BR+ P1 P2 - ha a veremből vett tetejének értéke pozitív, akkor hajtsa végre a P1-et, ellenkező esetben a P2-t,

RP CHECK - hajtsa végre a CHECK eljárást újra és újra,

A $REAL HASZNÁLATA - nyissa meg a $REAL alszótárt a használathoz.

Általános szabály, hogy egy adott előtag bizonyos számú szót igényel maga után. Így az imént bemutatott példákban a VAR, !0 és USE előtagok egy-egy szót igényelnek, míg a BR+ előtag két szót igényel. Az előtag: (kettőspont) azonban lehetővé teszi, hogy tetszőleges hosszúságú parancsot alkosson három szóval kezdve. A parancs vége egy szó; (pontosvessző). A tetszőleges hosszúság jellemző a CNST A1 ... AJ konstansok parancs-leírójára is; és az eljárás többszörös kiválasztási parancs BR A1 P1 ... AJ PJ ELSE PN.

Az előtagok olyan speciális szavak, amelyek egy parancs elejére adva módosítják annak tartalmát, vagy speciális végrehajtási módot határoznak meg. Például az előtag nélküli VAR X parancs egy 16 bites X változó létrehozására szolgál. Ha hozzáfűzzük a BYTE előtagot, akkor a BYTE VAR X parancsot kapjuk, amely egy 8 bites létrehozását utasítja. változó (byte) X néven. Ha a LONG előtagot használjuk, akkor LONG VAR X-et kapunk - egy utasítást egy X nevű 32 bites változó létrehozására.

Egy másik típusú előtag, nevezetesen:: (két kettőspont) jelzi a parancsvégrehajtás eredményének stabilitását a CLEAR eljáráshoz képest, amely eltávolítja a szótárból a laza szavakat. A program felépítése során az adatleíró és eljárásdefiníciós parancsokkal a szótárba beírt nevek a program létrehozása és tesztelése után néhány, a kész program karbantartásához szükséges kivétellel eltávolíthatók a szótárból. A törlés a CLEAR $ paranccsal történik<имя подсловаря>, a programhoz tartozó alszótár törlésére utasítva, csak azokat a szavakat mentve bele, amelyek definícióiban az előtag::. Példák a nem eltávolítható szavakat generáló parancsokra:

:: BYTE CNST LITCODE # #0 #A ;

:: : MOD / [cél(a,b),rest(a,b)] E2 D [rest(a,b)] ;

Ahogy a :: és BYTE előtagokat tartalmazó második példa mutatja, egy parancsban több előtag is lehet.

Így egy parancs a DSSP-ben lehet egy szó (monoword) vagy egy olyan kifejezés (kifejezés), amely egy előtaggal kezdődik és tartalmazza az ehhez az előtaghoz beállított szavak számát, és ha az előtag tetszőleges számú szót engedélyez, akkor egy határoló szó a végén, vagy lehet egy olyan kifejezés, amelyhez speciális előtag szavak tartoznak.

A DSSP alapnyelve nem tartalmaz bonyolultabb szintaktikai konstrukciókat, mint a parancs, és nem tartalmaz a fent tárgyaltakon kívül más szerkezeteket sem. Még a programozási nyelvekben olyan nélkülözhetetlen dolgok is, mint a kifejezés és a függvény, hiányoznak az alapnyelvből, és szükség esetén csak a fejlesztés során vezethetők be.

Az alapnyelvi program egyszerűen parancsok gyűjteménye, amelyek végrehajtása a szövegben való megjelenés sorrendjében történik. Sőt, minden parancs – a csak primitíveket tartalmazók kivételével – végrehajtása során olyan parancssorozatot tartalmaz, amely meghatározza a benne foglalt szavakat. Az érintett parancsok viszont tartalmazhatnak parancsláncokat jelölő szavakat, amelyek a hozzájuk tartozó láncokra utaló szavakat is tartalmazhatnak, és így tovább. egészen addig a szintig, ahol a parancsok csak primitíveket tartalmaznak.

A fejezet tartalmát képező PARA nyelv általános leírása ennek a nyelvnek a szerkezetének és parancsainak alapvető (kezdő) halmazának, amely a beépített parancsok (primitívek) halmaza volt. a PRSP processzortól. A nyelv továbbfejlesztése és a processzor képességeinek ennek megfelelő növelése új eljárások, parancsok, formátumok és adattípusok bevezetésével valósul meg, alapvető eszközök felhasználásával. Az ilyen fejlesztés általában problémaorientált, és az alaprendszeren kívül a processzor bemenetére betöltött eljáráscsomagok formájában valósul meg.

Másrészt az alaprendszer kiegészíthető a DSSP programok gépi hatékonyságának növelése érdekében, annak alapján megvalósított speciális eszközökkel. Ezek az eszközök magukban foglalják az egyes eljárások közvetlen meghatározását a használt gép parancskódjában. Egy eljárás definiálásának módja nincs hatással a további használatára: az összes eljárás neve egy közös szótárba kerül, és teljesen azonos. Számos könyvtári program lehetővé teszi más nyelven írt eljárások vagy teljes programok használatát.

Műveletek és parancsok leírása

A veremen végrehajtott műveletek

Az operandusverem a PRSP processzor architektúrájának egyik fő eleme. A legtöbb processzorutasítás a veremet használja, felhasználja a szükséges operandusokat, és elküldi az eredményeket. A veremben lévő adatok értelmezése a megoldandó probléma lényegétől függ, vagyis végső soron a programozó felelőssége. Tekintettel arra, hogy a verembe került érték elveszti a nevét, a program szövegéből nehéz megállapítani, hogy melyik operandusra vonatkozik ez vagy az a művelet, mi az eredménye. Ezért az eljárások operandusainak és eredményeinek kifejezett jelzésére a PARA nyelven megjegyzéseket használnak. Ebben az esetben nem szükséges (és nem mindig lehetséges) a verem teljes tartalmát leírni. A verem felső részének kommentálása, amelyet a rajta végrehajtott eljárás érint, feltétlenül szükséges, hiszen enélkül a program láthatósága elvész, ellenőrzése nehézkes.

A program egységességének elérése érdekében ezeket a megjegyzéseket néhány egyszerű szabály figyelembevételével kell megírni. Mint minden megjegyzés, a veremben lévő adatok leírása szögletes zárójelben van. Ez a leírás a program egy adott pontján a veremben lévő operandusok listája. A lista minden eleme egy verempozíció tartalmát jellemzi, elválasztóként vesszőt használunk. A verempozíció értékei balról jobbra vannak felsorolva, a legmélyebb elemtől kezdve és a verem tetején érve. Egyetlen operandus leírása lehet szám, név, kifejezés vagy bármilyen más értelmes jelölés, amely megmagyarázza a veremben lévő érték jelentését. Néha több lehetséges értéket is megadhat egy bizonyos verempozícióhoz. Ebben az esetben az értékek perjellel vannak elválasztva.

Íme egy példa egy megjegyzésre, amely az operandusverem állapotát tükrözi:

[rajt dr,N+1,1/0]

A program azon pontján, ahol ez a megjegyzés található, az operandusveremnek legalább három pozíciót kell tartalmaznia, és a tetején 1 vagy 0 lehet, alul - egy N + 1-gyel egyenlő számérték, alatta pedig - néhány szám kiindulási címként értelmezve.

A verem kívánt pozíciójának megadásának kényelme érdekében az előfordulás mélységének fogalmát használjuk. Feltételezzük, hogy a verem teteje az 1. mélységben, az alsó a 2. mélységben van, és így tovább. Különösen a példában "start.adr"-ként jelölt érték. mélységben fekszik 3.

Az alapvető PRSP nyelv tanulmányozását az értékek verembe helyezésére vonatkozó utasításokkal kezdjük. Ennek a típusnak a legegyszerűbb (és leggyakrabban használt) parancsa egy numerikus literál, azaz egy konstans kifejezett jelzése, amelyet a verembe kell tolni. Például a 28-as, -5-ös és 11-es számokat a verembe szeretnénk tolni, ehhez írjuk be a billentyűzetről a sort:

28 -5 11 és nyomja meg a gombot (kocsi vissza). A processzor felismeri a beírt számokat, és sorra tolja a verembe, így 11 lesz a tetején, ennek ellenőrzéséhez elegendő a verem tetejének értékét kinyomtatni a kijelzőre. Ehhez a névvel ellátott DSSP parancsot használják. (pont). A "pont" betű beírásával a billentyűzeten és megnyomva , a képernyőn megkapjuk a választ: 11, ami a verembe utoljára küldött értéknek felel meg. A „pont” újrafuttatása ugyanazt az eredményt adja – ez a parancs csak a csúcsot jeleníti meg a verem állapotának megváltoztatása nélkül.

A verem teljes tartalmának a képernyőn való megjelenítéséhez a DSSP-nek van egy .. (két pont) parancsa. A végrehajtás után a következő sort kapjuk a képernyőn:

Amint láthatja, a nyomtatott űrlap követi a verem állapotának megjegyzésére vonatkozó elfogadott konvenciókat (kivéve, hogy vessző helyett szóközt használnak). A .. parancs nem módosítja a verem tartalmát.

Egy 32 bites szó (4 bájt) egy verempozíciót jelöl a gép memóriájában, a számokat kettő komplementerében. Ennek megfelelően a PRSP processzor csak a -2147483648 és 2147483647 közötti egész számokat képes érzékelni. Ha a beírt szám nem ábrázolható 32 bitben (az előjelet figyelembe véve), akkor a legjelentősebb, nem illeszkedő biteket eldobja.

A vizsgált példákban azt feltételeztük, hogy a PRSP processzor a számok decimális beviteli/kiadási módjában van. Ennek az üzemmódnak a PARADISE nyelven történő beállításához egy B10 parancs található.

Sok feladatban a feldolgozott adatokat nem számokként, hanem bináris kódokként, azaz 32 komponensű bitvektorokként kell értelmezni. A DSSP-ben lehetőség van bináris, oktális vagy hexadecimális számrendszerben bemutatott kódokkal dolgozni. A kívánt mód beállításához elegendő a három parancs egyikének végrehajtása: B2, B8 vagy B16, amely után a processzor elfogadja és kinyomtatja az összes beírt kódot a megadott számrendszerben.

Ezzel a funkcióval decimális számokat lehet 2-es, 8-as és 16-os alapokra konvertálni. Például a 29-es szám konvertálásához írja be és hajtsa végre a következő sort:

B10 29 B2 . B8. B16. Ennek eredményeként a processzor egy számsort jelenít meg a képernyőn: 00000000035 0000001D, amelyek a 29-es decimális szám reprezentációi a három jelzett számrendszerben. Ne feledje, hogy a kódok a gépi ábrázolásukban vannak kinyomtatva, azaz nullákkal és "+", "-" jelek nélkül. A B10 -2 B8 sor végrehajtásakor. a 37777777776 számot adja vissza, amely a -2 komplementerének oktális reprezentációja.

Ha hexadecimális kódokkal dolgozik, ütközések fordulhatnak elő a numerikus literálok és a PRSP processzor parancsnevei között. Például a B8 szó hexadecimális I/O módban értelmezhető az oktális mód beállítására szolgáló parancsként és hexadecimális állandóként. A kétértelműség elkerülése érdekében a numerikus literáloknak egy nem szignifikáns nullával kell kezdődniük, például 0B8.

A DSSP processzor parancsrendszerének alapja a veremben lévő adattranszformációs műveletek. Az ezekre a műveletekre vonatkozó általános szabály az, hogy minden művelet felhasználja (eltávolítja) a veremből a szükséges operandusokat, és az eredményértékeket (ha vannak) a helyükre tolja.

Fontolja meg a processzor utasításait, amelyek négy aritmetikai műveletet hajtanak végre: összeadás, kivonás, szorzás és egész számok osztása. A PARADISE nyelvén a képükhöz a következő szavakat használjuk: +, -, * és /. Ahhoz, hogy a veremben lévő két szám összegét megkapja, például 123 és 45, ezeket a számokat a verembe kell tolnia, és végre kell hajtania a + parancsot. Ehhez írja be a következő sort a billentyűzetről (feltételezve, hogy a decimális beviteli / kimeneti mód be van állítva):

123 45 +

Ha most a verem tartalmát megjelenítjük a képernyőn (.. paranccsal), akkor láthatóvá válik a hozzáadás eredménye:

Hasonló módon működik a szorzás kommutatív művelete is.

Ha nem kommutatív kivonási és osztási műveleteket hajtunk végre, a verem altetője a minuend (osztalék), a teteje pedig a részfej (osztó) lesz. Például a 151-68 közötti különbség kiszámításához a következő sort kell végrehajtania:

151 68 -

A PARA nyelvű aritmetikai műveletet végrehajtó programra jellemző, hogy a művelet a neki megfelelő operandusok után helyezkedik el. Az aritmetikai kifejezések ilyen jelölését postfix (vagy lengyel inverz) jelölésnek nevezik, és széles körben használják a veremszámítógépekben. Például ki kell számítanunk a számtani kifejezés értékét ((127+81)*15-(31+117)*21)*3

A postfix jelölésben ez a kifejezés így fog kinézni:

127 81 + 15 * 31 117 + 21 * - 3 *

Ez a sor (amelyben a szavak szóközökkel vannak elválasztva) egy kész program a kifejezésünk PRSP processzorral történő kiszámítására.

Az osztás / parancs abban különbözik a többi aritmetikai művelettől, hogy két értéket eredményez - a hányadost és a maradékot. A hányados a verem alján, a maradék pedig a tetején található. A hányados negatív, ha az osztó és az osztó előjele eltérő. A maradékon mindig az osztalék előjele van. Íme néhány példa a osztás parancs használatára.

125 7 / [-17,-6] / / /

A számítások végrehajtása során hibás helyzetek fordulhatnak elő: túlcsordulás és nullával való osztás. A DSSP processzor semmilyen módon nem reagál rájuk (főleg, ha nullával osztjuk, a verem tartalma nem változik), és a műveletek helyes használatának ellenőrzése a programozóra van bízva.

Programozáskor gyakran szükséges egy érték értékét 1-gyel és 2-vel növelni vagy csökkenteni. A PARADISE nyelvbe olyan speciális parancsok kerültek, amelyek a verem tetején hajtják végre a megadott műveleteket. Ezeket a következő szavak jelzik: 1+, 1-, 2+, 2-. Ezeknek a parancsoknak a végrehajtása egyenértékű a kívánt állandó (1 vagy 2) verembe tolásával, majd a szükséges aritmetikai művelet végrehajtásával (+ vagy -). Például a 2+ egyenértékű a 2 + szópárral. E parancsok nyelvének bevezetését a hatékonysági megfontolások okozzák.

A hatékonyság növelése érdekében a DSSPprocesszor alapnyelve a T0 és T1 parancsokat tartalmazza, amelyek a verem tetejének értékét 0-ra, illetve 1-re cserélik, függetlenül attól, hogy a megadott parancs előtt melyik érték volt a tetején. Példák:

A NEG, ABS és SGN parancsokat is úgy tervezték, hogy numerikus adatokkal dolgozzanak. A NEG utasítás megfordítja a verem tetejének előjelét, az ABS lecseréli a verem tetejének értékét annak abszolút értékére, SGN - a verem tetejéről numerikus értéket vesz fel, és a kinyert szám előjelét helyezi a verembe. hely: -1 - ha a szám negatív, 1 - ha pozitív, 0 - ha egyenlő nullával. Például:

5 NEG [-5] ABS SGN

Az alapnyelv MIN és MAX parancsai lehetővé teszik két egész szám minimális és maximumának meghatározását. Ezen utasítások operandusai két szám a verem tetején és alján. A MIN utasítás a minimális számú paramétert hagyja a veremben, a MAX a maximumot. Például:

5 0 15 PERC [-5,0] MAX

A veremben lévő három szám minimumának (maximumának) meghatározásához elegendő kétszer alkalmazni a MIN (MAX) parancsot:

MIN MIN [-2]

A SEG utasítás annak ellenőrzésére, hogy a verem tetején lévő szám a megadott a-tól b-ig terjedő tartományba esik-e (beleértve a határokat is), a következő jelzőt hagyja a veremben: 1, ha a szám a tartományban van, és 0 ha nem:

SEG [jel] például:

A numerikus adatokkal való munkavégzésre vonatkozó utasítások mellett a DSSP processzor utasításkészlete számos olyan műveletet tartalmaz, amelyek a 32 bites kódok konvertálására szolgálnak. Ezek a műveletek a veremelemet 32 ​​komponensű bitvektorként kezelik, amelynek komponensei jobbról balra vannak számozva úgy, hogy a bal szélső bit 31, a jobb szélső szám pedig 0. A komponensek csökkenő számozása megismétlődik. a gépi szóbitek számozása, amelyet számos mikroprocesszorhoz alkalmaznak.

A bitvektor utasítások elsősorban a Boole-algebra bitenkénti műveleteit tartalmazzák:

    az INV verem tetejének bitenkénti inverziója, a felső része minden bitjének értékének megváltoztatása, azaz a 0 helyére 1 és az 1 helyett 0;

    az & verem tetejének és alsó részének bitenkénti konjunkciója, az eredmény i-edik bitjének beállításával i=31,30,...,0, 1-re, ha mindkét operandus i-edik bitje 1, és egyébként az i-edik bit 0-val egyenlő beállítása;

    a &0 verem tetejének és aljának bitenkénti diszjunkciója, az eredmény i-edik bitjének beállítása, i=31,30,...,0, 0-ra, ha mindkét operandus i-edik bitje 0, és egyébként az i-edik bit 1-gyel egyenlő beállítása;

    bitenkénti összeadás (nem ekvivalencia) a felső és alsó "+", az eredmény i-edik bitjének 0-ra állítása, ha mindkét operandus i-edik bitje azonos értékű, és az eredmény i-edik bitjének beállítása az eredmény 1, ha az operandusok i-edik bitjeinek értéke különbözik.

525 INV 722 & 136 & 0 325 "+"

A bitenkénti kötőszót gyakran használják a szó bitjeinek visszaállítására (törlésére). Ehhez az eredeti szót egy maszkkal kombinálják, amelyek nullákat tartalmaznak azokban a bitekben, amelyeket törölni kell, és egyeseket a fennmaradó bitekben. Például, ha valamilyen X szóban vissza kell állítani a 3-tól 5-ig terjedő biteket, akkor ennek bitenkénti konjunkcióját kell végrehajtania a 37777777707 maszkkal. X=235 esetén a következőt kapjuk:

A bitenkénti diszjunkció segítségével a kívánt bitkombinációt beilleszthetjük egy korábban törölt szóbitcsoportba. Tegyük fel például, hogy az utolsó példa eredményeként a veremben maradt szó 3-5. bitjébe be kell helyezni a 010 bináris kombinációt. Ezt így lehet megtenni:

A bitmanipulációs műveletek logikai eltolási utasításokat is tartalmaznak:

    balra eltolás SHL - a verem tetejének minden bitje a 31.-től kezdve az utána következő értékét veszi fel a számok csökkenő sorrendjében, az utolsó, nulla bit pedig 0 értéket vesz fel;

    jobb eltolás SHR - a verem tetejének minden bitje 0-tól kezdve a következő értékét veszi fel a számok növekvő sorrendjében, a 31. bit pedig 0-t;

    top shift SHT - a felső elemet eltávolítjuk a veremből, és egész N-nek tekintjük, amely azt jelzi, hogy hány eltolást és milyen irányba kell végrehajtani a verem tetején: ha N>0, balra tolódik, ha N<0 - вправо.

B8 125 SHR SHL -2 SHT

A balra eltolási műveletek segítségével megszorozhatjuk a számokat 2-vel N hatványára, ahol N egy természetes szám, amely meghatározza az eltolások számát. Például a -5 számot 8-cal megszorozhatja úgy, hogy ezt a számot 3 számjeggyel balra tolja:

B10 -5 3 SHT [-40]

Ebben az esetben figyelembe kell venni a túlcsordulás lehetőségét.

A jobbra eltolást 2-vel egész osztási műveletként használhatjuk N hatványára csak pozitív számok esetén, mivel a jobbra való eltolás során a legjelentősebb (előjel) bit nullára kerül. Például:

mivel

Forgassa el a verem tetejét 1 bittel jobbra ROR és bal ROL hasonló a logikai eltolási utasításokhoz, azzal a különbséggel, hogy a kinyomott élbit nem tűnik el, hanem a 32 ellentétes végéből tolódik a megüresedett helyre. -kicsit hosszú szó. Például (hexadecimális számok):

A DSSP processzor SWB és SWW parancsai szintén bináris kódok feldolgozására szolgálnak. Az SWB funkció a verem felső részének alsó felének bájtjait, az SWW funkció pedig a verem felső felének felcserélését szolgálja. Nézzük meg, hogyan működnek ezek a parancsok a hexadecimális I/O módban (ebben a módban minden bájt két hexadecimális számjegyből áll):

B16 0ABCD SWB SWB

0ABCDEF12 SWW SWB

A veremkezelési parancsok fontos szerepet játszanak a PARA nyelvben. Nem változtatják meg a veremben lévő adatok értékeit, csak a helyüket változtatják meg, megkönnyítve a veremben lévő operandusok elérését.

Három parancs létezik a veremelemek eltávolítására: D, DD, DS (Drop - Discard). A D parancs egy (felső) elemet távolít el a veremből, DD - két elemet, például:

D DD D A DS eltávolítja az összes elemet a veremből (törli a veret):

A verem tetejének másolására szolgáló parancs C (Másolás) a verem tetejének aktuális értékének másolatát tolja a verembe. Ez egyenértékű a verem felső elemének megkettőzésével: a régi csúcs lesz az alcsúcs, a másolata pedig az új csúcs. Példa:

Ennek a parancsnak az alkalmazását a p(x)=3*x**2+4*x-5 polinom kiszámításának példáján mutatjuk be Horner séma szerint: p(x)=(3*x+4)* x-5. Feltételezzük, hogy az x érték a verem tetején található.

[x] C 3 * 4 + * 5 -

A PARADISE nyelvben a verem tetejének másolására vonatkozó parancs mellett vannak C2, C3, C4 parancsok is, amelyek 2, 3, 4 mélységben lévő elemeket másolnak. Működésüket a következő példákkal magyarázhatjuk:

C2 C4

Van egy CT-parancs is, amellyel a verem tetején megadott mélységben másolhat egy elemet. A CT végrehajtásakor a processzor eltávolítja a legfelső elemet a veremből, értékét a másolt elem mélységének jelzőjeként használja, és az utolsó elem másolatát a verembe tolja. Tehát egy 5-ös mélységben található elem másolását egy 5 CT utasításpár határozza meg, amelyek végrehajtása során a processzor az 5-ös számot a verembe tolja, majd végrehajtja a CT utasítást. A CT végrehajtása az 1, 2, 3, 4 paraméterekkel egyenértékű a C, C2, C3, C4 parancsokkal.

Az E2, E3, E4 (Csere - csere) csereparancsok a verem első (felső) elemét rendre a 2., 3., 4. elemmel permutálják, azaz a 2, 3, 4 mélységben található elemmel. Például:

E3 E2

Nagyobb mélységben történő cseréhez az ET utasítást használják, amely a CT-hez hasonlóan a verem tetejének értékét használja az első elemmel cserélt elem mélységének jelzőjeként. Például:

5ET

A 2, 3, 4 paraméterekkel rendelkező ET parancs megegyezik az E2, E3, E4 parancsokkal.

A másolási és csereparancsok használatának szemléltetéséhez vegye figyelembe a betanítási problémát. Három szám van a veremben. A verembe kerüléshez szükséges: . A következő programot tudjuk javasolni, melynek értelme a hozzászólásokból kiderül.

C3 C3 C3+

E4+E4

Ez a példa jól mutatja, milyen nagy szerepe van a megjegyzéseknek, tükrözve az operandusverem állapotát.

A programoknak gyakran össze kell hasonlítaniuk egymással a számértékeket, és az összehasonlítás eredményétől függően különböző eljárásokat kell végrehajtaniuk. A RAYA nyelvnek vannak összehasonlítási parancsai<, =, >. Számokon keresztül vannak definiálva, és ennek eredményeként a 0 és 1 számértékeket állítják elő. Így a parancs< потребляет из стека два элемента и засылает в стек число 1, если значение нижнего элемента оказалось меньше значения верхнего, а в противном случае засылает 0. Например, в результате выполнения последовательности 5 -20 < в стек будет заслан 0. Команда = засылает 1 в случае равенства потребленных ею элементов. Команда >1-et küld, ha az alsó elem nagyobb, mint a felső elem. A nem szigorú összehasonlítások programozásához (kisebb vagy egyenlő, nagyobb vagy egyenlő), a NOT parancsot használják, amely a verem nullával nem egyenlő felső értékét nullára, a nullával egyenlő értékét pedig nullára cseréli. egy. Például az x>=5 logikai kifejezés kiértékelése, ahol x valamilyen szám a verem tetején, a következőképpen adható meg:

[x]5< NOT

A programozási feltételek lehetőségeinek további bővítését az összehasonlító parancsokkal együtt a & konjunkció (logikai ÉS) és a &0 diszjunkció (logikai VAGY) logikai műveleteinek alkalmazása biztosítja. Legyen például szükséges, hogy a veremben 1 legyen, ha a csúcsban lévő x szám a C 5 félszegmenshez tartozik< NOT C2 10 <

& E2 2 = &0

Az összehasonlítás eredményétől függő programmenedzsment eszközökről később lesz szó.

Az eljárások meghatározása

Alapvető programozási technikaként a PRSP lehetőséget ad a felhasználónak elnevezett műveletsorozatok, úgynevezett eljárások meghatározására. Legyen szükséges például a 3*x**2-4*x+9 négyzetháromtag értékeinek kiszámítása adott x értékekhez. Ebben az esetben meg kell határoznia egy eljárást, amely megvalósítja a trinomikus képletet, és kiadja az eredményt a terminálnak, majd ezt az eljárást alkalmazza adott x értékekre. A kívánt eljárást, nevezzük PX-nek, a következőképpen definiáljuk: : PX [x] C 3 * 4 - * 9 + . D; A kettőspont az "eljárás meghatározása" műveletet jelenti, az eljárás neve elválasztó szóköz után a kettőspontot követi. A meghatározó parancssor (eljárástörzs) az eljárás nevét követi, és pontosvesszővel végződik. Röviden, az eljárás a következő formában van meghatározva:

: <имя процедуры> <тело процедуры> ;

A PARADISE nyelvben az eljárás elején és végén kommentálni kell az operandusverem állapotát. Az eljárás törzsében a megjegyzéseket a programozó belátása szerint nehezen érthető helyeken helyezik el.

A megjegyzések segítik az embert az eljárás megértésében és használatában, míg a processzor egyszerűen figyelmen kívül hagy mindent, ami zárójelben van. Emiatt egyetlen eljárás definíciójának terminálból történő megadásakor a megjegyzések elhagyhatók.

Az eljárás definíciójának megadása után és a gomb megnyomásával a processzor értesül a bevitel végéről, a terminál képernyőjén egy csillag jelenik meg, jelezve a "define procedúra" parancs végrehajtását és a processzor készségét a párbeszéd folytatására. Most már alkalmazhatja a PX eljárást a billentyűzet által megadott x értékekre, például 2, 3, 4 (a processzor által kiadott érték alá van húzva):

*2PX 13

*3PX 24

*4PX 41

Határozzuk meg egy általánosabb eljárást az a2*x**2+a1*x+a0 formájú trinom kiszámítására, amely lehetővé teszi mind az x, mind az a0, a1, a2 értékét. Nevezzük PXA-nak:

: PXA C E4 E3 * + * + ;

PXA használatakor az a0, a1, a2, x értékeknek a kívánt sorrendben kell lenniük a veremben. Például: a0=1, a1=2, a2=-3, x=4

* 1 2 -3 4 PXA . D -39

Az eljárás törzsében a processzor alapműveletei mellett a felhasználó által meghatározott eljárások is lehetnek. Például definiálhat egy P eljárást, amely a PXA által végzett számításokon kívül kiadja az eredmény másolatát a terminálnak, és eltávolítja az eredményt a veremből.

:PXA. D;

Az eljárás törzse különösen tartalmazhatja a definiálandó eljárás nevét, azaz az eljárás lehet rekurzív. Például:

: IDŐ [t] 1- IDŐ ;

Ez az eljárás 1-gyel csökkenti a verem tetejének értékét, és ismét önmagára hivatkozik, azaz időszámlálóként működik.

Az IDŐ számláló elvileg nem állhat meg: az egyik kivonása újra és újra megtörténik, miközben a processzor fut. De a DSSP-ben vannak olyan eszközök, amelyek lehetővé teszik a folyamat lefolyásának vezérlését a kapott eredmények függvényében - a program menetének kezelésének művelete.

Feltételes végrehajtás és ismétlés

Lineárisnak nevezzük azt a programot, amely a rekordban egymás után végrehajtott parancsok sorozata. Annak érdekében, hogy a program könnyen látható (olvasható) és érthető legyen, elnevezett részekre van osztva, amelyeknek bizonyos jelentése van - eljárásokra, amelyek mindegyike saját eljárássorozattal van meghatározva, amelyeket viszont kisebb eljárások sorozatai határoznak meg, stb. a PRSP-parancsok sorozatai által közvetlenül meghatározott eljárásokhoz. Az ilyen, eljárásdefiníciók hierarchiájaként írt programot strukturáltnak nevezzük. Strukturált programozásnak nevezzük a strukturált program felépítésének azt a módszerét, amely a megoldandó feladat egyre kisebb részfeladatokra történő fokozatos felosztásából áll.

Nem csak lineáris, hanem tetszőleges program strukturált programozási módszerével történő létrehozása lehetséges egy eljárás feltétel szerinti végrehajtása, egy eljárás ismétlése és az ismételt eljárásból való kilépés műveletei mellett. A DSSP-ben elérhető ilyen jellegű parancskészlet lehetőséget ad egy tetszőleges program strukturált felépítésére.

Az eljárás végrehajtásának vagy nem végrehajtásának feltételei a szám előjeléhez viszonyítva, pontosabban annak az értéknek az előjeléhez viszonyítva vannak megfogalmazva, amellyel a verem teteje éppen rendelkezik. Az eljárás feltételes végrehajtásának fő parancsa - BRS (BRanch on Sign - ágról jelre) a BRS-ről elnevezett három eljárás valamelyikének végrehajtására utasítja, a verem tetejének aktuális értékének előjelétől függően. A BRS végrehajtásakor a processzor eltávolítja a veremből a legfelső elemet, teszteli az értékét, és ha negatív, akkor végrehajtja a fenti eljárások közül az elsőt, ha nulla, akkor a másodikat, és ha pozitív, akkor a harmadikat. Szóval csapat

egy elem eltávolítását eredményezi a veremből, és végrehajtja az N eljárást, ha az eltávolított érték negatív, végrehajtja a P eljárást, ha pozitív, és végrehajtja a Z eljárást, ha egyenlő nullával.

Példa a BRS parancs használatára az SGN eljárás alábbi meghatározása

: SGN [X] BRS -1 0 1 ;

Ez a rutin a verem tetején lévő X értéket -1-re cseréli, ha X<0, числом 0, если X=0, и числом 1, если X>0. Az SGN eljárás elérhető a PRSP-ben, mint alapvető processzorművelet.

A BRS parancs a három adat közül egy eljárás kiválasztásával együtt lehetővé teszi az IF-THEN és IF-THEN-ELSE formájú kétértékű operátorok megvalósítását. Például az if x>0, then P1 else P0 utasítás a BRS P0 P0 P1 parancsnak felel meg, az utasítás pedig ha x<>0, majd P - parancs BRS P NOP P, ahol a NOP egy üres művelet neve. A DSSP-ben azonban hatékonyabb a kétértékű feltételek – az IF-, IF0, IF+, BR-, BR0, BR+ parancsok – megvalósítása.

Az IF csoport parancsai megfelelnek az IF-THEN utasításnak. Például az IF-P parancs arra utasítja, hogy távolítsa el a legfelső elemet a veremből, és tesztelje az előjelét, és ha ennek az elemnek mínuszjele van, akkor hajtsa végre a P eljárást. Az IF0 P és IF+ P parancsok a P eljárás végrehajtására szolgálnak. , illetve abban az esetben, ha az eltávolított elem nulla, és ha értéke pozitív.

Az IF csoport parancsainak használatát illusztráló példaként megadjuk az ABS alapnyelvi parancs definícióját, amely a verem tetejének modulusát számítja ki.

: ABS [X] C IF-NEG [|X|] ;

A BR-, BR0 és BR+ parancsok megfelelnek az IF-THEN-ELSE utasításnak, és arra utasítják, hogy válasszon egyet az utánuk meghívott két eljárás közül. Ha a veremből eltávolított elem előjele megegyezik a parancsmegjelölésben szereplővel, akkor az elsőként megnevezett eljárás, ha pedig nem egyezik, akkor a második eljárás kerül végrehajtásra. Például a BR0 P0 P1 parancs a P0 eljárás végrehajtását utasítja abban az esetben, ha a veremből eltávolított elem nulla, és ha ez a feltétel nem teljesül, akkor hajtsa végre a P1 eljárást.

A figyelembe vett parancsok lehetővé teszik az eljárás végrehajtásának gazdaságos programozását az adott feltételek függvényében. Az x forma leggyakoribb feltételei<0, x=0, x>A 0-t közvetlenül az IF csoportparancsok valósítják meg. Feltételek x<=0, x<>A 0, x>=0 a BR-, BR0, BR+ utasításokkal programozható, az üres NOP művelettel első eljárásként. Például az a mondat, ha x<=0 then P соответствует команда BR+ NOP P. Примером использования команд группы BR может служить следующая реализация команды базового языка NOT, заменяющей нулевое значение вершины стека единицей, а ненулевое - нулем.

: NEM [x] BR0 1 0 ;

A programelágazás gyakran összehasonlító parancsok után történik (<, =, >), amelyek két szám összehasonlításának eredményétől függően 1 vagy 0 logikai értéket adnak. A MAX alapnyelvi parancs például a következőképpen programozható:

: MAX C2 C2< IF+ E2 D ;

Az elágazási utasítások csoportjába tartozik a BR kiválasztási utasítás is, amely a következőképpen íródik:

BR A1 P1 A2 P2 ... AK PK ... AN PN MÁS P0

Az utasítás végrehajtásakor a processzor először végrehajtja az A1 mutató eljárást, és összehasonlítja a verembe tolt értéket az alatta lévő verem előző tetejének értékével. Ha az értékek egyeznek, akkor a legfelső két elemet eltávolítjuk a veremből, és végrehajtjuk az A1 mutatóhoz tartozó P1 eljárást, amely után áttérünk a BR utasítást követő utasításra (azaz a fenti bejegyzésben, a szövegben a P0 szót követő program). Ha az összehasonlított értékek nem egyeztek, akkor egy felső elemet eltávolítanak a veremből (azaz A1 eredményét), és ugyanazokat a műveleteket hajtják végre az A2 P2 párral, majd ha az egyezés nem sikerült, akkor az A3 P3 párral stb. AN PN-ig beleértve. Abban az esetben, ha egyik próbálkozás sem ad egyezést, akkor az ELSE szóról elnevezett P0 eljárás kerül végrehajtásra. Általában a numerikus konstansok mutató eljárásokként működnek, például:

[x] C BR 5 NEG -3 ABS 0 NEM MÁS T0 [y]

Ennek a sornak a végrehajtása eredményeként az y=-5 értéket kapjuk a verem tetején, ha x=5; y=3, ha x=-3; y=1, ha x=0, ellenkező esetben y=0.

Általánosságban elmondható, hogy a pointer eljárás nem csak numerikus konstans lehet, hanem változó vagy bármilyen más eljárás, amely eleget tesz annak az egyszerű követelménynek, hogy ne dobjon ki semmit a veremből, és egyetlen értéket nyomjon a verembe.

A feltételes eljárás-végrehajtási műveletek használatának szemléltetésére módosítsuk az előző részben a TIME eljárást úgy, hogy a számláló leálljon egy adott feltétel megadásakor:

: IDŐ [t] 1- C IF+ IDŐ ;

Most ez a TIME rutin csak akkor hívja meg magát, ha a verem teteje pozitív. A számláló pontosan N-szer fog működni, ha a TIME első végrehajtásának elején a csúcs pozitív N számot tartalmaz. Például 7 számlálás eléréséhez meg kell adni

7 alkalommal<ВК>

Mivel az IF+ a TIME definíciójában, mint minden feltételes művelet, eltávolítja a tesztelt elemet a veremből, és ez az elem szükséges a későbbi műveletekhez, meg kell duplikálni a C (Copy) művelet IF+ elé helyezésével.

A rekurzió nem az elsődleges eszköze egy eljárás ismételt végrehajtásának. A programozási ciklusokhoz a PARADISE nyelven léteznek RP (Ismétlés - Ismétlés) és DO (Do - Do, perform) parancsok.

Az RP W parancs arra utasítja, hogy korlátlan számú alkalommal hajtsa végre a W eljárást újra és újra. Ahhoz, hogy az ismétlések leálljanak, a W eljárás törzsének tartalmaznia kell egy EX (Exit - exit) műveletet, amely adott feltételek mellett végrehajtódik. Az EX művelet az EX műveletet tartalmazó ismételt eljárás után a programszöveget követő eljárás végrehajtására ugrik. Így a fenti TIME rekurzív eljárásként megvalósított számláló a W eljárás ismétléseként programozható, amely a következőképpen definiálható:

: W [t] 1- C IF0EX ;

Ahhoz, hogy a számláló 25-ször működjön, végre kell hajtani a sort

A feltételes végrehajtási utasításokban használt EX művelet mellett léteznek olyan EX-, EX0, EX+ feltételes kilépési műveletek, amelyek ugyanazt a hatást fejtik ki, mint az IF-EX, IF0 EX, IF+ EX utasítások, azaz a felső elemet fogyasztják. amely teszteli az előjelét és kilép, ha a jel megegyezik a műveletmegjelölésben megadottal. Az EX, EX-, EX0, EX+ műveletek nem feltétlenül a legtöbbször ismételt eljárás törzsében (esetünkben W), hanem azokban az eljárásokban is használhatók, amelyekre hivatkozik.

Példaként tekintsük két természetes szám legnagyobb közös osztójának megtalálásának problémáját az euklideszi módszerrel. A módszer lényege, hogy egy nagyobb számból kisebb számot kell kivonni, amíg a számok egyenlővé nem válnak. Az egyenlőség elérésekor megtaláljuk a legnagyobb közös osztót.

A programozás felülről lefelé irányuló fejlesztési módszerrel történik. Először definiáljuk a GCD eljárást, amely rögzíti az algoritmus általános sémáját. Ennek az eljárásnak a paraméterei két M és N szám a veremben, amelyekre a legnagyobb közös osztó található. A GCD eljárás törzsében meg kell adni egy ciklikus folyamatot a veremben lévő értékek konvertálására. A folyamat eredményeként két egyenlő számnak kell maradnia a veremben - bármelyiket tekinthetjük a legnagyobb közös osztónak. Ezeket a szempontokat szem előtt tartva a GCD eljárás a következőképpen definiálható.

: gcd RP STEP [nod(M,N),nod(M,N)] D [nod(M,N)] ;

Most az iteratív folyamat egy lépését kell programozni, pl. határozza meg a STEP eljárást. Paraméterei két szám a veremen. Össze kell hasonlítania ezeket a számokat, és ki kell lépnie a ciklusból, ha egyenlők, ellenkező esetben vonja ki a kisebbet a nagyobbból. Ez megtehető például a következőképpen:

: LÉPÉS C2 C2 - BRS NOP EX E2 C2 - ;

Most már nem maradt definiálatlan eljárás a programban, és elkezdheti tesztelni. Az ellenőrzést alulról felfelé kell elvégezni, azaz először meg kell győződnie arról, hogy a STEP eljárás megfelelően működik, és csak ezután - a GCD.

A DO alapnyelvi művelet hatására a róla elnevezett eljárás N-szer megismétlődik, ahol N a verem tetején lévő szám a DO végrehajtásának időpontjában. Például ahhoz, hogy a P eljárást 8-szor lehessen végrehajtani, meg kell adni

8 D.O.P

Ha a P eljárás törzsében van legalább egy kilépési művelet, és annak végrehajtásának feltétele teljesül, mielőtt a megadott számú ismétlés megtörténik, akkor az ismétlések az eljárásból való kilépéssel megszakadnak, ugyanúgy, mint a az RP művelet. Például, ha a DO megismétli a fenti W eljárást, amelynek definíciója tartalmazza az IF0 EX-et, a [T] 30 DO W írása 30 W ismétlést okoz, ha T>=30. Ha 0

Ha a DO művelet végrehajtására a verem teteje nulla vagy negatív értékkel rendelkezik, akkor a DO-t követő eljárás még egyszer sem kerül végrehajtásra.

A DO művelet használatának szemléltetésére definiáljuk a NUM eljárást, amely megszámolja a verem tetején megadott 32 bites x szó nem nulla bitjeit.

Az egységek számának számlálója a verem tetejére kerül. Az egységek számlálása abból áll, hogy 32-szer megismételjük a NUMI eljárást, amelyben megvizsgáljuk az x szó egy bitjét. A ciklusból való kilépéskor a kívánt számnak a verem tetején kell lennie.

: NUM [x] 0 E2 32 DO NUMI D [N] ;

A nem nulla bitek megszámlálásához azt a tényt használjuk, hogy a szó legmagasabb (31.) bitjében lévő egység egy negatív szám előjele. Ha a vizsgált szó negatív, akkor hozzá kell adni egyet az N-hez. A NUMI eljárás végén a vizsgált szót egy kicsit balra kell tolnia.

: NUMI C IF- N+ SHL ;

Az N+ eljárás megvalósítása meglehetősen egyszerű: hozzá kell adni egyet a verem tetejéhez anélkül, hogy a tetejét megváltoztatná.

: N+ E2 1+ E2;

Az ismételhető eljárások tartalmazhatnak RP és DO műveleteket a testükben, ami beágyazott hurkokhoz vezethet, és a beágyazás bármilyen mélysége megengedett. Ebben az esetben van egy EXT művelet a beágyazott hurokból való kilépéshez, amely jelzi a beágyazás mélységét a verem tetején. Például a két egymásba ágyazott hurokból való kilépés a következőképpen határozható meg:

Nem szabad megfeledkezni arról, hogy az EXT parancs használata fokozott odafigyelést igényel, mivel a program módosításakor a hurkok egymásba ágyazási mélysége megváltozhat, és az EXT előtti megfelelő állandót módosítani kell.

Elnevezett adatok

Az operandusverem a fő, de nem az egyetlen mechanizmus az adatok manipulálására a PRSP-ben. Az eljárásdefiníciókkal együtt lehetőség van elemek és szabványosan szervezett adatelem-gyűjtemények (ún. struktúrák) deklarálására is, amelyek ezután nevükön használhatók. Az adatdeklarációk megvalósításával a processzor lefoglalja a tárolásukhoz szükséges memóriát, és biztosítja a szükséges mechanizmusokat a memória eléréséhez.

Az alap PRSP nyelv számos, az alábbiakban tárgyalt direktívát tartalmaz a változók és tömbök deklarálására. A rendszer nyelvének bővítése érdekében más ilyen jellegű szavakat és ennek megfelelően más elemeket, adatstruktúrákat is be lehet vinni abba.

A VAR szó egy 16 bites numerikus változót deklarál. Például a bejegyzés

deklarál egy X változót, azaz közli a processzorral, hogy az X név egy változó neve. A processzor ehhez a névhez egy 16 bites memóriahelyet társít, amely ennek a változónak az értékét tárolja. Az operandusverem tetején található X változó értékének hozzárendelésére vonatkozó utasítás:

A parancs végrehajtásával a processzor eltávolítja a legfelső elemet a veremből, és beírja annak értékét az X változóhoz lefoglalt cellába.

Egy csak egy változó nevéből álló parancs, amely előtt nincs ! betű, ennek a változónak az értéke kerül a verembe, és a feltöltés a megfelelő memóriacella tartalmának, azaz az értékének másolásával történik. a változó változatlan marad. Így az X változó nevének bármilyen előfordulása a programban, ha közvetlenül nem előzi meg egy másik műveletet előíró szó, ennek a változónak az aktuális értékét a verembe tolja, ugyanúgy, mint a közvetlenül adott számokat (numerikus literálokat). tolják.

Példaként adjuk meg a fentebb tárgyalt GCD eljárás egy másik változatát, amelyben két munkaváltozót használunk.

: BÓLINT! X! Y RP X LÉPÉS [GCD] ;

: X LÉPÉS Y = EX+ X Y BR+ X-Y Y-X ;

: X-Y X Y - ! X;

: Y-X Y X - ! Y ;

Mint látható, a program kissé hosszabb lett, de az áttekinthetősége nőtt.

A VCTR szó egy 16 bites cellákból álló egydimenziós tömböt (vektort) deklarál, és ennek a tömbnek a legmagasabb elemének számát a csúcsérték adja. Például az írás hatására

9 VCTR ROW, a processzor 10 szekvenciálisan címezhető 16 bites memóriaszót foglal le, így egy ROW(0:9) vektort alkot. Először a 9-es szám kerül a verembe, majd a VCTR eljárás végrehajtásra kerül, a verem legfelső eleme segítségével meghatározva a létrehozandó ROW vektor hosszát.

A verembe tolva a ROW vektor j-edik elemének értékét, 0<=j<=9, задается командой

[j]SORA

A veremben lévő elemszámot paraméterként használva a ROW vektornév hatására ez a szám lecserélődik a megfelelő elem értékére. Ha közvetlenül a ROW vektor neve előtt van egy szó, akkor ennek a vektornak a csúcs által jelzett eleméhez rendeljük az alcsúcs értékét, és a veremmélységet 2-vel csökkentjük. Például visszaállíthatja az 5. a ROW vektor eleme a következőképpen:

Lehetőség van konstans vektorok kombinálására is, pl. 16 bites számok vektorai, amelyek értékei a deklaráláskor vannak meghatározva, és a jövőben nem változnak. Így egy L+1 hosszúságú 16 bites VC konstans vektort a CNST szó használatával deklarálunk a következő formában:

CNST VC k0 k1 ... kL ;

ahol k0, k1, ... kL olyan parancsok, amelyek egy értéket helyeznek a verembe. Leggyakrabban ezek csak numerikus literálok, de előfordulhatnak változók nevei, eljárások, valamint szópárokból álló parancsok is, mint például az alábbiakban tárgyalt "X" változó címének elküldésére szolgáló parancs. Egy konstans vektor elemeinek elérése ugyanúgy történik, mint a reguláris vektorok komponenseihez, például:

A 16 bites szavak többdimenziós tömbjét az ARR szóval deklarálják, amelyet az egyes dimenziók maximális indexértékei és a dimenziók száma előz meg. Például a TIR(0:8,0:2,0:24) háromdimenziós tömb a következőképpen van deklarálva:

Az ARR előtti 3-as szám jelzi a deklarált tömb méretét.

Egy tömb elemének a verembe való tolása úgy érhető el, hogy megadjuk az elem indexét, majd a tömb nevét. Például a TIR(0,2,2) elemnek a verembe helyezésére vonatkozó parancsot a következőképpen fejezzük ki

Ennek megfelelően a verem tetejének aktuális értékének hozzárendelését ehhez az elemhez a parancs adja meg

Az összes vizsgált példa 16 bites szavakból struktúrák létrehozását illusztrálta. A nyelv azonban lehetővé teszi 32 bites szavak és 8 bites bájtok struktúráinak meghatározását is. Ehhez a szerkezetet meghatározó szó elé LONG, illetve BYTE kerül. Például,

5 BYTE VCTR X - egy 6 komponensű X bájtvektor meghatározása;

BYTE CNST Y 65 66 67 ; - 3 komponensű bájtos Y vektorállandó meghatározása;

10 20 2 LONG ARR MTRX - hosszú szavak mátrixának meghatározása MTRX(0:10,0:20).

A szó- és bájtszerkezetek elemeinek olvasása pontosan ugyanúgy történik, mint a 16 bites szószerkezetek esetében. Ha az elem hossza kisebb, mint 32 bit, akkor a kivont értéket a rendszer a verem tetejének alsó szójába vagy bájtjába helyezi, a felső felső része pedig nullára. A veremben a 32 bites hosszú szó alacsony szava vagy bájtja szintén a szó vagy bájtstruktúra eleméhez rendelt értékként fogható fel.

Bár alapértelmezés szerint a 16 bites szóformátumot használják az adatok meghatározásakor, a WORD jelöléssel is rendelkezik. Célszerű ezt az előtagot használni, ha a programot más gépekre kell átvinni, ahol a DSSP is implementálva van, és az alapértelmezett ettől eltérő lehet.

A bájt adatstruktúrákat leggyakrabban szöveges információk tárolására és feldolgozására használják. Ez annak a ténynek köszönhető, hogy egy bájt van lefoglalva a számítógép memóriájában egy karakter kódolásához. A karakterek kódjainak beállításához a PARADISE nyelven van egy #l konstrukció, ahol l a számítógép billentyűzetén elérhető bármely karakter. A DSSP processzor ezt a konstrukciót parancsként érzékeli, amely az l betűt a verembe helyezi. Például:

Ez a konstrukció ugyanazokat a műveleteket hajtja végre, mint a megadott karakter kódjával megegyező numerikus literál, de használata előnyösebb, mivel egyrészt kiküszöböli a kódok emlékezésének szükségességét, másrészt érthetőbbé teszi a programokat. Az Y konstans vektornak különösen a következő definíciója lehet:

BYTE CNST Y #A #B #C ;

Gyakran célszerű a szimbolikus jelölést használni egy numerikus állandóhoz egy programban. Ennek a lehetőségnek a biztosítására van egy meghatározó VALUE szó:

Ez a parancs kiemeli a legfelső elemet a veremből, és létrehozza a szót közvetlenül a VALUE után. Ennek a szónak a használata egyenértékű egy numerikus állandó használatával. Például:

Memóriával való munka fizikai címek alapján

A figyelembe vett eszközök a számítógép címrendszerétől függetlenül lehetőséget adnak adatok elnevezésére és adatkezelésre. De az alapnyelv olyan eszközöket is tartalmaz, amelyek lehetővé teszik a memóriaelemek címeinek kezelését. Egy X változó vagy tömbelem címét a parancs a verembe tolja

Tömbelem esetén ezt a parancsot az index(ek) értéke előzi meg.

Az alapnyelvi @ utasítás lecseréli a verem tetején lévő hosszú memóriaszó címét a hosszú szó által tartalmazott értékre. Például az Y változó értéke a verembe tolható a következő sor végrehajtásával:

A @B utasítás lecseréli a címet a megfelelő bájt értékére, feltételezve, hogy a verem felső részének magas bájtjai nullák, az @L utasítás pedig a címet egy 32 bites szóra cseréli.

Vannak utasítások az értékek memóriába írásához is. A !T parancs a 16 bites sub-top értéket írja a verem tetejéről előugró címre. A !TB parancs az alcsomópont alacsony bájtjának hasonló írását okozza a csomópont által címzett bájthoz, a !TL pedig az alcsomópont 32 bites szavát írja a csomópont által címzett szóhoz. Például hozzárendelheti a 15 értéket a BV(0:5) bájtvektor ötödik eleméhez a következő parancsokkal:

15 5" B.V.!TB

A fizikai címeken lévő memóriával való munka szükségessége általában akkor merül fel, amikor olyan programokat hoz létre, amelyek egy adott számítógép architektúrájától függenek, például bemeneti / kimeneti illesztőprogramok létrehozásakor.

További adat- és memóriaműveletek

A programok nagyobb hatékonysága és tömörsége érdekében a következő műveleteket vezettük be a PARA nyelvbe:

0 <имя переменной>- reset a változó;

1 <имя переменной>- egy változóhoz egységet rendelni;

1- <имя переменной>- csökkentse a változó értékét eggyel;

1+ <имя переменной>- növelje a változó értékét eggyel;

!- <имя переменной>- kivonjuk a változóból a verem tetejének értékét;

!+ <имя переменной>- adjuk hozzá a változóhoz a verem tetejének értékét.

Ezen műveletek mindegyike könnyen programozható változók olvasási és írási parancsaival. Például,

0 X egyenértékű 0-val! x

1+ X egyenértékű X 1+-val! x

X ekvivalens X E2 - ! x

Ezen műveletek használata növeli a programok hatékonyságát és láthatóságát.

A gyakorlatban gyakran szükséges egy tömb összes eleméhez egyetlen értéket rendelni. Van erre egy művelet a PARADISE nyelven!!!<имя массива>. Művelete az, hogy a verem tetejének értékét hozzárendeli a megadott tömb összes összetevőjéhez. Művelet!!! bármilyen formátumú elemet tartalmazó tömbökre alkalmazható.

Használati példa:

a "space" karakterkód a BUF bájttömb összes összetevőjére van írva.

Gyakran szükséges információkat szerezni egy programban egy név mögötti adatszerkezetről. Egy pár parancs SIZE? - adja meg az adatelem formátumát: 1, 2 vagy 4 byte, és DIM? - visszaadja a struktúra adatelemeinek számát. Például, ha adatokat deklarálnak

3 4 2 HOSSZÚ ARR Z

akkor velük kapcsolatban ezek a parancsok a következő eredményt adják (tizedes számok):

MÉRET? X MÉRET? Y MÉRET? Z

HOMÁLYOS? X DIM? Y DIM? Z

A DSSP processzor utasításkészlete kiegészítésként négy utasítást tartalmaz, amelyek lehetővé teszik a számítógépes memóriacellák egyes bitjeinek olvasását és írását. Ezek a @BI, !BI, !BI0, !BI1 parancsok. Mindegyik paraméter a veremben lévő memóriaszó címe és a szóban lévő bitek száma (emlékezzünk arra, hogy a bitek számozása jobbról balra történik, nullától kezdve). A !BI parancs a veremben való jelenlétet és az írandó bit értékét is feltételezi. A @BI parancs lecseréli a megadott paramétereket a kiválasztott bit értékére (0 vagy 1), a !BI0 és!BI1 parancsok 0, illetve 1 értéket rendelnek a kiválasztott bithez, eltávolítva a paramétereiket a veremből, és a A !BI parancs a kiválasztott bitet a verem harmadik elemének legkisebb jelentőségű bitjére állítja, és mindhárom paraméterét eltávolítja a veremből. Például, ha az X változó értéke az 101101 bináris szám, akkor a felsorolt ​​műveletek eredménye a következő lesz:

" X [addr. X] 3 @BI - X harmadik bitje, 0 " X 3 !BI - X 100101,

" X [addr.X] 0 !BI0 - X értéke 100100,

" X [addr.X] 1 !BI1 - X a 100110.

A PARADISE nyelv rendelkezik a memóriában található bájtkarakterláncokkal való munkavégzéssel is. A bájtokból álló karakterlánc megadásához két paraméter kerül a verembe: a karakterlánc kezdőcíme (azaz az első bájt címe) és a karakterlánc hossza (a benne lévő bájtok száma).

A !!!MB paranccsal egy karakterlánc összes bájtja hozzárendelhető egy (a veremben megadott) értékhez. Három paramétert fogyaszt a veremből: , ahol b a hozzárendelendő érték, a és l a bájtkarakterlánc kezdőcíme és hossza. Legyen például nulláznia kell az elemeket a 3. és 10. bájtos tömb TXT(0:20) között. Ehhez futtassa a következő sort:

0 3" TXT 8 !!!MB

ennek eredményeként a megadott tömb nyolc egymást követő eleme a 3-tól kezdve kap 0 értéket. Egy hasonló parancs!!!MW úgy van kialakítva, hogy egy 16 bites szavak sorozatát azonos értékkel (szavak számával) töltse ki. a verem tetején van feltüntetve), és a parancs! !!M - hosszú szavak sorozatának kitöltése.

Az !SB parancs bájtkarakterláncokat küld. Paraméterei: , ahol a1 és l a továbbított karakterlánc kezdőcíme és hossza, a2 pedig annak a karakterláncnak a kezdőcíme, amelyre a továbbítás történik. A!SB parancs végrehajtása következtében az a2 címről egy l hosszúságú bájtkarakterlánc kerül a memóriába, amely az átvitel végrehajtása előtt az a1 címen található karakterlánc pontos másolata. A forrás és a cél karakterlánc átfedheti egymást. Legyen például az M(0:10) bájttömb elemeit a következőképpen mozgatva: M(10):=M(9), M(9):=M(8), ..., M(1):=M(0). Ehhez használhatja a!SB parancsot:

0" M 10 C2 1+ !SB

ennek eredményeként egy 10 bájtos karakterlánc egy bájttal elmozdul a memóriacímek növekedésének irányába.

Az!SB parancs kényelmes a karakterláncokkal való munkavégzéshez (emlékezzünk arra, hogy minden karakter egy bájttal van kódolva). Lehetővé teszi például, hogy egy bájttömbhöz hozzárendeljük egy explicit módon megadott literális karakterlánc értékét. Egy ilyen karakterlánc megadásához szövegliterált használnak, azaz. idézett karaktersorozat, például "SZÖVEG SZÓRÓ". Ez a konstrukció, ha egy programban találkozik, az idézett szöveget tartalmazó bájt karakterlánc kezdőcímét és hosszát a verembe tolja. Ezek a beállítások ezután használhatók az !SB paranccsal. Például a "TABLE" 0 "TN !SB" töredék hatására a "TÁBLÁZAT" literál átkerül a TN tömbbe.

Az SRCHB parancs egy adott bájtot keres egy karakterláncban. Paraméterek: , ahol b az a bájt, amelynek első előfordulását meg kell találni, a és n beállítja a keresendő karakterlánc kezdetének címét és hosszát. Ha n>0, akkor a keresés a címről a + n-1 címre történik (a címek növekedésének irányába), ha n<0, то поиск ведется с адреса a до адреса a+n+1 (в сторону убывания адресов). В результате выполнения этой команды в стеке оказывается значение d, равное смещению относительно адреса a до первого вхождения байта b. Если такое вхождение не обнаружено, то d=n. Примеры:

#T "SZÖVEG" SRCHB

#A "SZÖVEG" SRCHB

#E "SZÖVEG" [#E,a,4] 1- + -4 [#E,a+3,-4] SRCHB [-2]

Az adatokkal való munkavégzés eszközeinek áttekintését befejezve térjünk ki a számítógép külső memóriájában, azaz az adatok tárolására vonatkozó kérdésnél. mágneslemezeken. A PARADISE nyelvnek van egy SAVE parancsa<имя файла>Arra utasítja, hogy a rendszer fő memóriájának másolatát tárolja a lemezen, a felhasználó által definiált objektumokkal együtt. Ebben az esetben a VAR, VCTR, ARR műveletek által az adatok számára lefoglalt memóriaterületek nem jelennek meg a lemezen. Ennek eredményeként a mentett rendszer lemezről történő betöltésekor a megadott adatok értékei nincsenek meghatározva (a program végrehajtása során kell meghatározni). A legtöbb esetben ez indokolt, hiszen nem kell lemezterületet költeni a munkaváltozók, pufferek stb. tárolására. Vannak azonban olyan adatok, amelyek értékét közvetlenül a rendszer lemezről való elindulása után kell meghatározni. Példa erre egy olyan változó, amely valamilyen külső eszközzel való adatcsere sebességét tárolja. Más árfolyamra váltáskor elegendő ennek a változónak az értékét módosítani anélkül, hogy a programon bármiféle javítást végeznénk.

Azt jelzi a processzornak, hogy valamilyen adatstruktúra elemeinek értékeit lemezre kell írni a SAVE paranccsal, például a szerkezetdefiníció előtt elhelyezett FIX előtag, pl.

FIX VAR SPEED 20 FIX BYTE VCTR TÁBLÁZAT

Az így definiált adatstruktúrákkal való munka nem különbözik a szokásos módon definiált struktúrákkal való munkavégzéstől.

Processzor vezérlőparancsok

A PARADISE nyelvben van egy kis parancscsoport a PRSP processzor, vagy inkább a PRSP processzor emulátorának vezérlésére.

Az RESTART parancs hatására a processzor újraindul. Ebben az esetben a verem törlődik, és megjelenik egy üzenet

DSSP verzió XX.XX.XX

Ingyenes XXXXXW

és a processzor parancsbeviteli várakozási módba lép. Ez a parancs hasznos a programok hibakeresésekor. Hibahelyzetek esetén is végrehajtódik: index a tömb határain kívülre, szabad memória kimerülése stb.

A \G parancs a program végrehajtásának folytatására szolgál, miután egy meghatározatlan szónál megállt. Ha az eljárás végrehajtása során a processzor egy nem definiált szóra való hivatkozást talál, üzenetet ad ki:

állj meg nem tudom<слово> .

ahol a pont a PRSP processzor promptja, jelezve, hogy a processzor leállított állapotban van egy meghatározatlan szónál. Ebben a módban bármilyen processzorparancsot végrehajthat, csakúgy, mint a normál módban, amikor a csillag a prompt. Ebből a módból kétféleképpen lehet kilépni - vagy a \G parancs végrehajtásával (ekkor a processzor folytatja a megszakított eljárás végrehajtását, kihagyva a definiálatlan szót), vagy a RESTART paranccsal.

Az EXEC parancs arra utasítja a processzort, hogy hajtsa végre azt az eljárást, amelynek címe a verem tetején található. Egy eljárás címének lekéréséhez használja a "" parancsot (két aposztróf), majd írja be az eljárás nevét. Például a parancs végrehajtásának eredményeként

az ABS eljárás címe a verembe kerül. Ezek a parancsok lehetővé teszik, hogy egy eljárást paraméterként adjon át egy másik eljárásnak.

A már említett SAVE művelet a processzorvezérlő parancsok csoportjába tartozik.<имя файла>, amely a rendszer másolatának lemezre mentésére utasítja, valamint a processzornak továbbított szöveges információ bemeneti forrását meghatározó parancsokat. Kezdetben ez a forrás a kijelző billentyűzete.

LOAD parancs<имя файла>átkapcsolja a bemenetet a megadott nevű lemezfájlra. PF parancs – parancsokat ír be a szövegszerkesztő pufferéből. A TEXEC parancs egy szöveges karakterláncot küld a processzor bemenetére, melynek paraméterei a veremen vannak megadva. Amikor a megadott forrásokban lévő parancsok végrehajtásra kerülnek, a bemenet automatikusan átvált a kijelző billentyűzetére.

Szótárkezelési parancsok

A processzor által észlelt bemeneti utasításfolyam különösen tartalmazhat utasításokat eljárások és adatok meghatározására, belső reprezentációvá fordításra és az eljárástörzs tárolására vagy a megadott adatokhoz memória lefoglalására, valamint a lefordított eljárás nevének megadására. vagy adatszerkezetet a PRSP szótárba.

A szótár megfeleltetést hoz létre a külső (a programszövegben használt) nevek és az ezeknek a neveknek megfelelő objektumok címei között a belső reprezentációban. Egy eljárás definíciójának vagy egy megnevezett adott leírásának feldolgozásakor a feldolgozó szótárt épít fel, amelyben egy új szótári bejegyzést alakít ki, amely tartalmazza a nevet (pontosabban a név első 7 karakterét) és az eljárástörzs címét. vagy ehhez a névhez társított adatleíró.

A felülről lefelé történő programozásban az eljárástestek hivatkozásokat tartalmazhatnak még nem definiált objektumokra. Ebben az esetben a szótárban szótári bejegyzések (fejlécek) keletkeznek, amelyeket a határozatlanság jelével jelölnek. Használja az UNDEF parancsot az összes meghatározatlan név megjelenítéséhez.

A szótárbővítés során lehetőség nyílik alszótárak - elnevezett szótári bejegyzésgyűjtemények - kialakítására. Az alszótár általában ugyanazon feladathoz kapcsolódó eljárásokat és adatstruktúrákat kombinálja. Az alszótárak és más programobjektumok nevei közötti összetéveszthetőség elkerülése érdekében az alszótár nevének $ betűvel kell kezdődnie. Az alszótárak bővítése vagy felhasználása céljából speciális parancsokkal nyitható és zárható be, amelyek a következőket tartalmazzák (a $v név bármely érvényes alszótárat jelent).

GROW $v - a $v alszótár növelése, azaz amíg másképp nem határozzuk meg, az összes lefordított eljárás és adat nevét a $v alszótárba helyezze;

USE $v - nyitott használatra (nevek kereséséhez benne) $v alszótár;

SHUT $v - zárja be a $v alszótár használatának lehetőségét;

CSAK $v - csak a $v alszótár legyen elérhető használatra;

MÉGSEM – CSAK az utolsót törölje.

Létezik egy ?$ parancs is, amely kiírja a kijelzőre az állapotukhoz tartozó összes alszótár nevét – függetlenül attól, hogy a keresési alszótár nyitott vagy zárt. Az alszótár, amelynek neve felül van nyomtatva, mindig növekszik.

Az alap PRSP eljárások egy $PRIME nevű alszótárt alkotnak, amely alapértelmezés szerint nyitva áll a használatra és a növekedésre, vagyis ha nincs parancs egy másik alszótár növekedésére.

Például a?$ művelet írja ki az alszótárak következő állapotát.

$PRG nyitva

$PRIME megnyílt

$EDIT lezárva

$PRIME megnyílt

A RENDSZER zárva

Ez azt jelenti, hogy a $PRG jelenleg bővíthető és használható, a $PRIME csak használatra szolgál, a $EDIT és a SYSTEM pedig nem elérhető. Vegye figyelembe, hogy egy alszótár több azonos nevű szakaszból állhat.

Vannak olyan parancsok, amelyek segítségével törölhetők a szótárból a szótárbejegyzések és esetleg a hozzájuk kapcsolódó belső objektumok. Így a FORGET $v parancs eltávolítja a szótárba beírt összes nevet (nem csak a $v alszótárat) a GROW $v parancs utolsó végrehajtása óta, az ezekkel a nevekkel jelölt objektumokkal együtt, és visszavonja a $v növekedését. beállított alszótár. A PROGRAM $v parancs ugyanazokat a műveleteket hajtja végre, mint az egymást követő FORGET $v GROW $v parancsok. Egy ilyen parancs jelenléte bármely program elején azt eredményezi, hogy a program újrafordításakor a régi másolata törlődik, és egy alszótár jön létre a program új példányának objektumainak tárolására. Például a FORGET $PRIME művelet végrehajtásával azon a szótáron, amelynek állapota fent volt látható, egy új állapotot kapunk:

$EDIT lezárva

$PRIME megnyílt

A RENDSZER zárva

A FORGET parancs végrehajtása során a törölni kívánt szakaszok nevei jelennek meg.

Vegye figyelembe, hogy a SYSTEM alszótár neve nem $-al kezdődik. Ez megengedett, de ahhoz vezet, hogy a FORGET és RPOGRAM parancsok alkalmazása erre az alszótárra nem okoz semmilyen műveletet (úgy tűnik, a SYSTEM alszótár nem létezik számukra).

Tekintettel arra, hogy a kész programban az eljárások túlnyomó többsége nem igényel külső névvel való hozzáférést, lehetőség van nevük eltávolítására a szótárból, a hozzájuk tartozó belső objektumok megőrzése mellett. A CLEAR $v parancs eltávolítja az összes nevet a $v alszótár minden szakaszából, kivéve azokat, amelyeket a programszövegben (amikor definiáltak) az előtag:: (két kettőspont) előz meg. Például a következő programrészlet processzor általi végrehajtásának eredményeként:

:: : X+ Y !+ X ;

A $VIZSGA TÖRLÉSE csak az X és X+ nevek maradnak a $EXAM alszótárban, az Y szótárbejegyzés törlődik (bár a belső ábrázolásban az Y szónak megfelelő változó megmarad).

I/O parancsok

A DSSP-vel való felhasználói interakció fő eszköze a terminál, amely általában egy katódsugár-kijelző billentyűzettel. A terminálról történik a kezdeti bevitel, a programok szerkesztése és hibakeresése, az adatok előkészítése és minden rendszerkezelés. A programokat és az adatokat, valamint magát a PRSP-t fájlokként tárolják lemezeken, és kinyomtathatják a nyomtatón. A bemeneti/kimeneti vezérléshez az alapvető PRSP eljárások készlete tartalmazza az alábbiakban ismertetett eszközöket.

A terminál működésének programozását a számok, egyes betűk és betűsorozatok (karakterláncok) bevitelére és kiadására szolgáló parancsok, valamint néhány további parancs biztosítja.

A TIB (Terminal Input Byte) parancs várakozási ciklust kezdeményez billentyűleütésre a terminál billentyűzetén. Egy billentyű lenyomásakor a megfelelő karakter 8 bites kódja a verembe kerül, mint a felső alsó bájtja, a felső 3 bájt pedig nullákat tartalmaz. Az így beírt karakter másolata megjelenik a kijelzőn. Létezik egy TRB (Terminal Read Byte) parancs is, amely abban különbözik a TIB-től, hogy a beírt karakter kódjának verembe küldése nem jár együtt ennek a karakternek a kijelzőn való megjelenítésével.

A TIN (Terminal Input Number) parancs elindítja a verem beviteli ciklusát és a billentyűzetről beírt szám megjelenítését a kijelzőn. A beviteli számnak olyan számjegysorozatnak kell lennie, amely mínuszjellel kezdődhet és erre végződhet . A beállított bemeneti/kimeneti módtól függően a számjegyeket a processzor hexadecimálisként, decimálisként, oktálisként vagy binárisként érzékeli. Ha egy hexadecimális szám egy számjeggyel kezdődik, amelyet egy betű jelöl, akkor a 0 számjegy kerül hozzáadásra. a legjelentősebb, 2 súlyú bittől balra elhelyezkedő bitek kivágásával 31 hatványig.

Minden TIN parancs egy számot ír be. Ha egy sorba kell beírni egy számsort, akkor azokat a gomb megnyomásával el kell választani , és a programban szereplő egyes számok beviteléhez ismét végre kell hajtani a TIN parancsot.

A billentyűzetről beírt n karakterből álló szekvencia a TIS (Terminal Input String) paranccsal bekerül a számítógép memóriájába n bájt formájában, szekvenciálisan növekvő címeken, az a címtől kezdve, ami előtt az a cím és a szám Az n karakterek a verembe kerülnek. Legyen például egy kellő hosszúságú X bájtvektor deklarálva. 9 karaktert kell beírnia, értékeit hozzárendelve ennek a vektornak az elemeihez, a nulla elemtől kezdve:

Hasonlóképpen, a TOS paranccsal egy n bájt-literes sorozat kimenetét a kezdőcímmel adjuk meg:

A programban közvetlenül szereplő szöveges elemek termináljára történő kimenetét a konstrukció biztosítja

."<текст>"

Például ahhoz, hogy egy bizonyos programrészlet végrehajtásakor az ENTER VARIANT NUMBER szöveg megjelenjen a kijelzőn, a töredéknek tartalmaznia kell az "ENTER VARIANT NUMBER" bejegyzést.

A TON (Terminal Output Number) parancs megjeleníti a verem tetejéről előugró számot, a kimeneti mező hosszát pedig felül kell megadni. A kimeneti szám a mező jobb széléhez igazodik, a bal oldali üres helyeket szóközök töltik ki, és ha a szám hossza meghaladja a megadott mezőhosszt, akkor a bal oldalon levágás történik. Tizedes I/O módban a negatív számok mínuszjellel kezdődnek.

A TOB (terminál output byte) parancs kiírja azt a karaktert, amelynek kódját a verem tetejének alsó bájtja adja. A köteg mélysége 1-gyel csökken.

Vannak olyan parancsok is, amelyek közvetlenül vezérlik a kurzort:

CR - ugrás egy új sor elejére,

SP - szóköz, azaz mozgassa egy pozíciót jobbra.

A BELL parancs rövid hangjelzést ("bell") okoz.

Néha, amikor terminállal kommunikálunk, ellenőrizni kell, hogy lenyomtak-e már egy billentyűt, és hogy a kijelző teljesítette-e már az előző kimeneti parancsot. Ezt a TTI (Terminal Test Input) és TTO (Terminal Test Output) parancsokkal lehet megtenni, amelyek 1-es jelzőt hagynak a veremben, ha a megadott esemény megtörtént, és 0-t egyébként.

A nyomtatókimeneti parancsok hasonlóak a terminálkimeneti parancsokhoz, és hasonló emlékeztetőn alapulnak, amelyben az LP (Line Printer) betűk vagy a TO helyére kerültek, vagy bevezették őket. Például LPCR - átmenet egy új sor elejére, LPSP - szóköz, LPN - szám kimenete az alcsúcsból a csúcs által meghatározott mezőben, LPB - egy karakter kimenete, LPS - egy karaktersorozat kimenete . Létezik még az [N] LPT parancs, amely a nyomtatófejet a nyomtatott sor N pozíciójába mozgatja, valamint az LPFF parancs, amely a papírlapot adagolja. Explicit szöveg nyomtatásához kényelmesen használható szövegliterál és LPS parancs, például:

"FUNKCIÓ ÉRTÉKTÁBLÁZAT" LPS

Megszakítások és kivételek kezelése

A perifériák programozása során szükségessé válik a megszakítások kezelése. A DSSP-ben ez a feldolgozás a következőképpen van programozva. A megszakítás kezelésére tervezett program egy szokásos PRSP eljárás, amelynek definíciója előtt van egy INT előtag, például INT: A !1+ I ; Az INT előtag biztosítja, hogy a processzor állapota mentésre kerüljön megszakításkor, és visszaálljon, amikor a megszakítás befejeződött.

A LINK parancs egy rutin egy adott megszakításhoz való kapcsolására szolgál:

<адрес вектора>LINK<имя процедуры>amelynek végrehajtása során a megfelelő vektor szerint a megszakításkezelési eljárás hívása rögzítésre kerül. A LINK utasítás végrehajthatja az eljárás statikus összekapcsolását egy megszakítással, amely a program fordításakor történik, és dinamikusan a program végrehajtása során.

A processzor megszakítása az a mód, ahogyan a külvilágban bekövetkezett eseményt jelentik a rendszernek. Azonnali feldolgozást igénylő események is előfordulhatnak a programban. Ezeket kivételes helyzeteknek nevezik. Példák ilyen helyzetekre: osztás nullával, kommunikációs hiba az eszközzel, a bemeneti fájl vége stb.

A DSSP-ben a kivételes helyzeteket parancsmegszakításokkal rögzítik. A parancsmegszakítás egy elnevezett válaszeljáráshívási művelet, és a következőképpen deklarálható:

CSAPDA<имя вызова> <конечная реакция>

Például:

CSAPDA S1 .S1 helyzet.

Az első esetben az S megszakításra adott végső reakció az X eljárás, a második esetben az S1 megszakítás bekövetkezésekor a következő üzenet jelenik meg a terminálon: S1 helyzet.

Az a program, amely valószínűleg megszakítást okoz, egy catch paranccsal állíthatja be a válaszát. A PRSP-ben kétféle elfogás létezik: ON és EON. Az elfogási parancsok csak eljárásokon belül használhatók, és a következő formátumúak:

TOVÁBB<имя прерывания> <реакция>

eon<имя прерывания> <реакция>Például:

: A ... ON S "Megszakítás S" ... ;

: A1 ... EON S1 ABC ... ;

Az ON és az EON különböző típusú reakciókat hoz létre. Ha az ON paranccsal új reakciót adunk meg, akkor megszakítás esetén a reakcióeljárás lefut, amely után a megszakított program fut tovább. Ha a reakciót az EON paranccsal állítjuk be, akkor az operandusverem először azt a mélységet veszi fel, amely az EON végrehajtásakor volt, majd végrehajtódik a reakció, és amikor ez befejeződik, annak az eljárásnak a végrehajtása, amelyben az EON. parancsot használva azonnal leáll.

Vegye figyelembe a példákat. Az M eljárás karaktereket ír be a terminál billentyűzetéről, és ellenőrzi, hogy számjegy-e. Ha a beírt karakter nem számjegy, egy ND megszakítás lép fel. TRAP ND "Nem szám." : M RP M1 ; : M1 TRB [B] C #0< C2 #9 >&0 IF+ ND [B] TOB ;

Az ND megszakításra adott végső válasz a következő üzenet: Nem számjegy.

Ha M-et egy P1 eljárásból hívjuk, amelynek saját válasza van egy ND megszakításra: P1 ON ND PR1 M ; : PR1 [B] CR "Hiba." D#0 [#0] ; majd egy nem számjegyű karakter beírásakor az ND megszakítást a PR1 ON típusú reakcióprogram dolgozza fel, amitől az üzenet egy új sorból kerül kibocsátásra: Error. A beírt karaktert a 0 karakter helyettesíti, ami után az M tovább működik.

Ha M-t a P2 eljárásból hívjuk: P2 EON ND PR2 M ; : PR2 CR "Hiba. Bejegyzés vége." ; majd egy nem számjegyű karakter beírásakor az ND megszakítást az EON típusú PR2 reakcióprogram dolgozza fel, amitől az üzenet egy új sorból kerül kibocsátásra: Error. Bemenet vége, ami után a P2 kilép. Ekkor az operandus verem üres lesz.

Szükség esetén a megszakítás újraaktiválható a reakcióprogramban, így kiterjesztve a magasabb szintű programokra. Ebben az esetben vagy a befoglaló eljárásban az elfogó parancsban megadott program, vagy a végső reakció kezeli a megszakítást. Például, ha a következőképpen módosítja a PR2-t: : PR2 CR "Hiba. Bemenet vége." N.D.; akkor a terminálon a következő üzenet jelenik meg: Error. Bemenet vége. Nem szám.

A DSSP-ben több beépített parancsmegszakítás található, amelyekre felhasználói programokban adható meg a válasz.

Assalamu alaikum wa rohmatullahi wa barakatuhu!
"Az arab a Paradicsom lakóinak nyelve!" (Hozzávetőleges jelentés)
Kedves testvéreim, arra kérlek benneteket, hogy tisztázzák a kérdést ezzel a hadíszszal kapcsolatban, hogy hiteles-e? Általában véve ezek a szavak Mohamed próféta szavai, alayhi solyatu wa salam?
barakAllahu fikum wa jazakumullahu khairan!

Wa alaikum salaam wa rahmatullahi wa barakatuh!

At-Tabarani az "al-Awsat"-ban az Abu Hurayrah jelentései szerint:
"Allah Küldötte, béke és Allah áldása legyen vele, azt mondta: "Én arab vagyok, a Korán arabul van, és a paradicsomi helyek nyelve arab lesz."

Shaykh al-Albani elhozta Silsila ad-da'ifába a 161. szám alatt, mondván:

„Ez a hadith kitalált (Maudu’). Valójában nincs egyetlen megbízható hadísz sem, amely megmagyarázná, milyen nyelven fognak beszélni a Paradicsom lakói, ezért csendben kell maradni, és nem kell belemerülni a témával kapcsolatos beszélgetésekbe, ismereteket nyújtva róla a Mindenható Allahnak, és csak abban kell részt venni olyan tettek elkövetéséhez vezessen, amelyek hasznosak lesznek a másik világban!
Sheikhul-Islam Ibn Taymiyyah, Allah irgalmazzon neki, megkérdezték: „Milyen nyelven fognak beszélni az emberek a feltámadás napján? A Mindenható Allah arabul fog szólni az emberekhez? És az az állítás, hogy a Pokol lakóinak nyelve perzsa, a Paradicsom lakóinak pedig arab?
Mire így válaszolt: „Dicséret Allahnak, a világok Urának! Nem tudni, milyen nyelven fognak beszélni az emberek azon a napon, hogyan és milyen nyelven szólítja meg őket Uruk, Ő nagy és dicsőséges. Sem a Mindenható Allah, sem a küldötte, béke és áldás, nem mondott nekünk erről semmit, és az sem megbízható, hogy a Pokol lakóinak nyelve perzsa, a Paradicsom lakóinak pedig arab lesz. És nem tudjuk, hogy ebben a kérdésben a társak között, Allah legyen elégedett velük, volt nézeteltérés. Ellenkezőleg, elzárkóztak ettől, mert haszontalan erről beszélni. A következő generációk között azonban nézeteltérés volt ebben a kérdésben. Egyesek azt mondták, hogy arabul fognak kommunikálni, mások azt mondták, hogy ez nem vonatkozik a Pokol lakóira, mivel ők perzsául válaszolnak, és ez az ő nyelvük a pokolban. Harmadszor, az emberek asszírul fognak kommunikálni, mivel ez Ádám nyelve, amelyből az összes többi nyelv származik. Negyedszer: ez nem vonatkozik a Paradicsom lakóira, mivel arabul fognak kommunikálni. Azonban egyiküknek sincs érve szavai mellett, sem az ész oldaláról, sem a saría forrásokból, de ezek csak minden bizonyítéktól mentes kijelentések. A Mindenható Allah tudja a legjobban!” Lásd: Majmu'ul Fatawa 4/299.

Az iskolákban az algoritmizálás alapjainak tanulmányozására az ún. iskolai algoritmikus nyelv (oktatási algoritmikus nyelv), a tanuló számára érthető szavakat használva oroszul. A legtöbb programozási nyelvtől eltérően az algoritmikus nyelv nem kötődik a számítógép architektúrájához, nem tartalmaz részleteket a gép eszközével kapcsolatban.

Példák

Az algoritmus nyelvében az algoritmus általánosságban a következő formában van írva:

alg az algoritmus neve (argumentumok és eredmények) adott algoritmus alkalmazhatósági feltételei szükséges az algoritmus célja korai köztes értékek leírása | parancssorozat (algoritmus törzse) con

Az algoritmus megírásakor a kulcsszavakat általában aláhúzták vagy félkövéren kiemelték. A logikai blokkok kiemelésére behúzásokat használtunk, a blokk eleje és vége páros szavait pedig függőleges sáv kötötte össze.

Példa a négyzetösszeg kiszámítására:

alg Négyzetek összege ( arg egész n, vágott egész S) adott| n > 0 szükséges| S = 1*1 + 2*2 + 3*3 + … + n*n korai egészén | bemenet n; S:=0 | nc i-re 1-től n-ig | | S:= S + i * i | kts | következtetés"S=", S con

E-műhely

Az algoritmikus nyelven történő programozás elméleti tanulmányozásának megerősítésére 1985-ben a Moszkvai Állami Egyetem Mekhmat szakemberei létrehoztak egy szerkesztő-fordítót. "E-műhely"("E" - Ershov tiszteletére), amely lehetővé teszi a programok bevitelét, szerkesztését és végrehajtását algoritmikus nyelven.

1986-ban az „E-gyakorlathoz” kiadtak egy oktatóvilágot (előadót): „Robot”, „Drafter”, „Two-legged”, „All-terrain vehicle”, amelyek lehetővé teszik a fogalmak egyszerű bemutatását. az algoritmustól. Az "E-workshop" számítógépeken valósult meg: Yamaha, Corvette, UKNC, és széles körben használták.

Ezt a programozási nyelvet folyamatosan fejlesztették, és egy 1990-es tankönyvben megjelent az "E-workshop" későbbi verziójának leírása. A "KuMir" ("Oktatási világok halmaza") programozási rendszert, amely ezt a tankönyvet támogatja, az InfoMir vállalat 1990-ben adta ki. Ennek a rendszernek a nyelvét KuMir-nek is nevezik.

1995-ben az Orosz Föderáció Oktatási Minisztériuma a "KuMir"-t ajánlotta az "Informatika és számítástechnika alapjai" kurzus fő oktatási anyagaként A. G. Kushnirenko, G. V. Lebedev és R. A. Svorenya tankönyve alapján. .

Kritika

Megjegyzendő azonban, hogy az algoritmikus nyelv a számítógép-architektúrához közvetlenül kötődő részletek hiányában, az Algolo-szerű nyelvekre hivatkozva implicit módon arra tanítja az iskolásokat, hogy a Neumann-féle gépi architektúrára támaszkodjanak. (A Von Neumann-architektúra egy korábbi, Turing-gép nevű ötlet gyakorlati megvalósítása. A Turing-féle ötleten kívül más ötletek is léteznek. A legnépszerűbb ezek közül a Lambda-kalkulus: Alonzo Church dolgozott rajta. A Lisp Machine egy olyan architektúra, amely Lambdára épül. - kalkulus.)

Linkek

  • A. P. Ershov. Algoritmikus nyelv az informatika és számítástechnika alapjai iskolai tantárgyban. 1985.05.07
  • Fórum az orosz programozási nyelvekről és fejlesztőeszközökről

Wikimédia Alapítvány. 2010 .

Nézze meg, mi az "orosz algoritmikus nyelv" más szótárakban:

    Az algoritmikus nyelv egy formális nyelv, amelyet algoritmusok írására, megvalósítására vagy tanulmányozására használnak. Minden programozási nyelv algoritmikus nyelv, de nem minden algoritmikus nyelv alkalmas nyelvként való használatra ... ... Wikipédia

    Ennek a kifejezésnek más jelentése is van, lásd: Sárkány (jelentések). Példa egy algoritmus blokkdiagramjára a DRAKON séma DRAKON nyelvi sárkányában (Barát orosz algoritmikus nyelv, amely láthatóságot biztosít) vizuális ... ... Wikipédia

    Ennek a kifejezésnek más jelentése is van, lásd Algoritmikus nyelv. A tanuló algoritmikus nyelv egy formális nyelv, amelyet algoritmusok írására, megvalósítására és tanulására használnak. A legtöbb programozási nyelvtől eltérően nem kötődik a ... Wikipédiához

    Algoritmikus nyelv (más néven orosz algoritmikus nyelv, RAYA) egy programozási nyelv, amelyet algoritmusok írására és tanulmányozására használnak. Az iskolai számítástechnika tanulmányozása során az algoritmizálás alapjainak tanulmányozására az ún. iskolai algoritmikus ... ... Wikipédia

    Az oktatási programozási nyelv olyan programozási nyelv, amelyet arra terveztek, hogy programozást tanítson a szakembereknek. Egy ilyen nyelvnek meg kell felelnie a fő követelménynek: az egyszerűségnek. Minél egyszerűbb, annál gyorsabban elsajátítja egy kezdő. Az ilyen ... ... Wikipédia lehetőségei

    Példa egy algoritmus blokkdiagramjára a DRAKON nyelvi sárkánydiagramokban A DRAKON (Friendly Russian Algorithmic Language That Provides Visibility) a Buran űrprogram keretein belül létrehozott vizuális algoritmikus nyelv. A nyelv fejlesztése ... Wikipédia