Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Smalltalk является объектно-ориентированным , динамически типизированным отражательным языком программирования . Smalltalk был создан как язык, лежащий в основе «нового мира» вычислений, примером которого является «симбиоз человека и компьютера». [2] Он был разработан и создан в рамках для образовательного использования, в частности , для конструктивистского обучения , в исследовательской группы обучения (LRG) из Xerox PARC по Алан Кей , Дэн Ingalls , Адель Голдберг , Тед Kaehler , Диана Мерри , Скотт Уоллес и другие в 1970-е годы.

Впервые язык был выпущен как Smalltalk-80. Языки, подобные Smalltalk, активно развиваются и собрали вокруг себя лояльные сообщества пользователей. ANSI Smalltalk был ратифицирован в 1998 году и представляет собой стандартную версию Smalltalk. [3]

Smalltalk занял второе место в рейтинге «Самый любимый язык программирования» в опросе разработчиков Stack Overflow в 2017 году [4], но не вошел в число 26 самых любимых языков программирования в опросе 2018 года. [5]

История [ править ]

Существует большое количество вариантов Smalltalk. [6] Некорректное слово Smalltalk часто используется для обозначения языка Smalltalk-80, первой версии, которая стала общедоступной и была создана в 1980 году. Первыми аппаратными средами, на которых выполнялись виртуальные машины Smalltalk, были компьютеры Xerox Alto .

Smalltalk был продуктом исследований под руководством Алана Кея в Xerox Palo Alto Research Center (PARC); Алан Кей разработал большинство ранних версий Smalltalk, Адель Голдберг написала большую часть документации, а Дэн Ингаллс реализовал большинство ранних версий. Первая версия, получившая название Smalltalk-71, была создана Кей за несколько утра, сделав ставку на то, что язык программирования, основанный на идее передачи сообщений, вдохновленной Simula, может быть реализован на «странице кода». [2] Более поздний вариант, используемый для исследовательской работы, теперь называется Smalltalk-72 и повлиял на развитие модели Actor . Его синтаксис и модель выполнения сильно отличались от современных вариантов Smalltalk.

После значительных изменений, которые заморозили некоторые аспекты семантики выполнения для увеличения производительности (путем принятия модели наследования классов, подобной Simula ), был создан Smalltalk-76. В этой системе была среда разработки с большинством уже знакомых инструментов, включая браузер / редактор кода библиотеки классов. Smalltalk-80 добавил метаклассы , чтобы помочь поддерживать парадигму «все является объектом» (кроме переменных частного экземпляра) путем связывания свойств и поведения с отдельными классами и даже примитивами, такими как целочисленные и логические значения (например, для поддержки различных способов создать экземпляры).

Smalltalk-80 был первым языковым вариантом, доступным за пределами PARC, сначала как Smalltalk-80 Version 1, предоставленным небольшому количеству фирм ( Hewlett-Packard , Apple Computer , Tektronix и Digital Equipment Corporation (DEC)) и университетам ( UC Berkeley ) для экспертной оценки и внедрения на своих платформах. Позже (в 1983 г.) была выпущена общедоступная реализация под названием Smalltalk-80 Version 2 в виде образа (платформенно-независимый файл с определениями объектов) и спецификации виртуальной машины . ANSI Smalltalk является стандартным справочником по языку с 1998 года [7].

Два из популярных в настоящее время вариантов реализации Smalltalk являются потомками исходных образов Smalltalk-80. Squeak - это реализация с открытым исходным кодом, полученная из Smalltalk-80 версии 1 посредством Apple Smalltalk. VisualWorks является производным от Smalltalk-80 версии 2 посредством Smalltalk-80 2.5 и ObjectWorks (оба продукта ParcPlace Systems, дочерней компании Xerox PARC, созданной для вывода Smalltalk на рынок). В качестве интересного связующего звена между поколениями в 2001 году Василий Быков внедрил Hobbes, виртуальную машину, на которой запущен Smalltalk-80 внутри VisualWorks. [8] ( Дэн Ингаллс позже перенес Гоббса в Squeak.)

В период с конца 1980-х до середины 1990-х годов среды Smalltalk, включая поддержку, обучение и надстройки, продавались двумя конкурирующими организациями: ParcPlace Systems и Digitalk, базирующимися в Калифорнии. ParcPlace Systems имела тенденцию фокусироваться на рынке микросистем Unix / Sun, в то время как Digitalk сосредоточивалась на ПК на базе Intel, работающих под управлением Microsoft Windows или IBM OS / 2. Обе фирмы изо всех сил пытались сделать Smalltalk массовым из-за значительных потребностей Smalltalk в памяти, ограниченной производительности во время выполнения и первоначального отсутствия поддерживаемого подключения к реляционной базе данных на основе SQLсерверы. В то время как высокая цена ParcPlace Smalltalk ограничивала его проникновение на рынок средними и крупными коммерческими организациями, продукты Digitalk изначально пытались охватить более широкую аудиторию по более низкой цене. Первоначально IBM поддерживала продукт Digitalk, но затем в 1995 году вышла на рынок с продуктом Smalltalk под названием VisualAge / Smalltalk. Easel представила Enfin в это время для Windows и OS / 2. Enfin стал гораздо более популярным в Европе, поскольку IBM представила его в ИТ-магазинах до разработки IBM Smalltalk (позже VisualAge). Позже Enfin была приобретена Cincom Systems и теперь продается под названием ObjectStudio и является частью пакета продуктов Cincom Smalltalk.

В 1995 году ParcPlace и Digitalk объединились в ParcPlace-Digitalk, а затем в 1997 году переименовали его в ObjectShare, расположенный в Ирвине, Калифорния. ObjectShare ( NASDAQ : OBJS) торговался публично до 1999 года, когда он был исключен из листинга и ликвидирован. Объединенной фирме так и не удалось найти эффективный отклик на Java с точки зрения рыночного позиционирования, и к 1997 году ее владельцы стремились продать бизнес. В 1999 году Seagull Software приобрела лабораторию разработки Java ObjectShare (включая исходную группу разработчиков Smalltalk / V и Visual Smalltalk) и по-прежнему владеет VisualSmalltalk, хотя права на распространение продукта Smalltalk во всем мире остались за ObjectShare, который затем продал их Cincom . [9] VisualWorks был продан Cincomи теперь является частью Cincom Smalltalk. Cincom решительно поддерживает Smalltalk, выпуская несколько новых версий VisualWorks и ObjectStudio каждый год с 1999 года.

Cincom , GemTalk и Instantiations продолжают продавать среды Smalltalk. У IBM закончился жизненный цикл VisualAge Smalltalk, который в конце 1990-х решил поддержать Java, и с 2005 года его поддерживает Instantiations, Inc. [10], которая переименовала продукт в VA Smalltalk (VAST Platform) и продолжает использовать выпускать новые версии ежегодно. Реализация open Squeak имеет активное сообщество разработчиков, в том числе многие из оригинального сообщества Smalltalk, и недавно использовалась для предоставления среды Etoys в проекте OLPC , инструментария для разработки совместных приложений Croquet Project и приложения виртуального мира Open Cobalt. . GNU Smalltalkпредставляет собой свободную программную реализацию производной Smalltalk-80 от проекта GNU . Pharo Smalltalk - это ответвление Squeak, ориентированное на исследования и использование в коммерческих средах.

Существенным развитием, которое распространилось во всех средах Smalltalk с 2016 года, является растущее использование двух веб-фреймворков, Seaside и AIDA / Web , для упрощения создания сложных веб-приложений. Seaside вызвала значительный рыночный интерес: Cincom, Gemstone и Instantiations включили и расширили его.

Влияния [ править ]

Smalltalk был одним из многих объектно-ориентированных языков программирования, основанных на Simula . [11] Smalltalk также является одним из самых влиятельных языков программирования. Практически все появившиеся после этого объектно-ориентированные языки - Flavors , [12] CLOS , Objective-C , Java , Python , Ruby , [13] и многие другие - находились под влиянием Smalltalk. Smalltalk также был одним из самых популярных языков с гибкими методами , быстрым прототипированием и шаблонами программного обеспечения [14]сообщества. Высокопроизводительная среда, предоставляемая платформами Smalltalk, сделала их идеальными для быстрой итеративной разработки.

Smalltalk возник в результате более крупной программы исследований, финансируемых ARPA, которые во многом определили современный мир вычислений. Помимо Smalltalk, в 1960-х исследователями ARPA были разработаны рабочие прототипы таких вещей, как гипертекст , графический интерфейс, мультимедиа , мышь, телеприсутствие и Интернет. [15] [16] Алан Кей (один из изобретателей Smalltalk) также описал планшетный компьютер, который он назвал Dynabook, который напоминает современные планшетные компьютеры, такие как iPad. [17]

Среды Smalltalk часто были первыми, кто разработал то, что сейчас является общепринятыми шаблонами проектирования объектно-ориентированного программного обеспечения. Один из самых популярных - шаблон модель – представление – контроллер (MVC) для разработки пользовательского интерфейса . Шаблон MVC позволяет разработчикам иметь несколько согласованных представлений одних и тех же базовых данных. Он идеально подходит для сред разработки программного обеспечения, где существуют различные представления (например, отношение сущностей, поток данных, объектная модель и т. Д.) Одной и той же базовой спецификации. Кроме того, для симуляций или игр, в которых базовая модель может рассматриваться под разными углами и уровнями абстракции. [18]

В дополнение к шаблону MVC, язык и среда Smalltalk оказали большое влияние на историю графического пользовательского интерфейса (GUI), и пользовательский интерфейс « то, что вы видите, то и получаете» ( WYSIWYG ), редакторы шрифтов и метафоры рабочего стола для дизайна пользовательского интерфейса. . Мощные встроенные инструменты отладки и проверки объектов, поставляемые со средами Smalltalk, устанавливают стандарт для всех интегрированных сред разработки , начиная со сред Lisp Machine , появившихся позже. [19]

Объектно-ориентированное программирование [ править ]

Как и в других объектно-ориентированных языках, центральное понятие в Smalltalk-80 (но не в Smalltalk-72) - это понятие объекта . Объект всегда является экземпляром из класса . Классы - это «схемы», которые описывают свойства и поведение своих экземпляров. Например, класс окна графического интерфейса пользователя может объявлять, что окна имеют такие свойства, как метка, положение и то, является ли окно видимым или нет. Класс может также объявить, что экземпляры поддерживают такие операции, как открытие, закрытие, перемещение и скрытие. Каждый конкретный объект окна будет иметь свои собственные значения этих свойств, и каждый из них сможет выполнять операции, определенные его классом.

Объект Smalltalk может делать ровно три вещи:

  1. Состояние удержания (ссылки на другие объекты).
  2. Получите сообщение от себя или другого объекта.
  3. В процессе обработки сообщения отправляйте сообщения себе или другому объекту.

Состояние объекта всегда является частным для этого объекта. Другие объекты могут запрашивать или изменять это состояние только путем отправки запросов (сообщений) объекту для этого. Любое сообщение может быть отправлено любому объекту: когда сообщение получено, получатель определяет, подходит ли это сообщение. Алан Кей прокомментировал, что, несмотря на внимание, уделяемое объектам, обмен сообщениями является наиболее важной концепцией в Smalltalk: «Большая идея - это« обмен сообщениями »- вот в чем суть Smalltalk / Squeak (и это то, что никогда не было полностью завершено на этапе Xerox PARC) ". [20]

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

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

Поскольку все значения являются объектами, классы также являются объектами. Каждый класс является экземпляром метакласса этого класса. Метаклассы, в свою очередь, также являются объектами, и все они являются экземплярами класса, называемого Метаклассом. Блоки кода - способ выражения анонимных функций в Smalltalk - также являются объектами. [21]

Отражение [ править ]

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

Отражение также является признаком наличия метамодели, как это делает Smalltalk. Мета-модель - это модель, описывающая язык, и разработчики могут использовать метамодель для таких вещей, как просмотр, исследование и изменение дерева синтаксического анализа объекта или поиск всех экземпляров структуры определенного типа ( например, все экземпляры класса Method в метамодели).

Smalltalk-80 - это полностью отражающая система, реализованная в Smalltalk-80. Smalltalk-80 обеспечивает как структурное, так и вычислительное отражение. Smalltalk - это структурно отражающая система, структура которой определяется объектами Smalltalk-80. Классы и методы, определяющие систему, также являются объектами и полностью частью системы, которую они определяют. Компилятор Smalltalk компилирует текстовый исходный код в объекты методов, обычно экземплярыCompiledMethod. Они добавляются к классам, сохраняя их в словаре методов класса. Часть иерархии классов, которая определяет классы, может добавлять новые классы в систему. Система расширяется за счет запуска кода Smalltalk-80, который создает или определяет классы и методы. Таким образом, система Smalltalk-80 является «живой» системой, обладающей способностью расширяться во время выполнения.

Поскольку классы являются объектами, им можно задавать такие вопросы, как «какие методы вы реализуете?» или «какие поля / слоты / переменные экземпляра вы определяете?». Таким образом, объекты можно легко проверять, копировать, (де) сериализовать и т. Д. С помощью универсального кода, который применяется к любому объекту в системе. [22]

Smalltalk-80 также обеспечивает вычислительное отражение, возможность наблюдать вычислительное состояние системы. В языках, производных от оригинального Smalltalk-80, текущая активация метода доступна как объект, названный через псевдопеременную (одно из шести зарезервированных слов) thisContext,. Отправляя сообщения, thisContextметод активации может задавать вопросы типа «кто отправил мне это сообщение». Эти средства позволяют реализовать совместные подпрограммы или обратное отслеживание, подобное Prolog, без изменения виртуальной машины. Система исключений реализована с использованием этого средства. Одно из наиболее интересных применений этого метода - на берегу моря.веб-фреймворк, который избавляет программиста от сложности кнопки «Назад» в веб-браузере, сохраняя продолжения для каждой редактируемой страницы и переключаясь между ними, когда пользователь перемещается по веб-сайту. Затем программирование веб-сервера с помощью Seaside может быть выполнено с использованием более обычного стиля программирования. [23]

Примером того, как Smalltalk может использовать отражение, является механизм обработки ошибок. Когда объекту отправляется сообщение, которое он не реализует, виртуальная машина отправляет объекту doesNotUnderstand:сообщение с повторением сообщения в качестве аргумента. Сообщение (другой объект, экземпляр Message) содержит селектор сообщения и один Arrayиз его аргументов. В интерактивной системе Smalltalk реализация по умолчанию doesNotUnderstand:- это та, которая открывает окно с ошибкой (средство уведомления), сообщающее об ошибке пользователю. Благодаря этому и средствам отражения пользователь может исследовать контекст, в котором произошла ошибка, переопределить код нарушения и продолжить работу внутри системы, используя средства отражения Smalltalk-80. [24] [25]

Создав класс, который понимает (реализует) только doesNotUnderstand :, можно создать экземпляр, который может перехватывать любое сообщение, отправленное ему через его метод doesNotUnderstand:. Такие экземпляры называются прозрачными прокси. [26] Такие прокси-серверы могут затем использоваться для реализации ряда средств, таких как распределенный Smalltalk, при котором сообщениями обмениваются между несколькими системами Smalltalk, интерфейсы баз данных, где объекты явно извлекаются из базы данных, обещания и т. Д. На дизайн распределенного Smalltalk повлиял такие системы как CORBA .

Синтаксис [ править ]

Синтаксис Smalltalk-80 довольно минималистичен, основан только на нескольких объявлениях и зарезервированных словах. На самом деле, только шесть «ключевые слова» зарезервированы в Smalltalk: true, false, nil, self, super, и thisContext. Это правильно названные псевдопеременные , идентификаторы, которые следуют правилам для идентификаторов переменных, но обозначают привязки, которые программист не может изменить. Псевдопеременные true, falseи nilявляются одноэлементными экземплярами. selfи superобращаться к получателю сообщения в методе, активированном в ответ на это сообщение, но отправляемомsuperищутся в суперклассе класса, определяющего метод, а не в классе получателя, что позволяет методам в подклассах вызывать методы с тем же именем в суперклассах.thisContextотносится к текущей записи активации. Единственные встроенные языковые конструкции - это отправка сообщений, присваивание, возврат метода и буквальный синтаксис для некоторых объектов. Изначально как язык для детей всех возрастов, стандартный синтаксис Smalltalk использует знаки препинания больше похожими на английский, чем на основные языки программирования. Остальная часть языка, включая управляющие структуры для условной оценки и итерации, реализована поверх встроенных конструкций стандартной библиотекой классов Smalltalk. (Из соображений производительности реализации могут распознавать и обрабатывать некоторые из этих сообщений как особые; однако это всего лишь оптимизация и не встроена в синтаксис языка.)

Поговорка «Синтаксис Smalltalk подходит для открытки » относится к фрагменту кода Ральфа Джонсона , демонстрирующего все основные стандартные синтаксические элементы методов: [27]

exampleWithNumber:  x  | y |  правда  и  ложь  не  & ( ноль  isNil ) ifFalse: [ самостоятельной  остановки ] .  y  : =  собственный  размер  +  супер  размер .  # ( $ a  #a  'a'  1  1.0 )  do: [ : each  |  Расшифровка стенограммы  : ( название каждого  класса ) ; показать: '' ] . ^   х  <  у

Литералы [ править ]

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

Числа. В следующем списке показаны некоторые из возможностей.

42 - 42 123 . 45 1 . 2345e2 2r10010010 16 rA000

Последние две записи представляют собой двоичное и шестнадцатеричное число соответственно. Число перед буквой r - основание системы счисления . База не обязательно должна быть степенью двойки; например 36rSMALLTALK - допустимое число, равное 80738163270632 в десятичной системе.

Символы пишутся со знаком доллара перед ними:

$ A

Строки - это последовательности символов, заключенные в одинарные кавычки:

'Привет, мир!'

Чтобы включить кавычку в строку, используйте вторую кавычку:

Я сказал им: «Привет, мир!».

Двойные кавычки не нуждаются в экранировании, так как одинарные кавычки разделяют строку:

Я сказал: «Привет, мир!» им.'

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

Символы записываются как #, за которым следует строковый литерал . Например:

# 'фу'

Если последовательность не содержит пробелов или знаков пунктуации, это также можно записать как:

#foo

Массивы:

# ( 1  2  3  4 )

определяет массив из четырех целых чисел.

Многие реализации поддерживают следующий буквальный синтаксис для ByteArrays:

# [ 1  2  3  4 ]

определяет ByteArray из четырех целых чисел.

И, наконец, что не менее важно, блоки ( анонимные функциональные литералы)

[... Какой-то  небольшой  код . ..]

Блоки подробно описаны далее в тексте.

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

Объявления переменных [ править ]

В Smalltalk обычно используются два типа переменных: переменные экземпляра и временные переменные. Другие переменные и связанная с ними терминология зависят от конкретной реализации. Например, VisualWorks имеет общие переменные класса и общие переменные пространства имен, тогда как Squeak и многие другие реализации имеют переменные класса, переменные пула и глобальные переменные.

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

| индекс |

объявляет временную переменную с именем index, которая изначально содержит значение nil.

В одном наборе полосок можно объявить несколько переменных:

| индексные гласные |

объявляет две переменные: индекс и гласные. Все переменные инициализированы. Переменные инициализируются значением nil, за исключением индексированных переменных Strings, которые инициализируются нулевым символом или ByteArrays, которые инициализируются значением 0.

Назначение [ править ]

Переменной присваивается значение с помощью :=синтаксиса " ". Так:

гласные  : =  'aeiou'

Присваивает строку 'aeiou'ранее объявленной переменной гласных. Строка - это объект (последовательность символов в одинарных кавычках - синтаксис для буквальных строк), созданный компилятором во время компиляции.

На исходном изображении Parc Place глиф символа подчеркивания ⟨_⟩ появился как стрелка ←⟩, направленная влево (как в версии кода ASCII 1963 года ). Smalltalk изначально принял эту стрелку влево как единственный оператор присваивания. Некоторый современный код по-прежнему содержит то, что выглядит как подчеркивание, действующее как присваивание, возвращающееся к этому первоначальному использованию. Большинство современных реализаций Smalltalk принимают синтаксис либо подчеркивания, либо двоеточия.

Сообщения [ править ]

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

В следующем примере на номер 42 отправляется сообщение «факториал»:

42  факториал

В этой ситуации 42 называется получателем сообщения , а «факториал» - селектором сообщения . Получатель отвечает на сообщение, возвращая значение (предположительно в данном случае факториал 42). Помимо прочего, результат сообщения можно присвоить переменной:

aRatherBigNumber  : =  42  факториал

Вышеупомянутый факториал - это то, что называется унарным сообщением, потому что задействован только один объект - получатель. Сообщения могут нести дополнительные объекты в качестве аргументов , например:

2  поднято до:  4

В этом выражении задействованы два объекта: 2 как получатель и 4 как аргумент сообщения. Результат сообщения, или на языке Smalltalk, ответ должен быть 16. Такие сообщения называются сообщениями с ключевыми словами . Сообщение может иметь больше аргументов, используя следующий синтаксис:

'hello world'  indexOf:  $ o  startAt :  6

который отвечает на индекс символа «o» в строке получателя, начиная поиск с индекса 6. Селектор этого сообщения - «indexOf: startAt:», состоящий из двух частей или ключевых слов .

Такое чередование ключевых слов и аргументов предназначено для улучшения читаемости кода, поскольку аргументы объясняются их предшествующими ключевыми словами. Например, выражение для создания прямоугольника с использованием синтаксиса, подобного C ++ или Java, может быть записано как:

новый  прямоугольник ( 100 ,  200 );

Непонятно, какой аргумент есть какой. Напротив, в Smalltalk этот код будет записан как:

 Ширина  прямоугольника : 100  высота:  200

Получателем в этом случае является класс «Прямоугольник», а ответом будет новый экземпляр класса с указанной шириной и высотой.

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

3  +  4

который отправляет сообщение "+" получателю 3 с переданным аргументом 4 (ответом будет 7). По аналогии,

3  >  4

это сообщение ">", отправленное на 3 с аргументом 4 (ответ будет ложным).

Обратите внимание, что сам язык Smalltalk-80 не подразумевает значения этих операторов. Результат вышеизложенного определяется только тем, как получатель сообщения (в данном случае экземпляр Number) реагирует на сообщения «+» и «>».

Побочный эффект этого механизма - перегрузка оператора . Сообщение «>» также может быть понято другими объектами, что позволяет использовать выражения формы «a> b» для их сравнения.

Выражения [ править ]

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

3  факториала  +  4  факториала  между:  10  и:  100

оценивается следующим образом:

  1. 3 получает сообщение "факториал" и отвечает 6
  2. 4 получает сообщение "факториал" и отвечает 24
  3. 6 получает сообщение "+" с аргументом 24 и отвечает на 30.
  4. 30 получает сообщение «между: и:» с 10 и 100 в качестве аргументов и отвечает истина

Ответ последнего отправленного сообщения является результатом всего выражения.

При необходимости скобки могут изменить порядок оценки. Например,

( 3  факториала  +  4 ) факториала  между:  10  и:  100

изменит значение так, что выражение сначала вычисляет «3 факториала + 4», что дает 10. Затем этот 10 получает второе сообщение «факториал», что дает 3628800. Затем 3628800 получает «между: и:», отвечая ложно.

Обратите внимание, что поскольку значение двоичных сообщений не встроено в синтаксис Smalltalk-80, все они считаются имеющими равный приоритет и оцениваются просто слева направо. Из-за этого значение выражений Smalltalk, использующих двоичные сообщения, может отличаться от их "традиционной" интерпретации:

3  +  4  *  5

оценивается как "(3 + 4) * 5", что дает 35. Чтобы получить ожидаемый ответ 23, необходимо использовать круглые скобки для явного определения порядка операций:

3  + ( 4  *  5 )

Унарные сообщения можно объединить в цепочку , записав их одно за другим:

3  факториал  факториальный  журнал

который отправляет «факториал» в 3, затем «факториал» в результат (6), затем «логарифм» в результат (720), что дает результат 2,85733.

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

 | окно |  window  : =  Окно  новое .  метка окна  :  «Привет» .  окно  открыто

Если серия сообщений отправляется тому же получателю, что и в примере выше, они также могут быть записаны в виде каскада с отдельными сообщениями, разделенными точкой с запятой:

  Новая  метка  окна : «Привет» ;  открыто

Это переписывание предыдущего примера в виде одного выражения позволяет избежать необходимости сохранять новое окно во временной переменной. Согласно обычным правилам приоритета, сначала отправляется унарное сообщение «new», а затем в ответ «new» отправляются «label:» и «open».

Блоки кода [ править ]

Блок кода (анонимная функция) может быть выражен как буквальное значение (которое является объектом, поскольку все значения являются объектами). Это достигается с помощью квадратных скобок:

[ : params  |  < сообщение - выражения > ]

Где : params - это список параметров, которые может принимать код. Это означает, что код Smalltalk:

[ : x  |  х  +  1 ]

можно понимать как:

 :

или выражается в лямбда-выражениях как:

 :

и

[ : x  |  x  +  1 ] значение:  3

можно оценить как

Или в лямбда-терминах:

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

Блоки могут быть выполнены путем отправки им сообщения о значении (существуют составные варианты для предоставления параметров блоку, например, «value: value:» и «valueWithArguments:»).

Буквальное представление блоков было нововведением, которое, с одной стороны, позволило сделать определенный код значительно более читаемым; это позволяло кодировать алгоритмы, включающие итерацию, ясным и кратким образом. Код, который обычно пишется с циклами на некоторых языках, можно кратко написать на Smalltalk, используя блоки, иногда в одну строку. Но что более важно, блоки позволяют выражать структуру управления с помощью сообщений и полиморфизма , поскольку блоки откладывают вычисление, а полиморфизм может использоваться для выбора альтернатив. Итак, if-then-else в Smalltalk написано и реализовано как

expr  ifTrue: [ операторы  для  оценки  if  expr ] ifFalse: [ операторы  для  оценки  if  not  expr ]

Истинные методы оценки

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock 
    ^ trueAlternativeBlock значение

Ложные методы оценки

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock 
    ^ falseAlternativeBlock значение
positiveAmounts  : =  allAmounts  выберите: [ : anAmount  |  anAmount  isPositive ]

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

Структуры управления [ править ]

Структуры управления в Smalltalk не имеют специального синтаксиса. Вместо этого они реализованы как сообщения, отправленные объектам. Например, условное выполнение реализуется путем отправки сообщения ifTrue: логическому объекту с передачей в качестве аргумента блока кода, который должен быть выполнен, тогда и только тогда, когда логический получатель имеет значение true.

Следующий код демонстрирует это:

результат  : =  a  >  b  ifTrue: [ 'больше' ] ifFalse: [ 'меньше или равно' ]

Блоки также используются для реализации определяемых пользователем структур управления, счетчиков, посетителей, обработки исключений , подключаемого поведения и многих других шаблонов. Например:

| гласные aString | aString  : =  'Это строка' . гласные  : =  aString  select: [ : aCharacter  |  aCharacter  isVowel ] .

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

Объект String отвечает на сообщение «select:» путем итерации по своим членам (отправляя самому себе сообщение «do:»), однократно оценивая блок выбора («aBlock») с каждым символом, который он содержит в качестве аргумента. При оценке (путем отправки сообщения «значение: каждый») блок выбора (на который ссылается параметр «aBlock» и определяется литералом блока «[: aCharacter | aCharacter isVowel]») отвечает на логическое значение, которое является затем отправил «ifTrue:». Если логическое значение объекта - истина, символ добавляется в строку, которая должна быть возвращена. Поскольку метод «select:» определен в абстрактном классе Collection, его также можно использовать следующим образом:

| прямоугольники aPoint столкновения | прямоугольники  : =  OrderedCollection  с: ( Прямоугольник  слева:  0  справа:  10  сверху:  100  снизу:  200 ) с: ( Прямоугольник  слева:  10  справа:  10  сверху:  110  снизу:  210 ) . aPoint  : =  точка  x:  20  y:  20 . столкновения  : =  прямоугольники  select: [ : aRect  |  aRect containsPoint:  aPoint ] .

Механизм обработки исключений использует блоки в качестве обработчиков (аналогично обработке исключений в стиле CLOS):

[ некоторая  операция
] on: Ошибка  do: [ : ex  |  Обработчик - код  экс  возврат]

Аргумент «ex» обработчика исключений обеспечивает доступ к состоянию приостановленной операции (кадр стека, номер строки, получатель, аргументы и т. Д.), А также используется для управления продолжением вычислений (путем отправки одного из «ex continue» "," ex reject "," ex restart "или" ex return ").

Классы [ править ]

Это определение класса акций: [29]

 Подкласс  объекта : #MessagePublisher  instanceVariableNames:  ''  classVariableNames:  ''  poolDictionaries:  ''  категория:  'Примеры Smalltalk'

Часто большую часть этого определения заполняет среда. Обратите внимание, что это сообщение Objectклассу о создании подкласса с именем MessagePublisher. Другими словами: классы - это первоклассные объекты в Smalltalk, которые могут получать сообщения так же, как любой другой объект, и могут быть созданы динамически во время выполнения.

Методы [ править ]

Когда объект получает сообщение, вызывается метод, соответствующий имени сообщения. Следующий код определяет метод публикации и, таким образом, определяет, что произойдет, когда этот объект получит сообщение «опубликовать».

опубликовать  стенограмму  шоу:  'Hello World!'

Следующий метод демонстрирует получение нескольких аргументов и возврат значения:

quadMultiply:  i1  and:  i2  «Этот метод умножает заданные числа друг на друга, а результат умножается на 4.»  | муль |  муль  : =  i1  *  i2 .  ^ муль  *  4

Имя метода #quadMultiply:and:. Возвращаемое значение указывается ^оператором.

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

Создание экземпляров классов [ править ]

Следующий код:

MessagePublisher  новый

создает (и возвращает) новый экземпляр класса MessagePublisher. Обычно это присваивается переменной:

publisher  : =  MessagePublisher  новый

Однако также можно отправить сообщение временному анонимному объекту:

MessagePublisher  новая  публикация

Пример Hello World [ править ]

Программа Hello world используется практически во всех текстах на новых языках программирования, поскольку первая программа научилась отображать самый основной синтаксис и среду языка. Для Smalltalk программу предельно просто написать. В следующем коде сообщение "show:" отправляется объекту "Transcript" со строковым литералом 'Hello, world!' в качестве аргумента. Вызов метода «show:» вызывает отображение символов его аргумента (строкового литерала «Hello, world!») В окне транскрипции («терминал»).

Стенограмма  шоу:  «Привет, мир!» .

Обратите внимание, что для просмотра результатов этого примера необходимо открыть окно Transcript.

Сохранение на основе изображений [ править ]

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

Однако многие системы Smalltalk не различают программные данные (объекты) и код (классы). Фактически классы - это объекты. Таким образом, большинство систем Smalltalk хранят все состояние программы (включая объекты класса и не класса) в файле изображения . Затем образ может быть загружен виртуальной машиной Smalltalk для восстановления системы, подобной Smalltalk, до предыдущего состояния. [30] Это было вдохновлено FLEX, языком, созданным Аланом Кей и описанным в его магистратуре. Тезис. [31]

Образы Smalltalk похожи на (перезапускаемые) дампы ядра и могут предоставлять те же функции, что и дампы ядра, например, отложенная или удаленная отладка с полным доступом к состоянию программы на момент ошибки. Другие языки, моделирующие код приложения как форму данных, например Lisp, также часто используют постоянство на основе изображений. Этот метод сохранения является мощным средством быстрой разработки, поскольку вся информация о разработке (например, деревья синтаксического анализа программы) сохраняется, что облегчает отладку. Однако у него также есть серьезные недостатки как у настоящего механизма персистентности. Во-первых, разработчики часто могут захотеть скрыть детали реализации и не делать их доступными в среде выполнения. По причинам законности и обслуживания, разрешение любому изменять программу во время выполнения неизбежно приводит к сложности и потенциальным ошибкам, которые были бы невозможны в скомпилированной системе, которая не предоставляет исходный код в среде выполнения. Кроме того, хотя механизм сохраняемости прост в использовании, ему не хватает истинных возможностей сохранения, необходимых для большинства многопользовательских систем.Наиболее очевидным является возможность выполнять транзакции с несколькими пользователями, обращающимися к одной и той же базе данных параллельно.[32]

Уровень доступа [ править ]

Все в Smalltalk-80 доступно для модификации из работающей программы. Это означает, что, например, IDE можно изменить в работающей системе без ее перезапуска. В некоторых реализациях синтаксис языка или реализация сборки мусора также могут быть изменены на лету. Даже этот оператор true become: falseдопустим в Smalltalk, хотя выполнять его не рекомендуется.

Своевременная компиляция [ править ]

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

Список реализаций [ править ]

OpenSmaltalk [ править ]

OpenSmaltalk VM (OS VM) является заметной реализацией среды Smalltalk Runtime, на которой основаны или производятся многие современные виртуальные машины Smalltalk. [33] Сама виртуальная машина ОС переносится из набора файлов исходного кода Smalltalk (который называется VMMaker) в исходный код на собственном языке C (с помощью транспилятора Slang) [34] [35], который, в свою очередь, компилируется для конкретной платформы. и архитектура оборудования, практически позволяющая кроссплатформенное выполнение образов Smalltalk. Исходный код доступен на GitHub и распространяется под лицензией MIT . Известные производные ВМ ОС:

  • Pharo Smalltalk, кроссплатформенный язык с открытым исходным кодом
    • PharoJS - транспилятор с открытым исходным кодом с Smalltalk на Javascript, расширяющий среду Pharo.
  • Squeak , Smalltalk с открытым исходным кодом
  • Croquet VM , Smalltalk VM для проекта Croquet

Другое [ править ]

  • Amber Smalltalk , работает на JavaScript через транспиляцию
  • Cincom имеет следующие продукты Smalltalk: ObjectStudio , VisualWorks и WebVelocity.
  • Cuis-Smalltalk , небольшой, чистый и приемлемый Smalltalk с открытым исходным кодом
  • Visual Smalltalk Enterprise и семейство, включая Smalltalk / V
  • F-скрипт
  • Системы GemTalk, GemStone / S
  • GNU Smalltalk , безголовая (без графического интерфейса) реализация Smalltalk
  • StepTalk , структура сценариев GNUstep использует Smalltalk язык на Objective-C выполнения
  • VisualAge Smalltalk
  • Rosetta Smalltalk, разработанный Скоттом Уорреном в 1979 году и анонсированный как картридж для компьютера Exidy Sorcerer, но так и не выпущенный [ необходима цитата ]
  • Платформа VAST (VA Smalltalk), разработанная Instantiations, Inc.
  • Маленький Smalltalk
  • Предметное искусство, Smalltalk с дельфинами
  • Object Connect, Smalltalk MT Smalltalk для Windows
  • Pocket Smalltalk , работает на Palm Pilot
  • SmallJ , Smalltalk с открытым исходным кодом, основанный на Java, производный от SmallWorld
  • eToys , система визуального программирования для обучения
  • Strongtalk для Windows предлагает дополнительную строгую типизацию

См. Также [ править ]

  • Цель-C
  • СТЕКЛО (программный пакет)
  • Распределенная архитектура управления данными

Ссылки [ править ]

  1. ^ a b c d e f g h Кей, Алан; Рам, Стефан (23.07.2003). «Электронная почта от 23.07.2003» . Доктор Алан Кей о значении «объектно-ориентированного программирования». Проверено 3 января 2009 .
  2. ^ a b c Кей, Алан. «Ранняя история Smalltalk» . Проверено 13 сентября 2007 .
  3. ^ "Smalltalk.org ™ | версии | ANSIStandardSmalltalk.html" . Smalltalk.org. Архивировано из оригинала на 2006-02-16 . Проверено 25 июня 2013 .
  4. ^ Опрос разработчиков Stack Overflow 2017
  5. ^ Опрос разработчиков Stack Overflow 2018
  6. ^ «Версии» . Smalltalk.org. Архивировано из оригинала на 2015-09-08 . Проверено 13 сентября 2007 .
  7. ^ "Стандарт ANSI Smalltalk" . Smalltalk.org. Архивировано из оригинала на 2015-09-07 . Проверено 13 сентября 2007 .
  8. ^ Гоббс
  9. ^ «История» . Программное обеспечение Seagull. Архивировано из оригинала на 2002-08-06 . Проверено 13 сентября 2007 .
  10. ^ Часто задаваемые вопросы о переходе на VisualAge Smalltalk
  11. ^ Язык Simula также был объектно-ориентированным и предшествовал (и был признан как влияющий на) Smalltalk, но это был язык моделирования, а не язык программирования общего назначения.
  12. ^ Кэннон, Ховард. «Ароматы Неиерархического подхода к объектно-ориентированному программированию» (PDF) . softwarepreservation.org . Проверено 17 декабря 2013 года .
  13. ^ "О Руби" . ruby-lang.org . Проверено 17 декабря 2013 года .
  14. ^ "Откуда пришел рефакторинг?" . sourcemaking.com . Проверено 17 декабря 2013 года .
  15. ^ "DARPA / ARPA" . livinginternet.com . Проверено 16 декабря 2013 года . Чтобы удовлетворить эту потребность, ARPA учредило IPTO в 1962 году с мандатом на создание жизнеспособной компьютерной сети для соединения основных компьютеров Министерства обороны в Пентагоне, Шайенн-Маунтин и штаб-квартире SAC.
  16. ^ «Роль Энгельбарта в ранней компьютерной сети» . dougengelbart.org . Проверено 17 декабря 2013 года .
  17. ^ Кей, Аллен. «Ранняя история Smalltalk» . gagne.homedns.org . Проверено 16 декабря 2013 года .
  18. ^ Краснер, Глен; Папа, Стефан (август – сентябрь 1988 г.). "Поваренная книга по использованию парадигмы пользовательского интерфейса модель-представление-контроллер в Smalltalk -80". Журнал объектно-ориентированного программирования .
  19. ^ «Наше влияние» . cincomsmalltalk.com . Проверено 16 декабря 2013 года .
  20. Кей, Алан (10 октября 1998 г.). «Прототипы против классов (электронная почта в списке Squeak)» .
  21. ^ Голдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. С. 31, 75–89. ISBN 0-201-13688-0.
  22. Перейти ↑ Clark, AN (1997). «Метаклассы и отражение в Smalltalk». CiteSeerX 10.1.1.33.5755 .  Cite journal requires |journal= (help)
  23. ^ Дюкас, Стефан; Линхард, Адриан; Ренггли, Лукас. «Seaside - структура веб-приложений с множеством потоков управления» (PDF) . scg.unibe.ch . Группа разработки программного обеспечения Institut fur Informatik und angewandte Mathematik Universitaat Bern, Швейцария . Проверено 16 декабря 2013 года .
  24. ^ Фут, Брайан; Джонсон, Ральф (1–6 октября 1989 г.). «Светоотражающие средства в Smalltalk-80» . Упсла '89 : 327–335. DOI : 10.1145 / 74877.74911 . ISBN 0897913337. S2CID  14207536 . Проверено 16 декабря 2013 года .
  25. ^ Смит, Брайан C (1982-01-01). «Процедурное отражение в языках программирования» . Технический отчет MIT (MIT-LCS-TR-272) . Проверено 16 декабря 2013 года .
  26. ^ Денкер, Маркус; Пек, Мариано Мартинес; Буракади, Нури; Фабресс, Люк; Дюкасс, Стефан. «Эффективные прокси в Smalltalk» (PDF) . Cite journal requires |journal= (help)
  27. ^ [1] [2]
  28. ^ Голдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. С. 17–37. ISBN 0-201-13688-0.
  29. ^ Голдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. С. 39–53. ISBN 0-201-13688-0.
  30. ^ «Устойчивость на основе изображений» . book.seaside.st . Проверено 17 декабря 2013 года .
  31. ^ Кей, Аллен (1968). «FLEX - гибкий расширяемый язык» . Диссертация MSC Университета Юты .
  32. ^ Фаулер, Мартин. «Образ памяти» . martinfowler.com . Проверено 17 декабря 2013 года .
  33. ^ OpenSmalltalk / opensmalltalk-vm , OpenSmalltalk, 2020-11-03 , получено 2020-11-08
  34. ^ «Сленг» . wiki.squeak.org . Проверено 8 ноября 2020 .
  35. ^ «Руководство по языку S-Lang (v2.3.0): Предисловие» . jedsoft.org . Проверено 8 ноября 2020 .

Дальнейшее чтение [ править ]

  • Гольдберг, Адель (декабрь 1983 г.). Smalltalk-80: Интерактивная среда программирования . Эддисон-Уэсли. ISBN 0-201-11372-4.
  • Гольдберг, Адель ; Кей, Алан , ред. (Март 1976 г.). Smalltalk-72 Инструкция по эксплуатации (PDF) . Пало-Альто, Калифорния: Исследовательский центр Xerox Пало-Альто . Проверено 11 ноября 2011 .
  • Гольдберг, Адель ; Робсон, Дэвид (май 1983). Smalltalk-80: язык и его реализация . Эддисон-Уэсли. ISBN 0-201-11371-6.
  • Гольдберг, Адель ; Робсон, Дэвид (11 января 1989 г.). Smalltalk 80: Язык . Эддисон-Уэсли. ISBN 0-201-13688-0.
  • Кей, Алан С. (март 1993 г.). «Ранняя история Smalltalk» (PDF) . Уведомления ACM SIGPLAN . ACM . 28 (3): 69–95. DOI : 10.1145 / 155360.155364 .
  • Краснер, Глен, изд. (Август 1983 г.). Smalltalk-80: Немного истории, слова совета . Эддисон-Уэсли. ISBN 0-201-11669-3.
  • Нирстраз, Оскар; Дюкасс, Стефан; Поллет, Дэмиен; Блэк, Эндрю П. (07.10.2009). Писк на примере . Керзац, Швейцария: Square Bracket Associates. ISBN 978-3-9523341-0-2.
  • Нирстраз, Оскар; Дюкасс, Стефан; Поллет, Дэмиен; Блэк, Эндрю П. (23 февраля 2010 г.). Фараон своим примером . Керзац, Швейцария: Square Bracket Publishing. ISBN 978-3-9523341-4-0. Архивировано из оригинального 21 октября 2009 года.
  • Уинстон, Патрик Генри (3 сентября 1997 г.). Переходим к Smalltalk . Массачусетский технологический институт, США: Аддисон Уэсли. ISBN 978-0201498271.
  • Брауэр, Йоханнес (2015). Программирование на Smalltalk - объектная ориентация с самого начала . Springer. ISBN 978-3-658-06823-3.
  • «Специальный выпуск по Smalltalk» . Байт . Макгроу-Хилл. 6 (8). Август 1981 . Проверено 18 октября 2013 .
    • Гольдберг, Адель (август 1981). «Знакомство с системой Smalltalk-80» . Байт . Макгроу-Хилл. 6 (8) . Проверено 18 октября 2013 .
    • Ингаллс, Дэн (август 1981). «Принципы проектирования Smalltalk» . Байт . Макгроу-Хилл. 6 (8) . Проверено 11 ноября 2011 .
    • Теслер, Ларри (август 1981). «Среда Smalltalk» . Байт . Макгроу-Хилл. 6 (8) . Проверено 2 мая 2016 .

Внешние ссылки [ править ]

  • Бесплатные онлайн-книги по Smalltalk
  • Cuis Smalltalk
  • Pharo Smalltalk
  • Писк Smalltalk
  • Cincom Smalltalk VisualWorks
  • Дельфин Smalltalk
  • GNU Smalltalk
  • Smalltalk / X
  • StrongTalk
  • Янтарный Smalltalk
  • Redline Smalltalk
  • Scarlet Smalltalk
  • Cincom Smalltalk (ObjectStudio, VisualWorks)
  • В.А. Smalltalk
  • GemStone
  • СТЕКЛО (GemStone, Linux, Apache, Seaside и Smalltalk)
  • Smalltalk MT
  • Онлайн-эмулятор Smalltalk-78
  • Кросс-платформенная виртуальная машина OpenSmalltalk для Squeak, Pharo, Cuis и новояза
  • Реализации Smalltalk-80 Bluebook на C ++: от dbanay и rochus-keller на github