Movatterモバイル変換


[0]ホーム

URL:


Перейти до вмісту
Вікіпедія
Пошук

Pascal

Матеріал з Вікіпедії — вільної енциклопедії.
У Вікіпедії є статті про інші значення цього терміна:Паскаль.
Pascal (Паскаль)
Парадигмаімперативна,структурна
Дата появи1970
ТворціНіклаус Вірт
РозробникНіклаус Вірт[1] Редагувати інформацію у Вікіданих
Останній релізISO/IEC 10206:1991 Stage: 90.93 (29 июля 2008 года)
Система типізаціїстатична, жорстка,безпечна
Основні реалізації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[2] або.pas[2] Редагувати інформацію у Вікіданих

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

Історія виникнення і особливості мови

[ред. |ред. код]

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

Turbo Pascal та Borland Pascal

[ред. |ред. код]
Докладніше:Turbo Pascal та Delphi

Загальні відомості

[ред. |ред. код]
Turbo Pascal 1.0 IDE (1983 рік)
Borland Pascal 7.0 IDE (1992 рік)

Однією з найпоширеніших реалізацій мови 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), редактор ресурсів (іконок, графічних файлів, курсорів тощо) та інші.

Компілятори Turbo Pascal 7.0 та Borland Pascal 7.x

[ред. |ред. код]

Інтерфейс користувача набув іншого вигляду. Програма компілюється в машинні команди для процесорів 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}varf:File;beginAssign(f,'file');{$I-}Reset(f,$200);{$I+}ifIOResult<>0thenRewrite(f,$200);end.

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

Приклад:

{$X+}programt80c187;functionNew:ByteBool;beginend;begint80c187.New;New;end.
Створення відкомпільованих модулів
unitnew;interfaceimplementationend.
Підключення відкомпільованих модулів

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

Приклад:

usescrt,dos,vbe30;varscreen:Text;beginCrt.AssignCrt(screen);AssignCrt(screen);end.
Опис міток

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

Приклад:

label0,9999;begin0:goto9999;9999:goto0;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>;

Приклади:

typePointer=recordcaseByteof$00:(ofs,seg:Word);$01:(fulladdr:LongInt);end;_RGBA=recordred,green,blue:Single;alpha:Single;end;_VideoBuffer=array[16*12]of_RGBA;_Beer=(BEST,BESTER,MORE);_Element=^_List;_List=recordprev:_Element;data:_Beer;next:_Element;end;_SimpleProc=Procedure;_ByteFunc=Function:Byte;_New=objectprivateright,bottom:Integer;procedureDestroy;(*or destructor..*)publicleft,top:Integer;width,height:Word;procedureCreate;(*or constructor..*)procedureFree;end;_Newest=object(_New)procedureCreate;procedureFree;end;constCNT=$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));varcounter:_Beer;temp0,temp1,temp2:0..Byte('2');a:array[0..0]ofarray[Byte]ofByte;b:array(.0..0,Byte.)ofWord;(*(.= [    .)= ]*)intVar:Word;proc:Procedure(constBITS:Byte);float10:Extended;float4:Single;divZeroErrorAddr:LongIntabsolute$0000:$0000;mode:LongIntabsolute$0040:$0049;crtMode:LongIntabsolutemode;procedure_New.Create;assembler;asmend;procedure_New.Destroy;assembler;asmend;procedure_New.Free;beginend;procedure_Newest.Create;begininheritedCreate;end;procedure_Newest.Free;begininheritedFree;end;beginend.
Опис процедур та функцій (конструкторів та деструкторів)

procedure <identifier> [parameters]; [directives]
function <identifier> [parameters]: <type>; [directives]

Приклад:

consttest:Word=$0001;varprocCall:Procedure(varDATA);temp:Byte;procedureSwitchLowBytes(varDATA);far;begintemp:=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;procedureswitch_low_bytes(vardata);type_bytes:array[0..1]ofByte;begintemp:=_bytes(data)[0];_bytes(data)[0]:=_bytes(data)[1];_bytes(data)[1]:=temp;end;beginprocCall:=SwitchLowBytes;WriteLn(test);procCall(test);WriteLn(test);switch_low_bytes(test);WriteLn(test);end.

У програмі має бути щонайменше два зарезервованих слова — begin та end. Роздільником між послідовними операторами є «;» (крапка з комою).

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

Наприклад:

beginasmend;end.
unitnew;interfaceimplementationend.
type_HBrush=recordend;beginend.

Присвоєння значення відбувається так:
<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Роль старшого біту та розмір (біти)
Byte0..255беззнаковий 8
Word0..65535беззнаковий 16
Char#0..#2558
BooleanFALSE..TRUE8
ByteBoolFALSE..TRUE8
WordBoolFALSE..TRUE16
LongBoolFALSE..TRUE32
ShortInt−128..127зі знаком 8
Integer−32768..32767зі знаком 16
Longint−2147483648..2147483647зі знаком 32
Pointer$00000000..$FFFFFFFF32
Дійсні типи
Назва типуДіапазон значень (з урахуванням «дірок»)Кількість значущих цифрРозмір (біти)
Comp−9.2e18..9.2e1819-2064
Single1.5e-45..3.4e387-832
Real2.9e-39..1.7e3811-1248
Double5.0e-324..1.7e30815-1664
Extended3.4e-4932..1.1e493219-2080
Інші типи
Назва типуРозмір (Байт)
String1+ 1..255
File8+40+80
Text128+ 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,Active Oberon,Component Pascal.

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

Поширені реалізації

[ред. |ред. код]

Приклади програм

[ред. |ред. код]

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

programHello_World;beginWriteln('Hello, World!!');(*:)*)end.

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

{$N+, E+}varn:Byte;functionFact(n:Byte):Comp;beginifn=0thenFact:=1elseFact:=Fact(n-1)*n;end;beginReadLn(n);WriteLn(n,'!= ',Fact(n):0:0);end.

Примітки

[ред. |ред. код]
  1. Wirth N. The Development of Procedural Programming Languages Personal Contributions and PerspectivesSpringer Science+Business Media, 2000. —doi:10.1007/10722581_1
  2. абhttps://salsa.debian.org/debian/mime-support/blob/debian/3.61/mime.types
  3. ISO/IEC 7185:1990(PDF). Архіворигіналу(PDF) за 16 липня 2011. Процитовано 4 грудня 2007.
  4. ISO 10206:1990(PDF). Архіворигіналу(PDF) за 28 липня 2011. Процитовано 4 грудня 2007.

Див. також

[ред. |ред. код]

Посилання

[ред. |ред. код]
Pascal
у сестринських Вікіпроєктах


Мова програмуванняЦе незавершена стаття промови програмування.
Ви можетедопомогти проєкту,виправивши або дописавши її.
Рівень
Низькорівневі
Високорівневі
Загального
призначення
Серверні
Запитів до баз
даних[суперечливо 1]
Розмітки тавекторної
графіки
[суперечливо 1]
Синхронні
Символьних та
чисельних обчислень
Квантових обчислень
Логічні
Академічні
Езотеричні
  1. абНемає загальноприйнятого рішення, чи вважати усі ці мови саме мовами програмування
Отримано зhttps://uk.wikipedia.org/w/index.php?title=Pascal&oldid=45211929
Категорії:
Приховані категорії:

[8]ページ先頭

©2009-2026 Movatter.jp