Інформаційні системи і структури даних

Матеріал з USIC Wiki

Перейти до: навігація, пошук
Для ФІН

Ця стаття відноситься до групи довідкових статей для студентів ФІН.

Зміст

Питання до розділу 4

Абстрактні типи даних. Їхня відмінність від LI-типів даних

Абстрактні типи даних. Їхня відмінність від LI-типів даних Тип даних входить у мови програмування як структурний елемент і корисний засіб для реалізації контролю використаних у програмах структур даних. Тому типи даних доцільно аналізувати через мови програмування, з'ясовуючи поняття, спільні та узагальнені для більшості мов. Типізовані і нетипізовані мови У процедурних мовах для присвоєння певній змінний обчисленого значення служить оператор присвоєння. Змінна – це «шухляда», у який можна розоміщати значення даних, клас яких явно описано у програмі типом змінної. Тут мають місце два випадки, (1) коли кожне значення, що присвоєно змінної, належить визначеному типу і (2) відсутність такої умови, коли впродовж виконання програми змінній можна присвоїти значення якогось типу. Мови програмування, у яких виконано зазначену умову випадку 1, називають типізованими, а в іншому випадку говорять про бестипові мови. Основні типи дани класифікують на прості; структуровані; посилання: 1.Основні типи даних: 1.1. Прості типи даних 1.1.1.Логічний 1.1.2.Літерний (абетково-цифровий) 1.1.3.Цілий 1.1.4.Дійсний 1.1.5.Переліковний

1.2.Структуровані типи даних 1.2.1. Функція із скінченною областю визначення (масив) 1.2.2. Декартовий (прямий) добуток 1.2.3. Об’єднання 1.2.4. Множина 1.2.5. Послідовність 1.2.6. Рекурсивний тип

1.3.Тип даних посилання

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

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

Абстрактні типи даних На описаних вище правилах ґрунтується категоризація даних, що склалася наприкінці 80-х років минулого сторіччя і отримала назву абстрактні типи даних через асоціацію з нею важливих математичних понять, пов'язаних зі структуризацією пам'яті для обробки даних. Цю категоризацію використовують вже 20 років більшість мов програмування, вона довела свою прийнятність і фактично вичерпала потенціал розвитку. На зміну їй прийшла нова категоризація даних у виглядді незалежних від мов типів даних (див. розділ 4).

1.Прості типи даних Простий тип даних без внутрішньої структури служить для встановлення базисних компонентів структурованих типів даних. Для процедурних мов традиційні наведені на рис.45 прості типи даних. Крім переліковного та інтервального типів даних, решта – це убудовані типи даних. Усі мови програмування допускають перелік-перерахування, а для заданих переліком типів характерним є визначення своїх даних у вигляді списку символьних імен. До цих типів відносять логічний, літерний, переліковний, інтервальний і цілий, у яких скінченне і відносно невелике число всіх елементів, що утворюють тип. Навіть діапазон подання типу Цілий досить великий, але перелічити всі цілочислові значення реально можливо, тому простір цілих чисел зазвичай використовують як індекси масиву чи для подання скінченної множини, щодо яких дані виражають за допомогою інтервального типу даних. ---Логічний тип (boolean)--- складається з логічних значень true і false і застосовується для виразу, наприклад, значень логічних умов. За операції над логічним типом використовують кон’юнкцію, диз'юнкцію і заперечення. ---Літерний тип (сhаrасtеr)---, призначений для утворення текстів, складається з літер: цифр, букв абетки і спеціальних знаків. Набір літер визначено мовою. Існують стандарти на літерні набори, наприклад, АSСІІ (American Standard Code for Information Interchange), JIS, IS0. Дві стандартні функції оrd та сhr застосовують для перетворення текстів, тобто для відображення набору літер на підмножину натуральних чисел і навпаки. Функція ord(с) визначає номер літери з упорядкованого набору, а chr(i) навпаки – літеру з порядковим номером i. Це корисно, скажімо, для перетворення літерних величин у відрізок цілих чисел і навпаки. ---Цілий і дійсний типи--- призначено для подання числових значень. Цілий тип формують з множини цілочислових значень за правилами конкретної мови чи мовного процесора. Максимальне і мінімальне допустимі значення залежать від комп'ютера з довжиною слова L біт, оскільки діапазон допустимих значень визначено співвідношенням –2L-1 ? n ? 2L-1–1. Через обмеженість розрядної сітки сучасних комп'ютерів, дані дійсного типу не відповідають своїй математичній інтерпретації і подають тип, що складається зя скінченної кількості значень, які задано переважно числами рухомою з крапкою. Зазвичай операції над даними дійсного типу в строго математичному змісті не еквівалентні операціям над дійсними числами через помилки округлення результатів операцій. ---Переліковний тип--- має лише властивість перерахування належних йому значень. Для даних такого типу, крім функцій pred і suсс, що визначають згідно із заданим порядком перерахування попередні і наступні елементи, визначено порядкові функції оrd і сhr, результат застосування яких залежить від типу параметра. Переліковний тип – це найпростіший тип даних і зручний для створення програм. Це обумовлено тим, що використані як значення переліковного типу імена легко запам'ятати, а їхнє застосування як ідентифікаторів і міток прояснює текст програми. Так, за допомогою переліковного типу даних share можна задати множину, елементи якої відповідають поняттям трикутника, чотирикутника, кола, еліпса, а для кількості кутів кожної такої фігури використати масив аngle: var x: share;

angle: array [share] of integer

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

2Структуровані типи даних Наведені далі основні структуровані типи даних (див. схему вище) не лише цікаві з позицій обробки даних, але також є важливими математичними поняттями. ---Тип даних Посилання--- призначено для вказівки на інші дані; цей ---покажчик--- – засіб організації й обробки складних змінюваних структур даних. Сполучення в мовах програмування структурованих типів даних і посилання дає змогу формувати складні структури даних. ---Функція із скінченною областю визначення--- – це відображення скінченної множини даних на множину даних іншого типу. У процедурних мовах цей тип частіше називають масивом. Скінченну множина, що є областю визначення функції (масиву), називають індексною множиною (типом), а її елементи – індексами. Значення функції для величини k індексу називають елементом масиву, що відповідає k. Множина індексів K масиву має бути скінченною, при цьому забезпечувати можливість перелічення його елементів. Тому потрібно, щоб тип індексу був простим типом з можливістю перелічення, наприклад, інтервальним, переліковним, логічним чи літерним типом. Масив А при K={k1, k2, ..., kn} проілюстровано рис.46, де А[k] є значенням А для k ? K. Масив подає певну кількість розташованих у визначеному порядку елементів одного типу. Індекс дає змогу вказквати на елементи масиву. Типовими операціями над даними типу масив є: 1) задання початкових значень елементів масиву; 2) вибір елементів масиву за вказаним значенням індексів;. 3) вибіркове поновлення масиву. Зазвичай у процедурних мовах змінні і значення, що їм присвоєно, мають однаковий тип. Під час виконання програми значення змінних змінюються. Вибіркове поновлення масиву можна реалізувати за допомогою операції присвоєння значень елементам масиву A[k] := b. Проте необхідно враховувати, що збережене значення заміняє на (А, k, b) операція присвоєння. Навіть у мовах програмування функціонального і логічного типу, де відсутні поняття присвоєння значень змінним, вибіркове поновлення масивів – це основна операція для даних переліковнoго типу. Тут немає операцій присвоєння значень елементам масивів, а є лише операція над усім масивом. Одновимірні масиви-вектори містять тільки одну індексну множину. У багатовимірного масиву індексна множина є прямим (декартовим) добутком множин K1, K2, ..., Kn і задана у вигляді tуре T = аrrау [K1, K2, ..., Kn] of T0 . У мовах програмування прийнято, що багатовимірні масиви складено з одновимірних, тобто компонентами масиву є масиви. Згідно з цією концепціэю розглянутий тип даних Т можна описати у такий спосіб: tуре T = аrrау [K1] оf arrау [K2] of... оf аrrау [Kn] оf Т0 . Ці два способи опису різні. У першому випадку значення елементів масиву А[k1, k2, ..., kn] визначено тільки для набору значень індексів k1 ? K1, k2 ? K2, ..., kn ? Kn і значення А[k1], що відповідає лише значенню індексу k1, не має сенсу. У другому випадку і А[k1], і A[k2, ..., kn] мають сенс, якщо це розглядати як скорочений спосіб опису А[k1], [k2], ..., [kn] ). ---Прямий (декартовий) добуток---. Компоненти масиву складають структуровані дані одного типу з однаковими властивостями. На противагу масивам компоненти прямого (декартового) добутку можуть мати різні типи. Прямий (декартовий) добуток, як і масив, є одним з основних структурованих типів даних і його називають також записом (rеcord). Кожне значення запису проілюстровано на рис.47, де іденти¬фі¬катори s1, … , sn використано для вказування кожного компонента di. рис.47: s1-d1,s2-d2,...-...,sn-dn. Для записів, як і для масивів, встановлено основні операції: 1) задавання значень запису; 2) вибірка компонентів; 3) вибіркове поновлення компонентів запису. Відмінність між масивом і прямим добутком полягає в тому, що масив формується з компонентів одного типу, а компоненти запису можуть бути різного типу. Дана відмінність відбиває також спосіб вибірки складових. Індекс масиву можна обчислити за формулою, причому значення індексу не визначено до моменту його обчислення, тому елемент масиву визначається перед його вибіркою. Перед виконанням програми допустимий контроль типів, для чого оператор вибірки має містити правильне ім'я компонента запису.

---Об'єднання--- подає множину, окремі елементи якої класифікують за категоріями, наприклад, види тварин: ссавці, птахи, риби й ін. Тварини, що належать відповідному виду, мають його характерні властивості, тому для відображення відомостей про тварин конкретного виду підходить набір атрибутів. Можна об'єднати набори атрибутів, властивих кожному виду, і подати відомості про тварин кожного виду, використовуючи узагальнений набір атрибутів. Однак у такому поданні буде багато невизначених значень даних і важко виразити семантику об'єкта. Для подання відомостей про окремі категорії узагальненого об'єкта доцільно використати набір атрибутів, що відповідає даній категорії. Наприклад, щоб забезпечити підрахунок розселення усіх тварин на земній кулі за минулі 10 років, бажано подати відомості про розселення тварин кожного виду, об'єднаних в узагальнений об'єкт «тварини = ссавці + риби + птахи + …». ---Розміченим об'єднанням--- називають об'єднання в одне ціле із збереженням індивідуальності кожної категорії. Наприклад, розмічене об'єднання двох множин S1 xor S2 визначають як об'єднання елементів цих множин, що дає змогу розпізнати приналежність елементів множини-суми до відповідної множини-доданку S1 xor S2 = { (s, 1)| s є S1} U { (s, 2)| s є S2} У мові Паскаль розмічене об'єднання подають як запис з варіантами. Основними операціями над даними типу об'єднання є: 1) опис об’єднання; 2) перетворення об’єднання до значень складових. ---Множина--- як тип даних задає множину усіх підмножин базисного типу. Використання цього типу даних здебільшого спрощує розуміння текстів програм. Наприклад, якщо в мові Фортран імена змінних починаються із символів і, j, k, l, m, n, то ці змінні мають цілий тип, інакше неявно зазначено дійсний тип. Перевірку цих умов виконує парсер Фортрану-компілятора, використовуючи множину ItoN ={ I, J, K, L, M, N}, складену з вказаних літер. Множину, складену з перелічення елементів базисного типу Т0, визначимо: tуре T = set of Т0 Для ефективної реалізації базисний тип не повинен мати велику основу системи числення і повинен бути простим типом. Операції над множинами: -встановлення значень елементів множини; -операції об’єднання, перетину і різниці. ---Послідовності--- різного виду розрізняють залежно від типу елементів, виду дозволених операцій і способів використання у програмах. Типові приклади – послідовності літер, послідовний файл чи стік. Часто їх розглядають як самостійні типи, але особливого розходження не існує. Відмінність послідовності від структурованих типів даних полягає в тому, що кількість елементів (довжина) послідовності скінченна, але не фіксована. Це допускає існування послідовності довільної довжини. Послідовність – це окремий випадок рекурсивного типу, але, з огляду на його важливість, його варто розглядати окремо. Тип T, що подає послідовність елементів типу Т0, визначається як: tуре T = sequence of T0 Послідовність Т задає множину скінченних послідовностей довіль¬ної довжини, складених з елементів типу Т0 , т.е. D_T=Y(n=0,infinity)D_T0*n , де T0 - n-й сорт DТ. Відмінність між типами Послідовність і Масив полягає в тому, що масив є відображенням із скінченною заздалегідь фіксованою кількістю компонентів. Основними операціями над даними типу Послідовність є: 1) формування послідовності; 2) вибірка елементів послідовності; 3) вилучення-додавання елементів послідовності. Зазвичай розглядають три важливі різновиди послідовності. Послідовний файл – це послідовність, над якою визначено п'ять операцій: а) формування пустої послідовності T( ); б) first (х); в) tail (х); г) арреndr (х,е); д) еmpty (х). Послідовний файл – послідовність елементів, у якій допускається вибірка (доступ) початкового елемента послідовності і додавання елемента в кінець послідовності. Такі послідовності реалізують в зовнішній пам'яті середовища, наприклад, на магнітній стрічці чи СD-Romі, причому їхнє записування можливе тільки в одному напрямку. У процедурних мовах програмування операція вибіркового поновлення є типовою операцією обробки. Стік - це послідовність, для якої визначено наступні оператори: а) утворення пустої послідовності Т( ); б) first (х) називають tор; в) tail (х) називають рор; г) арреndl (х, е) називають рush; д) еmpty (х). Для стека додавання і витягування елементів можливо тільки з одного кінця послідовності. Стекова пам'ять із схемою обслуговування «останній увійшов – перший вийшов» (last in first out, LIFO) зручна для послідовної обробки елементів. У процедурних мовах стек реалізовано за допомогою стекової змінної, а операції потрібні для маніпулювання значеннями такої змінної. Черга – це послідовність, для якої визначено наступні операції: а) утворення пустої послідовності Т(); б) last (х); в)initial (х); г) арреndl (х,е). Додають елемент до черги з її лівого кінця за допомогою оператора арреndl, а витягують елемент з черги з правого кінця за допомогою операторів last і initial. Тому черга є пам'яттю типу «першим увійшов-першим вийшов» (first in first оut, FIFO). Черги застосовують, коли дані обробляють в порядку їхнього надходження чи утворення. ---Рекурсивний тип.--- Розглянуті основні структуровані типи даних можна використовувати не тільки самостійно. Використовуючи суперпозицію типів даних, можна одержати складні структури даних. зазвичай рекурсивний тип визначено у такий спосіб: tуре T1 = tau1( T1, T2, ... , Tn); T2 = tau2( T1, T2, ... , Tn); ... Tn = tau_n( T1, T2, ... , Tn); Такий опис може визначати будь-який тип даних. Загалом за допомогою такого опису можна визначити складну деревоподібну структуру, але щоб це визначення мало сенс, необхідно, щоб для ?i був визначений оператор конструювання типу прямої суми, а також забезпечено кінець деревоподібної структури. Обробка даних рекурсивного типу зазвичай доцільна, коли вона відповідає схемі визначеного рекурсивного типу та здійснюється за допомогою рекурсивних функцій і процедур. Така точка зору аналогічна тій, коли масиву відповідає оператор циклу, а типу прямої суми – оператор вибірки.

LI-типи. Див 4.3.

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

Прагматичний, аксіоматичний та алгебраїчний методи абстрагування категорій даних. Метод абстрагування даних залежить від способу визначення типу даних (D, F). Для типу даних необхідно визначити: 1. множини значень даних D={Dt | t є Т}; 2. функції, що відповідають операціям f є F, тобто вказати для f область визначення і область значень, а також для кожного d є D задати значення f(d). Выделяют шесть критериев, которым удовлетворяют способы абстрагирования данных: 1) формальність; 2) конструктивність; 3) зрозумілість; 4) мінімальність; 5) широка область застосування; 6) розширюваність. Формальність припускає, що спосіб абстрагування з позицій математики має бути коректним, тобто без семантичних і синтаксичних неоднозначностей опису, а також проблем, пов'язаних з автоматичною обробкою і перевіркою. Мінімальність припускає можливість визначення тільки даних, що становлять інтерес, без додавання якоїсь зайвої інформації. Разом з цим передбачається відсутність так званої надлишкової специфікації. Методи абстрагування даних класифікують як прагматичний, аксіоматичний, алгебраїчний і застосовні для специфікації абстракцій даних і формального опису змісту. Прагматичний метод абстрагування припускає опис семантики даних і операцій через явне визначення множини даних Dt та операцій f згідно з математичними поняттями, семантику яких вважають заданою. Для цього використовують відомі або гіпотетичні мови програмування, а також математичні поняття функції і множини, абстрактних механізмів виду автоматів. Передбачається, що мова програмування L неявно використовує абстрактний тип даних, якщо в мові L описано d є Dt та f є F і механізм, що виключає виконання неправильних щодо d операцій. Введення у визначення типу даних вказівки типу параметра називають параметризацією типу. Параметризовані типи – це один з аспектів загального поняття поліморфізму. Поліморфні операцій, у яких хоча б один параметр допускає значення не одного, а кількох типів, у сучасних мовах програмування допускає одноманітно описати обробку, що не залежить від типу даних. За прагматичним методом абстрагування типи даних виражають через реалізовані в мовах типи даних. Тому з позицій мов програмування це зручно, але з позицій визначення самих типів даних недоліки пов'язано з обмеженням тільки спеціальними реалізованими способами і наявністю в них характерних несуттєвих деталей. Наприклад, тип даних «стек» можна виразити за допомогою масиву чи списку. Так реалізовані способи абстрагування не мають мінімальності. Аксіоматичний метод абстрагування. Для визначення абстрактного типу даних (D, F) використовують логіку предикатів, універсальність якої забезпечує потужність абстрагування і мінімальність опису. Тип даних описують аналогічно опису алгебраїчних систем, наприклад груп чи кілець, використовуючи формальну логіку. Основний принцип цього методу полягає в тому, що визначення абстракції даних здійснюють шляхом опису властивостей, які притаманні абстракції даних, у вигляді набору аксіом, що задають область визначення й область значень кожної операції f, а також зв'язки функціями, що належать F. Як потужна формальна система логіка предикатів задовольняє критеріям широти області застосовності, формальності і мінімальності. Недоліки аксіоматичного підходу пов'язані з критеріями зрозумілості і конструктивності, які можна перебороти у багатосортній логіці. Алгебраїчний метод абстрагування. Математичне формулювання абстракції даних ґрунтується на формальній системі – багатосортній алгебрі. Вона застосовується для вивчення алгебраїчних систем, що складаються з множин-сортів, з функцій над множинами, з відношень між функціями, що задаються у формі аксіом-рівностей. Опис типів даних у термінах багатосортної алгебри (з установленням відповідності сортам множин значень даних) зводиться до встановлення: 1) імені t типу даних; 2) інших типів даних, необхідних для визначення t; 3) функцій f1, ... , fm, визначених на множинах значень даних t, t1, ... , tn ; 4) областей визначення і областей значень функцій f1, ... , fm ; 5) відношень між функціями f1, ... , fm у формі аксіом-рівностей. Такий опис за змістом практично аналогічний аксіоматичному опису стека, але має наступні формальні відмінності. 1) За алгебраїчним методом абстрагування опис виконують за допомогою понять, обмежених функціями і рівностями. На противагу цьому за аксіоматичним методом опис виконують за допомогою предикатів і логічних зв'язок і виражають у вигляді правильно побудованих висловлювань. Відносно синтаксису алгебраїчний метод завдання абстрактних типів даних більш однорідний і простий. 2) Аксіоматичний метод явно містить аксіому індукції, а в алгебраїчному абстрагуванні вона відсутня, оскільки у алгебраїчному абстрагуванні тип функції описують у синтаксичній частині специфікації, відкіля легко вивести аксіому індукції. У алгебраїчному абстрагуванні даних множина значень типу, що підлягає визначенню, і операції визначають неявно як об'єкти, що задовольняють групі аксіом-рівностей. У результаті такого неявного визначення виходить опис, якому притаманна мінімальність, для якого визначені тільки суттєві особливості типу даних. Один зі способів полягає у розгляді групи аксіом-рівностей для визначення еквівалентності двох висловлювань, що стосуються типу даних. По суті це аналогічно тому, що рівність Q1 = Q2 за правилом заміни можна розглядати як Q1 => Q2 та Q2 => Q1 , а доказ еквівалентності двох висловлювань, що стосуються типу даних, зводиться до доказу виводимості одного висловлювання з іншого. Інший спосіб полягає в тому, що алгебраїчний опис абстрактного типу безпосередньо задає множину значен

Поняття LI-типу даних за ДСТУ 3901-99 (ISO/IEC 11404:1996).

Поняття LI-типу даних за ДСТУ 3901-99 (ISO/IEC 11404:1996). У стандарті ДСТУ 3901-99 (ISO/IEC 11404:1996) “Незалежні від мов типи даних” встановлено номенклатуру та семантику для набору типів даних, який найчастіше використовують в мовах програмування та інтерфейсах програмних систем і звуть LI-типи даних (LI – абревіатура від Language Independed). У визначенні типу даних “незалежний від мов” підкреслює, що це класи типів даних, реальних представників яких використовують у мовах програмування та інших об’єктах як конкретні приклади. Багато специфікацій службових програм, бібліотек чи застосувань вже стандартизовано. Їхні інтерфейси часто описано визначенням виду посилання, тобто “процедурного виклику” кожної окремої функції або сервісного засобу з бібліотеки, як це робиться у програмі користувача, написаній стандартною мовою програмування (Фортран, Кобол, Сі/С++). Таку специфікація інтерфейсу зазвичай позначають як “<мова> звернення до <сервісний засіб>”, наприклад, “Фортран-звернення до PHIGS” (ISO/IEC 9593-1:1990). Тому слідом за стандартизацією нової сервісної бібліотеки треба стандартизувати інтерфейс звернення для кожної програмування чи сервісного пакету. Щоб уникнути цього, розроблено стандарти для незалежних від мов процедур виклику та для LI-типів даних, які можна використати для опису параметрів таких процедур. Мета міжнародного стандарту ISO/IEC 11404:1996 і згармонізованого з ним ДСТУ 3901-99 – полегшити узагальнення та обмін поняттями (нотаціями), які описують типи даних на концептуальному рівні для різних мов програмування і пов’язаних з мовами об’єктів. Кожний LI-тип даних має певний базовий набір власти¬востей, достатній для його виділення серед інших типів даних і полегшення ідентифікації від¬по¬від¬ного (або приблизно відповідного) типу даних з інших стандартів і мов. Отже, ДСТУ 3901-99 забезпечує одну загальну модель звернення для усіх стандартів, що застосовують концепцію типу даних. Очікується, що кожен стандарт мови програмування буде визначати перетворення типів даних, які підтримує ця мова програмування, у LI-типи даних та семантичну ідентифікацію типів даних цієї . Водночас ДСТУ 3901-99 разом з іншими застосуваннями варто використовувати для визначення “незалежних від мови звернення” параметрів виклику процедур, утворюючи основні елементи стандартного інтерфейсу до кожного зі стандартних сервісних засобів. Створення таких звернень сервісних засобів і мовних перетворень у поєднанні з механізмом LI-виклику процедур приводить до того, що немає потреби у документах виду “<мова> звернення до <сервісний засіб>”. Кожний інтерфейс сервісного засобу через визначення його параметрів і використання LI-типів даних ефективно визначає звернення через ці параметри до певної стандартної мови програмування; а кожна мова шляхом перетворення LI-типів даних у типи даних мови ефективно визначає звернення через параметри до якогось стандартного сервісного засобу. На зовнішньому рівні розрізняють три наступні поняття типу даних: -концептуальне чи абстрактне поняття характеризує тип даних за його номінальним значенням або властивостями; -структурне поняття характеризує тип даних як концепцію, утворюючи основні елементи стандартного інтерфейсу до кожного із стандартних сервісних засобів. Створення такого звернення до якогось сервісного засобу задають його певні компоненти із специфічними функціями; -реалізаційне поняття визначено за правилами подання типу даних у середовищі.

Різні програмні продукти, системи, їхні окремі складові та інші об’єкти обробки інфор¬мації можуть або прямо відповідати ДСТУ 3901-99 шляхом використання визначених у ньому типів да¬них, або непрямо через перетворення між внутрішніми типами да¬них, які використовує цей об’єкт, і LI-типами даних.

До ДСТУ 3901-99 включено вимоги стандартизації перетворень. Передбачено, що ДСТУ 3901-99 супроводжуватиметься іншими стандартами, що описують засоби перетворення LI-типів даних. Стандарти перетворень можуть визначати “загальне” перетворення в тому розумінні, що замість визначення конкретного LI-типу даних перетворення визначає родину LI-типів даних і вимагає від користувача або розробника директив, який член родини застосовано для конкретного використання у стандарті перетворення. Це необхідно завжди, коли внутрішні типи даних, як і в мовному стандарті, строго або нестрого параметризовано. Наприклад, стандарт мови визначає тип даних integer, а мовний процесор реалізує певний діапазон integer, отже, у стандарті перетворення треба описати перетворення внутрішнього типу даних integer на LI-тип даних: integer range (min ... max), та вимагати, щоб мовний процесор перевіряв значення min та max.

Тип даних Тип даних – це набір різних значень з певними властивостями та операціями, виконуваними над цими значеннями . Характеристичні операції застосовують тільки для визначення типів даних, щоб допомогти ідентифікувати відповідні типи даних для такої конкретної мети, як виконання перетворення у мовах програмування. LI-типи даних “найчастіше використовують” не в тому розумінні, що вони безпосередньо підтримуються, тобто вбудовані до чисельних мов, а в тому, що ґрунтуються на найзагальнішій та кориснішій концепції, визнані більшістю користувачів і підтримуються не тільки в багатьох мовах програмування, але і в інших комп’ютерних системах.

Практичні задачі програмування, на які орієнтовано набір LI-типів даних

Практичні задачі програмування, на які орієнтовано набір LI-типів даних Багато специфікацій службових програм, бібліотек чи застосувань вже стандартизовано. Їхні інтерфейси часто описано визначенням виду посилання, тобто “процедурного виклику” кожної окремої функції або сервісного засобу з бібліотеки, як це робиться у програмі користувача, написаній стандартною мовою програмування (Фортран, Кобол, Сі/С++). Таку специфікація інтерфейсу зазвичай позначають як “<мова> звернення до <сервісний засіб>”, наприклад, “Фортран-звернення до PHIGS” (ISO/IEC 9593-1:1990). Тому слідом за стандартизацією нової сервісної бібліотеки треба стандартизувати інтерфейс звернення для кожної програмування чи сервісного пакету. Щоб уникнути цього, розроблено стандарти для незалежних від мов процедур виклику та для LI-типів даних, які можна використати для опису параметрів таких процедур. Мета міжнародного стандарту ISO/IEC 11404:1996 і згармонізованого з ним ДСТУ 3901-99 – полегшити узагальнення та обмін поняттями (нотаціями), які описують типи даних на концептуальному рівні для різних мов програмування і пов’язаних з мовами об’єктів. Кожний LI-тип даних має певний базовий набір власти¬востей, достатній для його виділення серед інших типів даних і полегшення ідентифікації від¬по¬від¬ного (або приблизно відповідного) типу даних з інших стандартів і мов. Отже, ДСТУ 3901-99 забезпечує одну загальну модель звернення для усіх стандартів, що застосовують концепцію типу даних. Очікується, що кожен стандарт мови програмування буде визначати перетворення типів даних, які підтримує ця мова програмування, у LI-типи даних та семантичну ідентифікацію типів даних цієї . Водночас ДСТУ 3901-99 разом з іншими застосуваннями варто використовувати для визначення “незалежних від мови звернення” параметрів виклику процедур, утворюючи основні елементи стандартного інтерфейсу до кожного зі стандартних сервісних засобів. Створення таких звернень сервісних засобів і мовних перетворень у поєднанні з механізмом LI-виклику процедур приводить до того, що немає потреби у документах виду “<мова> звернення до <сервісний засіб>”. Кожний інтерфейс сервісного засобу через визначення його параметрів і використання LI-типів даних ефективно визначає звернення через ці параметри до певної стандартної мови програмування; а кожна мова шляхом перетворення LI-типів даних у типи даних мови ефективно визначає звернення через параметри до якогось стандартного сервісного засобу. На зовнішньому рівні розрізняють три наступні поняття типу даних: -концептуальне чи абстрактне поняття характеризує тип даних за його номінальним значенням або властивостями; -структурне поняття характеризує тип даних як концепцію, утворюючи основні елементи стандартного інтерфейсу до кожного із стандартних сервісних засобів. Створення такого звернення до якогось сервісного засобу задають його певні компоненти із специфічними функціями; -реалізаційне поняття визначено за правилами подання типу даних у середовищі.

Різні програмні продукти, системи, їхні окремі складові та інші об’єкти обробки інфор¬мації можуть або прямо відповідати ДСТУ 3901-99 шляхом використання визначених у ньому типів да¬них, або непрямо через перетворення між внутрішніми типами да¬них, які використовує цей об’єкт, і LI-типами даних.

Простір значень LI-типу даних та його характеристичні операції.

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

Властивості LI-типів даних та обчислювальна абстрактна модель. Рівність (еквівалентність) LI-типів даних.

Властивості LI-типів даних та обчислювальна абстрактна модель. Рівність (еквівалентність) LI-типів даних. Модель LI-типів даних звуть обчислювальною абстрактною моделлю. Йдеться про маніпулювання інформацією в комп’ютерних системах, а модель відрізняє введені одиниці інформації, які відповідають цьому виду маніпуляції. Модель абстрактна в тому розумінні, що має справу із сприйнятими властивостями одиниць інформації, а не з властивостями їхнього подання у комп’ютерних системах. Важливо розрізняти поняття значення, відношення та операції для типів даних і подання цих значень, відношень та операцій у комп’ютерних системах. У ДСТУ 3901-99 визначено характеристики концептуальних типів даних і запропоновано лише засоби специфікації характеристик подання типів даних. Деякі концептуальні властивості визначено з огляду на потреби подання у комп’ютері одиниць інформації. Припускається, що такі властивості мають відповідати абстрактній моделі на противагу властивостям, які використовують винятково для подання та обумовлені природою специфічного подання одиниць інформації. Немає причин визначати описану модель типу даних як “математичну”, оскільки у реальній математичній моделі відсутні такі поняття, як доступ до одиниць інформації або виклик елементів обробки, важливі для визначення характеристичних операцій для типів даних і генераторів типів даних. Рівність (equality) у кожному просторі значень встановлено за такими правилами: -для якихось двох значень (a, b) з простору значень виконується умова a дорівнює b, специфікована як a=b, або a не дорівнює b , специфікована як a != b; -не існує пари таких значень (a, b) з простору значень, для яких одночасно виконуються умови a=b та a != b; -для кожного значення а з простору значень виконується умова а=а; -для якихось двох значень (a, b) з простору значень a=b тоді і тільки тоді, коли b=а; -якщо для довільних трьох значень (a, b, с) з простору значень виконуються умови a=b і b=с, то виконується умова а=с. Для кожного типу даних операція рівності Equal визначається як властивість рівності простору значень. Для якихось значень a і b з простору значень Equal(a, b) є true (істина), якщо a=b, і false (хибність) у протилежному випадку.

Властивості LI-типів даних: впорядкованість, обмеженість, злічимість і кардинальність, точність і наближеність.

Властивості LI-типів даних: впорядкованість, обмеженість, злічимість і кардинальність, точність і наближеність. Порядок (order). Простір значень впорядкований, якщо для нього встановлено відношення порядку, яке позначається як <' і задовольняє наступним умовам: -для кожної пари значень (a, b) з простору значень виконується умова a <' b або b <' a чи обидві ці умови; -для якихось двох значень (a, b), якщо a <' b і b <' a, то a'b; -для якихось трьох значень (a, b, с), якщо a <' b і b<'с, то a <'c. Тип даних впорядкований, якщо відношення порядку визначається на його просторі значень. Відповідна операція InOrder визначається так. Для довільних двох значень a і b з простору значень InOrder(a, b) є true, якщо b <' a, і falshe у протилежному випадку. Можна задавати кілька умов впорядкування в одному просторі значень. Допускають кілька різних типів даних, які мають спільний простір значень, проте використовують власне відношення порядку. Вибране відношення порядку характерне для впорядкованого типу даних і може впливати на визначення інших операцій цього типу даних. Обмеженість. Тип даних обмежений згори, якщо він впорядкований і існує таке значення U з його простору значень, що для всіх значень s цього простору виконується умова s<'U. Значення U становить верхню границю простору значень. Аналогічно, тип даних обмежений знизу, якщо він впорядкований і існує таке значення L з його простору значень, що для усіх s цього простору виконується умова L <' s. Значення L становить нижню границю простору значень. Тип даних зветься обмеженим, якщо його простір значень має верхню і нижню границі. Для обмеженого знизу типу даних визначено операцію 0-арності Lowerbound для одержання нижньою границі простору значень. Для обмеженого згори типу даних визначено операцію 0-арності Upperbound для одержання верхньої границі простору значень. Верхня границя простору значень, якщо вона існує, має бути унікальною. Якщо U1 і U2 – верхні границі простору значень, то U1<'U2 і U1 >' U2, а тому U1 ' U2. Аналогічно нижня границя, якщо вона існує, також має бути унікальною. Кардинальність (cardinality). Простір значень ґрунтується на математичній концепції зчисленності або кардинальності: він може бути скінченним, зчисленним нескінченним (злічимим) або незчислен¬ним нескінченним. Тип даних повинен мати кардинальність (потужність) свого простору значень. Моделлю передбачено три категорії типів даних, простір значень яких: -скінченний; -точний і зчисленний (злічимий) нескінченний; -наближений і тому має скінченну або зчисленну нескінченну модель, хоча концептуальний простір значень може бути незчисленним нескінченним. Кожний концептуальний тип даних обов’язково точний. Необчислюваний тип даних є незчисленним нескінченним. Для зчисленного нескінченного простору значень завжди існують такі алгоритми подання, що жодні два різних значення не мають однакового подання, а подання якогось значення має певну довжину. Навпаки, у незчисленному нескінченно¬му просторі значень завжди існують значення, які не мають певного (скінченного) подання. Точний і наближений. Модель LI-типів даних встановлює межу розрізнювання значень типів даних. Якщо кожне значення у просторі значень концептуального типу даних можна відрізнити від іншого значення у просторі цієї моделі, то тип даних вважається точним (exact). Математичні типи даних, що мають значення без певного подання, звуть наближеними (approximate) та формують у такий спосіб. Нехай М – математичний тип даних, а С – відповідний обчислюваний тип даних, Р – перетворення простору значень М на простір С. Тоді для кожного значення v’ з С існує відповідне значення типу даних v з М і таке дійсне значення h, що P(x)'v’ для усіх x з М та |v-x|<h. Отже, v’ — це наближення у просторі С для усіх значень з М, які знаходяться у h-околі значення v’. Крім того, принаймні для одного значення v’ з С існує більше, ніж одне таке значення y з М, що Р(y) ' v’. Отже, С – неточна модель М. Наближені типи даних мають обчислювальні моделі, які через параметричні значення визначають ступінь наближення, тобто певний мінімальний набір значень математичного типу даних для забезпечення розрізнювання для обчислюваного типу даних. За описаною моделлю можна перетворювати математично визначений тип даних на тип даних з поданням фіксованої довжини та нез’ясованою, інтуїтивно прийнятною поведінкою. Якщо дійсне число h, описане раніше, постійне на всьому просторі значень, то модель характеризується як така, що має абсолютну граничну помилку, і в результаті маємо масштабований тип даних. Якщо h має вигляд c*|v|, де с – константа на всьому просторі значень, то модель має “відносну граничну помилку” і використовується для дійсних і комплексних типів даних. Числовий (numeric) LI-тип даних має кількісно визначені значення (у певній системі числення). Тип даних, значення якого не має цієї властивості, звуть нечисловим. Ця властивості важлива тому, що подання значень залежить від системи числення (radix) і може алгоритмічно перетворюватися з однієї системи числення на іншу.

Примітивні та непримітивні LI-типи даних. Атомарні та агрегатні LI-типи даних.

Примітивні та непримітивні LI-типи даних. Атомарні та агрегатні LI-типи даних. За синтаксичним поданням LI-типи даних підрозділяються на: -примітивні, визначені без посилань на інші типи даних; -згенеровані, описані як частково визначені в термінах інших типів даних. Крім того, ідентифіковано структурні та абстрактні поняття типів даних. Структуру типу даних характеризують концептуальні поняття: -атомарний, що має неподільні значення, -агрегатний, що має значення, організовані з певних компонентів типів даних із специфічними функціями. Усі примітивні типи даних атомарні і визначені в термінах абстрактних понять. Деякі згенеровані типи даних атомарні, проте залежать від специфікацій, які включають інші типи даних, що також визначено у термінах їхніх абстрактних понять. Чисельні типи даних можуть задавати об’єкти як атомарні, але самі є агрегатними й утворюють колекції дос¬туп¬них компонентів значень. Для агрегатних типів даних визначено набір базових структурних понять, який можна рекурсивно застосовувати для отримання простору значень згенерованого типу даних. Тільки абстрактні семантики, приписані такому типу даних, характеризують власну структуру агрегатного значення. Абстрактне поняття типу даних – це семантика значень типу даних на противагу ініціалізації як подання значень окремої одиниці інформації або окремого абстрактного об’єкту. Абстрактні нотації, запропоновані у ДСТУ 3901-99, достатні для визначення розмаїття відмінностей двох мов, проте не визначають розмаїття відмінностей двох програм. Наприклад, тип даних Array підтримують такі мови програмування, як Фортран і Паскаль; масив дійсних чисел має схожу семантику для процедур, що викликаються у цих мовах. Для порівняння лінійні оператори і списки декартових координат точок можна подати масивом дійсних чисел, але цього масиву не досить для розрізнення семантики таких значень у програмах.

Генератор LI-типів даних та його характеристичні операції.

Генератор LI-типів даних та його характеристичні операції. Генератор LI-типів даних (datatype generator) – це концептуальна процедура над одним або кількома типами даних, яка створює новий тип даних. Генератор типів даних оперує типом даних для його генерації, а не генерує окремі значення. Генератор типів даних – це сполучення: - набору критеріїв щодо кількості та властивостей типів даних, над якими буде виконано операції; - процедури конструювання, яка задовольняє кожен критерій з їхнього набору і створює новий простір значень з просторів значень цих типів даних; - колекції характеристичних операцій, які застосовуються на підсумковому просторі значень для визначення нового типу даних. Застосування генератора типу даних до колекції типів даних із обов’язковим задоволенням набору критеріїв формує згенерований тип даних, який називають підсумковим типом даних, а колекцію типів, до якої генератор застосовано, – його параметричними типами даних. 4.2.3 Характеристичні операції Набір характеристичних операцій типу даних стосується певного типу даних або ство¬рює значення типу даних і відрізняє цей тип від інших, що мають ідентичний простір значень, за винятком, можливо, заміни символів. Набір характеристичних операцій генератора типу даних охоплює операції, які (через які) створюють значення якогось типу даних у результаті застосування цього генератора. Набір відрізняє цей генератор від інших генера¬торів, що створюють ідентичні простори значень з ідентичних параметричних типів даних. Характеристичні операції необхідні для виділення типів даних, для яких простір значень відрізняється тільки тим, яку назву носять значення. Наприклад, простори значень (один, два, три, чотири), (1, 2, 3, 4) і (червоний, жовтий, зелений, блакитний) мають по чотири різних значення і всі їхні імена різні. Проте може бути так, що перші два підтримують характеристичну операцію Додати, а два інших – ні: Додати(один, два)=три і Додати(1, 2)=3; проте Додати (червоний, жовтий)!=зелений. У цьому випадку характеристична операція Додати показує, що перші два типи даних однакові, тоді як останній – відрізняється від них. Характеристичні операції для агрегатних типів даних, тобто для їхніх генераторів, становлять композиції з характеристичних операцій компонентів цих типів даних. Характеристичними операціями певного типу даних можуть бути: - операції нульової арності, які генерують значення цього типу даних; - унарні операції (арності 1), які перетворюють значення типу даних у значення цього ж типу даних або у значення типу даних boolean; - бiнарні операції (арності 2), які перетворюють пари значень цього типу даних у значення цього ж типу даних або у значення типу даних boolean; - n-елементні операції (n-арні), які перетворюють впорядковані групи n-значень, кожна з яких відноситься до певного типу даних, що може бути цим же типом або параметричним типом даних, у значення цього ж типу даних або параметричного типу даних. Взагалі не існує унікальної колекції характеристичних операцій для певного типу даних. У ДСТУ 3901-99 визначено одну колекцію характеристичних операцій для кожного типу даних (або генератора типів), достатню для виділення цього (підсумкового) типу даних серед усіх інших з простору значень тієї ж потужності. Поки що не обґрунтовано мінімальність якоїсь колекції. Проте InOrder завжди є характеристичною операцією для впорядкованих типів даних.

Родини LI-типів даних. Агрегатні типи даних та методи доступу. Рекурсивна структура.

Родини LI-типів даних. Агрегатні типи даних та методи доступу. Рекурсивна структура. Родини типів даних Якщо існує символьна заміна, яка перетворює весь простір значень одного типу даних (домен, domain) у підмножину простору значень іншого типу даних (діапазон, range) таким чином, що значення відношень і характеристичних операцій з домену типу даних зберігаються у відповідних значеннях відношень і характеристичних операцій діапазону типу даних і, якщо додаткові характеристичні операції відсутні для діапазону даних, то два типи даних належать одній родині типів даних. Окремі члени родини відрізняються своїми просторами значень. 'Агрегатні LI-типи даних Агрегатний LI-тип даних (aggregate datatype) – це згенерований тип даних, кожне значення якого отримано зі значень параметричних типів даних. Параметричні типи даних агрегатного типу даних або його генератора мають назву компонентів типу даних. Генератор агрегатного типу даних генерує тип даних шляхом: -застосування процедури (алгоритму) до просторів значень компонентів типу даних для побудови простору значень агрегатного типу даних; -забезпечення набору характеристичних операцій, специфічних для генератора. На відміну від інших згенерованих типів даних, особливість агрегатного типу даних полягає у тому, що значення компонентів агрегатного значення доступні через характеристичні операції. Агрегатні значення різних типів відрізняються між собою властивостями, які характеризують відношення між компонентами типів даних і відношення між кожним компонентом і агрегатним значенням. Для агрегатних типів даних характерна незалежність властивостей компонентів типів даних. Так, основні властивості множини не залежать від їх елементів. Довільна комбінація властивостей, специфікованих далі, визначає конкретну форму агрегатного типу даних, хоча більшість – це вираз для однорідних агрегатних типів даних із залученням прямого доступу. Однорідність. Агрегатний тип даних однорідний (homogeneous) тоді і тільки тоді, коли всі компоненти належать до одного типу даних. Якщо різні компоненти належать до різних типів даних, то тип даних неоднорідний (heterogeneous). Компонент однорідного агрегатного типу даних також зветься елементом типу даних, наприклад, елемент масиву як однорідного типу даних. А тип даних Запис неоднорідний, якщо хоч би одне складове поле має інший тип даних, ніж решта складових полів. Розмір (size) агрегатного значення – це кількість непустих значень компонентів, які в ньому містяться. Розмір агрегатного типу даних фіксований тоді і тільки тоді, коли усі значення його простору містять однакову кількість значень компонентів. Розмір змінний, якщо значення агрегатного типу даних можуть мати різну кількість значень компонентів. Змінний розмір – узагальнений випадок; фіксований розмір – частковий випадок змінного. Унікальність як властивість притаманна агрегатним значенням тоді і тільки тоді, коли жодне значення компонента типу даних не зустрічається більше одного разу в агрегатному значенні. Агрегатний тип даних має властивість унікальності тоді і тільки тоді, коли всі значення в його просторі унікальні. Впорядкування

Агрегатно-підтримане впорядкування як властивість притаманна агрегатному LI-типу даних тоді і тільки тоді, коли існує канонічний (перший, другий тощо) компонент кожного непустого значення з його простору значень. Це впорядкування стосується агрегатного значення на відміну від простору значень якогось компонента типу даних, який сам впорядкований.

Наприклад, визначимо генератор типу даних Символьний рядок як послідовність se-quence of character (repertoire), впорядковану за першим символом рядка. Тобто існує характеристична операція, що встановлює, чи є елемент типу даних character (repertoire) впорядкованим, якщо ‘a’< ‘c’? Доцільне також запитання про те, чи буде простір значень типу даних Символьний рядок впорядкованим, якщо порівнювати послідовності “comp” та “computer”. Метод доступу (access method) для агрегатного типу даних – це властивість, що передбачає наявність характеристичної операції отримання значення якогось компонента з агрегатного значення. Агрегатний тип даних має прямий доступ тоді і тільки тоді, коли існує агрегатно-підтримане перетворення між значеннями принаймні одного “індексу” (ключа) типу даних і агрегатними значеннями. Таке перетворення потрібне для однозначності, щоб існувало не більше одного компонента кожного агрегатного значення, який би відповідав кожному з індексів цього типу даних. Розмірність – це кількість індексів або ключів, які має цей агрегатний тип даних. Агрегатний тип даних індексований тоді і тільки тоді, коли він має метод прямого доступу, кожний індексний тип даних впорядкований і агрегатне значення справді визначено для кожного значення з простору типу(ів) даних індексу(ів). Кожний індексований агрегатний тип даних має фіксований розмір з причини наявності взаємно однозначного перетворення між своїм простором і простором(ами) значень індексу(ів). Крім того, індексований тип даних має “часткове впорядкування” у кожній розмірності, підтримане відношенням порядку на індексному типі даних для цієї розмірності; зокрема агрегатний тип даних з одним упорядкованим індексним типом даних непрямо має впорядкування, забезпечене послідовністю значень індексу. Агрегатний тип даних має ключ тоді і тільки тоді, коли він має прямий метод доступу, але індексні типи даних або перетворення не задовольняють потребам індексування. Тобто “ключовий” (індексний) тип даних необов’язково має бути впорядкованим, а значення агрегатного типу даних відповідають всім значенням ключа. Агрегатний тип даних має лише непрямий доступ, якщо не існує агрегатно-підтримане індексне перетворення. Непрямий доступ може виконуватись за розташуванням (якщо агрегатний тип даних має впорядкування), за значенням компонента (якщо агрегатний тип даних має властивість унікальності) або за певним механізмом вибору, що залежить від реалізації. Методи доступу стають характеристичними операціями для агрегатних типів даних. Доцільніше визначати типи даних через внутрішньо притаманні їм властивості, тоді ці властивості доступу досягаються за допомогою характеристичних операцій. Послідовність має непрямий доступ, оскільки тільки переліченням (коли потрібне значення задовольняє певній умові) можна продивитись список і знайти потрібний елемент. Неможливо дістатися шуканого значення у просторі без попереднього доступу до усіх (непотрібних) значень, які з’являються раніше у цій послідовності. Проте масив має прямий доступ, оскільки операція доступу знаходить елемент за індексом і вибирає його без доступу до інших елементів масиву. Якщо потрібен елемент масиву, для якого не застосовано індексацію, то доступ буде непрямим. Рекурсивна структура. Тип даних рекурсивний (recursive), якщо значення типу даних містить (або посилається на) інше значення цього типу даних. У ДСТУ 3901-99 рекурсивність підтримано за допомогою ого¬лошення типу у поєднанні з вибором типу даних або покажчиком на тип даеих. Отже, саму рекурсивну структуру не вважають властивістю агрегатних типів даних. Наприклад, Лісп має кілька атомарних типів даних, зібраних у загальний тип даних Атом і тип даних Список як послідовність елементів, кожний з яких може бути атомом або списком. Цей тип даних описують з використанням генератора типів даних Дерево.

Примітивні LI-типи даних Логічний, Стан, Переліковний.

4.3 Примітивні LI-типи даних і підтипи Тип даних, простір значень якого визначено аксіоматично або переліком, зветься примітивним типом даних. У ДСТУ 3901-99 визначено 12 примітивних LI-типів даних, див. табл. 31. (a) Для виділення підланцюжків 1-го порядку (до яких віднесено іменні групи, словосполука з прийменниками і прислівниками, дієслівні групи) речення переглядають справа наліво згідно з граматикою, що задає різні припустимі структури впродовж перегляду речення. (b) Потім для виділення підланцюжків 2-го порядку, що складають комбінації ланцюжків 1-го порядку, речення переглядають повторно, але вже зліва направо; ланцюжки 2-го порядку – це компоненти простих речень. Якщо якась задана комбінація слів із приписаними їм кодами синтаксичних класів граматично неприпустима, то відповідний варіант аналізу не підходить для розглянутого речення. Параметри можуть бути відсутніми або подані списком одного або більше формальних параметрів операції, розділених комами, і зазначатися у вигляді: <ім’я параметра> : <тип даних параметра>, <ім’я параметра1>, <ім’я параметра2 >, … : <тип даних параметра>. Таблиця: Тип даних:1.Впорядкований,2.Точний,3.Числовий,4.Обмежений згори,5.Обмежений знизу Логічний - 2 Стан - 2 Переліковний -1,2,4,5 Символьний -2 Порядковий-1,2,5 Дата/час-1,2 Цілий-1,2,3 Раціональний-1,2,3 Масштабований -1,2,3 Дійсний -1,3 Комплексний -3 Пустий - -

Ім’я операції – це ідентифікатор, унікальний тільки для певного типу даних. Імена параметрів подано формальними ідентифікаторами або у словесному визначенні. Кожний формальний ідентифікатор використовують для подання довільного значення типу даних, специфікованого параметром типу даних, а всі варіанти формальних ідентифікаторів подають однакове значення в якомусь застосуванні операції. Підсумковий тип даних вказує на тип даних значення, отриманого після застосування операції. Формальне визначення задає операцію у термінах інших операцій або констант, а словесне визначення – формалізованою природною мовою. Якщо для значень параметрів існують обмеження, їх виражено фразою, розпочатою словом “де” одразу перед “'” або “є”. Характеристичні операції напередвизначених типів даних подано у вигляді: <тип даних>.<операція> (<параметри>), де тип даних – це специфікатор типу даних; а операція – ім’я характеристичної операції, визначеною цим типом даних. Логічний Логічний (boolean) – математичний тип даних, пов’язаний з використанням двозначної логіки. Простір значень складають такі два значення true та false, що true !' false. Властивості: невпорядкований, точний, нечисловий. Операції Equal, Not, Or визначено e табл. 32, а для And застосовано формулу And(x, y: boolean): boolean ' Not(Or(Not(x), Not(y))). Таблиця - x, y - true, false - як в дискретці. Операції And і Or достатньо характеризують логічний тип даних. Їх використовують у визначеннях операцій для інших типів даних. Стан Стан (state) – це родина типів даних, кожен з яких включає скінчене число різних, невпорядкованих значень. Простір значень – явно визначений набір іменованих значень у списку значень state-value-list, кожному з яких приписано унікальний ідентифікатор. Властивості: невпорядкований, точний, нечисловий. Операції: Equal. Equal(x, y: state(state-value-list)): boolean є true, якщо x і y задають однакові значення із списку state-value-list, а false – у протилежному випадку. Наприклад, оголошення:

type switch ' new state (on, off);

визначає тип даних Стан, що припускає наявність двох невпорядкованих значень і підтримує такі характеристичні операції:

Invert(x: switch): switch є on, якщо x ' off, інакше – off.

Переліковний Переліковний (еnumerated) – це родина типів даних, кожний з яких допускає скінченне число різних значень з властивим їм порядком. Простір значень – явно визначений набір пойменованих значень, поданий списком значень еnum-value-list, кожне з яких відрізняється своїм унікальним ідентифікатором. Порядок цих значень задає послідовність їхнього входження до списку еnum-value-list, що зветься пронумерована послідовність. Властивості: впорядкований, точний, нечисловий, обмежений. Операції: Equal, OnOrder, Successor. Equal(x, y: enumerated(enum-value-list)): boolean є true, якщо x і y задають однакове значення в enum-value-list, і false – у протилежному випадку. InOrder(x, y: enumerated(enum-value-list)): boolean, специфікований як x <' y, є true, якщо x ' y або х передує у в занумерованій послідовності , і false – у протилежному випадку. Successor(x: enumerated(enum-value-list)): enumerated(enum-value-list) є невизначеним, як¬що для всіх у:enumerated(enum-value-list) та x<'y випливає x'y; інакше таке значення у: enumerated(enum-value-list), що x < y і для усіх z !' x, x <' z випливає, що у <' z.

Примітивні LI-типи даних Символьний, Порядковий, Дата/час.

Примітивні LI-типи даних Символьний, Порядковий, Дата/час. Символьний Символьний (character) – це родина типів даних, простір значень яких є набір або репертуар символів. На цей набір посилаються за допомогою ідентифікаторів repertoire-identifiers, що перелічені у списку repertoire-list і визначають підмножини набору символів. Якщо repertoire-list не задано, то вибирають значення за промовчанням. Різні підмножини одного набору містять класи символів: букви, цифри, символи-обмежники, всякі доповнювальні чи спеціальні символи та escape-character. Піднабори символів перелічено у списку repertoire-list. Коли піднабори символів, задані окремими repertoire-identifier, мають спільні елементи, то простір значень – об’єднання цих наборів символів (без їхнього дублювання). Властивості: невпорядкований, точний, нечисловий. Операції: Equal. Equal(x, y: character(repetoire-list)): boolean є true, якщо х і у означають той самий елемент набору символів, заданого списком repertoire-list, і false – у протилежному випадку. Символьні типи даних відрізняються від типів даних Стан наявністю своїх описів у інших стандартах, а не ДСТУ 3901-99. Терміни набір символів, елемент, символ та ім’я символу визначено у ISO/IEC 10646-1, аналогічні поняття наявні у довільному наборі символів, специ¬фікованому repertoire-identifier. Простір значень символьного типу даних – це набір символів, а не їхні коди, наприклад, згідно з ISO/IEC 10646-1. Схема кодування набору символів належить до задач застосування і тому виходить за межі ДСТУ 3901-99. Оскільки порядок суттєвий для багатьох застосувань символьних типів даних, але стандарт на порядок відсутній, то правила впорядкування або їхня несуттєвість встановлюються для самого застосування і його мовного середовища. Оскільки жоден стандарт на порядок набору символів не визначено у ДСТУ 3901-99, то кажуть, що символьні типи даних “невпорядковані”, припускаючи, що порядок визначено додатково до семантики типу даних. Наприклад, character({iso standart 8859 part1)} означає тип даних Символьний, значення якого – це елементи набору даних, описані згідно з ISO/IEC 8859-1. Можна дати цьому типу даних ім’я оголошенням: type Latin1 ' character(( {iso standard 8859 part 1})); або за допомогою оголошення значення: value latin : objectidentifier ' { iso(1) standard(0) 8859 part(1)}; Порядковий Порядковий (оrdinal) – це тип даних порядкових номерів, що відрізняються від значущих чисел типів даних Цілий чи integer. Простір значень складають порядкові номери: перший, другий, третій тощо, утворюючи нескінчений перелік десяткових цілих чисел. Властивості: впорядкований, точний, нечисловий, необмежений згори, обмежений знизу. Операції: Equal, InOrder, Successor. Equal(x, y: ordinal): boolean є true, якщо x і y означають однаковий порядковий номер, і false – у протилежному випадку. InOrder(x, y: ordinal): boolean, записана як x <' y, є true, якщо x ' y або х передує у за порядковим номером, і false – у протилежному випадку. Successor(x: ordinal): ordinal – це таке значення у: ordinal, що x< y і для всіх z !' x, x <' z вірно у <' z. 4.3.6 Дата/час Дата/час (Date-and-Time) – родина типів даних, значення яких встановлюють час у різних, часто застосовних поданнях: рік, місяць, день, година, хвилина, секунда та її частки. Простір значень – ненумерований нескінченний набір усіх можливих відміток часу з розрізнюваністю (time-unit, radix, factor).Одиниця вимірювання time-unit має бути значенням типу даних Стан(рік, місяць, день, година, хвилина, секунда), визначаючи одиниці часу. Якщо radix і factor випущено, то розрізнюваність – одна з одиниць time-unit. Якщо їх встановлено, то radix є ціле число, більше 1, factor – ціле, а розрізнюваність дорівнює radix-factor обраної одиниці time-unit. Значення типу даних Дата/час можна подавати символьним рядком, скажімо, згідно із стандартом ISO 8601:1988. Властивості: впорядкований, точний, нечисловий, необмежений. Операції: Equal, InOrder, Difference, Round, Extend. Equal(x, y: time(time-unit, radix, factor)): boolean є true, якщо х і у задає одну позначку часу для розрізнюваності (time-unit, radix, factor), і false – у протилежному випадку. InOrder(x,y: time(time-unit, radix, factor) boolean є true, якщо позначка часу, специ¬фікована х, передує позначці у, і false – у протилежному випадку. Difference(x, y: time(time-unit, radix, factor)): інтервал часу (time-unit, radix, factor) є кількість одиниць часу, визначеного розрізнюваністю між часом х і часом у, якщо InOrder(x,y); інакше Negate(z), якщо z – число одиниць часу між часом у і х. Extend.res1tores2(х: time(unit1, radix1, factor1)): time(unit2, radix2,factor2), де розрізнюваність (res2), визначена за допомогою (unit2, radix2, factor2), точніша за розрізнюваність (res1), визначену за допомогою (unit1, radix1, factor1), є таке значення time(unit2, radix2, factor2), яке задає перше поточне входження часу в межах часового інтервалу time(unit2, radix2, factor2), визначене поточним x. Round.res1 to res2(х: time(unit1, radix1, factor1)): time(unit2, radix2, factor2), де розрізнюваність (res2), визначена за допомогою (unit2, radix2, factor2), менш точна, ніж розрізнюваність (res1), визначена за допомогою (unit1, radix1, factor1), є таке найбільше значення у для time(unit2, radix2, factor2), що InOrder(Extend.res2tores1(y), x). Конкретні елементи дата/час будують із значень time(unіt, radix, factor), тобто Year, Month, DayofYear, DayofMonth, TimeofDay, Hour, Minute, Second, за допомогою Round, Extend і Difference. Наприклад, time(second, 10, 0) означає тип даних Дата/час, значення якого – це позначки часу з точністю до секунд. Скажімо, значення цього типу даних19910401Т120000 точно відповідає полудню 1 квітня 1991 року за всесвітнім часом.

Примітивні LI-типи даних Цілий, Раціональний, Масштабований.

Примітивні LI-типи даних Цілий, Раціональний, Масштабований. Цілий Цілий (integer) – математичний тип даних, що описує лише цілі числа. Простір значень – нескінченне кільце, отримане поєднанням адитивної групи з елементом 0 і мультиплікативної групи з одиничним елементом 1. Отже, ...,-2, -1, 0, 1, 2,... – це злічимий нескінченний перелік. Якщо знак “мінус” відсутній, то значення інтерпретують як десяткові цілі числа. Із знаком “мінус” специфіковано від’ємні значення. Властивості: впорядкований, точний, числовий, необмежений. Операції: Equal, InOrder, NonNegative, Negate, Add, Multiply. Причому останні дві операції введено лише для полегшення визначення інших типів даних. Equal(x. y: integer): boolean є true, якщо x і y задають однакове ціле число, і false – у протилежному випадку. Add(x, y: integer): integer є математична операція додавання. Multiply(x,y: integer): integer є математична операція множення. Negate(x: integer): integer є таке значення y: integer, що Add(x, y) ' 0. NonNegate(x: integer): boolean є true, якщо x ' 0 або x можна отримати за допомогою однієї або кількох ітерацій додавання 1, тобто якщо х ' Add(1, Add(1, ... Add(1,0)) ...)); інакше – false. InOrder(x,y: integer): boolean ' NonNegative(Add(x, Negate(y))). Quotient(x, y: integer): integer, де 0<y, є верхня границя набору таких цілих z, що (Multiply(y,z) <' x. Remainder(x, y: integer): integer, де 0 <' x і 0 < y, ' Add(x, Negate(Multiply(y, Quotient(x.y)))); Раціональний Раціональний (rational) – це математичний тип даних, що відповідає раціональним числам. Простір значень – нескінченне поле, отримане з кільця цілих чисел зворотним мультиплікативом, тобто поданням раціональних чисел як простих дробів signed-number ["/" number], де signed-number і number відповідають цілим числам, а number не отримує значення 0. Специфіковане лише чисельником signed-number раціональне число – це Promote(signed-number), а раціональне число, специфіковане signed-number / number , є: Multiply (Promote(signed-number), Reciprocal(Promote(number))). Властивості: впорядкований, точний, числовий, необмежений. Операції – Equal, NonNegative, InOrder, Negate, Add, Multiply, Reciprocal, Promote. Equal(x,y: rational) boolean є true, якщо х і у задають однакове раціональне число, і false – у протилежному випадку. Promote(x: integer): rational є ізоморфізм, введений між цілими і інтегральними раціональними значеннями. Add(x,y: rational): rational є математична операція додавання. Multiply (x,y: rational): rational є математична операція множення. Negate(x: rational): rational є таке значення y: rational, що Add(x, y) ' 0. Reciprocal(x: rational): rational, де x !' 0, є таке значення y: rational, що Multiply(x, y) ' 1. NonNegative(k: rational): boolean є значення, отримане у такий спосіб. Для кожного раціонального k існує таке невід’ємне число n, що Multiply (n,k) є цілим числом і NonNegative(k) ' integer.NonNegative(Multiply(n,k)). InOrder(x,y: rational): boolean ' NonNegative(Add(x, Negative(y))). Масштабований Масштабований (scaled) – це родина LI-типів даних, простором значень якої є підмножина простору раціональних чисел і кожний окремий тип даних має фіксований знаменник. Простір значень типу даних Масштабований – це множина значень раціонального типу даних; кожне значення виражено значенням типу даних Цілий, поділеним на radix, піднесений у ступінь factor. Radix – ціла величина, більша за 1, factor – також ціле. Синтаксис значення: integer [ "*" number “^” signed-number ] . Значення типу даних Масштабований інтерпретують як десяткове ціле число, помножене, якщо наведено опис із знаком "*", на number, піднесений у ступінь signed-number, де number і signed-number виражено десятковими цілими числами. Тип даних number має бути таким, як і radix. Якщо множник відсутній, то значення подається цілим числом, інакше – це раціональне значення Multiply(integer-literal, number “^” signed-number ). Властивості: впорядкований, точний, числовий, необмежений. Операції: Equal, InOrder, Negate, Add, Round, Multiply, Divide Equal(x, y: scaled(r,f)): boolean є true, якщо x і y задають однакове раціональне число, і false – у протилежному випадку. InOrder(x,y: scaled (r,f)): boolean ' rational.lnOrder(x,y) Negate(x: scaled(r,f)): scaled(r,f)'rational.Negate(x) Add(x,y: scaled (r,f): scaled (r,f) ' rational.Add(x,y) Round(x: rational): scaled(r,f)) є таке значення у:scaled(r,f), що rational.InOrder(y, x) і для усіх z:scaled(r,f)), rational.InOrder(z,x) означає rational.InOrder(z,y). Multiply(x,y: scaled(r,f)): scaled(r,f) ' Round(rational.Multiply(x, y)) Divide(x,y: scaled(r,f)): scaled(r,f) ' Round(rational.Multiply(x, Reciprocal(y))) Наприклад, значення 39.50 (або 39,50), тобто тридцять дев’ять цілих і п’ятдесят сотих можна подати як 3950 * 10^-2, а значення 10.00 (або 10,00) – як 10. У випадку factor'0, тобто scaled(r, 0) для якихосб r має однаковий простір значень integer, ізоморфний щодо integer для всіх операцій, крім Divide, яку не визначено на integer, проте можна визначити послідовно з операцією Divide для scaled(r, 0). Рекомендовано тип даних scaled(r, 0) не використовувати явно. Для коректності алгоритму округлення потрібно, щоб число v, що не належить до типу даних Масштабований, перетворювалось на одне або два таких масштабованих значення n•r^-f і (n+1)•r^-f , що n•r^-f < v < n•r^-f . Визначення масштабованої арифметики ускладнено тим, що у арифметичних виразах для отри¬мання результату має місце округлення. Отже, визначення арифметики для операндів з однаковим коефіцієнтом масштабування не можна розглядати як специфікацію для арифметики масштабованих типів даних. Значення довільного простору масштабованих значень беруться з простору значень типу даних Раціональний, тому тип даних Масштабований може бути підтипом типу даних Раціональний. Принцип округлення і спеціальні операції множення та ділення характеризують масштабовані типи даних. На відміну від типів даних Раціональний, Дійсний і Комплексний, масштабовані типи даних не складають математичну групу за мультиплікативом Multiply, хоча це інтуїтивно прийнятно, оскільки простір значень типу даних Масштабований містить одиничний елемент (1) щодо множення тоді і тільки тоді, коли factor >' 0. Кожний тип даних Масштабований є точним, оскільки кожне значення його простору легко розрізнити за обчислювальною моделлю. Цей простір значень можна однозначно перетворити на цілочисловий.

Примітивні LI-типи даних Дійсний, Комплексний, Пустий.

Примітивні LI-типи даних Дійсний, Комплексний, Пустий. Дійсний Дійсний (real) – це родина LI-типів даних, які є обчислювальними апроксимаціями математичного типу даних, що відповідає дійсним числам. Простір значень математичного типу даних Дійсний включає границі усіх послідовностей, що збігаються до раціональних чисел. Простір значень LI-типу даних Дійсний є підмножиною математичного типу даних Дійсний, що характеризується двома параметричними значеннями radix і factor, які визначають точність, за якої дійсні величини можна розрізнювати. Ціле число radix більше за 1, а factor – ціле число. Якщо Radix і factor не задано, то для них встановлено значення за промовчанням. Нехай R – математичний простір дійсних величин, а |v| (v є R) означає абсолютне значення v. Простір значень V типу даних real(radix, factor), де psilon ' radix^-factor, задає підмножину R з такими властивостями: -0 існує в V; -для кожного такого r із R, що | r | >'epsilon, існує принаймні одне таке r' із V, що | r -r' | <' |r | • epsilon; -для кожного такого r із R, що | r | < epsilon, існує принаймні одне таке r' із V, що | r- r' | <' epsilon^2 ; Значення типу даних Дійсний у вигляді integer [ "*" number ”^” signed-number] інтерпретують як десяткове ціле, помножене на number, піднесений у степінь signed-number, де number і signed-number задано десятковими цілими числами. Якщо множника немає, то значенням буде ціле число, інакше – раціональне Multiply(integer, number ”^” signed-number). Властивості: впорядкований, наближений, числовий, необмежений. Операції: Equal, InOrder, Promote, Negate, Add, Multiply, Reciprocal. У наступних визначеннях операцій апроксимуюча функція M перетворює кожне r є R на r є V з властивостями, вказаними вище, та з вимогою, щоб для кожного v є V M(v) ' v. Equal(x, y: real(radix, factor)): boolean є true, якщо x і y задають однакові значення, і false – у протилежному випадку. InОrder(x,y: real(radix, factor)): boolean є true, якщо x <' y, де <' означає відношення порядку на R, і false – у протилежному випадку. Promote (x: rational): real(radix, factor) ' M(x). Add(x,y: real(radix, factor)): real(radix, factor) ' M(x + y), де + означає операцію додавання дійсних чисел. Multiply(x, y: real(radix, factor)): real(radix, factor) ' M(x • y), де • означає операцію множення дійсних чисел. Negate(x: real(radix, factor)): real(radix, factor) ' M(-x), де -x є дійсне число, обернене до х. Reciprocal(x: real(radix, factor)): real(radix, factor) ' M(x’), де x!'0, а х’ – інверсія х щодо множення. Дійсний LI-тип даних не є абстрактним математичним типом даних Дійсний і абстрактною реалізацією рухомої крапки. Це обчислювальна модель математичних дійсних величин, яка схожа на модель “числа”, що використовують у багатьох науках. Деталі відношення дійсного типу даних до реалізації чисел з рухомою крапкою задають за допомогою нотацій. Для мов, семантика яких допускає подання з рухомою крапкою, потрібно застосовувати певні анотації у перетвореннях типів даних. Проте у деяких застосуваннях подання дійсного типу даних може відрізнятися від рухомої крапки, яку застосування буде специфікувати різними анотаціями. Детальні вимоги для апроксимуючої функції, її співвідношення з характеристичними операціями і реалізація характеристичних операцій у мовах регламентовано ISO/IEC 10967-1:1994. Стандарт IEC 559:1988 специфікує вимоги до реалізації рухомої крапки. Наприклад, real(10, 7) задає тип даних Дійсний для величин з точністю до 7 знаків після десяткової крапки, а real(2, 48) – тип даних Дійсний зі значеннями, які можна розташувати у розрядній сітці комп’ютера, не меншій за 48 біт. 1 * 10 ^ 9 означає 1 000 000 000, тобто 10 піднесене у степінь 9. 15 * 10 ^-4 означає 0,0015, тобто п’ятнадцять десятитисячних. 3 * 2 ^ -1 означає 1.5, тобто 3/2. Комплексний Комплексний (complex) – це родина LI-типів даних, кожний з яких задає числову апроксимацію математичного типу даних, що подає комплексні числа. Кожний LI-тип даних Комплексний – це колекція математичних комплексних величин, які відомі у застосуваннях з певною скінченною точністю і мають розрізнюватися принаймні з цією точністю. Простір значень математичного комплексного типу – це поле, яке є простором розв’язків всіх поліноміальних рівнянь з дійсними коефіцієнтами. Простір значень LI-типу даних Комплексний є підмножиною математичного комплексного типу даних, що характеризується двома параметричними значеннями radix і factor, які спільно задають точність, з якою можна подати значення типу даних. Radix має цілочислове значення, більше за 1, а factor – ціле число. Якщо radix і factor не визначено, їм надається значення за промовчанням. Нехай C – математичний простір комплексних величин і |v| – абсолютна величина v. Простір значень V комплексного типу даних complex(radix, factor), де epsilon ' radix^-factor , є підмножиною C з наступними властивостями: - 0 є в V; - для кожного такого v з C, що |v|>'epsilon, існує принаймні одне таке v' з V, що |v-v'<'|v|• epsilon; - для кожного такого v з C, що |v|<epsilon, існує принаймні одне таке v' з V, що | v - v' | <'epsilon^2 . Значення типу даних Комплексний подають як (real-part, imaginary-part), де обидві частини інтерпретують як дійсні величини. Комплексну частину визначено як M(real-part + (imaginary-part * i)), де + та • – операції додавання і множення математичних комплексних чисел, i – "квадратний корінь” з -1 (один з двох розв’язків рівняння x2 + 1 ' 0). Властивості: наближений, числовий, необмежений. Операції: Equal, Promote, Negate, Add, Multiply, Reciprocal, SquareRoot. У визначеннях операцій нехай M – апроксимуюча функція, яка перетворює кожне v з C, що відповідає v' з V, з властивостями, наведеними вище, і вимогою, щоб для кожного v з V, M(v) ' v. Equal(x, y: complex(radix, factor)): boolean є true, якщо x і y задають однакові значення, і false – у протилежному випадку. Promote(x: real(radix, factor)): complex(radix, factor) ' M(x), де x – дійсне значення. Add(x,y: complex(radix, factor)): complex(radix, factor) ' M(x + y). Multiply(x, y: complex(radix, factor)): complex(radix,factor) ' M(x • y). Negate(x: complex(radix, factor)): complex(radix, factor) ' M(-x), де -x є комплексна інверсія x щодо додавання. Reciprocal(x: complex(radix, factor)): complex(radix, factor), де x !' 0, ' M(x'), де x' є комплексна інверсія x щодо множення. SquareRoot(x: complex(radix, factor): complex(radix,factor) ' M(y), де y – це одна з двох таких комплексних величин, що y•y'x. Кожне комплексне число може унікально подаватись у вигляді a + b • i, де i – "квадратний корінь" з -1, а називають дійсною частиною real-part, b – уявною imaginary. Використане значення у має додатну дійсну частину, якщо вона існує, інакше дійсна частина дорівнює 0, а уявна – невід’ємна. Детальні вимоги для апроксимуючої функції, її співвідношення з характерис¬тич¬¬ними операціями і реалізації характеристичних операцій в мовах описано у ISO/IEC 10967-1:1994.

Пустий Пустий (void) – це LI-тип даних, який подає об’єкт із синтаксичними і семантичними вимогами, але не несе жодної інформації. Концептуально, простір значень пустого типу даних – пустий, але потрібне одне номінальне значення "nil" для функції подання. Властивості: відсутні. Операції: Equal. Equal(x,y: void) ' true; Пустий тип даних використовують як неявний тип підсумкового параметра типу даних процедури, що не повертає жодного значення, або як пусту альтернативу типу даних Вибір, коли ця альтернатива не має змісту. Пустий тип даних подається в деяких мовах як тип даних Запис без полів. LI-тип даних Пустий не є типом даних Запис, тому що не має властивостей або операцій цього типу даних. Для типу даних Пустий операція Equal потрібна для підтримки порівняння агрегатних значень, які містять пусті значення, і видавати значення true. Пустий набір є значенням не типу даних Пустий, а типу даних Послідовність.

Підтипи та розширені LI-типи даних Діапазон, Відбір, Вилучення.

Підтипи та розширені LI-типи даних Діапазон, Відбір, Вилучення. Підтип – це LI-тип даних, отриманий з існуючого типу даних, що зветься базовий, шляхом обмеження простору значень підмножиною цього базового типу даних, що містить всі характеристичні операції. Підтипи створює генератор типів даних, незвичний тому, що лише його функція визначає відношення між просторами значень базового типу даних та підтипу: У ДСТУ 3901-99 специфіковано шість генераторів підтипів. Далі кожен з них визначено окремим підпунктом, назва якого дає неформальне ім’я генератору підтипу, який визначено за наступним шаблоном. Опис підсумкового простору значень задає синтаксичне правило підтипу, яке з’являється від генератору підтипу, що ідентифікує всі параметричні значення, необхідні для повної ідентифікації підтипу, чи обмеження базового типу даних або параметричних значень. Всі властивості типу даних аналогічні базовому типу даних, можливо, крім наявності і величини обмежень. Характеристичні операції підтипу ідентичні операціям базового типу даних, проте домен характеристичної операції підтипу може не бути ідентичним домену базового підтипу. Значення з простору підтипу отримано за допомогою операції над базовим типом даних як підсумкові значення, що лежать поза простором значень цього підтипу, і видалено з домену цієї операції. Діапазон (range) створює підтип якогось впорядкованого типу даних шляхом розташування нової верхньої і/або нижньої границі простору значень. Якщо яіно задано границі Lowerhound і Upperbound, вони мають такі значення базового типу даних, що InOrderd(Lowerbound, Upperbound). Якщо Lowerbound позначено *, то не встановлено жодної нижньої границі, а якщо значення upperbound є *, то відсутня верхня границя. Підтип є обмеженим (згори, знизу, з обох боків), якщо базовий тип даних також обмежений або визначено відповідні границі. Відбір (selecting) створює підтип якогось точного типу даних шляхом нумерації значень з простору цього підтипу. З простору базового типу даних до простору створюваного підтипу переносять значення, що відповідають умовам списку відбору, в якому наведено вирази і діапазони. До простору створюваного підтипу переноситься єдине значення, що відповідає виразу. У списку відбору кожен діа¬па¬зон визначає усі такі значення v базового типу даних, що Lower¬bound <' v, якщо визначено Lowerbound, і v <' Upperbound, якщо визначено Upperbound. Коли задано Lowerbound і Upperbound, вони мають такі значення базового типу даних, що In0rder(Lowerbound, Upperbound). Якщо Lowerbound позначено *, то немає нижньої границі діапазну відбору, якщо Upperbound, – верхньої. Підтип обмежений (згори, знизу, з обох боків), якщо базовий тип даних обмежений відповідним чином чи у списку відбору вказано діапазони, що усі обмежено з обох боків. Вилучення (excluding) створює підтип даних якогось точного типу даних шляхом нумерації значень, які треба вилучити з побудованого простору значень підтипу. Простір значень цього підтипу містить усі значення базового типу даних, крім значень, заданих в списку вилучення, в якому наведено вирази, тобто поодинокі вилучені значення, чи діапазони вилучення. Діапазон вилучення зазначає всі такі значення v базового типу даних, що Lowerbound <' v, якщо Lowerbound визначено, і v <' Upperbound, якщо Upperbound визначено. Коли задано Lower-bound і Upperbound, вони мають такі значення базового типу даних, що In0rder(Lowerbound, Up-perbound). Якщо Lowerbound позначено *, то немає нижньої границі діапазну відбору, якщо Up-perbound, – верхньої. Підтип обмежений (згори, знизу, з обох боків), якщо базовий тип даних відповідно обмежено, або це певний діапазон, що входить до списку вилучення, не визначає відповідні границі.

Підтипи та розширені LI-типи даних Розмір, Розширений. Явно задані підтипи.

Підтипи та розширені LI-типи даних Розмір, Розширений. Явно задані підтипи. Розмір (size) створює підтипи типів даних Sequence, Set, Bag або Table шляхом визна¬чення обмеження на кількість компонентів базового типу даних, які можуть містити ці підтипи. Наприклад, розглядаються таблиці, що містять від одного до n рядків. Простір значень цього типу даних конструює генератор з простору одного з базових типів даних Sequence, Set, Bag або Table перевіркою мінімального min-size і/або максимального max-size розміру агрегатного значення базового типу. Мin-size має ціле значення, більше або рівне 0, і max-size, якщо його задано виразом, має таке ціле значення, що min-size <= max-size. Якщо max-size випущено, то максимальний розмір дорівнює min-size і, якщо max-size позначено *, то максимальний розмір необмежений. Котше кажучи, простір значень цього підтипу складається з усіх значень базового підтипу, які містять хоча б max-size значень компонентів типу даних. Властивості аналогічні базовому агрегатному типу даних; підтип має фіксований розмір значень, якщо максимальний розмір дорівнює мінімальному. Явно задані підтипи (explicit) визначають тип даних як підтип базового типу даних і описують процедуру конструювання простору нового підтипу в термінах LI-типів даних або генераторів типів даних. Наприклад, явно заданий підтип типу даних Цілий – підмножина парних чисел. Простір значень підтипу становить підмножину простору значень базового типу даних, який може бути довільним типом даних. Якщо базовий тип даних задано генератором типу даних, то спосіб конструювання підмножини простору значень залежать від базового типу даних. Властивості не властивостям базового типу даних, проте виникають обмеження на виконання характеристичних операцій. Для визначення підтипу зайве, але синтаксично прийнятне бути генератором підтипу: integer subtype (integer selecting(0 ... 5)). Розширений (extended) створює тип даних, простір значень якого містить простір значень базового типу даних разом з заданою підмножиною додаткових значень, визначених списком розширення. Кожне значення цього списку унікальне і відрізняється від значень базового типу даних, якщо такі існують. Простір значень обмежений (згори, знизу, з обох боків), якщо базовий тип даних обмежений відповідним чином або додаткові значення обмежені згори або знизу. Визначення типу даних Розширений включає специфікацію характеристичних операцій для базового типу даних, які застосовують до додаткових значень в extended-value-list. Зокрема, якщо базовий тип даних впорядкований, то довизначається поведінка операції InOrder для додаткових значень. Під час створення розширеного підтипу будується таке відношення, коли базовий тип даних є його підмножиною і тип даних Розширений має більший простір значень.

Згенеровані LI-типи даних Вибір, Покажчик, Процедура.

Згенеровані LI-типи даних Вибір, Покажчик, Процедура. 4.4 Згенеровані LI-типи даних Згенеровані LI-типи даних (generated datatypes) отримано в результаті застосування генератора типів даних як концептуальної операції на одному або кількох типах даних, яка створює новий тип даних. Типи даних, з якими працює генератор, мають назву параметричні або компонентні LI-типи даних. Згенерований тип даних семантично залежить від параметричних типів даних, але має власні характеристичні операції. Важливою рисою усіх генераторів типів даних є те, що генератор може застосовуватись до багатьох різних параметричних типів даних. Генератори Покажчика і Процедури генерують типи даних, значення яких атомарні, а генератори агрегатних типів задають типи даних, значення яких можна декомпозувати. У ДСТУ 3901-99 визначено найпоширеніші генератори типів даних (див. табл. 33), за допомогою яких застосування можуть визначати згенеровані типи даних. Кожен генератор типів даних визначено в окремому пункті, заголовок якого співпадає з ім’ям генератора, який описано за наступним шаблоном. Синтаксичні правила для згенерованого типу даних ідентифікують усі парамет¬ричні типи даних. Складові типу – кількість параметричних типів даних і для них обмеження, а також параметричні значення, що використовує генератор для побудови формально визначеного підсумкового простору значень. Зведена таблиця властивостей згенерованих атомарних LI-типів даних: Ім’я генератора:1.Вибір 2.Покажчик 3.Процедура Властивості:1.числовий 2.точний 3.впорядкований 4.обмежений Параметричні типи даних:1.Ознака 2.Елемент 3. Параметр 1.Вибір-- властивості 1-, 2 +-, 3 -, 4 -, ознака 2.Покажчик-- властивості 1-, 2 +, 3 -, 4 -, Елемент 3.Процедура-- властивості 1-, 2 +, 3 -, 4 -, Параметр Властивості підсумкового типу даних вказують на їхню застосовність до значень і компонентів типу даних: числовий чи нечисловий; наближений чи точний; невпорядкований чи впорядкований і, якщо впорядкований, то обмежений чи необмежений. Характеристичні операції підсумкового типу даних асоціюють з генератором типів даних. На відміну від генераторів підтипів, генератори LI-типів даних виробляють підсумкові типи даних, простір значень яких відрізняється від параметричних типів даних генератора. Вибір Вибір (choice) генерує LI-тип даних, кожне значення якого є окремим значенням певного набору альтернативних типів даних, логічно розрізнюваних з огляду на їхню відповідність значенням параметричного типу даних, що має назву Ознака (tag). Кожний альтернативний тип зі списку alternative-list може бути будь-яким типом даних. Тип даних Ознака (tag-type) буде точним типом даних. Список значень ознак кожній альтернативі надає зна¬чення у просторі значень типу даних Ознака, специфікованого tag-type. Якщо тип даних Ознака впорядкований, то Lowerbound і Up¬per¬bound задаються виразом, причому InOr-der(Lowerbound, Upperbound). Якщо Lowerbound позначено *, то не визначено нижню гра¬ни¬цю, а якщо Upperbound, то – верхню. Тип даних Вибір визначає асоціацію простору значень типу даних Ознака і набору альтернативних типів даних зі списку alternative-list, так що кожне значення типу даних Ознака асоціюється тільки з одним альтернативним типом даних. Усі значення у просторі задано парами (ознака, альтернатива), тобто значення типу даних Ознака, яке зустрічається (явно або неявно) у альтернативі з alternative-list та однозначно перетворюється на альтернативний тип да¬них. Властивості: невпорядкований, точний тоді і тільки тоді, коли всі альтернативні типи даних точні, нечисловий. Операції: Equal, Tag, Cast, Discriminant.

Discriminant(x: choice (tag-type)of(alternative-list)): tag-type є значенням ознаки для x.

Tag.type(х: type, s: tag-type): choice (tag-type) of (alternative-list), де type – альтерна¬тивний тип даних у списку alternative-list, що відповідає значенню s, є те значення типу даних Вибір, яке має значення s ознаки і значення x альтернативи. Cаst.type(x: choice (tag-type) of (alternative-list)): type, де type – це альтернативний тип даних у списку alternative-list, є значення type, яке є, якщо за значенням ознаки x вибрано альтернативу, для якої alternative-type є type; інакше – невизначене значення. Equal(x, y: choice (tag-type) з (alternative-list)): boolean є type.Equal(Cast.type(x), Cast.type(y)), де type – це альтернативний тип даних ви¬бра¬ної альтернативи, а type.Equal – це операція Equal для типу даних type, якщо Discriminant(x) і Discrminant(y) вибирають однакову альтернативу; інакше – false. В мовах програмування генератор типу даних Вибір розглядають як тип даних “об’єднання”, а іноді – як тип даних з варіантами. Наведений тут генератор подає “варіант запису” мов Паскаль та Ада і допускає “об’єднання” мови Сі, а схожа концепція “роз’єднаного об’єднання” підтримано з невеликою обмовкою. Так, тип мови Сі union { float a1; int a2; char* a3; } можна подати наступним чином:

choice ( state (a1, a2, a3)) of (
(a1): real, 
(a2): integer, 
(a3): characterstring).

Фактичний простір значень типу даних Ознака насправді є підтипом з простором значень, що складається тільки зі значень, які перетворюються на альтернативні типи даних за допомогою списку alternative-list. Набір значень ознаки, що з’являються явно або неявно у alternative-list, не потрібен для покриття простору значень типу даних Ознака. Підтипи типу даних Вибір – зазвичай типи даних Вибір з меншим списком альтернатив, у тривіальному випадку список зменшується до одного типу даних. Концептуальна операція Discriminant дає змогу визначати, яка альтернатива типу Вибір вибирається в цьому значенні. Інша корисна модель Вибору – це choice (field-list), де тільки одне поле подається значенням, а засоби розділу не специфіковано. В цій моделі опе¬рація IsField.field(x: choice (field-list)): boolean = true, якщо специфіковане поле field подано значенням х, і false – у протилежному випадку; замінює Discriminant з відповідними змінами на інші характеристичні опе¬ра¬ції. Вважається, що ця мо¬дель математично досконаліша (орієнтований граф відповідає І-графу поля у Record), про¬те на практиці або IsField не забезпечено (тоді користувачу треба визначати усі операції), або IsField реалізовано ярликом-значенням (IsField стає еквівалентною Discriminant).

4.4.2 Покажчик' Покажчик (pointer) генерує тип даних, кожне значення якого встановлює засоби посилання на значення типу даних Елемент. Значення типу даних Покажчик є атомарними. Простір значень – це атомарні значення неспецифікованого типу даних Стан, асоційовані з довільним значенням типу даних Елемент. Окреме значення null може належати простору, проте ніколи не асоціюється з жодним значенням типу даних Елемент. Властивості: невпорядкований, точний, нечисловий. Операції: Equal, Dereference. Egual(x,y:pointer(element)): boolean є true, якщо значення х і у ідентичні значенням неспецифікованого типу даних Стан, інакше – false. Dereference(x:pointer(element)): element, де х != null, є значенням типу даних Елемент, пов’язаним зі значенням х. Тип даних Покажчик визначає зв’язки між “неспецифікованим типом даних Стан” і типом даних Елемент. Багато значень типу даних Покажчик можуть відповідати одному й тому ж представнику типу даних Елемент; але певні представники типу даних Елемент можуть не відповідають жодному зі значень типу даних Покажчик. Однак уявлення про значення “неспецифікованого типу даних Стан”, з якими не пов’язаний жодний елемент значення, стосується реалізації, крім null, чиє значення “неcпецифікованого типу даних Стан” не відповідає жодному значенню типу даних Елемент і не належить простору типу даних Покажчик. Модель типу даних Покажчик дозволяє відслідковувати зміни у часі. Якщо х – це значення типу даних покажчик на (ціле), то х асоціюється зі значенням 0 в один момент часу і з 1 – в інший. З цього випливає, що такий покажчик також підтримує операцію, що зветься призначення (assignment), яка зв’язує (нове) значення типу даних е із значенням типу даних покажчик (е), змінюючи значення, повернене операцією для значення типу даних покажчик на е. Операція призначення необов’язково має бути характеристичною для типу даних Покажчик. Термін lvalue з’явився в деяких стандартах мов як “значення, яке посила¬ється на об’єкт або зону зберігання”. Оскільки об’єкт зберігання – це засіб асоціації, тому lvalue – тип даних Покажчик. Реалізаційне поняття машинна адреса – це значення типу даних Покажчик. Апаратна реалізація “засобів посилання на” значення типу даних Елемент – це зазви¬чай комірка пам’яті, що містить значення типу даних Елемент. Комірка має адресу як “значення неспецифікованого типу даних Стан”. Фізично комірка містить асоціацію між адресою (значення-покажчик) і значенням-елементом, яке зберігається у цій комірці. Операція розіменування Dereference застосовується до адреси, проте реалізується вибором з комірки пам’яті. Таким чином, адресу і комірку пам’яті не розрізнюють: значення-покажчик є одночасно коміркою й адресою, оскільки комірку можна обробляти тільки за допомогою її адреси. Ця комірка, яка є значенням-покажчиком, відрізняється від її вмісту, який є елементом-значенням. Поняття “змінна типу даних Т” використовують у мовах програмування і реалізують зазвичай у вигляді комірки, що містить значення типу Т. У стандартах мов часто розрізнюють поняття “адреса змінної” і “значення змінної”, тому може скластися враження, що змінною є сама комірка. Проте всі операції над такою змінною насправді оперують з “адресою змінної” як значенням LI-типу даних “покажчик на (Т)” або зі “значенням змінної” як значенням LI-типу даних Т. Отже, ці поняття – тільки об’єкти у моделі типу даних. Ці поняття детально розроблено у ISO/IEC 13886:1995, який зв’язує значення-покажчики з комірками (боксами) виконуваної програми.

Процедура Процедура (procedure) генерує LI-тип даних, кожне значення якго – оператор для значень інших типів даних, які звуть типами даних Параметр. Отже чином, тип даних Процедура охоплює набір усіх операцій над значеннями конк¬рет¬¬ної колекції типів даних. Усі значення типу даних Процедура концептуально атомарні. Складові типу даних Процедура – LI-типи даних Параметр, які пойменовані у списку параметрів parameter-list та відрізняється один від іншого, і значення завершення, перелічені у списку termination-list, якщо він існує. Значення типу даних Процедура – це функція, яка перетворює вхідний простір на підсумковий. Параметр зі списку parameter-list вважається вхідним, якщо містить покажчик напрямку in або inout. Вхідний простір – це результат векторного добутку просторів значень типів даних, специфікованих у списку вхідних параметрів. Параметр зветься підсумковий, якщо з’являється у списку parameter-list, а його оголошення містить покажчики напрямку out або inout. Нормальний підсумковий простір – це результат векторного добутку просторів значень типів даних всіх підсумкових параметрів, якщо вони існують, інакше – простір типу даних Пустий. Якщо немає списку termination-list, то підсумковий простір типу даних Процедура – нормальний підсумковий простір, а кожне значення р типу даних Процедура – функція, математично виражена у вигляді: p: I1 x I2 x ... x In -> R0 x R1 x ... x Rm , де Ik – простір значень типу даних k-го вхідного параметру, Rt – простір значень типу даних t-го підсумкового параметру, а Rn – простір значень поверненого параметра. Якщо termination-list зазначено, то кожне завершення пов’язане з альтернативним підсумковим простором, який є результатом векторного добутку просторів значень типів даних, специфікованих у parameter-types для параметрів зі списку завершення termination-list. Нехай Аj є альтернативний підсумковий простір j-ого завершення. Тоді Аj = Е1j х Е2j х ... Еmjj, де Екj – це простір значень параметричного типу даних k-го параметра із списку termination-list для j-го завершення. Нормальний підсумковий простір тоді стане альтернативним підсумковим простором, пов’язаним з нормальним завершенням А0, яке моделюється як таке, що має позначку “*normal”. Розглянемо усі завершення і “*normal” для подання значень неспецифікованого типу даних Стан ST. Тоді підсумковим простором типу даних Процедура є: ST х А0 | А1 | ... | АN). де А0 – нормальний підсумковий простір, Аk – альтернативний підсумковий простір k-го завершення. Кожне значення цього типу даних Процедура – це функція, подана у вигляді: p: I1 x I2 x ... x In -> ST x (А0 | А1 | ... | АN). Вхідний простір, нормальний і альтернативні підсумкові простори можуть бути пустими. Пустий простір моделюють підстановкою для пустого простору значень типу даних Пустий. Простір значень типу даних Процедура передбачає всі операції, які оперують колекцією значень, типи даних яких відповідають вхідним параметричним типам даних, і створюють колекцію значень, типи даних яких відповідають параметричним типам даних нормального або відповідного альтернативного підсумкового простору. Термін відповідають означає, що кожному параметричному типу даних у відповідно створеному просторі “колекції значень” відповідає тільки одне значення цього типу даних. Якщо вхідний простір пустий, то передбачено всі операції, що містять нульовий елемент для створення значення в підсумковому просторі. Властивості: невпорядкований, точний, нечисловий. Операції: Equal, Invoke. Наведені нижче визначення – це шаблони операторів Invoke та Equal для типу даних Процедура. Кожний тип даних Процедура має власний оператор Invoke, перший параметр якого є значенням типу даних Процедура, а решта вхідних параметрів, якщо вони є, мають типи даних у вхідному просторі цього типу даних Процедура, а його підсумковий список містить типи даних підсумкового простору типу даних Процедура. Invoke(x: procedure(parameter-list), v1: I1, ..., vn: In): record (r1: R1, ..., rm: Rm) є значення підсумкового простору, вироблене процедурою х, що оперує зі значеннями вхідного простору, які відповідають значенням (v1, ..., vn). Equal(x, y: procedure(parameter-list)): boolean : є true, якщо для кожної колекції значень (v1: I1, ..., vn: In), що відповідає значенню у вхідному просторі x і y, виконується одна з умов: – ані х, ані у не визначаються на (v1, ..., vn), – Invoke(х, v1, ..., vn) = Invoke(у, v1, ..., vn); – false – у інших випадках. Наведене спрощене визначення ігнорує ідею альтернативного завершення у разі залучення типів даних Процедура і Покажчик для списку параметрів. Повне визначення Invoke виходить за межі розглядання Стандарту і формується в основній частині ISO/IEC 13886:1996. Підтипи типів даних Процедура можна оголосити наступним чином: type P = procedure (in a: integer range (0..100), out b: typeX); type Q = procedure (in a: integer range (0..100), out b: typeY); type R = procedure (in a: integer, out b: typeY); Якщо X є підтипом Y, то можна сподіватись, що P є підтипом Q. Але integer range (0..100) є підтипом integer, тому R є підтипом P, а не навпаки. Загалом колекція процедур, які приймають довільні вхідні данні від більшого вхідного типу даних (integer), становить підмножину колекції процедур, яка може прийняти вхідні данні від обмеженішого вхідного типу даних (integer range (0..100)). Якщо потрібно, щоб процедура мала тип Р, то допускається, що вона застосовуватиметься до значень з діапазону integer range (0..100). Якщо процедуру типу R реально використовують, вона може гарантовано застосовуватись до якогось значення з integer range (0..100), оскільки цей діапазон є підтипом простору процедури R. Зворотне твердження невірне. Якщо потрібно, щоб процедура мала тип R, то передбачено її застосовування до довільного цілого значення, наприклад, до -1, і тому не можна використовувати процедуру типу Р, яка необов’язково має значення -1. У описі окремих значень типу даних Процедура в мовах програмування прийнято специфікувати імена параметрів як доповнення до параметричних типів даних. Ці ідентифікатори забезпечують засоби розрізнення функціональності окремих значень параметрів. Стаючи важливою для розрізнення одного значення типу даних Процедура від іншого, ця функціональність загалом не має значення для самого типу даних Процедура. Наприклад, Subtract(in a:real, in b:real, out diff: real) та Multiply(in a:real, in b:real, out prod: real) – значення типу даних procedure(in real, in real, out real), проте функціональність параметрів a і b не стосується двох значень процедури. Зазвичай в описі процедур у мовах програмування розрізнюють вхідні (input), вихідні (output), вхідні/вихідні (input/output) параметри, для імпорту інформації зі спільних ділянок обміну і для розрізнювання одного підсумкового значення з повернених значень через параметри і/або ділянки обміну. Можливість такого розрізнювання підтримано синтаксисом, але концептуально процедура оперує набором вхідних значень для отримання набору вихідних значень. Синтаксичне розрізнювання стосується методів переміщення значень у програмах, що виходить за межі ДСТУ 3901-99. Цей синтаксис використано в інших стандартах, що визначають такі механізми. Тут його використано для полегшення перетворення мовних конструктів. З наведеного визначення операції Invoke видно, що існує ізоморфізм між нормальним підсумковим простором типу даних Процедура і простором типу даних Запис. Аналогічно існує ізоморфізм між загальною формою підсумкового простору і простором типу даних Вибір, у якому тип даних Ознака стано¬вить неспецифікований тип даних Стан і кожна альтернатива, зокрема “нормальна”, має форму: завершення: альтернативний підсумковий простір (тип даних Запис).

Агрегатні LI-типи даних Запис, Набір.

Агрегатні LI-типи даних Послідовність, Портфель. Послідовність Послідовність (sequence) генерує тип даних, значення якого – впорядковані послідовності значень типу даних Елемент. Впорядкування значень невластиве цьому типу даних; одне й те ж значення може зустрічатися неодноразово у цій послідовності. Простір значеннь містить всі скінченні послідовності значень типу даних Елемент, включаючи пусті послідовності. Властивості: нечисловий, невпорядкований, точний тоді і тільки тоді, коли тип даних Елемент є точним. Агрегатні властивості: однорідний, змінного розміру, неунікальний, з непрямим доступом (за місцезнаходженням). Операції: IsEmpty, Head, Tail, Equal, Empty, Append. IsEmpty(x: sequence (element-type)): boolean є true, якщо послідовність x не містить жодних значень, інакше – false. Head(x: sequence (element-type)): element-type, де Not(IsEmpty(x)), є перше значення послідовності x. Tail(x: sequence (element-type)): sequence (element-type) є послідовність значень, сформована видаленням з послідовності х першого значення, якщо воно існує; Equal(x, y: sequence (element-type)): boolean є IsEmpty(y), якщо IsEmpty(x), інакше, якщо Head(x) = Head(y), то Equal(Tail(x), Tail(y)); інакше – false. Empty(): sequence (element-type) є послідовність, яка не містить значень. Append(x: sequence (element-type), y: element-type): sequence (element-type) є послідов¬ність, сформована доданням одного значення y у кінецб послідовності x. Послідовність відрізняється від Портфеля тим, що порядок її значень важливий і тому операції Head, Tail і Append, що залежать від місцезнаходження елементів, підтримуються замість операцій Select, Delete і Insert, які залежать від значення. Розширена операція: Concatenate (x, y: sequence (E)): sequence (E) є x, якщо IsEmpty(y); інакше Concatenate(Append(x, Head(y)), Tail(y)). Поняття послідовний файл (sequential file) як “послідовність значень вказаного типу даних, яку зазвичай зберігають на зовнішньому носії”, є реалізацією типу даних Послідовність. Портфель Портфель (bag) генерує тип даних, значення якого становлять колекції зразків значень типу даних Елемент. Численні зразки одного значення можна подавати у колекції; а порядок їхньої присутності у колекції несуттєвий. Простір значень – всі скінченні колекції зразків значень типу даних Елемент, у тому числі пуста колекція. Значення типу даних Портфель моделюють математичною функцією з простором типу даних Елемент, а діапазон – множина невід’ємних цілих чисел, тобто якщо b – це значенням типу даних Bag (E), то b:E->Z і для всякого значення e з простору значень E. Тут b(e) =0 означає, що “e не міститься у” b, а b(e)=n, де n – це додатне ціле число, означає, що “e міститься n раз у” b. Тоді простір значень типу даних Портфель містить усі розрізнювані функції b. Властивості: нечисловий, необмежений, точний. Агрегатні властивості: однорідний, змінного розміру, неунікальний, невпорядкований, з непрямим доступом. Операції: IsEmpty, Equal, Empty, Serialize, Select, Delete, Insert IsEmpty(x: bag (element-type)): boolean є true, якщо для всіх e з простору значень типу даних Елемент x(e) = 0, інакше – false. Equal(x,y: bag (element-type)): boolean є true, якщо для всіх значень e з простору значень типу даних Елемент x(e) = y(e), інакше – false. Empty(): bag (element-type) є така функція x, що для всіх e з простору значень типу даних Елемент x(e)= 0. Serialize(x: bag (element-type)): Sequence (element-type) є (), якщо IsEmpty(x), інакше таке значення послідовності s, що для кожного e з простору значень елементу e зустрічається у s рівно x(e) разів. Select(x: bag (element-type)): element-type = Sequence.Head(Serialize(x)). Delete(x: bag (element-type)), y: element-type: bag (element-type) є така функція z типу bag(element-type), що для всіх e != y, z(e) = x(e), якщо x(y) > 0, то z(y) = x(y) – 1, а якщо x(y) = 0, то z(y) = 0; тобто вказана колекція сформована видаленням одного зразка значення y (якщо таке існує) з колекції x. lnsert(x: bag(element-type), y: element-type): bag (element-type) є така функція z в bag (element-type), що для усіх e != y, z(e) = x(e) і z(y) = x(y) +1; тобто колекція сформована доданням зразка значення до колекції x.

Агрегатні LI-типи даних Послідовність, Портфель.

Агрегатні LI-типи даних Послідовність, Портфель. Послідовність Послідовність (sequence) генерує тип даних, значення якого – впорядковані послідовності значень типу даних Елемент. Впорядкування значень невластиве цьому типу даних; одне й те ж значення може зустрічатися неодноразово у цій послідовності. Простір значеннь містить всі скінченні послідовності значень типу даних Елемент, включаючи пусті послідовності. Властивості: нечисловий, невпорядкований, точний тоді і тільки тоді, коли тип даних Елемент є точним. Агрегатні властивості: однорідний, змінного розміру, неунікальний, з непрямим доступом (за місцезнаходженням). Операції: IsEmpty, Head, Tail, Equal, Empty, Append. IsEmpty(x: sequence (element-type)): boolean є true, якщо послідовність x не містить жодних значень, інакше – false. Head(x: sequence (element-type)): element-type, де Not(IsEmpty(x)), є перше значення послідовності x. Tail(x: sequence (element-type)): sequence (element-type) є послідовність значень, сформована видаленням з послідовності х першого значення, якщо воно існує; Equal(x, y: sequence (element-type)): boolean є IsEmpty(y), якщо IsEmpty(x), інакше, якщо Head(x) = Head(y), то Equal(Tail(x), Tail(y)); інакше – false. Empty(): sequence (element-type) є послідовність, яка не містить значень. Append(x: sequence (element-type), y: element-type): sequence (element-type) є послідов¬ність, сформована доданням одного значення y у кінецб послідовності x. Послідовність відрізняється від Портфеля тим, що порядок її значень важливий і тому операції Head, Tail і Append, що залежать від місцезнаходження елементів, підтримуються замість операцій Select, Delete і Insert, які залежать від значення. Розширена операція: Concatenate (x, y: sequence (E)): sequence (E) є x, якщо IsEmpty(y); інакше Concatenate(Append(x, Head(y)), Tail(y)). Поняття послідовний файл (sequential file) як “послідовність значень вказаного типу даних, яку зазвичай зберігають на зовнішньому носії”, є реалізацією типу даних Послідовність. Портфель Портфель (bag) генерує тип даних, значення якого становлять колекції зразків значень типу даних Елемент. Численні зразки одного значення можна подавати у колекції; а порядок їхньої присутності у колекції несуттєвий. Простір значень – всі скінченні колекції зразків значень типу даних Елемент, у тому числі пуста колекція. Значення типу даних Портфель моделюють математичною функцією з простором типу даних Елемент, а діапазон – множина невід’ємних цілих чисел, тобто якщо b – це значенням типу даних Bag (E), то b:E->Z і для всякого значення e з простору значень E. Тут b(e) =0 означає, що “e не міститься у” b, а b(e)=n, де n – це додатне ціле число, означає, що “e міститься n раз у” b. Тоді простір значень типу даних Портфель містить усі розрізнювані функції b. Властивості: нечисловий, необмежений, точний. Агрегатні властивості: однорідний, змінного розміру, неунікальний, невпорядкований, з непрямим доступом. Операції: IsEmpty, Equal, Empty, Serialize, Select, Delete, Insert IsEmpty(x: bag (element-type)): boolean є true, якщо для всіх e з простору значень типу даних Елемент x(e) = 0, інакше – false. Equal(x,y: bag (element-type)): boolean є true, якщо для всіх значень e з простору значень типу даних Елемент x(e) = y(e), інакше – false. Empty(): bag (element-type) є така функція x, що для всіх e з простору значень типу даних Елемент x(e)= 0. Serialize(x: bag (element-type)): Sequence (element-type) є (), якщо IsEmpty(x), інакше таке значення послідовності s, що для кожного e з простору значень елементу e зустрічається у s рівно x(e) разів. Select(x: bag (element-type)): element-type = Sequence.Head(Serialize(x)). Delete(x: bag (element-type)), y: element-type: bag (element-type) є така функція z типу bag(element-type), що для всіх e != y, z(e) = x(e), якщо x(y) > 0, то z(y) = x(y) – 1, а якщо x(y) = 0, то z(y) = 0; тобто вказана колекція сформована видаленням одного зразка значення y (якщо таке існує) з колекції x. lnsert(x: bag(element-type), y: element-type): bag (element-type) є така функція z в bag (element-type), що для усіх e != y, z(e) = x(e) і z(y) = x(y) +1; тобто колекція сформована доданням зразка значення до колекції x.

-


Агрегатні LI-типи даних Масив, Таблиця.

Агрегатні LI-типи даних Масив, Таблиця. Масив Масив (array) генерує тип даних, значення якого асоціюються з векторним добутком просторів одного або кількох скінченних типів даних, що звуться індексні типи даних, і простором значень типу даних Елемент, причому кожному значенню з простору індексного типу даних відповідає тільки одне значення типу даних Елемент. Кожний індекс задає впорядкований і скінченний точний тип даних, який можна вказувати діапазоном integer range(index-lowerbound.. index-upperbound), де index-lowerbound та index-upperbound – такі цілочислові значення, що index-lowerbound <= index-upperbound. Простір значень задають всі функції для векторного добутку просторів значень індексних типів даних із списку index-type-list (позначається index product space) і простору значень типу даних Елемент, так що кожне значення з index-product-space відповідає тільки одному значенню типу даних Елемент. Властивості: нечисловий, необмежений, точний тоді і тільки тоді, коли точний тип даних Елемент. Агрегатні властивості: однорідний, фіксованого розміру, неунікальний, доступ прямий, розмірність дорівнює числу індексних типів зі списку index-typе-list. Операції: Equal, Select, Replace. Select(x: array (index1,...,indexn) (element-type), y1:index1,...,yn: indexn): element-type є значення типу даних Елемент, для якого x асоціюється з (y1, ... , yn) у просторі index-product-space. Equal(x,y: array (index1,..., indexn) (element-type)):boolean є true, якщо для кожного значення (v1,..., vn) у просторі index-product-space Select(x, v1,..., vn) = Select(y, v1,..., vn), інакше – false; Replace(x: array (index1,..., indexn) (element-type), y1:index1,..., yn: indexn, z: element-type): array (index1,..., indexn) (element-type) є таке значення w типу даних Масив, що w: (y1, ..., yn) -> z, і для усіх значень p простору index-product-space, крім (y1, ..., yn), w: p->x(p); тобто Replace створює функцію, яка пов’язує z зі значенням (y1, ... , yn) та ідентична x. Узагальнений тип даних Масив є багатовимірним, число вимірів й самих індексних типів даних складають частину концептуального типу даних. Індексний простір index-product-space є невпорядкованим, хоча він обов’язково впорядкований за кожним виміром. Ця модель вибрана замість моделі “масиву масивів”, за якою масив має один впорядкований індексний тип даних і яка ніби спрощує перетворення в мовах програмування. Зауважимо, що type arrayA = array (1..m, 1..n) of (integer) визначає, що arrayA має бути двовимірним типом даних, тоді як type arrayB = array (1..m) of (array [1..n] of (integer)); визначає, що масив arrayB має бути одновимірним (з типом даних Елемент, що дорівнює array (1..n) of (integer) of integer). Це дозволяє мовам, в яких A[і][j] відрізняється від A[i,j], підтримувати різницю під час перетворення на LI-типи даних. Аналогічно мови з забороною конструкту A[i][j] можуть встановити обмеження для перетворення або обробляти конструкт A[i,j]. Одновимірний масив – простий випадок, коли кількість індексних типів даних дорівнює 1, а простір index-product-space є простіром значень одного індексного типу даних. Оскільки значення типу даних Масив становлять функції, тип даних Масив становить спеціальний випадок типу даних Процедура. У більшості мов програмування масиви – це концептуальні сукупності, а не процедури і мають обмеження, за яких функція подається послідовністю значень типу даних Елемент, а її розмір фіксований і дорівнює кардинальності простору index-product-space. Для визначення замінюваних подань масиву як послідовності значень елементів, раніше за все необхідно визначити функцію, яка перетворює простір index-product-space на тип даних Порядковий. Розглянемо одну з них. Нехай A – значення array(array(index1, ... ,indexn) типу даних Елемент. Для кожного індексного типу даних indexi задамо нижню lowerboundi і верхню upperboundi границі його простору значень. Визначимо операцію Mapi для перетворення індексного типу даних indexi на діапазон цілих Mapi(x: indexi): integer є: Mapi(lowerboundi) = 0; та Mapі(Successor, (x)) = Mapi(x) +1 для всіх x != upperboundi. Визначимо також константу: sizei=Mapi(upperboundi) – Mapi(lowerboundi) + 1. Тоді Ord(x1:index1, ..., xn: indexn): ordinal – це порядкове значення, що відповідає цілому значенню: 1+SUMM_i=1^n (Map_i(xi)) крапка П_j=1^n(size_(i+1)), де неіснуюче size_(n+1) дорівнює 1. У послідовності положення Ord(x1, ..., хn) займає A(x1,..., хn). Наприклад, оголошення Фортран-програми CHARACTER*1 SCREEN (80, 24) задає змінну SCREEN так, щоб вона мала LI-тип даних: array (1 ..80, 1..24) of character (unspecified) Операція Фортрану, що визначає елемент масиву, S = SCREEN (COLUMN, ROW) еквівалентна характеристичній операції Select(screen, column, row); а операція SCREEN(COLUMN, ROW) = S еквівалентна характеристичній операції: Replace(screen, column, row, S). Стандарт ISO/IEC 1539:1991 потребує наявності функції перетворення, яка дає різне подання послідовності обчислення індексів для визначення елементів масиву.


Таблиця Таблиця (table) генерує тип даних, значення якого становлять колекції значень з прос¬то¬ру добутку одного або кількох типів даних Поле; кожне значення з просто¬ру добутку задає асоціації між значеннями полів. Хоча типи даних Поле можуть бути невизначені, довільне значення типу даних Таблиця містить задане число асоціацій. У списку полів field-list подано ідентифікатори, кожному з яких відповідає тип даних Поле, який може бути довільним типом даних. Простір значень table (field-list) ізоморфний простору значень bag of (record(field-list)), так що усі скінченні колекції асоціацій, подані значеннями добутку, з простору значень усіх типів даних полів у списку field-list. Властивості: нечисловий, невпорядкований, точний тоді і тільки тоді, коли усі типи даних поля точні. Агрегатні властивості: неоднорідний, змінного розміру, неунікальний, невпорядкований, розмірність дорівнює двом. Операції: MaptoBag, MaptoTable, Serialize, IsEmpty, Equal, Empty, Delete, Insert, Select, Fetch. MaptoBag(x: table(field-list)): bag(record(field-list)) є ізоморфізм, що перетворює таблицю на Портфель записів. MaptoTable(x: bag (record(field-list))): table(field-list) є інверсія ізоморфізму MaptoBag. Serialize(x: table(field-list)): sequence(record(field-list)) = Bag.Serialize( MaptoBag(x)). IsEmpty (x: table(field-list)): boolean = Bag.IsEmpty(MaptoBag(x)). Equal (x, y: table(field-list)): boolean = Bag.Equal(MaptoBag(x)), MaptoBag(y)). Empty():table(field-list)=(). Delete(x: table(field-list): y: record(field-list)): table(field-list) =MaptoTable(Bag.Delete(MaptoBag(x), y)). Insert(x: table(field-list): y: record(field-list)): table(field-list) =MaptoTable(Bag.Insert(MaptoBag(x), y)). Select(x: table (field-list), criterion: procedure(in row: record(field-list)): boolean): table(field-list) = MaptoTable(z), де z – це значення bag, елементи якого точно ті ж значення запису record r в MaptoBag(x), для яких criterion(r) = true. Fetch(x: table(fteld-list)): record(field-list), дe Not(IsEmpty(x))= Sequence.Head(Serialize(x)). Таблиця визначається генератором, але синтаксис оголошення типу гене¬ра¬тора не дозволяє списку параметричних елементів бути списком змінної довжини для специфікації полів. Це визначення відповідає поняттю Таблиця згідно з ISO 9075:1990. В SQL “про¬це¬дура вибору” може вибирати за вхідні дані рядки з кількох таблиць, проте це є скоріше узагальненням операції вибору Select, ніж розширенням концепції типу даних Таблиця. Доступ до таблиці непрямий, через операції Fetch або MaptoBag. Доступ до таблиці іноді називають “ключовим”, оскільки загальне використання цієї структури даних задає “відношення”, у якому певне поле або поля позначають “ключами”, для яких значення всіх інших ключів називають залежними, зазначаючи у такий спосіб перетворення між векторним добутком просторів ключових значень і просторами значень інших полів. За термінологією баз даних таке відношення називається третьою нормальною формою. Специфікація цього перетворення, якщо вона задана, є складовою частиною стандарту мови SQL і виходить за межі ДСТУ 3901-99.


Оголошені LI-типи даних.

Оголошений LI-тип даних (defined) визначено за допомогою оголошення типу, інколи його звуть похідним. ДСТУ 3901-99 явно визначає набір узагальнених типів даних як рекурсивне застосування генераторів типів даних до примітивних типів даних. Далі визначено механізм оголошення, за допомогою якого нові типи даних і генератори можна отримати з типів даних і генераторів, іменованих і з заданими обмеженнями. Крім того, визначено механізм оголошення для іменованих значень і альтернативних завершень процедур типів даних. Механізми розширення набору LI-типів мають на меті задоволення потреб конкретних застосувань. Ці механізми спрямовано на виконання перетворень як дозвіл визначення типів даних і підтипів, що відповідають конкретним мовам програмування, і сприяють визначенню прикладних сервісних засобів через дозвіл визначення узагальнених типів даних. Оголошення типу визначає новий ідентифікатор типу для посилання на тип даних або генератор типів даних. Оголошення типу даних можна використовувати: - для перейменування наявного типу даних або заміни імені типу даних з ускладненим синтаксисом; - як компонент синтаксису визначення нового типа даних; - як компонент синтаксису визначення нового генератора типів даних Синтаксична нотація оголошення має вигляд: type <ідентифікатор типу> [ (<список формальних параметрів>) ] = [ new ] <опис типу> Разом із металінгвістичними змінними у кутових дужках, у цій нотації напівгрубим шрифтом виділено ключові слова і знаки власне оголошення. Решта знаків показують альтернативи конструювання самих оголошень. Кожне ім’я формального параметра може принаймні один раз з’явитися у описі типу, задаючи параметричні типи даних генераторів. див 22


Оголошення перейменувань, нових LI-типів даних та генераторів. Оголошення значень.

Оголошення перейменувань, нових LI-типів даних та генераторів. Оголошення значень. див 21 Оголошення перейменувань. Оголошення типу без ключового слова new задає синонім наявного типу даних. Посилаючись на ідентифікатор типу з такого оголошення, можна користуватися наявним LI-типом даних із зміненими фактичними параметрами, що відповідають формальним параметрам типу даних у оголошенні. Оголошення типів даних містять ключове слово new і не мають формальних параметрів, що визначні за допомогою нотації з ключовим словом type. Таке оголошення визначає простір нового LI-типу даних, який відрізняється від якогось іншого LI-типу даних. Якщо подано список формальних параметрів, то оголошення використано для ідентифікації родини типів даних, параметризованих за допомогою формальних параметрів. Існує взаємно-однозначна відповідність між значеннями нового типу даних і наявного типу даних, використаного у оголошенні. Характеристичні операції і довільна інша властивість нового типу даних, яку не можна отримати з простору значень, специфікується за допомогою оголошення для завершення визначення нового (родини) типу даних. Характеристичні операції можуть вибиратися для (родин) типів даних, описаних безпосередньо, або визначатися певним алгоритмічним шляхом з використанням цих операцій. Мета оголошення new – видалити синтаксичні і семантичні відмінності між типами даних з ідентичними просторами значень. Не вимагається, щоб характеристичні операції нового типу даних відрізнялися від зазначених у описі типу. Можливо, семантична відмінність, обумовлена застосуванням, надто складна для його виявлення у базових характеристичних операціях. Наприклад, прискорення і швидкість можуть мати ідентичні обчислювальні простори значень та операції (тип даних real), проте повністю різні фізичні значення. Оголошення нових генераторів містять ключове слово new і хоча б один формальний параметр, для якого існує опис із ключовим словом type. Оголошення генератора зазначає, що новий генератор з вказаним ідентифікатором типу, параметризованим за допомогою formal-type-parameters, і асоційованим алгоритмом побудови простору значень, що визначаються за допомогою type-definition. Характеристичні операції і інші властивості заданого типу даних, які отримує генератор і не можна вибрати з простору значень, зазначено в оголошенні генератора для завершення визначення генератора нового типу даних. Параметри formal-type-parameters, для яких formal-parameter-type є "type", будуть па¬ра¬метричними типами даних. Оголошення генератора супроводжується наявністю обме¬жень для параметричних типів даних і для значень інших формальних параметрів, якщо такі є. Оголошення значень встановлює ідентифікатор для посилання на значення певного типу даних і має нотацію синтаксису: value <ідентифікатор> : <специфікатор LI-типу> = <значення> . У такий спосіб оголошують ідентифікатор для нотації значення типу даних, визначеного специфікатором LI-типу даних. Оголошення завершень задає ідентифікатор для звернення до спільної ділянки альтернативних результатів багатьох процедур і виконавчих процедур типів даних і визначає колекцію параметрів, що повертають позначку завершення: termination <ідентифікатор> [ (<параметри завершення>) ] Імена параметрів у списку різні. Жодний ідентифікатор не оголошують більше одного разу. Оголошення завершень – це лише синтаксичний об’єкт. Усю семантику отримано використанням у якійсь загальносистемній процедурі або виконавчій процедурі типу даних.


Оголошені LI-типи даних Натуральний, Модуль, Біт, Бітовий рядок, Символьний рядок.

Оголошені LI-типи даних Натуральний, Модуль, Біт, Бітовий рядок, Символьний рядок. Далі у колекції LI-типів даних описано оголошення, які найчастіше зустрічаються і обробляються як примітивні типи даних поширеними мовами програмування. Для визначення такого типу даних використано шаблон, у якому наведено оголошення, опис простору значень і параметричних значень, якщо такі є, характеристичні операції та властивості типу даних (див. табл. 35), які вказують на його допустимість як компонента типу даних у генераторах типів даних: числовий або нечисловий, наближений або точний, впорядкований або невпорядкований і, якщо впорядкований, то обмежений або ні. Якщо тип даних оголошено для того, щоб мати специфічний синтаксис значень, нотація значень нового типу даних може бути двох видів, : - коли синтаксис задає нотацію для значень типу даних і має власну інтерпретацію; - коли синтаксис явних значень типу даних, визначеного за допомогою оголошення типу, задає нотацію значень нового типу.


Таблиця 35 – Властивості оголошених типів даних


Натуральний (natural number) – тип даних натуральних чисел з підмножиною простору невід’ємних значень LI-типу даних Цілий: type naturalnumber = integer range range (0..*); Властивості: впорядкований, точний, числовий, необмежений згори, обмежений знизу. Характеристичні операції LI-типу даних Цілий, крім Negative, яка скрізь не визначена. Модуль (modulo) – це родина типів даних, отриманих з типу даних Цілий заміною операцій на арифметичні операції, що використовують модулі величин: type modulo (modulus: integer) = new integer range (0...modulus) excluding (modulus); Параметричне значення modulus – ціле число, для якого 1 <= modulus та яке звуть модулем. Простір значень – всі такі цілі числа v, що 0 <= v та v < modulus. Властивості: впорядкований, точний, числовий. Операції: Equal, InOrder LI-типу даних Цілий; Add, Multiply, Negate. Add(x,y: modulo (modulus)): modulo (modulus) = integer.Remainder (integer.Add(x,y), modulus). Nеgate(x,y: modulo (modulus)): modulo (modulus) є таке значення з простору, що Add(x, y) = 0. Multiply(x,y: modulo (modulus)): modulo (modulus)=integer.Remainder(integer.Multiply(x,y), modulus). Біт як тип даних подає скінченне поле, що складається з двох символів, позначених “0”, ідентичних додаванню, і “1”, ідентичних множенню: type bit = modulo (2); Параметричні значення: відсутні. Властивості: впорядкований, точний, числовий, обмежений. Операції типу даних Модуль: Equal, InOrder, Add, Multiply. Бітовий рядок (Bit string) – це тип даних символьних рядків змінної довжини, складкних з двійкових чисел: type bitstring = new sequence of (bit); Простір значень містить скінченні послідовності значень типу даних Біт. Перше значення в послідовності вказується самим лівим бітом, друге – наступним тощо. Якщо немає жодного бітового значення, тоді це послідовність нульової довжини. Властивості: невпорядкований, точний, нечисловий. Операції LI-типу даних Послідовність: Head, Tail, Append, Equal, Empty, lsEmpty. Узгоджено, що бітовий рядок має бути типом даних Послідовність, а не Масив, в якому значення можуть мати змінну довжину. Саме тому опис і властивості Бітового рядка ідентичні послідовності бітів. Проте Бітовий рядок виступає як new для сприяння перетворенням, що потребують спеціальних властивостей цього типу даних. Символьний рядок (Character string) – це родина типів даних, які подають рядки символів, що складаються з символів стандартного набору: type characterstring (repertoire: objectidentifier) = new sequence of (character (repertoire)), Параметричне значення repertoire зазвичай задають системним ідентифікатором репертуару символів як комунікаційного об’єкта відкритих систем. Репертуар символів складається з: string-character = non-quote-character | added-character | escape-character . non-quote-character = letter | digit | underscore | special | apostrophe | space . added-character = визначено не ДСТУ 3901-99, а іншими стандартами . Кожний символ рядка string-character позначає один елемент набору символів repertoire і у конкатенації з сусідніми задає послідовність символів, що закінчується escape-character. Якщо відсутній взагалі string-character, то задане значення становить послідовність нульової довжини. Простір значень містить колекцію скінченних послідовностей string-character з набору символів, позначеного repertoire. Властивості: невпорядкований, точний, нечисловий, злічимий. Операції LI-типу даних Послідовність: Head, Tail, Append, Equal, Empty, lsEmpty. Символьний рядок визначено послідовністю, а не масивом, щоб його значення мали змінну довжину. Відсутній стандарт на порівняння послідовностей, хоча стандарти наборів символів вимагають спеціального порівняння послідовностей. У застосуваннях, що вимагають відношення порядку для рядка символів і використовують набори символів, для яких відсутні стандарти на порівняння послідовностей, необхідно створювати типи даних або ідентифікатор репертуару, який посилається на потрібний набір символів і обумовлює порівняння послідовності. Деякі мови розрізняють як окремі об’єкти типи даних, подані символьними рядками за спеціальним синтаксисом. Наприклад, Лісп має динамічне визначення “s-виразів”; в Коболі валюта подається як “редагований числовий рядок”; деякі мови допускають “ідентифікатор” типу даних, значення якого обробляється як заданий користувачем об’єкт, якому надаватимуть певні властивості. У багатомовному середовищі такі об’єкти можна обробляти лише як типи даних Символьний рядок й, отже, їх оголошують як LI-типи даних “отримані із символьного рядка”: type identifier = new characterstring(repertoire) size(1..maxidsize); type editcharacter = character({iso standard 646}) selecting ('0'..'9', '.', ',', '+', '-', '$', '#', '*'); type numericedited = new sequence of (editcharacter); У кожному випадку ключове слово new використано для позначення незвичної характеристичної операції, правил форматування чи інтерпретації.

Оголошені LI-типи даних Часовий інтервал, Октет, Рядок октетів, Приватний, Ідентифікатороб’єкта.

Оголошені LI-типи даних Часовий інтервал, Октет, Рядок октетів, Приватний, Ідентифікатороб’єкта Часовий інтервал (Time interval) – це родина типів даних, яка подає час, що сплив, у секундах або частках секунди, на противагу Li-типу даних Дата/Час, який подає поточний момент часу. Цей оголошений тип даних отримано з типу даних Масштабований обмеженням операцій: type timeinterval(unit:timeunit, radix: integer, factor: integer) = new scaled (radix, factor); type timeunit = state (year, month, day, hour, minute, second); Параметричні значення: додатна ціла величина Radix, ціле число factor. Простір значень складають усі числа, кратні одній Radix -factor зазначеної одиниці часу. Властивості: впорядкований, точний, числовий, необмежений. Операції: Equal, Add, Negate LI-типу даних Масштабований; ScalarMultiply. Нехай scaled.Multiply() – операція множення, визначена для типу даних Масштабований. Тоді ScalarMultiply(x: scaled(r,f), y: timeinterval(u,r,f)): timeinterval(u,r,f)) = scaled.Multiply(x,y). Наприклад, timeinterval(second, 10, 3) – це тип даних минулого часу у мілісекундах. Октет (Octet) – 8-бітовий код, використовуваний у наборах символів і для персонального кодування: type octet = new integer range (0..255); Простір значень містить восьмибітні коди, подані невід’ємними цілими числами з діапазону (0, 255). Властивості: впорядкований, обмежений, точний, нечисловий, скінченний. Операції LI-типу даних Цілий: Equal, InOrder. Октет використовують у мережних протоколах і для визначення характеристичних операцій, які перетворю¬ють значення Octet на Bitstring або бітовий масив; відсутні погодження про те, який біт – перший у бітовому рядку або як у масиві задається бітове перетворення. Рядок октетів (Octetstring) – це тип даних змінної довжини, що використовує для кодування восьмибітні коди: type octetstring = sequence of (octet); Простір значень охоплює колекцію всіх значень як скінченну послідовність кодів, поданих октет-значеннями, у тому числі і пусту послідовність. Властивості: невпорядкований, точний, нечисловий, злічимий. Операції LI-типу даних Послідовність: Head, Tail, Append, Equal, Empty, Isempty. Серед інших використань Рядка октетів – це подання символьного рядка, коли в ньому треба маніпулювати кодами. Зокрема рядку октетів віддається перевага, коли значення можуть містити коди, не пов’язані із символами якогось стандартного репертуару. Приватний (private) як тип даних має простір значень, визначений застосуванням, і набір операцій, які навмисно приховано під час обробки заданих об’єктів: type private(length: naturalnumber) = new array (1..) of (bit); Параметричне значення – додатне ціле число length. Властивості: невпорядкований, точний, нечисловий. Операції: відсутні. Відсутні позначки для значень типу даних Приватний. Тип даних Приватний введено для забезпечення засобів, за допомогою яких: -об’єкт нестандартного типу даних із складною внутрішньою структурою можна передавати між двома системами, що тлумачать тип за допомогою сервісу, який погоджено із стандартом без інтерпретації внутрішньої структури; -значення типу даних, яке не має змісту для усіх систем, крім одного оброблювача, можна подавати кінцевому користувачеві для наступного застосування, наприклад, у інтерфейсі. Довжина і порядок бітів завжди повинні відповідним чином підтримуватись всіма посередниками. Тип даних Приватний може закодувати провайдер (або його агент) і декодувати одержувач (або його агент). Тоді тип даних Приватний буде кодувати і декодувати тільки фахівець, а решта, насамперед кінцеві користувачі, працюватимуть з ним як з бітовим масивом. Ідентифікатор об’єкта (objectidentifier) – це тип даних "ідентифікаторів об’єктів", які однозначно ідентифікують об’єкти в комунікаційних протоколах відкритих систем взаємодії (Open System Interconnection), використовуючи формальну структуру, визначену в Нотації абстрактного синтаксису (ISO/IEC 8824:1990): type objectidentifier = new sequence of (objectidentifiercomponent) size(1..*); type objectidentifiercomponent= new integer range(0..*); Простір значень ізоморфний кардинальним числам, але зміст кожного з них визначається його положенням у значенні ідентифікатора об’єкта. Простір значень цього типу містить всі непусті скінченні послідовності значень компонентів objectidentifiercomponent. Значення кожного компонента у ідентифікаторі об’єкта визначено послідовністю значень, які йому передують, згідно з ISO/IEC 8824:1990 та асоціюється з реєстраційними номерами схем кодування текстових масивів, регламентованих ISO 10646, ISO 2375, ISO 7350, ISO 10036. Послідовність, що складається з одного значення типу даних objectidentifier, однозначно ідентифікує об’єкт. Властивості: невпорядкований, точний, нечисловий. Операції: Append LI-типу даних Послідовність, Equal, Length, Detach, Last. Length(x: objectidentifier): integer є число значень компонентів objectidentifier у послідов¬ності x. Detach(x: objectidentifier): objectidentifier, де Length(x)>1 є objectidentifier, сформований шляхом видалення останнього значення компонента objectidentifier з послідовності x.

Last(x: objectidentifier): objectidentifiercomponent є значення objectidentifiercomponent, яке становить останній елемент послідовності x.

Equal(x,y: objectidentifier):boolean = якщо Not(Length(x) = Length(y)), то – false, інакше, якщо Not(objectidentifiercomponent.Equal(Last(x), Last(y))), то – false, інакше, якщо Length(x) = 1, то – true, інакше Equal(Detach(x), Detach(y)). IsEmpty, Head і Tail з Sequence несуттєві для типу даних objectidentifier. Тому Length і Equal визначено тут, хоча їх можна отримати внаслідок операцій LI-типу даних Послідовність. Objectidentifier обробляють як примітивний тип даних багато застосувань, проте для застосування механізму визначення його простору значень деякими такими застосуваннями, наприклад, Directory Services для OSI, необхідно, щоб значення були списками доступних елементів типу даних objectidentifier.


Оголошені генератори: Стек, Дерево, Циклічно переліковний, Необов’язковий.

Оголошені генератори: Стек, Дерево, Циклічно переліковний, Необов’язковий 4.6.2 Оголошені генератори Далі описано оголошення для колекції часто використовуваних генераторів, які можна отримати з LI-типів даних і генераторів. У шаблоні визначення такого генератора наведено: - оголошення типу для генератора типу даних; - кількість і обмеження накладені на параметричні типи даних, і параметричні значення, використані процедурою генерації; - формальне визначення підсумкового простору значень; - властивості підсумкового типу даних, які вказують на його прийнятність як компонента типу даних у визначеному генераторі: числовий або нечисловий, наближений або точний, впорядкований або невпорядкований і, якщо впорядкований, то обмежений чи ні. - характеристичні операції для підсумкового типу даних, які відповідають генератору. Стек (Stack) отримано з LI-типу даних Послідовність заміною характеристичної операції Append на операцію вставляння Push, яка вводить значення до початку послідовності, а не до кінця, як це робить операція Append: type stack (element:type) = new sequence of (element); Element може бути довільним типом даних. Простір значень містить всі скінченні послідовності значень типу даних Елемент. Властивості: нечисловий, невпорядкований, точний тоді і тільки тоді, коли тип даних Елемент точний. Агрегатні властивості: однорідний, змінного розміру, неунікальний, непрямий доступ (за місцезнаходженням), що допускає впорядкування. Операції: lsEmpty, Equal, Empty LI-типу даних Послідовність ; Top. Pop, Push. Top(x: stack (element)): element = sequence.Head(x). Рop(x: stack (element)): element = sequence.Tail(x). Push(x: stack (element), y: element): stack (element) – це послідовність, що формується додаванням одного значення у до початку послідовності х. Дерево (Tree) – це генератор рекурсивних спискових структур: type tree (leaf: type) = new sequence of (choice (state(atom, list)) of (atom: leaf, (list): tree(leaf))); Тут leaf буде довільним LI-типом даних. Простір значень містить всі скінченні рекурсивні послідовності, у яких кожне значення є або значенням типу даних leaf, або (під)деревом. Загалом кожне “термінальне” значення є значенням типу даних leaf. Властивості: невпорядкований, нечисловий, точний тоді і тільки тоді, коли тип leaf є точним, злічимий. Операції: lsEmpty, Equal, Empty, Head, Tail LI-типу даних Послідовність; Join. Для спрощення визначення операцій представники tree_member типу даних Дерево введено за допомогою наступного оголошення: type tree_member(leaf: type) = choice(state(atom, list)) of ((atom): leaf, (list): tree(leaf)); Тут tree_member(leaf) є типом даних Елемент LI-типу даних Послідовність, на якому ґрунтується тип даних Дерево. Join(x: tree(leaf), y: tree_member(leaf)): tree(leaf) є послідовність, у якої Head (перший елемент) є значенням y, а Tail – це всі елементи послідовності х. Дерево – агрегатний тип даних, що формально становить послі¬дов¬ність tree_member, а значення якого – однорідні сукупності значень листя leaf. Циклічно переліковний (cyclic enumerated) як генератор у такий спосіб перевизначає операцію прямування для переліковних типів даних, що наступне за останнім значенням стає першим значенням: type cyclicenumerated of (base: type) = new base; Тут base означає LI-тип даних Переліковний. Простір містить всі значення v базового LI-типу даних Переліковний. Властивості: впорядкований, точний, нечисловий. Операції: Equal, InOrder базового LI-типу даних; Successor. Нехай base.Successor задає операцію Successor, визначену для базового типу даних. Successor(x: cyclic of (base)): cyclic of (base) є, якщо для всіх y простору значень base вірно Or(Not(InOrder(x.y)), Equal(x,y)), значення z у просторі base таке, що для всіх у простору Or(Not(InOrder(y,z)), Equal(y,z)); інакше base. Successor(x). Необов’язковий (optional) як генератор ефективно додає нульове (пусте) значення до простору значень базового типу даних: type optional(base: type) = new choice (boolean) of ((true): base, (false): void); Тут base означає довільний LI-тип даних. Простір значень містить всі значення v базового типу даних плюс “нульове значення” LI-типу даних Пустий. Цей тип даних ізоморфний набору пар: { (true, v) | v є base} union { (false, nil) }, що моделюється простором значень LI-типу даних Вибір. Забезпечено всі властивості базового типу даних, крім підтримуваних для “нульових” значень. Операції IsPresent(=Discriminant from Choice); всі операції над базовим типом даних змінюються, як зазначено нижче: IsPresent(x: optional(base)): boolean = Discriminant(x); Усі унарні операції у формі Unary-op(x: base): result-type визначено на основі optional(base) наступним чином. Unary-op(x: optional(base)): result-type є, якщо IsPresent(x), то Unary-op(Cast.base(x)), інакше – не визначено. Усі бінарні операції у формі Binary-op(x, y:base): result-type визначено на основі optional(base) наступним чином. Binary-op(x, y: optional(base)): result-type є, якщо And(IsPresent(x), IsPresent(y)), то Binary-op(Cast.base(x), Cast.base(y)), інакше – невизначено. Інші операції визначено аналогічно. Усі необов’язкові типи властиві таким типам об’єктів, як параметр процедури або поле запису, що в деяких випадках можуть не мати значень. Наприклад, LI-тип даних Запис, що містить необов’язкові (іноді не подані або “невизначені”) значення, можна оголосити: record ( required_name: characterstring, optional_value: optional(integer)); Параметр процедури, який тільки іноді задається, можна оголосити так: procedure search(in t: T, in tableT: sequence of (T), in index: optional(procedure(in i: integer, in j: integer): integer)): boolean; Параметр index, який є функцією індексування для tableT, не завжди задають, тому він може мати “нульове значення”.


Прив’язка LI-типів даних як їхні зовнішнє, внутрішнє й обернене внутрішнє перетворення.

Прив’язка LI-типів даних як їхні зовнішнє, внутрішнє й обернене внутрішнє перетворення. Перетворення Визначимо загальну форму і вимоги до перетворення (мapping) на LI-типи даних типів даних конкретних мов програмування. Вважається, що внутрішні типи даних мови включають інформаційний тип і структурні визначення, які можна виразити цією мовою, зокрема описуючи природу об’єктів як примітивів мови. Подібно до LI-типів даних типи мови розподілятись на примітивні типи даних і генератори типів даних. Припускають, що примітивні типи мови – це типи об’єктів, які за семантикою мови не згенеровано з інших внутрішніх типів даних. Генератори типів мови – це мовні конструкти, які можна використати для створення нових типів даних, об’єктів з новими типами даних або статичними внутрішніми відношеннями об’єктів. У ДСТУ 3901-99 визначено природну мову для формальної ідентифікації точного подання се¬ман¬тики LI-типів даних. Подання перетворення між внутрішніми типами мови і LI-типами даних – це концептуальна ідентифікація семантично еквівалентних позначень у двох мовах. Існує тільки два види перетворень між внутрішніми типами мови та LI-типом даних: - перетворення з внутрішніх типів мови на LI-типи даних зветься зовнішнім; - перетворення з LI-типів даних на внутрішні типи даних мови має назву внутрішнє. У ДСТУ 3901-99 не визначено точну форму перетворення, оскільки її деталі залежать від мови. Визначимо вимоги для інформаційного змісту внутрішнього та зовнішнього перетворень і умови прийнятності таких перетворень. Перетворення не застосовують до програмних модулів або службових специфікацій без¬посередньо, оскільки вони маніпулюють об’єктами, які мають конкретні типи даних, висловлені якоюсь мовою або мовами. Типи даних програмного модуля або сер¬віс¬ної специфікації можна описати безпосередньо як LI-тип даних або виходити з внут¬ріш¬нього або зовнішнього перетворення мови, якою написані модуль або специфікація. Подання перетворення значень з внутрішнього подання на проміжне, пов’язане з використанням LI-типів даних, не регламентовано ДСТУ 3901-99, проте може складати фрагмент стандартів, які посилаються на ДСТУ 3901-99. Зовнішнє перетворення Зовнішнє перетворення для примітивного внутрішнього типу даних визначає синтаксичні та семантичні мовні конструкції і відношення, які спільно та унікально подають цей внутрішній тип даних і пов’язують його з відповідним LI-типом даних. Зовнішнє перетворення для генератора внутрішнього типу даних визначає синтаксичні та семантичні конструкції і відношення мови, які спільно та унікально подають цей генератор внутрішнього типу даних і пов’язують цей генератор з відповідним генератором LI-типу даних. Колекція зовнішніх перетворень для типів і генераторів мови складає зовнішнє перетворення мови і має наступні властивості: - а) для кожного примітивного згенерованого зовнішнього типу даних перетворення пов’язується з одним відповідним LI-типом даних; - b) для кожного внутрішнього типу даних перетворення визначає зв’язок між кожним до¬пус¬тимим значенням внутрішнього типу і еквівалентним значенням відповідного LI-типу даних; - c) для кожного значення кожного LI-типу даних, що беруть участь у перетвореннях, перетворення визначає, чи існує довільне значення якогось внутрішнього типу даних, що перетворюється на LI-тип даних і, якщо таке існує, то яке саме це значення. Відсутні вимоги на те, які примітивні внутрішні типи треба перетворювати на примітивні LI-типи даних. ДСТУ 3901-99 забезпечує різноманітність концептуальних механізмів для створення згенерованих LI-типів даних з примітивних або попередньо створених типів даних. Внутрішні типи даних конструюють за допомогою генератора з колекції внутрішніх параметричних типів даних і обов’язково перетворюють на LI-типи даних, згенеровані з застосуванням перетвореного генератора до перетворених параметричних типів даних. Таким чином, властивість (а) можна задовольняти для внутрішніх згенерованих типів даних. Концептуальне перетворення на LI-типи даних може бути неоднозначним. Перетворення має документувати аномалії щодо ідентифікації внутрішніх типів даних з LI-типами даних, особливо для тих значень, які відрізняються у даній мові, але не відрізняються у LI-типі даних, і значень LI-типу даних, недоступних для мови. Крім того, зовнішнє перетворення використовують для ідентифікації внутрішнього типу даних і конкретного LI-типу даних, оскільки вимагається визначення операцій або подань для LI-типів даних, зазначених іншим стандартом для його правильного застосування до внутрішнього типу даних. Зовнішнє перетворення можна застосовувати для гарантії, що інтерфейс між двома програмними одиницями адекватно забезпечує третій сервісний засіб щодо оточення мови. Внутрішнє перетворення Внутрішнє перетворення для примітивного LI-типу даних або окремого згенерованого LI-типу даних пов’язане з окремим внутрішнім типом даних, визначеним синтаксичними і семантичними конструкціями і відношеннями мови, які спільно та унікально визначають цей внутрішній тип даних. Таке перетворення визначає обмеження для параметричних значень родини LI-типів даних, які вилучають представників цієї родини з даного перетворення. Різні представники родини LI-типів даних можна перетворювати на різні внутрішні типи даних. Внутрішнє перетворення для генератора LI-типів даних пов’язує генератор LI-типу даних з генератором внутрішнього типу даних, визначеного синтаксичними і семантичними конструкціями і відношеннями мови, які спільно та унікально визначають цей генератор внутрішнього типу даних. Таке перетворення визначає обмеження для параметричних значень будь-якого генератора LI-типів даних, які вилучають відповідні класи згенерованого типу даних з даного перетворення. Аналогічний генератор LI-типу з іншими параметричними типами даних можна перетворювати на інший генератор внутрішнього типу даних. Внутрішнє перетворення для LI-типів даних пов’язує LI-тип даних з внутрішнім типом даних, над якими можна виконати усі характеристичні операції LI-типів даних. Колекція внутрішніх перетворень для LI-типів даних і генераторів на внутрішні типи мови і генератори складає так зване внутрішнє перетворення мови і має наступні властивості: - для кожного LI-типу даних (примітивного або згенерованого) перетворення встановлює, чи буде LI-тип даних підтримано мовою і, якщо буде, то зазначає відповідний тип мови; - для кожного LI-типу даних перетворення визначає відношення між кожним допустимим значенням LI-типу даних та еквівалентним значенням внутрішнього типу мови; - для кожного значення внутрішнього типу мови перетворення визначає, чи буде це значення образом (після перетворення) якогось значення LI-типу даних і, якщо це має місце, то які значення і якого LI-типу даних перетворюються у такий спосіб. Згенерований LI-тип даних, який не отримано після перетворення примітивного типу даних, і чиї параметричні типи даних допустимі (відповідають обмеженням для перетворення генератора типу даних), обов’язково перетворюється на внутрішні типи мови, зконструйовані застосуванням перетворених генератором внутрішніх типів на перетворені внутрішні параметричні типи. Коли примітивний або згенерований LI-тип даних перетворюється на тип даних мови, прямо або непрямо з перетворенням генераторів, асоційований внутрішній тип мови підтримує семантику LI-типу даних. Доведення цієї підтримки – виконання характерис¬тич¬них операцій над внутрішнім типом мови. Мова не вимагає підтримувати характе¬рис¬тичні операції прямо (операторами, вбудованими функціями або подібними засобами), проте характерні функції мають концептуально підтримувати внутрішні типи мови. Або має існувати можливість писати процедури мовою, яка виконує характеристичні операції над об’єктами пов’язаного внутрішнього типу, або стандарт мови вимагає такої підтримки щодо перетворень його внутрішніх типів на інші подання або мови програмування. Перетворення на внутрішні типи мови може не бути взаємно однозначним. Тому треба документувати аномалії у зв’язках внутрішніх типів мови з LI-типами даних, особливо для тих значень, які відрізняються у LI-типі даних, але не відрізняються у мові, і значень внутрішнього типу мови, недоступних у інтерфейсах, що використовують LI-типи даних. Внутрішнє перетворення мови програмування використовують як гарантію того, що інтерфейс між двома програмними одиницями, визначений у термінах LI-типів даних, можуть адекватно використовувати програми, написані цією мовою, за допомогою характерних для мови, а не для застосування програмних засобів. Обернене внутрішнє перетворення Внутрішнє перетворення LI-типу даних на внутрішні типи мови визначає конкретний набір значень внутрішніх типів даних, який буде образом LI-типу даних у заданій мові. Обернене внутрішнє перетворення для LI-типу даних перетворює значення внутрішніх типів мови, які складають його образ, на відповідні значення LI-типу даних, використовуючи відповідність, яку встановлено внутрішнім перетворенням. Щоб обернене внутрішнє перетворення не було неоднозначним, внутрішнє перетворення кожного LI-типу даних має бути взаємно однозначним. Це формалізовано наступним чином: - якщо а становить значення LI-типу даних і внутрішнє перетворення перетворює а на значення а’ якогось внутрішнього типу мови, то внутрішнє перетворення не перетворює довільне значення b того ж LI-типу даних на а’, крім випадку, коли b = а; - якщо а становить значення LI-типу даних і внутрішнє перетворення перетворює а на а’ якогось внутрішнього типу мови, то обернене внутрішнє перетворення перетворює а’ на а; - якщо а становить значення LI-типу даних, яке не перетворюється на жодне значення відповідного внутрішнього типу мови, то не існує жодного такого значення а’ якогось внутрішнього типу мови, що обернене внутрішнє перетворення перетворює а’ на а. Обернене внутрішнє перетворення для мови становить колекцію обернених внутрішніх перетворень LI-типів даних. Якщо інтерфейс між двома програмними одиницями визначено у термінах LI-типів даних, то інтерфейс можуть використовувати програмні одиниці, написані різними мовами і підтримані сервісним засобом, який не розуміє мови оточення. Внутрішнє перетворення для кожної мови програміст використовує в цій програмній одиниці для вибору прийнятних внутрішніх типів мови і подання значень в інтерфейсі. Потім ці значення надсилає одна програма після оберненого внутрішнього перетворення для її мови для перетворення внутрішніх значень на відповідні значення LI-типу даних і приймає інша програма, що використовує внутрішнє перетворення значень LI-типу даних, що передані підходящім внутрішнім значенням. Реальна передача інформації може включати три програмних засоби: один – для перетворення між формою відправника і формою обміну, що автоматизує обернене внутрішнє перетворення; друге – для передачі обмінної форми, заснованої на LI-типах даних; а третє – для перетворення форми обміну на внутрішню форму одержувача. Так можна автоматизувати внутрішнє перетворення. Жодні з цих проміжних засобів не залежать від використаного інтерфейсу. Використовуючи LI-типи даних щодо мови програмування, можна реалізувати інтерфейс, який підтримує LI-типи даних без обмежень.


Реалізаційні нотації LI-типів даних Розмір пам’яті, Режим, Ознака, Форма.

Реалізаційні нотації LI-типів даних Розмір пам’яті, Режим, Ознака, Форма.

Анотація – це інформаційна одиниця опису, приєднана до специфікатора типу, компонен-та типу даних або значення, для характеристики аспекту подання, змінних або операцій, пов’язаних зі значеннями типу даних, компонента або значення у конкретному контексті. У ДСТУ 3901-99 не задано синтаксис або семантику анотацій. Загальноприйняті угоди для місцезнахо-дження анотацій полегшують задачу читача щодо визначення об’єкта, якого стосуться анотація у разі її використання, і для визначення контексту, в якому її слід використовувати. Розглянемо ці угоди і відповідні відмінності у застосуванні анотацій. --- Значення LI-типів даних становлять абстрактні об’єкти, що задовольняють вимогам набо-ру заданих правил. Кожна комп’ютерна система має власні внутрішні типи даних, для яких простір значень є послідовністю (зазвичай фіксованої довжини) n розрізнюваних символів (зазвичай двох символів 0 і 1), а характеристичні операції як інструкції вбудовано у комп’ютерну систему. Подання LI-типу даних перетворюють з його простору на значення комп’ютерної системи. На додаток до значення типів даних, комп’ютерна система має нотацію змінної як об’єкта, з яким динамічно пов’язано значення певного типу (типів) даних. До певної міри змінна — це реалізація значення типу даних Покажчик. Згідно з ДСТУ 3901-99 характеристичні операції – це узагальнені обчислювальні нотації функцій, які застосовуються для значень типів даних, що використовують для ідентифікації семантики типів даних. У комп’ютерній системі операції з подання цих значень і змінних є реально виконуваними. --- Розмір пам’яті (storagesize) як атрибут типу визначає кількість (і тип) одиниць пам’яті, необхідних або розподілених для подання значень типу даних. Він може також зазначати, чи буде кількість одиниць пам’яті постійною для всіх значень (цього зразка) типу даних або змінюватись згідно з вимогами конкретного значення. Розмір пам’яті застосовується до довільного типу даних, крім типів даних Процедура. Якщо існує обмеження на максимальний розмір значень, це приводить до обмеження на простір значень типу даних, яке краще задокументувати як специфікації підтипу. --- Режим (mode) як атрибут типу специфікує систему числення для подання числового типу даних, цифр, десяткової крапки, якщо її використовують, знаку і розміщення. Приклади режимів – такі нотації, як “бінарний, доповнений двома”, “упакований десятковий з приєднаним знаком” або формати подання чисел стандарту ISO 6093:1985. Режим застосовують тільки для числових типів даних, переважно для Цілого і Масштабованого. --- Ознака (tag) як атрибут типу зазначає, чи буде подано і, якщо буде, то як, значення LI-типу даних Вибір. Ознака застосовується тільки для типу даних Вибір або генераторів. --- Форма (form) як атрибут типу зазначає, що один тип даних має таке ж подання, що й інший. Зокрема форма дозволяє реалізації специфікувати, що примітивний LI-тип даних має видиму інформаційну структуру або конкретний згенерований тип даних має примітивну реалізацію. Форму можна застосовувати до довільного LI-типу даних.


Реалізаційні нотації LI-типів даних Рухома крапка, Фіксована крапка.

Реалізаційні нотації LI-типів даних Рухома крапка, Фіксована крапка.

Анотація – це інформаційна одиниця опису, приєднана до специфікатора типу, компонен-та типу даних або значення, для характеристики аспекту подання, змінних або операцій, пов’язаних зі значеннями типу даних, компонента або значення у конкретному контексті. У ДСТУ 3901-99 не задано синтаксис або семантику анотацій. Загальноприйняті угоди для місцезнахо-дження анотацій полегшують задачу читача щодо визначення об’єкта, якого стосуться анотація у разі її використання, і для визначення контексту, в якому її слід використовувати. Розглянемо ці угоди і відповідні відмінності у застосуванні анотацій. --- Значення LI-типів даних становлять абстрактні об’єкти, що задовольняють вимогам набо-ру заданих правил. Кожна комп’ютерна система має власні внутрішні типи даних, для яких простір значень є послідовністю (зазвичай фіксованої довжини) n розрізнюваних символів (зазвичай двох символів 0 і 1), а характеристичні операції як інструкції вбудовано у комп’ютерну систему. Подання LI-типу даних перетворюють з його простору на значення комп’ютерної системи. На додаток до значення типів даних, комп’ютерна система має нотацію змінної як об’єкта, з яким динамічно пов’язано значення певного типу (типів) даних. До певної міри змінна — це реалізація значення типу даних Покажчик. Згідно з ДСТУ 3901-99 характеристичні операції – це узагальнені обчислювальні нотації функцій, які застосовуються для значень типів даних, що використовують для ідентифікації семантики типів даних. У комп’ютерній системі операції з подання цих значень і змінних є реально виконуваними. Далі, radix - система числення. --- Рухома крапка (floating-point) як атрибут типу зазначає, що числовий тип даних має подання рухомої крапки. Згідно з ISO/IEC 10967-1:1994, значення v має вигляд: v = S * M * R^E, де S – це знак, тобто S = 1 або S = –1; R — основа системи числення (radix) цього подання; E – експонента; M – мантиса, нуль або наступне значення типу даних Масштабований, виключаючи (1): scaled(radix, precision) діапазон (radix^ – precision, 1). Це подання характеризує п’ять параметрів: -radix та точність precision, як описано вище; -emin та emax за умови emin <= E <= emax; -denorm з вимогою, що з умови denorm = false випливає d = R–1 та з умови denorm = true випливає d = R^(–precision). Рухому крапку застосовують лише до числових типів даних, переважно до Дійсного і Комплексного. --- Фіксована крапка (fixed-point) як атрибут типу специфікує, що числовий тип даних має подання фіксованої крапки і показники цього подання у вигляді v=S • M • R^(–Р) , де S – знак, тобто S = 1 або S = –1; R – це radix подання; M — мантиса як значення типу даних Цілий; Р – точність. Допускаються також параметри radix і точність. Фіксовану крапку застосовують лише для числових типів даних, переважно для Масштабованого.

Реалізаційні нотації LI-типів даних Упакований, Вирівнювання.

Реалізаційні нотації LI-типів даних Упакований, Вирівнювання.

Анотація – це інформаційна одиниця опису, приєднана до специфікатора типу, компонен-та типу даних або значення, для характеристики аспекту подання, змінних або операцій, пов’язаних зі значеннями типу даних, компонента або значення у конкретному контексті. У ДСТУ 3901-99 не задано синтаксис або семантику анотацій. Загальноприйняті угоди для місцезнахо-дження анотацій полегшують задачу читача щодо визначення об’єкта, якого стосуться анотація у разі її використання, і для визначення контексту, в якому її слід використовувати. Розглянемо ці угоди і відповідні відмінності у застосуванні анотацій. --- Значення LI-типів даних становлять абстрактні об’єкти, що задовольняють вимогам набо-ру заданих правил. Кожна комп’ютерна система має власні внутрішні типи даних, для яких простір значень є послідовністю (зазвичай фіксованої довжини) n розрізнюваних символів (зазвичай двох символів 0 і 1), а характеристичні операції як інструкції вбудовано у комп’ютерну систему. Подання LI-типу даних перетворюють з його простору на значення комп’ютерної системи. На додаток до значення типів даних, комп’ютерна система має нотацію змінної як об’єкта, з яким динамічно пов’язано значення певного типу (типів) даних. До певної міри змінна — це реалізація значення типу даних Покажчик. Згідно з ДСТУ 3901-99 характеристичні операції – це узагальнені обчислювальні нотації функцій, які застосовуються для значень типів даних, що використовують для ідентифікації семантики типів даних. У комп’ютерній системі операції з подання цих значень і змінних є реально виконуваними. --- Упакований (packed) і “розпакований” або “вирівняний” становлять атрибути типів, які характеризують зіставлення (накладання) всіх компонентів значення агрегатного типу даних. При цьому розрізнюють оптимізацію простору і часу доступу. Упаковані атрибути застосовують тільки до агрегатних типів даних або їхніх генераторів. --- Вирівнювання (alignment) як атрибут компонента характеризує примусове вирівнювання на границі одиниці пам’яті у поданні значень заданого компонента типу даних. Це приводить до того, що “заповнення” для досягнення необхідного вирівнювання можна вводити до подання агрегатного типу даних, який містить анотований компонент.

Характеристика перетворення примітивних LI-типів даних на типи мови Паскаль

Характеристика перетворення примітивних LI-типів даних на типи мови Паскаль.

Розглянемо варіант внутрішнього перетворення LI-типів даних на типи мови Паскаль, визначеної згідно з ISO/IEC 7185:1990. Існують відмінності перетворень до розширеної версії мови Паскаль згідно з ISO/IEC 10206:1991. На цьому прикладі покажемо суть внутрішнього перетворення, яке не слід розглядати як остаточне перетворення LI-типів даних на типи Паскаля.

Примітивні LI-типи даних

Для більшості примітивних типів операції при перетворенні зберігаються. Жодні значення, більші за max-ціле(rmax), і менші за min-ціле(rmin), і жодні типи даних, що містять такі значення, не можна перетворити на Паскаль.

Логічний тип даних перетворюється на тип Boolean мови Паскаль. Значення true і false перетворюються на відповідні значення типу Boolean мови Паскаль. Стан у формі стан (список-значень-станів) перетворюється на переліковний тип із списком значеньстанів. Кожне значення стану перетворюється на значення мови Паскаль з відповідним ідентифікатором. Переліковний LI-тип даних у формі переліковний (список-переліковних-значень) перетворюється на переліковний тип Паскаля, а кожне переліковне значення – на значення мови Паскаль з відповідним ідентифікатором. Тип даних окремого символу у формі символ перетворюється на тип char мови Паскаль, у якому необхідно для кожної реалізації визначати набір символів, що відповідає типу даних char. Припускається, що набір символів, визначений за промовчанням синтаксисом LI-типу даних Символьний, є цим набором символів, а список-набору, якщо такий заданий, ідентифікує цей набір або його підмножину. Жодні інші символьні типи даних не перетворюються на тип Паскаля, хоча реалізація може визначити перетворення символьних кодів на тип integer Паскаля. Порядковий LI-тип даних у формі діапазон(1...max-ціле) перетворюють на піддіапазон Паскаля 1...max-ціле. У кожній Паскаль-реалізації треба визначати максимальне ціле значення. Порядковий тип даних (його підтип) з відповідним max-ціле перетворюється, як зазначено вище, а кожне порядкове значення – на відповідне ціле значення за умови математичного ізоморфізму. Дата/час. LI-тип даних Дата/час time(unit, radix, factor) range(time1 ... time2) перетворюється на Паскаль у такий спосіб, як тип даних Часовий інтервал. При цьому значення Паскаля подає інтервал між time1 і зазначеним моментом часу, але тільки, якщо Паскаль-значення з інтервалу (time1, time2) менше за визначене реалізацією значення max-ціле. Жодний інший LI-тип даних Дата/час не можна перетворити на Паскаль. Цілий. LI-тип даних Цілий integer range (min-ціле ... max-ціле) перетворюється на тип integer мови Паскаль, де min-ціле визначено як Negate(max-ціле). У кожній Паскаль-реалізації необхідно визначити max-ціле. Раціональний перетворюється на тип Паскаля type rational = array [1..2] of integer з відповідними характеристичними операціями, які треба додатково визначити. Тільки раціональні величини, у яких чисельник і знаменник належать до діапазону [-max-ціле, max-ціле], перетворюються на тип Паскаля. Це не можна встановити як обмеження діапазону простору значень LI-типу даних Раціональний. Масштабований як LI-тип даних у формі scaled(r,f) range(minrf...maxrf) перетворюється на тип integer мови Паскаль, де minrf має значення –max-ціле•r-f , maxrf – max-ціле•r -f. Тип даних Масштабований (його підтипи) з відповідними мінімальним і максимальним значеннями перетворюються на тип integer мови Паскаль з кожним масштабованим значенням N•r(-f), що перетворю-ється на ціле число N мови Паскаль. Характеристичні операцій множення і ділення LI-типу даних Масштабований треба визначати. Перетворюються на Паскаль тільки значення типу даних scaled(r, f), що належать вищезазначеному діапазону, але не значення цього типу даних за межа-ми діапазону. Дійсний LI-тип даних у формі realrange(rmin..rmax) та real(radix,precision)range (rmin..rmax) перетворюється на тип real мови Паскаль тільки, якщо задано (або підтримані за промовчанням) параметри radix, precision, rmin і rmax визначають підмножину дійсних значень, розрізнюваних у підмножині математичних дійсних величин, визначених реалізацією Паскаля після відповідного перетворення. Кожне LI-дійсне значення перетворюється на дійсне значення мови Паскаль, яке матема-тично є найближчою до нього величиною, якщо два значення еквівалентні, то можна вибрати будь-яке з них. Всі характеристичні операції концептуально зберігаються, хоча реалізаційно ви-значена арифметика може вносити корективи в результати. Комплексний LI-тип даних у формі complex(radix, precision) перетворюється на тип мови Паскаль type complex = record realpart, imagpart: real end; Однак цей тип даних перетворює тільки значення с так, що |Re(c)| < rmax та |Im(c)| < rmax, де rmax визначено реалізацією, і тільки тоді, коли rmax задані (підтримані за промовчанням) значення параметрів radix і precision визначають підмножину комплексних значень, для яких декартові подання (x + iy) розрізнювані на множині декартова добутку дійсних значень, встановлених реалізацією Паскаля. Кожне комплексне LI-значення перетворюється на значення Паскаля, у якого поле дійсної частини realpar має значення real Паскаля, математично найближче до Re(c), а поле уявної частини imagpart є математично найближчим значенням до Im(c). Тут Re та Im становлять математичні проекції на дійсну і уявну вісі. Визначення характеристичних операцій, що відповідають декартовому поданню комплексного числа, треба задати спеціальними Паскаль-процедурами і зважати, що визначена реалізацією арифметика може впливати на точність результатів. Пустий як LI-тип даних перетворюється на Паскаль, якщо тільки він з’являється як альтернатива типу даних Вибір. Тоді він перетворюється на пустий варіант "()" запису з варіантами.

Характеристика перетворення підтипів і розширених LI-типів даних на типи мови Паскаль

31. Характеристика перетворення підтипів і розширених LI-типів даних на типи мови Паскаль.

LI-підтип

Діапазон перетворюється на типи піддіапазону Паскаля, але тільки якщо базовий LI-тип даних перетворюється на тип ordinal Паскаля. Вибір не має еквівалента у Паскалі. Підтип Вибір LI-типу Стан або LI-типу Переліковний перетворюється так, як відповідний базовий LI-тип. Вилучення не має еквівалента у Паскалі. Підтип Вилучення LI-типу даних Стан або LI-типу даних Переліковний перетворюється так, як відповідний базовий LI-тип. Розмір не перетворюється на “рідні” конструкти Паскаля. Підтипи LI-типу Розмір не можна підтримати реалізацією LI-типу даних Послідовність, а визначені підтипи Розмір перетворюються на конкретні типи Паскаля. Явні підтипи LI-типів даних не мають еквівалента у Паскалі. Ці підтипи перетворюються, наче це базовий LI-тип даних. Розширені LI-типи даних не перетворюються на Паскаль. У випадку LI-типу даних Переліковний можна визначити повністю новий тип із значеннями ізоморфізмів, що ґрунтуються на порядку розташування.

Характеристика перетворення згенерованих LI-типів даних Вибір, Покажчик, Процедура на типи мови Паскаль

Характеристика перетворення згенерованих LI-типів даних Вибір, Покажчик, Процедура на типи мови Паскаль. Згенеровані LI-типи даних Вибір у формі choice (tag-type) of (select-list1: alternative-1,..., select-listN: alternative-N) перетворюється на тип variant-record мови Паскаль: record case tag-variable: mapped-tag-type of case-constant-list1: mapped-type1;...;case-constant-listN: mapped-typeN end; тільки у разі виконання таких умов: tag-tipe перетворюється на порядковий тип мови Паскаль. Тоді mapped-tag-type – це по-рядковий тип, який є образом перетворення. тип кожної альтернативи аlternative-i перетворюється на тип Паскаля. Якщо тип альтернативи перетворюється на тип запису Паскаля, то відповідний перетворений тип стає “усі-поля-Паскаля-типу-запис”. Якщо тип альтернативи пустий, то відповідний перетворений тип подається як (). Якщо альтернативний тип не перетворюється на тип запису Паскаля, то відповідний перетворений тип подається як (mapped-field-identifier: mapped-altemative), де перетворена альтернатива – це образ альтернативного типу після перетворення, а перетворений ідентифікатор поля mapped-field-identifier становить ідентифікатор поля аlternative-i, якщо воно подає і формує правильний ідентифікатор поля мовою Паскаль, інакше - ідентифікатор, який не конфліктує з іншим ідентифікатором поля типу запис Паскаля. Жодний інший тип даних Вибір не можна перетворити на Паскаль. Ознаку-змінну tag-variable як ідентифікатор використано винятково для реалізації характеристичних операцій. Характеристичні операції Tag і Cast реалізуються у Паскалі (принаймні концептуально) шляхом посилання окремого поля відповідного перетвореного типу або призначенням його. Операція Discriminant становить значення tag-змінної. Рівність (Equal) реалізується у Паскалі оператором вибору, який використовує tag-змінну і перетворені списки select-list вибору поля для порівняння кожної альтернативи.

Покажчик у формі pointer to (element-type) перетворюється на тип мови Паскаль ^mapped-type тільки, якщо element-type перетворюється на тип Паскаля. Тільки значення LI-типу даних Покажчик, які посилаються на об’єкти Паскаля “купа” (heap), перетворюються на відповідні значення-покажчики Паскаля. Інші значення-покажчики можна підтримувати їхнім розіменуванням і копіюванням до Паскаль-купи, генеруючи “еквівалент” значення-покажчика Паскаля у тому розумінні, що розіменування Dereference працюватиме коректно у разі відсутності неспецифікованої операції “призначення”. Операція розіменування є в Паскалі ідентифікованою змінною, тобто pointer-value^. Процедура у формі procedure(parameter-list) перетворюється на “специфікацію параметрів процедури” Паскаля тільки тоді, коли з’являється тип параметра процедури і всі LI-типи параметрів можна перетворити на типи Паскаля. LI-тип даних Процедура у формі procedure(parameter-list)returns(return-parameter) можна перетворити на “специфікацію параметра процедури” або “специфікацію параметра функції” тільки, якщо з’являється тип даних параметра процедури і тільки якщо всі типи параметрів parameter-types, включаючи повертаємий параметр return-parameter, можна перетворити на типи Паскаля. Якщо return-parameter перетворюється на простий тип або тип покажчика мови Паскаль, то LI-тип даних Процедура перетворюється на “специфікацію параметра функції” Паскаля; інакше – на “специфікацію параметра процедури”.

Якщо LI-тип даних Процедура перетворюється на “специфікацію параметрів функції”, то тип return-parameter перетворюється на підсумковий тип специфікації параметрів функції Паскаля. Якщо тип даних Процедура має return-parameter і перетворюється на “специфікацію параметрів процедури”, то return-parameter перетворюється так, на-че він є додатковий параметр out.

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


Характеристика перетворення агрегатних згенерованих LI-типів даних на типи мови Паскаль

Характеристика перетворення агрегатних згенерованих LI-типів даних на типи мови Паскаль. 'Агрегатні згенеровані типи' Запис як LI-тип даних у формі record(field-list) перетворюється на тип record Паскаля у формі record field-list end тільки, якщо всі типи його полів field-types перетворюються на типи Пас-каля. Жодні інші LI-типи даних не можна перетворити на Паскаль. Кожне LI-поле у формі identifier: field-type перетворюється на поле Паскаля у формі identifier: mapped-type, де перетворений тип mapped-type становить образ типу поля field-type піс-ля перетворення на Паскаль. Кожне значення LI-типу даних Запис, яке задовольняє вищезазна-ченим обмеженням, перетворюється на значення відповідного типу record Паскаля перетворен-ням значення кожного поля на його відповідне значення. Операція FieldSelect підтримується виразом “вибір поля” Паскаля. Агрегатна операція під-тримується у Паскалі призначенням заданих значень відповідним полям змінної-запису. Equal прямо не підтримується у Паскалі, її можна підтримати для кожного індиві¬дуального типу record, сконструювавши функцію, яка порівнює відповідні значення полів. Набір у формі set of (element-type) перетворюється на тип Паскаля set of mapped-type, якщо тільки element-type перетворюється на тип ordinal Паскаля, а потужність типу ordinal не пе-ревищує визначеної реалізацією максимальної потужності набору, яку вимагає Паскаль. Перетво-рений тип тоді буде типом ordinal Паскаля, який становить образ перетворення. Кожне значення LI-типу даних Набір, яке задовольняє наведеним обмеженням, перетво-рюється на значення, що відповідає типу set Паскаля за допомогою перетворення значення кож-ного компонента set на відповідне значення. Всі характеристичні операції підтримуються операці-ями Паскаля. Жодний інший LI-тип даних Набір не можна прямо перетворити на Паскаль. Можна пере-творювати деякі інші типи даних Набір як варіанти Послідовності за допомогою визначення спеціальних характеристичних операцій. Портфель. Жодний тип даних Портфель не можна прямо перетворити на Паскаль. Можна перетворювати деякі типи даних Портфель як варіанти Послідовності за допомогою визначення спеціальних характеристичних операцій. Послідовність як LI-тип даних у формі sequence of (element-type) перетворюється на тип Паскаля file of mapped-type тільки, якщо тип element-type можна перетворити на тип Паскаля, від-мінний від типу file. Жодний інший LI-тип даних Послідовність не можна прямо перетворити на Па-скаль. Кожне значення LI-типу даних Послідовність, яке задовольняє цим обмеженням, перетво-рюється на значення, що відповідає типу file Паскаля за допомогою перетворення значення кож-ного елемента Послідовності на відповідне йому значення. У разі оголошення type sequenceoftype ' file of mapped-type; характеристичні операції під-тримуються процедурами для типів file. Оскільки тип file Паскаля не може бути сомпонентом іншо-го типу file, то LI-типи даних у формі sequence of(sequence(...)) або sequence of(record(...)), де LI-тип даних Запис містить LI-тип даних Послідовність, не перетворюються на Паскаль. Більш того, якщо тип компонента становить file або містить pointer-type, то мають місце визначені реалізацією обмеження, які порушують перетворення. Значення LI-типу даних Послідовність у формі sequence of(element-type), де element-type перетворюється на деякий перетворений тип Паскаля, перетворюються на Паскаль з використан-ням такого типу: type sequenceofT ' ^sequenceofTmember; sequenceofTmember ' record next: sequenceofT; elementvalue: mapped-type end; Кожний елемент (значення element-type) значення LI-типу даних Послідовність перетворюється на купу-змінну типу Паскаля sequenceofTmember, шляхом перетворення його значення на відповідне значення mapped-type, з розміщенням цього значення у полі elementvalue. Значення LI-типу даних Послідовність потім подається як значення типу sequenceofT, що є покажчиком на змінну купи, подану першим елементом або нулем, якщо послідовність пуста. Поле next останньо-го елемента встановлюється у нуль. Всі характеристичні операції визначено на цьому поданні. Масив у формі array (index-list) of (element-type) перетворюється на тип Паскаля array [mapped-index-list] of mapped-element-type тільки за виконання таких умов: 1) Тип element-type перетворюється на деякий тип mapped-element-type мови Паскаль. 2) Тип index-type із списку index-list можна перетворити на тип ordinal Паска¬ля. Перетворе-ний список індексів mapped-index-list має відповідний порядок до списку mapped-index-types. Жодний інший LI-тип даних Масив не перетворюється на Паскаль. Кожне значення LI-типу даних Масив, яке задовольняє наведеним обмеженням, перетворюється на відповідне значення типу array Паскаля. Операція Select підтримується у Паскалі за допомогою індексування. Операція Replace підтримується призначенням відповідній комірці змінної масиву. Операцію Equal не можна прямо підтримати у Паскалі, а для кожного окремого типу масиву треба сконструювати функцію, яка порівнює відповідні значення елементів масиву. Таблиця. Жодний LI-тип даних Таблиця прямо не можна перетворити у Паскаль. Значен-ня LI-типу даних Таблиця у формі table(field-list), де кожний field-type із списку field-list перетворю-ють на певний тип Паскаля, можна перетворити на тип record Паскаля з відповідними полями. Тоді Характеристичні операції для LI-типу даних Таблиця можна додатково визначати.

Характеристика перетворення оголошених LI-типів даних і генераторів на типи мови Паскаль

Оголошені LI-типи даних

Натуральне число у формі range(0..maxint) перетворюється на тип піддіапазону Паскаля 0..maxint. Жодне значення “натуральне-число”, більше maxint, і жодний тип даних, що містить таке значення, не можна перетворити на Паскаль. Модуль у формі modulo(modulus) перетворюється на тип Паскаля піддіапазону 0..modulus-1, але тільки, якщо modulus-1 менше або дорівнює визначеному реалізацією значенню maxint. Характеристичні операції можна отримати з типу integer Паскаля. Біт перетворюється на тип Паскаля, оголошений як type bit 0..1; Значення 0 і 1 перетворюються на відповідні цілі величини. Всі характеристичні операції зберігаються, хоча операцію Add треба перевизначити. Бітовий рядок, усі значення якого становлять константи фіксованої довжини, тобто bitstring size(k) перетворюється на тип ”упакований бітовий масив“ Паскаля packed array [1 ..k] of Boolean. А характеристичні операції Equal, Head і Tail треба перевизначити. Функції Append, Empty, IsEmpty – це несуттєві операції для бітових рядків фіксованого розміру. LI-тип даних Бітовий рядок перетворюється як послідовність бітів, хоча для бітового рядка можна розробити ефективніші структури. Символьний рядок, для якого LI-тип даних Символьний можна перетворити на Паскаль і всі значення якого становлять константи фіксованої довжини, тобто characterstring size (k) перетворюються на тип Паскаля packed array [1 ..k] of char з перевизначеними характеристичними операціями Head і Tail. Equal у Паскалі відповідає ““, а Append, Empty, IsEmpty – несуттєві операції для символьного рядка фіксованої довжини. LI-тип даних Символьний рядок, для якого тип даних Символьний можна перетворити на Паскаль, також можна перетворити на sequence of (character). Часовий інтервал перетворюються згідно із специфікацією для LI-типу даних Масштабований. Операція скалярного множення scalarMultiply перетворюється на function scalarMultiply(x: scaled, y: timeinterval): timeinterval; Октет перетворюється на тип Паскаля type octet 0. .255; Усі характеристичні операції зберігаються. Рядок октетів, всі значення якого становлять константи фіксованої довжини octetstring size(k), перетворюється на тип Паскаля packed array [1 ..k] of octet з перевизначеними характеристичними операціями Equal, Head і Tail. Операції Append, Empty, IsEmpty несуттєві для октетних рядків фіксованого розміру. LI-тип даних Рядок октетів можна перетворити у Паскалі на послідовність октетів. Приватний визначено у Паскалі як type private packed array [1 ..size] of bit; або type private packed array [1 ..size] of Boolean; Здебільшого випадках тільки останній варіант може дати бажану реалізацію (неперервний бітовий рядок). Ідентифікатор об’єктів objectidentifier перетворюється на Паскаль як sequence of (objectidentifiercomponent), де objectidentifiercomponent перетворюється на тип Паскаля type objectidentifiercomponent 0..maxint; Здебільшого значення компонентів objectidentifier некорисні для застосування, а сам тип корисніший для перетворення на LI-тип даних Рядок октетів.

Оголошені генератори Стек. Жодний LI-тип даних Стек прямо не перетворюється на Паскаль. Дерево. Жодний тип даних Дерево прямо не перетворюється на Паскаль. Циклічний переліковний як LI-тип даних у формі cyclic of (T) перетворюється на Паскаль, але необхідно, щоб Т був LI-типом даних Переліковний. Характеристична операція Successor не перетворюється на succ() мови Паскаль. Необов’язковий як LI-тип даних у формі optional(Т) перетворюється на Паскаль, якщо тип Т можна перетворити на Паскаль з довизначенням характеристичних операцій. Оголошення типів. У Паскалі два специфікатори типу стосуються одного типу даних, якщо обидва становлять ідентифікатори і мають однаковий напис. Специфікатори типу, які не є ідентифікаторами, завжди стосуються різних типів даних. Тому можуть стати необхідними додаткові визначення типів даних для перетворення на Паскаль, щоб коректно підтримувати ідентичність LI-типів даних, які не мають імен. Оголошення перейменувань підтримано у Паскалі тільки для іменованих типів. Оголошення LI-типу даних (без параметрів), перетворюється на Паскаль як оголошення типу, в якому опис LI-типу даних можна перетворити на Паскаль. Оголошення LI-генератора не перетворюється на Паскаль. У багатьох випадках кожний підсумковий LI-тип даних можна перетворити на особливий тип Паскаля присвоєнням унікального імені після виконання лексичних підстановок для значень параметрів.


Характеристика перетворення примітивних LI-типів даних на типи мови M[UMPS]

Характеристика перетворення примітивних LI-типів даних на типи мови M[UMPS].

Примітивні LI-типи даних Логічний. Значення цього LI-типу даних перетворюється на логічні значення, true на 1 а false – на 0. Стан. Кожне LI-значення-стан перетворюється на рядкове значення. Переліковний. Кожне переліковне значення перетворюється на його індекс у визначенні переліковного LI-типу даних, тобто перше значення перетворюється на 1, друге – на 2 тощо. Символьний перетворюється на визначення MUMPS-профілю Character Set, який містить асоційовані коди символів. Порядковий. Кожне порядкове LI-значення перетворюється на додатну цілу величину. Дата/Час. Значення LI-типу даних Дата/Час перетворюються на подання символьних рядків, визначених ISO 8601:1988. Альтернативою є перетворення значень дати і часу на символьний рядок у форматі $H[OROLOG] , який має вигляд D,S, де D – це порядкове число, що відповідає дню, відрахованому від 31 грудня 1840 року, а S – це порядкове число, що відповідає інтервалу часу у секундах, відрахованому від півночі. Цілий. Кожна ціла LI-величина перетворюється на канонічну форму. Раціональний. Кожне LI-значення перетворюється на символьне подання, яке відповідає раціональному літералу. Якщо знаменник більше 0, можна перетворювати значення на чисельник/знаменник, тобто число створити з ділення двох частин і виконати звичайні арифметичні операції, але з втратою точності. Масштабований. Кожне масштабоване LI-значення перетворюється на символьне подання відповідного масштабованого літералу (scaled-literal). Масштабоване LI-значення також можна перетворювати на числове, як для типу даних Раціональний. Дійсний. Дійсні LI-значення перетворюються на найближче числове значення. Комплексний. LI-значення перетворюються на рядки у формі (real-value%imaginary-value з дійсною і уявною частинами. Пустий. Не існує перетворення для цього типу даних, оскільки він з’являється тільки як формальна частина специфікації інтерфейсу і немає значень, тобто не подає даних, реально переданих за допомогою інтерфейсу.

Це перетворення не слід розглядати як остаточне перетворення LI-типів даних на типи даних MUMPS. У всіх випадках перетворені дані в MUMPS становлять рядки, а перетворення виражає форму підсумкових рядкових значень. У разі внутрішнього перетворення отримані значення виводяться у канонічній формі, як визначено у ISO 11756:1992, якщо не встановлена інша вимога. Якщо результат перетворення значення згідно з описаною тут процедурою не задовольняє обмеженням реалізації, то він неспецифікований. Для обернених внутрішніх перетворень має місце довільне приведення типів даних з внутрішнього формату. Якщо обернене внутрішнє перетворення видає підсумкові значення, які не належать до діапазону LI-типу даних, результат неспецифікований. Якщо необхідне перетворення на (або з) числовий формат, його точність залежить від реалізації. Наступний дозвіл цієї прив’язки полягає в тому, що він операційний, так що перетворення автоматично керується під час виконання специфікацією інтерфейсу перетворення реалізації.

Характеристика перетворення підтипів і розширених LI-типів даних на типи мови M[UMPS]

Характеристика перетворення підтипів і розширених LI-типів даних на типи мови M[UMPS].

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

Вибір. Значення LI-типу даних Вибір перетворюється відповідно до специфікації для реа-льно зазначеного типу. У MUMPS тільки змінна може реально вести себе як представник типу да-них Вибір. Дискримінант Вибору забезпечується у V(0), де V – ім’я змінної, асоційованої з MUMPS-змінною.


Характеристика перетворення згенерованих LI-типів даних Вибір, Покажчик, Процедура на типи мови M[UMPS]

Характеристика перетворення згенерованих LI-типів даних Вибір, Покажчик, Процедура на типи мови M[UMPS].

Згенеровані LI-типи даних Вибір. Значення LI-типу даних Вибір перетворюється відповідно до специфікації для реально зазначеного типу. У MUMPS тільки змінна може реально вести себе як представник типу даних Вибір. Дискримінант Вибору забезпечується у V(0), де V – ім’я змінної, асоційованої з MUMPS-змінною. Покажчик перетворюється на MUMPS-змінну. Доступ до значення елемента, зазначеного даними цього типу, забезпечується використанням неявного або специфічного для реалізації механізму. Таким чином, механізм неявного доступу (@) – це підтримка MUMPS для характеристичної операції Dereference. Процедура. Значення LI-типу даних Процедура перетворюється на label та formallist formalline, що означає виклик підпрограми. Параметри завершення перетворюються на додаткові formallist-імена. Inout та out-параметри перетворюються (на етапі виконання) на параметри, що викликаються за посиланням.


Це перетворення не слід розглядати як остаточне перетворення LI-типів даних на типи даних MUMPS. У всіх випадках перетворені дані в MUMPS становлять рядки, а перетворення виражає форму підсумкових рядкових значень. У разі внутрішнього перетворення отримані значення виводяться у канонічній формі, як визначено у ISO 11756:1992, якщо не встановлена інша вимога. Якщо результат перетворення значення згідно з описаною тут процедурою не задовольняє обмеженням реалізації, то він неспецифікований. Для обернених внутрішніх перетворень має місце довільне приведення типів даних з внутрішнього формату. Якщо обернене внутрішнє перетворення видає підсумкові значення, які не належать до діапазону LI-типу даних, результат неспецифікований. Якщо необхідне перетворення на (або з) числовий формат, його точність залежить від реалізації. Наступний дозвіл цієї прив’язки полягає в тому, що він операційний, так що перетворення автоматично керується під час виконання специфікацією інтерфейсу перетворення реалізації.

Характеристика перетворення агрегатних згенерованих LI-типів даних на типи мови M[UMPS]

арактеристика перетворення агрегатних згенерованих LI-типів даних на типи мови M[UMPS].

Згенеровані LI-типи даних Вибір. Значення LI-типу даних Вибір перетворюється відповідно до специфікації для реально зазначеного типу. У MUMPS тільки змінна може реально вести себе як представник типу даних Вибір. Дискримінант Вибору забезпечується у V(0), де V – ім’я змінної, асоційованої з MUMPS-змінною. Покажчик перетворюється на MUMPS-змінну. Доступ до значення елемента, зазначеного даними цього типу, забезпечується використанням неявного або специфічного для реалізації механізму. Таким чином, механізм неявного доступу (@) – це підтримка MUMPS для характеристичної операції Dereference. Процедура. Значення LI-типу даних Процедура перетворюється на label та formallist formalline, що означає виклик підпрограми. Параметри завершення перетворюються на додаткові formallist-імена. Inout та out-параметри перетворюються (на етапі виконання) на параметри, що викликаються за посиланням. Запис. Значення LI-типу даних Запис перетворюється на MUMPS-масив, у якому індекси становлять ідентифікатори полів, а дані – перетворені значення з відповідного поля запису. Значення запису можна моделювати за допомогою індексів, які задають номера розташувань полів, причому ідентифікатор поля важливий, а положення – ні. Набір перетворюється на MUMPS-масив з цілими індексами, перший з яких дорівнює 1 і зазначає положення незалежного значення із списку значень. Портфель перетворюється таким же чином, як Набір. Послідовність перетворюється таким же чином, як Набір. Масив перетворюється на MUMPS-масив з індексом 1-го рівня у вигляді першого незалежного значення у списку значень, індексом 2-го рівня – другим незалежним значенням і т.д. Таблиця перетворюється в MUMPS-масив з індексом 1-ого рівня у вигляді цілого числа, починаючи з 1, що визначає положення входу таблиці всередині таблиці, індексом 2-го рівня у ви-гляді ідентифікатора поля, пов’язаного з незалежним значенням. Пусте значення не позначає жодні дані. LI-підтипи даних обробляють так, ніби вони були базовими LI-типами. Розширені LI-типи можуть перетворюватись, забезпечуючи належність значень допустимому діапазону.


Це перетворення не слід розглядати як остаточне перетворення LI-типів даних на типи даних MUMPS. У всіх випадках перетворені дані в MUMPS становлять рядки, а перетворення виражає форму підсумкових рядкових значень. У разі внутрішнього перетворення отримані значення виводяться у канонічній формі, як визначено у ISO 11756:1992, якщо не встановлена інша вимога. Якщо результат перетворення значення згідно з описаною тут процедурою не задовольняє обмеженням реалізації, то він неспецифікований. Для обернених внутрішніх перетворень має місце довільне приведення типів даних з внутрішнього формату. Якщо обернене внутрішнє перетворення видає підсумкові значення, які не належать до діапазону LI-типу даних, результат неспецифікований. Якщо необхідне перетворення на (або з) числовий формат, його точність залежить від реалізації. Наступний дозвіл цієї прив’язки полягає в тому, що він операційний, так що перетворення автоматично керується під час виконання специфікацією інтерфейсу перетворення реалізації.

Питання до розділу 5

Характеристика LIPC-моделі незалежного від мов виклику процедур за ДСТУ 4072-2001 (ISO/IEC 13866:1996).

Характеристика LIPC-моделі незалежного від мов виклику процедур за ДСТУ 4072-2001 (ISO/IEC 13866:1996).

Навіщо LIPC модель - щоб забезпечити мережне середовище для виклику процедур. При компіляції підписати протокол на процедуру. Потім підтасувати віртуальний контракт під фактичні параметри.

Стандартна модель виклику процедур потрібна через множину варіантів виклику процедур у стандартних мовах. Наявність стандарту з незалежного від мов виклику процедур (LIPC) не потребує прийняття всіма мовами єдиної моделі виклику процедур. Номінальна вимога до мов програмування - забезпечити відображення властивого їм механізму виклику процедур у LIPC і забезпечити прийняття виклику з інших мов програмування, що визначили прив'язку до LIPC. LIPC-стандарт - специфікація загальної моделі виклику процедур. Не визначено, як має забезпечуватися реалізація LIPC, як виклик процедури, ініційований процесором-клієнтом, передається процесору-серверу або як повертаються результати. Ця модель призначена для використання мовами так, щоб вони могли забезпечувати стандартні відображення моделі властивих їм процедур. LIPC-стандарт залежить від ДСТУ 3801-99 (ISO/IEC 11404:1995) у частині визначення типів даних, які має підтримувати LIPC-модель.

Разом із LIPC-моделлю визначено синтаксис посилання для відображення в модель і навпаки. Цей синтаксис названо нотацією визначення інтерфейсу IDN. LIPC-модель включає такі засоби, як збудження процедур, передачу параметрів, стан завершення і проблеми середовища, що стосуються нелокальних посилань і стану.

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

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

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

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

Віртуальний контракт між процедурами клієнта і серверу визначається IDN-нотацією. При конкретизації виклику, інтерфейс упорядкування впорядковує параметри і подає цю інформацію постачальнику LIPC-клієнта. Постачальник LIPC-клієнта зв'язаний із постачальником LIPC-серверу через фактичний контракт, поданий формою, що передається, (наприклад, ASN.1). Потім постачальник LIPC-серверу розупорядковує дані, через інтерфейс розупорядкування на сумісну з процедурою серверу форму. Після повернення процес міняється місцями з інтерфейсом розупорядкування, що тепер є інтерфейсом упорядкування, а інтерфейс упорядкування стає інтерфейсом розупорядкування.

Прив’язка LIPC-моделі до механізму віддаленого виклику процедур у клієнт-серверній архітектурі за ДСТУ 4072-2001.

Прив'язка LIPC-моделі до механізму віддаленого виклику процедур у клієнт-серверній архітектурі за ДСТУ 4072-2001.

LIPC: Схему виклику процедури можна описати як одиночну нитку виконання в конкретній програмі, де потік управління передається від однієї процедури до іншої. Ініціатор звертання розпізнається як клієнтська процедура, а процедура, що викликається, - як серверна. Процедури забезпечують обмін даними між клієнтом і сервером за допомогою параметрів. Для правильної інтерпретації параметрів, визначених клієнтською процедурою, їх треба впорядкувати (marshaling) згідно з основною формою передачі, що розділяється між процедурами клієнта і серверу. Після перетворення даних процедурі серверу треба розупорядкувати (unmarshaling) дані з основної форми до типів даних, визначених мовою серверу або в мовних прив'язках до LIDT-стандарту. Віртуальний контракт між процедурами клієнта і серверу визначається IDN-нотацією. При конкретизації виклику, інтерфейс упорядкування впорядковує параметри і подає цю інформацію постачальнику LIPC-клієнта. Постачальник LIPC-клієнта зв'язаний із постачальником LIPC-серверу через фактичний контракт, поданий формою, що передається, (наприклад, ASN.1). Потім постачальник LIPC-серверу розупорядковує дані, через інтерфейс розупорядкування на сумісну з процедурою серверу форму. Після повернення процес міняється місцями з інтерфейсом розупорядкування, що тепер є інтерфейсом упорядкування, а інтерфейс упорядкування стає інтерфейсом розупорядкування.

RPC - відрізняються за організацією від ЛІПС. Віддалений виклик процедур відбувається зовсім інакше, за зразками, коли не було програмістського втілення контракту. Такий виклик ішов через порти. LIPS виграє завдяки існуванню протоколу, маршалінгу, анмаршалінгу, моделі ЛІДТ перетворення. Автоматичний маршалінг і анмаршалінг - це круто. Ця фіча є в ЛІПС. Треба зробити стандарт, в якому описати зовнішнє і внутрішнє перетворення - це і є стандарт прив"язки. Зовнішнє перетворення - перетворення внутрішніх типів мови у LIDT (Language Independent Data Types). Внутрішнє перетворення - перетворення LIDT у внутрішні типи мови.

Поняття, неявні в LIPC-нотаціях IDN (Interface Definition Notation), порівнюються з поняттями, неявними в Мові опису інтерфейсу RPC (RPC IDL - RPC Interface Definition Language), визначеному в розділі 4 RPC-стандарту ISO/IEC 11578. Для цих двох нотацій деталізовані синтаксичні форми не порівнюються. Взагалі LIPC IDN надає багатший набір семантичних розходжень за RPC IDL. Кожний RPC IDL-тип має достатньо узагальнену еквівалентну форму в LIPC IDN. Тобто LI-тип даних описує той же набір значень, що і тип RPC. Проте RPC IDL може описувати розбіжності подання, що не потрапляють до ділянки дії LIPC, та надавати додаткову інформацію щодо конкретних специфікацій RPC-служб. Оголошення верхнього рівня в LIPC IDN та RPC IDL - це оголошення інтерфейсу. Якщо пропуск ідентифікатора інтерфейсу в специфікації не викликає неоднозначності, оголошення інтерфейсу можна пропустити, а "нормальне" оголошення можна використовувати як оголошення верхнього рівня.

ПРИКЛАД ПЕРЕТВОРЕННЯ: 1. Примітивні LI-типи: Комплексний. RPC IDL не має аналогів генератора LI-типу даних Комплексний. Можливе кодування LIPC IDN-типу complex(radix, factor) у RPC IDL тип полягає в одному із способів: struct { float real_part, imaginary_part; } struct { double real_part, imaginary_part; } де вибір між float та double може ґрунтуватися на визначенні найкращого наближення одного з типів до real(radix, factor).

2. Згенеровані типи даних: Вибір. RPC IDL-генератор типів union (об'єднань) має ту ж семантику, що і генератор LI-типу даних Вибір, за винятком того, що у RPC IDL тип Ознака обмежено цілочисловим типом integer, булевим, символьним (char) або типом перелічення (enumeration). У LIPC IDN ознака може бути будь-яким точним типом даних, тобто не стосується LI-типів даних, Комплексний і будь-якого згенерованого з них. У LIPC IDN та RPC IDL можна пропускати в значенні тегову частину choice або union. Це може виконуватися тільки, коли choice або union вкладено в більший тип даних (або список пара-метрів), одне з полів якого задає значення ознаки. RPC IDL забороняє використання масивів, які суміщуються, (conformant array) або маси-вів, що змінюють сумісність, (conformant-varying array) як альтернативу union. У LIPC IDN немає таких обмежень.

3. Агрегатні типи даних: Набір. RPC IDL-генератор не задає тип даних Набір; можна оформити LI-тип даних Набір як RPC IDL-масив. Наприклад, LI-тип даних - set of (T); RPC-аналог - struct { long size; T element [size]; } При трансляції типу даних Масив із RPC IDL у LIPC IDN необхідне знання семантики за-стосування для визначення того, що насправді можна використовувати як набір.

4. Похідні типи даних: Натуральне число. Аналогом RPC IDL для LI-типу даних Натуральний може бути hyper без знака (unsigned hyper).

Визначення LIPC-прив'язки до мови

Визначення LIPC-прив'язки до мови

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

ПРИВ"ЯЗКА ДО РЕЖИМУ КЛІЄНТА. Для мовного процесора, що діє в режимі клієнта, клієнтські LIPC-служби спочатку потребують упорядкування фактичних параметрів (зокрема результат, що повертається і розглядається як додатковий вихідний out-параметр) до LIPC-форми. Упорядкування включає для кожного фактичного параметра як ідентифікацію методу передачі параметрів, так і відображення локального типу даних на відповідний LI-тип даних. Бажано включати "дозволені розширення" типів даних, допустимі для параметрів, щоб розширити діапазон LIPC-процедур, наприклад, дозволити передачу агрегатів як параметрів. Так само, як типи даних фактичних параметрів, стандарт прив'язки має цитувати механізм передачі параметрів, підтримуваний стандартом мови, та зв'язувати його з режимом передачі параметрів LIPC-стандарту, разом з правилами упорядкування параметрів для кожного виду. Це треба робити явно скрізь, де цей механізм допустимий, рекомендований або обов'язковий. Звісно ж, прив'язка режиму клієнта також має враховувати зворотне розупорядкування результатів, що повертаються після виклику (вихідних параметрів).

ПРИВ"ЯЗКА ДО РЕЖИМУ СЕРВЕРА. Для мовного процесора, що діє в режимі серверу, LIPC-служби зі сторони серверу потребують розупорядкування вхідної LIPC-форми у форму, потрібну для аналогічного виклику власною мовою серверу. Це вимагає перетворення LI-типів даних і, можливо, також перетворення типів даних. Стандарт на мову серверу може допускати деякі автоматичні перетворення типів даних. Перетворення типів даних у LIPC-викликах мають два види: усередині LIPC-служб протягом розупорядкування, визначеного в стандарті прив'язки, та при ініціалізації процедури усередині процесора серверу, який не визначено. Деякі фактичні параметри можуть дійсно пройти перетворення обох видів. Клієнт, що викликає, не бачить цих розходжень. Стандарт прив'язки для режиму серверу має визначити не тільки відображення LI-типів даних параметрів, але також явно дозволяти перетворення з LI-типів даних без прямих еквівалентів мовою серверу. Щодо прив'язки до режиму клієнта згадувалися допустимі режими передачі параметрів усередині мови. Звичайно, це поширюється і на сторону серверу. Стандарт прив'язки має гарантувати, що між ними відсутня неузгодженість. Звісно, прив'язка до режиму серверу також має враховувати зворотне розупорядкування результатів, що повертаються (вихідних параметрів) внаслідок виклику.

У загальному випадку безпосередній виклик буває одного з трьох видів: 1. процедура локальна зі сторони серверу; (звичайний виклик) 2. процедура локальна зі сторони клієнта; (зворотній виклик) 3. процедура не локальна ані для клієнта, ані для серверу, але постійно знаходиться на іншому сервері. (сервер стає клієнтом по відношенню до 3-ї сторони) Стандарт прив'язки має охоплювати всі три випадки.

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

Можливості різних варіантів LIPC-виклику (локального, віддаленого, багатоланкового)

Можливості різних варіантів LIPC-виклику (локального, віддаленого, багатоланкового)

У загальному випадку безпосередній виклик буває одного з трьох видів: 1. процедура локальна зі сторони серверу; 2. процедура локальна зі сторони клієнта; 3. процедура не локальна ані для клієнта, ані для серверу, але постійно знаходиться на іншому сервері. Стандарт прив'язки має охоплювати всі три випадки. У випадку 1 сервер може просто ви-користовувати звичайний виклик процедури і продовжувати роботу. У випадку 2, коли процедура, що викликається з параметром, локальна для сторони клієнта, виклик складає "зворотний виклик" із сторони серверу (що діє в режимі клієнта для цього параметра типу даних Процедура) до сторони клієнта (що діє в режимі серверу для того ж параметра процедури). Отже, параметри процедури не можуть підтримуватися, якщо процесори по обидві сторони не можуть діяти в обох режимах, і правила узгодження для стандарту LIPC-прив'язки повинні відобразити цю обставину. Зазначимо, оскільки обидві сторони узгоджено в обох режимах, дві LIPC-служби можуть погоджувати режими передачі параметрів для виклику фактичних параметрів типу даних Процедура так само добре, як і для початкового виклику. Зазначимо, що режим передачі "виклик з посиланням значень за запитом" та посилання в тілі процедури серверу на параметри-покажчики, можуть трактуватися так, ніби вони були зворотним викликом "мініпроцедур", але це не повинно враховуватися стандартом LIPC-прив'язки. Це пов'язано з підтримкою властивостей, яка не потребує повної підтримки обопільного виклику процедури, і може залишатися залежною від реалізації, хоча, можливо, підпорядкованою деяким обмеженням або умовам. У випадку 3, коли процедура, що викликається параметром процедури, знаходиться в третій системі, звертання тягне за собою дії сторони серверу в режимі клієнта щодо третьої системи. Отже, також у цьому випадку сторона серверу (але не сторона клієнта початкового звертання) повинна мати здатність діяти в обох режимах, а правила узгодження для стандарту LIPC-прив'язки зобов'язані це відобразити.


//Хз, чи це треба

LIPC-механізму передбачено можливість для процедури бути параметром іншої процедури. Три випадки випливають із властивостей параметрів процедури.

1. LIPC-посилання /Локальний доступ. Процедура A, написана мовою X, викликає процедуру B на мові Y і передає процедурі B покажчик на процедуру C, що також написана мовою Y. Існує спосіб для посилання мови X на процедуру C у порядку генерування покажчика, переданого процедурі B. Це посилання на C має позначатися як LIPC-посилання. Після початку виконання B зрештою викликається C, але це - просто локальний виклик і немає потреби в LIPC-доступі. Процедура B має розуміти, як викликати процедуру C "локально", виходячи з інформації переданого LIPC-посилання. Language X

A: begin B(C); end

Language Y

B: begin C; end C: begin end

2. LIPC-посилання / LIPC-доступ. Процедура A на мові X викликає процедуру B на мові Y та передає процедурі B покажчик на процедуру C, що написана мовою X. Як підсумок B викликає C і тоді звертання до C повинно використовувати LIPC-доступ, оскільки виклик перетинає межу. Окрім цього, для виклику C процедура B повинна мати LIPC-посилання на C. Цю інформацію можна одержати з того, що було передано з процедури A.

Language X

A: begin B(C); end C: begin end

Language Y

B: begin C; end

3. Локальне посилання / локальний доступ. Процедура A мовою X викликає процедуру B на мові Y та передає процедурі B покажчик на підпрограму D, що написана мовою X. Зрештою B викликає процедуру C на мові X, передаючи процедурі C покажчик на підпрограму D. Потім C викличе D, але в цьому випадку посилання та доступ C до D локальні. В цьому немає потреби для покажчика, який описує D як LIPC-посилання у формі, що допускає перетворення в середовищі B та зворотно до початкового стану.

Language X

A: begin B(D); end C: begin D end D: begin end

Language Y

B: begin C(D) end

Методи передачі параметрів процедури за LIPC-моделлю.

Методи передачі параметрів процедури за LIPC-моделлю.

1. Виклик за значенням, що надходить при ініціалізації - це найпростіша форма передачі параметрів. Формальні параметри процедури серверу приймають значення необхідного типу даних. За віртуальним контрактом клієнт оцінює фактичні параметри і передає ці значення під час передачі управління. Процедура серверу приймає ці значення і більше не виконує дій відносно цих параметрів. Цей вид передачі параметрів загальновідомий як виклик за значенням. 2. Виклик за значенням, що надходить за запитом. Віртуальний контракт для цього різно-виду передачі параметрів полягає в тому, що клієнт бере на себе оцінку фактичних параметрів і постачає отримані значення, але тільки після одержання запиту від процедури серверу на вчи-нення цих дій. Оцінка і передача фактичних параметрів має місце тільки у разі їхнього запиту про-цедурою серверу. Це може відбутися на початку виклику або протягом усього виклику. Використання сервером типів параметрів при виклику за значенням, що надсилається за запитом, можна розглядати як виклик неявних параметрів процедури, коли процедура серверу виконується єдиний раз. Наступні посилання процедури серверу на формальні параметри просто використовують як однакові значення. Процедура серверу більше не запитує значень. 3. Виклик за значенням, що повертається після завершення. У цьому різновиді передачі параметрів віртуальний контракт такий, що при завершенні виклику процедура серверу постачатиме формальний параметр значенням типу даних, клієнт одержуватиме його і надсилатиие значення, що повертається, відповідному адресату. Цей різновид передачі параметрів більш відомий як виклик за значенням, що повертається, і по суті out еквівалентно виклику за значенням, що посилається при ініціалізації. Концептуально клієнт, а не процедура серверу посилає адресату значення, що повертається, тому що мова клієнта або перетворення визначають інтерпретацію адресата і процес повернення. Такий різновид передача параметрів також забезпечує повернення значення для процедури загалом у випадку процедур-функцій. Передача параметрів провадиться викликом за значенням, що повертається, при завершенні процедур-функцій з використанням додаткових неіменованих (системних) параметрів. 4. Виклик за значенням, що повертається, коли воно доступне. Процедура серверу повертає значення параметра в момент, коли доступне значення, що повертається. Воно може бути повернене в процесі виклику, після завершення виклику або через якийсь час. Який час вибрати, визначено прив'язкою до базисного LIPC-сервісу і не специфіковано в LIPC-стандарті. Усі LIPC-моделі вимагають забезпечення цієї можливості. Віртуальний контракт щоразу полягає в тому, що процедура серверу повертає значення, клієнт сприймає його і шле відповідному адресату це повернене значення. Причому не виключено, що значення повертатиметься не один раз.

Різниця між викликом за значенням, що надходить при ініціалізації, і викликом за значенням, що надходить за запитом.

Різниця між викликом за значенням, що надходить при ініціалізації, і викликом за значенням, що надходить за запитом.

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

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

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

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

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

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

Організація імпорту глобальних даних у процедуру.

Організація імпорту глобальних даних у процедуру.

Камєнт Перевозчикової: "Деякі мови програмування мають глобальні змінні. Це екстернали або коммон блоки (фортран). В ЛІПС нема зовнішних змінних. Ми їх обробляємо, як ніби викликаємо процедуру. Вони проходять по правилах маршалінгу для параметрів процедур, які передаються за значенням".

Глобальні дані використовують для приховування даних при сукупному виконанні, на які можуть посилатися інші виконувані процедури в різноманітних контекстах виклику. По суті глобальні дані вимагають упорядкуввання/розупорядкування окремих одиниць. Відповідність реалізації LIPC-стандарту може підтримувати визначений реалізацією механізм для сукупного використання глобальних даних і їхньої розбивки. Розбивка даних стосується можливості відділення даних від процедур. Рекомендовано підтримувати глобальні дані за допомогою неявних параметрів, які можна передавати під час виклику, проте це не єдиний надійний механізм. В IDN глобальні дані вказують як явні параметри процедур. Зокрема мовне перетворення цих явних параметрів можна підтримувати таким механізмом процедур, як зовнішні змінні. Глобальні дані доступні серверу у разі потреби, наприклад, перед викликом, під час виклику, перед вимогою на використання або під час запиту. Механізм, за яким об'єкти в контексті виклику зв'язуються з глобальними об'єктами, визначено мовою, мовним перетворенням або задано реалізацією.


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

Обробка завершень процедури

Обробка завершень процедури

1. Нормальне завершення. Нормально завершена процедура породжує завершення, що вказує на нормальне повернення. Процедура може додатково повідомляти про завершення; наприклад, при поверненні із синхронного виклику процедури, остання може повертати два або більше завершень; проте лише перше з них визначає, чи є завершення нормальним, аварійним або скасованим. При асинхронному виклику процедури може повертатися додатковий код завершення до, протягом або після завершення процедури. 2. Аварійне завершення. Аварійно завершена процедура генерує завершення як результат умови, відмінної від зовнішньої команди скасування. Звичайна причина аварійного завершення процедури полягає в тому, що процедура натрапляє на певну умову, яка унеможливлює продовження або успішне завершення функції(й), запитуваних процедурою клієнта, яку сповіщають залежним від реалізації механізмом про завершення. Аварійні завершення розділяють на випадки: - процедура виявляє аварійне завершення як частину власної логіки і внаслідок цього виконує явну процедуру аварійного припинення роботи; - аварійне завершення відбувається протягом виконання процедури, викликаючи помил-ку на рівні, нижче рівня логіки самої процедури; помилка змушує передати управління службовій утиліті обробки несправностей усередині процедури і завершити процедуру аналогічно попередньому випадку. Спеціальний випадок аварійного завершення процедури має місце при одному або більшій кількості неправильних фактичних значень параметрів виклику процедури, наприклад, значення має неправильний тип даних параметра або правильний тип даних, але за межами необхідного діапазону. У цій ситуації можна розрізнити значення параметра, що порушують задані вимоги інтерфейсу процедури, як визначено в IDN, і значення (комбінації значень), що порушують специфічні обмеження застосування, які не можна визначити в IDN-нотації і, отже, процедурі їх треба явно перевірити. Проте щодо процедури клієнта єдине розходження полягає в тому, що в першому випадку обумовлена помилка є однією з визначеного LIPC-стандартом набору. В другому випадку - це специфічний для прикладної програми код умови, визначений іншим стандартом, можливо, специфічним для застосування. 3. Зовнішнє скасування. Процедура завершується зовнішнім скасуванням, якщо ззовні процедури видано команду, що викликає аварійне або нормальне, заздалегідь встановлене завершення процедури. При асинхронному виклику скасування може походити від процедури клієнта. При синхронному або асинхронному виклику команда скасування процедури може походити ззовні ззовні LIPC-моделі. Ці два випадки не розрізнює процедура серверу, а процедура клієнта одержує повідомлення через механізм завершення, обумовлений реалізацією. 4. Наперед визначені умови. Реалізації, що узгоджено з LIPC-стандартом, мають повідомляти принаймні про такі завершення протягом виклику процедури: - недоступна процедура серверу, виклик не можна виконати; - клієнт або процедура серверу не має визначень відображення до IDN (перетворення даних з однієї форми на іншу); - значення виходить за межі діапазону, установленого для параметрів типу даних; - скасування виклику; - недостатньо доступних ресурсів для завершення виклику; - нормальне завершення виклику. 5. Синхронний і асинхронний виклик. Проблема, чи виконується виклик одночасно чи асинхронно, знаходиться поза LIPC-стандартом. LIPC-модель не забороняє ані синхронного, ані асинхронного звертання. При реалізації вибирають, як обмежити число ниток виконання. 6.Рекурсія у LIPC-моделі не заборонена. Порядок здійснення реалізацією рекурсивного виклику процедури лежить поза дією LIPC-стандарту. Розробники мають знати, що при оптимізації для LIPC-виклику слід враховувати рекурсію.

Роль образу процедури і віртуального контракту

Роль образу процедури і віртуального контракту Образ процедури є абстракцією тексту процедури. Неявними в образі процедури є типи даних Процедура, глобальні, локальні і символи параметрів, використовувані усередині тексту процедури, і алгоритм, виконуваний мовним процесором. На образах процедур визначені чотири операції: gsyms: Image -> Sequence(Symbol) Isyms: Image -> Sequence(Symbol) psyms: Image -> Sequence(Symbol) spec: Image -> Procedure.Type Упорядкування всередині послідовності, виконуване gsyms і Isyms, застосовується рідко, у той час як упорядкування усередині послідовності, виконуване psyms, важливе. Операція gsyms повертає глобальні символи відображення, Lsyms, psyms, і spec повертають локальні символи, символи параметрів і тип процедури відповідно. Образи процедур створюються мовним процесором. Питання створення образу процедури лежать поза дією LIPC-стандарту.

Ілюстрація зв'язку процедур клієнта і серверу за відповідності їхньої реалізації LIPC-стандарту. Віртуальний контракт між процедурами клієнта і серверу визначається IDN-нотацією. При конкретизації виклику, інтерфейс упорядкування впорядковує параметри і подає цю інформацію постачальнику LIPC-клієнта. Постачальник LIPC-клієнта зв'язаний із постачальником LIPC-серверу через фактичний контракт, поданий формою, що передається, (наприклад, ASN.1). Потім постачальник LIPC-серверу розупорядковує дані, через інтерфейс розупорядкування на сумісну з процедурою серверу форму. Після повернення процес міняється місцями з інтерфейсом розупоряд-кування, що тепер є інтерфейсом упорядкування, а інтерфейс упорядкування стає інтерфейсом розупорядкування.

ВІРТУАЛЬНИЙ КОНТРАКТ - процедурна сторона (сервер) встановлює угоди для надання послуг або сервісу (або виконання процедур), а сторона програми (клієнта) погоджується надавати необхідну для їхнього виклику інформацію (фактичні параметри) згідно з встановленими методами передачі параметрів.

Поняття типу Інтерфейс

Поняття типу Інтерфейс Тип Інтерфейс – сукупність імен і типів даних Процедура, відображуваних один на одного. Це моделюється як асоціація, що відображає набір типів даних Процедура на імена. Тип Інтерфейс не є типом даних. Наприклад, якщо Sue, Mary і Sam є імена процедур, X, Y і Z - замикання процедури типів даних Процедура XT, YT і ZT відповідно, то IT = [Sue —• XT] + [Mary —• YT] + [Sam -r ZT]

є типом Інтерфейс, що відповідає закриттю інтерфейсу. 

LIPC-модель визначає операцію spec над образом процедури для повернення процедурного типу образа. Таким чином, spec: Image * Procedure_Type Причому spec узагальнюється до замикань процедур за допомогою spec: Procedure_Closure * Procedure_Type spec (< image, assoc>) = spec (image) і spec далі узагальнюється до таких закриттів інтерфейсу, де P - procedure_type (тип даних Процедура) і I - interface_closure (закриття інтерфейсу): spec: Interface_Closure * Interiace_Type For I = [name1 * P1] + . . . + [namen * Pn] , spec (I) = [narne1 * spec(P1)] + ... + [namen * spec(Pn)] Операція spec на interface_closures повертає асоціацію між типами даних Процедура й іменами.

LIPC-механізм передачі параметрів, що є процедурами

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

	1.LIPC-посилання /Локальний доступ. Процедура A, написана мовою X, викликає процедуру B на мові Y і передає процедурі B покажчик на процедуру C, що також написана мовою Y. Існує спосіб для посилання мови X на процедуру C у порядку генерування покажчика, переданого процедурі B. Це посилання на C має позначатися як LIPC-посилання. Після початку виконання B зрештою викликається C, але це - просто локальний виклик і немає потреби в LIPC-доступі. Процедура B має розуміти, як викликати процедуру C "локально", виходячи з інформації переданого LIPC-посилання. 

2.LIPC-посилання / LIPC-доступ. Процедура A на мові X викликає процедуру B на мові Y та передає процедурі B покажчик на процедуру C, що написана мовою X. Як підсумок B викликає C і тоді звертання до C повинно використовувати LIPC-доступ, оскільки виклик перетинає межу. Окрім цього, для виклику C процедура B повинна мати LIPC-посилання на C. Цю інформацію можна одержати з того, що було передано з процедури A. 3. Локальне посилання / локальний доступ. Процедура A мовою X викликає процедуру B на мові Y та передає процедурі B покажчик на підпрограму D, що написана мовою X. Зрештою B викликає процедуру C на мові X, передаючи процедурі C покажчик на підпрограму D. Потім C викличе D, але в цьому випадку посилання та доступ C до D локальні. В цьому немає потреби для покажчика, який описує D як LIPC-посилання у формі, що допускає перетворення в середовищі B та зворотно до початкового стану.

Концепція співставлення LIPC-виклику та механізму IDL-специфікації RPC-виклику

Концепція співставлення LIPC-виклику та механізму IDL-специфікації RPC-виклику

Поняття, неявні в LIPC-нотаціях IDN (Interface Definition Notation), порівнюються з поняттями, неявними в Мові опису інтерфейсу RPC (RPC IDL - RPC Interface Definition Language). Для цих двох нотацій деталізовані синтаксичні форми не порівнюються. Взагалі LIPC IDN надає багатший набір семантичних розходжень за RPC IDL. Кожний RPC IDL-тип має достатньо узагальнену еквівалентну форму в LIPC IDN. Тобто LI-тип даних описує той же набір значень, що і тип RPC. Проте RPC IDL може описувати розбіжності подання, що не потрапляють до ділянки дії LIPC, та надавати додаткову інформацію щодо конкретних специфікацій RPC-служб. Оголошення верхнього рівня в LIPC IDN та RPC IDL – це оголошення інтерфейсу. Якщо пропуск ідентифікатора інтерфейсу в специфікації не викликає неоднозначності, оголошення інтерфейсу можна пропустити, а “нормальне” оголошення можна використовувати як оголошення верхнього рівня.

RPC - відрізняються за організацією від ЛІПС. Віддалений виклик процедур відбувається зовсім інакше, за зразками, коли не було програмістського втілення контракту. Такий виклик ішов через порти. LIPS виграє завдяки існуванню протоколу, маршалінгу, анмаршалінгу, моделі ЛІДТ перетворення. Автоматичний маршалінг і анмаршалінг - це круто. Ця фіча є в ЛІПС. Треба зробити стандарт, в якому описати зовнішнє і внутрішнє перетворення - це і є стандарт прив"язки. Зовнішнє перетворення - перетворення внутрішніх типів мови у LIDT (Language Independent Data Types). Внутрішнє перетворення - перетворення LIDT у внутрішні типи мови.

RPC is an obvious and popular paradigm for implementing the client-server model of distributed computing. An RPC is initiated by the client sending a request message to a known remote server in order to execute a specified procedure using supplied parameters. A response is returned to the client where the application continues along with its process. There are many variations and subtleties in various implementation, resulting in a variety of different (incompatible) RPC protocols. While the server is processing the call, the client is blocked (it waits until the server has finished processing before resuming execution). In order to allow servers to be accessed by differing clients, a number of standardized RPC systems have been created. Most of these use an interface description language (IDL) to allow various platforms to call the RPC.

Характеристика перетворення примітивних LI-типів даних на типи мови RPC IDL

Примітивні LI-типи даних і підтипи

Логічний або булевий (Boolean) тип ідентичний у LIPC IDN та RPC IDL.

Стан. До LI-типу Стан подібний RPC IDL-генератор типів перелічення, за винятком того, що значення типу даних Стан не упорядковано. При трансляції RPC типу даних перелічення в LIPC IDN необхідне знання семантики застосування для вибору найкращої відповідності (Стан у порівнянні з переліченням).

Переліковний. LI-типу Переліковний ідентичний RPC IDL-генератору типів перелічень. При трансляції RPC типу даних перелічення в LIPC IDN, необхідне знання семантики застосування для добору найкращої відповідності (Стан у порівнянні з перерахуванням).

Символьний. LI-тип даних Cимвольний (R) складається з усіх символів стандартного репертуару R. Є чотири символьні типи даних RPC IDL: char, ISO_LATIN_1, ISO_UCS та ISO_МULTI_LINGUAL. У RPC IDL тип даних char описує реалізація, але гарантовано містить принаймні репертуар символів ISO 646. Якщо char використано лише для мобільності, то маємо таке зіставлення:

RPC-тип LIPC-еквівалент
char character (iso standard 646)
ISO_LATIN_l character (iso(l) standard(0) 8859 part(l))
ISO_UCS character (iso(l) standard(0) 10646)
ISO_MULTI_LINGUAL character (iso(l) standard(0) 10646 multi-lingual-plane)

Три RPC IDL символьні типи ISO становлять подання нарівні з репертуаром.

Порядковий. LI-тип даних Порядковий подібний цілочисловому діапазону (0 ...). Найближчим RPC IDL аналогом може бути unsigned hyper.

Час. RPC IDL не має аналогів у LIPC IDN-генераторі часових типів. Можливе кодування типу time (unit, radix, factor) із LIPC IDN у тип RPC IDL полягає в інтерпретації hyper, коли значення h типу hyper інтерпретується h * [radix-factor) * unit, що розглядається як значення типу time(unit, radix, factor).

Цілочисловий. LI-тип даних Цілий задає необмежений діапазон цілих, а RPC IDL надає 8 цілочислових типів у такий спосіб:

RPC-тип LIPC-еквівалент
hyper integer range (-263 .. 263-1)
long integer range (-231 .. 231-1)
short integer range (-215 .. 215-1)
small integer range (-27 .. 27-1)
unsigned hyper integer range (0 .. 264-1)
unsigned long integer range (0 .. 232-1)
unsigned short integer range (0 .. 216-1)
unsigned small integer range (0 .. 28-1)

При трансляції з LIPC integer у RPC IDL необхідне знання семантики застосування для вибору найкращої відповідності. Пряма трансляція неможлива.

Раціональний. У RPC IDL відсутній аналог для LI-типу даних Раціональний (Rational). Можливим перетворенням раціонального LI-типу даних у тип RPC IDL може бути:

struct { hyper numerator, denominator; }

де denominator більший за 0, а numerator і denominator взаємно прості (coprime).

Масштабований. У RPC IDL немає аналога LI-типу даних Масштабований. Можливе перетворення LI-типу даних scaled(radix, factor) в RPC IDL тип полягає в такій інтерпретації hyper, що значення h типу інтерпретовано як h * (radix-factor).

Дійсний. LIPC IDN надає генератор типів real із ступенем наближення (radix-factor). RPC IDL надає два наближення до дійсних чисел: float (з рухомою крапкою) і double (подвійна). Точність і діапазон цих двох типів не визначено, хоча їх можна поставити у відповідність IEC 559 типам single (одиночна) і double (подвійна) точності. Тоді LIPC-аналоги цих типів такі:

RPC-тип LIPC-еквівалент
float real(2,24)
double real (2,53)

Комплексний. RPC IDL не має аналогів генератора LI-типу даних Комплексний. Можливе кодування LIPC IDN-типу complex(radix, factor) у RPC IDL тип полягає в одному із способів:

struct { float real_part, imaginary_part; }

struct { double real_part, imaginary_part; }

де вибір між float та double може ґрунтуватися на визначенні найкращого наближення одного з типів до real(radix, factor).

Пустий. LIPC IDN і RPC IDL надають ідентичний тип даних Пустий (void). Проте використання void у RPC IDL зведено до вказування покажчика або до типу, що повертається, для процедури. Здавалося б, покажчик на пустий тип void має незначне використання. Проте в RPC IDL є неявне припущення (можливо, успадковане з Cі), що будь-який T* можна привести до/з void* без втрати інформації. Отже, void* використовують для передачі покажчика на дані через інтерфейс «як чорну скриньку» (без відомостей про вміст). Його аналогом у LIPC IDN є Приватний.

Тип специфікаторів. RPC IDL не має засобів, відповідних шести LI-типам специфікаторів: Діапазон, Відбір, Вилучення, Розширений, Розмір і Підтип.

Характеристика перетворення підтипів і розширених LI-типів даних на типи мови RPC IDL

Характеристика перетворення згенерованих LI-типів даних Вибір, Покажчик, Процедура на типи мови RPC IDL

Згенеровані типи даних

Вибір. RPC IDL-генератор типів union (об'єднань) має ту ж семантику, що і генератор LI-типу даних Вибір, за винятком того, що у RPC IDL тип Ознака обмежено цілочисловим типом integer, булевим, символьним (char) або типом перелічення (enumeration). У LIPC IDN ознака може бути будь-яким точним типом даних, тобто не стосується LI-типів даних, Комплексний і будь-якого згенерованого з них.

У LIPC IDN та RPC IDL можна пропускати в значенні тегову частину choice або union. Це може виконуватися тільки, коли choice або union вкладено в більший тип даних (або список параметрів), одне з полів якого задає значення ознаки.

RPC IDL забороняє використання масивів, які суміщуються, (conformant array) або масивів, що змінюють сумісність, (conformant-varying array) як альтернативу union. У LIPC IDN немає таких обмежень.

Покажчик. Генератор LI-типів даних Покажчик і RPC IDL-генератор типів T* мають майже одну семантику. Проте RPC IDL надає два атрибути для зміни значення покажчиків і значно обмежує їхнє використання.

RPC-тип LIPC-аналог
[ptr] T * pointer to (T)
[ref] T * pointer to (T) excluding (null)

RPC IDL-атрибут [ref] також надає інформацію для RPC-послуг, зокрема твердження про відсутність псевдоніму даних, що передано через Покажчик (referenced by pointer) у процесі RPC-виклику. У RPC IDL допускається, що деякі покажчики будуть еквівалентні масивам або розглядаються як замінники масивів. Отже, при трансляції типу Покажчик із RPC IDL у LIPC IDN необхідні знання семантики застосування і деталізованих правил RPC IDL для вибору найкращої відповідності (покажчик у порівнянні з масивом).

Процедура. RPC IDL не підтримує тип даних Процедура. LIPC-процедури визначено як операції в RPC.

Характеристика перетворення агрегатних згенерованих LI-типів даних на типи мови RPC IDL

Агрегатні типи даних

Запис. Генератор LI-типу даних Запис ідентичний RPC IDL-генератору структурних типів struct.

Набір. RPC IDL-генератор не задає тип даних Набір; можна оформити LI-тип даних Набір як RPC IDL-масив. Наприклад,

LI-тип даних RPC-аналог
set of (T) struct { long size; T element [size]; }

При трансляції типу даних Масив із RPC IDL у LIPC IDN необхідне знання семантики застосування для визначення того, що насправді можна використовувати як набір.

Портфель як множина з повторюваними елементами. RPC IDL не має генератору типу даних Портфель (bag). Поняття портфеля в LIPC IDN можна оформити як RPC IDL-масив:

LI-тип даних RPC-аналог
bag of (T) struct { long size; T element [size]; }

При трансляції типів масиву з RPC IDL у LIPC IDN необхідне знання семантики застосування для визначення того, що дійсно необхідно використовувати як множину з повторюваними елементами.

Послідовність. RPC IDL не має генератора типу даних Послідовність. В LIPC IDN послідовність можна оформити як RPC IDL-масив. Наприклад,

LI-тип даних RPC-аналог
sequence of (T) struct { long size; T element [size]; }

При трансляції типу масив із RPC IDL у LIPC IDN необхідне знання семантики застосування для визначення того, що дійсно необхідно використовувати які послідовність.

Масив. Усі значення конкретного LI-типу даних Масив мають однаковий розмір і індексовані набором значень типів даних Індекс, що можуть бути якимось скінченним типом. RPC IDL-генератор типів Масив (array) також визначає індексовані сукупності значень. Проте єдиний дозволений індексний тип - діапазон цілих чисел.

LI-тип даних RPC-аналог
T [a..b] array (integer range (a..b)) of (T)

У LIPC IDN та RPC IDL допускаються багатовимірні масиви. Надаються засоби визначення меж масиву залежними значеннями. RPC IDL робить різницю між збереженими границями (storage bounds) масиву і справжніми величинами границь (valid-data bounds) того ж масиву. Специфікації LIPC IDN незалежні від подання інформації цього сорту. Сумісний масив RPC IDL використовує залежні значення для визначення збережених (у пам'яті) границь масиву. Динамічний масив RPC IDL використовує залежні значення для визначення реальних границь масиву.

Оскільки в RPC IDL послідовності, портфелі і таблиці не відрізняються від масивів, використання RPC-масивів вірніше розглядати як послідовність.

Таблиця. RPC IDL не забезпечує генератор LI-типу даних Таблиця (table). Поняття таблиці в LIPC IDN можна оформити як RPC IDL-масив структур (array of structs). Наприклад,

LI-тип даних RPC-аналог
table (FL) struct { long size; struct {FL'} row [size]; }

де FL є RPC-еквівалентом LIPC-списку полів FL. При трансляції типу даних Масив із RPC IDL у LIPC IDN необхідне знання семантики застосування для визначення того, що дійсно необхідно використовувати як таблицю.

Характеристика перетворення оголошених LI-типів даних і генераторів на типи мови RPC IDL

Особисті інструменти