Loading AI tools
алгоритмічна мова програмування З Вікіпедії, вільної енциклопедії
Pascal — алгоритмічна мова програмування універсального призначення. Існують діалекти мови з підтримкою об'єктно-орієнтованого програмування. В 1990 році було затверджено стандарт ISO 7185:1990, «Pascal»[2], та ISO 10206:1990 «Extended Pascal»[3].
Pascal (Паскаль) | |
---|---|
Парадигма | імперативна, структурна |
Дата появи | 1970 |
Творці | Ніклаус Вірт |
Розробник | Ніклаус Вірт |
Система типізації | статична, жорстка, безпечна |
Основні реалізації | CDC 6000, PASCAL-P, PDP-11, PDP-10, IBM System/370, HP, GNU Pascal[en] |
Діалекти | UCSD, Borland, Turbo |
Під впливом від | ALGOL |
Вплинула на | Oberon, Modula-2, Ada, Delphi, VHDL, SCAR |
Звичайні розширення файлів | .pp , .p [1] або .pas [1] |
Першим компілятором мови Pascal став ETH Pascal, створений у 1970-му. Назва ETH походить від назви німецької назви технічного університету Цюриха (нім. Eidgenössische Technische Hochschule Zürich), де компілятор було розроблено. Творцем мови став Ніклаус Вірт. Наприкінці того ж року Вірт оприлюднив перший офіційний опис мови, синтаксису та семантики. Нова версія мови побачила світ у 1972 році. Тоді ж Вірт та його англійський колега Чарльз Ентоні Гоар випустили аксіоматичний опис мови Pascal.
У 1969 році Вірт доручив розробку компілятора одному зі своїх студентів (Е. Марм'є). На той час Марм'є володів лише Фортраном і писав компілятор виключно цією мовою. Після написання компілятора його переписали на самому Паскалі. Як згадував потім Вірт, вибір Фортрана був серйозною помилкою, бо у ньому не можна адекватно представляти складні структури даних компілятора Pascal, що лише заплутувало програму.
Наступна спроба створення компілятора (1970 року) почалася з чіткого формулювання опису на самому Паскалі. Синтаксичний аналіз нового однопрохідного компілятора реалізовувався за допомогою рекурсії. Команду розробників склали: У. Амман, Е. Марм'є, Р. Шилд. Після того як компілятор було написано на ще нереалізованій мові, Шилд поїхав додому, де протягом двох тижнів уручну транслював програму в допоміжну низькорівневу мову. У середині 1970 року компілятор ETH Pascal був готовий.
ETH Pascal був цікавий насамперед тим, що став він однією з перших реалізацій мов високого рівня, написаних на самій собі, на два роки випередивши компілятор Сі. У 1973 році була створена абстрактна Pascal-машина (P-машина), яка виконувала спеціальний P-код. Щоб вирішити проблему сумісності компілятора, Вірт вирішив скористатися перевіреними часом методами інтерпретації. Найвідомішими з рішень, які передували P-коду, можна назвати реалізацію мови Snobol-4 (Р. Грісволд, у 1967 році), де як код абстрактної машини використовувалася мова SIL (System Implementation Language).
Початкова мета розробки мови диктувалася потребою інструмента «для навчання програмуванню як систематичній дисципліні». Pascal належить до Algol-подібних мов програмування, оскільки використовує семантику Алгола. Однак Pascal мав суттєве удосконалення — жорстку типізацію. Це означало, що присвоювання можна було виконувати лише для змінних, що належать до одного типу (одночасно вказувались правила, за якими типи вважались однаковими). Це удосконалення суттєво покращило стиль програмування, оскільки значну частину помилок вдавалось виявити ще на етапі компіляції — що збільшувало надійність програм.
Однак мова розроблялась як дослідницький проект і первісний Pascal був мало придатний для написання великих проектів, оскільки програму не можна було скласти з кількох програмних частин — просто не було передбачено такої можливості. Але ця мова програмування швидко завоювала популярність у навчальних закладах при вивченні програмування. А коли з'явились діалекти мови, де можливим було окреме компілювання програмних частин — Pascal став засобом написання великих програмних систем.
Існує ряд об'єктивних причин, які обумовили видатний успіх мови Pascal. Серед них у першу чергу потрібно вказати такі:
Однією з найпоширеніших реалізацій мови Pascal став створений компанією Borland Turbo Pascal (пізніше — Borland Pascal, а потім — Delphi). Turbo Pascal — розширення американського стандарту (ANSI Pascal), яке враховує архітектурні особливості MS-DOS та MS Windows і постачалося зі значними за обсягом і різноманітності пакетами стандартних процедур. Такі принципові нововведення, як апарат модулів і об'єктно-орієнтовані засоби полегшували конструювання великих програмних систем на основі технології модульного програмування.
Компілятор Turbo Pascal працював за однопрохідною схемою, реалізував функції редагування зв'язків, формував на виході готовий до виконання код. Компілятор здійснював широкий набір локальних оптимізацій (згортання констант, виключення невикористовуваного коду і зайвих даних, оптимізація операцій і т. п.), що сприяло високій ефективності кінцевих програм.
Система Turbo Pascal була інтегрованим середовищем (IDE), яке містило низку компонентів, що в сукупності підтримували роботу зі створення програм. Система містила універсальний текстовий редактор, компілятор вхідної мови, редактор зв'язків і вбудований символьний зневаджувач. Багатовіконний інтерфейс із розвиненою системою меню і досконалою довідковою системою забезпечував високу продуктивність праці програміста[ненейтрально].
Borland Pascal 7 компілював програми для DOS та ОС Windows 1.0, Windows 2.0, Windows 3.x, а також містив низку додаткових утиліт та компіляторів на кшталт: Turbo Pascal for Windows (TPW), Borland Pascal for Windows (BPW), редактор ресурсів (іконок, графічних файлів, курсорів тощо) та інші.
Інтерфейс користувача набув іншого вигляду. Програма компілюється в машинні команди для процесорів 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>,..}
Місце опису директив (макросів) є довільним. Деякі директиви мають більш, ніж одне значення. Наприклад:
Більшість директив має однакову форму запису, але є й винятки, на кшталт:
Приклад:
{$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.
unit new;
interface
implementation
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);
temp: Byte;
procedure SwitchLowBytes(var DATA); far;
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;
procedure switch_low_bytes(var data);
type
_bytes: array [0..1] of Byte;
begin
temp:= _bytes(data)[0];
_bytes(data)[0]:= _bytes(data)[1];
_bytes(data)[1]:= temp;
end;
begin
procCall:= SwitchLowBytes;
WriteLn(test);
procCall(test);
WriteLn(test);
switch_low_bytes(test);
WriteLn(test);
end.
У програмі має бути щонайменше два зарезервованих слова — begin та end. Роздільником між послідовними операторами є «;» (крапка з комою).
Кількість зарезервованих слів «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» необхідно поставити крапку «.»
Назва типу | Діапазон значень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 |
Для величин перелічувальних типів (всі цілі, літерний та булевий) існують декілька стандартних функцій та процедур:
Разом із популярністю мови стало відомим і ім'я Ніклауса Вірта. Працюючи у Швейцарському федеральному технічному інституті разом із своїми учнями і послідовниками удосконалював теорію мови програмування загального використання. Так у 1980 році з'явилась Modula (хоча коли говорять "Modula", мають на увазі Modula-2). Modula-2 стала завершенням розвитку лінії структурного програмування. У 1990 році — з'явився Oberon що вже використовував принципи ООП (хоча об'єктно-орієнтоване програмування було можливим вже у версії 5.5 однієї з найпопулярніших реалізацій мови — Turbo Pascal).
Тепер можна говорити про існування родини Pascal-подібних мов, до яких належать Pascal, Modula-2, Oberon, Oberon-2, Active Oberon, 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.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.