Pascal

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Pascal (Паскаль)
Парадигма: імперативна, структурна
Дата появи: 1970
Творці: Ніклаус Вірт
Система типізації: статична, жорстка, безпечна
Основні реалізації: CDC 6000, PASCAL-P, PDP-11, PDP-10, IBM System/370, HP, GNU
Діалекти: UCSD, Borland, Turbo
Під впливом від: ALGOL
Вплинула на: Oberon, Modula-2, Ada, Delphi, Chrome, SCAR

Pascal — алгоритмічна мова програмування універсального призначення. Існують діалекти мови з підтримкою об'єктно-орієнтованого програмування. В 1990 році було затверджено стандарт ISO 7185:1990, «Pascal»[1], та ISO 10206:1990 «Extended Pascal»[2].

Історія виникнення і особливості мови[ред.ред. код]

Першим компілятором мови Pascal є ETH Pascal, створений у 1970-му. Назва ETH походить від назви інституту німецькою Eidgenössische Technische Hochschule Zürich (українською Федеральна вища технічна школа Цюріха), де він був розроблений. Творцем мови є Ніклаус Вірт. Наприкінці того ж року Вірт оприлюднив перший офіційний опис мови, синтаксису та семантики. Нова версія мови побачила світ у 1972 році. Тоді ж Вірт та його англійський колега Чарльз Ентоні Хоар (Тоні Хоар) випустили аксіоматичний опис мови Pascal.

У 1969 році Вірт доручає розробку компілятора одному зі своїх студентів (Е. Марм'є). На той момент Марм'є володів лише Фортраном (Fortran) і писав компілятор виключно на цій мові. Після написання компілятор Pascal був переписаний на самому собі. Як згадував потім Вірт, вибір Фортрана був серйозною помилкою, бо він не міг адекватно представляти складні структури даних компілятора Pascal, що лише заплутувало програму.

Наступна спроба створення компілятору почалася з чіткого формулювання на описі (1970 року) самого Паскалю. Синтаксичний аналіз нового однопрохідного компілятору реалізовувався за допомогою рекурсії. Тепер команду розробників склали: У. Амман, Е. Марм'є, Р. Шилд. Після того як компілятор був написаний на ще невідомій мові, Шилд поїхав додому, де він протягом двох тижнів вручну транслював програму у допоміжну низькорівневу мову. Отже, в середині 1970 року компілятор ETH Pascal був готовий.

ETH Pascal був цікавий насамперед тим, що став він однією з перших реалізацій мов високого рівня написаних на самій собі, на два роки випередивши компілятор Сі. У 1973 році була створена абстрактна Pascal-машина (P-машина), яка виконувала спеціальний P-код. Щоб вирішити проблему сумісності компілятора, Вірт вирішив скористатися перевіреними часом методами інтерпретаціі. Найвідомішими з них рішеннями, які передували P-коду, можна назвати реалізацію мови Snobol-4 (Р. Грісуолдом, у 1967 році), де в якості коду абстрактної машини використовувалася мова SIL (System Implementation Language).

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

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

Існує ряд об'єктивних причин, які обумовили видатний успіх мови Pascal. Серед них у першу чергу потрібно вказати такі:

  • Мова в природній і елегантній формі відбила найважливіші сучасні концепції технології розробки програм.
  • Завдяки своїй компактності, концептуальній цілісності й ортогональності понять, а також вдалому оригінальному опису, запропонованому автором мови, Pascal виявився дуже легким для вивчення й освоєння.
  • Незважаючи на відносну простоту мови, вона виявилась придатною для дуже широкого спектру застосунків, у тому числі для розробки дуже великих і складних програм, наприклад, операційних систем.
  • Pascal дуже технологічний для реалізації практично усіх, у тому числі і нетрадиційних, машинних архітектур. Стверджується, що розробка Pascal-транслятора «майже» не перевищує за трудомісткістю гарної дипломної роботи випускника ВНЗу.
  • Мова Pascal стандартизована в багатьох країнах, а у 1983 році було прийнято міжнародний стандарт (ISO 7185:1983).


Turbo Pascal та Borland Pascal[ред.ред. код]

Загальні відомості[ред.ред. код]

Turbo Pascal 1.0 IDE (1983 рік)
Borland Pascal 7.0 IDE (1992 рік)

Turbo, а пізніше Borland Pascal— це одна з найвдаліших та найпоширеніших реалізацій мови Pascal, створена компанією Borland. Turbo Pascal — розширення американського стандарту (ANSI Pascal), яке враховує архітектурні особливості MS-DOS та MS Windows і постачається зі значними за обсягом і різноманітності пакетами стандартних процедур. Такі принципові нововведення, як апарат модулів і об'єктно-орієнтовані засоби полегшують конструювання великих програмних систем на основі технології модульного програмування.

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

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

Borland Pascal 7.0, 7.01 компілює програми для DOS та ОС Windows 1.0, Windows 2.0, Windows 3.x, а також містить ряд додаткових утиліт та компіляторів на кшталт: Turbo Pascal for Windows (TPW), Borland Pascal for Windows (BPW), редактор ресурсів (іконок, графічних файлів, курсорів тощо) та інші.

Хронологічна таблиця версій компілятора серії «Turbo»:

Назва компілятора Дата виходу Особливості та інше
Turbo Pascal 1.0 20 листопада 1983 року Розроблена для PC-DOS та ОС CP/M. Компілятор потребує лише 64 КіБ оперативної пам'яті і компілює код для COM або CHN файлів (формату/структури файлів). Вихідний машинний код не може перевищувати 64 КіБ, графічний режим— CGA, маніпуляції зі звуком за допомогою PC-динаміку (підключеного до 2-гого виходу таймеру (у IBM AT-сумісних).
Turbo Pascal 2.0 17 квітня 1984 року Колір інтерфейсу змінений з жовто-сірого на сіро-білий. Видалена команда меню «виконати», збільшено можливий розмір коду та додано чимало нових прикладів програм.
Turbo Pascal 3.0 17 вересня 1986 року Кольори EGA-палітри, нові графічні процедури (в тому числі графічна черепаха), оверлеї, BCD, нові процедури для роботи з файлами, параметри компіляції можна задавати через командний рядок.
Turbo Pascal 4.0 2 листопада 1987 року У компілятор внесені кардинальні зміни. Він перестав підтримувати ОС CP/M, стала можливою компіляція в EXE-файли, робота з EGA, VGA графікою, доданий тип даних LongInt.

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

Turbo Pascal 5.0 осінь 1988 року З'явився вбудований відлагоджувальник (від англ. debugger), а також окремий відлагоджувальник Turbo Debugger, драйвер BGI.
Turbo Pascal 5.5 2 травня 1989 року В мову вводиться поняття об'єктно-орієнтованого програмування (поняття класів, статичних та динамічних об'єктів, конструкторів і деструкторів, а також успадкування).

В інтерфейсі став переважати синій колір, який використовувався у всіх наступних версіях серії «Turbo». В ІСР (акронім від «інтегроване середовище розробки», англ. integrated development environment (IDE)) введено дві важливі зміни: покроковий відлагоджувальник і контекстна довідка з описом всіх вбудованих функцій та можливістю копіювання фрагментів коду.

Turbo Pascal 6.0 4 жовтня 1990 року Мова має ряд змін у порівнянні з попередньою версією: вбудований асемблер, покращення об'єктно-орієнтованої парадигми, поліпшений адмінстратор купи (від англ. heap). З'являється бібліотека Turbo Vision, яка призначена для розробки програм зі складним візуальним інтерфейсом.

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

Turbo Pascal 7.0 9 березня 1993 року Компілятор став крос-платформовим — це дозволило компілювати програми як для DOS так і для ОС Windows. Іншою важливою особливістю є можливість створення динамічних бібліотек (англ. DLL — ДЗБ) та підсвічування синтаксису.


Хронологічна таблиця версій компілятора серії «Borland»:

Назва компілятора Дата виходу Особливості та інше
Borland Pascal with Objects 7.0 27 жовтня 1992 року 7:00 Генерування коду виконувальних файлів для ОС Windows, DOS, DPMI. Швидкість компіляції більш ніж 85000 ліній за хвилину. Повний доступ до всіх функцій Windows та повідомлень. Динамічно завантажувані бібліотеки для DOS та Windows. C, C++ код може бути використаний завдяки ДЗБ (DLL). Вбудований асемблер для швидкості та повного контролю коду. Математичний співпроцесор і оффлайн підтримка. Розумний компонувальник для видалення непотрібних об'єктів та коду. Зарезервовані слова: «public», «private» та «inherited». Відкриті масиви і рядки. 80386-інструкції для операцій з 32-бітовими числами. Оптимізація множин. Швидкі операції з рядками та файлами. Необмежена вкладеність. Пакет включає в себе: DOS-, Windows-інтегровані середовища розробки. Підсвічування синтаксису, необмежені кількість операцій «Undo» (повернути) та «Redo» (повторити). Вибір цільового файлу та коду для: DOS, DPMI або Windows. Браузер об'єктів (ObjectBrowser), он-лайн довідка, Turbo Debugger, Turbo Profiler, Turbo Assembler, Resource Workshop, Winsight / Winspector, компілятор ресурсів, компілятор довідки, модуль «Windows CRT». Ціна — $ 500, оновлення Turbo Pascal— $ 150.
Borland Pascal with Objects 7.01 9 березня 1993 року 7:01 Усунені деякі помилки в самому компіляторі (деякі моменти перевірки діапазону та переповнення типу Byte і ShortInt були реалізовані неправильно), в роботі таймеру (процедура Delay), а також в тексті Turbo Vision-модулів. Зареєстровані користувачі версії 7.0 отримали 7.01 безкоштовно. Була виправлена серйозна помилка зсуву (операції shl та shr) для типу LongInt (з числом зсуву бітів 16-31), яка відбувалася під час виконання коду на процесорах 80386 (на деяких процесорах код працював, на інших— ні). Проблему було вирішено шляхом впровадження глобальної змінної Save8086 типу Byte та вставкою додаткового тесткоду, який оточував інструкції. Це сповільнило зсуви, але зробило їх стабільним, тому що тепер вони виконуються з використанням 16-бітових регістрів як в TP 4.0-6.0 реалізації.

Виправлені помилки, відповідно інформації наданої Джимом Хіґґінсом(Jim Higgins):
1.Перевірка діапазону і переповнення типу Byte та ShortInt;
2.Помилка, пов'язана із зсувом зі значеннями 16-31 на процесорах 80386, 80486;
3.Функція GetDir не викликала помилку № 15, якщо переданий параметр неіснуючого диску;
4.У програм відкомпільованих директивою $N, була проблема з правильним визначенням INFs і NaN;
5.Функція Exp, коли використовувалася для дуже малих аргументів типу Real виклакала переповнення замість того, щоб повернути нуль;
6.Була проблема перетворення денормалізованих чисел в нулі при використанні співпроцесора 8087;
7.Денормалізовані числа типу Extended не перетворювались належним чином у десяткові за допомогою процедур Str та Write(Ln);
8.Ініціалізації процедур не перевіряли належним чином, щоб запобігти помилкового виконання коду скомпільованого для процесорів 80286 з директивою $G , які працють на процесорах 8086/8088.

Компілятори Turbo Pascal 7.0 та Borland Pascal 7.x[ред.ред. код]

Початкові версії компілятора мають інший вигляд. Далі будуть розлянуті версії корпорації Borland: Turbo Pascal 7.0 та Borland Pascal 7.0/7.01, які вже давно стали класичними. Текст компілюється в машинну мову для центральних процесорів 8086, 8088, 80186, 80188, 80286, 80386 (BP 7.0/7.01) та сумісних з ними. Компіляція коду для роботи з числами з плаваючою точкою може здійнюватися, як в прямі машинні інструкції співпроцесорів 8087, 80187, 80287 та сумісних з ними, так і шляхом емуляції.

Алфавіт мови
Імена у мові Pascal формуються з латинських літер A-Z, a-z, цифр 0-9 та знака «підкреслення» («_»). Також використовуються спеціальні символи : + — * / = < > [ ], () ; { } $ ^ # . Будь-яке ім'я повинно починатися з латинської літери, або символу «підкреслення» (від англ. «underscore»), виключення становлять лише імена міток. На відміну від Сі в Паскалі не враховується регістр літер.

Службові слова
Службове слово являє собою неподільне утворення, зміст якого фіксований мовою. Службові слова не можна використовувати у якості імен. Коментарі в коді програми оформлюються фігурними дужками {коментар} або ж сполученням звичайних дужок із зірочкою (*коментар*).
Зарезервовані слова:
and, asm, array, begin, case, const, constructor, destructor, div, do, downto, else, end, exports, file, for, function, goto, if, implementation, in, inherited, inline, interface, label, library, mod, nil, not, object, of, or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor, absolute, assembler, export, external, far, forward, index, interrupt, near, private, public, resident, virtual.
Використання імен псевдомасивів Port, PortW, Mem, MemW, MemL не викликає помилки, але унеможливлює їх подальше застосування.

Структура програми
Враховуючи те, що для імен можна застосовувати тільки латинські літери, всі назви параметрів подані англійською.
Умовні позначення:
<>— обов'язковий параметр;
[]— не обов'язковий параметр.

Опис директив (макросів):
{$<directive><switch>, <directive><switch>,..}
Місце опису директив (макросів) є довільним. Деякі директиви мають більш, ніж одне значення. Наприклад:
$I <filename.pas> та $I<switch>;
$L<switch> $L<filename.obj>.
Більшість директив має однакову форму запису, але є й вийнятки, на кшталт:
$M <value>, <value>, <value>;
$IFDEF <name>; $ELSE; $INC.

Приклад:

{$A-,B-,D+,E-,F-,G-,I-,L+,N+,O-,P-,Q+,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
{$I i8042.pas}
var f: File;
begin
 Assign(f, 'file');
 {$I-}
 Reset(f, $200);
 {$I+}
 if IOResult<> 0 then 
  Rewrite(f, $200);
end.


Назва програми (ім'я головного модулю):
program <name>[(input, output)];

Приклад:

{$X+}
program t80c187;
 
function New: ByteBool;
begin
end;
 
begin
 t80c187.New;
 New;
end.


Підключення відкомпільованих модулів:
uses <unitNam0>, <unitNam1>,.. ;
Порядок підключення оверлейних модулів інший, та здійснюється за допомогою директиви $O.

Приклад:

uses crt, dos, vbe30;
var
   screen: Text;
 
begin
 Crt.AssignCrt(screen);
 AssignCrt(screen);
end.


Опис міток:
Мітка— ціле число від 0 до 9999.
label <number0>, <number1>,..;

Приклад:

label 0, 9999;
 
begin
 0: goto 9999;
 9999: goto 0;
end.


Опис констант:
const <name0>=<value>; <name1>=<value>,.. ;
Опис статичних змінних:
const <name3>:<type>=<value>; <name4>:<type>=<value>,.. ;
Якщо статична змінна описана в процедурі або функції, то після виклику останньої стек для змінної не резервується (місце вже є в самому коді), що дозволяє заощадити час.

Опис нових типів (в тому числі процедурних і функціональних), структур та об'єктів:
type

   <name_0>= record
end;
<name_1>= <type or range>;
<name_2>= object[(father's name)]
[private]
<variables or methods>
[public]
<variables or methods>
end;


Опис змінних:
var <name0>, <name1>,.. : <type or range>;
var <name3>, <name4>,.. : Byte absolute <segment: offset>;

Приклади:

type
    Pointer= record
    case Byte of
     $00: (ofs, seg: Word);
     $01: (fulladdr: LongInt);
    end;
 
    _RGBA= record
     red, green, blue: Single;
     alpha: Single;
    end;
 
    _VideoBuffer= array [16*12] of _RGBA;
 
    _Beer= (BEST, BESTER, MORE);
 
    _Element= ^_List;
 
    _List= record
     prev: _Element;
     data: _Beer;
     next: _Element;
    end;
 
    _SimpleProc= Procedure;
    _ByteFunc= Function: Byte;
 
    _New= object
    private
     right, bottom: Integer;
     procedure Destroy;(*or destructor..*)
    public
     left, top: Integer;
     width, height: Word;
     procedure Create;(*or constructor..*)
     procedure Free;
    end;
 
    _Newest= object(_New)
     procedure Create;
     procedure Free;
    end;
 
const
     CNT= $40;
     svar_0: _Beer= MORE;
     svar_1: Byte= 0;
     svar_0_addr: Pointer= (ofs: Ofs(svar_0); seg: Seg(svar_1));
     svar_1_addr: Pointer= (fulladdr: LongInt(@svar_1));
 
var
   counter: _Beer;
   temp0, temp1, temp2: 0..Byte('2');
   a: array [0..0] of array [Byte] of Byte;
   b: array (.0..0, Byte.) of Word;(*(.= [    .)= ]*)
   intVar: Word;
   proc: Procedure (const BITS: Byte);
   float10: Extended;
   float4: Single;
   divZeroErrorAddr: LongInt absolute $0000: $0000;
   mode: LongInt absolute $0040: $0049;
   crtMode: LongInt absolute mode;
 
 
procedure _New.Create; assembler;
asm
end;
 
procedure _New.Destroy; assembler;
asm
end;
 
procedure _New.Free;
begin
end;
 
procedure _Newest.Create;
begin
 inherited Create;
end;
 
procedure _Newest.Free;
begin
 inherited Free;
end;
 
begin
end.


Опис процедур та функцій (конструкторів та деструкторів):
procedure <identifier> [parameters]; [directives]
function <identifier> [parameters]: <type>; [directives]

Приклад:

const
     test: Word= $0001;
 
var
   procCall: Procedure (var DATA);
 
 
procedure SwitchLowBytes(var DATA); far;
const
     temp: Byte= 0;
begin
 temp:= Byte(Ptr(Seg(DATA), Ofs(DATA)+ 1)^);
 Byte(Ptr(Seg(DATA), Ofs(DATA)+ 1)^):= Byte(Ptr(Seg(DATA), Ofs(DATA))^);
 Byte(Ptr(Seg(DATA), Ofs(DATA))^):= temp;
end;
 
 
begin
 procCall:= SwitchLowBytes;
 WriteLn(test);
 procCall(test);
 WriteLn(test);
end.

У програмі повинно бути як мінімум два оператори — це begin та end. Після кожного рядка необхідно ставити «;» (це правило не стосується операторів після яких розміщено зарезервоване слово «end», «begin», «else», вбудованого асемблеру тощо).

Кількість зарезервованих слів «begin» та «end» у програмі не обов'язково повинно збігатися.

Наприклад:

begin
 asm
 end;
end.


unit new;
 interface
 implementation
end.


type
    _HBrush= record
    end;
begin
end.


Присвоєння значення відбувається так:
<typed address>:= <typed address>;
<typed address>:= <value>;
Після останнього «end» необхідно поставити крапку «.»

Математичні операції

Операнди:

  • «+»— додавання;
  • «-»— віднімання;
  • «*»— множення;
  • «/»— ділення;
  • «div»— ціла частина від ділення (наприклад: 7 div 2= 3);
  • «mod»— остача від ділення (наприклад: 7 mod 2= 1);
  • «=»— дорівнює;
  • «<>»— не дорівнює (≠);
  • «>»— більше;
  • «<»— менше;
  • «>=»— більше або рівне (≥);
  • «<=»— менше або рівне (≤);
  • «shl»— побітовий зсув вліво (наприклад: 00000110b shl 1= 00001100b);
  • «shr»— побітовий зсув вправо (наприклад: 00000111b shr 1= 00000011b).

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

Цілі типи:

Назва типу Діапазон значень10 Роль старшого біту та розмір (біти)
Byte 0..255 беззнаковий 8
Word 0..65535 беззнаковий 16
Char #0..#255 8
Boolean FALSE..TRUE 8
ByteBool FALSE..TRUE 8
WordBool FALSE..TRUE 16
LongBool FALSE..TRUE 32
ShortInt −128..127 зі знаком 8
Integer −32768..32767 зі знаком 16
LongInt −2147483648..2147483647 зі знаком 32
Pointer $00000000..$FFFFFFFF 32

Дійсні типи:

Назва типу Діапазон значень (з урахуванням «дірок») Кількість значущих цифр Розмір (біти)
Comp −9.2e18..9.2e18 19-20 64
Single 1.5e-45..3.4e38 7-8 32
Real 2.9e-39..1.7e38 11-12 48
Double 5.0e-324..1.7e308 15-16 64
Extended 3.4e-4932..1.1e4932 19-20 80

Інші типи:

Назва типу Розмір (Байт)
String 1+ 1..255
File 8+40+80
Text 128+ 128

Стандартні підпрограми і сталі[ред.ред. код]

  • Abs(X) — обчислення абсолютного значення (модулю) Х.
  • ArcTan(X) — обчислення кута, тангенс якого дорівнює Х (тобто математичний arctg(X)), значення кута подано в радіанах і може знаходитися в діапазоні від -π/2 до π/2. Для перетворення значення кута з радіанної міри в градусну необхідно значення кута помножити на число 180/π. Результат має дійсний тип.
  • Cos(X) — обчислення косинуса Х, параметр задає значення кута в радіанах.
  • Exp(x) — обчислення значення експоненти аргументу (ex). Результат завжди має дійсний тип.
  • Frac(X) — знаходження дробової частини Х. Результат має дійсний тип.
  • Int(X) — знаходження цілої частини Х (дробова частина відкидається). Результат має дійсний тип.
  • Ln(x) — обчислюється натуральний логарифм аргументу. Результат має дійсний тип. За допомогою функцій Exp та Ln можна обчислити довільну степінь числа так: ab=Exp(b*Ln(a)), відповідно корінь можна подати так само a1/b (тобто корінь степіня b з a)=Exp(1/b*Ln(a)).
  • Pi — повертає значення числа p (3.1415926).
  • Sin(X) — обчислення синуса Х. Параметр задає значення кута в радіанах. Для перетворення значення кута з радіанної міри в градусну необхідно значення кута помножити на число 180/p. Результат має дійсний тип.
  • Sqr(X) — піднесення до квадрата значення Х. Тип результату збігається з типом параметра.
  • Sqrt(X) — обчислення квадратного кореня з Х. Тип результату дійсний.
  • Random — генерує значення випадкового числа з діапазону від 0 до 0.99. Тип результату дійсний.
  • Random(P) — генерує значення випадкового числа з діапазону від 0 до P. Тип результату цілий. Щоб випадкові числа були «більш випадковими», необхідно періодично змінювати базу генерації. Для цього використовується процедура Randomize, що дозволяє при кожному новому запуску програми отримувати різні випадкові числа.

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

  • Dec(x, [dx]) — процедура зменшує значення змінної Х на величину DX, а якщо параметр DX не заданий — на 1.
  • Inc(x, [dx]) — процедура збільшує значення змінної Х на величину DX, а якщо параметр DX не заданий — на 1.
  • Pred(X) — функція, що визначає попереднє значення для даного типа. Наприклад, Pred(5)=4, Pred(True)=False, Pred('B')='A'.
  • Succ(X) — функція, що визначає наступне значення для даного типа. Наприклад, Succ(5)=6, Succ(True)=False, Succ('A')='B'.
  • Odd(X) — число перевіряється на непарність. Результат дорівнює true, якщо аргумент непарний, і false — в протилежному випадку.

Спадщина Pascal[ред.ред. код]

Разом із популярністю мови стало відомим і ім'я Ніклауса Вірта. Працюючи у Швейцарському федеральному технічному інституті разом із своїми учнями і послідовниками удосконалював теорію мови програмування загального використання. Так у 1980 році зявилась Modula (хоча коли говорять Modula, мають на увазі Modula-2). Modula-2 стала завершенням розвитку лінії структурного програмування. У 1990 році — з'явився Oberon що вже використовував принципи ООП (хоча об'єктно-орієнтоване програмування було можливим вже у версії 5.5 однієї з найпопулярніших реалізацій мови — Turbo Pascal).

Тепер можна говорити про існування родини Pascal-подібних мов, до яких належать Pascal, Modula-2, Oberon, Oberon-2, ActiveOberon, Component Pascal.

Не так давно з'явилась нова мова з цієї великої родини — Zonnon для .NET. Вона, як і її попередники, була створена у Швейцарському федеральному технологічному інституті у Цюріху. Основний наголос у ній зроблено на простоту, ясний синтаксис та модульність. Zonnon увібрав у себе риси Active Oberon та C#. Мова Zonnon додає паскалю нові особливості, включаючи процеси в об'єктах, перевантаження операторів та обробку виключних ситуацій.

Зразки програм[ред.ред. код]

Класичний приклад:

program Hello_World;
begin
 Writeln('Hello, World!!');(*:)*)
end.


Рекурсивний варіант обчислення факторіалу:

{$N+, E+}
 
var
   n: Byte;
 
function Fact(n: Byte): Comp;
begin
 if n= 0 then
  Fact:= 1
 else
  Fact:= Fact(n-1)* n;
end;
 
begin
 ReadLn(n);
 WriteLn(n, '!= ', Fact(n):0:0);
end.


Приклад роботи з графічним драйвером VGA:

{$R-,Q-}(*just say: "faster"!!*)
uses crt, graph;
 
var
   left, top, right, bottom: Integer;
   dx, dy: Integer;
   maxX, maxY: Integer;
 
 
procedure Set640x480x4;
var agd, agm: Integer;
begin
 agd:= VGA;
 agm:= VGAHI;
 InitGraph(agd, agm, '..\BGI');
end;
 
procedure WaitVRet; assembler;
asm
 mov dx,3dah
@v0:
    in al, dx
    test al, 08h
    jz @v0
{@v1:(*for interlaced video mode*)
    in al, dx
    test al, 08h
    jz @v1}
end;
 
 
begin
 Set640x480x4;
 
 left:= 0;
 top:= 0;
 right:= left+100;
 bottom:= top+100;
 dx:= 11;
 dy:= -7;
 maxX:= GetMaxX;
 maxY:= GetMaxY;
 
 while KeyPressed= FALSE do
 begin
  if left< 0 then dx:= -dx
  else
   if right> maxX then dx:= -dx;
 
  if top< 0 then dy:= -dy
  else
   if bottom> maxY then dy:= -dy;
 
  WaitVRet;
  SetFillStyle(SOLIDFILL, BLACK);
  Bar(left, top, right, bottom);
 
  Inc(left, dx);
  Inc(top, dy);
  Inc(right, dx);
  Inc(bottom, dy);
 
  SetFillStyle(SOLIDFILL, CYAN);
  Bar(left, top, right, bottom);
 end;
 
 ReadKey;(*pop last key from BIOS's 8042-buffer*)
 CloseGraph;
end.


Джерела інформації[ред.ред. код]

Див. також[ред.ред. код]

Популярні реалізації Pascal[ред.ред. код]

Посилання[ред.ред. код]