Арабська мова – мова Раю? Мова раю Додаткові операції для роботи з даними та пам'яттю

18 грудня Всесвітній день арабської мови. Свято засноване організацією об'єднаних націй у 2010 році і є однією з шести офіційних мов ООН. За останніми даними, у світі налічується 300 мільйонів людей, які говорять арабською мовою та її діалектами. Причому для 240 мільйонів він є рідним. Арабська мова та релігія Іслам нерозривно пов'язані. Одне немислимо без іншого, бо вже протягом півтора тисячоліть мусульмани світу п'ять разів на день читають молитви арабською мовою. На ньому ж був посланий Священний Коран, і говорив пророк Мухаммад (мир йому).

Грозненське духовенство по-своєму відзначило визначну дату. Зі зверненням до жителів міста виступив імам мечеті «Серце Чечні» Магомед Дадахаєв. Він пояснив роль арабської мови у житті мусульманина:

Не володіючи арабською мовою, людина не може пізнати Іслам. Тому, серед мусульман ця мова, споконвіку користується великою повагою. Необхідною умовою вивчення релігії Пророка (світ йому) є аналіз арабських текстів, багато з яких написані дуже давно. У сучасній арабській мові налічується понад 12 мільйонів слів (для порівняння в російській їх 131 000, а в англійській близько мільйона…). Це дуже багата і складна мова. Коли я навчався в ісламському університеті в Сирії, наш викладач, філолог, навів такий приклад: в арабській мові кількість синонімів лише одного слова «верблюд» досягає шести тисяч! Граматика його дуже складна і багатогранна. Її вивчення потребує неабияких інтелектуальних та вольових зусиль. Тому, серед тлумачів Корану та Хадісів Пророка (мир йому), не буває дилетантів. Практично неможливо вникнути в сенс священного тексту, не володіючи солідним арабським лексиконом та пізнаннями у синтаксисі, семантиці, фонетиці цієї мови. Іноді зустрічаються люди, які називають себе знавцями Корану. Вони наводять цитати з Послання Всевишнього, дають людям поради. Але якщо спитати їх про джерело знання – отримуєш відповідь: «я читав переклад». Такі люди дуже небезпечні для Ісламу, оскільки самі не знаючи, що творять, здатні привнести плутанину і неточності в тлумаченні послання Всевишнього. В ісламських навчальних закладах повсюдно практикується така методика викладання: кілька років студенти початкових курсів вивчають виключно арабську філологію. І тільки, оволодівши достатньою мірою необхідним обсягом матеріалу, отримують доступ до вивчення коранічних текстів. Таким чином, арабська мова – своєрідний трамплін до оволодіння інформацією про Іслам. Крім того, арабська мова – мова, якою будуть говорити жителі раю. Слава Аллаху, що він створив нас мусульманами! Що дав нам прекрасна, багата арабська мова для розуміння своєї волі!

1. Це історія про те, що люди перестали розуміти одне одного та з'явилися численні мови сучасного світу. Наскільки популярним є цей міф серед різних народів і які його інтерпретації?

2. Міф про Вавилонську вежу заснований не тільки на переконанні, що спочатку все людство говорило однією мовою, але й на тому, що ця мова була «ідеальною»: назви предметів передавали їхню справжню сутність. Чи поділяють ці погляди представники інших культур і чи вважають вони, що їхня мова найближча до початкової?

Відповідь на перше запитання пропонується у Книзі Буття Старого Завіту 11:1-9, де розповідається, що Бог вирішив покарати людський рід, наклавши на нього прокляття змішування мов. Відповідь на друге запитання можна знайти у Книзі Буття 2:19. У цій частині Бог привів до Адама всіх тварин і птахів, щоб почути, як Адам назве їх, і «як нарече людина всяку живу душу, так і було ім'я їй». Імпровізована екскурсія різними культурами дозволить нам побачити, як висвітлюються дані питання. Щодо першого з них, багато хто згоден зі Старим Завітом: різноманіття мов — це кара Господня або щонайменше наслідок якогось несприятливого чинника.

Легенда одного з австралійських племен розповідає про поїдання людей похилого віку. Племена, які харчувалися власне тілом, говорили «чистою» мовою, а ті, хто їв внутрішні органи, — «нечистою». Африканські кабили вважають, що люди почали говорити різними мовами внаслідок конфлікту. На думку племені з Ассама, змішання мов сталося через те, що колись троє дітей полювали на щура. Одне з амазонських племен дотримується думки, що Бог розділив людей та їхні мови, щоб вони стали більш слухняними Йому. Серед корінного населення Америки, у племені майду (Каліфорнія), вважається, що спочатку люди говорили однією мовою, але одного разу на похоронній церемонії мова перестала бути єдиною. Ірокези вірять, що поділ мов стався через сімейну сварку, внаслідок якої було вбито дитину. Але припущення, що різноманіття мов — це прокляття, негаразд поширене, як здається. У світі існує безліч версій, згідно з якими поділ стався внаслідок природних процесів.

У давньоіндійському священному гімні «Рігведа» згадується, що колись було Вак («слово») і боги розділили його на безліч форм. Народи півострова Індокитай оповідають про шість рас, кожна з яких мала власну мову у вигляді стебла, що в'ється з гарбуза. У племені кіче (Гватемала) є міф про те, що люди жили всі разом і розмовляли однією мовою, доки не розділилися на групи. Кожна вибрала собі бога і почала говорити своєю власною мовою.

Міф американського племені навахо про створення світу розповідає про «змінювану жінку» і появу реальних народів, які говорили її мовою. Так, вона створила сусідні народи - пуебло, мексиканських аборигенів та інших, і говорили вони своїми мовами, поширюючи їх у різних напрямках. В ісламі Коран вчить, що Адам не вигадував імена або ще, а був навчений всьому Аллахом. Різноманітність мов є абсолютно природною і є проявом сили Аллаха. Всі люди здатні зрозуміти одкровення Корану, якою б мовою вони не були написані.

Міфологічна система багатьох народів світу не має пояснення змішання мов, яке просто сприймається як належне, а отже, не може відповісти на наше запитання. Однак практично у всіх культурах світу є згадка про «ідеальну» мову (питання 2). Вище ми згадували про австралійське плем'я, яке вважає, що деякі люди (харчуються тілом людським) говорять «чистою» мовою, що передає справжню сутність речей. За версією стародавніх єгиптян, бог Птах дав імена всьому, таким чином, мова стала даром богів. У Китаї «правильній» мові навчали міфічні імператори. Коран розглядає різноманітність мов як поділ єдиної мови, що включає всі інші.

Повсюдно люди намагаються зрозуміти, як назва предмета розкриває його суть. Передбачається, що або «ідеальна» мова, що описує справжню сутність предмета, існує і сьогодні, або вона залишилася в минулому. Друге припущення є передумовою для пошуку істини та гармонії у світі. Здається, що уявлення про зв'язок мови з реальним світом та існуванням людини закладено у нашій свідомості. У зв'язку з цим постає питання, вперше озвучене в діалозі Платона «Кратіл» і що представляє собою з тих пір предмет постійних суперечок: є зв'язок між назвою та об'єктивною сутністю речей природною (що виникає в суб'єктивній свідомості носія мови) чи цей зв'язок умовний і випадковий?

Мова – це знакова система, яка дозволяє перейти від значення та сенсу поняття для його позначення.

Людина – істота словесна і, на відміну тварин, спілкується із собі подібними з допомогою мови. Іноді говорять про «мову тварин», але зрозуміло, що такий вислів умовний – за своїм багатством і можливостями мова тварин людської не подібна. Ангели ж для свого спілкування і зовсім не потребують мови – важко уявити їх, що говорять російською або англійською.

Функції мови може бути різними – крім передачі, він допомагає висловлювати почуття та оцінки.

Чи можна перекласти Писання?

Мова Церкви – це мова молитви, богослужіння та Писання.

У деяких релігіях священні тексти спочатку існують однією якоюсь мовою і вважаються принципово неперекладними. Так, мусульманський Коран спочатку складено арабською. Більше того, мусульмани вірять, що саме так ця книга була створена на початку часу.

До ідеї можливості священних текстів лише на івриті схилялися і юдейські книжники. З християнським Писанням спочатку було негаразд.

У III столітті до н. було виконано так званий «переклад сімдесяти» – Септуагінта – переклад Старого Завіту на грецьку. Більше того, деякі дослідники вважають, що саме Септуагінта грала роль Святого Письма у міжзавітні часи.

Саме існування Септуагінти стало основним аргументом на користь принципової перекладаності Писання. Є, проте, ще сильніший. Зараз вважається доведеним, що з апостолами Христос говорив арамейською. Але укладачі Євангелій, безперечно, передали ці розмови по-грецьки.

Нині є науковий напрямок – лінгвістичні реконструкції. Їхні упорядники намагаються зрозуміти, як звучали ці діалоги в оригіналі. Але все ж таки це предмет наукових студій.

Невже в раюхолодно?

При перекладі мови інколи виникають проблеми, оскільки мови не тотожні граматично. Значення та відтінки слів у різних мовах теж різні.

Наприклад, фраза "рай - місце злачне і прохолодне" чітко показує, що Писання створювалося в країнах із жарким кліматом, де "прохолода" скоріше приємна. По-російськи такі асоціації виникли б навряд чи. А дієслово «прохолоджуватися» в сенсі «відпочивати», «приємно проводити час» потрапило до російської як калька з івриту через грецьку.

Чи всі слов'яни розуміли Біблію?

Писання було принесено до наших предків не російською мовою. Кирило і Мефодій – солунські греки – розробили нову писемну мову на підставі розмовної мови солунських слов'ян.

У світі багато народів використовують мови, які мають писемності. Поки йдеться про побут, проблем немає. Але, як тільки такою мовою потрібно перекласти релігійний текст або філософський трактат, мова потребує доопрацювання, що й зробили Кирило та Мефодій.

Якщо ми припустимо, що слов'янським племенам кілька тисяч років тому було простіше домовитися між собою, ніж сучасним слов'янським народам, то маємо рацію – мови були ближчі. Але це не означає, що переклад Писання, зроблений Кирилом і Мефодієм, був зрозумілішим киянам і новгородцям, – письмова літературна мова була іншою.

Можливо, це – особливість російської ситуації, оскільки російська літературна мова ближче до церковнослов'янської, ніж до московської говірки. За фактом, вся церковнослов'янська мова увійшла до російської як «високий штиль». Наприклад навіть сучасні причастя – типу плаче, що біжить – утворюються саме за церковнослов'янською моделлю – давньоруською буде «плакучий», «бігучий».

Іноді давньоруські аналоги взагалі випадали – «благо» і «болого» у назві «Бологе»; "Шолом", який є тільки в билинах, на відміну від "шолома".

Мови близькі та… паралельні

У Стародавній Русі була ситуація диглоссии. Це не те, що «двомовність». Диглосія – це використання у суспільстві паралельно двох мов. Наприклад, у XIX використовували і російську, і французьку. Французька була мовою високого суспільства, але, в принципі, будь-який текст міг бути перекладений.

У диглосії мови не перетинаються за сферою вживання. Говорили давньоруською, давньоруською могли написати побутову записку. Але молилися по-церковнослов'янськи.

Така ситуація існувала до Петра, у вісімнадцятому сторіччі вона поступово руйнувалася. Тепер наука і література могли розвиватися російською, але церковно-слов'янською досі існують лише молитви. Перекладіть на церковно-слов'янське оголошення – і воно буде виглядати як жарт чи блюзнірство.

Священик чи пастир?

Ми живемо в унікальну епоху. У царській Росії Біблію можна було читати російською, у Стародавній Русі – слухати по-церковнослов'янськи. Але більшість народу були неписьменними, або не освіченими достатньо для того, щоб читати і сприймати Писання.

У радянські часи грамотними стали всі, але був тексту Писання.

Зараз ще зберігається грамотність та доступні тексти.

Крім власне Писання, ми пропонуємо опанувати ще деяку кількість слов'янських текстів – від молитов до богослужіння. Щоправда, існуючий переклад російською дещо складний сприйняття. У ХІХ столітті, не маючи аналогів, перекладачі часто переносили в переклад слов'янізм.

Так перекочувала у переклад фраза «Я – пастир добрий». І тут є деякі складнощі. Буквальний переклад із грецької звучав би: «я – добрий пастух», – але такий переклад сприймається як низький. З іншого боку, про піднесений «пастир» зараз простий слухач сприйме скоріше як «священик». Проте слід визнати, що буквальний переклад російською багатьох біблійних висловів неможливий – фраза «вустами дитини говорить правда» – як філософське вислів сприйнято нічого очікувати.

Але загалом сприймати слов'янський текст Біблії більше заважає нерозуміння сенсу, а чи не слів.

Окрема складність – граматичні конструкції. Наприклад, є низка посилень, які йдуть ще з грецької. «Пробач гріхи і гріхи» означає, лише прости всі гріхи. Аналогічні конструкції типу «гнівом розгнівався», «любов'ю полюбив».

При перекладах священних текстів іншими мовами теж виникають проблеми (хоча народи, мовами яких Писання ще не перекладено, це, мабуть, 5℅ населення Землі). Тобто робота, яку для слов'ян виконали Кирило та Мефодій, триває.

Кирило та Мефодій не були першими – до цього були переклади на ефіопську, готську. Після Кирила та Мефодія Стефан Пермський переклав Писання на мову зирян.

Переклади священні та профанні

Чи будь-який переклад вважається священним текстом? Ні, але лише тією мірою, якою він прийнятий у церковних громадах. Наприклад, Синодальний переклад як богослужбове не заборонено, але не прийнято. Але його застосовують як такого протестанти, наприклад, російські баптисти.

Існують навіть сучасні течії протестантизму, які вважають, що біблійний текст має бути доступним для кожного. Видаються у тому числі комікси за біблійними сюжетами.

З текстом Нового Завіту проблем немає – його джерело відоме грецькою мовою. А ось основою синодального перекладу Старого Завіту став текст давньоєврейський. Фрагменти з грецького перекладу вставлялися лише тоді, коли розбіжності були важливими.

У сучасному варіанті було б непогано мати два переклади – і з єврейських масоретських текстів, і з грецької. Це було б зручно для тих, хто обох мов не знає.

Відповіді на запитання

Після виступу протоієрею Олександру поставили кілька запитань:

Якою мовою говорив Адам?

- Складно сказати. З одного боку, мова змінюється, поки вона жива. Але ніхто не знає, чи це не було новою властивістю мов, що з'явилося після будівництва Вавилонської вежі.

Але, в будь-якому випадку, мова Адама, ймовірно, була не схожа на жодну з існуючих мов, у тому числі давньоєврейську.

Чи ведеться зараз полеміка про переклад богослужіння російською мовою?

– Ця ідея обговорювалася ще до революції і була частково скомпрометована оновленцями. Вони всі російською не служили, але ідея була ними підтримана.

Переклад Біблії російською давався непросто, хоча ідея митрополита Філарета про те, що перекладати треба і з єврейської, і з грецької, було мудрим рішенням. Хоча це й не дало нам наукових перекладів з обох мов.

Існують окремі випадки використання російської мови – російською мовою спочатку написана молитва Оптинських старців і акафіст «Слава Богу за все».

Решту перекладів так багато, і нюансів при їх виконанні виникне стільки, що простіше тексти трохи русифікувати, ніж перекласти.

Стихійно цей процес давно точиться. Іноді виникають казуси: наприклад, у «Чині вінчання» подвійне число іноді несподівано замінено множинним, а сучасних акафістах вжито непослідовно.

Як бере участь у освіті різних мов Божественний Промисл?

– Мова існує поза людською волею. Людина може створити есперанто, але природні мови існують за своїми законами.

Кирило та Мефодій переводили на церковнослов'янську за натхненням згори, але й за тією моделлю, яка на той час була.

За натхненням, записуючи Євангелія по-грецьки, апостоли заклали ідею перекладності Євангелія.

Підготувала Дар'я Менделєєва

Фото Дмитро Кузьмін

ПИТАННЯ: Ассалам алейкум ага!

Ось натрапив на цю статтю. Якщо не помиляюся, ви написали навпаки. Якщо не важко можете ще раз коментувати цю статтю.

Муслім.

Арабська мова – мова Корану. Він був обраним серед усіх мов світу, і він має незвичайні властивості. Ця мова також мова пророка Мухаммада (хай благословить його Аллах та вітає). Мова ця багата і жодна зі світових мов не може змагатися з нею. Він надає духовний і фізичний вплив на того, хто говорить цією мовою.

Раніше араби влаштовували поетичні конкурси, але коли Пророк (с.а.с.) отримав Одкровення, араби були настільки здивовані такою чудовою виразністю мови, і навіть деякі думали, що Коран впливає на магічний вплив на людину. Якщо хтось захоче виправити одне слово або букву з Корану, порушиться вся гармонія Божественної книги. Жодне слово Корану має бути зміненим, інакше зміниться сенс і фонетика.

Нам відомо, що деякі слова згодом мають властивість старіти, і ми їх не вживаємо. А мова Корану протягом 1439 років не втрачає своєї актуальності.

Я вже більше 10 років викладаю по Корану і до цього дня не зустрічала, щоб одна з моїх учениць поставила мені запитання: «Для чого ми вивчаємо Коран? Звідки він виник? Якими користями володіє? У чому його особливість від читання зліва направо?» День за днем ​​зростає кількість охочих вивчити арабський алфавіт та правила тажуїда, щоб потім з оригіналу читати Коран. Але мало хто замислюється про відповіді наведених вище питань. І нарешті, коли я їм викладаю про користь Корану, про його користь, багато хто починає вникати в це.

Арабська мова має 29 літер. Звуки утворюються в місці межі гортані, в середині гортані, грудей, між коренем язика та ротової порожнини. Звуки арабської мови «чистять» ротову порожнину і менш схильне до захворювань. Також арабська мова – добрий лікар-логопед. Він виліковує шепелявість і неправильну вимову літери «р». Ця мова також допомагає тим, хто має зір. Тому що читання арабського тексту ліворуч покращує зоровий апарат людини і розслаблює їх. Овальна, кругла форма букв також добре впливає на психіку.

Всі букви арабського алфавіту приголосні звуки. Спеціальних літер для позначення голосних звуків немає. Розрізняються короткі та довгі голосні. Короткі голосні передаються на листі за допомогою розголосів - надрядкових та підрядкових знаків. Також з 28 літер 22 літери з'єднуються з обох боків, а 6 літер з'єднуються лише праворуч.

Коран протягом 23 років дійшов до нас без спотворень. Коран – остання Божественна книга і після неї не буде інших книг. Він посланий всьому людству. Закони Корану діятимуть до судного дня і не зміниться. Коран - вічне, велике диво Всевишнього, дане Пророку Мухаммаду (с.а.с.). Читання Корану є богослужінням. Всім раджу читати щодня цю незрівнянно чудову книгу і знати його сенс. Поспішайте навчитися читати та розмовляти зі своїм Творцем. Дасть Аллах нам бути жителями джаннату і говорити арабською мовою, яку Сам же вибрав.

Діляром Бектаєва,

устаз Актюбинської обласної

центральної мечеті «Нүр ђасир»

http://nurgasyr.kz/index.php/ma-alar/1826-yazyk-zhitelej-dzhannata

ВІДПОВІДЬ: уа алейкум ас салям брат!

Таких як вона, доморощених і неосвічених «брехливих-устазів» гнати треба подалі від мусульман, щоб не вводила їх в оману за собою. Раз в актюбінській мечеті розповсюджують таке марення і тримають неосвічених вчителів, можливо, тому в цьому місті так багато сектантів екстремістського штибу. Ні в Корані, ні в Сунні немає навіть віддаленого натяку, що арабська мова буде спільною мовою для всіх мешканців Раю. Самі подумайте, як представники інших національностей спілкуватимуться в Раю між собою, якщо не знають арабської мови?!!

Раніше відповідав на таке запитання:

Розвивається адаптивна мова РАЯ діалогової системи програмування ДССП Московський державний університет Факультет обчислювальної математики та кібернетики Н.П.Брусенцов, В.Б.Захаров, І.А.Руднєв, С.А.Сідоров, Н.А.Чанишев

Загальний опис мови РАЯ

Призначення та мета розробки мови

РАЯ (Розвивається Адаптивна Мова) - це базова мова діалогової системи структурованого програмування ДССП. Базовий - отже є основою всім подальших побудов, здійснюваних ДССП шляхом розвитку (розширення, умощения) базової мови, і, можливо, адаптації створюваних в такий спосіб мовних засобів до конкретному применению. На противагу так званим мовам високого рівня, РАЯ надає не готові типи даних та операцій, але лише елементи та примітиви для ефективного визначення потрібних типів. Наприклад, вихідними форматами даних є 8-бітний байт, 16-бітове слово і 32-бітове довге слово, інтерпретовані залежно від операцій, що виконуються над ними, як цілі числа, булевські вектори, коди літер, логічні значення, покажчики даних і процедур. У цьому є можливість, з одного боку, маніпулювати окремими бітами байтів і слів, з другого боку, утворювати складові одиниці даних (слова багаторазової довжини, вектори, масиви, рядки тексту тощо.), встановлюючи їм ту чи іншу інтерпретацію запровадженням відповідних операцій. Так, можуть бути введені речові числа необхідної довжини та діапазону значень, комплексні числа та інші об'єкти, причому версія мови, орієнтована на дане застосування, буде включати об'єкти та засоби, властиві цьому застосуванню і не включатиме того, що до нього не належить,- мова буде адаптована (пристосована) до застосування. Розробка ДССП мала на меті створити широкодоступне і ефективне засіб програмування мікрокомп'ютерів, тобто. комп'ютери, побудовані на основі мікропроцесорів. Істотною особливістю архітектури мікропроцесорів є елементарність типів даних та операцій, що означає, з одного боку, універсальність, з другого - трудомісткість програмування. Внаслідок універсальності мікропроцесори і створювані на їх основі мікрокомп'ютери мають потенційно безмежні можливості застосування. Проте практична реалізація цих можливостей упирається насамперед у трудомісткість розробки необхідних прикладних програм. До того ж задовільні прикладні програми може бути створено лише за глибокому і тонкому знанні специфіки відповідних застосувань, тобто. розробляти їх мають не просто програмісти, а висококваліфіковані у тій чи іншій галузі фахівці. Тому система програмування має не тільки великою мірою збільшити продуктивність програмістської праці, але й бути настільки простою, щоб її могли освоїти та ефективно використати непрофесійні програмісти.

Радикальним вирішенням цієї проблеми було б, мабуть, суттєве спрощення комп'ютерної архітектури. Але, на жаль, архітектура мікрокомп'ютерів розвивається в діаметрально протилежному напрямку - по дорозі все більшої складності та витонченості, тож опанувати досконало мовою мікрокомп'ютерного асемблера сьогодні вже й професійному програмісту не легко. Мови системного програмування, такі як C або PL/M у відомій (хоча й далеко не достатньої) мірі зменшили трудомісткість розробки програм, але навряд чи вони можуть бути рекомендовані людям, не досвідченим у програмістському ремеслі. Широкодоступна мова повинна бути, звичайно, більш простою і природною, повинна грунтуватися на можливості повсякденних, звичних уявлення про сутність і техніку програмування.

Крім доступності та суттєвого зниження трудомісткості розробки програм у порівнянні з програмуванням на мові асемблера, від ДССП була потрібна універсальність мови, така ж як у мови асемблера, висока машинна ефективність (тобто компактність і швидкодія коду), надійність перевіряємості створюваних програм, їх і модифікованість, а також мобільність (переносимість) системи та програм, що розробляються в ній, на машини різної архітектури.

Процедурне програмування

Програмування мовою РАЯ цілком аналогічно таким широко поширеним видам людської діяльності як планування та організація взаємопов'язаних дій, робіт, процесів чи конструювання складних матеріальних об'єктів - машин, агрегатів, споруд. Подібно до конструктора, що реалізує свій задум шляхом агрегатування його складових частин (блоків, вузлів, деталей), програміст синтезує потрібну складну дію з наданих мовою простих дій. Можна також сказати, що програмування (конструювання) полягає в поступовому розкладанні (декомпозиції) реалізованого об'єкта на більш дрібні складові.

У мові РАЯ основним "конструктивом" є процедура - названа дія. Мова базується на обмеженому наборі найпростіших процедур (примітивів), представлених власними іменами (позначеннями). Наприклад: + означає "скласти", NEG - "змінити знак", VCTR - "створити вектор". Зокрема, є примітиви: і; (двокрапка та точка з комою), що дозволяють ввести нову процедуру, наприклад, з ім'ям P, визначивши її як послідовність процедур P1, P2, ..., PN у вигляді

: P P1 P2 ... PN;

Якщо процедура P є дія, яку повинна здійснювати створювана програма, конструювання цієї програми засобами мови РАЯ зводиться до послідовної деталізації процедур P1, P2, ..., PN. Це означає, що кожна з цих процедур повинна бути визначена послідовністю менших процедур, які потім визначаються послідовностями ще дрібніших процедур і т.д., поки не будуть отримані визначення, що складаються тільки з примітивів.

Таке конструювання програми, що відправляється від заданої мети і поступово розукрупнює використовувані процедури рівня базових засобів мови, відоме як низхідне програмування. Воно є основним способом отримання мовою РАЯ програм на вирішення окремих, цілком певних завдань. Протилежним є висхідне програмування - побудова на основі базових засобів мови системи процедур, що поступово укрупнюються, орієнтованих на деяку проблемну область. Цим способом здійснюється розвиток мови та адаптація його до конкретного застосування.

В обох випадках істотно ретельне структурування створюваних програм: будь-яка програма і кожна частина програми повинна складатися з небагатьох відокремлених частин, кожна з яких виконує певну функцію і допускає автономну перевірку. Щодо мови РАЯ це означає, зокрема, що визначення процедур мають бути короткими: визначальна послідовність, як правило, не повинна містити понад 5-7 членів. Структурування забезпечує зрозумілість, перевірюваність та модифікованість програми, значно зменшує трудомісткість її створення та обслуговування.

Наведений вище приклад визначення процедури є спрощеним. Насправді визначальна послідовність може містити членів як імена процедур, але й розпорядження (команди), складаються більш ніж із одного слова. Ім'я процедури, вживане поза поєднанням з іншими словами, є командою виконати зазначену ним процедуру. Послідовність імен процедур наказує виконання цих процедур у порядку проходження їх імен один за одним (у лінійному порядку). Для завдання інших послідовностей виконання РАЯ надає спеціальні слова (префікси), що наказують виконання названих у поєднанні з ними процедур залежно від зазначеної умови, а також багаторазове (циклічне) виконання процедури.

Наприклад, лінійна послідовність P0 P1 викликає виконання процедури P0, а потім виконання процедури P1. Якщо ж процедуру P1 треба виконувати який завжди, а лише за умови, що результаті виконання P0 отримано позитивне число, то замість P1 пишуть команду виконання за умовою: IF+ P1, тобто. замість P0 P1 буде P0 IF+ P1. РАЯ включає набір префіксів-умов, що дозволяють ефективно виражати виконання за умовою, а також вибір двох, трьох або декількох процедур.

Багаторазове виконання процедури визначається за допомогою префікса RP. Так, команда RP P викликає виконання процедури P знову і знову, доки створюються умови, у яких спрацьовує що міститься у тілі цієї процедури EX - вихід із циклу, після чого виконується чергова у лінійному порядку команда. Умовою виходу з циклу може бути, наприклад, рівність нулю деякою змінною X, що виражається у вигляді:

Процедура, ім'я якої входить у визначення іншої процедури, називається вкладеною в неї. Вкладена процедура, якщо вона не примітив, може своє чергу містити вкладені процедури, тобто. вкладеність може бути багаторазовою. З іншого боку, правила мови РАЯ не забороняють включення визначення процедури її імені чи імені процедури, що містить це ім'я, тобто. РАЯ допускає рекурсію.

Багаторазово виконувана процедура може бути вкладена також у процедуру, що багаторазово виконується. У разі має місце вкладеність циклів. РАЯ допускає багаторазову вкладеність циклів.

Лінійна послідовність команд, вкладеність, умовна та циклічна вкладеності процедур – цим вичерпуються можливості конструювання програм у мові РАЯ. Нечисленність, однорідність та природність даних засобів - запорука нескладності освоєння та використання мови. Разом з тим, це строга мова структурованого програмування, що забезпечує значне зниження трудомісткості розробки та надійність програм.

Процедури та дані

Все сказане досі є характеристикою мови РАЯ як засобу розпорядження дій, конструювання довільних дій із кінцевого набору примітивних операцій. Іншу сторону мови становлять засоби представлення об'єктів, над якими виконуються дії, - засоби представлення та організації даних.

Гранично простим елементом даних є двозначний елемент – біт. З бітів будуються всі інші формати та типи даних. У мові РАЯ як базові формати прийняті 8-бітний байт, 16-бітове слово та 32-бітове довге слово. Залежно від виконуваних з них операцій байти, слова та довгі слова допускають безліч інтерпретацій, тобто. можуть бути основою для різних типів даних. Крім того, вони є вихідними елементами для утворення складових форматів та типів.

Власне РАЯ ні простих, ні складових типів даних не містить - є лише базові формати (байт, слово, довге слово) та засоби для конструювання з них складових форматів: векторів та багатовимірних масивів. При цьому одні й ті ж байти (слова, довгі слова) в залежності від операцій, що виконуються над ними, інтерпретуються як вектори бітів, або як двійкові цілі числа зі знаком і без знака, або як літери алфавіту вводу/виводу і т.д. Типи даних та пов'язані з ними обмеження та перевірки можуть бути введені у проблемно-орієнтованих розширеннях мови.

У базовій мові оголошення імен даних виконує лише функцію забезпечення доступу до даних за іменами: з ім'ям зв'язується необхідне оголошення кількість комірок пам'яті і механізм доступу до них. Операції тестування та перетворення не застосовуються до названих даних безпосередньо. Ці операції визначені над стеком операндів, який є послідовністю 32-бітних довгих слів (елементів стека), що динамічно змінюється шляхом додавання (засилання) нових елементів у її кінець, а також видалення елементів з того ж кінця (вилучення зі стека). Елементи вилучаються гаразд, зворотному тому, у якому вироблялася їх засилання: заслане останнім вилучається першим. Дані, що підлягають тестуванню або перетворенню засилаються в стек, де над ними виконуються пропоновані операції, після чого з стеку можна вилучити результати обробки.

Наприклад, якщо є змінна X, оголошена як 32-х бітне довге слово, то безпосередньо над нею здійсненні лише дві операції:

1) засилання її значення у стек, що відбувається автоматично при кожній згадці імені X,

2) привласнення їй командою! X значення вилучається зі стека останнього (верхнього) елемента.

Якщо, скажімо, потрібно подвоїти значення X, склавши його з собою, то зробити це можна виконуючи один за одним наступні команди:

У стек будуть надіслані два екземпляри значення X, потім команда + вилучить їх, складе та зашле в стек отриману суму, після чого команда! X вилучить цю суму і надасть її значення змінної X.

Звичайна для мов високого рівня запис наведеного прикладу як X:=X+X звичніше для програміста, але вона є прямим відображенням послідовності команд, виконуваних процесором, а є різновид математичної формули. Це зручно при програмуванні обчислювальних завдань, однак у базовій мові однозначна відповідність виконуваним командам є більш важливим, оскільки командну перевірку програми можна проводити безпосередньо на мові програмування і взагалі не потрібно знати мову, відмінну від мови процесора.

Але особливо цінна перевага стекової обробки даних полягає в тому, що процедури тестування та перетворення можуть бути визначені та реалізовані незалежно від даних, до яких вони застосовуються. Операції тестування та перетворення формулюються не щодо ідентифікаторів даних (або імен констант та змінних, формальних параметрів), а щодо елементів стека, яким на момент виконання операції мають бути присвоєні значення операндів. Наприклад, операція складання двох чисел, що виконується за командою + (скласти), полягає в тому, що з стека беруть як складові два верхні елементи (вершину і підвершину), обчислюють їх суму і засилають її в стек. Щоб скласти два числа, треба заслати їх значення у стек і виконати команду +, результат буде у вершині стека.

Процедура тестування-перетворення з довільним числом вхідних та вихідних параметрів може бути визначена таким чином просто як назва дії (без списку параметрів), що виконується над стеком, що містить розміщені в установленому порядку значення аргументів, а після виконання - значення результатів. Для застосування такої процедури до того чи іншого набору конкретних даних слід надіслати ці дані у відповідній послідовності в стек. Споживши їх, процедура залишить у стеку (також розташованими у певній послідовності) свої результати.

Інакше кажучи, імена процедур у мові РАЯ використовуються так само як знаки операцій і є сутнісно символи операцій із довільним числом операндов. Відповідно до принципу функціонування стека операції записуються у постфіксної формі, тобто. Ім'я операції міститься після перерахування імен або значень її операндів. Наприклад, якщо позначити операцію отримання суми трьох чисел символом ++, то сума чисел A, 5 та B виразиться так:

Можна було б встановити формальні правила постфіксної мови і керуватися ними під час написання програм, але людині простіше і надійніше мати справу з правилами, і з моделлю стекового процесора, тобто. з моделлю тієї машини, для якої створюються програми і яка їх виконуватиме. У разі мови РАЯ такою машиною є ДССП-процесор - сукупність апаратури та програм, що реалізує запропоновані цією мовою дії.

ДССП-процесор

Фізично ДССП-процесор може бути здійснений у вигляді мікропроцесора тієї простої та ефективно програмованої архітектури, яка дозволила б вирішити проблему програмного оснащення мікрокомп'ютерів якнайкраще. Але такий мікропроцесор ще не створений і його архітектуру доводиться емулювати на наявних мікрокомп'ютерах з метою покращити їх програмування. Звичайно, емуляція пов'язана з витратами - для здійснення її потрібно пам'ять і машинний час, але у разі емуляції ДССП-процесора ці витрати є порівняно невеликими.

З погляду програміста характеристикою процесора його архітектура, тобто. інформація про те, що являє собою даний процесор як інструмент обробки даних, які можливості представлення даних на вході та всередині процесора, які є операції тестування та перетворення даних, як організована власна пам'ять процесора, а також доступ до головної та зовнішньої пам'яті, які засоби управління ходом програми, взаємодії із зовнішнім середовищем, реагування на виняткові події тощо. Опанування архітектурою становить необхідну умову осмисленого (неформального) програмування, у якому значно скорочується кількість помилок і підвищується надійність програм.

Центральною ланкою ДССП-процесора є вже згадуваний стек операндів. Власне в стеку проводиться обробка і через стек, як правило, здійснюється пересилання даних. Окремі команди та короткі послідовності команд над стеком можна виконувати, подаючи їх на вхід процесора безпосередньо з клавіатури терміналу. У цьому ДССП-процессор імітує роботу постфиксного калькулятора. Числа і мнемокоды операцій, що вводяться з клавіатури, розділяються пробілами. Введений текст відображається як рядок на екрані терміналу. Сигналом закінчення введення та командою процесору "Виконати введений розпорядження" служить натискання клавіші , що позначається також , . Що надходять на вхід процесора числа заносяться в стек, а команди виконуються над стеком. Отриманий на вершині стека результат обчислення можна скопіювати на екран терміналу командою. (крапка).

Наприклад, щоб обчислити вираз (2-5)*3 та вивести на екран отриманий результат, вводимо:

2 5 - 3 * .

Після натискання клавіші процесор видає результат, так що весь рядок матиме вигляд

* 2 5 - 3 * . -90

Зірочка на початку рядка видається процесором як сигнал, що він чекає на введення.

У розглянутому прикладі процесор сприймав і обробляв числа, що вводяться, як цілі десяткові. Насправді при введенні проводився переведення цих чисел у двійковий додатковий код, а під час виведення - зворотний переведення в десяткову систему. ДССП-процесор допускає також режими двійкового, вісімкового та шістнадцяткового введення/виводу. Для переходу в бажаний режим треба виконати одну з команд B2, B8, B10, B16.

Натискання клавіш викликають подачу на вхід процесора кодів, що представляють позначені на цих клавішах літери (літери, цифри, розділові знаки, символи операцій). Послідовність літер, що вводяться, утворює вхідний рядок - ланцюжок байтів, що містять коди літер, по одному байту на літеру. Максимальна довжина вхідного рядка – 80 літер.

Обробляючи вхідний рядок, процесор вичленює у ньому слова - поєднання літер, розділені друг від друга пробілами, і інтерпретує їх. Якщо слово, що обробляється, є відомим процесору ім'ям операції (процедури) або даного, то процесор виконує дії, які має викликати за визначенням це ім'я. Якщо ж слово невідоме процесору, він намагається інтерпретувати його як число з урахуванням встановленого режиму ввода/вывода.

Числами визнаються слова, що складаються з допустимих у цій системі числення цифр і, можливо, що містять як першу літеру знак мінус. У режимі шістнадцяткового введення/виводу до допустимих поряд з цифрами відносяться також латинські літери A, B, C, D, E, F. Прийняте число перетворюється на двійковий додатковий код і надсилається в стек операндів у вигляді 32-бітного довгого слова. При цьому, якщо значення числа виявилося поза діапазоном представлених значень -2147483648: 2147483647, воно замінюється порівнянним за модулем 2**32 значенням з цього діапазону.

У тому випадку, коли оброблене слово не відоме процесору і не може бути прийняте як число, процесор видає на екран терміналу повідомлення: "не знаю<обрабатываемое слово>і чекає введення подальших розпоряджень.

Введення даних у вигляді довільного тексту (послідовності байтів-літер) проводиться у формі текстових літералів, що є текстом, поданим у подвійні лапки, наприклад: "Текстовий літерал". Надходження текстового літерала на вхід процесора викликає запис укладеного між лапками тексту на головну пам'ять як ланцюжка байтів-літер. При цьому в стек посилається адреса першого байта та число байтів (довжина тексту). Текстовий літерал, доповнений спереду точкою, сприймається процесором як команда "видати текст, що знаходиться між лапками, на екран терміналу". Наприклад, подача на вхід процесора значень поєднання. "Немає пам'яті" викликає на екрані повідомлення: Немає пам'яті.

Код окремої літери засилається в стек як молодший байт вершини при надходженні на вхід процесора цієї літери разом з надісланим їй знаком #. Наприклад, значення #L зашле в стек код літери L, знаходження #5 зашле код цифри 5. Команда TOB виведення байта на термінал видає на екран літеру, код якої міститься в молодшому байті вершини стека.

Навіть у режимі безпосереднього виконання команд ДССП-процесор набагато перевищує можливості звичайного калькулятора, надаючи користувачеві крім операцій обробки даних засоби оголошення даних і визначення процедур, які можуть бути використані поряд з базовими операціями. Оголошення імен даних та визначення процедур здійснюється за допомогою спеціальних команд.

Наприклад, щоб створити 16-бітну змінну з ім'ям, скажімо, TEMP, слід набрати на клавіатурі та подати на вхід процесора клавішами команду

VAR TEMP

Можна разом з оголошенням присвоїти змінній початкове значення, наприклад, 0:

VAR TEMP 0! TEMP

Тепер надходження на вхід процесора імені TEMP викликатиме засилку в стек поточного значення цієї змінної, а привласнення їй нового, що вилучається зі стека значення, може бути зроблено командою! TEMP.

Визначення процедури вводиться командою: (двокрапка), що містить ім'я процедури, що визначається, і визначальний ланцюжок команд з літерою; (точка з комою) як символ кінця визначення. Продемонструємо визначення та використання процедур на прикладі обчислення факторіалу натурального числа N за формулою

N!=N*(N-1)*(N-2)*...*2*1, тобто. N-1 множення.

Процедура FCT щоб одержати шуканого результату повинна помножити це число N на послідовно спадають числа, починаючи з N-1 по 1, тобто. всього N-1 разів. На мові РАЯ це програмується за допомогою t-кратного виконання процедури P: DO P, де P – ім'я процедури, t – поточне значення вершини стека, що вказує, скільки разів потрібно виконати процедуру P.

Припустимо, що до застосування процедури FCT число N надіслано в стек і знаходиться в його вершині. Щоб зробити процедуру більш зрозумілою, представимо модифікований множник змінної K:

Визначення процедури FCT введемо у вигляді:

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

У квадратних дужках подано коментарі, що відображають поточний стан стека операндів. Команда! K, якою починається визначається процедура, привласнює взяте зі стека значення числа N змінної K. Потім K двічі засилається в стек і відніманням 1 у вершині стека формується число виконань процедури, що повторюється F, рівне N-1. Далі слідує команда DO F, що наказує цикл, після завершення якого у вершині стека буде міститися шукане значення факторіалу - N!. Команда. (Точка) видає копію цього значення на екран терміналу. Залишилося визначити процедуру F, яка модифікує значення K відніманням 1 і множить на K частковий результат обчислення R, що міститься в стеку.

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

Перевірка правильності обох процедур проводиться шляхом командного виконання їх визначень з видачею на екран терміналу після кожної команди вмісту стека операндів та значення змінної K. Після завершення роботи процедури FCT вершина стека повинна містити значення N!, а значення змінної K має бути рівним 1.

Перевірені та відкориговані (якщо в процесі перевірки були виявлені помилки) процедури піддаються тестуванню застосуванням їх до окремих значень числа N. Оскільки процедура F вкладена в FCT, тестування її здійснюється автоматично в процесі тестування останньої. Слід пам'ятати, що значення результату нічого не винні перевищувати максимального позитивного числа, що у додатковому коді 32-битным довгим словом: 2147483647, тобто. FCT видає правильні результати лише за N=1, ..., 13.

Використання FCT не відрізняється від використання власних команд процесора: для отримання результату треба задати значення операнда та ввести ім'я процедури:

5 FCT 120

7 FCT 5040

Наведена реалізація процедури FCT зажадала введення допоміжної змінної K, проте функціонально рівноцінну процедуру можна здійснити без допоміжної змінної, скориставшись операцією C, яка посилає в стек копію його вершини, і операціями E2 і E3, які обмінюють вершину відповідно з другим і з третім елементами. Визначення цієї процедури має такий вигляд.

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

: FA C E3 * E2 1-;

Перевага такої "чисто стікової" процедури полягає в її повній автономності: так само як базові стекові операції процесора вона виконується тільки над стеком операндів, не вимагаючи іншої пам'яті і не викликаючи будь-яких змін в інших компонентах процесора.

Імена визначених процедур і даних, що оголошуються, заносяться в словник процесора, що встановлює зв'язок цих імен з поіменованими об'єктами, тобто з розміщеними в головній пам'яті тілами процедур і з елементами цієї пам'яті, що виділяються для зберігання оголошених даних. Обробляючи чергове слово з вхідного потоку, процесор переглядає словник і, знайшовши у ньому слово, виконує зіставлені цьому слову дії. Якщо ж пошук виявився безуспішним, то, як уже було сказано, робиться спроба числової інтерпретації даного слова, а якщо і це не вдається, слідує повідомлення, що слово процесору не відомо.

В результаті компіляції визначення процедури в словник заноситься ім'я цієї процедури та покажчик (адреса) її тіла, яке є послідовністю покажчиків процедур і даних, що становлять визначення. Іншими словами, внутрішнє уявлення тіла процедури виходить заміною імен процедур та даних у її визначенні покажчиками відповідних тіл, які у свою чергу є такими ж послідовностями покажчиків, а у разі примітивів – ланцюжками машинних команд. Таке внутрішнє уявлення програми ми називаємо процедурним кодом.

Коли поряд з компіляцією визначення процедури P скомпільовані також визначення всіх не відомих до того процесору вкладених процедур, то утворюється закінчена ієрархія покажчиків, що забезпечує можливість виконання процедури P шляхом подачі на вхід лише одного її імені. При цьому імена скомпільованих у зв'язку з визначенням P вкладених процедур, якщо не потрібно звертатися до цих процедур окремо, зберігати в словнику немає сенсу. У ряді випадків виявляється доцільним закрити доступ до тієї чи іншої частини словника, залишивши, можливо, можливість виконувати лише деякі процедури.

Для того, щоб задовольнити подібним вимогам, словник реалізований у вигляді сукупності підсловників, над якою визначені операції, що дозволяють створювати та знищувати підслівники та їх частини, видаляти імена, закривати та відкривати доступ до тих чи інших підсловників. Кожен підсловник має ім'я, яке використовується у командах, що відносяться до нього. Імена підслівників повинні починатися літерою $, наприклад $PRIME, $EDIT, $FLOAT, $TEXTPROC, $ГРАФІКА.

Підсловник $PRIME, що містить базовий набір слів ДССП, після запуску процесора відкритий як для доступу до слів, що містяться в ньому, так і для поповнення новими словами. Занесені до нього нові слова за необхідності можуть бути видалені разом із зіставленими ним тілами командою FORGET $ PRIME. Після цього можливість подальшого занесення слів у цей підсловник забезпечується виконанням команди GROW $PRIME, що дозволяє знову нарощувати підсловник $PRIME, причому все занесене до нього знову може бути видалено командою FORGET $PRIME і т.д. У такому режимі ДССП використовується при експериментуванні з невеликими фрагментами програм, окремими прикладами, прикидками, а також у разі необхідності включити до підсловника $PRIME нові слова в порядку розвитку мови системи.

У разі створення окремої програми для неї утворюють власний підсловник, причому досягається це тим, що текст програми починають командою

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

Людина сприймає цю команду як заголовок, за яким повинен слідувати коментар у квадратних дужках, що характеризує кількома словами реалізовану програмою функцію. Для процесора вона дорівнює послідовності команд

FORGET $<имя>GROW $<имя>

Тому кожне надходження тексту програми на вхід процесора викликає видалення її попередньої версії і відкриє очищений таким чином підсловник для занесення нової версії програми, що носить те саме ім'я. Це зручно при внесенні виправлень у програму, що створюється, а також при її модифікації надалі.

Текст програми, що конструюється, не вводиться на вхід процесора безпосередньо з клавіатури, а формується в буфері редактора текстів. Командою E (Edit - редагувати) встановлюється режим редагування, в якому слова, що набираються на клавіатурі, вже не сприймаються процесором як команди, що підлягають негайному виконанню, а є просто записуються в буфер і одночасно відображається на екран текстом. За допомогою спеціальних клавіш, що управляють переміщенням по екрану покажчика поточної позиції (курсора), а також команд редагування, що подаються натисканням інших клавіш, текст можна коригувати і змінювати, роблячи видалення і вставки, переносячи з місця на місце його фрагменти і т.д.

Після закінчення введення та редагування тексту редактор відключається натисканням клавіші E одночасно з (а точніше, з попередньо натиснутою) клавішею , і система перетворюється на основний режим команд ДССП. Аналогічна дія викликає просто натискання клавіші . У цьому режимі вміст буфера редактора можна видати на вхід процесора командою PF (PerForm – виконати). При цьому будуть виконані всі команди, що містяться в тексті, зокрема, команда PROGRAM $<имя>видалить занесені до підсловника $<имя>з моменту останнього виконання цієї команди імена даних та процедур, а також відповідні тіла, знову відкривши цей підслівник для нарощування. Команди оголошення даних та визначення процедур занесуть до нього введені ними імена разом із вказівниками на зазначені цими іменами дані та тіла процедур, скомпільовані відповідно до ухвал.

Після завершення завантаження процедури та дані доступні для звернення за їх іменами, що набираються з клавіатури, і можна провести перевірку правильності програми, виконуючи процедури у висхідній послідовності, тобто. розпочавши з тих, визначення яких не містять неперевірених процедур. Перш ніж розпочати перевірку, доречно переконатися, що у програмі не використані не певні імена. Процесор видає їх на екран за командою UNDEF. Для поповнення тексту програми визначеннями цих імен, а також для виправлення інших помилок, що виявляються в процесі перевірки, треба командою E викликати редактор і зробити відповідну модифікацію вихідного тексту програми, що знаходиться в буфері редактора, а потім переключити процесор в основний режим і завантажити вміст буфера командою PF.

Після перевірки та тестування програми її вихідний текст можна скопіювати з буфера редактора на диск командою OE f де f - ім'я файлу, у формі якого програма буде записана на диску. Надалі вміст файлу можна буде завантажувати на вхід процесора командою LOAD f, а також копіювати в буфер редактора як додавання до тексту командою IE f. За замовчуванням файли мають розширення DSP. Буфер можна попередньо очистити KE. Можна також роздрукувати вміст буфера командою LPE.

Після завантаження готової для виконання програми можна зробити чистку створеного для неї підсловника $<имя>командою CLEAR $<имя>. Виконуючи цю команду, процесор видаляє з названого підсловника незафіксовані імена, тобто. всі імена, крім тих, перед визначеннями яких є фіксуючий префікс: (два двокрапки). При цьому видаляються лише самі імена (словникові входи), а зіставлені ним тіла процедур і дані зберігаються і доступні у процесі виконання програми за встановленими під час компіляції внутрішніми посиланнями, проте вони більш недоступні. Щоб відновити можливість доступу ззовні, наприклад, при необхідності скомпілювати якесь доповнення або зміну, треба заново завантажити вихідний текст програми.

Імена можна зробити недоступними ззовні, не видаляючи їх зі словника, командою SHUT $<имя>, що закриває доступ до всіх слів названого у ній підсловника. Відкриття підсловника для його слів здійснюється командою USE $<имя>. Є також команда ONLY $<имя>, що закриває всі підсловники, крім названого, та команда CANCEL, що скасовує це обмеження. Перелічені команди дозволяють керувати використанням словника під час компіляції та обмежувати необхідним мінімумом сукупність імен, доступних користувачеві програми.

Пошук імені у словнику проводиться шляхом перегляду його слів у порядку, зворотному тому, де вони були занесені до словника, тобто. починаючи із занесеного останнім. Тому для імені, визначеного у словнику більше одного разу, дійсним буде найпізніше визначення. Якщо ж підсловник, що містить останнє визначення, закритий, то пошук триває до першого доступного словникового входу з цим ім'ям і буде використано визначення, яке вказується цим входом.

Декілька слів про введення та виведення даних. Як було зазначено, процесор намагається інтерперетувати не знайдене у словнику слово виконуваної програми як число й у разі успіху заносить у стек двійковий еквівалент цього числа. Введення числа в стек може бути здійснено командою TIN, що вимагає набору на клавіатурі. Є також команди, що викликають засилку в стек літери, що вводиться з клавіатури: TIB - з відображенням, TRB - без відображення цієї літери на екран. При цьому код літери представлений молодшим байтом 32-бітного слова, що засилається в стек, старші 3 байти якого рівні нулю.

Введення вмісту вершини стека відповідно можливе у вигляді числа та у вигляді літери. Команда TON викликає видачу на екран числового значення підвершини в полі видачі, ширина якого задається вершиною, у встановленій на момент виконання системи представлення чисел. Команда TOB видає на екран літеру, код якої міститься у молодшому байті вершини стека. В обох випадках висновок супроводжується видаленням аргументів зі стеку.

ДССП-процесор має апарат зовнішніх і внутрішніх (командних) переривань і надає такі засоби їх обробки. Призначена для обробки зовнішнього переривання процедура визначається аналогічно до звичайної процедури, але з додаванням перед двокрапкою префікса INT. Ім'я такої процедури пов'язується з адресою вектора переривання командою:

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

Командне переривання є поіменовану операцію виклику процедури реагування. Ім'я цієї операції визначається командою TRAP, зіставляє йому процедуру так званого кінцевого реагування, що виконується в тому випадку, якщо кінцева реакція не замінена за допомогою команди ON або EON іншою процедурою реагування. Усі три команди мають однаковий формат:

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

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

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

Процедура, зіставлена ​​імені виклику командою EON, виконується з попереднім виходом з тіла процедури, що містить команду EON, та з тим значенням вказівника стека операндів, яке мало місце в момент виконання EON.

Синтаксис мови РАЯ

Алфавіт мови РАЯ включає латинські та російські, малі та великі літери, десяткові цифри, математичні та інші спеціальні знаки. Елементи (члени) алфавіту називаються літерами. Зовнішнє уявлення літери є її друковане зображення (друкований знак). Усередині ДССП-процесора кожна друкована літера є байтом, значенням якого є двійковий код цієї літери. Перетворення зовнішнього уявлення у внутрішнє та назад здійснюється пристроєм введення/виводу (клавіатурою, дисплеєм, принтером). Для зручності числове значення коду виражають у десятковій, шістнадцятковій або вісімковій системі, називаючи відповідне число десятковим, шістнадцятковим або вісімковим кодом літери.

Всі об'єкти мови РАЯ будуються з літер і є лінійними ланцюжками літер кінцевої довжини, звані словами. Розділювачем слів, що йдуть один за одним служить недрукована літера (пробіл). Ланцюжок пробілів дорівнює одному пробілу. Крім того, функцію роздільника слів виконує команда "Перейти на початок чергового рядка", що позначається на клавіатурах пристроїв введення символом або і поруч із літерами має внутрішнє уявлення кодом-байтом. Таким чином, на початку та в кінці рядка розділові пробіли не потрібні.

Приклади слів: CLEAR NOP СТЕК2 & 1+-366 X Проба.

ДССП-процесор розрізняє слова з перших семи літер, упізнаючи їх шляхом політерного порівняння зі словами, що знаходяться в його словнику. Словник містить слова, що є іменами (позначеннями) власних операцій процесора, які називаються базовими операціями або примітивами, і може поповнюватися іменами об'єктів (даних, процедур), що визначаються користувачем. Отже, які у словнику слова є або іменами дій (операцій, процедур), або іменами даних (констант, змінних, масивів).

Коли впізнаваного слова у словнику немає, процесор намагається віднести його до одного з наступних випадків:

    числовий літерал, тобто. послідовність цифр, що, можливо, починається знаком "мінус", наприклад: 0, 4096, -25;

    літерал літери: слово, що починається літерою #, яка викликає отримання процесором як даний код безпосередньо наступної за ним літери, наприклад: #A - літерал великої латинської літери A, #5 - літерал цифри 5, # - літерал пробілу, ## - літерал літери #;

    текстовий літерал: довільний текст, укладений у подвійні лапки та відокремлений роздільниками слів, наприклад: "Текст", "Вхідний файл N3";

    команда видачі на дисплей текстового повідомлення: текст повідомлення, що видається, обмежений ліворуч з поєднанням точка-подвійна лапка і подвійний лапки праворуч і відокремлений роздільниками слів, наприклад: ."Стек порожній";

    коментар: довільний текст, укладений у квадратні дужки та відокремлений роздільниками, наприклад: .

Літерали та команда видачі повідомлення на дисплей виступають як об'єкти мови ДССП нарівні з упізнаними за словником словами, коментарі ж повністю ігноруються ДССП-процесором – вони призначені для людини, а не для машини. Якщо слово не знайдено у словнику та не має відношення до перерахованих конструкцій, процесор видає повідомлення: "Не знаю<неопознанное слово>".

З огляду на особливий сенс, що надається літерам #, "і поєднанню." на початку слова, тобто. після роздільника, а також літері "перед роздільником, вони не повинні вживатися у зазначених положеннях у словах, що визначаються для включення до словника.

Послідовність слів на вході процесора інтерпретується як послідовність виконуваних процесором команд. При цьому різняться три роди слів:

1) виконувані незалежно, тобто. являють собою однослівні команди (монослова);

2) виконувані разом із однією чи кількома наступними словами, тобто. є початковими словами (префіксами) двох-, трьох-або багатослівних команд;

3) попередні команди як уточнення або вказівки на спеціальний режим виконання (передпрефікси).

До монословів відносяться літерали, імена даних, більшість операцій введення/виводу, тестування та перетворення даних у стеку, а також процедури, що визначаються користувачем. Наприклад: 1987 - числовий літерал, #5 - літерал цифри 5, "Перелік схем" - текстовий літерал, ДОВЖИНА - ім'я змінної, TOB, NEG, +, &,<, = - имена (обозначения) операций, SORT, CONVERT, ЧИСТКА, СНЯТЬ - имена процедур пользователя.

Префікси притаманні командам опису даних та визначення процедур, а також маніпулювання зазначеними даними, умовного та багаторазового виконання процедур, управління словником. Приклади команд із префіксами:

VAR СУМА - створити змінну СУМА,

: ODD [x] 1 &; - Створити процедуру ODD, що заміщає непарне число на 1, парне на 0,

0 X - присвоїти змінній X значення 0,

BR+ P1 P2 - якщо взяте зі стека значення його вершини позитивно, то виконати P1, інакше виконати P2,

RP CHECK - виконувати процедуру CHECK знову і знову,

USE $REAL - відкрити для використання підсловник $REAL.

Як правило, конкретний префікс вимагає по собі певну кількість слів. Так, у наведених прикладах префікси VAR, !0 і USE вимагають по одному слову, а префікс BR+ вимагає два слова. Однак префікс: (двокрапка) дозволяє утворити команду довільної довжини, починаючи з трьох слів. Кінцем команди є слово; (крапка з комою). Довільна довжина властива також команді-описувачу констант CNST A1...AJ; та команді множинного вибору процедури BR A1 P1 ... AJ PJ ELSE PN.

Передпрефікси є особливими словами, додавання яких до команди спереду модифікує її зміст або визначає спеціальний режим виконання. Наприклад, команда VAR X без предпрефікса є розпорядженням створити 16-бітну змінну X. Якщо приєднати до неї передпрефікс BYTE, то отримаємо команду BYTE VAR X, яка наказує створити 8-бітну змінну (байт) з ім'ям X. Якщо ж використовувати препрефікс LONG, то отримаємо LONG VAR X - розпорядження створити 32-бітну змінну з ім'ям X.

Предпрефікс іншого типу, а саме: (два двокрапки) повідомляє результат виконання команди стійкість по відношенню до процедури CLEAR, що видаляє зі словника незакріплені слова. Імена, що заносяться в словник у процесі конструювання програми командами опису даних та визначення процедур, після того, як програма створена та перевірена, можуть бути видалені зі словника, за винятком небагатьох, необхідних обслуговування готової програми. Видалення проводиться командою CLEAR $<имя подсловаря>, Що наказує очистити пов'язаний з програмою підсловник, зберігши в ньому тільки ті слова, в визначеннях яких міститься препрефікс::. Приклади команд, що породжують слова, що не видаляються:

:: BYTE CNST LITCODE # #0 #A;

:: : MOD / [ціл(a,b),ост(a,b)] E2 D [ост(a,b)] ;

Як показує другий приклад, що містить препрефікси:: і BYTE, у складі команди може бути більше одного препрефіксу.

Таким чином, команда в ДССП може бути або одним словом (монословом), або словосполученням (фразою), префіксом, що починається і містить встановлене для даного префікса число слів, а якщо префікс допускає довільне число слів, то мають в кінці слово-обмежувач, або вона то, можливо фразою, доповненої спереду особливими словами-предпрефіксами.

Базова мова ДССП не містить складніших синтаксичних конструкцій, ніж команда і взагалі не містить інших, крім розглянутих вище, конструкцій. Навіть такі неодмінні в мовах програмування речі як вираз і функція відсутні в базовій мові і можуть бути введені за необхідності лише під час його розвитку.

Програма базовою мовою - це просто сукупність команд, що виконуються в порядку їх розташування в тексті. При цьому кожна команда, за винятком що містять одні лише примітиви, у процесі її виконання залучає послідовність команд, якими визначені слова, що входять до неї. Залучені команди можуть у свою чергу містити слова, що позначають ланцюжки команд, в яких також можливі слова, що відсилають до ланцюжків, що їх зіставили, і т.д. до того рівня, на якому в командах утримуються лише примітиви.

Загальний опис мови РАЯ, що склало зміст цього розділу, було присвячено характеристиці ладу цієї мови та базового (вихідного) набору його команд, що є набором вбудованих команд (примітивів) ДССП-процесора. Подальший розвиток мови та відповідне нарощування можливостей процесора проводиться шляхом запровадження нових процедур, команд, форматів та типів даних, що конструюються з використанням базових засобів. Як правило, такий розвиток носить проблемно-орієнтований характер і здійснюється у вигляді пакетів процедур, що завантажуються на вхід процесора на додаток до базової системи.

З іншого боку, базова система може бути доповнена реалізованими на її основі спеціальними засобами для підвищення машинної ефективності ДССП-програм. До цих засобів відноситься можливість визначення окремих процедур безпосередньо в коді команд машини, що використовується. Спосіб визначення процедури не впливає на її подальше використання: імена всіх процедур заносяться до загального словника і абсолютно рівноправні. Низка бібліотечних програм дозволяє використовувати процедури або цілі програми, написані іншими мовами.

Опис операцій та команд

Операції, що виконуються над стеком

Стек операнда є одним з головних елементів архітектури ДССП-процесора. Більшість команд процесора використовують стек, споживаючи з нього необхідні їм операнди і засилаючи результати. Інтерпретація даних, що у стеку, залежить від суті розв'язуваного завдання, т. е. зрештою покладено програміста. Внаслідок того, що значення, що потрапило в стек, фактично втрачає своє ім'я, за текстом програми важко визначити, до яких операндів застосовується та чи інша операція, як її результати. Тому для явної вказівки операндів та результатів процедур у мові РАЯ використовуються коментарі. При цьому не потрібно (та й не завжди можливо) описувати весь вміст стеку. Коментувати верхню частину стека, що зачіпається виконуваної над ним процедурою, абсолютно необхідно, так як без цього втрачається наочність програми, утруднюється її перевірка.

Досягнення одноманітності програм ці коментарі потрібно писати з урахуванням кількох простих правил. Як і будь-який коментар, опис даних, що знаходяться в стеку, полягає у квадратних дужках. Цей опис є список операндів, що знаходяться в стеку в даній точці програми. Кожен елемент списку характеризує вміст однієї позиції стека, як роздільник використовується кома. Значення позицій стека перераховуються ліворуч, починаючи з елемента, що лежить на найбільшій глибині, і закінчуючи вершиною стека. Як опис окремого операнда може виступати число, ім'я, вираз або будь-яка інша змістовна запис, що пояснює значення значення, що знаходиться в стеку. Іноді на певній позиції стека можна вказати кілька можливих значень. І тут значення перераховуються через косу межу.

Наведемо приклад коментаря, що відображає стан стека операндів:

[поч.адр.,N+1,1/0]

У точці програми, де знаходиться цей коментар, стек операндів повинен містити як мінімум три позиції, причому у вершині може бути 1 або 0, у вершині - числове значення, що дорівнює N+1, а під ним - деяке число, яке інтерпретується як початкова адреса.

Для зручності вказівки необхідної позиції стека ми використовуватимемо поняття глибини залягання. Вважатимемо, що вершина стека лежить на глибині 1, підвершина - на глибині 2 і т.д. Зокрема, значення, позначене у прикладі як "поч.адр." лежить на глибині 3.

Вивчення базової мови ДССП ми розпочнемо з команд засилання значень у стек. Найпростішою (і найчастіше використовуваною) командою цього є числовий літерал, т. е. явне вказівку константи, яку треба помістити в стек. Нехай, наприклад, ми хочемо заслати у стек числа 28, -5 та 11. Для цього необхідно ввести рядок з клавіатури:

28 -5 11 та натиснути клавішу (Повернення каретки). Процесор розпізнає введені числа і по черзі надішле їх у стек, так що у вершині виявиться 11. Щоб переконатися в цьому, достатньо роздрукувати значення вершини стека на екрані дисплея. Для цього є команда ДССП з ім'ям. (крапка). Набравши на клавіатурі літеру "крапка" і натиснувши , Отримаємо на екрані відповідь: 11, що відповідає останньому засланому в стек значенню. Повторне виконання "точки" призводить до того ж результату - ця команда лише візуалізує вершину, не змінюючи стану стека.

Для того, щоб видати на екран весь вміст стека, ДССП є команда. (дві точки). Виконавши її, отримаємо на екрані рядок:

Як видно, форма роздруківки відповідає прийнятим угодам про коментування стану стека (за винятком того, що замість коми використовується пробіл). Команда.. не змінює вміст стека.

Для представлення однієї позиції стека в пам'яті машини використовується 32-бітове слово (4 байти), числа надаються в додатковому коді. Відповідно ДССП-процесор може правильно сприйняти тільки цілі числа, що лежать в діапазоні від -2147483648 до 2147483647. Якщо введене число не представимо 32 бітами (з урахуванням знака), то відбувається відкидання старших бітів, що не вміщаються.

У розглянутих прикладах передбачалося, що ДССП-процесор перебуває у режимі десяткового введення/виводу чисел. Для встановлення цього режиму мовою РАЯ є команда B10.

Багато завданнях потрібно інтерпретувати оброблювані дані не як числа, бо як двійкові коди, т. е. 32-компонентні вектори бітів. У ДССП є можливість працювати з кодами, представленими у двійковій, вісімковій чи шістнадцятковій системі числення. Для встановлення потрібного режиму достатньо виконати одну з трьох команд: B2, B8 або B16, після чого процесор буде сприймати і роздруковувати всі коди, що вводяться в зазначеній системі числення.

Даною можливістю можна користуватися для переведення десяткових чисел до систем обчислення з підставами 2, 8 та 16. Наприклад, для перекладу числа 29 потрібно ввести та виконати наступний рядок:

B10 29 B2. B8. B16. В результаті процесор видасть на екран ряд чисел: 00000000035 0000001D які є уявленнями десяткового числа 29 у трьох зазначених системах числення. Зауважимо, що коди друкуються в їхньому машинному поданні, тобто з провідними нулями і без знаків "+", "-". Під час виконання рядка B10 -2 B8 . буде видано число 37777777776, яке є вісімковим поданням -2 у додатковому коді.

Під час роботи з шістнадцятковими кодами можуть виникати колізії між числовими літералами та іменами команд ДССП-процесора. Наприклад, слово B8 у режимі шістнадцяткового введення/виведення може бути витлумачено як команда установки вісімкового режиму і як шістнадцяткова константа. Щоб уникнути невизначеності, слід починати числові літерали з незначного нуля, наприклад 0B8.

Основу системи команд ДССП-процесора становлять операції перетворення даних, що у стеку. Загальне правило, що регламентує роботу цих операцій, у тому, кожна операція споживає (видаляє) з стека потрібні їй операнди і посилає їхнє місце значення результатів (якщо такі є).

Розглянемо команди процесора, що реалізують чотири арифметичні операції: додавання, віднімання, множення та розподіл цілих чисел. Для їх зображення у мові РАЯ використовуються слова: +, -, * та / відповідно. Щоб отримати в стеку суму двох чисел, наприклад 123 і 45, потрібно надіслати ці числа в стек і виконати команду +. Для цього достатньо ввести з клавіатури наступний рядок (передбачається, що встановлено режим десяткового введення/виводу):

123 45 +

Якщо тепер видати на екран вміст стека (за допомогою команди..), то буде видно результат додавання:

Аналогічно працює комутативна операція множення.

При виконанні некомутативних операцій віднімання і поділу як зменшуваного (ділимого) береться підвершина стека, а віднімається (ділителем) служить вершина. Наприклад, для обчислення різниці 151-68 потрібно виконати рядок:

151 68 -

Програма виконання арифметичної дії в мові РАЯ характеризується тим, що операція перебуває після відповідних операндів. Такий запис арифметичних виразів зветься постфіксним (або польським інверсним) записом і широко використовується в стекових мікрокалькуляторах. Нехай, наприклад, нам необхідно обчислити значення арифметичного виразу ((127+81)*15-(31+117)*21)*3

У постфіксному записі цей вираз виглядатиме так:

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

Цей рядок (у якому слова відокремлені один від одного пробілами) є готовою програмою для обчислення нашого виразу ДССП-процесором.

Команда поділу / відрізняється від інших арифметичних операцій тим, що її результатом є два значення – приватне та залишок. Приватне виявляється у вершині стеку, а залишок – у вершині. Приватне негативно в тому випадку, якщо поділяється і дільник різних знаків. Залишок завжди має знак поділеного. Наведемо кілька прикладів використання команди розподілу.

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

При виконанні обчислень можуть виникати помилкові ситуації: переповнення та розподіл на нуль. ДССП-процесор ніяк не реагує на них (зокрема, при розподілі на нуль вміст стека не змінюється), а контроль за коректністю використання операцій покладається на програміста.

При програмуванні часто доводиться збільшувати чи зменшувати значення будь-якої величини на 1 і 2. У мову РАЯ введені спеціальні команди, виконують зазначені дії над вершиною стека. Вони позначені словами: 1+, 1-, 2+, 2-. Виконання цих команд еквівалентно засилання в стек потрібної константи (1 або 2) з подальшим виконанням необхідної арифметичної дії (+ або -). Наприклад, 2+ еквівалентно парі слів 2+. Введення мови даних команд викликане міркуваннями ефективності.

Також підвищення ефективності в базовій мові ДССПпроцесора є команди T0 і T1, замінюють значення вершини стека на 0 і 1 відповідно, незалежно від цього, яке було у вершині до зазначеної команди. Приклади:

Для роботи з числовими даними призначені команди NEG, ABS і SGN. Команда NEG змінює знак вершини стека на протилежний, ABS замінює значення вершини стека його модулем, SGN - споживає числове значення з вершини стека і поміщає його місце знак витягнутого числа: -1 - якщо число негативно, 1 - якщо позитивно, 0 - якщо равно нулю. Наприклад:

5 NEG [-5] ABS SGN

Наявні в базовій мові команди MIN і MAX дозволяють знаходити мінімум і максимум двох цілих чисел. Операндами цих команд служать два числа, що у вершині і підвершині стека. Команда MIN залишає в стеку мінімальне з чиселпараметрів, MAX - максимальне з них. Наприклад:

5 0 15 MIN [-5,0] MAX

Для знаходження мінімуму (максимуму) з трьох чисел, що знаходяться в стеку, достатньо двічі застосувати команду MIN (MAX):

MIN MIN [-2]

Команда SEG перевірка попадання числа, що міститься у вершині стека в заданий діапазон від a до b (включаючи межі) як результат залишає в стеку ознака: 1, якщо число потрапило в діапазон, і 0, якщо ні:

SEG [ознака] наприклад:

Крім команд, орієнтованих працювати з числовими даними, набір команд ДССП-процесора включає низку операцій, призначених перетворення 32-битных кодів. Ці операції трактують елемент стека як 32-компонентний вектор бітів, компоненти якого пронумеровані праворуч наліво таким чином, що лівий біт має номер 31, а самий правий номер 0. Убувала нумерація компонент повторює прийняту для багатьох мікропроцесорів нумерацію бітів машинного слова.

До команд, що виконуються над векторами бітів, насамперед відносяться побиті операції булевої алгебри:

    побитная інверсія вершини стека INV, що змінює значення кожного біта вершини, тобто замінює 0 на 1 а 1 на 0;

    побитная кон'юнкція вершини і підвершини стека &, що встановлює в i-му біті результату, i=31,30,...,0, значення 1, якщо i-е біти обох операндів дорівнюють 1, а в інших випадках вважає i-й біт рівним 0;

    побитная диз'юнкція вершини і підвершини стека &0, що встановлює в i-му біті результату, i=31,30,...,0, значення 0, якщо i-е біти обох операндів дорівнюють 0, а в інших випадках вважає i-й біт рівним 1;

    побитное додавання (нееквівалентність) "+" вершини і підвершини, що встановлює в i-му біті результату значення 0, якщо i-е біти обох операндів мають однакові значення, і що вважає i-й біт результату рівним 1, якщо значення i-х бітів операндів різні.

525 INV 722 & 136 &0 325 "+"

Побитную кон'юнкцію часто використовують із обнулення (очищення) розрядів слова. Для цього виконують кон'юнкцію вихідного слова з маскою, що містить нулі у тих розрядах, які потрібно очистити та одиниці – в інших розрядах. Наприклад, якщо потрібно обнулити біти з 3-го по 5-й у певному слові X, потрібно зробити його побиту кон'юнкцію з маскою 37777777707. Для X=235 отримаємо:

Побитная диз'юнкція може бути використана для занесення потрібної комбінації бітів попередньо очищену групу розрядів слова. Нехай, наприклад, потрібно занести двійкову комбінацію 010 в біти з 3-го до 5-го слова, що залишилося в стеку в результаті останнього прикладу. Це можна зробити так:

До операцій маніпулювання бітами відносяться команди логічного зсуву:

    зсув вліво SHL - кожен біт вершини стека, починаючи з 31-го набуває значення наступного за ним у порядку зменшення номерів, а останній, нульовий біт набуває значення 0;

    зсув вправо SHR - кожен біт вершини стека, починаючи з 0-го набуває значення наступного за ним у порядку зростання номерів, а 31-й біт набуває значення 0;

    зсув по вершині SHT - верхній елемент вилучається з стека і розглядається як ціле число N, що вказує скільки зрушень і в якому напрямку треба зробити у вершині стека: при N>0 проводиться зсув вліво, N<0 - вправо.

B8 125 SHR SHL-2 SHT

Операціями зсуву вліво можна користуватися для множення чисел на 2 ступеня N, де N - натуральне число, що визначає кількість зрушень. Наприклад, множення числа -5 на 8 можна виконати, зсунувши це число на 3 розряди вліво:

B10 -5 3 SHT [-40]

При цьому слід враховувати можливість переповнення.

Зрушення вправо можна використовувати як операцію поділу націло на 2 ступеня N тільки для позитивних чисел, так як старший (знаковий) біт при зрушеннях вправо обнулюється. Наприклад:

тоді як

Команди циклічного зсуву вершини стека на 1 біт вправо ROR і вліво ROL схожі на команди логічного зсуву, за винятком того, що крайній біт, що висувається, не зникає, а всувається на звільнене місце з протилежного кінця 32-бітного довгого слова. Наприклад (числа шістнадцяткові):

Для обробки двійкових кодів призначені команди ДССП-процесора SWB і SWW. Функція SWB полягає у перестановці байтів молодшої половини вершини стека, а функція SWW у перестановці половинок вершини стека. Проілюструємо роботу цих команд, використовуючи режим шістнадцяткового введення/виводу (у цьому режимі кожен байт зображується двома 16-річними цифрами):

B16 0ABCD SWB SWB

0ABCDEF12 SWW SWB

Важливу роль мові РАЯ грають команди маніпулювання стеком. Вони не змінюють значення даних, що у стеку, лише змінюють їх розташування, полегшуючи доступом до операндам, що у глибині стека.

Існує три команди видалення елементів стека: D, DD, DS (Drop - викинути). Команда D видаляє зі стеку один (верхній) елемент, DD - два елементи, наприклад:

D DD D DS видаляє зі стека всі елементи (очищає стек):

Команда копіювання вершини стека C (Copy - копіювати) здійснює заслання у стек копії поточного значення його вершини. Це рівносильно дублювання верхнього елемента стека: колишня вершина стає підвершиною, а її копія – новою вершиною. Приклад:

Покажемо застосування цієї команди з прикладу обчислення многочлена p(x)=3*x**2+4*x-5 за схемою Горнера: p(x)=(3*x+4)*x-5. Вважаємо, що значення x міститься у вершині стека.

[x] C 3 * 4 + * 5 -

Поряд із командою копіювання вершини стека в мові РАЯ є також команди C2, C3, C4, копіюючі елементи, що знаходяться на глибині 2, 3, 4. Їхню роботу можна пояснити такими прикладами:

C2 C4

Існує також команда CT копіювання елемента, що знаходиться на глибині, яка вказана у вершині стека. Виконуючи CT, процесор вилучає зі стека верхній елемент, використовує його значення як покажчик глибини залягання копіюваного елемента і посилає копію останнього в стек. Так, копіювання елемента, що знаходиться на глибині 5, задається парою команд 5 CT, виконуючи які процесор зашле в стек число 5, а потім виконає команду CT. Виконання CT з параметрами 1, 2, 3, 4 еквівалентно відповідно до команд C, C2, C3, C4.

Команди обміну E2, E3, E4 (Exchange - обміняти) роблять перестановку першого (верхнього) елемента стека відповідно з 2-м, 3-м, 4-м, тобто з глибиною 2, 3, 4 елементом. Наприклад:

E3 E2

Для обміну велику глибину служить команда ET, використовує, як і CT, значення вершини стека як покажчика глибини залягання елемента, який обмінюється з першим елементом. Наприклад:

5 ET

Команда ET з параметрами 2, 3, 4 еквівалентна команд Е2, Е3, Е4.

Для ілюстрації використання команд копіювання та обміну розглянемо навчальне завдання. У стеку задані три числа. Потрібно отримати у стеку: . Можна запропонувати таку програму, сенс якої зрозумілий із коментарів.

C3 C3 C3 +

E4+E4

Цей приклад добре показує, наскільки велика роль коментарів, що відображають стан стека операндів.

У програмах часто доводиться порівнювати між собою числові величини та виконувати різні процедури залежно від результатів порівняння. У мові РАЯ є команди порівняння<, =, >. Вони визначені над числами і як результат видають числові значення 0 і 1. Так, команда< потребляет из стека два элемента и засылает в стек число 1, если значение нижнего элемента оказалось меньше значения верхнего, а в противном случае засылает 0. Например, в результате выполнения последовательности 5 -20 < в стек будет заслан 0. Команда = засылает 1 в случае равенства потребленных ею элементов. Команда >засилає 1, коли нижній елемент більший за верхній. Для програмування нестрогих порівнянь (менше або одно, більше або одно) використовується команда NOT, яка замінює значення вершини стека, що не дорівнює нулю, нулем, а дорівнює нулю - одиницею. Наприклад, обчислення логічного виразу x>=5, де x - деяке число, що знаходиться у вершині стека, можна задати так:

[x] 5< NOT

Подальше розширення можливостей програмування умов забезпечується застосуванням, поряд із командами порівняння, логічних операцій кон'юнкції & (логічне І) та диз'юнкції &0 (логічне АБО). Нехай, наприклад, потрібно отримати в стеку 1, якщо число x, що знаходиться у вершині, належить напівсегменту C 5< NOT C2 10 <

& E2 2 = &0

Кошти управління програмою в залежності від результатів порівняння будуть розглянуті надалі.

Визначення процедур

Як основний прийом програмування ДССП надає користувачеві можливість визначати поіменовані послідовності операцій, які називаються процедурами. Нехай потрібно, наприклад, обчислити значення квадратного тричлена 3*x**2-4*x+9 для значень x, що задаються. У такому випадку слід визначити процедуру, що реалізує формулу тричлена і видачу термінал результату, а потім застосовувати цю процедуру до конкретних значень x. Шукана процедура, назвемо її PX, визначається так: PX [x] C 3 * 4 - * 9 + . D; Двокрапка означає операцію "визначити процедуру", причому ім'я процедури слідує за двокрапкою після роздільного пропуску. Визначальна послідовність команд (тіло процедури) розташовується за ім'ям процедури і закінчується точкою з комою. Коротше, процедура визначається у формі:

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

У мові РАЯ потрібно коментувати стан стека операндів на початку та наприкінці процедури. У тілі процедури коментарі розставляються на розсуд програміста у важких розуміння місцях.

Коментарі допомагають людині зрозуміти і використовувати процедуру, процесор просто ігнорує все, що укладено в дужки. Тому під час введення визначення окремої процедури з терміналу коментарі можна опустити.

Після того як визначення процедури введено та натисканням клавіші процесору повідомлено про кінець введення, на екрані терміналу з'являється зірочка, що сигналізує про виконання команди "визначити процедуру" та готовність процесора продовжити діалог. Тепер можна застосувати процедуру PX до значеннях x, що задаються з клавіатури, наприклад до 2, 3, 4 (видається процесором підкреслено):

* 2 PX 13

* 3 PX 24

* 4 PX 41

Визначимо більш загальну процедуру обчислення тричлена виду a2 * x ** 2 + a1 * x + a0, що дозволяє задавати значення як x, так і a0, a1, a2. Назвемо її PXA:

: PXA C E4 E3 * + * +;

При використанні PXA у стеку повинні знаходитися у потрібній послідовності значення a0, a1, a2, x. Наприклад: a0=1, a1=2, a2=-3, x=4

* 1 2 -3 4 PXA. D -39

У тілі процедури, поряд з базовими операціями процесора, можуть бути процедури, що визначаються користувачем. Наприклад, можна визначити процедуру P, яка додатково до обчислень, що виконуються PXA, видаватиме копію результату на термінал і видаляти результат зі стека.

: P PXA . D;

Зокрема, тіло процедури може включати ім'я найвизначальнішої процедури, тобто процедура може бути рекурсивною. Наприклад:

: TIME [t] 1-TIME;

Ця процедура зменшує на 1 значення вершини стека і знову звертається до себе ж, тобто працює як лічильник часу.

Лічильник TIME в принципі не може зупинитися: процедура віднімання одиниці виконуватиметься знову і знову, поки працює процесор. Але в ДССП є засоби, що дозволяють управляти ходом процесу в залежності від результатів, що отримуються - операції управління ходом програми.

Виконання за умовою та повторення

Програма, що є послідовність команд, виконуваних у порядку їх розташування один за одним у її записі, називається лінійною. Щоб зробити програму легко доступною для огляду (читабельною) і зрозумілою, її розбивають на володіють певним змістом пойменовані частини - процедури, що визначаються кожна своєю послідовністю процедур, які в свою чергу визначені послідовностями дрібніших процедур і т.д. до процедур, що визначаються безпосередньо послідовностями команд ДССП. Така програма, записувана як ієрархії визначень процедур, називається структурованої. p align="justify"> Метод побудови структурованої програми, що полягає в поступовому розкладанні розв'язуваної задачі на все більш дрібні підзадачі, називається структурованим програмуванням.

Створення методом структурованого програмування як лінійних, а й будь-яких програм можливе за наявності операцій виконання процедури за умовою, повторення процедури і з повторюваної процедури. Наявний у ДССП набір команд цього типу забезпечує можливість структурованого побудови довільної програми.

Умови виконання або невиконання процедури формулюються щодо знака числа, точніше щодо знака значення, яким володіє в даний момент вершина стека. Основна команда умовного виконання процедури - BRS (BRanch on Sign - розгалужуватися за знаком) наказує виконати одну з трьох названих за BRS процедур залежно від знака поточного значення вершини стека. Виконуючи BRS, процесор вилучає зі стека верхній елемент, тестує його значення, і якщо воно негативне, то виконує першу з названих процедур, якщо дорівнює нулю, то другу, а якщо позитивно, то третю. Так команда

викликає видалення з стека одного елемента і виконання процедури N, якщо віддалене значення негативне, виконання процедури P, якщо позитивно, і виконання процедури Z, якщо дорівнює нулю.

Прикладом використання команди BRS є таке визначення процедури SGN

: SGN [X] BRS -1 0 1;

Ця процедура замінює величину X числом -1, що міститься у вершині стека, якщо X<0, числом 0, если X=0, и числом 1, если X>0. Процедура SGN є ДССП як базової операції процесора.

Команда BRS, поряд з вибором однієї процедури із трьох даних, забезпечує можливість реалізації двозначних операторів виду IF-THEN та IF-THEN-ELSE . Наприклад, за пропозицією if x>0 then P1 else P0 відповідає команда BRS P0 P0 P1, а за пропозицією if x<>0 then P - команда BRS P NOP P, у якому NOP - ім'я порожньої операції. Але ДССП є більш ефективна реалізація двозначних умов - команди IF-, IF0, IF+, BR-, BR0, ВR+.

Команди групи IF відповідають оператору IF-THEN. Наприклад, команда IF-P наказує вилучити зі стека верхній елемент і тестувати його знак, причому якщо цей елемент має знак мінус, то виконати процедуру P. Команди IF0 P та IF+ P наказують виконати процедуру P відповідно у випадку, коли вилучений елемент дорівнює нулю, і у разі, коли його значення позитивне.

Як приклад, що ілюструє застосування команд групи IF, наведемо визначення команди базової мови ABS, що обчислює модуль вершини стека.

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

Команди BR-, BR0 і BR+ відповідають оператору IF-THEN-ELSE, наказуючи вибирати одну з двох званих за ними процедур. Якщо знак вилученого з стека елемента збігається з наявним у позначенні команди, то виконується процедура, названа першою, а якщо не збігається, виконується друга процедура. Наприклад, команда BR0 P0 P1 наказує виконати процедуру P0 у випадку, коли вилучений із стеку елемент дорівнює нулю, а якщо ця умова не задоволена, то виконати процедуру P1.

Розглянуті команди дозволяють економно запрограмувати виконання процедури в залежності від цих умов. Найчастіші умови виду x<0, x=0, x>0 безпосередньо реалізуються командами групи IF. Умови x<=0, x<>0, x>=0 програмуються з допомогою команд BR-, BR0, BR+ шляхом застосування першої процедури порожньої операції NOP. Наприклад, пропозиції if x<=0 then P соответствует команда BR+ NOP P. Примером использования команд группы BR может служить следующая реализация команды базового языка NOT, заменяющей нулевое значение вершины стека единицей, а ненулевое - нулем.

: NOT [x] BR0 10;

Розгалуження програми часто проводиться після команд порівняння (<, =, >), що виробляють логічне значення 1 або 0, залежно від результату порівняння двох чисел. Команду базової мови MAX, наприклад, можна запрограмувати так:

: MAX C2 C2< IF+ E2 D ;

До групи команд розгалуження входить також команда вибору BR, що записується як:

BR A1 P1 A2 P2... AK PK... AN PN ELSE P0

Реалізуючи цю команду, процесор спочатку виконує процедуру вказівник A1 і порівнює занесене нею в стек значення з значенням колишньої вершини стека, що знаходиться під ним. Якщо значення збіглися, то зі стека видаляються два верхні елементи і виконується зіставлена ​​покажчику A1 процедура P1, після чого проводиться перехід до команди, що йде за командою BR (тобто у наведеному вище запису наступного тексту програми за словом P0). Якщо ж порівнювані значення не співпали, то зі стека видаляється один верхній елемент (тобто результат A1) і ті ж дії виробляються з парою A2 P2, потім якщо збігу не вийшло, то з парою A3 P3 і т.д. AN PN включно. Якщо жодна з спроб не дала збігу, виконується названа після слова ELSE процедура P0. Зазвичай у ролі процедур-покажчиків виступають числові константи, наприклад:

[x] C BR 5 NEG -3 ABS 0 NOT ELSE T0 [y]

В результаті виконання даного рядка у вершині стека буде отримано значення y = -5 якщо x = 5; y=3, якщо x=-3; y=1, якщо x=0 і y=0 у всіх інших випадках.

Взагалі кажучи, процедура-покажчик може бути не лише числовою константою, а й змінною або будь-якою іншою процедурою, що задовольняє простому вимозі: вона нічого не вилучає з стеку і поміщає одне значення в стек.

Як ілюстрацію того, як використовуються операції умовного виконання процедур, здійснимо модифікацію наведеної в попередньому розділі процедури TIME з тим, щоб лічильник зупинявся за заданої умови:

: TIME [t] 1-C IF+ TIME;

Тепер ця процедура TIME викликає себе лише за позитивного значення вершини стека. Лічильник спрацює рівно N разів, якщо на початок першого виконання TIME вершина містить позитивне число N. Наприклад, щоб отримати 7 спрацьовувань, треба задати

7 TIME<ВК>

Оскільки IF+ у визначенні TIME, як і будь-яка умовна операція, вилучає з стека елемент, що тестується, а елемент цей необхідний для наступних операцій, то його доводиться дублювати, поміщаючи перед IF+ операцію C (Copy).

Рекурсія перестав бути основним засобом багаторазового виконання процедури. Для програмування циклів у мові РАЯ є команди RP (Repeat – повторювати) та DO (Do – робити, виконувати).

Команда RP W наказує виконувати процедуру W знову і знову необмежену кількість разів. Щоб повторення могли припинитися, тіло процедури W повинне містити операцію EX (Exit - вийти), що виконується за заданої умови. Операція EX здійснює перехід до виконання процедури, яка слідує за текстом програми за процедурою, що повторюється, що містить цю операцію EX. Так, лічильник, реалізований вище як рекурсивної процедури TIME, можна запрограмувати як повторення процедури W, яка визначена так:

: W [t] 1-C IF0 EX;

Щоб лічильник спрацював 25 разів, треба виконати рядок

Поряд з операцією EX, що використовується в командах виконання за умовою, є операції умовного виходу EX-, EX0, EX+, що виробляють той самий ефект, що і команди IF-EX, IF0 EX, IF+ EX, тобто споживають зі стеку верхній елемент, що тестують його знак і виконують вихід, якщо знак збігається із зазначеним у позначенні операції. Операції EX, EX-, EX0, EX+ можуть використовуватися необов'язково у тілі самої повторюваної процедури (у разі W), а й у процедурах, яких вона звертається.

Як приклад розглянемо задачу знаходження найбільшого загального дільника двох натуральних чисел методом Евкліда. Суть методу полягає в тому, що треба віднімати з більшої кількості менше до тих пір, поки числа не будуть рівні один одному. Після досягнення рівності буде знайдено найбільший спільний дільник.

Програмування будемо проводити шляхом низхідної розробки. Спочатку визначимо процедуру НОД, що фіксує загальну схему алгоритму. Параметрами цієї процедури служать два числа M і N, що знаходяться в стеку, для яких знаходиться найбільший спільний дільник. У тілі процедури НОД повинен бути заданий циклічний процес перетворення значень, що знаходяться в стеку. В результаті цього процесу в стеку повинні залишитися два рівні числа - будь-яке з них можна прийняти як найбільший спільний дільник. З огляду на ці міркування процедуру НОД можна визначити наступним чином.

: НОД RP КРОК [нід(M,N), нід(M,N)] D [нід(M,N)] ;

Тепер потрібно запрограмувати один крок ітераційного процесу, тобто. визначити процедуру КРОК. Параметрами для неї є два числа, що знаходяться в стеку. Потрібно порівняти ці числа і вийти з циклу, якщо вони рівні, інакше - відняти з більшого менше. Це можна зробити, наприклад, так:

: КРОК C2 C2-BRS NOP EX E2 C2-;

Тепер у програмі не залишилося невизначених процедур і можна розпочати її перевірку. Перевірку слід вести знизу-вгору, тобто спочатку потрібно переконатися в правильності роботи процедури КРОК і лише потім - НОД.

Операція базової мови DO викликає повторення названої слідом за нею процедури N разів, де N - число, що міститься у вершині стека на момент виконання DO. Наприклад, щоб процедура P виконалася 8 разів, треба поставити

8 DO P

Якщо в тілі процедури P є хоча б одна операція виходу і умова її виконання виявиться задоволеною до того, як відбудеться задане число повторень, то повторення будуть припинені шляхом виходу з процедури, як це робиться у випадку операції RP. Наприклад, при повторенні за допомогою DO описаної вище процедури W, визначенні якої міститься IF0 EX, запис [T] 30 DO W викличе 30 повторень W, якщо значення T>=30. Якщо ж 0

Якщо на момент виконання операції DO у вершині стека виявилося нульове чи негативне значення, то наступна за DO процедура не виконається жодного разу.

Для ілюстрації використання операції DO визначимо процедуру NUM, яка підраховує кількість не рівних нулю бітів у 32-бітному слові x, заданому у вершині стека.

Лічильник кількості одиниць розмістимо у вершині стека. Підрахунок одиниць полягатиме у 32-кратному повторенні процедури NUMI, у якій досліджуватимемо один біт слова x. По виході з циклу в підвершині стека має знаходитись потрібне число.

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

Для підрахунку ненульових бітів скористаємося тим, що одиниця у старшому (31-му) биті слова є ознакою негативного числа. Якщо досліджуване слово негативно, треба додати до N одиницю. Наприкінці процедури NUMI потрібно зрушити досліджуване слово однією розряд вліво.

: NUMI C IF-N+ SHL;

Реалізація процедури N+ дуже проста: необхідно додати одиницю до вершини стека, не змінюючи вершини.

: N + E2 1 + E2;

Повторювані процедури можуть містити у своїх тілах операції RP та DO, що призводять до виникнення вкладених циклів, причому глибина вкладеності допустима будь-яка. При цьому є операція EXT виходу із вкладеного циклу із зазначенням глибини вкладеності у вершині стека. Наприклад, вихід із двох вкладених циклів можна задати так:

Слід мати на увазі, що використання команди EXT вимагає підвищеної уважності, так як при модифікації програми може змінитись глибина вкладеності циклів і відповідну константу перед EXT необхідно буде змінити.

Названі дані

Стек операнда є основним, але не єдиним механізмом маніпулювання даними в ДССП. Існує також можливість, поряд з визначеннями процедур, оголошувати елементи та стандартно організовані сукупності елементів (так звані структури) даних, доступні для використання за їхніми іменами. Реалізуючи оголошення даних, процесор резервує пам'ять, що потрібна для їх зберігання, і забезпечує необхідні механізми доступу до цієї пам'яті.

Базова мова ДССП включає ряд розглянутих нижче слів-директив для оголошення змінних та масивів. У порядку розширення мови системи до нього можуть бути введені інші слова цього роду і, відповідно, інші елементи та структури даних.

Слово VAR оголошує 16-бітну числову змінну. Наприклад, запис

повідомляє змінну X, тобто повідомляє процесору, що ім'я X є ім'я змінної. Процесор пов'язує з цим ім'ям 16-бітову комірку пам'яті, в якій зберігатиметься значення цієї змінної. Команда привласнення змінної X значення, що міститься у вершині стека операндів, має вигляд

Виконуючи цю команду, процесор вилучає зі стека верхній елемент і записує його значення у відведену для змінної X комірку.

Команда, що складається тільки з імені змінної, перед яким немає літери!, Закликає в стек значення цієї змінної, причому засилання проводиться шляхом копіювання вмісту відповідного осередку пам'яті, тобто значення змінної залишається незмінним. Таким чином, будь-яке входження в програму імені змінної X, якщо йому безпосередньо не передує слово, що наказує інше дію, буде посилати в стек поточне значення цієї змінної, подібно до того, як засилаються безпосередньо задані числа (числові літерали).

Як приклад наведемо інший варіант розглянутої вище процедури НОД, у якій використовуються дві робочі змінні.

: НОД ! X! Y RP КРОК X [НОД] ;

: КРОК X Y = EX + X Y BR + X-Y Y-X;

: X-Y X Y -! X;

: Y-X Y X -! Y;

Як видно, програма стала дещо довшою, зате підвищилася її наочність.

Слово VCTR оголошує одновимірний масив (вектор) 16-бітових осередків, причому номер старшого елемента цього масиву визначається значенням вершини. Наприклад, в результаті запису

9 VCTR ROW процесор резервує 10 послідовно адресованих 16-бітних слів пам'яті, утворюючи вектор ROW(0:9). Спочатку проводиться засилання числа 9 стек, а потім виконується процедура VCTR, що використовує верхній елемент стека для визначення довжини створюваного вектора ROW.

Засилання у стек значення j-го елемента вектора ROW, 0<=j<=9, задается командой

[j] ROW

Використовуючи в якості параметра номер елемента, що знаходиться в стеку, ім'я вектора ROW викликає заміну цього номера значенням відповідного елемента. Якщо ж безпосередньо перед ім'ям вектора ROW знаходиться слово!, то елементу даного вектора, що вказується вершиною, присвоюється значення підвершини, і глибина стека зменшується на 2. Наприклад, обнулити 5-й елемент вектора ROW можна так:

Є також можливість поєднання векторів-констант, тобто. векторів 16-бітних чисел, значення яких визначені при його оголошенні та надалі не змінюються. Так, вектор 16-бітових констант VC довжини L+1 оголошується за допомогою слова CNST у вигляді:

CNST VC k0 k1...kL;

де k0, k1, ... kL - команди, що посилають у стек за одним значенням. Найчастіше це просто числові літерали, але можуть бути і імена змінних, процедур, а також команди, що складаються з пар слів, таких, наприклад, як команда заслання адреси змінної X, що розглядається нижче. Звернення до елементів вектора-константи проводиться так само, як до компонентів звичайних векторів.

Багатовимірний масив 16-бітних слів оголошується за допомогою слова ARR, перед яким вказуються максимальні значення індексу по кожному виміру та кількість вимірів. Наприклад, тривимірний масив TIR(0:8,0:2,0:24) оголошується так:

Число 3, що знаходиться безпосередньо перед ARR, означає розмірність оголошеного масиву.

Засилання елемента масиву в стек досягається завданням індексу цього елемента у супроводі імені масиву. Наприклад, команда заслання у стек елемента TIR(0,2,2) виражається у вигляді

Відповідно, надання цьому елементу поточного значення вершини стека задається командою

Усі розглянуті приклади ілюстрували створення структур із 16-бітних слів. Однак, мова дозволяє також визначати структури 32-бітних слів та 8-бітних байтів. І тому перед словом, визначальним структуру, ставиться предпрефикс LONG чи BYTE відповідно. Наприклад,

5 BYTE VCTR X - визначення 6-ти компонентного вектора байтів X;

BYTE CNST Y 65 66 67; - Визначення 3-х компонентного байтового вектора-константи Y;

10 20 2 LONG ARR MTRX – визначення матриці довгих слів MTRX (0:10,0:20).

Читання елементів словних і байтових структур проводиться так само, як у структур 16-бітних слів. При довжині елемента менше 32 біт видобувають значення в молодше слово або байт вершини стека, а старша частина вершини обнулюється. Як значення, що присвоюється елементу слівної або байтової структури, також береться молодше слово або байт 32-бітного довгого слова, що знаходиться в стеку.

Хоча формат 16-бітного слова використовується для визначення даних за замовчуванням, для нього також є позначення WORD. Доцільно використовувати цей предпрефикс коли передбачається перенесення програми інші машини, де також реалізована ДССП і умовчання може бути іншим.

Байтові структури даних найчастіше використовуються для зберігання та обробки текстової інформації. Це тим, що з кодування однієї літери у пам'яті комп'ютера відводиться один байт. Для завдання кодів літер у мові РАЯ є конструкція #l де l - будь-яка літера, що є на клавіатурі комп'ютера. ДССП-процесор сприймає цю конструкцію як команду заслання в стек коду літери l. Наприклад:

Дана конструкція виробляє ті ж дії, що і числовий літерал, рівний коду зазначеної літери, однак її використання є кращим, так як, по-перше, звільняє від необхідності запам'ятовувати коди і, по-друге, робить програми більш зрозумілими. Можна, зокрема, дати таке визначення вектора-константи Y:

BYTE CNST Y #A #B #C;

Часто зручно використовувати у програмі символічне позначення числової константи. Для забезпечення цієї можливості є визначальне слово VALUE:

Ця команда має з стека верхній елемент і формує слово з ім'ям, що йде безпосередньо за VALUE. Вживання цього слова рівносильне вживанню числової константи. Наприклад:

Робота з пам'яттю за фізичними адресами

Розглянуті засоби забезпечують можливість іменування даних та маніпулювання даними незалежно від адресної системи комп'ютера. Але в базову мову входять, крім того, засоби, що дозволяють маніпулювати адресами пам'яті. Адреса змінної або елемента масиву X посилається в стек командою

У випадку з елементом масиву цій команді вказує значення індексу (індексів).

Команда базової мови @ замінює адресу довгого слова пам'яті, що знаходиться у вершині стека, значенням, яке містить це слово. Наприклад, значення змінної Y можна помістити в стек, виконавши наступний рядок:

Команда @B замінює адресу значенням відповідного байта, вважаючи старші байти вершини стека рівними нулю, а команда @L замінює адресу 32-бітовим словом.

Є також команди запису значень на згадку. Команда!T записує за адресою, вилученою з вершини стека, 16-бітове значення підвершини. Команда!TB викликає аналогічну запис молодшого байта підвершини в байт, адресований вершиною, а!TL запис 32-бітного слова підвершини в слово, що адресується вершиною. Наприклад, надати значення 15 п'ятому елементу байтового вектора BV(0:5) можна наступними командами:

15 5 " BV !TB

Необхідність роботи з пам'яттю за фізичними адресами виникає зазвичай під час створення програм, які від архітектури конкретного комп'ютера, наприклад, під час створення драйверів вводу/ вывода.

Додаткові операції для роботи з даними та пам'яттю

З метою отримання більшої ефективності та компактності програм у мову РАЯ введено такі операції:

0 <имя переменной>- обнулити змінну;

1 <имя переменной>- присвоїти одиницю змінної;

1- <имя переменной>- зменшити значення змінної на одиницю;

1+ <имя переменной>- Збільшити значення змінної на одиницю;

!- <имя переменной>- відняти з змінної значення вершини стека;

!+ <имя переменной>- Додати до змінної значення вершини стека.

Кожна з цих операцій легко програмується за допомогою команд читання та запису змінних. Наприклад,

0 X еквівалентно 0! X

1+ X еквівалентно X 1+! X

X еквівалентно X E2-! X

Використання даних операцій підвищує ефективність та наочність програм.

Насправді часто потрібно присвоїти якесь одне значення всім елементам масиву. Для цього в мові РАЯ є операція!<имя массива>. Її дія полягає у привласненні значення вершини стека всім компонентам вказаного масиву. Операція! застосовується до масивів з елементами будь-якого формату.

Приклад використання:

код літери "пробіл" записується у всі компоненти байтового масиву BUF.

Часто буває необхідно отримати у програмі інформацію про структуру даних, що ховаються за ім'ям. Для цього є пара команд SIZE? - видати формат елемента даних: 1, 2 або 4 байти, та DIM? - видати кількість елементів даних у структурі. Наприклад, якщо оголошено дані

3 4 2 LONG ARR Z

то стосовно них ці команди дадуть наступний результат (числа десяткові):

SIZE? X SIZE? Y SIZE? Z

DIM? X DIM? Y DIM? Z

Набір команд ДССП-процесора включає, як доповнення, чотири команди, що дозволяють читати та записувати окремі біти осередків пам'яті комп'ютера. Це команди @BI, !BI, !BI0, !BI1. Параметрами для кожної з них служать адреси пам'яті, що знаходяться в стеку, і номер біта в цьому слові (нагадаємо, що біти нумеруються справа наліво, починаючи з нуля). Команда!BI, крім того, передбачає наявність у стеку та значення біта, яке потрібно записати. Команда @BI замінює зазначені параметри значенням обраного біта (0 або 1), команди!BI0 і!BI1 присвоюють обраному біту відповідно значення 0 і 1, видаляючи свої параметри зі стеку, а команда!BI присвоює обраному біту значення молодшого біта третього елемента стека видаляє з стека всі свої параметри. Наприклад, якщо значенням змінної X є двійкове число 101101, результати перерахованих операцій будуть наступними:

X [адр.X] 3 @BI - третій біт X, 0 X 3 !BI - X дорівнює 100101,

X [адр.X] 0 !BI0 - X дорівнює 100100,

X [адр.X] 1 !BI1 - X дорівнює 100110.

У мові РАЯ є засоби для роботи з рядками байтів, розташованими в пам'яті. Для завдання рядка байтів у стек поміщаються два параметри: початкова адреса рядка (тобто адреса першого байта) і довжина рядка (кількість байтів у ній).

Команда!!! MB служить для присвоєння всім байтам рядка одного (заданого в стеку) значення. Вона споживає зі стека три параметри: , де b - значення, що привласнюється, a і l - відповідно початкова адреса і довжина байтового рядка. Нехай, наприклад, потрібно обнулити елементи з 3-го до 10-го байтового масиву TXT(0:20). Для цього можна виконати наступний рядок:

0 3 " TXT 8 !!!MB

в результаті чого вісім послідовних елементів зазначеного масиву, починаючи з 3-го, отримають значення 0. Аналогічна команда!!! MW призначена для заповнення одним і тим самим значенням послідовності 16-бітних слів (у вершині стека вказується кількість слів), а команда! !!M – для заповнення послідовності довгих слів.

Команда!SB виконує пересилання байтових рядків. Її параметри: , де a1 і l - початкова адреса і довжина рядка, що пересилається, a2 - початкова адреса рядка, в яку виконується пересилання. В результаті виконання команди!SB у пам'яті з адреси a2 буде розташований байтовий рядок довжини l, що є точною копією рядка, що знаходилася за адресою a1 до виконання пересилання. Рядок-джерело і рядок-приймач можуть перекриватися. Нехай, наприклад, потрібно перемістити елементи байтового масиву M(0:10) таким чином: M(10):=M(9), M(9):=M(8), ..., M(1):= M(0). Для цього можна скористатися командою!

0 "M 10 C2 1+! SB

в результаті відбудеться переміщення рядка з 10 байт на один байт у бік збільшення адрес пам'яті.

Команда!SB зручна для роботи зі сторками літер (нагадаємо, що кожна літера кодується одним байтом). Вона дозволяє, наприклад, надавати байтовому масиву значення явно заданого літерного рядка. Для завдання такого рядка є текстовий літерал, тобто. укладена в лапки послідовність літер, наприклад "ТЕКСТОВИЙ ЛІТЕРАЛ". Ця конструкція, зустрівшись у програмі, викликає засилку в стек початкової адреси та довжини байтового рядка, що містить укладений у лапки текст. Дані параметри можуть використовуватися командою!SB. Наприклад, фрагмент "ТАБЛИЦЯ" 0 "TN!SB викликає пересилання літералу "ТАБЛИЦЯ" в масив TN.

Команда SRCHB забезпечує пошук заданого байта у рядку. Параметри: , де b - байт, перше входження якого треба знайти, a і n задають відповідно адресу початку та довжину рядка, в якій ведеться пошук. Якщо n>0, то пошук ведеться з адреси a до адреси a+n-1 (у бік зростання адрес), якщо n<0, то поиск ведется с адреса a до адреса a+n+1 (в сторону убывания адресов). В результате выполнения этой команды в стеке оказывается значение d, равное смещению относительно адреса a до первого вхождения байта b. Если такое вхождение не обнаружено, то d=n. Примеры:

#T "TEXT" SRCHB

#A "TEXT" SRCHB

#E "TEXT" [#E,a,4] 1- + -4 [#E,a+3,-4] SRCHB [-2]

Закінчуючи розгляд засобів роботи з даними, зупинимося на питанні, пов'язане із зберіганням даних у зовнішній пам'яті комп'ютера, тобто. на магнітних дисках. У мові РАЯ є команда SAVE<имя файла>, що наказує зберегти копію системи, що знаходиться в головній пам'яті, на диску разом з певними користувачем об'єктами. При цьому області пам'яті, що відведені під дані операціями VAR, VCTR, ARR на диск не виводяться. Тому при завантаженні збереженої системи з диска значення зазначених даних не визначені (вони повинні визначатися під час виконання програми). Найчастіше це виправдано, оскільки немає необхідності витрачати дискову пам'ять зберігання робочих змінних, буферів тощо. Однак, бувають дані, значення яких повинні бути визначені одразу після завантаження системи з диска. Як приклад можна навести змінну, що зберігає швидкість обміну даними з деяким зовнішнім пристроєм. При переході на іншу швидкість обміну достатньо змінити значення цієї змінної, не вносячи жодних виправлень у програму.

Вказівкою процесору, що значення елементів деякої структури даних повинні виводитися на диск за командою SAVE, служить препрефікс FIX, що міститься перед визначенням структури, наприклад

FIX VAR SPEED 20 FIX BYTE VCTR TABL

p align="justify"> Робота з так певними структурами даних нічим не відрізняється від роботи зі структурами, певними звичайним чином.

Команди управління процесором

У мові РАЯ є нечисленна група команд, призначених керувати ДССП-процесором, а точніше - емулятором ДССП-процесора.

Команда RESTART викликає перезапуск процесора. При цьому відбувається очищення стека, видається повідомлення

ДССП версія ХХ.ХХ.ХХ

Вільно ХХХХХW

і процесор переходить у режим очікування на введення команд. Ця команда буває корисною при налагодженні програм. Вона також виконується у разі виникнення помилкових ситуацій: виході індексу межі масиву, вичерпанні вільної пам'яті та інших.

Команда \G служить для продовження виконання програми після зупинки на невизначеному слові. Якщо під час процедури процесор зустрічає посилання на невизначене слово, він видає повідомлення:

зупинка не знаю<слово> .

де точка - запрошення ДССП-процесора, сигналізує у тому, що процесор перебуває у стані зупинки на невизначеному слові. У цьому режимі можна виконувати будь-які команди процесора, так само, як у звичайному режимі, коли запрошеним служить зірочка. Вийти з даного режиму можна двома способами - або за допомогою команди \G ​​(тоді процесор продовжить виконання перерваної процедури, пропустивши невизначене слово), або за командою RESTART.

Команда EXEC наказує процесору виконати процедуру, адресу якої знаходиться у вершині стека. Для отримання адреси процедури служить команда "" (два апострофи), за якою вказано ім'я процедури. Наприклад, у результаті виконання команди

у стек буде надіслано адресу процедури ABS. Дані команди дозволяють передавати процедуру як параметр іншій процедурі.

До групи команд управління процесором відноситься вже згадувана операція SAVE<имя файла>, що передбачає зберегти копію системи на диску, а також команди, що визначають джерело введення текстової інформації, що подається на вхід процесору. Спочатку таким джерелом є клавіатура дисплея.

Команда LOAD<имя файла>перемикає введення на дисковий файл із зазначеним ім'ям. Команда PF - наказує вводити команди з буфера редактора текстів. Команда TEXEC передає на вхід процесора текстовий рядок, параметри якого задані у стеку. Після виконання команд, що містяться у зазначених джерелах, введення автоматично перемикається на клавіатуру дисплея.

Команди управління словником

Вхідний потік команд, що сприймається процесором, може, зокрема, містити команди визначення процедур і даних, що викликають компіляцію у внутрішнє подання та запам'ятовування тіла процедури або виділення пам'яті під зазначені дані, а також занесення до словника ДССП імені скомпільованої процедури або структури даних.

Словник встановлює відповідність між зовнішніми (вжитими у тексті програми) іменами та адресами відповідних цих імен об'єктів у внутрішньому поданні. При обробці визначення процедури або опису названого даного процесор нарощує словник, утворюючи в ньому новий словниковий вхід, що містить ім'я (точніше, 7 перших літер імені) та адресу тіла тіла процедури або описувача даних.

При програмуванні зверху-вниз у тілах процедур можуть зустрічатися посилання ще не певні об'єкти. І тут у словнику утворюються словникові входи (заголовки), позначені ознакою невизначеності. Для видачі дисплея всіх невизначених імен служить команда UNDEF.

У результаті нарощування словника є можливість освіти подсловарей - названих сукупностей словникових входів. У підсловник зазвичай поєднуються процедури та структури даних, що відносяться до одного завдання. Щоб уникнути плутанини між іменами підсловників та інших об'єктів програми, ім'я підсловника має починатися з літери $. Доступ до підсловників для їх нарощування або використання можна відкривати і закривати спеціальними командами, до яких належать такі (під ім'ям $v мається на увазі будь-яке допустиме підсловника).

GROW $v - нарощувати підсловник $v, тобто, поки не буде наказано інше, вносити імена всіх процедур, що компілюються, і даних у підсловник $v;

USE $v - відкрити для використання (для пошуку в ньому імен) підсловник $v;

SHUT $v - закрити можливість використання підсловника $v;

ONLY $v - зробити доступним для використання лише підсловник $v;

CANCEL – скасувати останнє ONLY.

Є також команда?$, що на дисплеї друкує імена всіх підсловників їх стану - відкритий або закритий підсловник для пошуку. Нарощується завжди той підслівник, ім'я якого надруковане верхнім.

Базові процедури ДССП складають підсловник з ім'ям $PRIME, відкритий для використання та нарощування за замовчуванням, тобто, якщо не було команди, що наказує нарощування іншого підсловника.

Нехай, наприклад, операцією? $ було роздруковано такий стан підсловників.

$PRG відкритий

$PRIME відкритий

$EDIT закрито

$PRIME відкритий

SYSTEM закритий

Це означає, що в даний момент підсловник $PRG відкритий для нарощування та використання, $PRIME - тільки для використання, а $EDIT та SYSTEM недоступні. Зазначимо, що підсловник може складатися із кількох секцій з однаковими іменами.

Є команди видалення зі словника тієї чи іншої сукупності словникових входів і, можливо, що з ними внутрішніх об'єктів. Так, команда FORGET $v видаляє всі імена, занесені до словника (не тільки до підсловника $v) після останнього виконання команди GROW $v разом із зазначеними цими іменами об'єктами, і скасовує встановлене ним нарощування підсловника $v. Команда PROGRAM $v робить ті ж дії, що й послідовно виконані команди FORGET $v GROW $v. Наявність такої команди на початку будь-якої програми призводить до того, що при повторній компіляції програми видалятиметься її стара копія і утворюватиметься підсловник для зберігання об'єктів нової копії програми. Наприклад, виконавши операцію FORGET $PRIME над словником, стан якого було показано вище, отримаємо новий стан:

$EDIT закрито

$PRIME відкритий

SYSTEM закритий

У процесі виконання команди FORGET на дисплей видаються імена секцій, що видаляються.

Зверніть увагу, що ім'я підсловника SYSTEM не починається літерою $. Це припустимо, але призводить до того, що застосування до даного підсловника команд FORGET і RPOGRAM не викликає жодних дій (підсловник SYSTEM для них не існує).

Зважаючи на те, що в готовій програмі для переважної більшості процедур звернення по зовнішньому імені не потрібне, передбачена можливість видалення зі словника їхніх імен із збереженням зіставлених ним внутрішніх об'єктів. Команда CLEAR $v видаляє з усіх секцій підсловника $v всі імена, за винятком тих, перед якими в тексті програми (при їх визначенні) стояв предпрефікс: (два двокрапки). Наприклад, у результаті виконання процесором наступного фрагмента програми:

:: : X+ Y !+ X;

CLEAR $EXAM у підсловнику $EXAM залишаться лише імена X та X+, словниковий вхід Y буде видалений (хоча змінна, що відповідає слову Y у внутрішньому поданні, залишиться).

Команди введення/виводу

Основним засобом взаємодії користувача з ДССП є термінал, яким зазвичай служить електронно-променевий дисплей з клавіатурою. З терміналу здійснюється початкове введення, редагування та налагодження програм, підготовка даних та все управління системою. Програми та дані, а також ДССП зберігаються у вигляді файлів на дисках і можуть роздруковуватися на принтері. Для управління введенням/висновком у наборі базових процедур ДССП є такі засоби, що описуються далі.

Програмування роботи терміналу забезпечується командами введення та виведення чисел, окремих літер та послідовностей літер (рядків), а також деякими додатковими командами.

Команда TIB (Terminal Input Byte – введення байта з терміналу) ініціює цикл очікування натискання клавіші на клавіатурі терміналу. При натисканні клавіші 8-бітний код відповідної літери посилається в стек у вигляді молодшого байта вершини, причому старші 3 байта містять нулі. Копія введеної таким чином літери відображається на дисплеї. Є також команда TRB (Terminal Read Byte), що відрізняється від TIB тим, що засилання коду введеної літери в стек не супроводжується відображенням цієї літери на дисплей.

Команда TIN (Terminal Input Number - введення числа з терміналу) ініціює цикл введення в стек і відображення на дисплеї числа, що набирається з клавіатури. Число, що вводиться, має бути послідовністю цифр, яка може починатися знаком "мінус", а закінчуватися . Залежно від встановленого режиму введення/виводу цифри сприймаються процесором як 16-річні, десяткові, вісімкові чи двійкові. Якщо 16-річне число починається цифрою, що позначається буквою, перед нею додається цифра 0. Введене число перетворюється на двійковий додатковий код, який посилається в стек як цілого значення 32-бітного довгого слова, тобто. з відсіканням бітів, розташованих ліворуч, що має вагу 2 ступеня 31 старшого біта.

Кожна команда TIN вводить одне число. При необхідності введення послідовності чисел в одному рядку їх треба розділяти натисканням клавіші , причому на введення кожного числа у програмі знову має виконуватись команда TIN.

Послідовність, що містить n літер, що набираються з клавіатури, вводиться в пам'ять комп'ютера у вигляді n байтів, що розташовуються за послідовно зростаючими адресами, починаючи з адреси a, за допомогою команди TIS (Terminal Input String), перед якою в стек посилається адреса a і число літер n . Нехай, наприклад, оголошено вектор байтів X достатньої довжини. Потрібно ввести 9 літер, надавши їх значення елементам цього вектора, починаючи з нульового елемента:

Аналогічно за допомогою команди TOS задається виведення послідовності з n байтів-літер з початковою адресою a:

Виведення на термінал елементів тексту, що безпосередньо включаються до програми, забезпечується конструкцією.

."<текст>"

Наприклад, щоб при виконанні деякого фрагмента програми на дисплеї з'явився текст Введіть номер варіанта, фрагмент повинен містити запис. "Введіть номер варіанта".

Команда TON (Terminal Output Number) виводить на дисплей число, що вилучається з підвершини стека, причому довжина поля виведення повинна бути задана у вершині. Число, що виводиться, вирівнюється по правому краю поля, вільні позиції зліва заповнюються пробілами, а якщо довжина числа перевищує задану довжину поля, то відбувається відсікання зліва. У режимі десяткового введення/виводу негативні числа починаються знаком мінус.

Команда TOB (terminal output byte) друкує літеру, код якої заданий молодшим байтом вершини стека. Глибина стек зменшується на 1.

Є також команди, які прямо управляють курсором дисплея:

CR - перехід на початок нового рядка,

SP - пробіл, тобто переміщення однією позицію вправо.

Команда BELL викликає короткий звуковий сигнал (дзвінок).

Іноді при обміні з терміналом буває необхідно перевірити, чи вже натиснута клавіша і чи відпрацював вже дисплей попередню команду виведення. Це можна зробити командами TTI (Terminal Test Input) і TTO (Terminal Test Output), що залишають у стеку ознаку 1, якщо зазначена подія відбулася, і 0 інакше.

Команди виведення на принтер подібні до команд виведення на термінал і базуються на аналогічній мнемоніці, в якій літери LP (Line Printer) або замінили TO, або додані як провідні. Наприклад, LPCR – перехід на початок нового рядка, LPSP – пробіл, LPN – виведення числа з підвершини в полі, заданому вершиною, LPB – виведення літери, LPS – виведення рядка літер. Є також команда [N] LPT, що переміщає голівку друку в позицію N друкуваного рядка і команда LPFF, що забезпечує прогін аркуша паперу. Для друку явно заанного тексту зручно скористатися текстовим літералом та командою LPS, наприклад:

"ТАБЛИЦЯ ЗНАЧЕНЬ ФУНКЦІЇ" LPS

Обробка переривань та виняткових ситуацій

При програмуванні периферії виникає потреба обробляти переривання. У ДССП ця обробка програмується в такий спосіб. Програма, призначена для обробки переривання є звичайною процедурою ДССП, перед визначенням якої стоїть передпрефікс INT, наприклад INT: A !1+ I ; Передпрефікс INT забезпечує збереження стану процесора при перериванні та відновлення його після закінчення обробки переривання.

Для зв'язування програми обробки з конкретним перериванням використовується команда LINK:

<адрес вектора>LINK<имя процедуры>при виконанні якої за відповідним вектором записується звернення до процедури обробки переривання. Команда LINK може здійснювати статичне зв'язування процедури з перериванням, що відбувається в момент компіляції програми, так і динамічне, при виконанні програми.

Переривання процесора - це спосіб, яким системі повідомляється про подію, що сталася у зовнішньому світі. Події, що потребують негайної обробки, можуть відбуватися і в програмі. Їх називають винятковими ситуаціями. Приклади таких ситуацій: розподіл на нуль, помилка обміну з пристроєм, закінчення файлу введення тощо.

У ДССП виняткові ситуації фіксуються з допомогою командних переривань. Командне переривання є поіменованою операцією виклику процедури реагування і оголошується наступним чином:

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

Наприклад:

TRAP S1. "Ситуація S1."

У першому випадку кінцевою реакцією на переривання S служить процедура X, у другому у разі переривання S1 на термінал буде видано повідомлення: Ситуація S1.

Програма, при виконанні якої можливе виникнення переривання, може встановити свою реакцію за допомогою команди перехоплення. У ДССП передбачено два типи перехоплень: ON та EON. Команди перехоплення можна використовувати лише всередині процедур і мають формат:

ON<имя прерывания> <реакция>

EON<имя прерывания> <реакция>Наприклад:

: A ... ON S ."Преривання S" ... ;

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

ON та EON встановлюють різні типи реакцій. Якщо нова реакція задана командою ON, то у разі переривання виконується процедура-реакція, після чого перервана програма продовжує роботу. Якщо реакція задана командою EON, спочатку стек операндов приймає глибину, що він мав на момент виконання EON, потім виконується реакція, а після закінчення відразу припиняється виконання процедури, у якій була вжита команда EON.

Розглянемо приклади. Процедура M вводить з клавіатури терміналу літери і перевіряє, чи це цифра. Якщо введена літера не є цифрою, порушується переривання ND. TRAP ND ." Не цифра." : M RP M1; : M1 TRB [B] C #0< C2 #9 >&0 IF+ ND [B] TOB;

Кінцева реакція на переривання ND – повідомлення: Не цифра.

Якщо M викликається з процедури P1, в якій встановлено свою реакцію на переривання ND: P1 ON ND PR1 M ; : PR1 [B] CR ."Помилка." D #0 [#0]; то при введенні нецифрової літери переривання ND буде оброблено програмою реакції PR1 типу ON, що викличе видачу з нового рядка повідомлення: Помилка. Введена літера буде замінена літерою 0 після чого M продовжить роботу.

Якщо M викликається із процедури P2: P2 EON ND PR2 M ; : PR2 CR ."Помилка. Кінець введення." ; то при введенні нецифрової літери переривання ND буде оброблено програмою реакції PR2 типу EON, що викличе видачу з нового рядка повідомлення: Помилка. Кінець введення., після чого P2 завершить роботу. Стек операндів буде порожній.

При необхідності у програмі-реакції можна знову порушити переривання, поширивши його таким чином на програми вищого рівня. В цьому випадку обробляти переривання буде або програма, вказана в команді перехоплення в охоплюючій процедурі, або кінцева реакція. Наприклад, якщо модифікувати PR2 наступним чином: : PR2 CR ."Помилка. Кінець введення." ND; то повідомлення, видане термінал, буде таким: Помилка. Кінець введення. Чи не цифра.

У ДССП є кілька вбудованих командних переривань, реакцію на які можна передбачати в програмах користувача.

Поділитися