Компонентний Паскаль

Зміст

Типи даних [ред.]

Під поняттям "Тип даних" ховається семантична властивість інформації. Для комп'ютера, всі байти інформації є пакети з 8 біт. Кожен з бітів може бути увімкненим або вимкненим. Залежно від цього, як прийнято розуміти ці стани (пряма чи інверсна логіка) -- ці значення приймаються рівними " 0 " чи " 1 " . Більше про вміст осередків пам'яті комп'ютер не знає нічого.

Для програміста навіть один байт може містити різні типи інформації. Наприклад, 8 біт (= 1 байт), з погляду програміста - може містити числа від 0 до 255. А може і код символу в однобайтовому кодуванні ("а", "б", "в".). А може, й взагалі щось інше. Але всі байти однакові, вони не мають ознаки того, що вони зберігають [1] . В якийсь момент, програміст цілком може вирішити, що ця клітинка пам'яті зберігає число від 0 до 255. А насправді, на самому початку, програміст задумував зберігати в цій комірці пам'яті код символу для подальшого друку. Більше того, цілком можливо, що програміст вирішив використовувати під свої потреби не одну, а відразу дві (або навіть тисячу) осередків? Пам'ятати де розташований кожен осередок? І такі помилки зустрічаються і у новачків, і досвідчених програмістів. Як вирішити цю проблему?

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

Цілі числа [ред.]

Логічний тип [ред.]

Логічний тип, у сенсі цього терміну є цілим. Але і до дрібних чисел цей тип можна віднести ще менше. Змінна такого типу може набувати лише двох значень. У Компонентному Паскалі ці два значення визначені як TRUE ("Істина") та FALSE ("брехня"). Цей тип змінних використовується навіть ширше, ніж про це замислюються багато програмістів. Логічний тип можна використовувати явно (через змінну), а можна і неявно (наприклад, порівняння двох чисел, рядків, результатів викликів процедур). Цей тип позначається через ключове слово BOOLEAN. Приклад:

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

Байтовий тип [ред.]

Або просто байт. Визначається ключовим словом BYTE. Змінна такого типу може набувати значень від 0 до 255. Це зовсім не багато, але для багатьох цілей може виявитися цілком достатньо. Наприклад, не існує хвилин і секунд більше 60. Або, наприклад, не буває дня в місяці з номером 32. Приклад опису змінної типу BYTE:

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

Коротке ціле [ ред ]

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

[ правити ]

Ціле число є основним типом цілих чисел для машин із 32 бітами на машинне слово. Для КП це саме той випадок. Ціле число займає в пам'яті 4 байти. Такої кількості пам'яті вистачає на опис числа приблизно від -2,1 млрд до +2,1 млрд. Не часто зустрічаються числа з таким динамічним розмахом. Цілий тип описується ключовим словом INTEGER:

І тут нічого немає такого, щоб вимагало особливого способу опису змінних.

Довге ціле [ред.]

Найширший діапазон цілих чисел, що вбудований у КП. Займає 8 байт, представляє цілі числа в діапазоні від -9,2*10^18 до 9,2*10^18. Навіть складно уявити, де такі цифри взагалі можуть знадобитися звичайним людям. Позначаються такі змінні як LONGINT:

Слід пам'ятати, що складання BlackBox Red (втім, як і інші) оптимізовано під 32-бітну архітектуру, тому робота з такими числами буде істотно повільнішою, ніж з типом INTEGER.

Речові числа [ред.]

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

Коротке речовинне [ред.]

Такі числа відповідають речовим числам у мові Сі. У пам'яті вони займають 4 байти, але на відміну від цілих чисел вони мають особливий формат призберігання. Це призводить до того, що точність таких чисел обмежується 7-8 десятковими цифрами. Зате діапазон цих чисел розсувається до -3,4*10^(38). -10^(-38) у негативній області, і до 10^(-38). 3,4*10^(38) у сфері позитивних чисел. Навіть у порівнянні з типом LONGINT це дуже багато. Але є й зворотний бік медалі. Якщо в типі LONGINT точність до останнього знака, то в даному випадку (як було вище згадано) тільки до 7-8. Тому, якщо у обчисленнях важлива точність, треба пам'ятати, що точність великих чисел огрублює точність малих чисел. Це правило визначає порядок роботи з речовими числами: "спочатку малі, потім великі" при збільшенні, і "спочатку великі, потім малі" при зменшенні. Такі числа позначаються ключовим словом SHORTREAL:

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

Речовина [ ред .

Цей тип чисел займає в пам'яті в 2 рази осередків більше, ніж короткий речовий - 8 байт і відповідає числу з подвійною точністю стандарту "IEEE 754". Діапазон, який охоплюють такі числа, якщо записувати від руки без наукового формату - стомить дуже швидко (приблизно -10^308. 10^308). Точність складає 15-17 десяткових знаків. Якщо через метри записувати діаметри ядер атомів - такої точності має вистачити [3] . Змінна речовинного типу описується ключовим словом REAL:

Літерні типи [ред.]

Літери набору Latin-1 [ред.

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

Варто додати, що окрім літер і цифр у літерах Latin-1 є ще й різні цікаві значки, які іноді можуть і стати в нагоді [4] .

Літери набору Unicode [ред.]

Цей набір літер, порівняно з попереднім, є більш прогресивним. Він позбавлений недоліків Latin-1, але кожна медаль має дві сторони. Так, тепер у цей набір Unicode поміщаються літери всіх мов світу існуючих, або будь-коли існували. Туди ж поміщаються різноманітних піктограми з усіх сфер життя (значки Сонця, Місяця, Землі і навіть "Серп і молот"). Але, якщо байтові літерали було легко порівнювати, оскільки вони розташовувалися за абеткою, то як зрозуміти, який код менший і на якій підставі: англійський літерал "а" чи український літерал "а"? А це зовсім різні літерали. На щастя, всі (або майже всі) процедури для роботи з літералами Unicode написані, і сумнівно, що програмісту доведеться писати щось своє (з високим ступенем ймовірності це буде велосипед, як кажуть програмісти). Такий тип змінних описується ключовим словом CHAR:

Ще раз варто звернути увагу - у цьому прикладі (у наборі Unicode) українські та англійські літери кодуються різними кодами, хоча зовні виглядають однаково [5] .

Константи [ред.]

Константою називається така змінна, яку не можна змінювати під час виконання програми.Переваги констант перед змінними можна виразити такими положеннями:

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

Форма їх визначення суттєво відрізняється від форми визначення змінних:

Форма опису констант визначена не через двокрапку, а через знак "рівно". І в даному випадку це цілком відповідає законам логіки та математики. Також варто звернути увагу, що константа "wery_good" та її знак "рівно" не вирівняні з усіма константами. Це припущення цілком прийнятне для оформлення коду. Ну що робити, якщо ім'я змінної, таке довге?

Перетворення типів [ред.]

Мова Компонентний Паскаль був спроектований, а не складений. Тому правила перетворення типів прості, зрозумілі та передбачувані.

Перетворення числових типів [ред.]

Як було вище описано, найпотужнішим діапазоном уявлення чисел є тип REAL. У разі перетворень за необхідності, цей тип перетворюється на більш обмежений - SHORTREAL. Якщо цей тип доведеться перетворювати, він звужується до LONGINT. Тип довге ціле при стисканні перетворюється на тип INT (4 байти). Після типу цілого стиснення діапазону йде у бік SHORTINT (2 байти). Коротке цілетеж може бути стисло до BYTE. Далі діапазон числа зменшити не можна. Тип BOOLEAN, строго кажучи числовим не є, хоча містить логічні "0" і "1". Зворотне перетворення також правильне. Наприклад, якщо розділити два цілих числа 3 і 2 - результат буде речове число. КП чудово розуміє, що без цього результат є дуже неточним. Тому, якщо результат такого поділу спробувати присвоїти цілісної змінної - такий модуль навіть не вдасться скомпілювати - Компонентний Паскаль просто не дозволить це зробити! У той самий час, якщо сума двох цілих перевищує динамічний діапазон цілого - КП на стадії компіляції намагатиметься з'ясувати цей факт, і вимагатиме результат присвоювати довгому цілому. Якщо з'ясувати на етапі компіляції це неможливо, КП під час виконання зупинить програму, і не дозволить проскочити момент переповнення та "полетіти програмі в космос". Ті самі правила стосуються й інших перетворень типів. Коротко схему перетворення типів можна відобразити так:

REAL >= SHORTREAL >= LONGINT >= INTEGER >= SHORTINT >= BYTE

Перетворення літеральних типів [ред.]

Те, що вище було написано про числові типи, можна застосувати і до літеральних типів. Також треба враховувати, що приведення SHORTCHAR до CHAR буде утруднено, оскільки КП просто не знатиме, яке було національне кодування типу SHORTCHAR. Коротко схему перетворення типів можна відобразити так:

Використання змінних та констант [ред.]

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

  • Опис змінних завжди в КП виноситься в окрему секцію модуля, яка позначається ключовим словомVAR (variable, змінна).
  • Опис констант завжди в КП виноситься в окрему секцію модуля, яка позначається ключовим словом CONST (constante, постійна/незмінна).

числа

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

Якщо все зроблено правильно, то можна буде побачити результат приблизно такий, як на скріншоті праворуч. Дивуємось розміру програми (88 байт), переконуємося, що розподіл двох цілих чисел привело до результату REAL, згадуємо як вставити КОМАНДЕР і використовувати його.

Трохи про присвоєння [ред.]

У коді представленому вище використовується знак і у двох варіантах:

Тут можуть виникнути питання, тому нижче наводяться необхідні пояснення:

  • У першому випадку, при присвоєнні константі "з" значення "3" - стоїть знак одно. І це правильна математична форма запису.
  • У другому випадку, змінна "i1" містить "сміття", яке ніяк не може дорівнювати "с/i", і щоб підкреслити цей факт, що це нематематичне рівняння, аінструкція присвоєнняв КП прийнято вінструкціяхвикористовувати символ ":=", як не порушує математичні угоди.
  • У ряді мов (у тому числі, такому популярному, як Сі) знак одно використовується і для порівняння чисел вумовах, і це дуже часто є джерелом помилок. У Компонентному Паскалі такі ситуації виключені. Адже ця мова (зокрема) і для промислового програмування.