Розробка уроку

Тема: cтворення й використання бібліотек (модулів) мовою Pascal. Застосу­вання методу функціональної декомпозиції задачі.

Мета:

Після вивчення теми учень:

Обладнання: комп'ютери зі встановленими ОС, браузером, середовищами Free Pascal і Lazarus, (дана) інструкція.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Інструктаж з ТБ.
  5. Вироблення практичних навичок.
  6. Підбиття підсумків уроку.
  7. Домашнє завдання.

Хід уроку

1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань

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

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

Сталавид даних, значення яких заборонено змінювати протягом виконання програми.

Зміннавид даних, значення яких дозволено змінювати протягом виконання програми.

Всі величини поділяють на:

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

Процедурапідпрограма, призначена лише для виконання певних дій.

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

В описі підпрограми необхідно:

Синтаксис виклику підпрограми

procedure назва_процедури
  (   назва_параметра-сталої  : тип_параметра-сталої;
  var назва_параметра-змінної : тип_параметра-змінної);
  {опис локальних змінних при потребі}
begin 
  {тіло процедури}
end;

function назва_фукції
  (   назва_параметра-сталої  : тип_параметра-сталої;
  var назва_параметра-змінної : тип_параметра-змінної):
  тип значення функції;
  {опис локальних змінних при потребі}
begin 
  {тіло функції}
end;

Тіло підпрограми функціївказівки підпрограми, записані між службовими словами begin та end.

3. Вивчення нового матеріалу

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

Модуль (англійською Unit) — це окремо компільована частина програми, яка може включати в себе типи, сталі, змінні, підпрограми (процедури і функції).

Структура коду модуля мовою Pascal

Unit Назва_модуля;
interface      … // інтерфейсна частина
implementation … // виконувана частина
initialization … // необов'язкова частина ініціалізації
finalization   … // необов'язкова завершальна частина
end.

Назва модуля має збігатися з назвою файлу з кодом цього модуля.

Зазвичай для модулів вибирають зрозумілі (з натяком на вміст) назви, відмінні від назв стандартних (вбудованих) модулів.

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

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

Тут можна вказати під'єднувані модулі після службового слова uses.

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

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

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

Тут можна виконати підготовчу роботу: відкрити файл, надати значення змінній тощо.

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

Тут зазвичай звільняють зайняті програмою ресурси, зберігають результати роботи, закривають файли тощо.

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

При створенні модуля у середовищі Lazarus буде створено файл Unit* (тут * — деяке натуральне число) з таким наповненням:

unit Unit*;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

implementation

end.

Приклад коду модуля myunit.pas

unit MyUnit;
{$mode objfpc}{$H+}

interface
function f2 (x: real): real;
function f3 (x: real): real;

implementation
uses Classes, SysUtils;
function f2 (x: real): real; begin f2:=x*x   end;
function f3 (x: real): real; begin f3:=x*x*x end;
end.

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

Компіляція модуля MyUnit призведе до появи двох файлів:

Для середовища Free Pascal, що не зазнало переналаштування, ці файли буде записано у поточній теці, для середовища Lazarus — у спеціально призначеній теці. Наприклад, при ОС Windows і 64-бітній адресації — у теці D:\lazarus\fpc\3.2.0\units\x86_64-win64 з точністю до розташування теки lazarus і версії 3.2.0.

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

Назви і призначення найуживаніших модулів:

Бібліотека — файл з кодом програми, призначений для зберігання часто використо­вуваних функцій, класів, сталих.

Разом з компілятором Pascal поширюють так звані стандартні бібліотеки (модулі) Pascal.

Додатково до можливостей стандартної бібліотеки чи інших встановлюваних бібліотек користувач має можливість створювати власні бібліотеки.

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

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

Недоліки статичних бібліотек

Динамічно зв'язувана (динамічна) бібліотека (англійською Dynamic Link Library) — бібліотека, з якої на етапі компіляції у виконуваний файл вбудовують лише таблицю посилань. Це універ­саль­ний механізм впровадження у програму підпрограм, написаних іншими програ­містами і, можливо, іншою мовою програмування. Впровадження відбувається не під час компіляції, а під час завантаження відкомпільованої програми в оперативну пам'ять.

Файл бібліотеки зазвичай має певне розширення:

Насправді бібліотеці може мати довільне, у тому числі й порожнє, розширення. Наприклад, драйвери пристроїв при ОС Windows мають розширення drv.

При ОС Linux / Unix на етапі компіляції назва файлу бібліотеки набуває префікс lib. Наприклад, якщо файл коду має назву MyLibrary.lpr, то файл бібліотеки матиме назву libmylibrary.so.

Файл so / dll / dylib cтворюють як окремий застосунок. Але після компіляції сам по собі він працювати не може, бо не має власної точки входу, як виконуваний файл.

Алгоритм використання динамічно зв'язуваної бібліотеки

  1. Створити динамічно зв'язувану бібліотеку — файл so / dll / dylib.
  2. Створити застосунок з викликом зв'язуваної бібліотеки.
  3. Розташувати файл so / dll / dylib:
    • або у тій самій теці, що і проєкт;
    • або у системній теці, до якої у системній змінній PATH вказано шлях.

Програма довантажує бібліотеку без вказання адреси її розташування: операційна система переглядає спочатку поточну теку програми, а потім — всі теки, перелічені у змінній PATH. Функції та процедури, описані у DLL, програма сприймає, як свої власні, а довантаження бібліотеки буде здійснено лише після виклику таких функцій і процедур.

При поширенні програми потрібно подбати і про поширення відповідних динамічно зв'язуваних бібліотек.

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

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

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

У ній можна використовувати й об'єкти. Нагадаємо: властивості об'єктів — це глобальні змінні.

Структура коду бібліотеки

library Назва_бібліотеки;

{$mode objfpc}{$H+}

uses
  Classes { перелік необхідних модулів };

{ код підпрограм бібліотеки }

exports  { перелік через кому назв підпрограм }

end.

Наприкінці коду бібліотеки за допомогою вказівки name подають список підпрограм бібліотеки, які можна викликати із зовнішніх програм. Якщо назви підпрограми у бібліотеці й головній програмі відрізняються, то у переліку використовують такий запис:

Назва_у_коді_бібліотеки name 'Назва,_за_якою_викликають_у_коді_програми'

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

Вказівка
виклику
Опрацювання
параметрів
Очищує
стек
Дозволено
передавання
параметрів
через
регістри
RegisterЗліва направоПідпрограма Так
PascalЗліва направоПідпрограма Ні
CdeclСправа налівоПрограма Ні
StdcallСправа налівоПідпрограма Ні

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

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

Вказівки виклику register і pascal передають параметри зліва направо. Інакше кажучи, перший параметр зліва обчислюють і передають першим, а останній параметр, записаний праворуч, обчислюють і передають останнім.

Вказівки виклику cdecl і stdcall передають параметри навпаки, справа наліво. Для того, щоб бібліотека була доступна програмами, написаних іншими мовами, найбезпечнішим способом буде використати вказівку stdcall.

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

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

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

При статичному зв'язуванні код програми має містити таке:

implementation
{$R *.lfm}

function   назва_функції  (опис_аргументів): тип_значення_функції;
  вказівка_виклику;
  external 'назва_бібліотеки';
 
procedure назва_процедури (опис_аргументів);
  вказівка_виклику;
  external 'назва_бібліотеки';

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

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

Процедура динамічного зв'язування містить такі кроки.

  1. Забезпечення можливості динамічного зв'язування.
  2. Завантаження бібліотеки функцією LoadLibrary й отримання цілого числа — значення ідентифікатора бібліотеки.
  3. Отримання адрес підпрограм за допомогою GetProcAddress.
  4. Безпосереднє використання підпрограм з бібліотеки.
  5. Вивантаження бібліотеки з пам'яті.

Розглянемо приклад програмного втілення цих кроків для функцій f дійсного аргумента, що повертає дійсне значення і описана у бібліотеці MyLibrary.

// 1. Забезпечення можливості динамічного зв'язування
uses  Classes, Dynlibs; // модуль роботи з бібліотеками

// опис типу функції з вказівками виклику
type Tf = function(x: real): real; cdecl;

var
  Id: THandle = 0; //ідентифікатор бібліотеки
   f: Tf;          // опис функції// 2. Завантаження бібліотеки функцією LoadLibrary й отримання цілого числа
Id:= LoadLibrary('MyLibrary.dll'); // Завантаження бібліотеки
if (Id = 0)
then begin ShowMessage('Помилка відкриття бібліотеки!');
           halt;
     end;

// 3. Отримання адреси функції
f:= Tf(GetProcAddress(Id, 'f'));

// 4. Безпосереднє використання підпрограм з бібліотеки
ShowMessage('f(0.) = ' +   FloatToStr(f(0.)));

// 5.Вивантаження бібліотеки з пам'яті
FreeLibrary(Id);
…

У пам'ять можна одночасно завантажити багато різноманітних бібліотек. Потрібно мати можливість їх якось розрізняти при звертанні до кожної з них. Саме для цього у поданій вище частині коду використано змінну Id. Їй надано нульового значення як усталено. Це означає, що при невдалій спробі завантажити бібліотеку у пам'ять (наприклад, при її відсутності) дескриптор матиме значення 0.

Примітка

Бібліотеки (і модулі) — це інструмент для управління складністю програми.

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

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

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

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

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

Велика кількість рівнів створює враження, що завдання складне. Велика кількість підсистем однієї системи (на одному рівні) спричиняє складність встановлення зв'язків між ними. Зазвичай виділяють 3-6 рівнів.

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

Будь-яке завдання, яке виконують програмісти, — це створення проєктів на основі їхньої декомпозиції. Ієрархічна структура робіт (Work Breakdown Structure, WBS) — це інструмент, що дозволяє розбити проєкт на складові частини. Саме вона встановлює ієрархічно структурований розподіл робіт з реалізації проєкту для всіх задіяних в ньому працівників.

У ході побудови WBS здійснюється послідовна декомпозиція проєкту на підпроєкти — пакети робіт різного рівня, пакети детальних робіт. Декомпозиція повинна бути коректною: елементи будь-якого рівня повинні бути необхідні й достатні для створення відповідного елемента верхнього рівня.

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

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

Правила декомпозиції

Ієрархічна структура робіт (WBS) створюють або згори донизу, або знизу догори, або використовують обидва підходи. Зазвичай застосовують «рухому хвилю» — чим віддаленіший за часом той чи інший елемент, тим менше глибина його декомпозиції.

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

Підстави для розбиття проєкту:

Мистецтво декомпозиції проєкту полягає в узгодженні основних структур проєкту:

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

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

Правила побудови ієрархічної структури робіт (WBS)

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

  2. Кожному елементу WBS надають унікальний ідентифікатор — WBS-код. Коди організовано відповідно до плану рахунків — системи відстеження витрат проєкту за категоріями, що грунтується на плані рахунків організації і прийнятої в ній системі управлінського обліку.

Всі елементи WBS описують у словнику. Словник містить короткий опис кожного елемента, що входить в ієрархічну структуру робіт, тобто:

На основі WBS будують інші структурні моделі проєкту:

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

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

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

  1. Декомпозиція. На цьому етапі початкову задачу аналізують щодо можливості й доцільності її розкладу й розпаралелювання. При можливості й доцільності задачу й пов’язані з нею дані розділяють підзадачі й структури даних.

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

  3. Укрупнення (агрегування). Інколи підзадачі доцільно об’єднати у більші блоки, якщо це підвищує ефективність алгоритму і знижує трудоємкість розробки.

  4. Планування обчислень. На цьому етапі розподіляють обчислювальні ресурси на виконання окремих підзадач. Основний критерій вибору — ефективне використання з мінімальними витратами часу на обмін даними.

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

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

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

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

Розмір блоків програми може бути різним. Залежно від розміру блоків вказівок, які виконують паралельно (одночасно), розпаралелення алгоритму може мати різну «зернистість». Її виміром у найпростішому випадку є кількість операцій у блоці. Зазвичай виділяють три ступеня «зернистості» дрібно­зернистий, середньо­блоковий і велико­блоковий:

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

Частини програми (підзадачі) можна виконувати паралельно (одночасно), якщо вони незалежні за даними, за керуванням і за введенням/виведенням:

Історичний нарис. У 1974 р. на конгресі ІFІP Глушков виступив із доповіддю про рекурсивні ЕОМ, засновані на нових принципах організації обчислювальних систем (співавтори В.А.Мясніков, І.Б.Ігнатьєв, В.А.Торгашев). Він висловив думку про те, що лише розробка принципово нової не неймановської архітектури обчислювальних систем, дозволить вирішити проблему побудови супер-ЕОМ із необмеженим ростом продуктивності при нарощуванні апаратних засобів. Подальші дослідження показали, що повна і безкомпромісна реалізація принципів побудови рекурсивних ЕОМ і мозкоподібних структур при наявному тоді рівні електронної технології передчасна. Компромісні рішення було знайдено Глушковим і покладено в основу оригінальної структури високопродуктивної ЕОМ, названої макроконвеєром.

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

У період з 1990 по 1993 роки понад 90% експлуатованих у СРСР мейнфреймів ЄС ЕОМ було демонтовано й утилізовано з метою вилучення з них дорогоцінних металів (кілька десятків грамів золота і близько одного або декількох кілограмів срібла в одній ЕОМ).


4. Інструктаж з ТБ
5. Вироблення практичних навичок


Примітка. При виконанні проєктів завдань 3-5 у середовищі Lazarus із зневадженням можна отримати таке інформаційне вікно.

— отримано при OC Linux Mint 20 Mate У середовищі Lazarus 2.0.10 і компіляторі fpc 3.2.0. У цьому випадку потрібно виконати проєкт без зневадження:

Завдання 1. У середовищі Lazarus створити динамічно зв'язувану бібліо­теку, що містить дійснозначні функції f2 i f3 дійсних аргументів, що повертають відповідно квадрат і куб аргумента.

Вказівки до виконання

  1. У середовищі Lazarus виконати вказівку меню File / New… (Файл / Новий…)

  2. У вікні діалогу вибрати Library (Бібліотека) і натиснути кнопку із написом OK (Гаразд).



  3. Помітити у вікні Редактор тексту появу такого тексту.

    library Project1;
    
    {$mode objfpc}{$H+}
    
    uses
      Classes
      { you can add units after this };
    
    begin
    end.
  4. Вставити перед останніми двома рядками коду опис дійснозначних функцій f2 і f3 та описати назви (ті самі), за якими потрібно звертатися до цих функцій у програмі.

    function f2 (x: real): real; cdecl; begin f2:=x*x   end;
    function f3 (x: real): real; cdecl; begin f3:=x*x*x end;
    exports  f2, f3;
  5. Зберегти проєкт з назвою MyLibrary у вказану вчителем теку:

    • або використавши вказівку меню File / Save all — Файл / Зберегти всі;
    • або натиснувши кнопку Save all — Зберегти всі;
    • або натиснувши клавіші Shift + Ctrl + S.
  6. Помітити, що перший рядок коду буде змінено на таке:

    library MyLibrary;

    а у вказаній з'являться три файли: MyLibrary.lpi, MyLibrary.lps і MyLibrary.pas.

  7. Cкомпілювати проєкт:
    • або використати вказівку меню Run / Compile — Виконання / Компілювати;
    • або натиснути клавіші Ctrl + F9
  8. Помітити появу четвертого файлу libmylibrary з розширенням so, dll або dylib — залежно від використаної операційної системи.

  9. Повідомити вчителя про виконання завдання.

Завдання 2. Створити застосунок з використанням платформи, на якій розташувати:

Вказівки до виконання

  1. У середовищі Lazarus виконати вказівку меню Файл / Новий…

  2. У вікні діалогу вибрати Application (Застосунок) і натиснути кнопку із написом OK (Гаразд).



  3. Розташувати на формі 4 об'єкти: поле введення, два написи і кнопку (у наступній таблиці перші 4 у переліку згори донизу) з вкладення Standard, після чого у вікні Інспектор об'єктів змінити властивості наявних у проєкті 5 об'єктів на вказані у таблиці.

    КласНазваLeftTopWidthHeightText / Caption
    TEdit Edit1 5 5 5027x
    TLabel Label1 70 10 4114x^2
    TLabel Label2 120 10 4114x^3
    TButton Button1180 5 8025Обчислити
    TForm1 Form1 20020027535Квадрат і куб числа
  4. Пересвідчитися, що форма набула такого вигляду в середовищі розробки.

    У разі відхилення змінити властивості об'єктів належним чином.

  5. Створити обробник події натискання на кнопку. Для цього у вікні Інспектор об'єктів:

    • у полі Компоненти виділити Button1: TButton;
    • перейти на вкладення Події;
    • для події OnClick вибрати Button1Click;

    • у рядку події OnClick клацнути праворуч по кнопці з трикрапкою для переходу у вікно Редактор тексту у місце розташування обробника події процедури TForm1.Button1Click.

  6. Доповнити код процедури TForm1.Button1Click перетво­ренням власти­вос­ті Text поля введення у локальну дійсну змінну x. У разі неправиль­ного запису числа виводити інформаційне вікно з попередженням: "Хибний запис числа!".



  7. Порівняти з очікуваним.
  8. Запустити застосунок на виконання:
    • або використати вказівку меню Run / Run — Виконання / Виконати;
    • або натиснути кнопку Run — Виконати;
    • або натиснути клавішу F9.
    У разі потреби змінити код і зберегти проєкт.
  9. Зберегти проєкт з назвою project1 у вказану вчителем теку:

    • або використавши вказівку меню File / Save all — Файл / Зберегти всі;
    • або натиснувши кнопку Save all — Зберегти всі;
    • або натиснувши клавіші Shift + Ctrl + S.
  10. Скопіювати двічі вміст теки з проєктом в інше місце, вказане вчителем.

  11. Повідомити вчителя про виконання завдання.

Примітка. Одну з копій створеного проєкту застосунку використати при виконанні завдання 3, іншу — при виконанні завдання 4.

Завдання 3. Статично пов'язати створену бібліотеку зі створеним застосунком.

Вказівки до виконання

  1. Скопіювати бібліотеку (створену у результаті виконання завдання 1):
    • при ОС Windows — у теку з проєктом застосунку;
    • при ОС Ubuntu або Linux Mint — у теку /lib.
  2. Доповнити код unit1.pas у розділі implementation описом функцій вже створеної бібліотеки:

    function f2(x: real): real;  cdecl;  external 'mylibrary';
    function f3(x: real): real;  cdecl;  external 'mylibrary';
  3. Доповнити у файлі unit1.pas код обробника події натискання кнопки використанням функцій f2, f3 і виведення результатів обчислення. Порівняти з очікуваним.

  4. Зберегти проєкт і запустити його на виконання.


  5. У разі потреби змінити код і зберегти проєкт.
  6. Повідомити вчителя про виконання завдання.

Завдання 4. Динамічно пов'язати створену бібліотеку зі створеним застосунком.

Вказівки до виконання

  1. Скопіювати бібліотеку (створену у результаті виконання завдання 1):

    • при ОС Windows — у теку з проєктом застосунку, не використаного (не зміненого) при виконанні попереднього завдання 3;

    • при ОС Ubuntu або Linux Mint — у теку /usr/lib.

  2. У коді unit1.pas доповнити перелік використовуваних модулів (після слова uses) назвою Dynlibs.

  3. Вставити у код unit1.pas безпосередньо перед службовим словом implementation такі вказівки:

    type Tf = function(r: real): real; cdecl;
    var  f2, f3: Tf;
         Id: THandle = 0;
  4. Доповнити у файлі unit1.pas код обробника події натискання кнопки описом таких дій:

    • завантаження бібліотеки MyLibrary;
    • отримання адрес функцій f2 i f3;
    • використання функцій f2 i f3 для зміни написів;
    • вивантаження бібліотеки MyLibrary.

    Порівняти з очікуваним.

  5. Зберегти проєкт і запустити його на виконання.


  6. У разі потреби змінити код і зберегти проєкт.
  7. Повідомити вчителя про виконання завдання.

Завдання 5. Створити модуль і використати його у створеному застосунку:

Вказівки до виконання

  1. У середовищі Lazarus відкрити проєкт застосунку, не використаного (не зміненого) при виконанні попередніх завдань 3-4.

  2. Створити файл myunit.pas таким кодом:

    unit MyUnit;
    {$mode objfpc}{$H+}
    
    interface
    function f2 (x: real): real;
    function f3 (x: real): real;
    implementation
    
    uses Classes, SysUtils;
    function f2 (x: real): real; begin f2:=x*x   end;
    function f3 (x: real): real; begin f3:=x*x*x end;
    end.
  3. У коді unit1.pas доповнити перелік використовуваних модулів (після слова uses) назвою MyUnit.

  4. Доповнити у файлі unit1.pas код обробника події натискання кнопки використанням функцій f2 i f3 для зміни написів. Порівняти з очікуваним.

  5. Зберегти проєкт і запустити його на виконання.

  6. У разі потреби змінити код і зберегти проєкт.

  7. Перемістити файли myunit.o і myunit.ppu з підтеки проєкту lib/x86_64-linux у теку проєкту.

  8. Вилучити з теки проєкту теку /lib, виконуваний файл і файл myunit.pas.

  9. Перевірити правильність роботи проєкту.

  10. При ОС Windows:
    • cтворити у теці для зберігання модулів Lazarus, теку myunit,
    • перемістити файли myunit.o і myunit.ppu у теку myunit.
    • перевірити правильність роботи проєкту.
  11. Повідомити вчителя про виконання завдання.

6. Підбиття підсумків уроку
Виставлення оцінок.

7. Домашнє завдання

  1. Вивчити матеріал уроку.
  2. При потребі доробити завдання 1-5.
  3. Створити програму і бібліотеку для виконання усіх арифметичних дій зі звичайними нескоротними дробами з цілим чисельником і натуральним знамен­ником.


Текст упорядкувала Олександр Рудик.