Давно хотел попрограммировать на
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!
Язык имеет минимальный набор синтаксических конструкций, минимальное количество правил. Но при этом имеет крайне широкие возможности, недоступные в других. Правда, в России мне не попадалась на глаза ни одна вакансия, где бы приветствовалось его знание. В Европе и США иначе.