Якою мовою говорив Адам і чому в раю прохолодно? Обробка переривань та виняткових ситуацій. НОД – найбільший спільний дільник натуральних чисел M,N

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

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

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

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

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

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

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

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

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

: P P1 P2 ... PN;

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

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

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

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

Наприклад, лінійна послідовність 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 замінює значення вершини стека його модулем; нулю. Наприклад:

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 в принципі не може зупинитися: процедура віднімання одиниці виконуватиметься знову і знову, поки працює процесор. Однак у ДССП є кошти, дозволяють управляти ходом процесу залежно від одержуваних результатів - операції управління ходом програми.

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

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

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

Умови виконання або невиконання процедури формулюються щодо знака числа, точніше, щодо знака значення, яким має в даний момент вершина стека. Основна команда умовного виконання процедури - 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 1 0;

Розгалуження програми часто проводиться після команд порівняння (<, =, >), що виробляють логічне значення 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; то повідомлення, видане термінал, буде таким: Помилка. Кінець введення. Чи не цифра.

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

Ассаляму алейкум рохматуллахи ва баракатуху!
«Арабська мова - мова мешканців Раю!» (зразковий зміст)
Шановні брати прошу роз'яснити питання щодо цього хадиса, чи він достовірний? Взагалі, чи є ці слова словами пророка Мухаммада, алейхи соляту ва салям?
баракАЛЛАХУ фікум уа джазакумуЛлаху хайран!

Алейкум салям рахматуЛлахи баракатух!

Ат-Табарані в "аль-Аусат" зі слів Абу Хурайри передає:
«Посланець Аллаха, нехай благословить його Аллах і вітає, сказав: «Я араб, К'уран арабською, і мова обителів Раю буде арабською».

Шейх аль-Албані привів його до «Сільсіля ад-да'іфа» під номером 161, сказавши:

«Цей хадис є вигаданим (мауду'). Насправді ж, не існує жодного достовірного хадиса, який роз'яснює те, якою мовою розмовлятимуть мешканці Раю, тому необхідно зберігати мовчання і не занурюватися в розмови про це питання, надавши знання про нього Всевишньому Аллаху, і займатися лише тим, що призведе до вчиненню тих діянь, які принесуть користь у світі іншому!
Шейхуль-Іслама Ібн Таймійю, та помилує його Аллах, запитали: «Якою мовою розмовлятимуть люди в день Воскресіння? Чи буде Всевишній Аллах звертатися до людей арабською мовою? І чи достовірно твердження про те, що мова мешканців Ада перська, а мешканців Раю – арабська?
На що він відповів: «Хвала Аллаху Господу світів! Невідомо якою мовою будуть розмовляти люди того дня, як і то якою мовою до них звертатиметься їх Господь, великий Він і славний. Ні Всевишній Аллах, ні його посланець, мир йому та благословення, нічого не розповіли нам про це, також не є достовірним і те, що мовою мешканців Ада буде перська, а мовою райських жителів – арабська. І нам невідомо щоб із цього приводу серед сподвижників, хай буде задоволений ними Аллах, була якась суперечність. Навпаки вони утрималися від цього, оскільки розмова про це марна. Однак серед наступних поколінь щодо цього питання виникла суперечність. Одні сказали, що вони спілкуватимуться арабською, інші сказали, що це не стосується жителів Ада, оскільки вони відповідатимуть перською і це їхня мова в Аду. Треті — що люди спілкуватимуться ассірійською, бо це мова Адама, від якої і походять всі інші мови. Четверті — що це не стосується мешканців Раю, оскільки вони спілкуватимуться арабською. Однак ніхто з них не має доказу на користь своїх слів, ні з боку розуму, ні з шаріатських джерел, проте це лише заяви вільні від будь-яких доказів. Всевишньому Аллаху ж відомо краще!» «Маджму'уль-фатава» 4/299.

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

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

Муслім.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Нам, тюркським націоналістам часто люблять говорити, що націоналізм заборонений в ісламі. Ми не згодні з цим і переконані, що заборонено крайній націоналізм (нацизм) і саме це слово означає "особій". Ми наводили різні докази, зокрема слова Джамалуддіна Афгані.

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

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

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

[Шейх ібн Таймійя, "Іктідау сиратиль м'яким", стор 131-132]

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

«Ми визнаємо за арабами їхнє право на першість і перевагу. І виявляємо щодо них любов, адже сказано в хадисі: "Ознака віри (іман) - любов до арабів, а ознака лицемірства (ніфак) - ненависть до них". Тому ми не сповідуємо поглядів групи аш-шуубійя та ганебних вільновідпущеників, які не люблять арабів і не визнають переваги їх (над неарабами). Адже, справді, слова цих людей є нововведенням, яке суперечить Шаріату»

Про любов і ненависть до арабів:

[Хадіс наводить ад-Даракутні від ібн Умара]

Пророк Мухаммед (сава) нібито сказав:

«Любіть арабів, тому що я - араб, Священний Куран арабською і мова мешканців Раю арабська»

[Передає ат-Табарані від Абу Хурайри]

Алі ібн Абу Талібу арабофіли приписують такий вислів:

«Хто не знає про право моєї родини, право ансарів і право арабів не знає про нього з трьох причин: або через те, що він "мунафік", або через сумнів, або через нечистоту»

[Хадіс наводить ад-Даракутні від Алі ібн Абі Таліба]

«Полюбіть арабів та перебування їх (на землі)! Адже, воістину, існування (перебування на землі) їх є світло в Ісламі, і зникнення їх є темрява в Ісламі»

[Наводить Абу аш-Шайх також від Абу Хурайри]

"Кохання до арабів - іман (або від імана), і ненависть до них є лицемірство"

[Наводить пекло-Даракутні від ібн Умара у такій формі]

Насамкінець:

«Прояв любові до племені Курейшитов від іману (віри), а прояв ненависті до них є зневірою (куфр). Той, хто любить арабів, воістину любить мене, а той, хто не любить арабів, той не любить мене».

[Хадіс наводить Анас]

Як Вам таке?

«О араби, одружуйтеся на своїх і рівних собі, будьте уважні до чистоти крові своїх майбутніх дітей і ніколи не одружуйтеся з неграми. Тому що негри зіпсовані, деформовані твори та діти, які будуть від них, теж будуть неповноцінними та деформованими»

[Муттакі, 8/24-28]

А тепер про тюрки:

«Чотири міста світу є містами Ада: Стамбул, Антакья, Табарія та Сана»

[Суюті, Лаяліль Маснуа 1/458]

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

[Суюті, Лаяліль Маснуа 1/440]

Чимало " алімів " пов'язує народи Яджудж і Маджудж (Гог і Магог) з тюрками. Описуючи ці народи, говориться, що деякі з них навіть питиму кров і вживатимуть людське м'ясо. Настільки дикими вони будуть. Табарі, Багдаді, Балхі, Байзаві, Насаш, Нусайрі, Ібн Касір та інші стверджували, що народи Йаджуджа і Маджуджа – це і є тюрки, а деякі неосвічені аліми Тюркського світу, як то Асим Ефенді чи Ахтарі Мустафа Ефенді, самі буду , активно підтримували та проповідували ці хадиси.

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

Арабофіли кажуть, що мова Раю – це арабська. Персофіли, що мова Ада - тюркська.

То хто ж із нацист, "ахи"?



Останні матеріали розділу:

Почалася велика вітчизняна війна Хід вів 1941 1945
Почалася велика вітчизняна війна Хід вів 1941 1945

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

Скільки літер в українській мові
Скільки літер в українській мові

Українська мова — знайомий незнайомець, все необхідне про мову — у нашій статті: Діалекти української мови Українська мова — алфавіт,...

Як контролювати свої Емоції та керувати ними?
Як контролювати свої Емоції та керувати ними?

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