SmallTalk

Oct 04, 2007 20:19

Давно хотел попрограммировать на SmallTalk. Наконец нашёл время. Я установил Squeak -- популярную ныне реализацию SmallTalk и приступил.



SmallTalk -- полностью объектно-ориентированный язык с динамической типизацией. Код обычно выполняется под управлением виртуальной машины. Присутствует сборщик мусора.

Расскажу о некоторых любопытных вещах.

В SmallTalk взаимодействие с объектами осуществляется через передачу сообщений. Сообщения могут быть унарными или бинарными операторами или именованными методами. Сообщения имеют разный приоритет. В порядке убывания приоритета: унарные операторы, бинарные операторы, методы. Сообщения одной категории равноприоритетны. Поэтому, например, выражение 2 + 3 * 4 будет равно 24, а не 14, как можно было бы ожидать. Целые числа также являются объектами.

Циклы и условные операторы реализованы не в виде специальных языковых конструкций, а в виде вызовов методов. Например, объект класса Boolean, имеет метод ifTrue. В качестве аргумента методу передаётся объект-функция, которая будет выполнена только в том случае, если объект представляет значение true:

(1 < 2) ifTrue ["do something"]
Даже подкласс создаётся путём вызова метода subclass класса родителя! Например, объявим наследника класса Object:

Object subclass: #MyClass
subclass -- метод, а #MyClass -- строковый параметр, содержащий имя нового класса.

Методы внутри класса группируются в так называемые протоколы. Протокол не надо указывать при вызове метода, он не влияет на область видимости, зато позволяет организовать методы в классе. Например, в классе Object, базового для почти всех других классов (базовый совершенно для всех классов -- ProtoObject), содержится 400 методов!

Оригинально выглядит передача параметров в метод. Например, у коллекций с произвольным доступом (класс SequenceableCollection) есть метод, сигнатура которого выглядит следующим образом:

SequenceableCollection >> replaceFrom: start to: stop with: replacement
где start, stop и replacement -- параметры. Вызов такого метода у некоторого массива целых чисел мог бы выглядеть так:

someIntegerArray replaceFrom: 1 to: 5 with 7.
Все поля объектов имеют видимость protected, а методы -- public.

Если в теле метода не указано явно возвращаемое значение, то неявно возвращается объект, которому этот метод принадлежит.

В SmallTalk классы это тоже объекты. Вызовы методов класса (статических методов) диспетчеризуются динамически. Поэтому, например, возможно создание класса синглтона, синглетность которого бы наследовалась. Попробуйте такое реализовать на C++ или Java!

Язык имеет минимальный набор синтаксических конструкций, минимальное количество правил. Но при этом имеет крайне широкие возможности, недоступные в других. Правда, в России мне не попадалась на глаза ни одна вакансия, где бы приветствовалось его знание. В Европе и США иначе.

программирование

Previous post Next post
Up