Smalltalk

редактировать
Объектно-ориентированный язык программирования, впервые выпущенный в 1972 г.
Smalltalk
Smalltalk80book.jpg
Парадигма Объектно-ориентированный
Разработано Алан Кей, Дэн Ингаллс, Адель Голдберг
Разработчик Алан Кей, Дэн Ингаллс, Адель Голдберг, Тед Келлер, Дайана Мерри, Скотт Уоллес, Питер Дойч и Xerox PARC
Впервые появилось1972; 48 лет назад (1972 г.) (разработка началась в 1969 г.)
Стабильный выпуск Smalltalk-80 версии 2/1980; 40 лет назад (1980)
Печатная дисциплина Сильная, динамическая
OS Кросс-платформенная (мультиплатформенная)
Основные реализации
Янтарный, Dolphin Smalltalk, GemStone / S, GNU Smalltalk, Pharo, Smalltalk / X, Squeak, VA Smalltalk, VisualWorks
Под текущей
Lisp, Simula, Euler, IMP, Planner, Logo, Sketchpad, ARPAnet, Burroughs B5000
Под мест
AppleScript, Common Lisp Object System, Dart, Dylan, Erlang, Etoys, Go, Groovy, Io, Ioke, Java, Lasso, Logtalk, Newspeak, NewtonScript, Object REXX, Objective-C, PHP 5, Python, Raku, Ruby, Scala, Scratch, Self

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

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

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

Содержание

  • 1 История
  • 2 Влияния
  • 3 Объектно-ориентированное программирование
  • 4 Отражение
  • 5 Синтаксис
    • 5.1 Литералы
    • 5.2 Объявления чис
    • 5.3 Назначение
    • 5.4 Сообщения
    • 5.5 Выражения
    • 5.6 Кодовые блоки
  • 6 Управляющие структуры
  • 7 Классы
    • 7.1 Методы
    • 7.2 Создание экземпляров классов
  • 8 Пример Hello World
  • 9 Сохраняемость на На основе изображений
  • 10 Уровень доступа
  • 11 Оперативная компиляция
  • 12 Список реализаций
  • 13 См. Также
  • 14 Ссылки
  • 15 Дополнительная литература
  • 16 Внешние ссылки

История

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

Smalltalk был результатом исследования, проведенного Аланом Кей в Исследовательском центре Xerox в Пало-Альто (PARC); Алан Кей разработал самые ранние версии Smalltalk, Адель Голдберг написала большую часть документации, а Дэн Ингаллс реализовал старые версии. Первая версия, получившая название Smalltalk-71, была создана Кей за несколько утра, сделав ставку на то, что язык программирования, основанный на идее передачи сообщений, вдохновленной Simula, может быть реализован в «Страница кода». Более поздний вариант, используемый для исследовательской работы, теперь называется Smalltalk-72 и повлиял на развитие модели Актер. Его синтаксис и модель выполнения сильно отличались от современных вариантов 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 года.

Два популярных в настоящее время варианта реализации 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. (Дэн Ингаллс позже перенес Хоббса в 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.. VisualWorks был продан Cincom и теперь является частью Cincom Smalltalk. Cincom решительно поддерживает Smalltalk, выпуская несколько новых версий VisualWorks и ObjectStudio каждый год с 1999 года.

Cincom, GemTalk и Instantiations продолжают продавать среду Smalltalk. У IBM закончился жизненный цикл VisualAge Smalltalk, который в конце 1990-х решил поддержать Java, и с 2005 года его поддерживает Instantiations, Inc., которая переименовала продукт в VA Smalltalk (платформа VAST) и продолжает выпускать новые версии. ежегодно. Открытая реализация 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. Smalltalk также является одним из самых влиятельных языков программирования. Практически все объектно-ориентированные языки, появившиеся после - Flavors, CLOS, Objective-C, Java, Python, Ruby и многие другие - испытали влияние Smalltalk. Smalltalk также был одним из самых популярных языков в сообществе Agile Methods, Rapid Prototyping и Software Patterns. Высокопроизводительная среда, предоставляемая платформами Smalltalk, сделала их идеальными для быстрой итеративной разработки.

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

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

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

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

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

Объект Smalltalk может выполнять ровно три функции:

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

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

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

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

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

Отражение

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

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

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

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

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

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

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

Синтаксис

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

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

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

Литералы

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

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

42-42 123,45 1.2345e2 2r10010010 16rA000

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

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

$ A

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

'Hello, world!'

Чтобы включить цитату в фразе, вторую кавычку:

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

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

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

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

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

# 'foo'

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

#foo

Массивы:

# (1 2 3 4)

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

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

# [1 2 3 4]

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

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

[... Код smalltalk...]

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

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

Объявления числа

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

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

| индекс |

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

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

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

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

Присвоение

Переменной присваивается значение через ': =' синтаксис. Итак:

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

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

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

Сообщения

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

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

42 факториал

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

aRatherBigNumber: = 42 factorial

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

2 raiseTo: 4

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

'hello world' indexOf: $ o startAt: 6

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

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

new Rectangle (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 факториала, факториала, log

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

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

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

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

Новая метка окна: 'Здравствуйте '; open

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

Блоки кода

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

[: params | ]

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

[: x | x + 1]

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

f {\ displaystyle f}f : f (x) = x + 1 {\ displaystyle f (x) = x + 1}f (x) = x + 1

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

λ x {\ displaystyle \ lambda x}\ lambda x : x + 1 {\ displaystyle x + 1}x + 1

и

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

можно вычислить как

f (3) = 3 + 1 {\ displaystyle f (3) = 3 + 1}f (3) = 3 + 1

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

( λ x: x + 1) 3 β → 4 {\ displaystyle (\ lambda x: x + 1) 3 _ {\ beta} \ rightarrow 4}(\ lambda x: x + 1) 3 _ {\ beta} \ rightarrow 4

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

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

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

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

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

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock. ^ trueAlternativeBlock value

False методы для оценки

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock <143ative>^ false значение
positiveAmounts: = allAmounts select: [: anAmount | anAmount isPositive]

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

Управляющие структуры

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

Следующий код представляет это:

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

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

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

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

Объект реагирует на сообщение «select:», выполняя итерацию по своему члену (отправляя себе сообщение «do:»), оценивая блок выбора («aBlock») один раз с каждым содержащимся в нем символом как Аргумент. При оценке (путем отправки сообщений "value: each") блок выбора (на который указывает параметр "aBl ock" и определяется литералом блока "[: aCharacter | aCharacter isVowel]"), отвечает на логическое значение, которое отправляется "если правда:". Это добавляемая строка, которая должна быть возвращена. Методом сегодня "select:" определен в абстрактном классе Сборник, его также можно использовать следующим образом:

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

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

[некоторая операция] на: Ошибка do: [: ex | код-обработчика ex return]

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

Классы

Это определение стандартного класса:

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

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

Методы

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

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

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

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

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

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

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

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

MessagePublisher new

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

publisher: = MessagePublisher new

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

MessagePublisher new publish

Пример Hello World

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

Расшифровка шоу: «Привет, мир!».

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

Постоянство на основе изображений

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

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

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

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

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

Своевременная компиляция

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

Список реализаций

См. Также

Ссылки

Дополнительная литература

Внешние ссылки

В Wikibooks есть книга по теме: Программирование: Smalltalk
Последняя правка сделана 2021-06-08 06:31:31
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте