|
@@ -34,7 +34,6 @@
|
|
|
- [8.2.3 Отношения](#823-отношения)
|
|
- [8.2.3 Отношения](#823-отношения)
|
|
|
- [9. Предписания](#9-предписания)
|
|
- [9. Предписания](#9-предписания)
|
|
|
- [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
|
|
- [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
|
|
|
- - [](#)
|
|
|
|
|
- [9.3 Последовательность предписаний](#93-последовательность-предписаний)
|
|
- [9.3 Последовательность предписаний](#93-последовательность-предписаний)
|
|
|
- [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
|
|
- [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
|
|
|
- [9.5 Предписание\_ВЫБОР](#95-предписание_выбор)
|
|
- [9.5 Предписание\_ВЫБОР](#95-предписание_выбор)
|
|
@@ -44,40 +43,49 @@
|
|
|
- [10.1 Формальные параметры](#101-формальные-параметры)
|
|
- [10.1 Формальные параметры](#101-формальные-параметры)
|
|
|
- [10.2. Встроенные функции](#102-встроенные-функции)
|
|
- [10.2. Встроенные функции](#102-встроенные-функции)
|
|
|
- [11. Модули](#11--модули)
|
|
- [11. Модули](#11--модули)
|
|
|
- - [11.1 Модуль SYSTEM](#111-модуль-system)
|
|
|
|
|
|
|
+ - [11.1 Модуль СИСТЕМА](#111-модуль-система)
|
|
|
- [Ссылки](#ссылки)
|
|
- [Ссылки](#ссылки)
|
|
|
|
|
|
|
|
## 0. Введение
|
|
## 0. Введение
|
|
|
|
|
|
|
|
-Идея создания языка **Oberon-Deft** (Оберон умелый) родилась после переосмысления идей несоответствия современного ИТ и средств разработки. [Никлаус Вирт](https://ru.wikipedia.org/wiki/Вирт,_Никлаус) продвинулся в этом отношении дальше всех. И львиная доля идей в концепции **Oberon-Deft** является либо прямой трансляцией этих идей, либо непосредственно развивают их.
|
|
|
|
|
|
|
+Идея создания языка **Оберон-У** (*Оберон-Умелый*, *Oberon-Deft*; далее просто **Оберон**) родилась после переосмысления идей несоответствия современного ИТ и средств разработки. [Никлаус Вирт](https://ru.wikipedia.org/wiki/Вирт,_Никлаус) продвинулся в этом отношении дальше всех. И львиная доля идей в концепции **Оберон** является либо прямой трансляцией этих идей, либо непосредственно развивают их.
|
|
|
|
|
|
|
|
-**Oberon-Deft** — язык программирования общего назначения, который является развитием **Модулы-2** и модификацией **Оберон-7**.
|
|
|
|
|
|
|
+**Оберон** — язык программирования общего назначения, который является развитием **Модулы-2** и модификацией **Оберон-7**.
|
|
|
|
|
|
|
|
Данная вариация по большей части не имеет принципиально новых концепций, новые части отдельно описаны в соответствующих разделах. Концепция позволяет максимально изолировать высокоуровневые средства от низкоуровневых.
|
|
Данная вариация по большей части не имеет принципиально новых концепций, новые части отдельно описаны в соответствующих разделах. Концепция позволяет максимально изолировать высокоуровневые средства от низкоуровневых.
|
|
|
|
|
|
|
|
Назначение этого документа в том, чтобы служить эталоном для программистов, разработчиков и авторов руководств. Если о чём-то не сказано, то обычно это ошибка.
|
|
Назначение этого документа в том, чтобы служить эталоном для программистов, разработчиков и авторов руководств. Если о чём-то не сказано, то обычно это ошибка.
|
|
|
|
|
+
|
|
|
Этот документ описывает язык как достаточный для реализации различного рода ПО: начиная от загрузчиков ОС, сами ОС системное и прикладное ПО.
|
|
Этот документ описывает язык как достаточный для реализации различного рода ПО: начиная от загрузчиков ОС, сами ОС системное и прикладное ПО.
|
|
|
|
|
|
|
|
## 1. Синтаксис
|
|
## 1. Синтаксис
|
|
|
|
|
|
|
|
-Законченный текст на языке программирования **Oberon-Deft** называется *программа*.
|
|
|
|
|
|
|
+Законченный текст на языке программирования **Оберон** называется *программа*.
|
|
|
|
|
|
|
|
`Программа` включает как минимум один *модуль*. В `программе` как правило `модулей` как правило больше одного, количество модулей в программе не ограничено. Каждый модуль должен обладать правильной структурой:
|
|
`Программа` включает как минимум один *модуль*. В `программе` как правило `модулей` как правило больше одного, количество модулей в программе не ограничено. Каждый модуль должен обладать правильной структурой:
|
|
|
|
|
|
|
|
|
|
+`Модуль` имеет строго заданную структуру:
|
|
|
|
|
+
|
|
|
```bash
|
|
```bash
|
|
|
-МОДУЛЬ Старт;
|
|
|
|
|
|
|
+МОДУЛЬ Старт
|
|
|
|
|
+
|
|
|
|
|
+// Импорт, Типы, Переменные, Функции
|
|
|
|
|
|
|
|
-КОНЕЦ Старт.
|
|
|
|
|
|
|
+{
|
|
|
|
|
+ // Выражения при загрузке модуля
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-`Модуль` может содержать бесконечное множество правильно сформированных `предложений`, в соответствии с синтаксисом языка. Набор предложений **Oberon-Deft** ограничивается *модулем*. Каждое предложение представляет собой конечную последовательность *символов* из *конечного словаря*. Словарь **Oberon-Deft** состоит из `сущностей`:
|
|
|
|
|
|
|
+До начала модуля и после окончания модуля может быть любой текст.
|
|
|
|
|
+
|
|
|
|
|
+`Модуль` может содержать бесконечное множество правильно сформированных `предложений`, в соответствии с синтаксисом языка. Набор предложений **Оберон** ограничивается объявлением модуля. Каждое предложение представляет собой конечную последовательность *символов* из *конечного словаря*. Словарь **Оберон** состоит из `сущностей`:
|
|
|
|
|
|
|
|
- *пользовательский символ*;
|
|
- *пользовательский символ*;
|
|
|
- *встроенный символ*;
|
|
- *встроенный символ*;
|
|
|
|
|
|
|
|
Все эти `сущности` входят в группу `дерево символов` и состоят из `литер`. (Обратите внимание на разницу между `символами` и `литерами`). `Дерево символов` кроме самих `сущностей` содержит связи `сущностей` и все их необходимые `атрибуты`. `Листья` дерева не могут видеть другие `листья`, находящиеся ниже по веткам или в соседних ветках. Также есть ряд отдельных случаев описанных ниже.
|
|
Все эти `сущности` входят в группу `дерево символов` и состоят из `литер`. (Обратите внимание на разницу между `символами` и `литерами`). `Дерево символов` кроме самих `сущностей` содержит связи `сущностей` и все их необходимые `атрибуты`. `Листья` дерева не могут видеть другие `листья`, находящиеся ниже по веткам или в соседних ветках. Также есть ряд отдельных случаев описанных ниже.
|
|
|
|
|
|
|
|
-Для описания синтаксиса используются вариант расширенной формы Бэкуса — Наура (`РБНФ`). Квадратные скобки `[` и `]` означают необязательность записанного внутри них выражения, а фигурные скобки `{` и `}` означают его повторение (возможно 0 раз).
|
|
|
|
|
|
|
+Для описания синтаксиса используются вариант расширенной формы Бэкуса — Наура (`РБНФ`). Литера вопроса `?` означают необязательность записанного внутри них выражения, а двоеточие `..` означают его повторение (возможно 0 раз).
|
|
|
|
|
|
|
|
Синтаксические сущности (`символы`) обозначаются русскими словами (английскими эквивалентами), выражающими их функциональное назначение. `Символы` могут быть на любом языке, ограничений нет. `Символы` словаря языка программирования обозначаются литеральными строками, заключенными в кавычки или литерами.
|
|
Синтаксические сущности (`символы`) обозначаются русскими словами (английскими эквивалентами), выражающими их функциональное назначение. `Символы` могут быть на любом языке, ограничений нет. `Символы` словаря языка программирования обозначаются литеральными строками, заключенными в кавычки или литерами.
|
|
|
|
|
|
|
@@ -88,10 +96,11 @@
|
|
|
- `буква`;
|
|
- `буква`;
|
|
|
- `цифра`;
|
|
- `цифра`;
|
|
|
|
|
|
|
|
-Для составления `символов` предусматривается использование следующих правил. `Пробелы` и `переносы строк` не должны встречаться внутри `символов` (исключая `комментарии`). Они игнорируются, если они не существенны для отделения двух последовательных `символов`. Заглавные и строчные буквы считаются различными.
|
|
|
|
|
|
|
+Для составления `пользовательских символов` предусматривается использование следующих правил. `Пробелы` и `переносы строк` не должны встречаться внутри `пользовательских символов` (исключая `комментарии`). Они игнорируются, если они не существенны для отделения двух последовательных `символов`. Заглавные и строчные буквы считаются различными.
|
|
|
|
|
+
|
|
|
`Имена` — тип сущностей в виде последовательности `букв` и `цифр`. Первая `литера` *должна* быть `буквой`.
|
|
`Имена` — тип сущностей в виде последовательности `букв` и `цифр`. Первая `литера` *должна* быть `буквой`.
|
|
|
|
|
|
|
|
-> имя = буква {буква | цифра}.
|
|
|
|
|
|
|
+> имя = буква + (буква?.. | цифра?..);
|
|
|
|
|
|
|
|
Примеры:
|
|
Примеры:
|
|
|
|
|
|
|
@@ -107,12 +116,12 @@
|
|
|
`Дробное число` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени».
|
|
`Дробное число` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени».
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
|
|
|
|
|
-шестнЦифра = цифра | "A" | "B" | "C" | "D" | "E" | "F".
|
|
|
|
|
|
|
+цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
|
|
|
+шестнЦифра = цифра | "A" | "B" | "C" | "D" | "E" | "F";
|
|
|
|
|
|
|
|
-целое = {знак} цифра {цифра} | цифра {шестнЦифра} "H".
|
|
|
|
|
-дробное = {знак} цифра {цифра} "." {цифра} [Порядок].
|
|
|
|
|
-Порядок = ("E") ["+" | "-"] цифра {цифра}.
|
|
|
|
|
|
|
+целое = знак? цифра | цифра..? шестнЦифра? + H?;
|
|
|
|
|
+дробное = знак}? + цифра | цифра..? + "." + цифра Порядок?;
|
|
|
|
|
+Порядок = "E" ("+" | "-")? цифра | цифра..?;
|
|
|
|
|
|
|
|
число = целое | дробное.
|
|
число = целое | дробное.
|
|
|
```
|
|
```
|
|
@@ -129,7 +138,7 @@
|
|
|
Число литер в литерале называется длиной строкового литерала.
|
|
Число литер в литерале называется длиной строкового литерала.
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-строка = " {литера} " | цифра {шестнЦифра} "X".
|
|
|
|
|
|
|
+строка = литера..? | цифра? шестнЦифра? + "X"?;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Примеры:
|
|
Примеры:
|
|
@@ -281,8 +290,8 @@ flowchart TD
|
|
|
|
|
|
|
|
`Имя` символа предваряется другим именем (префиксом), показывающим его модуль (см. Гл 11). Префикс и имя разделены точкой и вместе называются `уточнённым именем` (или `квалифицированным именем`).
|
|
`Имя` символа предваряется другим именем (префиксом), показывающим его модуль (см. Гл 11). Префикс и имя разделены точкой и вместе называются `уточнённым именем` (или `квалифицированным именем`).
|
|
|
|
|
|
|
|
-> ИмяКвал = [имя "."] имя.
|
|
|
|
|
-> ИмяЭкспорт = имя ["*"].
|
|
|
|
|
|
|
+> ИмяКвал = имя + "." + имя;
|
|
|
|
|
+> ИмяЭкспорт = имя + "*";
|
|
|
|
|
|
|
|
Следующие имена являются стандартными (группа `ключевые символы`); их значение определено ниже:
|
|
Следующие имена являются стандартными (группа `ключевые символы`); их значение определено ниже:
|
|
|
|
|
|
|
@@ -292,7 +301,7 @@ flowchart TD
|
|
|
> БАЙТ
|
|
> БАЙТ
|
|
|
> EXCL
|
|
> EXCL
|
|
|
> FLT
|
|
> FLT
|
|
|
-> `ЦЕЛОЕ`
|
|
|
|
|
|
|
+> ЦЕЛОЕ
|
|
|
> LSL
|
|
> LSL
|
|
|
> НОВ
|
|
> НОВ
|
|
|
> ODD
|
|
> ODD
|
|
@@ -307,16 +316,18 @@ flowchart TD
|
|
|
|
|
|
|
|
Объявление константы связывает её `имя` с её значением.
|
|
Объявление константы связывает её `имя` с её значением.
|
|
|
|
|
|
|
|
-> КонстантноеВыражение = Выражение.
|
|
|
|
|
-> ОбъявлениеКонстанты = ИмяОпр "=" КонстантноеВыражение.
|
|
|
|
|
|
|
+> КонстантноеВыражение = Выражение;
|
|
|
|
|
+> ОбъявлениеКонстанты = ИмяОпр "=" КонстантноеВыражение;
|
|
|
|
|
|
|
|
Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы. Примеры объявлений констант:
|
|
Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы. Примеры объявлений констант:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-КОНСТ число = 100;
|
|
|
|
|
-КОНСТ лимит = 2*число - 1;
|
|
|
|
|
-КОНСТ словаВсе = [0 .. словаРазмер -1];
|
|
|
|
|
-КОНСТ имя = "Oberon";
|
|
|
|
|
|
|
+КОНСТ {
|
|
|
|
|
+ число = 100,
|
|
|
|
|
+ лимит = 2 * число - 1,
|
|
|
|
|
+ словаВсе = [0 .. словаРазмер -1],
|
|
|
|
|
+ имя = "Oberon",
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## 6. Объявление типов
|
|
## 6. Объявление типов
|
|
@@ -341,18 +352,23 @@ flowchart TD
|
|
|
Примеры:
|
|
Примеры:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-ТИП Таблица = МАССИВ[255]ВЕЩ;
|
|
|
|
|
-ТИП Дерево = Узел;
|
|
|
|
|
-ТИП Узел {
|
|
|
|
|
- ключ: ЦЕЛОЕ,
|
|
|
|
|
- Левый, Правый: Дерево,
|
|
|
|
|
-}
|
|
|
|
|
-ТИП ДеревоСередина = @УзелСередина;
|
|
|
|
|
-ТИП УзелСередина (Узел){
|
|
|
|
|
- Имя: МАССИВ[32]БАЙТ,
|
|
|
|
|
- Подузел: Дерево,
|
|
|
|
|
|
|
+ТИП {
|
|
|
|
|
+ Таблица = МАССИВ[255]ВЕЩ,
|
|
|
|
|
+ Дерево = Узел,
|
|
|
|
|
+
|
|
|
|
|
+ СТРУКТ Узел {
|
|
|
|
|
+ ключ: ЦЕЛОЕ,
|
|
|
|
|
+ Левый, Правый: Дерево,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ДеревоСередина = УзелСередина,
|
|
|
|
|
+
|
|
|
|
|
+ СТРУКТ УзелСередина (Узел){
|
|
|
|
|
+ Имя: МАССИВ[32]БАЙТ,
|
|
|
|
|
+ Подузел: Дерево,
|
|
|
|
|
+ }
|
|
|
|
|
+ Функция = FN (x: ЦЕЛОЕ): ЦЕЛОЕ,
|
|
|
}
|
|
}
|
|
|
-ТИП Функция = FN (x: ЦЕЛОЕ): ЦЕЛОЕ;
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### 6.1 Встроенные линейные типы
|
|
### 6.1 Встроенные линейные типы
|
|
@@ -380,8 +396,8 @@ flowchart TD
|
|
|
Массив - это структура, состоящая из фиксированного количества элементов, тип элементов одинаковый для всех элементов данного типа массива. Количество элементов массива называется его длиной. Элементы массива обозначаются индексами, которые являются целыми числами от 0 до (длины - 1).
|
|
Массив - это структура, состоящая из фиксированного количества элементов, тип элементов одинаковый для всех элементов данного типа массива. Количество элементов массива называется его длиной. Элементы массива обозначаются индексами, которые являются целыми числами от 0 до (длины - 1).
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-ЗНАЧ ТипМассива = МАССИВ[длина {"," длина}]тип_элемента;
|
|
|
|
|
-ЗНАЧ длина = КонстантноеВыражение;
|
|
|
|
|
|
|
+ТипМассива = МАССИВ[длина, длина..?]тип_элемента;
|
|
|
|
|
+длина = Выражение | КонстантноеВыражение;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Форма объявления
|
|
Форма объявления
|
|
@@ -391,8 +407,10 @@ flowchart TD
|
|
|
Примеры типов массивов:
|
|
Примеры типов массивов:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-ЗНАЧ listUser=МАССИВ[NN]ЦЕЛОЕ;
|
|
|
|
|
-ЗНАЧ moments=МАССИВ[10, 20]ВЕЩ;
|
|
|
|
|
|
|
+ЗНАЧ {
|
|
|
|
|
+ listUser=МАССИВ[NN]ЦЕЛОЕ,
|
|
|
|
|
+ moments=МАССИВ[10, 20]ВЕЩ,
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
`Литеральная строка` при создании представляет собой набор байт в виде букв в двойных кавычках. После привоения фактически -- это массив байт.
|
|
`Литеральная строка` при создании представляет собой набор байт в виде букв в двойных кавычках. После привоения фактически -- это массив байт.
|
|
@@ -400,7 +418,9 @@ flowchart TD
|
|
|
Пример:
|
|
Пример:
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-ЗНАЧ strHello="Привет";
|
|
|
|
|
|
|
+ЗНАЧ {
|
|
|
|
|
+ strHello="Привет",
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Все встроенные векторные типы *всегда* передаются по ссылке.
|
|
Все встроенные векторные типы *всегда* передаются по ссылке.
|
|
@@ -410,25 +430,29 @@ flowchart TD
|
|
|
Сущность `структура`, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа структуры задаёт для каждого элемента, которое называется полем, его тип и имя, которое првязывает это поле. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры.
|
|
Сущность `структура`, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа структуры задаёт для каждого элемента, которое называется полем, его тип и имя, которое првязывает это поле. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры.
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-ТипЗаписи = СТРУКТ ["(" БазовыйТип")"] [СписокПолейТипа].
|
|
|
|
|
-БазовыйТип = квалификатор.
|
|
|
|
|
-СписокПолейТипа= СписокПолей{";" СписокПолей}.
|
|
|
|
|
-СписокПолей = СписокИмён":" тип.
|
|
|
|
|
-СписокИмён = ИмяОбъявление{"," ИмяОбъявление}.
|
|
|
|
|
|
|
+ТипЗаписи = СТРУКТ ( БазовыйТип?) {
|
|
|
|
|
+ СписокПолейТипа
|
|
|
|
|
+};
|
|
|
|
|
+БазовыйТип = квалификатор;
|
|
|
|
|
+СписокПолейТипа= СписокПолей?;
|
|
|
|
|
+СписокПолей = Поле..?
|
|
|
|
|
+Поле = Имя, Имя..? ":" тип;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Если тип структуры экспортируется, имена полей, которые должны быть видимыми вне модуля объявления, должны быть помечены. Они называются публичными полями; неотмеченные поля называются приватными полями. Типы записей являются расширяемыми, т. е. тип записи может быть определён как расширение другого типа записи. В приведенных выше примерах УзелСередина (непосредственно) расширяет Узел, который является (прямым) базовым типом УзелСередина. Точнее, УзелСередина расширяет Узел с полями имя и подузел.
|
|
Если тип структуры экспортируется, имена полей, которые должны быть видимыми вне модуля объявления, должны быть помечены. Они называются публичными полями; неотмеченные поля называются приватными полями. Типы записей являются расширяемыми, т. е. тип записи может быть определён как расширение другого типа записи. В приведенных выше примерах УзелСередина (непосредственно) расширяет Узел, который является (прямым) базовым типом УзелСередина. Точнее, УзелСередина расширяет Узел с полями имя и подузел.
|
|
|
|
|
|
|
|
-**Определение**. Тип T расширяет тип T0, если он является T0, или если он непосредственно расширяет расширение T0. И наоборот, тип T0 является базовым типом для типа T, если он является T, или если он является прямым базовым типом базового типа T. Примеры типов структур:
|
|
|
|
|
|
|
+**Определение**. Тип `T1` является `T0`, если он непосредственно расширяет `T0`. И наоборот, тип `T0` является базовым типом для типа `T1`, если он является прямым базовым типом базового типа `T1`. Примеры типов структур:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-ТИП Year СТРУКТ{
|
|
|
|
|
- день, месяц, год: ЦЕЛОЕ,
|
|
|
|
|
-}
|
|
|
|
|
-ТИП User СТРУКТ{
|
|
|
|
|
- имя, фамилия: МАССИВ[32]БАЙТ,
|
|
|
|
|
- возраст: `ЦЕЛОЕ`,
|
|
|
|
|
- зарплата: ВЕЩ,
|
|
|
|
|
|
|
+ТИП {
|
|
|
|
|
+ СТРУКТ Дата {
|
|
|
|
|
+ день, месяц, год: ЦЕЛОЕ,
|
|
|
|
|
+ }
|
|
|
|
|
+ СТРУКТ User (Дата){
|
|
|
|
|
+ имя, фамилия: МАССИВ[32]БАЙТ,
|
|
|
|
|
+ возраст: ЦЕЛОЕ,
|
|
|
|
|
+ зарплата: ВЕЩ,
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -437,7 +461,7 @@ flowchart TD
|
|
|
Типы структур *всегда* связываются по ссылке.
|
|
Типы структур *всегда* связываются по ссылке.
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-ТИП ТипСсылка = тип;
|
|
|
|
|
|
|
+Тип = Структура?;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### 6.5 Тип функции
|
|
### 6.5 Тип функции
|
|
@@ -446,28 +470,33 @@ flowchart TD
|
|
|
|
|
|
|
|
Все переменные присваиваются ссылкой на функцию.
|
|
Все переменные присваиваются ссылкой на функцию.
|
|
|
|
|
|
|
|
-> ТипФункция = FN [ФормальныеПараметры].
|
|
|
|
|
|
|
+> ТипФункция = FN (ФормальныеПараметры?)Результат?;
|
|
|
|
|
|
|
|
## 7. Объявление переменных
|
|
## 7. Объявление переменных
|
|
|
|
|
|
|
|
Объявления переменных служат для введения переменных и связывания их с именами, которые не должны повторяться в пределах данной области видимости. Они также служат для связывания встроенных линейных типов данных с переменными.
|
|
Объявления переменных служат для введения переменных и связывания их с именами, которые не должны повторяться в пределах данной области видимости. Они также служат для связывания встроенных линейных типов данных с переменными.
|
|
|
|
|
|
|
|
-> ОбъявлениеПеременной = СписокИмён":" тип.
|
|
|
|
|
|
|
+> ОбъявлениеПеременной = СписокИмён ":" тип;
|
|
|
|
|
|
|
|
Переменные, имена которых отображаются через запятую имеют один и тот же тип. Примеры объявления переменных (см. Примеры в главе 6):
|
|
Переменные, имена которых отображаются через запятую имеют один и тот же тип. Примеры объявления переменных (см. Примеры в главе 6):
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-ЗНАЧ i, j, k: ЦЕЛОЕ;
|
|
|
|
|
-ЗНАЧ x, y: ВЕЩ;
|
|
|
|
|
-ЗНАЧ p, q: БУЛ;
|
|
|
|
|
-ЗНАЧ f: fn();
|
|
|
|
|
-ЗНАЧ a: МАССИВ[100]ВЕЩ;
|
|
|
|
|
-ТИП text СТРУКТ{
|
|
|
|
|
- лит: БАЙТ,
|
|
|
|
|
- счётчик: ЦЕЛОЕ,
|
|
|
|
|
|
|
+ТИП {
|
|
|
|
|
+ СТРУКТ Текст {
|
|
|
|
|
+ лит: БАЙТ,
|
|
|
|
|
+ счётчик: ЦЕЛОЕ,
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+ЗНАЧ {
|
|
|
|
|
+ i, j, k: ЦЕЛОЕ,
|
|
|
|
|
+ x, y: ВЕЩ,
|
|
|
|
|
+ p, q: БУЛ,
|
|
|
|
|
+ f: FN(),
|
|
|
|
|
+ a: МАССИВ[100]ВЕЩ,
|
|
|
|
|
+ w: МАССИВ[16]Текст,
|
|
|
|
|
+ t: Дерево,
|
|
|
}
|
|
}
|
|
|
-ЗНАЧ w: МАССИВ[16]text;
|
|
|
|
|
-ЗНАЧ t: Дерево;
|
|
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## 8. Выражения
|
|
## 8. Выражения
|
|
@@ -487,8 +516,8 @@ flowchart TD
|
|
|
|
|
|
|
|
Если имя операнда определено как имя модуля, то за ним могут следовать имена подчинённых сущностей. Если операнд является структурой, то через точку указываются поля такой структуры.
|
|
Если имя операнда определено как имя модуля, то за ним могут следовать имена подчинённых сущностей. Если операнд является структурой, то через точку указываются поля такой структуры.
|
|
|
|
|
|
|
|
-> селектор = "." Имя | "["СписокВыражения"]" | «^» | "(" Квалификатор ")"
|
|
|
|
|
-> СписокВыражения = выражение {"," выражение}.
|
|
|
|
|
|
|
+> селектор = "." Имя | "["СписокВыражения"]" | «^» | "(" Квалификатор ")";
|
|
|
|
|
+> СписокВыражения = выражение..?;
|
|
|
|
|
|
|
|
Если обозначенное имя сущности является переменной, то имя переменной ссылается на текущее значение переменной.
|
|
Если обозначенное имя сущности является переменной, то имя переменной ссылается на текущее значение переменной.
|
|
|
|
|
|
|
@@ -522,15 +551,15 @@ t(УзелСредний).подузел(Дерево)
|
|
|
> (x-y)-z
|
|
> (x-y)-z
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-выражение = ОперацияПростая [ОперацияОтношение ОперацияПростая].
|
|
|
|
|
-ОперацияОтношение = "=" | "~" | "<" | "<=" | ">" | ">=" | IN | IS.
|
|
|
|
|
-ОперацияПростая = ["+"|"−"] разделитель {ОператорАддикции разделитель}.
|
|
|
|
|
-ОперациярАддикции= "+" | "−" | OR.
|
|
|
|
|
-разделитель = множитель {ОператорМультипликации множитель}.
|
|
|
|
|
-ОператорМультипликации = "*" | "/" | DIV | MOD | "&" .
|
|
|
|
|
-множитель = число| строка| NIL | TRUE | FALSE | set | ссылка [ФактическийПараметр] | "(" выражение ")" | "~" множитель.
|
|
|
|
|
-ОперацияВыборки = выражение [".." выражение].
|
|
|
|
|
-ФактическийПараметр = "(" [СписокВыражения] ")" .
|
|
|
|
|
|
|
+выражение = (ОперацияПростая ОперацияОтношение ОперацияПростая)..;
|
|
|
|
|
+ОперацияОтношение = "=" | "~" | "<" | "<=" | ">" | ">=" | ЕСТЬ;
|
|
|
|
|
+ОперацияПростая = ()"+"|"−"? разделитель? ОператорАддикции разделитель?;
|
|
|
|
|
+ОперациярАддикции= "+" | "−" | ИЛИ;
|
|
|
|
|
+разделитель = множитель ОператорМультипликации? множитель;
|
|
|
|
|
+ОператорМультипликации = "*" | "/" | ДИВ | МОД | И;
|
|
|
|
|
+множитель = число| строка| ПУСТО | ДА | НЕТ | ФактическийПараметр.. | "(" выражение ")" | "~" множитель;
|
|
|
|
|
+ОперацияВыборки = выражение выражение..?;
|
|
|
|
|
+ФактическийПараметр = ( СписокВыражения..?);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Множество [m..n] обозначает [m, m + 1, ..., n-1, n], а если m>n, то пустое множество. Доступные операции перечислены в следующих таблицах. В некоторых случаях несколько разных операций обозначаются одним и тем же символом операции. В этих случаях фактическая операция определяется типом операндов.
|
|
Множество [m..n] обозначает [m, m + 1, ..., n-1, n], а если m>n, то пустое множество. Доступные операции перечислены в следующих таблицах. В некоторых случаях несколько разных операций обозначаются одним и тем же символом операции. В этих случаях фактическая операция определяется типом операндов.
|
|
@@ -584,7 +613,7 @@ t(УзелСредний).подузел(Дерево)
|
|
|
|
|
|
|
|
Результат операций отношения является базовым типом `БУЛ`. `ОперацияОтношение` (`<`, `<=`,`>`,`=`) применяется к числовым типам и `БАЙТ`. Отношения `=` и `!=` применимы также к типам `БУЛ`, ссылкам и процедурным типам.
|
|
Результат операций отношения является базовым типом `БУЛ`. `ОперацияОтношение` (`<`, `<=`,`>`,`=`) применяется к числовым типам и `БАЙТ`. Отношения `=` и `!=` применимы также к типам `БУЛ`, ссылкам и процедурным типам.
|
|
|
|
|
|
|
|
-`v ЕСТЬ T` означает `v ЯВЛЯЕТСЯ типом T` и вызывает проверку типа. Это применимо, если выполнены все условия:
|
|
|
|
|
|
|
+`v ЕСТЬ T` означает `v ЯВЛЯЕТСЯ типом T` и вызывает проверку типа. Это применимо, если выполнены все условия:
|
|
|
|
|
|
|
|
- `T` расширение объявленной структуры `T0` для `v`;
|
|
- `T` расширение объявленной структуры `T0` для `v`;
|
|
|
- `v` параметр, как переменная заданного типа структуры.
|
|
- `v` параметр, как переменная заданного типа структуры.
|
|
@@ -612,7 +641,7 @@ T ЕСТЬ УзелСредний (`БУЛ`)
|
|
|
|
|
|
|
|
Предписания также могут быть пустыми, и в этом случае они не обозначают никаких действий. Пустое предписание включено в язык для того, чтобы ослабить правила пунктуации в последовательностях предписаний.
|
|
Предписания также могут быть пустыми, и в этом случае они не обозначают никаких действий. Пустое предписание включено в язык для того, чтобы ослабить правила пунктуации в последовательностях предписаний.
|
|
|
|
|
|
|
|
-> Предписание = [Присвоение | ВызовПроцедур | Предписание_ЕСЛИ | Предписание_ВЫБОР | Предписание_ПОКА | Предписание_ДЛЯ].
|
|
|
|
|
|
|
+> Предписание = [Присвоение | ВызовПроцедур | Предписание_ЕСЛИ | Предписание_ВЫБОР | Предписание_ПОКА | Предписание_ДЛЯ | Предписание_ПЕТЛЯ].
|
|
|
|
|
|
|
|
### 9.1 Предписание ПРИСВОЕНИЕ
|
|
### 9.1 Предписание ПРИСВОЕНИЕ
|
|
|
|
|
|
|
@@ -620,7 +649,7 @@ T ЕСТЬ УзелСредний (`БУЛ`)
|
|
|
|
|
|
|
|
> присвоение = переменная "=" выражение.
|
|
> присвоение = переменная "=" выражение.
|
|
|
|
|
|
|
|
-Если значение параметра обладает структурой (массив или структура), параметру не разрешено присваивать его или его элементам. Импортируемые переменные также не могут быть присвоены. Если переменная не помечена ключевым словом `МУТ` -- ей нельзя присваивать даже в модуле объявления (кроме случаев создания такой переменной).
|
|
|
|
|
|
|
+Если значение параметра обладает структурой (массив или структура), параметру не разрешено присваивать его или его элементам. Импортируемые переменные также не могут быть присвоены. Если переменная не помечена ключевым словом `МУТ` при её описании -- ей нельзя присваивать даже в модуле объявления (кроме случаев создания такой переменной).
|
|
|
|
|
|
|
|
Тип выражения должен быть таким же, как у переменной. Имеют место следующие исключения:
|
|
Тип выражения должен быть таким же, как у переменной. Имеют место следующие исключения:
|
|
|
|
|
|
|
@@ -643,53 +672,53 @@ t.key = i
|
|
|
w[i+1].ch = "A"
|
|
w[i+1].ch = "A"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-####
|
|
|
|
|
### 9.3 Последовательность предписаний
|
|
### 9.3 Последовательность предписаний
|
|
|
|
|
|
|
|
Последовательности предписаний обозначают последовательность действий, заданную частями операторов, разделенными точкой с запятой.
|
|
Последовательности предписаний обозначают последовательность действий, заданную частями операторов, разделенными точкой с запятой.
|
|
|
|
|
|
|
|
-> Последовательность_Предписаний = Предписание{";" Предписание}.
|
|
|
|
|
|
|
+> Последовательность_Предписаний = Предписание? ; (Предписание;)..?;
|
|
|
|
|
|
|
|
### 9.4 Предписание_ЕСЛИ
|
|
### 9.4 Предписание_ЕСЛИ
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-Предписание_ЕСЛИ = ЕСЛИ Выражение ТОГДА{
|
|
|
|
|
|
|
+Предписание_ЕСЛИ = ЕСЛИ Выражение {
|
|
|
Последовательность_Предписаний;
|
|
Последовательность_Предписаний;
|
|
|
-}АЕСЛИ Выражение ТОГДА{
|
|
|
|
|
|
|
+}АЕСЛИ Выражение {
|
|
|
Последовательность_Предписаний;
|
|
Последовательность_Предписаний;
|
|
|
-};
|
|
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Составное предписание `ЕСЛИ` определяет условное выполнение охраняемых подчинённых предписаний. Логическое выражение, предшествующее предписанию называется охрана. Охрана вычисляет выражение в порядке встречи, пока выражение имеет значение `ДА`, после чего выполняется связанная с охраной последовательность предписаний. Если охраны не выполнена, то выполняется последовательность предписаний после символа `АЕСЛИ`, если такая ветка существует. Пример:
|
|
Составное предписание `ЕСЛИ` определяет условное выполнение охраняемых подчинённых предписаний. Логическое выражение, предшествующее предписанию называется охрана. Охрана вычисляет выражение в порядке встречи, пока выражение имеет значение `ДА`, после чего выполняется связанная с охраной последовательность предписаний. Если охраны не выполнена, то выполняется последовательность предписаний после символа `АЕСЛИ`, если такая ветка существует. Пример:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-ЕСЛИ (литера >= "A") И (литера <= "Z") ТОГДА{
|
|
|
|
|
|
|
+ЕСЛИ (литера >= "A") И (литера <= "Z") {
|
|
|
Сущность_Читать();
|
|
Сущность_Читать();
|
|
|
-}АЕСЛИ (литера >= "0") И (литера <= "9") ТОГДА{
|
|
|
|
|
|
|
+}АЕСЛИ (литера >= "0") И (литера <= "9") {
|
|
|
Число_Читать();
|
|
Число_Читать();
|
|
|
-}АЕСЛИ литера = 22X ТОГДА{
|
|
|
|
|
|
|
+}АЕСЛИ литера = 22X {
|
|
|
Строку_Читать();
|
|
Строку_Читать();
|
|
|
-};
|
|
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### 9.5 Предписание_ВЫБОР
|
|
### 9.5 Предписание_ВЫБОР
|
|
|
|
|
|
|
|
Составное предписание `ВЫБОР` определяет выбор и выполнение последовательности предписаний в соответствии со значением выражения. Сначала вычисляется выражение `ВЫБОР`, затем выполняется последовательность предписаний, чей список меток содержит полученное значение. Если выражение `ВЫБОР` имеет тип `ЦЕЛОЕ` или `БАЙТ`, все метки должны быть целыми или байтами, соответственно.
|
|
Составное предписание `ВЫБОР` определяет выбор и выполнение последовательности предписаний в соответствии со значением выражения. Сначала вычисляется выражение `ВЫБОР`, затем выполняется последовательность предписаний, чей список меток содержит полученное значение. Если выражение `ВЫБОР` имеет тип `ЦЕЛОЕ` или `БАЙТ`, все метки должны быть целыми или байтами, соответственно.
|
|
|
|
|
+
|
|
|
```bash
|
|
```bash
|
|
|
-Предписание_ВЫБОР= ВЫБОР выражение {выбор..}.
|
|
|
|
|
-выбор = [СписокМеток_ВЫБОР ":" ПоследовательностьПредписаний].
|
|
|
|
|
|
|
+Предписание_ВЫБОР= ВЫБОР выражение СписокМеток_ВЫБОР;
|
|
|
|
|
+Выбор = Сущность ":" СписокВыражений;
|
|
|
СписокМеток_ВЫБОР = МеткиДляВыбора["," МеткиДляВыбора].
|
|
СписокМеток_ВЫБОР = МеткиДляВыбора["," МеткиДляВыбора].
|
|
|
-МеткиДляВыбора = Метка[".." Метка].
|
|
|
|
|
|
|
+МеткиДляВыбора = Метка .. Метка..?;
|
|
|
Метка = целое | строка | квалификатор.
|
|
Метка = целое | строка | квалификатор.
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Пример:
|
|
Пример:
|
|
|
```c
|
|
```c
|
|
|
ВЫБОР k {
|
|
ВЫБОР k {
|
|
|
- | 0: x = x + y
|
|
|
|
|
- | 1: x = x − y
|
|
|
|
|
- | 2: x = x * y
|
|
|
|
|
- | 3: x = x / y
|
|
|
|
|
|
|
+ | 0: x = x + y,
|
|
|
|
|
+ | 1: x = x − y,
|
|
|
|
|
+ | 2: x = x * y,
|
|
|
|
|
+ | 3: x = x / y,
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -917,16 +946,18 @@ i = 0;
|
|
|
Модуль представляет собой набор объявлений констант, типов, переменных и функций и последовательностей предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.
|
|
Модуль представляет собой набор объявлений констант, типов, переменных и функций и последовательностей предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-Модуль = МОДУЛЬ Имя {
|
|
|
|
|
|
|
+Модуль = МОДУЛЬ Имя;
|
|
|
[СписокИмпорта]
|
|
[СписокИмпорта]
|
|
|
- ПоследовательостьОбъявлений
|
|
|
|
|
|
|
+ СписокОбъявлений..? | СписокПредписаний..?;
|
|
|
|
|
+{
|
|
|
|
|
+ СписокВыражений..?;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
СписокИмпорта = ИМПОРТ {
|
|
СписокИмпорта = ИМПОРТ {
|
|
|
- Импорт "," Импорт
|
|
|
|
|
|
|
+ ИмпортМодуля..?
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-Импорт = Имя["=" МодульПуть];
|
|
|
|
|
|
|
+ИмпортМодуля = Имя "=" МодульПуть;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
В списке импорта указаны модули, для которых текущий модуль является клиентом. Если имя `x` экспортируется из модуля `M`, и если `M` указан в списке импорта модуля, тогда к `x` обращаются как `M.x`. Если в списке импорта используется форма `M1 = M`, экспортируемый объект `x`, объявленный в `M1`, ссылается в импортируемом модуле как `M1.x`.
|
|
В списке импорта указаны модули, для которых текущий модуль является клиентом. Если имя `x` экспортируется из модуля `M`, и если `M` указан в списке импорта модуля, тогда к `x` обращаются как `M.x`. Если в списке импорта используется форма `M1 = M`, экспортируемый объект `x`, объявленный в `M1`, ссылается в импортируемом модуле как `M1.x`.
|
|
@@ -938,11 +969,11 @@ i = 0;
|
|
|
Пример:
|
|
Пример:
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-МОДУЛЬ Вывод // экспортирует процедуры: Write, WriteInt, WriteLn
|
|
|
|
|
|
|
+МОДУЛЬ Вывод; // экспортирует процедуры: Write, WriteInt, WriteLn
|
|
|
|
|
|
|
|
ИМПОРТ {
|
|
ИМПОРТ {
|
|
|
- Текст;
|
|
|
|
|
- Oberon;
|
|
|
|
|
|
|
+ Текст,
|
|
|
|
|
+ Oberon,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ЗНАЧ {
|
|
ЗНАЧ {
|
|
@@ -950,7 +981,7 @@ i = 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ФН Write*(ch: БАЙТ){
|
|
ФН Write*(ch: БАЙТ){
|
|
|
- Текст.Write(W, ch)
|
|
|
|
|
|
|
+ Текст.Write(W, ch);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ФН WriteInt*(x, n: `ЦЕЛОЕ`){
|
|
ФН WriteInt*(x, n: `ЦЕЛОЕ`){
|
|
@@ -971,33 +1002,40 @@ i = 0;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
Текст.Write(W, " ");
|
|
Текст.Write(W, " ");
|
|
|
- n--
|
|
|
|
|
|
|
+ n--;
|
|
|
ПЕТЛЯ {
|
|
ПЕТЛЯ {
|
|
|
ЕСЛИ n >i{
|
|
ЕСЛИ n >i{
|
|
|
- ПРЕРВАТЬ
|
|
|
|
|
|
|
+ ПРЕРВАТЬ;
|
|
|
}
|
|
}
|
|
|
i--;
|
|
i--;
|
|
|
}
|
|
}
|
|
|
- Текст.Write(W, a[i])
|
|
|
|
|
|
|
+ Текст.Write(W, a[i]);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ФН WriteLn*{}
|
|
ФН WriteLn*{}
|
|
|
Текст.WriteLn(W);
|
|
Текст.WriteLn(W);
|
|
|
- Текст.Append(Oberon.Log, W.buf)
|
|
|
|
|
|
|
+ Текст.Append(Oberon.Log, W.buf);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
{
|
|
{
|
|
|
Текст.OpenWriter(W)
|
|
Текст.OpenWriter(W)
|
|
|
-}.
|
|
|
|
|
|
|
+}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### 11.1 Модуль SYSTEM
|
|
|
|
|
-Необязательный модуль SYSTEM содержит определения, необходимые для программирования операций низкого уровня, ссылающихся непосредственно на ресурсы, специфичные для данного компьютера и/или реализации языка/компьютера.
|
|
|
|
|
-К ним относятся, например, средства доступа к устройствам, которые контролируются компьютером, и, возможно, низкоуровневым средствам для нарушения правил совместимости типов данных (иначе пришлось бы такие средства языка вводить явно).
|
|
|
|
|
-В модуле SYSTEM есть две причины для упрощения процедур:
|
|
|
|
|
-1) Их значение зависит от реализации, то есть значение не выводится из определения языка, и
|
|
|
|
|
-2) они могут повредить систему (например, PUT). Настоятельно рекомендуется ограничить их использование конкретными низкоуровневыми модулями, поскольку такие модули по своей сути являются не переносимыми, и не «безопасными по типу». Однако они легко распознаются из-за идентификатора SYSTEM, появляющегося в списках импорта модуля.
|
|
|
|
|
-Следующие определения обычно применимы без дополнительных изменений. Однако отдельные реализации языка могут включать в свои модули дополнительные определения SYSTEM, которые относятся к конкретному, находящемуся в использовании компьютеру. В дальнейшем v обозначает переменную, x, a и n для выражений.
|
|
|
|
|
|
|
+### 11.1 Модуль СИСТЕМА
|
|
|
|
|
+
|
|
|
|
|
+Необязательный модуль `СИСТЕМА` содержит определения, необходимые для программирования опасных операций, ссылающихся непосредственно на ресурсы, специфичные для данной аппаратуры.
|
|
|
|
|
+
|
|
|
|
|
+Импорт модуля `СИСТЕМА` может быть пустым для обозначения опасных операций.
|
|
|
|
|
+
|
|
|
|
|
+К опасным операциям относятся, например, средства доступа к устройствам, которые контролируются аппаратурой, и, возможно, низкоуровневым средствам для нарушения правил совместимости типов данных (иначе пришлось бы такие средства языка вводить явно).
|
|
|
|
|
+
|
|
|
|
|
+В модуле `СИСТЕМА` есть две причины для упрощения процедур:
|
|
|
|
|
+
|
|
|
|
|
+- их значение зависит от реализации, то есть значение не выводится из определения языка;
|
|
|
|
|
+- они могут повредить систему (например, PUT). Настоятельно рекомендуется ограничить их использование конкретными низкоуровневыми модулями, поскольку такие модули по своей сути являются не переносимыми, и не «безопасными по типу». Однако они легко распознаются из-за идентификатора `СИСТЕМА`, появляющегося в списках импорта модуля.
|
|
|
|
|
+
|
|
|
|
|
+Следующие определения обычно применимы без дополнительных изменений. Однако отдельные реализации языка могут включать в свои модули дополнительные определения `СИСТЕМА`, которые относятся к конкретной, находящейся в использовании аппаратуре. В дальнейшем `v` обозначает переменную, `x`, `a` и `n` для выражений.
|
|
|
|
|
|
|
|
Процедуры-функции:
|
|
Процедуры-функции:
|
|
|
Имя
|
|
Имя
|