
- •1 КОНЦЕПЦИИ ЯЗЫКА SMALLTALK-80
- •2 ОПИСАНИЕ ЯЫКА SQUEAK SMALLTALK
- •2.1 Основные понятия
- •2.2 Синтаксис языка Smalltalk
- •2.3 Описание классов объектов
- •3 ПАРАЛЛЕЛЬНАЯ РАБОТА
- •3.1 Объекты класса Process
- •3.2 Объект класса ProcessorScheduler
- •3.3 Объекты класса Semaphore
- •5.1 Децентрализованное управление процессами
- •5.2 Централизованное управление процессами
- •5.3 Разработка моделей систем с дискретными событиями
- •5.4 Протоколирование результатов моделирования
- •5.5 Учебные задачи моделирования
- •5.5.1 Обработка партии деталей на двух станках
- •5.5.2 Грузоперевозки автотранспортом
- •5.5.3 Управление посадкой самолетов
- •5.5.4 Исследование характеристик систем массового обслуживания
- •Библиографический список
2.2 Синтаксис языка Smalltalk
Описание синтаксиса языка Smalltalk [2] приводится в стандартной нота ции Бэкуса-Наура с использованием следующих метасимволов:
<> |
– скобки для обозначения понятия или символа; |
| |
– разделитель альтернативных вариантов определения; |
{ } |
– обязательный фрагмент или группа; |
[ ] |
– факультативный фрагмент или группа; |
... |
– предыдущее понятие можно повторить любое число раз. |
<Цифра> ::= 0|1|2|3|4|5|6|7|8|9 <Последовательность цифр> ::= <Цифра> ...
<Числовое значение> ::= [<Последовательность цифр> r ]
[–] <Последовательность цифр> [.<Последовательность цифр>] е [ – ] <Последовательность цифр>
<Буква> ::= A | ... | Z | a | ... | z
<Специальный знак> ::= +| / | \ | * | ~ | < | > | = | @ | % | ¦ | & | ? | ! <Символ> ::= <Цифра> | <Буква> | <Специальный знак> |
[ | ] | { | } | ( | ) | ^ | , | ; | $ | ! | # | : <Идентификатор> ::= <Буква> [ <Буква> | <Цифра>] ...
<Слово> ::= <Идентификатор> | <Бинарный селектор> | <Ключевое слово> ...
<Словная константа> ::= # <Слово> <Символьная константа> ::= $<Символ> | ' | "
<Последовательность символов> ::= ' [<Символ> | ' ' | " ]... ' <Комментарий> ::= " [<Символ> | " " | ' ]... "
<Массив> ::= ([<Числовое значение> | <Слово> | <Последовательность символов> | <Символьная константа> | <Массив>]...)
<Константа массива> ::= # <Массив> <Константа>::= <Числовое значение> | <Словная константа> | <Символь
ная константа> | <Последовательность символов> | <Константа массива>
<Переменная> ::= <Идентификатор> <Унарный селектор> ::= <Идентификатор>
<Бинарный селектор> ::= – | <Специальный знак> [<Специальный знак>] <Ключевое слово> ::= <Идентификатор> :
<Первичная форма> ::= <Переменная> | <Константа> | <Блок> | (<Форма>) <Описание унарного объекта> ::= <Первичная форма> | <Унарная форма> <Описание бинарного объекта> ::= <Описание унарного объекта> | <Би
нарная форма> <Унарная форма> ::= <Описание унарного объекта> <Унарный селектор>
14
<Бинарная форма> ::= <Описание бинарного объекта> <Бинарный селек тор> <Описание унарного объекта>
<Форма с ключевыми словами> ::= <Описание бинарного объекта> {<Пер вичная форма> <Описание бинарного объекта>}...
<Форма сообщения> ::= <Унарная форма> | <Бинарная форма> | <Форма с ключевыми словами>
<Форма сцепленных сообщений> ::= <Форма сообщения> { ; <Унарный селектор> | <Бинарный селектор> <Описание унарного объекта> | {<Ключевое слово> <Описание бинарного объекта>}...}...
<Форма> ::= [ <Переменная> := ]... {<Первичная форма> | <Форма сообще ния> | <Форма сцепленных сообщений>}
<Текст> ::= [^ <Форма> | <Форма> ]... | <Текст> [ , <Текст> ]...
<Блок> ::= < [ > [ {: <Переменная> } ... <|> ][ <Текст> ] < ] > <Временные переменные> ::= <|> <Переменная> ... <|> <Схема сообщения> ::= <Унарный селектор> | <Бинарный селектор>
<Переменная> | {<Ключевое слово> <Переменная>}...
<Метод> ::= <Схема сообщения> [<Временные переменные>] <Текст>
В вышеприведенных примерах программ разобраны случаи использования условных конструкций и простого цикла. В этих и других конструкциях языка Smalltalk широко используются блоки. Для этого условный оператор и оператор цикла можно определить как методы, использующие так называемый оператор блока. Если оператор блока находится внутри программы, то создается экзем пляр класса BlockContext, и в нем накапливается вся необходимая информа ция для работы блока, однако оценка содержимого оператора блока при этом не выполняется. Чтобы она выполнилась, экземпляру класса Context необходимо послать сообщение value.
Оператором управления, реализуемым с помощью оператора блока, яв ляется и оператор while. Для двух целых чисел x, y он может быть реализован следующим образом:
| m x y | x := 5. y := 3. m := 0.
[x > 0] whileTrue: [m := m + y, x := x – 1].
Здесь оператору блока [x > 0] посылается сообщение whileTrue: [m := m + y, x := x – 1]. Вначале вычисляется значение получателя. Если оно равно false, то выполнение прекращается. Если оно равно true, то вначале вычисляется значение параметра whileTrue и затем вычисляется
15
значение условия. Работу цикла можно определить следующим рекурсивным методом:
whileTrue: block self value ifTrue:
[block value.
self whileTrue: block].
С помощью оператора блока можно организовать и цикл с перечислением. Например, для вычисления суммы четных чисел в диапазоне от 0 до 100 можно организовать следующий фрагмент с блоком:
| sum | sum := 0.
2 to: 100 by: 2 do: [ :each | sum := sum + each ].
Здесь to: stop by: step do: aBlock является методом класса Number, который оценивает блок для всего заданного интервалом и шагом множества чисел. Оператор блока содержит параметр :each, последователь но принимающий значения из указанного множества.
2.3 Описание классов объектов
Описание класса объектов включает заголовок вида:
<имя суперкласса> subclass: < имя класса>
instanceVariableNames: |
'<список имен переменных экземпляра>' |
classVariableNames: |
'<список имен переменных класса>' |
poolDictionaries: |
'<список общих словарей>' |
category: |
'имя категории' |
и совокупности описаний методов класса и методов экземпляра. Напомним, что методы класса вызываются посылкой сообщения имени класса, а методы экзем пляра – посылкой сообщения объекту (экземпляру) класса. Например, описание класса автобусов может иметь вид:
Object subclass: #AutoBus instanceVariableNames:
'speed path timeCtrl timePre ' classVariableNames:
'TotalCount ' poolDictionaries: '' category: 'Samples'
16
Здесь Object – имя родительского класса, #AutoBus – имя нового клас са как константа типа слово.
Структура описания метода имеет следующий вид:
<схема сообщения> " комментарий "
| список временных переменных метода | <оператор>
. . . . . . . . . .
<оператор>
Схема сообщения содержит имя метода и необходимые параметры. Если параметров нет, то используется унарный селектор – имя метода, если параметр один или больше одного, то перечень ключевых слов (смотри описание синтак сиса). В любом случае первое слово всегда определяет имя метода. Например, порождение нового экземпляра автобуса и учет их общего количества может выполняться методом класса
new
"Создание и инициализация нового экземпляра автобуса" super new initialize.
TotalCount := TotalCount + 1
Инициализация переменных только что созданного автобуса выполняется мето дом экземпляра
initialize
"Установка переменных экземпляра" path:=0.
speed:=0.
timePre:=0.
timeCtrl:=0
Выпуск экземпляра на линию можно смоделировать методом экземпляра
start: aSpeed
"Выпустить на линию автобус со скоростью aSpeed в текущий момент времени, задаваемый глобальной пере менной SysTime "
speed := aSpeed. timePre := SysTime. timeCtrl := SysTime
17