Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

125 Кібербезпека / Магістр (вступні питання)

.pdf
Скачиваний:
107
Добавлен:
23.10.2019
Размер:
3.84 Mб
Скачать

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

Таким чином, маршрутизатор повинен забезпечувати такі функції [1, 5,

12, 16]:

фізична взаємодія;

логічна взаємодія;

безпека;

визначення маршруту передавання даних.

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

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

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

МОВИ ПРОГРАМУВАННЯ ТА АЛГОРИТМИ

 

50. Парадигми та мови програмування

1.

Парадигми

програмування

Слово

парадигма грецького походження

і означає стиль міркування,

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

після того, як американський вчений Роберт Флойд під час вручення

йому Тьюрінгової медалі АСМ 1978 року виступив

з лекцією «Парадигми

програмування» [16], термін «парадигми» став

часто вживаним у

програмуванні,

 

 

 

 

 

а

тому

варто

зупинитися

на

ньому

окремо.

 

1.1.

Парадигми

і

мови

програмування

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

2 3 0 2 x + x − = » є прикладом програми, виконавцем якої може бути учень або студент, причому різні виконавці можуть робити це по-різному: один – користуючись теоремою Вієта, інший – за допомогою дискримінанту. Це приклад декларативної (описової) парадигми: програма відповідає на запитання

«що?» – що шукати? що будувати? що рахувати? При цьому вибір

відповіді на запитання «як?» залишається за виконавцем.

Інша програма могла б виглядати так: «Додайте до одиниці три, добудьте із суми квадратний корінь, відніміть його від мінус одиниці. Це буде перший корінь. Потім додайте його до мінус одиниці. Це буде другий корінь».

Характерну

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

«спочатку

роби одне, а потім інше». Вона є прикладом імперативної

(наказової)

парадигми

програмування.

Зазвичай

декларативна

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

імперативної

 

 

 

 

 

парадигми

покладає

більше

відповідальності

на

програміста,

адже він повинен дати більш детальний рецепт розв‘язування задачі.

Декларативне

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

щось

на

зразок

вживання

скатертинисамобранки,

яка сама приготує

за

вас

обід,

тоді як

імперативне потребує

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

Поділ на «що?» і «як?» у програмуванні відображає також природний перебіг процесу розв‘язування задач. Спочатку визначаємося з тим, що треба зробити, проектуємо інтерфейси – виникає щось на зразок декларативної програми. Потім з‘ясовуємо наявність виконавця, здатного цю програму зрозуміти і, можливо, виконати. Якщо його підібрано, оцінюємо

характеристики

 

 

виконання ним

програми та порівнюємо їх

на відповідність

заданим вимогам.

Якщо придатного виконавця немає,

беремо найбільш пі-

1.1. Парадигми і мови програмування парадигми програмування – це моделі, які відтворюють

спосіб мислення розробника програми. Мова програмування може підтримувати або не підтримувати ту чи іншу парадигму. В першому випадку застосування парадигми стає зручним, тобто простим, безпечним і ефективним, в іншому – складним і ненадійним. Ми розглянемо три основних

наказових парадигми – процедурне, об‘єктне (модульне) і

об‘єктно-орієнтоване (ієрархічне) програмування (рис. 1.1) – та одну

допоміжну

 

узагальнене

програмування.

Рис.

1.2.

Хронологія

мов

і

парадигм

програмування

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

Так,

мова програмування

ФОРТРАН (FORmule TRANslator – перек-

16

1.

Парадигми

програмування

ладач формул) уперше розв‘язала проблему автоматизації програмування математичних формул, а її компілятори уперше впоралися із задачею роздільної

компіляції.

Мова програмування АЛГОЛ (ALGOrithmic Language – алгоритмічна

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

мовою структурованого програмування із сучасними розгалуженнями

і циклами. Майже одночасно з‘явилися дві інші знакові мови програмування

– Паскаль і С, які дотримувалися майже діаметрально протилежних

підходів. Паскаль – прямий нащадок АЛГОЛу – доповнив його

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

програм на цій мові, й усі реальні обчислювальні середовища повинні

були настроюватися на стандартну модель. Мова програмування С не

передбачала

 

 

 

стандарту

обчислювача, а

навпаки, містила засоби

настроювання

програми

на конкретне

обчислювальне середовище.

Дослідження

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

предметів вивчення цього підручника.

Проблема складності програмування на основі процедурної парадигми стимулювала пошук нових підходів. Так з‘явилася концепція абстрактних типів даних як способу об‘єднання даних і засобів їхньої обробки та одночасно як методу відокремлення специфікацій (інтерфейсів) від їх реалізації.

Типи даних Паскалю були

розвинуті

в абстрактні типи

даних у

вигляді

модулів

 

мови

МОДУЛА-2.

Особливо

важливий крок було

зроблено

внаслідок

залучення

до мови

С засобів мови моделювання СІМУЛА (SIMUlation Language – мова моделювання),

в якій свого часу вперше з‘явилися класи і об‘єкти. З цього

союзу виникла мова програмування С++, яка сама пройшла еволюційний

шлях вдосконалень і розвитку. Цій

темі присвячена одна

з книг автора

С++

Б‘єрна

Страуструпа

[4].

Зазначимо, що хоча мова МОДУЛА-2 не набула широкого розповсюдження,

закладені в ній ідеї призвели

до розширення

мови

Паскаль

класами

та об‘єктами. Так під назвою

Object Pascal

виникла

об‘єктна

версія

мови Паскаль, реалізована в системі програмування Delphi. Зрештою, назву

Delphi одержала й сама мова програмування, яка продовжила давню традицію конкуренції між Паскалем і С власною конкуренцією з С++.

Головне досягнення С++ полягає у зміні парадигми програмування

(paradigm shift) з процедурної на об‘єктно-орієнтовану, яка визначає стандарт

розробки програмного забезпечення вже упродовж більш ніж чверті

століття. Головним доробком об‘єктно-орієнтованої парадигми стала

ієрархічність

програмних структур,

яка відображається в

агрегації об‘єк-

1.2.

Процедурне

програмування

17

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

інженерного проектування. Водночас властивість ієрархічності дала

змогу об‘єднувати програмні структури у складні архітектурні конструкції,

максимально

використовуючи наявний код,

настроювання якого тепер

не

потребує

перепрограмування.

Повертаючись до питання про вибір мови для курсу об‘єктно-орієнтованого

програмування, хочу наголосити, що я дотримуюсь тези, висловленої

Стівом Макконнеллом у книзі «Довершений код» [7] (раджу її для подальшого самостійного читання), про те, що програмувати варто не мовою,

а з використанням мови програмування. Тому я рекомендую С++ як мультипарадигменну мову, найбільш повну з погляду концепцій сучасного програмування. Наступники С++, а саме Java і C#, поки що парадигму не

змінили, зате деякі важливі риси, наявні в С++, втратили.

Саме тому тут вивчатимемо насамперед найважливіші поняття сучасного

програмування і зовсім

не приділятимемо (або приділятимемо дуже

мало) уваги проблемам

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

текстів перевірені системою програмування Microsoft Visual Studio. Для більшості прикладів достатньо рівня MS Visual Studio 6, але для деяких,

що використовуватимуть порівняно нові властивості С++, будуть потрібні новіші версії.

51.Основні типи даних в мовах програмування та операції над ними

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

Основні типи даних:

Цілі числа

Тип даних ціле (англ. integer) не може зберігати дробову частину числа. Для від'ємного числа треба ставити знак мінус (-) перед значенням (числом). Не можна використовувати кому у введені такого числа, бо інакше буде викликана синтаксична помилка.

Дійсні числа

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

Логічний тип даних

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

Символьний тип даних

Тип даних, що описує літери та інші знаки, використовувані на письмі. В залежності від мови програмування та конкретної реалізації, може займати 1 чи 2 байти, рідше 4. Однобайтовий символьний тип може використовуватись для представлення символів з набору ASCII та восьмирозрядних кодувань, тоді як для представлення символів з набору Unicode потрібно щонайменше 2 байти.

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

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

Залежно від кількості операндів операції в мові Pascal поділяються на унарні та бінарні. Унарні операції застосовуються до одного операнда. Символ унарної операції записується перед операндом, наприклад: -а. Бінарні операції застосовуються до двох операндів; символи таких операцій записуються між операндами, наприклад: х + у.

52. Поняття алгоритму. Його властивості. Способи запису алгоритмів

Алгори́тм — набір інструкцій, які описують порядок дій виконавця, щоб досягти результату розв'язання задачі за скінченну кількість дій; система правил виконання дискретного процесу, яка досягає поставленої мети за скінченний час. Для візуалізації алгоритмів часто використовують блок-схеми.

Основні властивості алгоритму:

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

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

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

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

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

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

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

6.Ефективність – кожний крок алгоритму повинен бути виконаний точно за скінчений проміжок часу.

На практиці найбільш поширені наступні форми представлення алгоритмів:

словесна (запис на природній мові);

графічна (зображення з графічних символів);

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

програмна (тексти на мовах програмування).

53. Оцінка часу виконання алгоритму. Асимптотична складність алгоритму.

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

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

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

54.Оператори умови та циклу в мовах програмування

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

Послідовність інструкцій, призначена для багаторазового виконання,

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

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

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

— break) і оператори пропущення ітерації (в мові С — continue).

55.Види логічних операцій в мовах програмування та способи їх

використання

Логічні операції утворюють складну умову з декількох простих (два або

більше) умов. Ці операції спрощують структуру програмного коду в кілька

разів. Це, можна обійтися і без них, але тоді кількість іфов збільшується в кілька разів, залежно від умови.

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

Залежно від кількості операндів операції діляться на унарні та бінарні

Унарні операції містять лише один операнд: -5 (операція зміни знаку); not false (операція «логічне НЕ»).

Бінарні операції містять два операнди: 5 + 3 (операція додавання); 5 < 4 (операція «менше»)

Якщо при роботі з булевими операціями ―І‖, ―АБО‖ аналіз першого параметра дозволить визначити підсумковий відповідь, то аналіз другого параметра не проводиться, а відповідь видається одразу.

Приклад:

(0 && 1) – машина аналізує перший параметр, який є false. Отже, вона не буде аналізувати другий параметр, а відразу видасть відповідь – false (0);

Аналогічно, (1 || 0) – програма проаналізує тільки перший параметр,

рівний 1 (true) і без аналізу другого параметра видасть відповідь ―true‖.

Логічне заперечення НЕ є унарною операцією, і вона не комбінує дві умови, на відміну від логічних операцій І і АБО, які є бінарними операціями.

Логічне заперечення дозволяє привернути сенс умови, що в деяких випадках дуже зручно. Умова з логічним запереченням істинно в тому випадку, якщо це ж умова помилкова без заперечення, і навпаки.

56.Використання функцій в мовах програмування. Способи

перевантаження функцій.

Функції в мовах програмування - один з видів підпрограми. Особливість,

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