Учебные материалы АОИС часть 1 / part_1 / Теория / АОИС1
.pdfнекоторых реализациях вы можете также изменить синтаксис языка или способ работы сборщика мусора.
Динамическая типизация — это означает, что вы не указываете типы переменных в программе, что делает язык гораздо лаконичней. (Как объяснено выше, является ли операция правильной, определяет объектполучатель, а не компилятор).
Model-view-controller (MVC) шаблон структуры пользовательского интерфейса. (В последнее время используют и другие концепции реализации пользовательского интерфейса – например, Morphic в Squeak и Pollock в VisualWorks).
Dynamic translation: современные коммерческие виртуальные машины компилируют байткоды в машинные коды для быстрого выполнения.
Smalltalk также использует другие современные идеи:
Сборка мусора встроена в язык и незаметна разработчику.
Программы Smalltalk’а обычно компилируются в байткоды и выполняются виртуальной машиной (ВМ), что позволяет выполнять их на любом оборудовании, для которого существует ВМ.
Одной из неожиданных особенностей Smalltalk’а является то, что традиционные конструкции: if-then-else, for, while, и т. д. не являются частью языка. Все они реализованы с помощью объектов. Например, решение принимается с помощью посылки сообщения ifTrue: логическому объекту, и передаѐт управление фрагменту текста если логическое значение истинно. Есть всего три конструкции:
посылка сообщения объекту;
присваивание объекта переменной;
возвращение объекта из метода; и несколько синтаксических конструкций для определения объектовлитералов и временных переменных.
Чтобы лучше понять, как работает механизм обмена сообщениями, можно представить каждый объект как веб-сервер, отвечающий на запросы. При этом, на запросы можно просто выдавать заранее предопределѐнный ответ, аналог этому – выдача веб-страницы, расположенной по определѐнному пути; можно перенаправить запрос-сообщение другому объекту, аналог – прокси-сервер; изменить запрос по определѐнным правилам, аналог – техника url rewriting. Если для реакции на сообщение нет предопределѐнного метода, то вызывается метод #doesNotUnderstand:, так же, как веб-сервер открывает страницу с сообщением об ошибке, если задан несуществующий путь к веб-странице.
Следующий пример, показывающий нахождение гласных в строке, иллюстрирует стиль Smalltalk’а. Символ | определяет переменные, : определяет параметры, а символы [ и ] можно, для начала, воспринимать, как аналог фигурных скобок { и } в С-подобных языках:
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].
В последней строке посылается сообщение select: с аргументом (блоком кода). При этом вызывается метод select: из класса Collection (одного из предков класса String). Текст этого метода показан ниже:
select: aBlock
| newCollection |
newCollection := 1/>self species new. 1/>self do: [:each |
(aBlock value: each)
ifTrue: [newCollection add: each]]. ^newCollection
Он осуществляет перебор своих элементов (это метод do:), выполняя переданный ему блок aBlock для каждой буквы; когда блок выполняется (в примере – aCharacter isVowel), он создаѐт логическое значение, которому затем посылается ifTrue:. Если это значение true, то буква добавляется в возвращаемую строку. Из-за того что select: определѐн в абстрактном классе Collection, мы также можем использовать его так:
| rectangles aPoint|
rectangles := OrderedCollection
with: (Rectangle left: 0 right: 10 top: 100 bottom: 200) with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).
aPoint := Point x: 20 y: 20.
collisions := rectangles select: [:aRect | aRect containsPoint: aPoint].