Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
ao [2016/04/14 17:35] prospero78 [4.2 HUGEINT] |
ao [2020/10/29 07:08] 127.0.0.1 внешнее изменение |
||
---|---|---|---|
Строка 24: | Строка 24: | ||
Множество расширений языка **Oberon** было предложено как в **ETH**, так и вне его. **Object Oberon** [19], **Oberon-2** [18], и **Froderon** [7] исследуют добавление дополнительных объектно-ориентированных свойств в язык; **Oberon-V** [9] предлагает дополнения для поддержки параллельных операций на векторных компьютерах; | Множество расширений языка **Oberon** было предложено как в **ETH**, так и вне его. **Object Oberon** [19], **Oberon-2** [18], и **Froderon** [7] исследуют добавление дополнительных объектно-ориентированных свойств в язык; **Oberon-V** [9] предлагает дополнения для поддержки параллельных операций на векторных компьютерах; | ||
- | PIC FIXME | + | {{ :: |
Рис. 1: Эволюция языков семейства Pascal | Рис. 1: Эволюция языков семейства Pascal | ||
Строка 414: | Строка 415: | ||
==== 4.3 Нетрассируемые указатели (untraced pointers) ==== | ==== 4.3 Нетрассируемые указатели (untraced pointers) ==== | ||
- | Нетрассируемые указатели --- это указатели, | + | //Нетрассируемые указатели// --- это указатели, |
- | Нетрассируемые указатели определяются при помощи модификатора UNTRACED. | + | Нетрассируемые указатели определяются при помощи модификатора |
- | TYPE Untraced = POINTER {UNTRACED} TO T; | + | '' |
==== 4.4 Новое для IA32 ==== | ==== 4.4 Новое для IA32 ==== | ||
- | Функции из таблицы 2 были добавлены в компилятор для платформы Intel IA32. | + | Функции из таблицы 2 были добавлены в компилятор для платформы |
- | PUTx и GETx были добавлены ради безопасности, | + | '' |
==== 4.5 Прочее ==== | ==== 4.5 Прочее ==== | ||
- | Некоторые расширения из Oberon-2 были адаптированы для Active Oberon: | + | Некоторые расширения из **Oberon-2** были адаптированы для |
ASSERT | ASSERT | ||
Строка 435: | Строка 436: | ||
динамические массивы | динамические массивы | ||
- | Переменные указатели автоматически инициализируются значением NIL. | + | Переменные указатели автоматически инициализируются значением |
Строка 570: | Строка 571: | ||
==== B.1 Читатели и писатели ==== | ==== B.1 Читатели и писатели ==== | ||
- | < | + | < |
MODULE ReaderWriter; | MODULE ReaderWriter; | ||
Строка 606: | Строка 607: | ||
END RW; | END RW; | ||
- | END ReaderWriter.</ | + | END ReaderWriter. |
+ | </ | ||
- | Образец Читатели --- Писатели регулирует доступ к данным в критической секции. Либо один Писатель (активность, | + | Образец |
==== B.2 Сигналы ==== | ==== B.2 Сигналы ==== | ||
- | < | + | < |
TYPE | TYPE | ||
Signal* = OBJECT | Signal* = OBJECT | ||
Строка 642: | Строка 644: | ||
</ | </ | ||
- | Signal реализует примитивы для работы с сигналами Active Oberon подобно тому, как это сделано в Java и Modula-2. Он использует слегка измененный ticket-algorithm. Как в некоторых магазинах, | + | '' |
==== B.3 Повторно входимые блокировки ==== | ==== B.3 Повторно входимые блокировки ==== | ||
- | < | + | < |
ReentrantLock* = OBJECT | ReentrantLock* = OBJECT | ||
VAR | VAR | ||
Строка 669: | Строка 671: | ||
</ | </ | ||
- | ReentrantLock позволяет блокировать объект его хозяином более одного раза. Клиенты этого объекта должны явно использовать Lock и Unlock вместо пометки защищаемого участка оператором EXCLUSIVE. | + | '' |
==== B.4 Бинарный и общий семафоры ==== | ==== B.4 Бинарный и общий семафоры ==== | ||
- | < | + | < |
MODULE Semaphores; | MODULE Semaphores; | ||
Строка 715: | Строка 717: | ||
</ | </ | ||
- | Это хорошо известные синхронизирующие примитивы Дейкстры [5]. Заметим, | + | Это хорошо известные синхронизирующие примитивы |
==== B.5 Барьеры ==== | ==== B.5 Барьеры ==== | ||
- | < | + | < |
MODULE Barriers; | MODULE Barriers; | ||
(* | (* | ||
Строка 748: | Строка 750: | ||
P = Phase ;P hase ;...P hase i i,0 i,1 i,n | P = Phase ;P hase ;...P hase i i,0 i,1 i,n | ||
- | то барьер используется для гарантии того, что все активности выполнят Phasei,j до начала Phasei,j+1. Отдельный поток исполнения будет выглядеть подобно следующему: | + | то барьер используется для гарантии того, что все активности выполнят |
- | < | + | < |
- | FOR j := 0 TO N DO | + | FOR j := 0 TO N DO |
Phase(i, j); barrier.Enter | Phase(i, j); barrier.Enter | ||
END; | END; | ||
</ | </ | ||
- | Барьер сбрасывает счетчик in после выполнения условия чтобы избежать переполнения. Это возможно потому, | + | Барьер сбрасывает счетчик |
==== B.6 Ограниченный буфер ==== | ==== B.6 Ограниченный буфер ==== | ||
- | < | + | < |
MODULE Buffers; | MODULE Buffers; | ||
Строка 798: | Строка 800: | ||
</ | </ | ||
- | Buffer реализует ограниченный кольцевой буфер. Методы Put и Get защищены от одновременного доступа; | + | '' |
===== C Примеры активных объектов ===== | ===== C Примеры активных объектов ===== | ||
Строка 805: | Строка 807: | ||
==== C.1 Обедающие философы ==== | ==== C.1 Обедающие философы ==== | ||
- | < | + | < |
MODULE Philo; | MODULE Philo; | ||
Строка 852: | Строка 854: | ||
==== C.2 Решето Эратосфена ==== | ==== C.2 Решето Эратосфена ==== | ||
- | < | + | < |
MODULE Eratosthenes; | MODULE Eratosthenes; | ||
Строка 901: | Строка 903: | ||
END Eratosthenes.</ | END Eratosthenes.</ | ||
- | Eratosthenes использует отсеивающий алгоритм для поиска простых чисел. Каждое решето --- это активный объект, | + | '' |