Програмування на системному рівні в Visual Prolog
У текстовому режимі DOS змінна Resetvideo повідомляє про необхідність повернення відеоапаратури у стан, в якому вона знаходилася перед обробкою предиката system/з. Значення Resetvideo = 1 повертає її у початкове положення, Resetvideo = 0 — не повертає. Якщо Resetvideo = 0, то виконання програми підтримуватиметься в екранному режимі, заданому вами. (Інформацію про встановлення режиму екрану див… Читати ще >
Програмування на системному рівні в Visual Prolog (реферат, курсова, диплом, контрольна)
ПРОГРАМУВАННЯ НА СИСТЕМНОМУ РІВНІ в Visual Prolog
предикат операційна побітовий пам’ять
Visual Prolog має декілька предикатів для безпосереднього доступу до операційної системи. Спочатку розглянемо предикати, які дозволяють звертатися до операційної системи, а потім — предикати побітової обробки чисел. Після цього розглянемо групу предикатів підтримки низькорівневого режиму роботи з пам’яттю.
Користуючись предикатами, можна включати можливість доступу до ОС безпосередньо з прикладної програми на Visual Prolog. Звернення до ОС можна виконувати викликом предиката system, звернення до утиліт формування дати і часу — предикатів date і time, за допомогою предиката em/symbol можливе отримання змінних середовища ОС, а за допомогою comline — читання аргументів командного рядка, з якими була викликана програма. Більш того, ви можете одержати стартовий каталог і ім'я програми викликом syspath, а предикати marktiine, timeout і sleep надають можливість встановлювати і очікувати настання встановленого моменту часу. Також існують предикати sound і beep, і, нарешті, osversion, що повертає версію ОС, diskspace, повертає об'єм вільного місця на диску, і три версії storage, які дозволяють визначати об'єм пам’яті, що використовується.
Нижче наведено декілька практичних прикладів використовування предикатів.
Предикат system/1
Програма на Visual Prolog отримує доступ до ОС через предикат system, що має вигляд:
system («command») % (i)
Якщо аргумент є порожнім рядком, то новий командний інтерпретатор буде запущений в інтерактивному режимі — з’являється можливість звернення до ОС, наприклад, з клавіатури.
Наведемо два приклади:
1. Для копіювання файла B: ORIGINAL. FIL у файл А: NEWCOPY. FIL з системи Visual Prolog викличте:
system (««)
Після цього скопіюйте файл, використовуючи звичайну команду ОС:
copy B: ORIGINAL. FIL А: NEWCOPY. FIL
Повернення до системи Visual Prolog виконується набором команди
exit
після якої знову відбувається повернення до програми.
2. Для перейменування файла (без роботи безпосередньо в ОС) слід подати команду на зразок:
system («ren newcopy. fil newcopy.txt»)
Предикат system/3
Ця розширена версія предиката system має дві додаткові можливості: за допомогою її можна дізнатися про рівень помилки ОС, а також перевизначити режим виведення на екран системи під час роботи з нею. Остання можливість при роботі з Windows ефекту не дає.
Вид предиката system/3:
system (CommandString, Resetvideo, ErrorLevel) % (i, i, o)
Тут змінна ErrorLevel зв’язується із значенням рівня помилки ОС. Це програмний код повернення, відомий ОС, коли програмі повертається управління, тобто в момент завершення виклику system.
У текстовому режимі DOS змінна Resetvideo повідомляє про необхідність повернення відеоапаратури у стан, в якому вона знаходилася перед обробкою предиката system/з. Значення Resetvideo = 1 повертає її у початкове положення, Resetvideo = 0 — не повертає. Якщо Resetvideo = 0, то виконання програми підтримуватиметься в екранному режимі, заданому вами. (Інформацію про встановлення режиму екрану див. у довідковому керівництві з відеоапаратури).
Предикат envsymbol/2
Предикат envsymbol виконує пошук змінних середовища у таблиці ОС. Ці змінні можуть бути встановлені командою операційної системи SET та іншими засобами ОС. Предикат envsymbol має вигляд:
envsymbol (EnvSymb, Value) % (i, o)
Наприклад, команда
SET SYSDIR=C:FOOL
привласнює змінній sysdir рядок З: FOOL, а мета
%…*/
envsymbolC’SYSDIR", SysDir)
%…*/
виконує пошук змінного середовища sysdir у таблиці змінних середовища і зв’язує SysDir із З: FOOL.
Предикат envsymbol завершується неуспішно, якщо задана змінна середовища не визначена.
Предикати time/4 і date/¾
Visual Prolog має два стандартні, часто використовувані предикати: date і time. Кожен з них може бути використаний двома способами, залежно від того, вільні або зв’язані змінні при виклику предиката.
Якщо всі змінні зв’язані, то предикат time перевизначає системний годинник на нове значення часу. Якщо змінні вільні, то система пов’язує їх із значеннями, одержаними від системного годинника.
time (Hours, Minutes, Seconds, Hundredths)
% (i, i, i, i) (о, про, 0,0)
Предикат date/з також пов’язаний з системним годинником, обробляється аналогічно time і має вигляд:
date (Year, Month, Day) % (i, i, i) (0,0,0)
Предикат date/4 має тільки версію, у якої всі аргументи вихідні. Четвертий аргумент — номер дня тижня, але схема нумерації, що використовується, залежить від ОС. Зазвичай, 0 — ця неділя, 1 — понеділок і т.д.
date (Year, Month, Day, WeekDay) % (0,0,0,0)
Як приклад розглянемо програму, яка використовує time для повідомлення часу, що затрачує на перегортання каталога, заданого за замовчуванням.
goal
time (HI, Ml, SI,_), nl
write («Start time is: „, H1,“ :», M1," :", SI), nl
% This is асtivity that is being timed
system («dir /s/b з:\*.*»)
time (H2,M2,S2,_)
Time = S2-S1 + 60*(M2-M1 + 60*(H2-H1))
write («Elapsed time: „, Time,“ seconds»), nl
time (H3,M3,S3,_)
write («time now is: „, H3,“ :», M3," :", S3).
Предикат comline/1
Предикат comline прочитує параметри командного рядка, що використовувався під час виклику програми. Формат предиката:
comline (CoiranandLine) % (про) Тут CommandLine — рядок.
Предикат syspath/2
Предикат syspath повертає стартовий каталог і ім'я викликаючої програми. Він має вигляд:
syspath (HomeDir, ExeName) % (0,0)
Предикат syspath використовується для надання програмам можливості завантаження файлів з їх домашнього каталога.
Visual Prolog надає два різні сервіси часу: припинення виконання і перевірку використаного часу.
Предикат sleep/1
Предикат sleep припиняє виконання програми на заданий час. Він має вигляд:
sleep (CentiSecs) % (i)
Тут CentiSecs — цей час, вимірюваний у сотих частках секунди, на яке програма буде припинена. Точний час, протягом якого програма чекатиме, залежить від активності процесора і ОС. Не слід очікувати точності більшої, ніж 20=50 мілісекунд.
Предикат marktiте/2
Предикат marktime повертає відмітку часу, яка далі може бути перевірена на закінчення, використовуючи предикат timeout. Предикат marktime має вигляд:
marktime (CentiSecs, Ticket) % (i, o)
Тут CentiSecs — необхідний час, протягом якого Ticket має продовжуватися. Зазначимо, що Ticket — не просто час. Ця структура береже деяку спеціальну інформацію в недокументованому форматі. Ticket призначена тільки для подальшого використовування предикатами timeout і difftime.
Предикат timeout/1
Предикат timeout перевіряє на закінчення відмітку часу, повернену marktime. Якщо час закінчився, timeout успішний, інакше — неуспішний. Предикат timeout має вигляд:
timeout (Ticket) % (i)
Як і з предикатом sleep, слід очікувати великої точності.
Предикат difftime
Visual Prolog має стандартний предикат difftime:
difftime (real, real, real) % (i, i, o)
повертає різницю між першим і другим тимчасовими маркерами у форматі дійсного числа. Перший часовий маркер має бути молодшим, ніж другий, тобто можливе таке використовування:
marktime (О, Ml)
lengthy_jprocess
marktime (О, М2)
difftime (M2,Ml, Diff).
Як приклад розглянемо програму ch15e04.pro (лістинг 13.2), що демонструє роботу marktime І timeout.
predicates
ttimeout (real)
clauses
ttimeout™:-timeout™!.
ttimeout™:;
write («No timeout, sleep 0.5 secs»), nl
sleep (50)
ttimeout™.
goal
marktime (400,TM) % 4 sees
ttimeout™
write («XnBlNGO!n»).
Предикат sound/2
Предикат sound генерує звук апаратного спікера:
sound (Duration, Frequency) % (i, i)
Тут Duration — цей час, виражений у сотих частках секунди.
Предикат beep/0
Предикат beep еквівалентний sound (50, ЮОО) і має вигляд:
beep % (no arguments)
Предикат osversion/1
Предикат osversion повертає версію поточної ОС і має вигляд:
osversion (VerString) % (про) Формат verstring залежить від ОС.
Предикат diskspace/2
Предикат diskspace повертає в беззнаковому довгому цілому доступний простір на диску і має формат:
diskspace (Where, Space) % (i, o)
Space виражений у байтах.
В DOS-орієнтованих версіях Visual Prolog Where — це символ, що позначає ім'я диска.
Предикати storage/З і storage/11
Стандартний предикат storage повертає інформацію про три області пам’яті, що використовуються системою для виконуваних програм (стік, купа (heap) і слід (trail) відповідно) у вигляді беззнакових довгих цілих:
storage (StackSize, HeapSize, TrailSize) % (0,0,0)
Всі значення аргументів вимірюються у байтах.
У всіх версіях Visual Prolog Traiisize містить кількість пам’яті, що використовується для області сліду.
Stacksize вказує, скільки залишилося вільного стекового простору. HeapSize визначає, скільки пам’яті доступно процесу.
Storage/11 є розширеною версією предиката storage/3, storage/11 повертає більш докладну інформацію про області пам’яті, що використовуються додатками, для виконуваних програм. Опис цього предиката ви можете знайти в інтерактивній системі допомоги Visual Prolog.
Предикат storage/0
Версія storage без аргументів призначена для налагодження. Цей предикат друкує у спеціальному вікні, скільки пам’яті використовують різні частини системи управління пам’яттю Visual Prolog і число точок повернення.
Visual Prolog включає шість предикатів для бітових операцій: bitand, bitnot, bitor, bitxor, bitleft і bitright. Ці предикати мають по одному варіанту потоку параметрів, працюють з цілими числами і повинні використовуватися у префіксній нотації.
Предикат bitnot/2
Предикат bitnot виконує функції побітового логічного «НЕ» :
bitnot (X, Z) % (i, o)
Якщо х пов’язана з цілою величиною, z буде пов’язана з результатом побітового логічного заперечення х, як показано в табл. 1.
Таблиця 1 — Предикат bitnot
Оператор | X | z | |
Bitnot | |||
Предикат bitand/3
Цей предикат виконує побітно логічну операцію «І». Він має вигляд:
bitand (X, У, Z) % (i, i, o)
Якщо х і у пов’язані з цілими числами, z буде пов’язана з результатом побітового вживання логічної операції «І» до відповідних біт двійкового подання х і у (табл. 2).
Таблиця 2 — Предикат bitand
Оператор | X | У | z | |
Bitand | ||||
Предикат bitor/3
Предикат bitor виконує побітове логічне «АБО»
bitor (X, У, Z) % (i, i, o)
Якщо х і у пов’язані з цілими числами, z буде пов’язана з результатом побітового вживання логічної операції «АБО» до відповідних біт двійкового подання х і У (табл. 3).
Таблиця 3 — Предикат bitor
Оператор | X | У | z | |
bitor | ||||
Предикат bitxor/3
Предикат bitxor виконує те, що побітове логічне «виключає АБО» :
bitxor (X, У, Z) % (i, i, o)
Якщо х і У пов’язані з цілими числами, то z буде пов’язана з результатом побітового вживання логічної операції що «виключає АБО» до відповідних біт двійкового подання х і У (табл. 4).
Таблиця 4 — Предикат bitxor
Оператор | X | У | z | |
bitxor | ||||
Предикат bitleft/3
Предикат bitleft виконує побітовий зсув вліво:
bitleft (X, N, У) % (i, i, o)
У буде пов’язана з результатом, одержаним при зсуві х вліво на n розрядів (бітий в двійковому уявленні х). Розряди, що залишилися справа, заповнюються нулями.
Предикат bitright/3
Предикат bitright виконує зсув вправо:
bitright (X, N, У) % (i, i, o)
Якщо х і n пов’язані з цілими величинами, то у зв’язується із зсунутим вправо на n розрядів двійковим поданням числа х. Розряди, що залишилися зліва, заповнюються нулями.
Visual Prolog має чотири вбудовані предикати для прямого (низькорівневого) доступу до пам’яті. Це предикати ptr_dword, memDword, memWord і memBite.
Предикат ptr_dword
Предикат ptr_dword повідомляє абсолютну адресу stringvar або створює рядок stringVar на основі одержаної адреси.
ptr_dword (StringVar, Seg,) % (о, i, i) (i, o, o)
Якщо stringVar зв’язана, то предикат ptr_dword повертає номер сегмента (Seg) і зсув () рядка stringVar. Якщо зв’язані Seg і Off, предикат ptr_dword пов’язує stringVar з рядком, який міститься в цьому місці. На 32-бітових платформах сегмент ігнорується. Предикат ptr_dword значною мірою був витиснений функцією cast.
Рядком у Visual Prolog є послідовність символів ASCII, що закінчується порожнім символом. Ви можете використовувати процедури низького рівня для обробки нестандартних рядків (тих, що містять декілька нульових байт). Проте не можна здійснювати виведення нестандартних рядків або включати їх у базу даних.
Предикати memByte, memWord і memDword
Visual Prolog містить три предикати для отримання і зміни певних елементів пам’яті: memByte, memWord і memDword. Вони використовуються для доступу до byte, word і dword відповідно. Всі предикати мають два формати:
memByte (Segment, Offset, Byte)% (i, i, i) (i, i, o)
memWord (Segment, Offset, Word)% (i, i, i) (i, i, o)
memDword (Segment, Offset, DWord)% (i, i, i) (i, i, o)
і
memByte (StringVar, Byte) % (i, i) (i, o)
memWord (StringVar, Word) % (i, i) (i, o)
memDword (StringVar, DWord) % (i, i) (i, o)
Segment має ТИП ushort, Offset — ТИП unsigned, а Byte, Word І Dword — ТИП byte, word і dword відповідно. В реальному режимі DOS місцерозташування в пам’яті обчислюється за формулою ((Segment * 16) + Offset).
Предикати mem* значною мірою були витиснені предикатами get*entry і set*entry для бінарних доменів.
Visual Prolog включає декілька предикатів, розглянутих у цьому розділі, які здійснюють доступ до ОС, виконують побітові логічні операції і операції зсуву, забезпечують підтримку низького рівня для маніпулювання пам’яттю:
Предикати, що здійснюють доступ до ОС:
* system — можливість виконання зовнішньої програми;
* time — установка або читання свідчень вбудованого годинника;
* date — доступ до вбудованого календаря;
* envsimbol — доступ до таблиці змінних середовища ОС;
* comline — читання аргументів командного рядка;
* syspath — повернення стартового каталога та імені виконуваного файла;
* osversion — повернення номера версії ОС;
* diskspace — повернення об'єму доступного простору на диску. Об Предикати, що виконують побітові операції:
* bitor — логічне «АБО» ;
* bitand — логічне «І» ;
* bitand — логічне «НЕ» ;
* bitxor — що логічне «виключає АБО» ;
* bitleft — зсув вліво;
* bitright — зсув вправо.
Предикати, які забезпечують підтримку прямого доступу до пам’яті:
* ptr_dword — повертає адресу аргументу або поміщає аргумент в задане місце пам’яті;
* membyte — вибирає або поміщає однобайтну величину;
* memword — вибирає або поміщає двобайтову величину;
* memword — вибирає або поміщає чотирибайтову величину.