Pascal операція відносини. Історія розвитку мови програмування паскаль. Змінні. Стандартні типи

Був розроблений у 1970 р. Ніклаусом Віртом як мова, що забезпечує строгу типізацію та інтуїтивно зрозумілий синтаксис. Він був названий на честь французького математика, фізика та філософа Блеза Паскаля.

Однією із цілей створення мови Паскаль Ніклаус Вірт вважав навчання студентів структурного програмування. Досі Паскаль заслужено вважається однією з найкращих мов для початкового навчання програмування. Його сучасні модифікації, такі як Object Pascal, широко використовуються у промисловому програмуванні (середовище Delphi).


Блез Паскаль
Випущена в 1995 р. як продовження середовища Turbo Pascal система програмування Delphi стала одним із найкращих середовищ для швидкого створення додатків. Delphi ввела в мову Паскаль низку вдалих об'єктно-орієнтованих розширень; оновлена ​​мова отримала назву Object Pascal. Починаючи з версії Delphi 7.0, мова Delphi Object Pascal стала називатися просто Delphi, проте стару назву використовується часто. Остання версія середовища - Delphi XE.
Середа Delphi 7

Найбільш відомою вільною реалізацією мови Паскаль є Free Pascal. Крім відкритості вихідного коду, його основною перевагою є мультиплатформність, а також підтримка різних діалектів Паскаля. На основі FreePascal створено вільне мультиплатформне середовище Lazarus, аналогічне середовищу Delphi. Однак, бідний і не міняється десятиліттями консольний інтерфейс інтегрованого середовища Free Pascal, мало сумісний із сучасними інтерфейсами робочих столів операційних систем, дедалі більше відштовхує учнів, неправильно формуючи вони уявлення, що Паскаль - застаріла мова.

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

Нарешті, поява платформ Java і .NET, що включають потужну мову програмування та потужні стандартні бібліотеки, послабило позиції мови Delphi. Для навчання програмування стали частіше використовувати такі мови як Java, C, C++, C#, Visual Basic, Python, Haskell.

Однією з яскравих подій, пов'язаних із розвитком мови Паскаль, стала поява мови та компілятора Oxygene фірми RemObjects, який творці заслужено назвали сучасним Паскалем 21 століття. Oxygene може генерувати код під різні платформи, зокрема під платформи .NET і Java. Основним його недоліком є ​​відсутність безкоштовного компілятора та середовища для освітніх цілей. Крім того, Oxygene досить сильно відрізняється від канонічної мови Паскаль (методи класів замість процедур та функцій), що відображає її суто професійну спрямованість.

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

Алфавіт мови Паскальскладається з кількох розділів:

Латинські літери: A a B b…

Цифри: 0 1 2..9

Знаки математичних операцій: + - * /

Знаки математичних відносин:<> =

Розділові знаки: . , : ;

Спеціальні знаки: ( ) () $ ^

Програма, записана мовою Паскаль, може містити такі розділи.

Заголовок

Розділ міток

Розділ констант

Розділ типів

Розділ змінних

Розділ процедур та функцій

Розділ операторів

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

Розділи між собою поділяються знаком ";"
Розділ операторів полягає в операторних дужках. Це зарезервовані слова begin, end. Розділ операторів закінчується точкою. Запис всередині операторних дужок, як правило, ведеться з відступом у три знаки.

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

оператор1;

оператор2;

оператор3;

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

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

Розділ "заголовок" починається із зарезервованого слова, за яким вказується ім'я програми. Як ім'я може використовуватися будь-який набір символів алфавіту з кількома винятками.

§ Не можна використовувати зарезервовані слова.

§ Не можна починати ім'я з цифри.

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



Приклади: program one; program to_be_or_not_to_be; program x5;

Прості типи даних.

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

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

Типи даних у мові Паскаль поділяються на п'ять основних класів.

1. Прості типи

2. Структуровані типи

3. Посилальні типи

4. Процедурні типи

5. Об'єктні типи

До простих типів належать: цілочисленні типи, речові типи, логічний тип, символьний тип, тип, що перераховується, інтервальний тип.

Серед цих видів виділяють підмножини типів, відмінних від речовинного, званих порядковим типом.
Порядкові типи мають чотири характеристики.

1. Всі можливі значення даного порядкового типу є впорядкованою множиною і кожне можливе значення пов'язане з порядковим номером, який є цілим числом.

2. Значення будь-якого порядкового типу, за винятком цілісного, починається з порядкового номера нуль (наступний порядковий номер 1, 2, 3…) .

3. Порядковим номером значення цілого типу є саме значення.

4. У будь-якому порядковому типі кожному значенню, крім першого, є попереднє і кожному значенню, крім останнього, є наступне.

До даних будь-якого порядку можна застосувати будь-яку з п'яти операцій.

Стандартна операція Ordповертає порядковий номер вказаного значення. Значення вказується у дужках.

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

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

Стандартна операція Low повертає найменше значення діапазону порядкового типу, зазначеного даного.

Стандартна операція High повертає найбільше значення діапазону порядкового типу, зазначеного даного.

У мові Паскаль є п'ять визначених, цілісних типів (таблиця 6). Кожен тип означає певне підмножина цілих чисел.

Таблиця 6 - Цілочисленні типи мови Паскаль

За умовчанням, як правило, для цілих даних вибирається тип integer.

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

Приклад:
1 - цілий тип
1.0 - речовий тип
100 – десятковий формат (100)
#100 - шістнадцятковий формат (256)

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

До логічного типу належать дані типу Boolean.
Значенням логічного типу можуть бути два значення: true(1) та false(0). Для даних логічного типу застосовні лише дві операції порівняння: і не дорівнює. Змінні типу booleanзаймають один байт.

Символьний тип charє типом даних, призначений для зберігання одного символу (літери, знака або коду). У змінну цього може бути поміщений будь-який з 256 символів розширеного коду ASCII. Змінна типу charзаймає один байт пам'яті. Значення типу Char задаються в апострофах. Крім того, можна задавати значення використовуючи код з таблиці ASCII. Над даними символьного типу можна виконувати операції порівняння.

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

Приклад:
type A=(2, 4, 1, 7);
B=("c", "L", "3", "|");

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

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

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

У Паскалі є п'ять видів речових типів (таблиця 7).

Таблиця 7 – Речові типи мови Паскаль

Дії над типами з одинарною, подвійною, підвищеною точністю та

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

Мова програмування Pascal була створена Ніклаусом Віртом, і названа на честь французького філософа та математика XVII ст. Блеза Паскаля. У той час Вірт був професором інформатики у Федеральному технічному університеті у Швейцарії та потребував мови, за допомогою якої можна було навчати студентів навичкам програмування.

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

У 1970-х років було створено спробу розробити міжнародний стандарт на Паскаль. У результаті 1982 року з'явився стандарт ISO 7185.

Мова Паскаль стараннями Андерса Хейлсберга перетворилася на потужну професійну систему програмування Turbo Rascal. Після версії 1.0, що проіснувала порівняно недовго і не отримала широкого поширення, в середині 1984 року з'являється версія 2.0. Поширення якої пішло стрімкими темпами. До осені 1985 року з'являється версія 3.0, що відрізняється від версії 2.0 наступними особливостями: компілятор і редактор стали працювати значно швидше, з'явилася можливість передачі параметрів у програму за допомогою команди RUN, став можливим виклик MS-DOS із програми, стала зручною робота з файлами. З початку 1988 року поширюється версія 4.0.

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

Поява інструментальних засобів Borlаnd Pascal with Objects і Delphi розробки програм серед Windows зайвий раз показала які справді невичерпні можливості таїть у собі Паскаль. Borland Pascal і використовується в Delphi мова Pascal базуються на Turbo Pascal і розвивають його ідеї.

Delphi – компілятор мови Pascal. Delphi 1 був першим інструментарієм розробки Windows додатків, що об'єднав оптимізуючий компілятор, візуальне середовище програмування і потужні можливості роботи з базами даних. Роком пізніше Delphi 2 запропонував все те саме, але на новому рівні сучасної 32-бітної операційної системи Windows 95 та Windows NT. Крім того, Delphi 2 надав програмісту 32-бітовий компілятор, який створював більш швидкі та ефективні програми, потужні бібліотеки об'єктів.

Тривала робота команди розробників Delphi призвела до появи в третій версії продукту розширеного набору інструментів для створення програм, можливості використання технологій COM для розробки програм WWW та багатьох інших сучасних технологій програмування.

Delphi 4 є черговим кроком в еволюції компіляторів Паскаля з того часу, коли понад 16 років тому Андерс Хейлсберг створив перший компілятор Turbo Pascal.

Pascal) – високорівнева мова програмування загального призначення. Одна з найбільш відомих мов програмування, широко застосовується в промисловому програмуванні, навчанні програмування у вищій школі, є базою для багатьох інших мов. Був створений Ніклаусом Віртом у 1968-69 роках (опублікований у 1970 році) після його участі у роботі комітету розробки стандарту мови Алгол-68.

Передісторія

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

Реалізації

UCSD Pascal

У 1978 році в Університеті Сан-Дієго (Каліфорнія, США) була розроблена система UCSD p-System, що включала компілятор з мови Паскаль в переносний p-код і реалізувала значну кількість розширень мови Паскаль, такі як модулі, рядки символів змінної довжини, директиви трансляції , обробка помилок введення-виведення, звернення до файлів за іменами та ін. Згодом основні реалізації мови Паскаль ґрунтувалися на цьому діалекті.

Object Pascal від Apple

Turbo Pascal та Object Pascal від Borland, Microsoft Pascal

Найбільш відомою реалізацією Паскаля, що забезпечила широке поширення та розвиток мови, є Turbo Pascal фірми Borland, що виросла потім в об'єктний Паскаль для DOS (починаючи з версії 5.5) і Windows і далі Delphi, в якій були впроваджені значні розширення мови.

Діалекти Паскаля, що застосовуються в Turbo Pascal для DOS і Delphi для Windows, стали популярними через відсутність інших успішних комерційних реалізацій.

Стандарти

Після початку використання Паскаля в 1970 році та появи реалізацій, що розходяться не тільки в доповненнях, а й у синтакісі, було порушено питання про стандартизацію мови. Стандарт мови був розроблений Ніклаусом Віртом у 1974 році спільно з Кетлін Йенсен (Kathleen Jensen). Надалі були прийняті міжнародний стандарт від ISO та американський від ANSI. На даний момент, виділяють три принципово різних стандарти: Unextended Pascal (початковий), Extended Pascal (розширений), Object-Oriented Extensions to Pascal (об'єктно-орієнтоване розширення Паскаля).

Стандарти мови Pascal: вихідний, міжнародні ISO та американські ANSI
НазваваріантКим/де розробленоРік створення
Pascal StandardпочатковийН. Вірт, Кетлін Єнсен
Pascal StandardпочатковийISO 7185:1983
ANSI/IEEE 770X3.97:1983
Unextended PascalпочатковийISO 7185:1990
Extended PascalрозширенийANSI/IEEE 770X3.160:19891989
ISO/IEC 10206
Object-Oriented
Extensions to Pascal
об'єктно-орієнтоване розширенняANSI/X3-TR-13:1994

Однією з головних додаткових властивостей об'єктно-орієнтованого розширення Extended Pascal стала модульність та засоби, що полегшують роздільну компіляцію.

Стандартизація мови була запізнілою по відношенню до реальної появи в мові тих чи інших можливостей. Комерційні продажі розширювали стандартний Паскаль; так було зроблено в UCSD Pascal, модифікації Object Pascal фірмою Apple, Turbo Pascal від Borland (незначно модифікована версія Apple) та його відгалужень. Жодна з найпоширеніших комерційних реалізацій Паскаля не відповідає точності жодному з офіційних стандартів мови.

Синтаксис та мовні конструкції

Паскаль, в його первісному вигляді, є чисто процедурною мовою і включає безліч алголоподібних структур і конструкцій з зарезервованими словами на кшталт if , then , else , while , for , і т. д. Тим не менш, Паскаль також містить велику кількість можливостей для структурування інформації та абстракцій, які відсутні в первісному Алголі-60, такі як визначення типів, записи, покажчики, перерахування, та безлічі. Ці конструкції були частково успадковані або інспіровані від мов Сімула-67, Алгол-68, створеного Ніклаусом Віртом AlgolW та запропоновані Хоаром.

У сучасних діалектах (Free Pascal) доступні такі операції, як перевантаження операторів та функцій.

Hello world

Програми на Паскалі починаються з ключового слова program і наступного за ним імені програми з крапкою з комою (у більшості діалектів є необов'язковим), за іменем може у дужках слідувати список зовнішніх файлових дескрипторів як параметри; за ним слідує тіло програми, що складається з секцій опису змінних, типів і констант, оголошень процедур і функцій і наступного за ними блоку операторів, що є точкою входу в програму. У мові Паскаль блок обмежується ключовими словами begin та end. Оператори поділяються точками з комою , після тіла міститься точка , яка є ознакою кінця програми. Реєстр символів у Паскалі не має значення.

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

Приклад програми, що виводить рядок Hello, World! Program HelloWorld(output);begin

WriteLn("Hello, World!"); (оператор виведення рядка)

end.

Типи даних

Примітивнітипи даних Паскаля: числа з плаваючою комою (real), цілі (integer), символьний (char), логічний (boolean) та перерахування (конструктор нового типу, введений у Паскалі):

R: Real; (Змінна речовинного типу) i: Integer; (Змінна цілого типу) c: Char; (Змінна-символ) b: Boolean; (логічна змінна) e: (apple, pear, banana, orange, lemon); (Змінна типу-перерахування)

Виділяється поняття порядковихтипів даних (ordinal), до них відносяться цілі типи (знакові та беззнакові), логічний (boolean), символьний (char), перераховані типи та типи-діапазони.

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

X: 1..10; y: "a".."z"; z: pear..orange;

Для порядкових типів визначено операції inc, dec, succ, pred, ord, операції порівняння (=>< => <= <>), їх можна використовувати в операторах case , for (як лічильник циклу), як межі масивів, для завдання елементів множин та типів-діапазонів.

У Паскалі, на відміну від Сі-подібних мов, з типами boolean і char арифметичні цілочисленні операції не визначені.

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

Set1: set of 1..10; set2: set of "a".."z"; set3: set of pear..orange;

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

У паскалі тип множини може містити лише однотипні елементи порядкового типу. Ця особливість широко використовується і зазвичай швидше за еквівалентну конструкцію в мові, що не підтримує безлічі. Наприклад, більшість компіляторів Паскаля: if i in then ( перевірка на приналежність елемента безлічі ).обробиться швидше, ніж if (i>4) and (i<11) then { проверка логическими условиями }...Для завдання значення множини використовується список елементів множини, відокремлених комами і укладений у квадратні дужки (як уже було показано вище): var ( секція оголошення змінних )

D:set of char;

begin (початок блоку)

D:=["a","b"];

...У Паскалі Єнсен та Вірта рядки представлялися як упаковані масиви символів; отже вони мали фіксовану довжину і зазвичай доповнювалися до цієї довжини пробілами.

У сучасному Паскалі для роботи з рядками використовується вбудований тип string , який підтримує операції конкатенації (+) та порівняння (>< = <> >= <=). Строки сравниваются в лексикографическом порядке . Например, строки считаются равными если они имеют одинаковую длину и коды всех символов с одинаковыми индексами совпадают.

Тип string [n] або просто string у діалектах мови 1970-1990-х років визначався у вигляді масиву символів array of char (n за замовчуванням приймало значення 80 в UCSD Pascal і 255 в Turbo/Borland Pascal), код нульового символу при такому поданні служить завдання довжини рядка, відповідно рядок міг мати максимальний розмір 255 символів. За умовчанням у Delphi і FreePascal як String використовується тип AnsiString, пам'ять під який виділяється і звільняється компілятором динамічно, а максимальний розмір рядка в поточних реалізаціях становить 2 гігабайти. Крім того, у Delphi і Free Pascal як string може використовуватися тип WideString, де застосовується 16-бітове уявлення символів у кодуванні UCS-2, при цьому засоби перетворення з однобайтових рядків у багатобайтові і назад у стандартній бібліотеці мови відсутні.

Нові типи можуть бути визначені з:

X = Integer; y = x;

...Більше того, із примітивних типів можуть бути сконструйовані складові: type ( секція оголошення типів )

A = Array of Integer; ( Визначення масиву ) b = record ( Визначення запису ) x: Integer; y: Char; end; c = File of a; (Визначення файлу)

Файлові типи в Паскалі поділяються на типизовані, текстові та файли без типів.

Як показано у наведеному прикладі, типізовані файли в Паскалі - це послідовності однотипних елементів. Для кожного файлу існує змінна-покажчик на буфер, яка позначається f ^. Процедури get (для читання) та put (для запису) переміщують покажчик до наступного елемента. Читання реалізовано отже read(f, x) є те саме, як і get(f); x:=f^. Відповідно, запис реалізована так, що write(f, x) являє собою те ж, що й f^: = x; put(f). Текстові файли text визначені як розширення типу file of char і крім стандартних операцій над типізованими файлами (читання, запис символу), дозволяють здійснювати символьне введення-виведення у файл всіх типів даних аналогічно консольному введення-виводу.

Файли без типів оголошуються як змінні типу file. З ними можна проводити операції побайтового нетипізованого вводу-виводу по кілька блоків байт зазначеної довжини через буфер, для цього служать спеціальні процедури blockread і blockwrite (розширення UCSD).

Вказівники

Паскаль підтримує використання покажчиків (типізовані ^тип та нетипізовані pointer): type

A = ^b; b = record x: Integer; y: Char; z: a; end;

Pointer_to_b:a;

Тут змінна pointer_to_b - покажчик тип даних b , є записом. Тип типізованого покажчика може бути заданий перед оголошенням типу, який він посилається. Це виняток до правила, яке свідчить, що будь-яка річ має бути оголошена перед тим, як використовується. Введення цього виключення дозволило організовувати рекурентні визначення структур даних, у тому числі такі, як лінійні списки, стеки та черги, включаючи покажчик на запис в описі цього запису (див. також: нульовий покажчик - nil).

Для типізованого покажчика визначено операцію розіменування (її синтаксис: покажчик^).

Щоб створити новий запис та присвоїти значення 10 та символ A полям a та b у ньому, необхідні наступні оператори: new(pointer_to_b); (Виділення пам'яті покажчику)

pointer_to_b^.x:= 10; (розіменування покажчика та звернення до поля запису) pointer_to_b^.y:= "A";pointer_to_b^.z:= nil;...dispose(pointer_to_b); (звільнення пам'яті з-під покажчика)Для цілей звернення до полів записів та об'єктів також можна використовувати оператор with , як показано в прикладі: new(pointer_to_b);

with pointer_to_b^ dobegin

X: = 10; y:= "A"; z:= nil

end;...dispose(pointer_to_b);

Процедурний тип

В оригінальній мові Паскаль Йенсен та Вірта процедурний тип використовувався лише при описі формального параметра. Вже TP існував повноправний процедурний тип . У оголошенні типу ставиться заголовок процедури чи функції (без імені), узагальнено описує інтерфейс підпрограми. Значення цього типу містить покажчик на підпрограму із заголовком, що відповідає описаному в оголошенні типу. За допомогою ідентифікатора змінної може відбуватися виклик відповідної процедури чи функції. type myfunc=function:string;

function func1:string;begin

Func1:="func N 1"

function func2:string;begin

Func2:="func N 2"

var fun:myfunc;begin

Fun:=@func1;writeln(fun) (відбувається виклик функції func1)

end.

Оператори керування виконанням програми

Паскаль - мова структурного програмування, що означає, що програма складається з окремих стандартних операторів, що виконуються послідовно, в ідеалі - без використання команди GOTO. while a<>b do (цикл із передумовою)

Writeln("Чекання");

if a > b then ( умовний оператор )

Writeln("Умова виконалася")

else (else-секція - може бути відсутнім)

Writeln("Умова не виконалася");

for i:= 1 to 10 do ( ітераційний цикл )

Writeln("Ітерація №", i:1);

repeat (цикл із постумовою)

A:= a + 1

case i of ( умовний оператор множинного вибору )

0: write("нуль"); 1: write("один"); 2: write("два") else write("невідоме число") (else-секція - може бути відсутнім)

end;В операторах while , for , if , case в якості оператора може використовуватися блок. Така конструкція, що є звичайним оператором або блоком, називається складним оператором.

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

Assign(inp, "text.txt"); ($I-) ( відключення режиму IO checking - генерації коду завершення програми у разі помилки введення-виведення ) ( (для випадку, якщо файл не знайдено)) reset (inp); ($I+) ( включення режиму IO checking ) if IOresult=0 then begin ( перевіряємо значення зміною ioresult(<>0 у разі помилки введення-виведення) ) ... close (inp); end else writeln("file not found")

Існують директиви, аналогічні директивам препроцесора C/C++ ($ifdef , $define , $include), вони обробляються компілятором у процесі компіляції.

Процедури та функції

У Паскалі підпрограми поділяються на процедури та функції:

Синтаксично процедури та функції складаються з заголовка(що містить ключове слово procedure або function , імені, за яким може слідувати опис переданих параметрів у дужках, тип значення, що повертається через символ двокрапки для функцій і точки з комою), після заголовка слід тілопісля якого ставиться символ; . program mine (output);

procedure print(var j: integer);

Function next(k: integer): integer; begin next: = k + 1 end;

Writeln("Усього: ", j); j:= next(j)

I:= 1; while i<= 10 do print(i)

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

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

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

Процедури від функцій тим, що функції повертають якесь значення, а процедури - немає.

Модулі

До появи модулів у їхньому сучасному вигляді деякі реалізації Паскаля підтримували модульність за рахунок механізму включення заголовних файлів, схожого на механізм #include у мові Сі: за допомогою спеціальної директиви, що оформляється у вигляді псевдокоментару, наприклад, ($INCLUDE "файл") , вміст зазначеного файла прямо включалося до тексту програми у вихідному, текстовому вигляді. Таким чином можна було розділити програмний код на безліч фрагментів для зручності редагування, але перед компіляцією вони автоматично об'єднувалися в один файл програми, який в результаті і оброблявся компілятором. Така реалізація модульності є примітивною і має безліч очевидних недоліків, тому вона була швидко замінена.

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

Структура

Загальна структура модуля, що підключається на Паскалі виглядає наступним чином: unit UnitName1;interface

... ...

begin (може бути відсутнім-використовується, якщо необхідно помістити оператори ініціалізації)

...

end.Можливий ще один варіант: unit UnitName2;interface

... ... ... ...

end.На відміну від головної програми, файл модуля починається з ключового слова UNIT , за яким слідує ім'я модуля та точка з комою. Сучасні реалізації, як правило, вимагають, щоб ім'я модуля збігалося з ім'ям вихідного коду коду, в якому цей модуль міститься. Модуль містить три секції: інтерфейсну секцію, секцію реалізації та тіло модуля.

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

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

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

Модуль закінчується ключовим словом END із точкою.

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

Щоб використовувати модуль, головна програма або інший модуль повинні імпортувати модуль, тобто містити оголошення про його використання. Це оголошення робиться за допомогою інструкції підключення модулів, що є ключовим словом USES , за яким через кому слідують імена модулів, які потрібно підключити. Інструкція підключення повинна йти безпосередньо за заголовком програми, або після ключового слова INTERFACE , якщо підключення здійснюється в модулі.

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

Будь-які оголошені в інтерфейсних секціях модулів об'єкти можна використовувати в програмі там, де підключені ці модулі. Імена імпортованих з підключених модулів об'єктів залишаються тими самими, і їх можна використовувати безпосередньо. Якщо два або більше підключених модуля мають однакові об'єкти, і компілятор не може їх розрізнити, то при спробі використання такого об'єкта буде видана помилка компіляції - неоднозначне завдання імені. У цьому випадку програміст повинен застосовувати кваліфікацію імені – вказати ім'я у форматі «<имя_модуля>.<имя_объекта>».

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

Компіляція та компонування

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

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

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

Мова програмування Pascal була розроблена в 1968-1971 роках. Ніклаусом Віртому Цюріхському інституті інформатики (Швейцарія). Початкова мета розробки мови PASCAL – необхідність інструменту "для навчання програмування як систематичної дисципліни". Однак дуже швидко виявилася надзвичайна ефективність мови PASCAL у найрізноманітніших додатках, від вирішення невеликих завдань обчислювального характеру до розробки складних програмних систем – компіляторів, баз даних, операційних систем тощо. На сьогодні Pascal належить до групи найпоширеніших і найпопулярніших у світі мов програмування. Існують численні реалізації мови практично для всіх машинних архітектур, розроблено десятки діалектів та проблемно-орієнтованих розширень мови Pascal.

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

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

Тим не менш, переваги мови змушували багато комерційних та некомерційних організацій розробляти системи програмування на основі мови Паскаль.

З-поміж останніх виділяється фірма Borland, Turbo Pascal(потім Borland Pascal) якої було значно розширено, було усунуто багато недоліків мови, додано нові можливості. Мова стала багатшою, але одночасно втратила переносимість і спільність.

Важливим кроком у розвитку мови є поява вільної мови Паскаль GNU Pascal, який увібрав у собі риси інших Паскалей, як дозволив нарешті повністю відмовитися від «брудних» прийомів програмування, особливо властивих, скажімо, Turbo Pascal, Але й забезпечив надзвичайно широку портабельність написаних на ньому програм (понад 20 різних платформ, під більш ніж 10 різними операційними системами).

На даний момент користуються популярністю такі версії мови як TMT Pascal, Free Pascalі GNU Pascal. Продовжує використовуватись і Borland Pascal. Розвитком мови Borland Pascalє Object Pascal- версія мови Паскаль розширена засобами об'єктно-орієнтованого програмування. Останні версії Borland Pascalлежать в основі середовища програмування Delphi.