��������� � ����� ������������ ������� (original) (raw)

��������� � ����� ������������ �������

Copyright � 1994-2001 by Oberon microsystems, Inc., Switzerland.

All rights reserved. No part of this publication may be reproduced in any form or by any means, without prior written permission by Oberon microsystems. The only exception is the free electronic distribution of the Education Edition of BlackBox (see the accompanying copyright notice for details).

Oberon microsystems, Inc.
Technoparkstrasse 1
CH-8005 Zurich
Switzerland

Oberon is a trademark of Prof. Niklaus Wirth.
Component Pascal is a trademark of Oberon microsystems, Inc.
All other trademarks and registered trademarks belong to their respective owners.

Authors
Oberon microsystems, Inc.
March 2001

Authors of Oberon-2 report
H. Mossenbock, N. Wirth
Institut fur Computersysteme, ETH Zurich
October 1993

Author of Oberon report
N. Wirth
Institut fur Computersysteme, ETH Zurich
1987

� ������� �� ������� ����: �.�.������, 2001.
�������� ������� ������������ ���, ������.

������� ����������� � ��������� ���������� �������� Oberon microsystems, Inc.

������� �������� �������� � ������������ ������� BlackBox Component Builder, v.1.4, ��� ��������� "����������� ����������������. �������� � ��������� � ������������ ����������" (�.�.������, ������� ������������� ������, ���������� ��������� ���).

������������ �������� � �������� ������������� �� �����:
�. ���� "���������������� �� ����� ������-2", ������, ���, 1987, ������� �.�. ����������� � �.�. �������� ��� ���. �.�. ���������.
� ���������� ������� ���� ���������� ������� ���������.
� ������� ������� � ���������� �����������.

����������

��������
2. ���������
3. ������� � �����������
4. �������� � ������� ���������
5. �������� ��������
6. �������� �����
6.1 �������� ����
6.2 ���� ��������
6.3 ���� �������
6.4 ������������ ����
6.5 ����������� ����
6.6 ���� ������� �����
7. �������� ����������
8. ���������
8.1 ��������
8.2 ��������
9. ���������
9.1 ������������
9.2 ������ ��������
9.3 ����������� ������������������
9.4 �������� ��������� IF
9.5 ��������� ������ CASE
9.6 ���� � �������� ����������� WHILE
9.7 ���� � �������� ��������� REPEAT
9.8 ���� � ����� FOR
9.9 ����������� ���� LOOP
9.10 ��������� �������� RETURN � ������ EXIT
9.11 ��������� ������������� ���� WITH
10. �������� ��������
10.1 ���������� ���������
10.2 ������
10.3 ���������������� ���������
10.4 �����������
11. ������
���������� A: ����������� ��������
���������� B: ��������� ������������� �������
���������� C: ��������� �������� �������� �����
���������� D: ������������ ���������� � ����� ����������

1. ��������

������������ ������� � ������������������� ������ ����� ������-2, ������������� ��������� Oberon microsystems. �������� Oberon microsystems ���������� �. ̸������� � �. ����� �� ��������� ���������� ������������ �� ��������� � ����� ������-2 � �������� ������ ������� ���������.

������������ ������� � ���� ������ ���������� � �������� ������ �������, ������-2 � ������. ��� ����� ������ ����� � ������� ���������, �����������, ���������� ����������, ����������� ����� ���������� � ������ (����������� ���������, static typing) � ������� �������� ����� (� ��� ����� ����� ������� �������), <�����������> ��������������� ����� [type extension] ������ � ��������, ������������ �������� �������, � ����� <��������������> ���� ������.

��������������� ����� ������ ������������ ������� ��������-��������������� ������. ������ � ���������� ������������ ���� ������ [abstract data type] <�������������� "�����������" ������������� ����� � ��������������� ������, �������� �� ����������� ������, ������������� � ������� ������� ABSTRACT � ������������ �������>, ��������� �� ��������� ������ [private data] (�.�. ��� ���������) � ��������, ����������� � ����� �������. ����������� ���� ������ ������������ ��� ������, ����������� <�����������> ��������������� [extensible records]. � ������������ ������� ��� ������� ����� ������� ��������-��������������� ������ ������������ �������������� ������� ������������ ������, ����� �������������� ����� �������� ��� ������� �������. <���������� ������� ������������ ��������� ����������� ���������� � ���� ������ ��������� ����������� � �������� ������, ������� � �������� ��� ��������� �������� �������� ������� "�������" � "������" ��� �������� �����.>

������ ������ � ��������� ����� ���������� [complete type safety] � ���������� ������������ ��������� ������ ������ ������������ ������� �����������-��������������� ������.

������ ��������� �� �������� ���������. ��� ��������� ���������. ��� ������� � ������� ������������ ��� �������������. ����������� ����������������� ��������� ���������, ���� ������ ��� ��������������� ��������� ����� ���� �������� �� ���������������� ������ �����, ���� ������ ��� ��������� ����������� �� ���������������� ����������� ���, ��� ������������� ������������� �� ������� ��������.

���������� A ���������� ��������� �������, ������������ ��� ��������� ������ �������� ����� � ������������ �������. � ������ ����� ������� ���� ��������, ����� ������� �� �� ����������� ����� (��������, _����������_���).

������������� �������������� ������������� ����������� ����� � �����-������� [super calls], �.�. ��� ��������� ����������� ����������. ��� ���� ���������, ����� ��������� ������������� ������������ �������� �� �������-2. ��������� ���� ������� ����� ���� ��������� � ����������� �������� ��������. � ���������� ������ ��, ��� �������� ���� ���������� �������, �������� ������� ������.

2. ���������

��� �������� ���������� ������������� ������� ������������ ����������� ��������� ������-����� (����). ������������ ����������� �������� |. ���������� ������ [ � ] �������� ���������������� ������������ � ��� ���������, � �������� ������ { � } �������� ��� ��������� ���������� (0 ��� ����� ���). � ������ ������������� ��� ������������� ������ ������������ ������� ������ ( � ). �������������� ������� ���������� � ������� ����� (��������, Statement). ������������ ������� ���� ���������� � ��������� ����� (��������, ident), ���� �������� ������ �������� ������� (��������, BEGIN), ���� ������������ ��������� ����� (��������, ":=").

3. ������� � �����������

����������� (������������) ������ ����������� ����� ���������� �������� ISO 8859-1, �.�. ���������� Latin-1 ������ ����� ASCII. ����� ������� ���� ��������������, �����, �������� � ������������. ������� ��������� ��������� ����������� �������: ������� � ����� ����� �� ������ ���������� ������ ������ (�� ����������� ������������, � ����� �������� � �������� ��������). ��� ������������, ���� ��� �� ����� ��� ���������� ���� ���������������� ������. ������� � ��������� ����� �����������.

1. �������������� [identifiers] ���� ������������������ ����, ���� � �������� �������������. ������ ������ �� ������ ���� ������.

ident = (letter | "_") {letter | "_" | digit}.

letter = "A" .. "Z" | "a" .. "z" | "�".."�" | "�".."�" | "�".."�".

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".

�������: x Scan Oberon2 GetSymbol firstLetter

2. ����� ���� ����� ��� ������������ ��������� (��� �����). ����� ����� ��������� �������� INTEGER, ���� �������� ��������� ����������� <��������� �������� ����> INTEGER, ��� LONGINT � ��������� ������ (��. 6.1). ���� ��������� ������ � ��������� 'H' ��� 'L', ������������� �������� 16-������, � ��������� ������ ������������� ����������. ������� 'H' ������������ ��� ������ 32-������ �������� � ��������� -2147483648 .. 2147483647. ����������� �� ����� 8 �������� 16-������ ����. ������� 'L' ������������ ��� ������ 64-������ ��������.

������������ ����� ������ �������� ���������� �����. ��� ����� ����� ��������� ���������� ���������� ���������. ����� E �������� "�������� �� 10 � �������". ������������ ����� ������ ����� ��� REAL.

number = integer | real.

integer = digit {digit} | digit {hexDigit} ( "H" | "L" ).

real = digit {digit} "." {digit} [ScaleFactor].

ScaleFactor = "E" ["+" | "-"] digit {digit}.

hexDigit = digit | "A" | "B" | "C" | "D" | "E" | "F".

�������:

1234567 INTEGER 1234567

0DH INTEGER 13

12.3 REAL 12.3

4.567E8 REAL 456700000

0FFFF0000H INTEGER -65536

0FFFF0000L LONGINT 4294901760

3. ������ [characters] ������������ ����� ���������� ������� � 16-������ �������, �� ������� ������� ����� X.

character = digit {hexDigit} "X".

4. �������� ������� [strings] � ������������������ �����, ����������� � ��������� (') ��� ������� (") �������. ����������� ������� ������ ������ ��������� � �����������, � �� ����������� ������ �������. ����� ����� � ������� ���������� �� ������. ������� ����� 1 ����� �������������� �����, ��� ��������� �������� ���������, � ��������.

string = ' " ' {char} ' " ' | " ' " {char} " ' ".

�������: "Component Pascal" "Don't worry!" "x"

5. �������� � ������������ [operators and delimiters] ���� ����������� ������, ���� ����� ��� �������� �����, ������������� ����. �������� ����� �������� ������ ������� ����� � �� ����� �������������� ��� ��������������.

+ := ABSTRACT EXTENSIBLE POINTER
- ^ ARRAY FOR PROCEDURE
* = BEGIN IF RECORD
/ # BY IMPORT REPEAT
~ < CASE IN RETURN
& > CLOSE IS THEN
. <= CONST LIMITED TO
, >= DIV LOOP TYPE
; .. DO MOD UNTIL
| : ELSE MODULE VAR
$ ELSIF NIL WHILE
( ) EMPTY OF WITH
[ ] END OR
{ } EXIT OUT

6. ����������� [comments] ����� ����������� ����� ����� ����� ������ � ���������. ��� ������������ ����� ������������ ������������������ �����, ������������� ������� (* � ������������� ������� *). ����������� ����� ���� ������� ���� � �����. ��� �� ������ �� ����� ���������.

4. �������� � ������� ���������

������ �������������, ������������� � ���������, ������ ���� ������ � ������� �������� [declaration], �� ����������� �������, ����� ��� ���������������� [predeclared] �������������. �������� ����� ������ ��������� ������������ �������� ������� <������ "������" ������������� ����� � ��������������� ������ � "��, ��� ����� ���� ������� [declared] � �����">, ����� ��� �������� �� �� ����������, �����, ���������� ��� ����������. ����� ������������� ������������ ��� ������ �� ��������� � ��� ������.

������� ��������� [scope] ������� x ����������� ���������������� �� ����� ��� �������� �� ����� ����� (������, ��������� ��� ������), � �������� ����������� �������� � �� ��������� � �������� ������, ����� �������, ��������� ��������� [local]. �� ���� ������� ����������� ������� ��������� �������� � ����� �� ������, ��������� � ������, ��������� � ������. ������� ��������� ������:

1. ������������� ����� ���������� ������ ���� ������ � ������ ������� ��������� (�.�. ������� ������������� �� ����� ���� �������� � ����� ������);

2. �� ������ ����� ��������� ������ � ��� ������� ���������;

3. �������� ���� T, ���������� ������ �� ������ ��� T1 ����� ������ � ������, ��� T1 ��� �� ��������. �������� ���� T1 ������ ��������� ����� � ��� �� �����, � ������� ����������� T;

4. �������������� ����� ������� [record fields] (��. 6.3) ��� ������� (��. 10.2) ����� ����������� ������ � ��������� ������ [designators]. <� ����� �� ������-2 ��� �������� ���������������� ������� designator ������� ������������� ����� "�����������", ��� �� �������������� �������.>

�� ���������������, ��������� � ����� ������, � ��� �������� ����� ��������� ����� �������� (" * " ��� " - "), ����� �������, ��� �� ��������������. ������������� x, ���������������� �� ������ M, ����� ������������ � ������ ������� ��� �������, ��� ��� ����������� M (�� ��. 11). � ����� ������� ������������� ������������ ��� M.x � ���������� ����������������� ��������������� [qualified identifier]. ���������� � ���� �������, ���������� � ����� ��������� �������� " - ", �������� � ������������� ������� ������ ��� ������ [are read-only] (� ������ ���������� � �����) ��� ������ ��� ���������� [implement-only] (� ������ �������).

Qualident = [ident "."] ident.

IdentDef = ident [" * " | " - "].

��������� �������������� �������� �����������������; �� �������� ������� � ��������� ��������:

ABS (10.3) INTEGER (6.1)
ANYPTR (6.1) FALSE (6.1)
ANYREC (6.1) LEN (10.3)
ASH (10.3) LONG (10.3)
ASSERT (10.3) LONGINT (6.1)
BITS (10.3) MAX (10.3)
BOOLEAN (6.1) MIN (10.3)
BYTE (6.1) NEW (10.3)
CAP (10.3) ODD (10.3)
CHAR (6.1) ORD (10.3)
CHR (10.3) REAL (6.1)
DEC (10.3) SET (6.1)
ENTIER (10.3) SHORT (10.3)
EXCL (10.3) SHORTCHAR (6.1)
HALT (10.3) SHORTINT (6.1)
INC (10.3) SHORTREAL (6.1)
INCL (10.3) SIZE (10.3)
INF (6.1) TRUE (6.1)

5. �������� ��������

�������� ��������� ��������� ������������� � ��������� ������������ ���������.

ConstantDeclaration = IdentDef "=" ConstExpression.

ConstExpression = Expression.

����������� ��������� � ��� ���������, ������� ����� ���� ��������� ��� ������� ������������ ��������� ��� ������������ ���������� ���������. ��� �������� ���� ��������� (��. 8) ��� ���������������� ������� (10.3), ������� ����� ���� ��������� ��� ����������. ������� ����������� ���������:

N = 100

limit = 2*N - 1

fullSet = {MIN(SET) .. MAX(SET)}

6. �������� �����

��� ������ ���������� ��������� ��������, ������� ����� ��������� ���������� ����� ����, � ����� ���������� � ��� ��������. �������� ���� ��������� ������������� � �����. � ������ ����������������� ����� (�������� � �������) ��� ����� ���������� ��������� ���������� ����� ����. ����������������� ��� �� ����� ��������� ����.

TypeDeclaration = IdentDef "=" Type.

Type = Qualident | ArrayType | RecordType | PointerType | ProcedureType.

�������:

Table = ARRAY N OF REAL

Tree = POINTER TO Node
Node = EXTENSIBLE RECORD
key : INTEGER;
left, right: Tree
END

CenterTree = POINTER TO CenterNode
CenterNode = RECORD (Node)
width: INTEGER;
subnode: Tree
END

Object = POINTER TO ABSTRACT RECORD END;

Function = PROCEDURE (x: INTEGER): INTEGER

6.1 �������� ���� [base types]

�������� ���� ������������ ����������������� ����������������. ��������������� �������� ���������� � 8.2, � ���������������� ���������-������� � � 10.3. �������� �������� ����� ������:

1. BOOLEAN ���������� �������� TRUE � FALSE
2. SHORTCHAR ������ ������ Latin-1 (0X .. 0FFX)
3. CHAR ������ ������ Unicode (0X .. 0FFFFX)
4. BYTE ����� �� MIN(BYTE) �� MAX(BYTE)
5. SHORTINT ����� �� MIN(SHORTINT) �� MAX(SHORTINT)
6. INTEGER ����� �� MIN(INTEGER) �� MAX(INTEGER)
7. LONGINT ����� �� MIN(LONGINT) �� MAX(LONGINT)
8. SHORTREAL ������������ ����� �� MIN(SHORTREAL) �� MAX(SHORTREAL), �������� INF
9. REAL ������������ ����� �� MIN(REAL) �� MAX(REAL), �������� INF
10. SET ��������� ����� ����� �� ��������� �� 0 �� MAX(SET)

���� 4-7 ���� ����� ����, ���� 8 � 9 ���� ������������ ����, � ������ ��� ���������� ��������� ������. ��� �������� ��������; ������� ��� �������� ������� (��������� �������� ��������):

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

���� 2 � 3 ���� �������� ���� �� ��������� ��������� �����:

CHAR >= SHORTCHAR

6.2 ���� �������� [array types]

������ � ���������, ��������� �� ���������� ���������� ���������, ������� ���� � ��� �� ���, ���������� ����� ���������. ���������� ��������� ������� ���������� ��� ������. �������� ������� ���������� � ������� ��������, ���������� ������ ������� �� ��������� �� 0 �� ����� ����� 1.

ArrayType = ARRAY [Length {"," Length}] OF Type.

Length = ConstExpression.

��� ����

ARRAY L0, L1, ..., Ln OF T

���������������� ��� ����������� ������ ���

ARRAY L0 OF
ARRAY L1 OF
...
ARRAY Ln OF T

�������, ��������� ��� �����, ���������� ��������� ���������. �� ������������� ���������� �������� ������ ��� ���������� (��. 6.4), ������ ��������� �������� ��������, � ����� ������ ���������� ���������� (��. 10.1). �������:

ARRAY 10, N OF INTEGER

ARRAY OF CHAR

6.3 ���� ������� [record types]

������ ��� ���������, ��������� �� �������������� ���������� ���������, ���������� ������, ��������, ������� ������ ����. �������� ���� ������� ��������� ��� � ��� ������� ����. ������� ��������� ��������������� ����� ���������������� �� ����� �� �������� �� ����� ������� ����, �� ��� ����� ������ ������ ��������� ����, ������������ ���� ���������� ������� ���� (��. 8.1). ���� ��� ������� ��������������, �� �������������� �����, ������� ����� ����� �������� ��� ������������ ������, ������ ���� ��������������� ������� ��������. ��� ���������� ���������� ������ [public fields]; ������������ �������� ���������� ���������� ������ [private fields].

RecordType = RecAttributes RECORD ["("BaseType")"] FieldList {";" FieldList} END.

RecAttributes = [ABSTRACT | EXTENSIBLE | LIMITED].

BaseType = Qualident.

FieldList = [IdentList ":" Type].

IdentList = IdentDef {"," IdentDef}.

������������� ������� ���� ������� ���������� �������� ��� ����������� ������ �� ��������� ���������:

ABSTRACT, EXTENSIBLE � LIMITED.

���������� ���� �������, ����������� ��� ABSTRACT, �� ����� ���� ��������� <�����: �������������� [instantiated]>: �� ����� ������������ �� ����������, �� ����� ������ ����. ����������� ���� <�.�. ��������� � ��������� ABSTRACT> ������������ ������ ��� ������� ���� ��� ������ ����� ������� (��. ����).

���������� ���� �������, �������� ������� LIMITED, ����� ����������� [allocated] ������ ������ ���� ������, ��� ������ ������ ���. ����������� ��������� ��� � ������������ ���������� ����������� �������� ���������� (��. 7), ��� � � ������������� ���������� � ������� ����������� ��������� NEW (10.3).

��� �������, ���������� ��� ABSTRACT ��� EXTENSIBLE, �������� �����������, �.�. ����� ���������� ����� ��� ������� ��� ���������� ������ ����. � �������

T0 = EXTENSIBLE RECORD x: INTEGER END

T1 = RECORD (T0) y: REAL END

T1 �������� (����������������) �������� [extension] ���� T0, � T0 � (����������������) ������� [base type] ��� T1 (��. ���������� A). <� ��������� ������ base type ������������ � ���� ������ ���������, ������� ������ ������ ������� ��������.> ���-������� [extended type] T1 ������� �� ����� ����-������ � �����, ����������� � T1. ��� ��������������, ��������� � ����-�������, ������ ���� ������� �� ���������������, ��������� � ��� ������. ���-������ ������������ ���� ������� ������ ���� �����������.

����� ����, � �������� ����-������ ����� ������������ ������������ ���. � ���� ������ � �������� ����-������ ������������ ���� ������� ������������ ������� ��� ������� ������� ���������.

������ �������������� ��� �������, ���������� �������� �������� (�.�. �� �����������������) ���� �������.

������ ������ �������� ������� �������� ����������������� ���� ANYREC. ANYREC �� �������� ������� ����� � ����� �������������� ������ � ��������� ���������� � ����������-����������.

������ ���������:

������� ����������� �������� [extension] ����������
����������� ��� ��
EXTENSIBLE �� ��
ABSTRACT �� ���
LIMITED ������ � ������������ ������

������� �������� ����� �������:

RECORD
day, month, year: INTEGER
END

LIMITED RECORD
name, firstname: ARRAY 32 OF CHAR;
age: INTEGER;
salary: REAL
END

6.4 ������������ ���� [pointer types]

����������, ������� ������������ ��� P, ��������� � �������� �������� ��������� �� ���������� ���������� ���� T. T ���������� ������� ����� [pointer base type] ��� P � ������ ���� ����� ������� ��� ����� ��������. ������������ ���� ��������� ��������� �������-������ ��� ����� ������� �����: ���� ��� T1 �������� �������� ���� T, � P1 ����� ��� POINTER TO T1, �� P1 ����� �������� �������� ���� P.

PointerType = POINTER TO Type.

���� p � ���������� ���� P = POINTER TO T, �� ����� ���������������� ��������� NEW(p) (��. 10.3) ��������� ���������� ���� T � ��������� ������. ���� T � ��� ������� ��� ��� �������� � ������������� ������, �� ���������� ������� ��������� ���������� NEW(p); ���� T � n-������ �������� ������, �� ���������� ������� ��������� ���������� NEW(p, e0, ..., en-1), ��� T ����������� � �������, ����������� ����������� e0, ..., en-1. � ����� ������� ��������� �� ����������� ���������� ������������� ���������� p. p ����� ��� P. �������������� [referenced <�.�. ��, �� ������� ��������� p>] ���������� p^ (��������: p-��������������), ����� ��� T. ����� ��������� ����� ��������� �������� NIL, ������� �� ��������� �� �� ����� ���������� ������.

��� ���� � �������� ����� ����������� ������ ��� ������� ���������; � ���������, �������� ��� ������������ � ��� ������������ � ����������� ���������� ��������������� � NIL.

���������������� ��� ANYPTR ������������ ��� POINTER TO ANYREC. ������� ����� ��������� �� �����-���� ��� ������� �������� �������� ���� ANYPTR. ��������� NEW ��������� � ���������� ���� ANYPTR ������.

6.5 ����������� ����

���������� ������������ ���� T ����� � �������� �������� ��������� ��������� ��� NIL. ���� ���������� ���� T ��������� ��������� P, �� ������ ���������� ���������� (��. 10.1) ��� P � T ������ ��������������� [match] (��. ���������� A). P �� ����� ���� �� ���������������� ����������, �� �������, �� ���� ��������� � ������ ���������.

ProcedureType = PROCEDURE [FormalParameters].

6.6 ���� ������� ����� [string types]

�������� ����� ������� ����� ���� ������������������ �����, �������������� ����-������� (0X). ����� ������� � ��� ���������� ����� � ���, �������� ����-������.

������� ����� ���� ���� �����������, ���� ��������� � ������� ��������� ����. ��� ����� ������� ��� ���������������� ���������������, �.�. ��� ��� �������� �� �����.

����������� �������, ��������� ������ �� ����� � ��������� 0X..0FFX, � �������, ���������� � ������� ��������� ���� SHORTCHAR, ����� ��� Shortstring, ��� ��������� � ��� String.

7. �������� ����������

�������� ���������� ������ ����������, ��������� ��� ��� ������������� � ��� ������.

VariableDeclaration = IdentList ":" Type.

���������� ����� ������� � ������������ ����� ����� ��� ����������� ��� (��� ���, � ������� ��� ������� � ����� ������ �������� ��� �� �����) � ������������ ��� (��� �� �������� ��� ���������� ���������). ��� ���������� � ����������-���������� ���� ������� ������������ ��� ����� ���� �������� �� ������������ ����. ����������� ��� ����������, ����� ���� ������ ��������. ������������ ��� ������������ ��� ������ ������� (��. 10.2).

������� �������� ���������� (��. ������� � ��. 6):

i, j, k: INTEGER

x, y: REAL

p, q: BOOLEAN

s: SET

F: Function

a: ARRAY 100 OF REAL

w: ARRAY 16 OF
RECORD
name: ARRAY 32 OF CHAR;
count: INTEGER
END

t, c: Tree

8. ���������

��������� ��� �����������, ����������� �������������� �������, � ������������ � �������� ������������� ��������� � ������� �������� ���������� ��� ���������� ������ �������� ����������� ���������� �������� � ��������-�������. ��������� ������� �� ��������� � ��������. ������� ������ ����� �������������� ��� ��������� ���������� ������ ����� ���������� � ����������.

8.1 ��������

�� ����������� ������������� �������� � ���������� [literal] �������� (�.�. �����, ����� ��� �������), �������� ������������ ���������� ������� [designators]. ��������� ��� �������� �������������, ������������ ���������, ���������� ��� ���������. ���� ������������� ����� ���� �������������� [qualified] ��������������� ������ (��. ��. 4 � 11), � ����� ���� �� ��� ����� ��������� ��������� [selectors], ���� ������������ ������ �������� ��������� ������� ��� ����� ������.

Designator = Qualident {"." ident | "[" ExpressionList "]" | "^" | "(" Qualident ")" | ActualParameters} [ "$" ].

ExpressionList = Expression {"," Expression}.

ActualParameters = "(" [ExpressionList] ")".

���� a � ��������� ���, ������������ ������, �� a[e] ���������� ��� ������� ������� a, � �������� ������ ����� �������� �������� ��������� e. ��� �������� e ������ ���� �����. ��������� ���, ������� ��� a[e0, e1, ..., en], �������� ����������� ��� a[e0][e1]...[en]. ���� r �������� ��������� ������, ������������ ������, �� r.f ���������� ���� f ������ r ��� ������ f ������������� ���� ������ r (10.2). ���� a ��� r �������� ������ ��� ������, �� ��� �� ����������� ��� a[e] � r.f.

���� p � ��������� ���, ������������ ���������, �� p^ ���������� ����������, �� ������� ��������� p. ��������� ����� p^.f, p^[e] � p^$ ����� ��������� �� p.f, p[e] � p$, �.�. ��������� ������, ������� � �������� ������� ������������� ������������� [dereferencing]. ������������� ����� ���������������, ���� ��������� ������������� ���������� ���� ������ ��� ���� ������ (9.1), ���� ��������� ������������ ��� ����������� ��������, ��������������� ����������� ��������� ���� ������ ��� ���� ������ (10.1), ��� ���� ��������� ������������ ��� �������� ����������� ��������� LEN (10.3).

������ ���� [type guard] v(T) ������������, ��� ������������ ��� ���������� v ���� T (��� ������� ���� T), �.�. ���������� ��������� �������� ������������, ���� ������������ ��� ���������� v �� T (� �� ������� T). ����� ������ ���������� ����� ���������� v ��������� ������� ����������� ��� T. ������ ���������, ����

1. v �������� IN ��� VAR ���������� ���� ������� ��� v �������� ���������� �� ������, � ����

2. T �������� �������� ������������ ���� ���������� v

���� ������������ ������ � ��������� ��� ����������, �� <� ��������� ���������> ��������� ��� ��������� �� �� �������� � ������ ������. ���� ��� ���������, �� ��������� ��� ��������� �� ��� ���������, �������� ������, ����� �� ��� ������� (��������, ������) ������ ����������, � � ���� ������� ��� ������������� ����� ��������� � ������������ ������������ ���������. ����������� ��������� ������ ��������������� ���������� ��� � ������� ������� �������� (��. 10.1).

���� a � ��������� ���, ������������ ������ �����, �� a$ ���������� ������, �������������� ����-�������, ������������ � a. ���� a �� �������� ������ 0X, �� ������������� a$ �������� � ������ ��� ���������� ���������. �������� $ ����������� ������, ���� a ������������ ��� ������� ������������ (8.2.4), �������� ��������� (8.2.5) ��� ����� �� ���������������� �������� LONG � SHORT (10.3).

������� ��������� ���� (��. ������� � ��. 7):

i (INTEGER)

a[i] (REAL)

w[3].name[i] (CHAR)

t.left.right (Tree)

t(CenterTree).subnode (Tree)

w[i].name$ (String)

8.2 �������� [operators]

� ���������� ������������� ����������� ��������� ������� ������� � ������� ������������ [precedences] (�.�. ����� ���������� [binding strengths]). �������� ~ ����� ��������� ���������, �� ��� ������� ����������������� ��������, ���������� �������� �, �������, ���������. �������� � ���������� ����������� ��������� �������� ����� �������. ��������, x-y-z ���������� (x-y)-z.

Expression = SimpleExpression [Relation SimpleExpression].

SimpleExpression = ["+" | "-"] Term {AddOperator Term}.

Term = Factor {MulOperator Factor}.

Factor = Designator | number | character | string | NIL | Set | "(" Expression ")" | "~" Factor.

Set = "{" [Element {"," Element}] "}".

Element = Expression [".." Expression].

Relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.

AddOperator = "+" | "-" | OR.

MulOperator = "*" | "/" | DIV | MOD | "&".

��������� �������� ����������� � ������������� ��������. ��������� �������� ��������� � ��������� ��������� �����, ��������� ��������� ��������. � ���� ������� ����������� �������� ������������ ������ ���������. �������� ������ ���� ���������� �� ��������� [expression compatible] �� ��������� � �������� (��. ���������� A).

8.2.1 ���������� ��������

OR ���������� ��� p OR q "���� p, �� TRUE, ����� q"
& ���������� � p & q "���� p, �� q, ����� FALSE"
~ ��������� ~ p "�� p"

��� �������� ��������� � ��������� ���� BOOLEAN � ���� ��������� ���� BOOLEAN. ������ ������� ����������� ��� ����������� ������ ���� ��������� ������� ����� FALSE. ������ ������� ����������� � �����������, ������ ���� ��������� ������� ����� TRUE.

8.2.2 �������������� ��������

+ �����
- ��������
* ������������
/ ������������ �������
DIV ����� �������
MOD �������

�������� +, -, * � / ��������� � ��������� �������� �����. ����� ���������� ����� REAL � ������ �������� ������� (/) ��� ���� ���� �� ��������� ����� ��� REAL. � ��������� ������ ����� ���������� ����� SHORTREAL, ���� ��� ������ �� ��������� � SHORTREAL, LONGINT ���� ��� ������ �� ��������� � LONGINT, ��� INTEGER � ����� ������ ������. ���� ��������� ������������ �������� ������� �����, ����� ������������ ������������ �����, �� �� ���������� �� ���������������� �������� INF � ��� �� ������, ��� � �������� ���������. �������, ��� ��� ������� ��������� � � 1.0/0.0, �� �� � 0.0/0.0, �.�. ��������� ��������� �� ����� ������������� ���������� ������ � �������� � ������ ��� ���������� ���������. ���� ������������ ����������� ��������, - ���������� �������� �����, � + ���������� ������������� ��������. �������� DIV � MOD ��������� ������ � ����� ���������. ��� ������� ���������� ���������:

x = (x DIV y) * y + (x MOD y)

0 <= (x MOD y) < y ��� 0 >= (x MOD y) > y

�������, ���: x DIV y = ENTIER(x / y)

�������:

x y x DIV y x MOD y
5 3 1 2
-5 3 -2 1
5 -3 -2 -1
-5 -3 1 -2

�������, ���:

(-5) DIV 3 = -2

��

-5 DIV 3 = -(5 DIV 3) = -1

8.2.3 �������� ��� �����������

+ �����������
- �������� (x - y = x * (-y))
* �����������
/ ������������ �������� (x / y = (x-y) + (y-x))

�������� ��� ����������� ��������� � ��������� ���� SET � ���� ��������� ���� SET. ����������� ����� ���������� ���������� ��������� x, �.�. -x ���������� ��������� ����� �� 0 �� MAX(SET), ������� �� �������� ���������� ��������� x. �������� ��� ����������� �� �������� �������������� ((a+b)-c # a+(b-c)).

����������� ��������� ���������� �������� ��������� ������������� ��� ��������� ����� ��������� ��������. �������� ������ ���� ������ � ��������� 0..MAX(SET). �������� a..b ���������� ��� ����� i �����, ��� i >= a � i <= b.

8.2.4 �������� ��� ���������

+ ������������

�������� ������������ ����������� � ��������� ����� �������. ������������ ������� ������� �� ����� ������� ��������, �� �������� ������� ������ ������� ��������. ���� ��� �������� ����� ��� Shortstring, �� ��� ���������� ����� Shortstring, � ��������� ������ ��� ���������� ����� String.

8.2.5 ���������

= �����
# �������
< ������
<= ������ ��� �����
> ������
>= ������ ��� �����
IN �������������� ���������
IS �������� ����

��������� ���� ��������� ���� BOOLEAN. ��������� =, #, <, <=, > � >= ��������� � �������� �����, �������� ����� � ����� ������� �����. ��������� = � # ��������� ����� � BOOLEAN � SET, � ����� � ������������ � ����������� ����� (������� �������� NIL). x IN s �������� "x �������� ��������� s". x ������ ���� ����� � ��������� 0..MAX(SET), � s ����� ��� SET. v IS T �������� "������������ ��� ���������� v ����� T (��� ������� ���� T)" � ���������� ��������� ����. ��� ���������, ����

1. v �������� IN ��� VAR ���������� ���� ������� ��� ���������� �� ��� �������, � ����

2. T �������� �������� ������������ ���� v

������� ��������� (��. ������� � ��. 7):

1991 INTEGER
i DIV 3 INTEGER
~p OR q BOOLEAN
(i+j) * (i-j) INTEGER
s - {8, 9, 13} SET
i + x REAL
a[i+j] * a[i-j] REAL
(0<=i) & (i<100) BOOLEAN
t.key = 0 BOOLEAN
k IN {i..j-1} BOOLEAN
w[i].name$ <= "John" BOOLEAN
t IS CenterTree BOOLEAN

9. ��������� [statements]

��������� ���������� ��������. ���� ������������ � ����������������� ���������. ������������ ��������� �� �������� ������, ������� ���� �������� �����������. ���: ������������, ����� ���������, �������� �������� RETURN � �������� ������ EXIT. ����������������� ��������� ������� �� ������, ������� ���� �������� �����������. ��� ������������ ��� ��������� �����������������, ���������, ����������� � �������������� ����������. �������� ����� ���� ������, � � ���� ������ �� ���������� ���������� ��������. ������ �������� ��������, ����� �������� ������� ���������� � ����������� �������������������.

Statement = [ Assignment | ProcedureCall | IfStatement | CaseStatement |

WhileStatement | RepeatStatement |

ForStatement | LoopStatement | WithStatement |

EXIT | RETURN [Expression] ].

9.1 ������������ [assignments]

������������ �������� ������� �������� ���������� �����, ������������ ����� ����������. ��������� ������ ���� ����������� �� ������������ [assignment compatible] � ���������� (��. ���������� A). �������� ������������ ������������ ��� ":=" � ������������ ���������� ������.

Assignment = Designator ":=" Expression.

���� ��������� e ���� Te ������������� ���������� v ���� Tv, ���������� ���������:

1. ���� Tv � Te ����� ��� ������, ������������ � ����������� ���� e � v ��� ����� � ������������� ��� ���� ����� ����;

2. ���� Tv � Te ����� ������������ ����, �� ������������ ����� v ���������� ������������ ��� e;

3. ���� Tv � ������ ��������� ����, � e � ������� ����� ����� m < LEN(v), �� v[i] ���������� ������ ei ��� i = 0..m-1, � v[m] ���������� ������ 0X. ���� m >= LEN(v), �� � �������� ���������� ������������ ������.

������� ������������ (��. ������� � ��. 7):

i := 0

p := i = j

x := i + 1

k := Log2(i+j)

F := Log2 (* ��. 10.1 *)

s := {2, 3, 5, 7, 11, 13}

a[i] := (x+y) * (x-y)

t.key := i

w[i+1].name := "John"

t := c

9.2 ������ �������� [procedure calls]

����� ��������� ������������ ���������. �� ����� ��������� ������ ����������� ����������, ������� �������� ��������������� ���������� ���������, ������������ � �������� ��������� (��. ��. 10). ������������ ��������������� �� ��������� ���������� � ������� ����������� � ���������� ����������. ������� ��� ���� ����������: ���������-���������� � ���������-��������.

���� ���������� �������� �������� ����������-����������, �� ��������������� ����������� �������� ������ ���� ��������� ������ ��������� ����������. ���� �� ���������� ������� ����������������� ����������, �� ��������������� ��������� ����������� ��� ����������� ������������ ��������� ������ �����������, �.�. �� ���������� ���������. ���� ���������� �������� � ��������-��������, �� ��������������� ����������� �������� ������ ���� ����������. ��� ��������� ����������� �� ����������� ���������, � ������������ �������� ������������� ����������� ��������� (��. ����� 10.1).

ProcedureCall = Designator [ActualParameters].

�������:

WriteInt(i*2+1) (* ��. 10.1 *)

INC(w[k].count)

t.Insert("John") (* ��. 11 *)

9.3 ����������� ������������������

����������� ������������������ ���������� ������������������ ��������, ��������� ���������� �����������, ������������ ������� � �������.

StatementSequence = Statement {";" Statement}.

9.4 �������� �������� IF

IfStatement =
IF Expression THEN StatementSequence
{ELSIF Expression THEN StatementSequence}
[ELSE StatementSequence]
END.

�������� IF ������ �������� ���������� ���������� [guarded] ����������� �������������������. ���������� ���������, �������������� ����������� ������������������, ���������� ��� ������� [guard]. ������ ����������� � ��� �������, � ������� ��� ����������� � ������, �� ��� ���, ���� ���� �� ��� �� ���� �������� TRUE, ����� ���� ����������� ��������������� ����������� ������������������. ���� �� ���� ������ �� ����� �������������, ����������� ����������� ������������������, ��������� �� �������� ELSE, ���� ������� �������.

������:

IF (ch >= "A") & (ch <= "Z") THEN ReadIdentifier
ELSIF (ch >= "0") & (ch <= "9") THEN ReadNumber
ELSIF (ch = "'") OR (ch = '"') THEN ReadString
ELSE SpecialCharacter
END

9.5 �������� ������ CASE

�������� CASE ��������� ����� � ���������� ��������� ����������� ������������������ � ����������� �� �������� ���������� ���������. ������� ����������� ��������� ������, ����� ����������� �� ����������� ������������������, ��� ������ ����� ������ �������� ���������� ��������. ��������� ������ ������ ����� ����� ��� �������� ���, ������� �������� �������� ���� ����� ������. ����� ������ � ���������, � ������� �������� �� ����� ����������� ����� ������ ����. ���� �������� ��������� �� ����������� � �������� �����, �� ����������� ����������� ������������������, ��������� �� �������� ELSE, ���� ������� �������, � ��������� ������ ��������� �������� ���������������.

CaseStatement = CASE Expression OF Case {"|" Case}[ELSE StatementSequence] END.

Case = [CaseLabelList ":" StatementSequence].

CaseLabelList = CaseLabels {"," CaseLabels}.

CaseLabels = ConstExpression [".." ConstExpression].

������:

CASE ch OF
"A" .. "Z": ReadIdentifier
| "0" .. "9": ReadNumber
| "'", '"': ReadString
ELSE SpecialCharacter
END

9.6 ���� � �������� ����������� WHILE

�������� ����� WHILE ��������� ���������� ����������� ���������-���������, �������������, ���� ����� ���������� ��������� (��� ������) ���� TRUE. ������ ����������� ������ ����� ������ ����������� ����������� ������������������.

WhileStatement = WHILE Expression DO StatementSequence END.

�������:

WHILE i > 0 DO i := i DIV 2; k := k + 1 END

WHILE (t # NIL) & (t.key # i) DO t := t.left END

9.7 ���� � �������� ��������� REPEAT

�������� ����� REPEAT ��������� ���������� ����������� ������������������, ������������� �� ��� ���, ���� ����� ���������� ��������� �� ���� TRUE. ������������������ ����������� ���� �� ���� ���.

RepeatStatement = REPEAT StatementSequence UNTIL Expression.

9.8 ���� � ����� FOR

�������� ����� FOR ��������� ���������� ����������� ������������������, ������������� ��� ������������������ ��������, ������������� ����� ����������, ���������� ����������� ���������� �����.

ForStatement =
FOR ident ":=" Expression TO Expression [BY ConstExpression] DO StatementSequence END.

��������

FOR v := beg TO end BY step DO statements END

������������ ����������

temp := end; v := beg;
IF step > 0 THEN
WHILE v <= temp DO statements; v := v + step END
ELSE
WHILE v >= temp DO statements; v := v + step END
END

temp ����� ���������� ��� � ���������� v. step ������ ���� ��������� ����������� ����������. ���� ��������� step �� �������, ��� ������� ������ 1.

�������:

FOR i := 0 TO 79 DO k := k + a[i] END

FOR i := 79 TO 1 BY -1 DO a[i] := a[i-1] END

9.9 ����������� ���� LOOP

�������� LOOP ��������� ������������� ���������� ����������� ������������������. ��� ������������ ����������� ��������� ������ EXIT ������ ���� ������������������ (��. 9.10).

LoopStatement = LOOP StatementSequence END.

������:

LOOP
ReadInt(i);
IF i < 0 THEN EXIT END;
WriteInt(i)
END

����� LOOP ������� ��� ��������� ������������� ���������� � ����������� ������� ������ ��� � ��� �������, ����� ������� ������ ��������� � �������� ������������� ����������� ������������������.

9.10 ��������� �������� RETURN � ������ EXIT

�������� �������� RETURN ��������� ����������� ���������. �� ������������ �������� RETURN, �� ������� ������� ���������, ���� ���� ���� � ���������-�������. ��� ��������� ������ ���� ��������� �� ������������ (��. ���������� A) � ����� ����������, ��������� � ��������� ��������� (��. ��. 10).

���������-������� ������� ������� ��������� ��������, ������������ ��������-���������. � ������� ���������� [proper procedures], �������� �������� ������ ��������������� � ����� ���� ���������. ������� ����� ����� �������� �������� ���������� ��� �������������� (��������, ��������������) ����� ������.

�������� ������ ������������ �������� EXIT. �� ��������, ��� ���������� ������������� ��������� LOOP ������ ���� ����������, � ���������� ��������� ������ ���� ���������� � ���������, ���������� �� ���� ���������� LOOP. �������� EXIT ��������������, ���� � �� �������������, ������ � ���������� ��� ���������� LOOP.

9.11 ��������� ������������� ���� WITH

�������� WITH ��������� ����������� ������������������ � ����������� �� ���������� �������� ���� � ��������� ������ ���� � ������� ��������� ����������� ���������� ������ ����������� ������������������.

WithStatement = WITH [ Guard DO StatementSequence ]
{"|" [ Guard DO StatementSequence} ]
[ELSE StatementSequence] END.

Guard = Qualident ":" Qualident.

���� v � ��������-���������� ���� ������� ��� ������������ ����������, � ���� �� ����������� ��� T0, �� �������� ���������

WITH v: T1 DO S1 | v: T2 DO S2 ELSE S3 END

������: ���� ������������ ����� ���������� v �������� T1, �� ����������� ����������� ������������������ S1, � ������� v ��������������� ��� ���� �� �� ����������� ����� ��� T1; � ��������� ������ ���� ������������ ����� v �������� T2, �� ����������� S2, � ������� v ��������������� ��� ���� �� �� ����������� ����� ��� T2; � ��������� ������ ����������� S3. T1 � T2 ������ ���� ��������� ���� T0. ���� �� ���� �������� ���� �� ���� �������������� ���������� � ���� ����������� ELSE (������ c ��������������� ����������� �������������������), �� ��������� �������� ���������������.

������:

WITH t: CenterTree DO i := t.width; c := t.subnode END

10. �������� ��������

�������� ��������� ������� �� ��������� ��������� [procedure heading] � ���� ��������� [procedure body]. ��������� ������ ������������� ��������� � �� ���������� ���������. ��� ������� �� ����� ������ ����������� �������� [receiver parameter] � �������� (��. 10.2). ���� �������� ���������� � ���������. ������������� ��������� ����������� � ����� �� ��������.

���� ��� ���� ��������: ������� ��������� [proper procedures] � ���������-������� [function procedures]. ���������-������� �������������� ��������� ������ �������, ����������� � �������� ����� ���������, � ���� ���������, ���������� ��������� ���������. ������� ��������� �������������� ������� ���������. ��������� �������� ����������-��������, ���� ������ �� ���������� ���������� ������ ��������� ��� ����������. ���� ���������-������� ������ ��������� �������� ��������, ������� ���������� �� ���������.

��� ���������, ����������, ���� � ���������, ��������� ������ ���� ���������, �������� ���������� �� ��������� � ���� ���������. ��������� ��������� ���� ����� ����������� ��� ��������� �������, �������� �������� ����� ���� ������� ���� � �����. ����� ��������� ������ �� �������� �������� ����������� �����������.

��������� ���������� ������������ ��� ����������� ����� ������������� �������� NIL ����� ����������� ���� ���������.

�������, ��������� � ���������, ���������� ���������, ������ ����� � � ��� ������ ���������, ��� ��� �� ��������� �������� ������������ �������� � ����� ��� �� ������.

ProcedureDeclaration = ProcedureHeading ";" [ ProcedureBody ident ].

ProcedureHeading = PROCEDURE [Receiver] IdentDef [FormalParameters] MethAttributes.

ProcedureBody = DeclarationSequence [BEGIN StatementSequence] END.

DeclarationSequence = {CONST {ConstantDeclaration ";"} |
TYPE {TypeDeclaration ";"} |
VAR {VariableDeclaration ";"} }
{ProcedureDeclaration ";" | ForwardDeclaration ";"}.

ForwardDeclaration = PROCEDURE " ^ " [Receiver] IdentDef [FormalParameters] MethAttributes.

���� � �������� ��������� ������ ����������� �������� [receiver parameter], �� ��������� ��������� �������, ��������� � ����� ������������ ��������� (��. 10.2). ����������� �������� [forward declaration] ������ ��� ����, ����� ��������� ������ �� ���������, ��� ����������� �������� ���������� � ����������� ������. ������ ���������� ���������� ������������ � ������������ �������� ������ ��������������� [match] (��. ���������� A), � ����� ��������������� ���������� ������ ���� �������. <�� �������� ��� ������� ������������ �������� ���������� ����������� ��������� ��������� � �������� � ����� ������ "^" ����� ������� PROCEDURE.>

10.1 ���������� ���������

���������� ��������� ���� ��������������, ��������� � ������ ���������� ���������� ���������. ��� ������������� ����������� ����������, ��������� � ������ ���������. ������������ ����� ����������� � ������������ ����������� ��������������� ��� ������ ���������. ���� ��� ���� ����������: ���������-�������� [value parameters] � ���������-���������� [variable parameters], ��������� �������� � ������ ���������� ���������� ����� �� ���������� VAR, IN ��� OUT. ���������-�������� ������������ ����� ��������� ����������, ������� � �������� ���������� �������� ������������� �������� ���������������� ������������ ���������. ���������-���������� ������������� ����������� ����������, ���������� ����������, � ��� ������������ [stand for] ��� ����������. ���������-���������� ����� �������������� ������ ��� ����� ������ (IN), ������ ��� ������ ������ (OUT) ��� ��� ����� � ������ (VAR). ��������� IN ����� ������������ ������ ��� ����������, ���������� ��������� ��� ��������. ������ ��������� IN-��������� �������� ������ ��� ������. ��� � ��������� ����������, OUT-��������� ������������ ��� ����������� ����� ���������������� � NIL. �������� ������ �������� ���������� ������ ��������������� ��� �������������� �� ������� ������������ � ���������. ������� ��������� ����������� ��������� ���������������� �� ��� �������� �� ����� ������������ �����, � ������� �� ������. ���������-������� ��� ���������� ������ ����� ������ ������ ����������. ��� ������ ���������� � ������� ���������� �����, � �������� ���� ������ ������ ����������� ����������. ��� ���������� ��������� �� ����� ���� �� �������, �� ��������.

FormalParameters = "(" [FPSection {";" FPSection}] ")" [":" Type].

FPSection = [VAR | IN | OUT] ident {"," ident} ":" Type.

����� f � ���������� ��������, � ����� a � ��������������� ����������� ��������. ���� f � �������� ������, �� a ������ ���� ��������� �� �������� [array compatible] � f, � ����� f ������� �� a. � ��������� ������ a ������ ���� ��������� �� ���������� [parameter compatible] c f (��. ���������� A).

������� �������� ��������:

PROCEDURE ReadInt (OUT x: INTEGER);
VAR i: INTEGER; ch: CHAR;
BEGIN
i := 0; Read(ch);
WHILE ("0" <= ch) & (ch <= "9") DO
i := 10 * i + (ORD(ch) - ORD("0")); Read(ch)
END;
x := i
END ReadInt

PROCEDURE WriteInt (x: INTEGER); (* 0 <= x < 100000 *)
VAR i: INTEGER; buf: ARRAY 5 OF INTEGER;
BEGIN
i := 0;
REPEAT buf[i] := x MOD 10; x := x DIV 10; INC(i) UNTIL x = 0;
REPEAT DEC(i); Write(CHR(buf[i] + ORD("0"))) UNTIL i = 0
END WriteInt

PROCEDURE WriteString (IN s: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
i := 0; WHILE (i < LEN(s)) & (s[i] # 0X) DO Write(s[i]); INC(i) END
END WriteString

PROCEDURE Log2 (x: INTEGER): INTEGER;
VAR y: INTEGER; (* assume x > 0 *)
BEGIN
y := 0; WHILE x > 1 DO x := x DIV 2; INC(y) END;
RETURN y
END Log2

PROCEDURE Modify (VAR n: Node);
BEGIN
INC(n.key)
END Modify

10.2 ������

���������, ��������� ��������� <�.�. �� ������ ������, � �� � ����������, ��������� � ������>, ����� ���� ������� � �����-���� ����� �������, ��������� � ��� �� ������. ����� ��������� �������� �������� [methods], ���������� � ������ ����� �������. ����� ���������� ����������� �������� ���� ������������ ��������� � ��������� �������� ���������. ���������� �������� ����� ���� VAR ��� IN ���������� ���� T ��� ����������-��������� ���� POINTER TO T, ��� T � ��� �������. ����� ������ � ����� T � ��������� � ��� ���������.

ProcedureHeading = PROCEDURE [Receiver] IdentDef [FormalParameters] MethAttributes.

Receiver = "(" [VAR | IN] ident ":" ident ")".

MethAttributes = ["," NEW] ["," (ABSTRACT | EMPTY | EXTENSIBLE)].

���� ����� M ������ � ����� T0, �� ����� ������ ������ � ����� �������� T1 ���� T0. ������ ���� ����� M' (� ��� �� ������, ��� � � M) ������ ��� ��������� � T1, �� ���������� ������ � T1 ������ M. M' ��������� ���������������� M ��� T1. ������ ���������� ���������� M � M' ������ ��������������� [match], ����� �������, ����� M � ���������-�������, ������������ ������������ ���. � ��������� ������ ��� ���������� ������� M' ������ ���� ����������� ���� ���������� M (��������������) (��. ���������� A). ���� M � T1 �������������� (��. ��. 4), �� M' ���� ������ ����������������.

���� M �� ��������������, �� M' ���� �� ������ ����������������. ���� M � M' ��������������, �� ����� �������� ������ ���� �����������.

��� ����������� � ���������������� ��������������� ������������� ������ ������������ ��������� ��������:

NEW, ABSTRACT, EMPTY � EXTENSIBLE

� ��������������: �����, �����������, ������ � ����������������.

���������� ������������ ������� NEW ��� ���� ����� �������� �������, � ��� ������ ������������ ��� ���������������� �������. ���� ������� �������� ���������� ����������������� � ������������ �������, ��������� � ����� � ��� ���������; ����� ����������������� ����� ���������� ��� ��������������� �������.

�������� ����������� � ������ ������� ������� ������ �� ��������� ���������. ����������� ������ �� ����� ����������. ��� �������, ���������� ����������� �����, ������ ���� �����������. �����, ���������������� ����������� �������, ������ ���� �����������. ����������� ����� ��������������� ���� ������ ������ ����������������. ����� ������� ������ �� ����� �������� �������. ������ ������ �� ����� ���� �����������-��������� � �� ����� ����� OUT ����������. ��� �������, ���������� ����� ������ ������, ������ ���� ���������������� ��� �����������. �����, ���������������� ������ �������, ������ ���� ������ ��� �����������. ����������� ��� ������ ������ ���������� ���� ������ ���������������� (�����������) � ��� ��������. ��� �� ������ ���������� �����-��������. ���������� (�� �����������) ��� �������, ���������� �������� ������������ ����, ������ ����������� ��� ����������� ������ ������ ����-������.

���������� ������ (������� ����������� ����) ������ ���� ���� �����������������, ���� ��������� [final] (�.�. ���������� ��� ���������). �������� ����� �� ����� ���������������� � �������� ������ ����. ��� �������, ���������� ���������������� ������ ������ ���� ���������������� ��� �����������.

���� v � ��������� ���, � M � �����, �� v.M ���������� ����� M, ��������� � ������������ ����� v. �������, ��� ����� ����� ����� ���������� �� ������������ ������, ���������� �� ����������� ����� ���������� v. v ���������� ������������ ��������� ������ M' �� �������� �������� ����������, ��������� � 10.1.

���� r � ����������� ��������, ��������� ��� ������� ��� T, �� r.M^ �������� ����� M, ��������� � �����-������� ���� T (�����-�����). � ����������� � ����������� ��������� ������ ����������� ��������� ������ ���� ��������������� �����. ������ ���������� ���������� ����� �������� ������ ��������������� (���������� A), � ����� ��������������� ���������� ������ ���� �����.

������, ���������� �������� " - ", ��������� ����������������� ������ ��� ����������. ����� ����� ����� ���� ������������� � ����� ������������� ������, �� ����� ���������� ������ � ������, ���������� �������� ������. (� ��������� ����� ���������� ��������� �����-������ �������, ���������������� ������ ��� ����������, ��� �� ������������� ������. ��� ����������� �������� ��� ���������� �������� ��������.)

�������:

PROCEDURE (t: Tree) Insert (node: Tree), NEW, EXTENSIBLE;
VAR p, father: Tree;
BEGIN p := t;
REPEAT father := p;
IF node.key = p.key THEN RETURN END;
IF node.key < p.key THEN p := p.left ELSE p := p.right END
UNTIL p = NIL;
IF node.key < father.key THEN
father.left := node
ELSE
father.right := node
END;
node.left := NIL; node.right := NIL
END Insert

PROCEDURE (t: CenterTree) Insert (node: Tree); (* redefinition *)
BEGIN
WriteInt(node(CenterTree).width);
t.Insert^ (node) (* calls the Insert method of Tree *)
END Insert

PROCEDURE (obj: Object) Draw (w: Window), NEW, ABSTRACT

PROCEDURE (obj: Object) Notify (e: Event), NEW, EMPTY

10.3 ���������������� [predeclared] ���������

��������� ������� ���� ������ ���������������� ��������. ��������� ��������� �������� ����������� [generic], �.�. ��� ��������� � ������ ����� ���������. v ������������ ����������, x � y � ���������, � T � ���. ������ ���������� ������ ���� ���������� ��� ����������.

���������-�������

��� ��� ���������� ��� ���������� �������
ABS(x) <= INTEGER INTEGER ���������� ��������
������������ ���,
LONGINT ��� x
ASH(x, y) x: <= INTEGER INTEGER �������������� ����� (x * 2^y)
x: LONGINT LONGINT
y: ����� ���
BITS(x) INTEGER SET {i | ODD(x DIV 2^i)}
CAP(x) �������� ��� ��� x x � ����� �� ������ Latin-1:
��������������� ������� �����
CHR(x) ����� ��� CHAR ������ � ���������� ������� x
ENTIER(x) ������������ ��� LONGINT ���������� �����, �� ������������� x
LEN(v, x) v: ������; x: ����� INTEGER ����� v � ��������� x
��������� (������ ��������� = 0)
LEN(v) ��� �������� INTEGER ������������ LEN(v, 0)
String <�������> INTEGER ����� ������� (�� ������ 0X)
LONG(x) BYTE SHORTINT ���������
SHORTINT INTEGER
INTEGER LONGINT
SHORTREAL REAL
SHORTCHAR CHAR
Shortstring String
MAX(T) T = �������� ��� T ������������ �������� ��� ���� T
T = SET INTEGER ������������ ������� ���������
MAX(x, y) <= INTEGER INTEGER ������� �������� �� x � y
����� ��� LONGINT
<= SHORTREAL SHORTREAL
�������� ��� REAL
SHORTCHAR SHORTCHAR
�������� ��� CHAR
MIN(T) T = �������� ��� T ����������� �������� ��� ���� T
T = SET INTEGER 0
MIN(x, y) <= INTEGER INTEGER ������� �������� �� x � y
����� ��� LONGINT
<= SHORTREAL SHORTREAL
�������� ��� REAL
SHORTCHAR SHORTCHAR
�������� ��� CHAR
ODD(x) ����� ��� BOOLEAN x MOD 2 = 1
ORD(x) CHAR INTEGER ���������� ����� ������ x
SHORTCHAR SHORTINT ���������� ����� ������ x
SET INTEGER (SUM i: i IN x: 2^i)
SHORT(x) LONGINT INTEGER ���������
INTEGER SHORTINT ���������
SHORTINT BYTE ���������
REAL SHORTREAL ��������� (�������� ��������)
CHAR SHORTCHAR ��������
String Shortstring ��������
SIZE(T) ����� ��� INTEGER ���������� ����, ��������� ��� T

SIZE �� ����� ����������� � ����������� ����������, �.�. ��� �������� ������� �� ����������� ���������� �����������.

������� ���������

��� ���� ���������� �������
ASSERT(x) x: ���������� ��������� ���������� ���������, ���� �� x
ASSERT(x, n) x: ���������� ���������; ���������� ���������, ���� �� x
n: ����� ���������
DEC(v) ����� ��� v := v - 1
DEC(v, n) v, n: ����� ��� v := v - n
EXCL(v, x) v: SET; x: ����� ���, 0 <=x <= MAX(SET) v := v - {x}
HALT(n) ����� ��������� ���������� ���������
INC(v) ����� ��� v := v + 1
INC(v, n) v, n: ����� ��� v := v + n
INCL(v, x) v: SET; x: ����� ���, 0 <=x <= MAX(SET) v := v + {x}
NEW(v) ��������� �� ������ ��� ���������� v ^
������������� ������
NEW(v, x0, ..., xn) v: ��������� �� �������� ������; ���������� v ^ � ������� x0.. xn
xi: ����� ���

� ASSERT(x, n) � HALT(n) ������������� n ������������ ���������� ����������.

10.4 �����������

���������������� ����� � ������ FINALIZE ������ � ������ ����� ������� ��� ���� �� �� ��� ������ ��� ��������� � ����� ANYREC:

PROCEDURE (a: ANYPTR) FINALIZE-, NEW, EMPTY;

����� FINALIZE ����� ���� ���������� ��� ������ ������������� ����. ���� ����� ���������� � �� ������������ ����� ����� ����, ��� ������ ����� ���� (��� ���������������� �������� ����) ���� ���������� ����� ������ ��������� (�������� ���� ��������� ��������� [globally anchored]) � �� ����, ��� ������, ���������� ��� ������, ����������� ��������.

�� ������������� ����� ������ ���� ������ ��������� ��������� ������ ����� ������, � ���� ����� �� ���������� ��������, ���� ������ ����� ������ �����������. ������� ����������� ���������� ����������� �������� �� ���������.

11. ������

������ ��� ����� �������� ��������, �����, ���������� � �������� ������ � ��������� ����������� ������������������� ��� ������������ ��������� �������� ���������� <� ����� ����������� ������������������� �����������>. ������ ������������ ����� �����, ������������� ��� �����.

Module = MODULE ident ";" [ImportList] DeclarationSequence
[BEGIN StatementSequence]
[CLOSE StatementSequence] END ident ".".

ImportList = IMPORT Import {"," Import} ";".

Import = [ident ":="] ident.

������ ������� ��������� ����� ������������� �������. ���� ������ A ������������� ������� M, � A ������������ ������������� x, �� ������ M �� x ��������� ��� A.x. ���� A ������������� ��� B := A, �� �� ������ x ������� ��������� ��� B.x. ��������� ����� �������� ������������ ������� ���������� ��� ���� ������� � ����������������� ���������������. ������ �� ����� ������������� ��� ����. ��������������, ������� ����� �������������� (�.�. ������� ������ ���� ������ � �������-��������), ������ ���� ���������� ������� �������� � ��������� (��. ����� 4).

����������� ������������������, ��������� �� BEGIN, �����������, ����� ������ ����������� � ������� (�����������), ��� ����������� ����� �������� ������������� �������. �������������, ����������� ������ ������� ����������. ��������� ���������������� ��������� ����� ���� �������������� ��������, � ����� ��������� ������ ���������.

���������� ����������, ��������� � ������, ��������� ����� ����������� ���� ������. ��� �������������, ��� ��� ���������� ������������ ��� ����������� ����� ���������������� � NIL.

����������� ������������������, ��������� �� CLOSE, �����������, ����� ������ ��������� �� ������� <�.�. ����������� �� ����������� ������>.

������:

MODULE Trees; (* exports: Tree, Node, Insert, Search, Write, Init *)
IMPORT StdLog;
TYPE
Tree* = POINTER TO Node;
Node* = RECORD (* exports read-only: Node.name *)
name-: POINTER TO ARRAY OF CHAR;
left, right: Tree
END;

PROCEDURE (t: Tree) Insert* (name: ARRAY OF CHAR), NEW;
VAR p, father: Tree;
BEGIN
p := t;
REPEAT father := p;
IF name = p.name^ THEN RETURN END;
IF name < p.name^ THEN p := p.left ELSE p := p.right END
UNTIL p = NIL;
NEW(p); p.left := NIL; p.right := NIL;
NEW(p.name, LEN(name$) + 1); p.name^ := name$;
IF name < father.name^ THEN father.left := p ELSE father.right := p END
END Insert;

PROCEDURE (t: Tree) Search* (name: ARRAY OF CHAR): Tree, NEW;
VAR p: Tree;
BEGIN
p := t;
WHILE (p # NIL) & (name # p.name^) DO
IF name < p.name^ THEN p := p.left ELSE p := p.right END
END;
RETURN p
END Search;

PROCEDURE (t: Tree) Write*, NEW;
BEGIN
IF t.left # NIL THEN t.left.Write END;
StdLog.String(t.name); StdLog.Ln;
IF t.right # NIL THEN t.right.Write END
END Write;

PROCEDURE Init* (t: Tree);
BEGIN
NEW(t.name, 1); t.name[0] := 0X; t.left := NIL; t.right := NIL
END Init;

BEGIN
StdLog.String("Trees loaded"); StdLog.Ln
CLOSE
StdLog.String("Trees removed"); StdLog.Ln
END Trees.

���������� A: ����������� ��������

�������� ���� SHORTCHAR, CHAR
����� ���� BYTE, SHORTINT, INTEGER, LONGINT
������������ ���� SHORTREAL, REAL
�������� ���� ����� � ������������ ����
���� ������� ����� Shortstring, String
�������� ���� BOOLEAN, SET, �������� � �������� ����

���������� ���� [Same types]

��� ���������� a � b � ������ Ta � Tb ����� ���������� ���, ����

1. Ta � Tb ��� ���������� ����� � ��� �� ��������������� ����, ���

2. Ta ������ � �������� ���� ���� Ta = Tb, ���

3. a � b ���������� � ����� ������ ��������������� � �������� ����������, ����� ������ ��� ���������� ����������.

������������� ���� [Equal types]

��� ���� Ta � Tb ������������, ����

1. Ta � Tb ����� ���������� ���, ���

2. Ta � Tb ���� ���� �������� �������� � �������������� ������ ���������, ���

3. Ta � Tb ���� ����������� ����, ��� ������ ���������� ���������� �������������.

4. Ta � Tb ���� ������������ ���� � �������������� �������� ������.

������������ ������� ���������� ���������� [Matching formal parameter lists]

��� ������ ���������� ���������� �������������, ����

1. ��� ����� ���������� ����� ����������, �

2. ��� ����� ���� ������������� ���� ����������� �������, ���� �� ����� �������, �

3. ��������� � ��������������� �������� ����� ������������� ����, �

4. ��������� � ��������������� �������� ���� ��� ���� ���������-��������, ���� IN, OUT ��� VAR ���������.

��������� ����� [Type inclusion]

�������� � �������� ���� �������� (��������) ������� ����� ���� �� ������ � ������������ �� ���������� ����������:

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

CHAR >= SHORTCHAR

����-������� � ����-������ [Type extension]

���� ���� �������� ���� Tb = RECORD (Ta) ... END, �� Tb �������� ���������������� �������� ���� Ta, � Ta � ���������������� ������� ���� Tb. �����-���� ��� Tb �������� �������� [extension] ���� Ta (Ta �������� ������� [base type] ��� Tb), ����

1. Ta � Tb ���� ���������� ����, ���

2. Tb � ���������������� ������� ���������� ������� ���� Ta, ���

3. Ta ����� ��� ANYREC.

���� Pa = POINTER TO Ta � Pb = POINTER TO Tb, �� Pb � ������� ���� Pa (Pa � ������ ��� Pb), ���� Tb �������� �������� ���� Ta.

������������� �� ������������ [Assignment compatible]

��������� e ���� Te �������� ����������� �� ������������ � ���������� v ���� Tv, ���� ����������� ���� �� ��������� �������:

1. Te � Tv ������������ � �� �������� �� ������ �������� ��������, �� ������ �������, ������������ �������� <�.�. ���������� � ���������� ABSTRACT ��� EXTENSIBLE>;

2. Te � Tv � �������� ��� �������� ����, � Tv �������� Te;

3. Te � Tv � ������������ ����, � Te � ������� ���� Tv;

4. Tv � ������������ ��� ����������� ���, � e ���� NIL;

5. Tv � �������� ���, � e � ����������� ���������, ��� �������� ���������� � Tv;

6. Tv � ������ CHAR, Te � String ��� Shortstring, � LEN(e) < LEN(v);

7. Tv � ������ SHORTCHAR, Te � Shortstring, � LEN(e) < LEN(v);

8. Tv � ����������� ���, � e � ��� ���������, ��� ���������� ��������� ������������� ���������� Tv.

������������� �� �������� [Array compatible]

����������� �������� a ���� Ta �������� ����������� �� �������� � ���������� ���������� f ���� Tf, ����

1. Tf � Ta � ������������, ���

2. Tf � �������� ������, Ta � ������������ ������, � ���� �� ��������� ���������� �� ��������, ���

3. Tf � �������� ������ CHAR, � Ta ����� ��� String, ���

4. Tf � �������� ������ SHORTCHAR, � Ta ����� ��� Shortstring.

������������� �� ���������� [Parameter compatible]

����������� �������� a ���� Ta �������� ����������� �� ���������� � ���������� ���������� f ���� Tf, ����

1. Tf � Ta � ������������, ���

2. f � ��������-��������, � Ta � ��������� �� ������������ � Tf, ���

3. f � IN ��� VAR ��������, Tf � Ta � ���� �������, � Ta � ������� ���� Tf.

������������� �� ��������� [Expression compatible]

��� ��������� �������� ���� �� ��������� ���������� �� ���������, ���� ��� ����������� ��������, ������������� � ��������� �������. ������ ���������� ������ ���� ���������� ��� ����������. ��� T1 ������ ���� ����������� ���� T0:

�������� ������ ������� ������ ������� ��� ����������
+ - * DIV MOD <= INTEGER <= INTEGER INTEGER
����� ��� ����� ��� LONGINT
/ ����� ��� ����� ��� REAL
+ - * / <= SHORTREAL <= SHORTREAL SHORTREAL
�������� ��� �������� ��� REAL
SET SET SET
+ Shortstring Shortstring Shortstring
��� ������� ��� ������� String
OR & ~ BOOLEAN BOOLEAN BOOLEAN
= # < <= > >= �������� ��� �������� ��� BOOLEAN
�������� ��� �������� ��� BOOLEAN
��� ������� ��� ������� BOOLEAN
= # BOOLEAN BOOLEAN BOOLEAN
SET SET BOOLEAN
NIL, ������������ ��� NIL, ������������ ���
T0 ��� T1 T0 ��� T1 BOOLEAN
����������� ��� T, NIL ����������� ��� T, NIL BOOLEAN
IN ����� ��� SET BOOLEAN
IS T0 ��� T1 BOOLEAN

����������� ��������� ����������� ��� ���������� � ������������ ��������� (LONGINT ��� ����� �����, REAL ��� ������������ �����) � ��������� ���������� ��� ���������� <�.�. �������� ��������������� ����� ������������> ��������� �������� � ��� �� ���������.

���������� B: ��������� ������������� �������

Module = MODULE ident ";" [ImportList] DeclSeq [BEGIN StatementSeq] [CLOSE StatementSeq] END ident ".".

ImportList = IMPORT [ident ":="] ident {"," [ident ":="] ident} ";".

DeclSeq = { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}.

ConstDecl = IdentDef "=" ConstExpr.

TypeDecl = IdentDef "=" Type.

VarDecl = IdentList ":" Type.

ProcDecl = PROCEDURE [Receiver] IdentDef [FormalPars] MethAttributes
[";" DeclSeq [BEGIN StatementSeq] END ident].

MethAttributes = ["," NEW] ["," (ABSTRACT | EMPTY | EXTENSIBLE)].

ForwardDecl = PROCEDURE "^" [Receiver] IdentDef [FormalPars] MethAttributes.

FormalPars = "(" [FPSection {";" FPSection}] ")" [":" Type].

FPSection = [VAR | IN | OUT] ident {"," ident} ":" Type.

Receiver = "(" [VAR | IN] ident ":" ident ")".

Type = Qualident | ARRAY [ConstExpr {"," ConstExpr}] OF Type
| [ABSTRACT | EXTENSIBLE | LIMITED]
RECORD ["("Qualident")"] FieldList {";" FieldList} END
| POINTER TO Type
| PROCEDURE [FormalPars].

FieldList = [IdentList ":" Type].

StatementSeq = Statement {";" Statement}.

Statement = [ Designator ":=" Expr | Designator ["(" [ExprList] ")"]
| IF Expr THEN StatementSeq
{ELSIF Expr THEN StatementSeq}
[ELSE StatementSeq] END
| CASE Expr OF Case {"|" Case}
[ELSE StatementSeq] END
| WHILE Expr DO StatementSeq END
| REPEAT StatementSeq UNTIL Expr
| FOR ident ":=" Expr TO Expr [BY ConstExpr] DO StatementSeq END
| LOOP StatementSeq END
| WITH [ Guard DO StatementSeq ]
{"|" [ Guard DO StatementSeq ] }
[ELSE StatementSeq] END
| EXIT
| RETURN [Expr]
].

Case = [CaseLabels {"," CaseLabels} ":" StatementSeq].

CaseLabels = ConstExpr [".." ConstExpr].

Guard = Qualident ":" Qualident.

ConstExpr = Expr.

Expr = SimpleExpr [Relation SimpleExpr].

SimpleExpr = ["+" | "-"] Term {AddOp Term}.

Term = Factor {MulOp Factor}.

Factor = Designator | number | character | string | NIL | Set | "(" Expr ")" | " ~ " Factor.

Set = "{" [Element {"," Element}] "}".

Element = Expr [".." Expr].

Relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.

AddOp = "+" | "-" | OR.

MulOp = " * " | "/" | DIV | MOD | "&".

Designator = Qualident {"." ident | "[" ExprList "]" | " ^ " | "(" Qualident ")" | "(" [ExprList] ")"} [ "$" ].

ExprList = Expr {"," Expr}.

IdentList = IdentDef {"," IdentDef}.

Qualident = [ident "."] ident.

IdentDef = ident [" * " | "-"].

���������� C: ��������� �������� [domains] �������� �����

��� �������� ��������
BOOLEAN FALSE, TRUE
SHORTCHAR 0X .. 0FFX
CHAR 0X .. 0FFFFX
BYTE -128 .. 127
SHORTINT -32768 .. 32767
INTEGER -2147483648 .. 2147483647
LONGINT -9223372036854775808 .. 9223372036854775807
SHORTREAL -3.4E38 .. 3.4E38, INF (32-������ ������ IEEE)
REAL -1.8E308 .. 1.8E308, INF (64-������ ������ IEEE)
SET ������������ �� 0 .. 31

���������� D: ������������ ���������� � ����� ����������

����������� ������������� ������� ��������� �� ��� ��������������� �������������.

  1. �� ����� ���������� �������� �������� ����������, ����������� ��������� ������������ ��� �������. ��� ����� ��� ���������� �������� ����� � ������ �����.

  2. ����������� ��������� DISPOSE <������������ ������ ��� ����� �� ������������ �������>. ������ <���������� ��������> �� ����� ���� ����������� �� ����� ���������� ������������, ��������� ��� ������� �� �������� ������������, ��������� � ������� ������ [memory leaks] <������, ���������� ���������, ������������ �� ����� ����� ���������, ������� ����������� ����� ����������> � � �������� ����������� [dangling pointers] <��������� ���������, ������������ ��������� �� ������� ������, �� ������ �������������� �������������>. �� ����������� ����� ���������� ������, ��� �� ������������ ������������ ���������� �������, ��� ��� �� ����� ���������� ������ ������� � ������� �� ����� �����������, ��������� �������������� ���� ������.

  3. ������ � �� ������� ���� �� ���������������� ��������� (�������) � ���������������� ���� ������ ���� �������� �����������. ���� ����������, ��� ����� �������� �������� �������. ����������� ���������, ������������ ��� �������� ������� ��� ��� ������� � ��������� ����-����������, �� ������������ ������, �� ���������� ������ ��������� ��� ���������� ��� ��������� ����.

�� ����������� ��������� ������������ ����������, � ������� ��� ���������� �� ����� ��������� ������� ������, ��� ������� ��������� ������������ ��������� [linking loader]. ���������� ������� �������� ������� ��������� ����������, ������� ����� ���� ��������� ����������.

����������, ������� �� ������������� ���� ����������� � ����������� � ����� ����������, �� ��������� ��������������� ����������� ������������� �������.