Smalltalk

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:20, 8 июня 2016.
Smalltalk
fraimed
Парадигма объектно-ориентированный
Спроектировано Алан Кэй, Адель Голдберг, Дэн Ингаллс
Печать дисциплины строгая, динамическая
OS UNIX, Linux, Windows, FreeBsd и другие
Портал: http://c2.com/cgi/wiki?SmalltalkLanguage
Главная реализация
Amber, Dolphin Smalltalk, GemStone/S, GNU Smalltalk, Pharo, Smalltalk/X, VisualWorks

Smalltalk - (произносится smɔːl tɔːk) - объектно-ориентированный язык программирования, который был разработан в Xerox PARC. Как интегрированная среда, он устраняет различие между языком программирования и операционной системой. Это также позволяет настраивать свой пользовательский интерфейс и поведение. Smalltalk был первым объектно-ориентированный язык программирования, который стал популярным. Первоначально он был использован для создания прототипов простых языков программирования и графических интерфейсов, которые так популярны сегодня. Smalltalk был сначала работал на компьютере Alto компании Xerox, которая была разработана для нее. В 1980 году Smalltalk-80 был лицензирован Tektronix, Apple, HP и TI для внутреннего использования. Первый коммерческий релиз Smalltalk был Methods из Digitalk в 1983 году, которая позже превратилась в Visual Smalltalk. В 1997 году, Smalltalk стал ANSI стандартом (X3J20).

Определения, обозначения и понятия

Объекты

В Smalltalk все является объектами. Объекты могут быть такими простыми, как число, символ, сложными, как графикак, которая отображается, окна, диалоги или целые приложения. В Smalltalk нет таких вещей, как "встроенные" типы или классы, к которым приходится относиться по-другому, которые ведут себя не так, как другие объекты по отношению к посылке сообщений, наследованию или отлаживаемость.

Сообщения и протокол

Объекты общаются посылкой сообщений другим объектам. В других языках это иногда называется "вызовом виртуальной функции", "витртуальной функцией" или даже "функцией". Эти названия сбивают с толку и в математическом смысле не являются верными. Мы поэтому будем использовать сообщения для запроса операции по имени и, как мы увидим позже, термин "метод" для кода, который будет выполнять операцию.

Классы и экземпляры

Так как существует много объектов, которые разделяют один и тот же протокол, Smalltalk группирует подобные объекты в классы. Каждый объект является экземпляром некоторого класса, а экземпляры того же самого класса имеют тот же самый протокол, хотя каждый может иметь разное внутреннее состояние. Это не подразумевает, что экземпляры различных классов должны реализовывать различные протоколы. В действительности, существуют классы в системе (числовые классы, классы коллекций), которые реализуют общий протокол, но реализованы совершенно по-разному внутри. Это называется полиморфизмом.

Smalltalk - объектно-ориентированный язык программирования, основанный на классах.

В Smalltalk каждый объект является экземпляром класса, это класс, который описывает поведение своих экземпляров, определяя протокол и то, как экземпляры реагируют на сообщения. Smalltalk разрешает доступ к этому классу во время выполнения и собирать информацию из этого класса. Это называется рефлекцией.

Так как Smalltalk является чистым объектно-ориентированным языком, этот класс также является объектом, поэтому отвечаетна набор сообщений, который называется протоколом метакласса.

Методы

Когда сообщения посланы объекту, соответствующее действие должно быть выполнено - технически участок кода должен быть выполнен. Этот участок кода называется методом.

Наследование

В Smalltalk, как и в других объектно-ориентированных языках, классы организованы в дерево. Каждый класс имеет суперкласс и называется подклассом своего суперкласса.

Переменные экземпляра

Объект может содержать внутреннее состояние, также называемое атрибутами. В Smalltalk это состояние обычно состоит из ссылок на другие объекты. Слоты, которые содержат ссылки, называются переменными экземпляра.

Метаклассы

Так как Smalltalk является чистым объектно-ориентированным языком программирования, все в мире Smalltalk является объектом. Это подразумевает, что поведение каждого объекта определяется своим классом. Это верно для самих классов. В системе Smalltalk они являются такими же, как и другие объекты, и из протокол определен классами классов. Эти классы классов называются метаклассами.

Абстрактные классы

Абстрактные классы - классы, которые не могут создавать экземпляры. Их целью является предоставление общей функциональности для своих подклассов. В Smalltalk самый очевидный абстрактный класс - Object-Class, который предоставляет богатый протокол, который является полезным для всех разновидностей объектов (сравнение, механизм зависимостей, рефлексия и другие).

Синтаксис языка Smalltalk

Пробелы и размещение программы

Синтаксис Smalltalk обладает свободным форматом. Пробелы и разделители строк могут быть добавлены в программу на Smalltalk без изменения значения, исключая следующее:

  • внутру идентификатора (то есть имя переменной);
  • внутри числовой константы;
  • внутри некоторых таких составных лексем, как wоператор присваивания ":=".

Комментарии

В Smalltalk комментарием является все, что заключено в двойные кавычки ("). Комментарий может быть многострочным. Примеры:

    "некоторый комментарий"

    "это
     многострочный
     комментарий"

    "
     другой многострочный комментарий
    "

Литеральные константы

Литеральные константы в исходном коде Smalltalk обрабатываются компилятором, который создает соответствующие объекты во время компиляции и помещает ссылки на эту константу в сгенерированный код. Следующие типы литеральных констант разрешены:

  • Целые числа:
           6, 
           -1, 
           12345678901234567890
  • Числа с плавающей точкой:
          1.234, 
          1e10, 
          1.5e15
  • Числа с фиксированной точкой:
         1.234s4, 
         10s4
  • Булевые константы:
         true, false
  • Строковые константы:
         'foo',
         'a long string constant'
  • Символьные константы:
          #'bar', 
          #'++', 
          #'foo bar baz'
  • Константы-массивы:
         #(1 #two #(3 4) #( #(5 6) 7) )
  • Байтовые массивы:
         #[0 1 2 3 4]

Идентификаторы

Идентификаторы (имена переменных) определяют переменные. В Smalltalk переменная содержит ссылку на некоторый объект.

Соглашения

По соглашению идентификаторы, записанные в верхнем регистре, используются для глобальных и классовых переменных. Переменные экземпляра, аргументы и локальные переменные следует начинать с символа в нижнем регистре. Вы смутите других программистов на Smalltalk, если не будете следовать этому правилу.

Особые идентификаторы (встроенные имена)

  • nil - единственный экземпляр класса UndefinedObject.
  • true и false - 2 булевых значения истинности.
  • self - получатель в методе.
  • super - суперкласс.
  • thisContext - объект stackFrame текущего исполняемого метода или блока как объекта. Содержит получателя,селектора сообщения, аргументы и локальные переменные.
  • here - здесь.

Сообщения

Сообщение состоит из трех частей:

  • получатель;
  • имя, называемое селектором;
  • необязательные аргументы.

Унарные сообщения Messages

Сообщения без аргументов называются унарными. Имя унарного сообщения, селектор сообщения, состоит из одного слова из букв, цифр или символа нижнего подчеркивания. Первый символ не может быть цифрой.

Пример:

    1 negative

посылает сообщения "negative" числу 1, которое является получателем сообщения.

Сообщения с ключевым словом

Этот тип сообщения позволяет передавать аргументы в сообщение. Сообщение с ключевым словом состоит из одного или более ключевых слов, за каждым из которых следует аргумент. Каждое ключевое слова - это имя, в котором первый символ следует писать в нижнем регистре по соглашениям оформления кода, и двоеточие, которое следует за именем. Аргументы могут быть литеральными константами, переменными или выражениями сообщений (должны быть сгруппированы, используя скобки, другие сообщения с ключевым словом используются как аргументы для вычисления результата).

Например, в сообщении:

    5 between:3 and:8

"between:" и "and:"являются ключевыми словами, числа 3 и 8 - аргументы, а число 5 - получатель сообщения.

Унарные сообщения имеют более высокий приоритет, чем сообщения с ключевым словом.

Бинарные сообщения

Бинарное сообщение принимает 1 аргумент. Его селектор сформирован из одного или двух специальных символов, которые не являются ни числами, ни буквами. Такие символы, фигурные, круглые скобки или точка, не могут быть использованы в качестве бинарных селекторов. Бинарные сообщения обычно используются для арифметических операций. Тем не менее, это не является обязательным для системы; смысловое значение не известно компилятору в Smalltalk,а бинарные сообщения могут быть определены и использованы для любого класса и любой операции.

Примером бинарного сообщения является реализация арифметического сложения для числовых получателей (оно реализовано в классах Number):

    1 + 5

Это интерпретируется как сообщение, посланное объекту 1 с селектором '+' и одним аргументом, объектом 5.

Бинарные сообщения анализируются слева направо.

Кратко о синтаксисе сообщений

Для кого-то синтаксис сообщений Smalltalk может показаться странным поначалу. Например, рассмотрим приказ человеку по имени "tom" послать сообщение по электронной почте человеку по имени "jane" (предполагается, что tom, jane, theEmail ссылаются на объекты):

Английский язык Smalltalk Java/C++
tom, send an email to jane. tom sendEmailTo: jane. tom.sendEmail(jane); tom->sendEmail(jane);
tom, send theEmail to jane. tom send: theEmail to: jane. tom.sendEmail(theEmail, jane); tom->sendEmail(theEmail, jane);

Переменные

Глобальные переменные

В Smalltalk переменная содержит ссылку на некоторый объект - мы говорим, что переменная "привязана" к некоторому объекту.

Глобальные переменные содержат ссылки на объекты, которые представляют общий интерес, на большинство классов можно ссылаться как на глобальную переменную. Кроме классов немного других объектов привязаны к глобальной области видимости, самые интересные для нас это:

  • Transcript - ссылается на окно, которое может быть использовано, чтобы посылать сообщения с информацией пользователю.
  • Smalltalk - ссылается сам на набор привязок глобальных переменных. Он отвечает за сообщения, добавление, удаление, запрос к глобальным переменным. Также аргументы командной строки, языковые параметры и некоторые другие конфигурационные параметры доступны через этот объект.
  • Stdin, Stdout and Stderr - ссылаются на стандартный ввод, вывод и поток ошибок. Они обычно используются в приложения без графического интерфейса, которые имеют дело с этими потоками ввода/вывода. В приложениях с графическим интерфейсом ввод/вывод в Smalltalk обычно выполняется через Transcript или специализированные окна Workspace.

Переменные классов, экземпляры классов, переменные экземпляров классов и разделяемые пулы

Эти переменные имеют видимость, которая ограничена классом, его подклассами или группой классов.

Переменная класса - одна ячейка, которая видима и разделяется классом и всеми его подклассами.

Переменная экземпляра класса определена в классе как слот класса-объекта и наследуется подклассами. Однако каждый объект класса имеет свой собственный закрытый слот. Это очень похоже на определение переменной экземпляра, которая также определена в одном месте и потом наследуется подклассами. Но каждый индивидуальный экземпляр имеет, возможно, различные значения в ней.

"Разделяемый пул" - это коллекция привязок переменных, которые видимы более чем одному классу. Пул сам по себе определяет имена переменных, которые он содержит, и предоставляет код инициализации набору начальных значений. Затем другие классы могут "подключиться" к пулу, что делает эти переменные видимыми внутри класса. Переменные пула являются доступными только для чтения для всех мест за пределами SharedPool.

Переменные экземпляра

Переменные экземпляра являются закрытыми для некоторого объекта, а их время жизни - время жизни объекта.

Локальные переменные

Объявление локальной переменной состоит из открытия символа '|' (вертикальная черта), списка идентификаторов и закрывающего '|'. Он должен быть помещен перед любым выражением в пределах кода. Например:

    | foo bar baz |

объявляет 3 локальные переменные с именами 'foo', 'bar' и 'baz'.

Время жизни локальных переменных ограничено временем активности окружающего контекста - обычно метод или блок.

Присваивание значения переменной

Переменная "привязывается" к (сделано, чтобы ссылаться) объекту выражением присваивания.

Предполагая, что "foo" и "bar" были объявлены как переменные до этого, вы можете присвоить значение следующим образом:

    foo := 1

или:

    bar := 'hello world'

Множественное присваивание разрешается:

    foo := bar := baz := 1

Операторы контроля потока

Smalltalk не имеет ключевых слов! Вместо этого каждый оператор контроля потока выполняется, используя сообщение.

Оператор "If"

    (x < y) ifTrue: [   "в Smalltalk"
      max := y.
      i := j
    ] ifFalse: [
      max := x.
      i := k
    ]

Оператор "While"

    [i < 100] whileTrue: [
      sum := sum + i.
      i := i + 1
    ]

Оператор "For"

    1 to: n do: [ :i |
      sum := sum + i.
    ]

Оператор "Return"

    ^ i+3         "в Smalltalk"

Ссылки

  1. http://encyclopedia2.thefreedictionary.com/SmallTalk+programming+language
  2. http://web.cecs.pdx.edu/~harry/musings/SmalltalkOverview.html
  3. http://live.exept.de/doc/online/english/getstart/tut_2.html