Smalltalk
Genius lies in simplicity
История Smalltalk
● Был создан группой исследователей возглавляемой
  Аланом Кэйем в исследовательском центре Xerox
  PARC.
● Smalltalk-71 - первая реализация, разработанная за
  несколько месяцев.
● Более поздняя версия, действительно использованная
  для исследовательской работы, известна сейчас как
  Smalltalk-72
● После существенных переработок, которые
  зафиксировали несколько сторон семантики
  выполнения для увеличения эффективности, была
  создана версия известная как Smalltalk-76
● Smalltalk80 - теперь "всё - объекты!"
Smalltalk - настоящий ООП язык

● Объект - базовая единица объектно-ориентированной
  системы.
● Объекты могут обладать состоянием.
● Посылка сообщения - единственный способ обмена
  информацией между объектами.
Message passing vs. method
invocation
Обе операции состоят из двух основных этапов:
 ● поиск метода (method lookup)
 ● вызов метода (method invocation)

Статическая система: первый этап выполняется
компилятором при трансляции исходного кода в машинное
представление.

Динамическая система: оба этапа выполняются на стадии
выполнения программы.
Основные идеи

● Все является объектами
● Все доступно для изменения
● Динамическая типизация
● Сборка мусора встроена в язык и незаметна
  разработчику
● Программы Smalltalk обычно компилируются в байткоды
  и выполняются виртуальной машиной (ВМ), что
  позволяет выполнять их на любом оборудовании, для
  которого существует ВМ.
FAIL



       Date date = new Date();
Лексические особенности

"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo

:= //Means assignment
= //Means equality comparison
== //Means identity comparison

#(1 2 3 4 5)

'string1', 'string2'
Ключевые слова повсюду

t->rotate (a, v); //For C++
t.rotate (a, v); //For Java

Transformation t;
float a;
Vector v;

SmallTalk:
|t a v|

Хороший стиль:
| aTransformation angle aVector |
Genius lies in simplicity



          t.rotate (a, v); //Original
          t rotate (a, v); //Who needs dot?
          t rotate a, v; //Who needs brackets?
Genius lies in simplicity



      t rotate by a around v; //Who needs commas?
Genius lies in simplicity



      t rotate by: a around: v; //Who needs ambiguity?
      t rotateBy: a around: v //This is Smalltalk
Определение метода

rotateBy: angle around: vector
 | result |
 result := COMPUTE ANSWER.
 ^result
Определение класса

Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples'
Условные операторы

a negative | (b between: c and: d)
 ifTrue: [a := c negated]
Арифметика

Все действия имеют одинаковый приоритет:
1+2*3 is 9
1+(2*3) is 7
; не .

Вместо:
 account deposit: 100 dollars;
 collection add: transformation;
Следует писать:
 account deposit: 100 dollars. "dollars - это метод!"
 collection add: transformation.
Genius lies in simplicity

Вместо
|p|
p := Client new.
p name: 'Jack'.
p age: 32.
p address: 'Earth'.
можно писать
|p|
p := Client new
  name: 'Jack';
  age: 32;
  address: 'Earth'.
Одинаковые имена методов доступа
и свойств объекта
C++:
long getAge () {return age;}
void setAge (long newAge) {age = newAge;}
Java:
long age () {return age;}
void age (long newAge) {age = newAge;}

SmallTalk:
age ^age
age: newAge age := newAge
Головоломка:
age age age: age age + age age
Использование коллекций

|ab|
a := OrderedCollection new
  add: #red;
  add: #green;
  yourself.
b := Dictionary new
  at: #red put: #rouge;
  at: #green put: #vert;
  yourself.
Синтаксис цикла

a do: [:item |
 USE item FOR SOMETHING].
b do: [:item |
 USE item FOR SOMETHING].

anAirplane passengers do: [:person |
 person age <= 12
  ifTrue: [..DO SOMETHING with person..]]

c := clients select: [:client | client netWorth > 500000]. "Очень
богатые клиенты"
d := clients collect: [:client | client name]. "имена клиентов"
Переменные функций

a = f (x) {return x + 1;} //C-Like syntax
a := [:x | x + 1]    //Smalltalk syntax

Smalltalk

  • 1.
  • 2.
    История Smalltalk ● Былсоздан группой исследователей возглавляемой Аланом Кэйем в исследовательском центре Xerox PARC. ● Smalltalk-71 - первая реализация, разработанная за несколько месяцев. ● Более поздняя версия, действительно использованная для исследовательской работы, известна сейчас как Smalltalk-72 ● После существенных переработок, которые зафиксировали несколько сторон семантики выполнения для увеличения эффективности, была создана версия известная как Smalltalk-76 ● Smalltalk80 - теперь "всё - объекты!"
  • 3.
    Smalltalk - настоящийООП язык ● Объект - базовая единица объектно-ориентированной системы. ● Объекты могут обладать состоянием. ● Посылка сообщения - единственный способ обмена информацией между объектами.
  • 4.
    Message passing vs.method invocation Обе операции состоят из двух основных этапов: ● поиск метода (method lookup) ● вызов метода (method invocation) Статическая система: первый этап выполняется компилятором при трансляции исходного кода в машинное представление. Динамическая система: оба этапа выполняются на стадии выполнения программы.
  • 5.
    Основные идеи ● Всеявляется объектами ● Все доступно для изменения ● Динамическая типизация ● Сборка мусора встроена в язык и незаметна разработчику ● Программы Smalltalk обычно компилируются в байткоды и выполняются виртуальной машиной (ВМ), что позволяет выполнять их на любом оборудовании, для которого существует ВМ.
  • 6.
    FAIL Date date = new Date();
  • 7.
    Лексические особенности "this isa comment" 'this is a string' #'this is a symbol' #thisIsASymbolToo := //Means assignment = //Means equality comparison == //Means identity comparison #(1 2 3 4 5) 'string1', 'string2'
  • 8.
    Ключевые слова повсюду t->rotate(a, v); //For C++ t.rotate (a, v); //For Java Transformation t; float a; Vector v; SmallTalk: |t a v| Хороший стиль: | aTransformation angle aVector |
  • 9.
    Genius lies insimplicity t.rotate (a, v); //Original t rotate (a, v); //Who needs dot? t rotate a, v; //Who needs brackets?
  • 10.
    Genius lies insimplicity t rotate by a around v; //Who needs commas?
  • 11.
    Genius lies insimplicity t rotate by: a around: v; //Who needs ambiguity? t rotateBy: a around: v //This is Smalltalk
  • 12.
    Определение метода rotateBy: anglearound: vector | result | result := COMPUTE ANSWER. ^result
  • 13.
    Определение класса Object subclass:#MessagePublisher instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Smalltalk Examples'
  • 14.
    Условные операторы a negative| (b between: c and: d) ifTrue: [a := c negated]
  • 15.
    Арифметика Все действия имеютодинаковый приоритет: 1+2*3 is 9 1+(2*3) is 7
  • 16.
    ; не . Вместо: account deposit: 100 dollars; collection add: transformation; Следует писать: account deposit: 100 dollars. "dollars - это метод!" collection add: transformation.
  • 17.
    Genius lies insimplicity Вместо |p| p := Client new. p name: 'Jack'. p age: 32. p address: 'Earth'. можно писать |p| p := Client new name: 'Jack'; age: 32; address: 'Earth'.
  • 18.
    Одинаковые имена методовдоступа и свойств объекта C++: long getAge () {return age;} void setAge (long newAge) {age = newAge;} Java: long age () {return age;} void age (long newAge) {age = newAge;} SmallTalk: age ^age age: newAge age := newAge Головоломка: age age age: age age + age age
  • 19.
    Использование коллекций |ab| a :=OrderedCollection new add: #red; add: #green; yourself. b := Dictionary new at: #red put: #rouge; at: #green put: #vert; yourself.
  • 20.
    Синтаксис цикла a do:[:item | USE item FOR SOMETHING]. b do: [:item | USE item FOR SOMETHING]. anAirplane passengers do: [:person | person age <= 12 ifTrue: [..DO SOMETHING with person..]] c := clients select: [:client | client netWorth > 500000]. "Очень богатые клиенты" d := clients collect: [:client | client name]. "имена клиентов"
  • 21.
    Переменные функций a =f (x) {return x + 1;} //C-Like syntax a := [:x | x + 1] //Smalltalk syntax