The Programming Language Oberon-2/hy

From vishap oberon compiler
Jump to navigation Jump to search

Deutsch (de) | English (en) | հայերեն (hy)

Oberon-2 ծրագրավորման լեզուն

Hanspeter Mössenböck, Niklaus Wirth

Ներածություն

Oberon-2-ը Pascal և Modula-2 լեզուների ավանդույթները շարունակող ընդհանուր օգտագործման ծրագրավորման լեզու է։ Նրա ամենակարևոր հատկություններն են բլոկային կառուցվածքը, մոդուլյարությունը, առանձնացված կոմպիլյացիան, տիպերի խիստ ստուգմամբ ստատիկ տիպիզացումը (նաև մոդուլների միջև կապերում) և տիպերի ընդլայնումը type-bound պրոցեդուրաներով։

Տիպի ընդլայնման հնարավորությամբ Oberon-2 լեզուն դառնում է օբյեկտներին կողմնորոշված լեզու։ Օբյեկտը աբստրակտ տիպի փոփոխական է, որ բաղկացած է սեփական (private) տվյալներից, որ ներկայացնում են օբյեկտի վիճակը, և պրոցեդուրաներից, որոնք աշխատում են օբյեկտի տվյալների հետ։ Աբստրակտ տվյալների տիպերը հայտարարվում են որպես ընդլայնվող գրառումներ (record): Oberon-2 լեզուն իմպերատիվ լեզուների սովորական տերմիններով ծածկում է օբյեկտներին կողմնորոշված լեզուների տերմինների բառարանը, դրանով նվազագույնի հասցնելով նման սկզբունքների համար օգտագործվող հասկացությունները։

Այս նկարագրությունը նախատեսված չէ որպես ծրագրավորման ձեռնարկ։ Այն հատուկ ստեղծված է համառոտ։ Սրա նպատակն է ուղեցույց ծառայել ծրագրավորողների, լեզուն իրականացնողների և ձեռնարկներ գրողների համար։ Եթե ինչ-որ բան ասված չէ, ապա դա արված է գիտակցաբար. քանի որ այն կա՛մ հետևում է լեզվի այլ կանոններից, կա՛մ դրա սահմանումը նպատակահարմար չէ գտված։

A հավելվածում սահմանված են մի քանի դրույթներ, որոնք օգտագործվում են Oberon-2 լեզվի տիպերի ստուգման կանոնները մեկնաբանելիս։ Այդ դրույթների հատուկ իմաստն ընդգծելու համար դրանք տեքստում բերված են շեղատառով (օրինակ, ինչ-որ տիպ)։

Քերականություն

Oberon-2 քերականությունը նկարագրելու համար օգտագործված է Բեկուսի-Նաուրի ընդլայնված գրառումը (EBNF)։ Տարբերակներն իրարից բաժանված են | նիշով։ [ և ] փոկագծերով նշված է նրանցում պարփակված արտահայտության ոչ պարտադիր լինելը, իսկ { և } փակագծերով նշված է փարփակված արտահայտության կրկնությունը՝ միգուցե 0 անգամ։ Քերականության ոչ տերմինալային սիմվոլները սկսվում են մեծատառով (օր. Statement): Տերմինալային սիմվոլները կա՛մ սկսվում են փոքրատառով (օր. ident), կա՛մ բաղկացած են միայն մեծատառերից (օր. BEGIN), կա՛մ վերցրած են չակերտների մեջ (օր. ":=")։

Բառապաշար և ներկայացման եղանակ

Տերմինալային սիմվոլների նիշային ներկայացման համար օգտագործված են ASCII նիշերը։ Սիմվոլներ են իդենտիֆիկատորները, թվերը, տողերը, օպերատորները և բաժանիչները։ Պետք է պահպանել հետևյալ լեքսիկական կանոնները. բացատանիշերն ու նոր տողի անցման սիմվոլները չեն կարող հանդիպել սիմվոլների մեջ (բացի մեկնաբանություններից և տողերց)։ Դրանք անտեսվում են, եթե միայն անհրաժեշտ չեն երկու հարևան սիմվոլերը բաժանելու համար։ Մեծատառերն ու փոքրատառերը տարբերվում են։

Իդենտիֆիկատորները տառերի և թվանշանների հաջորդականություն են։ Առաջին նիշը պետք է տառ լինի։

ident = letter {letter | digit}.

Օրինակ. x Scan Oberon2 GetSymbol firstLetter

Թվերը (առանց նշանի) ամբողջաթիվ կամ իրական հաստատուններ են։ Ամբողջաթիվ հաստատունի տիպ է համարվում այն ամենափոքր տիպը, որին պատկանում է հաստատունի արժեքը։ Եթե հաստատունի գրառումն ավարտվում է H նիշով, ապա դա տասնվեցական ներկայացում է, մյուս դեպքերում՝ տասական։

Իրական թիվը պարտադիր պարունակում է տասական կետը։ Այն կարող է նաև պարունակել տասի աստիճանի գործակիցը։ E (կամ D) տառը նշանակում է «...բազմապատկած 10-ի ... աստիճանով»։ Իրական թվի տիպը REAL-ն է, եթե նրա ներկայացումը չի պարունակում D տառը, հակառակ դեպքում տիպը LONGREAL-ն է։

number = integer | real'.
integer = digit{digit} "." {digit} [ScaleFactor].
ScaleFactor = ("E"|"D") ["+"|"-"] digit{digit}.
hexDigit = digit | "A" | "B" | "C" | "D" | "E" | "F".
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".

Օրինակներ.

1991 INTEGER 1991 
0DH SHORTINT 13 
12.3 REAL 12.3 
4.567E8 REAL 456700000 
0.57712566D-6 LONGREAL 0.0000057712566

Նիշային հաստատուններըներկայացվում են համապատասխան նիշի տասնվեցական կարգաթվով, որն ավարտվում է X նիշով։

character = digit{hexDigit}"X".

Տողերը (string) նիշերի հաջորդականություններ են՝ պարփակված ' և " չակերտների միջև։ Տողը սկսող չակերտը պետք է համընկնի տողն ավարտողի հետ և չպետք է հանդիպի տողի մեջ։ Տողի նիշերի քանակը համարվում է նրա երկարությունը (length): 1 երկարությամբ տողը կարող է օգտագործվել բոլոր այն տեղերում, որտեղ թույլատրված է նիշի (character) օգտագործումը (թույլատրելի է նաև հակառակը)։

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

Օրինակներ.

"Oberon-2"
"Don't worry!"
"x"

Օպերատորները և բաժանիչները ստորև թվարկված նիշերը, նիշերի զույգերը կամ ծառայողական բառերն են։ Ծառայողական բառերը կազմված են միմիայն մեծատառերից և չեն կարող օգտագործվել որպես իդենտիֆիկատորներ։

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

Մեկնաբանությունները ծրագրում կարող են հանդիպել որևէ երկու սիմվոլների միջև։ Դրանք կամայական նիշերի հաջորդականություններ են, որոնք սկսվում են (* նիշերով և ավարտվում են *) նիշերով։ Մեկնաբանությունները կարող են լինել ներդրված։ Դրանք ծրագրի իմաստի վրա ոչ մի ազդեցություն չեն թողնում։

Հայտարարություններ և տեսանելիության տիրույթներ

Ամեն մի իդենտիֆիկատոր, եթե միայն այն նախապես սահմանված չէ, ծրագրում պետք է ներմուծվի հայտարարության միջոցով։ Հայտարարությունը նույնպես օբյեկտի համար սահմանում է որոշ պարապետրերի անփոփոխ արժեքներ, թե արդյո՞ք այն հաստատուն է, տիպ է, փոփոխական կամ պրոցեդուրա։ Այնուհետև իդենտիֆիկատորն օգտագործվում է համապատասխան օբյեկտին հղում կատարելու համար։

x օբյեկտի տեսանելիության տիրույթը (scope) տարածվում է նրա հայտարարման կետից մինչև այն բլոկի (մոդուլ - module, պրոցեդուրա - procedure կամ գրառում - record) վերջը, որին պատկանում է հայտարարությունը։ Այդ բլոկի համար օբյեկտը լոկալ է։ Այսպիսով բաժանվում են ներդրված բլոկներում հայտարարված նույնանուն օբյեկտների տեսանելիության տիրույթները։ Տեսանելիության տիրույթների տարածման կանոնները հետևյան են.

Տվյալ տեսանելիության տիրույթում նույն իդենտիֆիկատորը չի կարող որոշել մեկից ավելի օբյեկտներ (այսինքն, բլոկում իդենտիֆիկատորը չի կարող հայտարավել մեկից ավելի անգամներ)։

Օբյեկտին կարելի է հղում կատարել միայն իր տեսանելիության տիրույթում։

POINTER TO T1 (տես 6.4) տեսքի T տիպը կարելի է հայտարարել այնպիսի տեղում, որտեղ T1-ը դեռ սահմանված չէ։ T1-ի հայտարարությունը պետք է լինի նույն բլոկում, որի համար T-ն լոկալ է։

Գրառման (record) դաշտ (field) (տես 6.3) կամ տիպի հետ կապված (type-bound) պրոցեդուրա (տես 10.2) որոշող իդենտիֆիկատորները կարող են օգտագործվել միայն գրառումների նշանակումներում։ ????

Մոդուլի բլոկում հայտարարված իդենտիֆիկատորի նշանակումը կարող է ավարտվել * կամ - նիշերով, որոնք ցույց են տալիս, որ տվյալ իդենտիֆիկատորը մատչելի է արտաքին միջավայրին (exported)։ M մոդուլից մատչելի սիմվոլները կարող են օգտագործվել այլ մոդուլներում, եթե վերջիններս ներմուծում (import) են M մոդուլը (տես 11-րդ գլուխը)։ Ներմուծող մոդուլում իդենտիֆիկատորը գրառվում է M.x և կոչվում է ճշտված իդենտիֆիկատոր (qualified identifier)։ Իրենց հայտարարության մեջ - նիշով նշված իդենտիֆիկատորները նախատեսված են միայն կարդալու (read-only) համար։

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

Հետևյալ իդենտիֆիկատորները նախապես սահմանված են։ Դրանց նշանակությունը մեկնաբանված է նշված բաժիններում.

ABS (10.3) LEN (10.3) ASH (10.3) LONG (10.3) BOOLEAN (6.1) LONGINT (6.1) CAP (10.3) LONGREAL (6.1) CHAR (6.1) MAX (10.3) CHR (10.3) MIN (10.3) COPY (10.3) NEW (10.3) DEC (10.3) ODD (10.3) ENTIER (10.3) ORD (10.3) EXCL (10.3) REAL (6.1) FALSE (6.1) SET (6.1) HALT (10.3) SHORT (10.3) INC (10.3) SHORTINT (6.1) INCL (10.3) SIZE (10.3) INTEGER (6.1) TRUE (6.1)

Հաստատունների հայտարարությունը

Հաստատունի հայտարարությունը իդենտիֆիկատորին համապատասխանեցնում է հաստատուն արժեք։

ConstantDeclaration = IdentDef "=" ConstExpression.
ConstExpression = Expression.

Հաստատուն արտահայտությունը (constant expression) այնպիսի արտահայտություն է, որը կարելի է հաշվարկել նրա տեքստի ընթերցման ժամանակ՝ առանց ծրագիրը կատարելու։ Դրա օպերանդները հաստատուններ են կամ նախապես սահմանված ֆունկցիաներ, որոնց արժեքը կարելի է հաշվել կոմպիլյացիայի ժամանակ։ Հետևյալները հաստատունների հայտարարման օրինակներ են․

N = 100
limit = 2 * N - 1
fullSet = {MIN(SET)..MAX(SET)}

Տիպերի հայտարարությունը

Տվյալի տիպը որոշում է այն արժեքների բազմությունը, որը կարող է ընդունել դիտարկվող տիպի փոփոխականը, և այն գործողությունները, որ կիրառելի են տվյալ տիպին։ Տիպի հայտարարությունը իդենտիֆիկատորին համապատասխանեցնում է տիպ։ Բաղադրյալ տիպերի դեպքում տիպի հայտարարությամբ որոշվում է նաև փոփոխականի կառուցվածքը։ Բաղադրյալ տիպը չի կարող պարունակել ինքն իրեն։

TypeDeclaration = IdentDef "=" Type.
Type = Qualident | ArrayType | RecordType | PointerType | ProcedureType.

Օրինակներ․

Table = ARRAY N OF REAL
Tree = POINTER TO Node
Node = RECORD
  key: INTEGER;
  left, right: Tree
END
CenterTree = POINTER TO CenterNode
CenterNode = RECORD (Node)
  width: INTEGER;
  subnode: Tree
END
Function = PROCEDURE(x: INTEGER): INTEGER

Բազային տիպեր

Բազային տիպերը նշանակվում են նախապես սահմանված իդենտիֆիկատորներով։ Համապատասխան գործողությունները սահմանված են 8.2-ում, իսկ նախապես սահմանված ֆունկցիաները՝ 10.3-ում։ Բազային տիպերի սահմանված արժեքները հետևյալն են․

  1. BOOLEAN -- TRUE և FALSE տրամաբանական արժեքները,
  2. CHAR -- ASCII ընդլայնված աղյուսակի նիշերը (0X .. 0FFX),
  3. SHORTINT -- MIN(SHORTINT) և MAX(SHORTINT) միջակայքի ամբողջ թվերը,
  4. INTEGER -- MIN(INTEGER) և MAX(INTEGER) միջակայքի ամբողջ թվերը,
  5. LONGINT -- MIN(LONGINT) և MAX(LONGINT) միջակայքի ամբողջ թվերը,
  6. REAL -- MIN(REAL) և MAX(REAL) միջակայքի իրական թվերը,
  7. LONGREAL -- MIN(LONGREAL) և MAX(LONGREAL) միջակայքի իրական թվերը,
  8. SET -- 0 և MAX(SET) միջակայքի ամբողջ թվերի բազմությունները։

3-ից 5-րդ տիպերը ամբողջ թվերի տիպեր են, 6-րդը և 7-րդը իրական թվերի տիպերն են, և դրանք բոլորը միասին կոչվում են թվային տիպեր. Թվային տիպերը կազմում են հիերարխիա․ ավելի մեծ տիպը ընդգրկում է ավելի փոքր տիպի արժեքները․

LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINT

Զանգվածներ

Զանգվածը մի կառուցվածք է, որը բաղկացած է նույն տիպն ունեցող ֆիքսված քանակով տարրերից։ Տարրերի քանակը կոչվում է զանգվածի երկարություն (չափ)։ Զանգվածի տարրերը հասանելի են 0-ից մինչև երկարությունից մեկով պակաս արժեքներ ունեցող ինդեքսներով։

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

ARRAY L0, L1, ..., Ln OF T տեսքով հայտարարված տիպը պետք է հասկանալ որպես ARRAY L0 OF ARRAY L1 OF ... ARRAY Ln OF T տիպի համառոտ գրառում։

Առանց չափի հայտարարված զանգվածները կոչվում են բաց զանգվածներ։ ...

ARRAY 10, N OF INTEGER
ARRAY OF CHAR

Գրառումներ

Ցուցիչներ

Պրոցեդուրաներ

Փոփոխականների հայտարարությունը