stringtranslate.com

Болтовня

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

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

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

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

Языки, подобные Smalltalk, находятся в активной разработке и собрали вокруг себя лояльные сообщества пользователей. Американский национальный институт стандартов (ANSI) Smalltalk был ратифицирован в 1998 году и представляет собой стандартную версию Smalltalk. [5]

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

История

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

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

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

Smalltalk-80 был первым языковым вариантом, доступным за пределами PARC. В 1981 году он был передан Tektronix , Hewlett-Packard , Apple Computer и DEC для проверки и отладки на их платформах. [9] [10] Августовский номер журнала Byte Magazine за 1981 год был посвящен Smalltalk-80 и донес его идеи до широкой аудитории. Также было опубликовано несколько книг по Smalltalk-80. Smalltalk-80 стал основой для всех будущих коммерческих версий Smalltalk. [11] Последний выпуск Smalltalk-80 версии 1 состоялся в ноябре 1981 года. [12] Xerox распространяла версию 1 только среди Apple, DEC, HP и Tektronix, но этим компаниям было разрешено неограниченное распространение через любую созданную ими систему. Это способствовало широкому распространению Smalltalk. [13] Позже, в 1983 году, Xerox выпустила Smalltalk-80 версии 2. Эта версия была общедоступной, хотя и под ограниченной лицензией. Версии 1 и 2 были очень похожи, хотя версия 2 имела некоторые дополнительные функции, такие как корректор орфографии. Каждый выпуск состоял из виртуального образа (независимого от платформы файла с определениями объектов) и спецификации виртуальной машины . [13]

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

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

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

Влияния

Smalltalk был одним из многих объектно-ориентированных языков программирования, основанных на Simula . [18] Smalltalk также является одним из самых влиятельных языков программирования. Практически все последующие объектно-ориентированные языки — Flavors , [19] CLOS , Objective-C , Java , Python , Ruby , [20] и многие другие — находились под влиянием Smalltalk. Smalltalk также был одним из самых популярных языков для гибких методов разработки программного обеспечения, быстрой разработки приложений (RAD) или прототипирования, а также шаблонов проектирования программного обеспечения . [21] Высокопроизводительная среда, обеспечиваемая платформами Smalltalk, сделала их идеальными для быстрой итеративной разработки.

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

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

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

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

Smalltalk-80: The Language and his Implementation , также известная как «Синяя книга», оригинальная книга по языку.

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

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

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

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

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

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

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

Отражение

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

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

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

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

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

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

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

Синтаксис

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

Поговорка о том, что «синтаксис Smalltalk умещается на открытке », возможно, возникла из оригинальной концепции языка Алана Кея, изложенной им практически в каждой из десятков или сотен публичных лекций, op. cit., или, возможно, это могло бы относиться к фрагменту кода Ральфа Джонсона , демонстрирующему все основные стандартные синтаксические элементы методов: [33] [34]

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

Литералы

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

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

42 - 42 123 . 45 1 . 2345е2 2р10010010 16 рА000

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

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

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

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

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

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

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

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

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

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

# 'фу'

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

#фу

Массивы:

#( 1  2  3  4 )

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

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

# [ 1  2  3  4 ]

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

И последнее, но не менее важное: блоки ( анонимные функциональные литералы).

[... Некоторый  небольшой  код . ..]

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

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

Объявления переменных

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

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

| индекс |

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

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

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

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

Назначение

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

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

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

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

Сообщения

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

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

42  факториал

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

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

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

2  поднятДо:  4

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

'привет, мир'  indexOf:  $o  начиная с:  6

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

Такое чередование ключевых слов и аргументов предназначено для улучшения читаемости кода, поскольку аргументы объясняются предшествующими им ключевыми словами. Например, выражение для создания прямоугольника с использованием синтаксиса, подобного 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, сохраняется его в переменной, а затем отправляются ему два сообщения.

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

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

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

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

Блоки кода

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

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

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

[ : х  |  х  +  1 ]

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

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

и

[ : х  |  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
позитивные суммы  :=  allAmounts  выберите: [ : anAmount  |  anAmount  isPositive ]

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

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

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

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

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

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

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

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

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

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

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

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

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

Классы

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

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

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

Методы

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

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

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

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

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

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

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

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

СообщениеPublisher  новое

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

издатель  :=  MessagePublisher  новый

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

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

Привет, мир, пример

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

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

Чтобы увидеть результаты этого примера, необходимо открыть окно «Транскрипт».

Сохранение на основе изображений

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

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

Образы Smalltalk подобны (перезапускаемым) дампам ядра и могут обеспечивать ту же функциональность, что и дампы ядра, например отложенную или удаленную отладку с полным доступом к состоянию программы на момент ошибки. [39]

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

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

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

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

Компиляция точно в срок

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

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

OpenSmalltalk

OpenSmalltalk VM (OS VM) — это примечательная реализация виртуальной машины Smalltalk, на которой основаны или получены многие современные реализации Smalltalk . [40] [41] Сама виртуальная машина ОС транспилируется из набора файлов исходного кода Smalltalk (с использованием подмножества Smalltalk с именем Slang) в исходный код на родном языке C (с использованием транспилятора с именем VMMaker), [42] что, в свою очередь, скомпилирован для конкретной платформы и архитектуры аппаратного обеспечения, что практически обеспечивает кросс-платформенное выполнение образов Smalltalk. Исходный код доступен на GitHub и распространяется по лицензии MIT . Известные реализации Smalltalk на базе виртуальной машины ОС: [43]

Другие

JavaScript виртуальная машина

Смотрите также

Рекомендации

  1. ^ "Схемы Alto I" (PDF) . Битсейверы . п. 54 . Проверено 21 июля 2016 г.
  2. ^ «История компьютеров и вычислительной техники, рождение современного компьютера, персональный компьютер, Xerox Alto» . Проверено 19 апреля 2016 г.
  3. ^ abcdefgh Кей, Алан; Рам, Стефан (23 июля 2003 г.). «Электронное письмо от 23 июля 2003 г.». Доктор Алан Кей о значении «объектно-ориентированного программирования». Проверено 3 января 2009 г.
  4. ^ abc Кей, Алан. «Ранняя история Smalltalk» . Проверено 13 сентября 2007 г.
  5. ^ "Стандарт ANSI Smalltalk" . Smalltalk.org. 2004. Архивировано из оригинала 16 февраля 2006 г. Проверено 02 марта 2021 г.
  6. ^ «Опрос разработчиков Stack Overflow, 2017» .
  7. ^ «Опрос разработчиков Stack Overflow, 2018» .
  8. ^ «Версии». Smalltalk.org. Архивировано из оригинала 8 сентября 2015 г. Проверено 13 сентября 2007 г.
  9. ^ «Приглашение Tektronix на Первую международную конференцию разработчиков Smalltalk-80» (PDF) . Архив документов Tektronix Smalltalk . 27 августа 1981 года.
  10. ^ «Список участников Первой международной конференции разработчиков Smalltalk-80» (PDF) . Архив документов Tektronix Smalltalk . 24 сентября 1981 года.
  11. ^ «Представляем зоопарк Smalltalk». ЧМ . 17 декабря 2020 г.
  12. ^ «Примечания к выпуску VI» (PDF) . 20 ноября 1981 года.
  13. ^ Аб Ингаллс, Дэниел (2020). «Эволюция Smalltalk: от Smalltalk-72 до Squeak». Труды ACM по языкам программирования . 4 : 1–101. дои : 10.1145/3386335 . S2CID  219603700.
  14. ^ "Стандарт ANSI Smalltalk" . Smalltalk.org. Архивировано из оригинала 7 сентября 2015 г. Проверено 13 сентября 2007 г.
  15. ^ «Гоббс». Архивировано из оригинала 19 апреля 2003 года.
  16. ^ «История». Программное обеспечение Чайка. Архивировано из оригинала 6 августа 2002 г. Проверено 13 сентября 2007 г.
  17. ^ «Часто задаваемые вопросы о переходе на VisualAge Smalltalk» .
  18. ^ Язык Simula также был объектно-ориентированным и предшествовал (и был признан оказавшим влияние на) Smalltalk, но это был язык моделирования, а не язык программирования общего назначения.
  19. ^ Кэннон, Ховард. «Вкусы неиерархического подхода к объектно-ориентированному программированию» (PDF) . Softwarepreservation.org . Проверено 17 декабря 2013 г.
  20. ^ «О Руби». Ruby-lang.org . Проверено 17 декабря 2013 г.
  21. ^ «Откуда взялся рефакторинг?». sourcemaking.com . Проверено 17 декабря 2013 г.
  22. ^ "ДАРПА - АРПА" . www.livinginternet.com . Проверено 16 декабря 2013 г. Чтобы удовлетворить эту потребность, ARPA в 1962 году учредило IPTO с мандатом на создание устойчивой компьютерной сети для соединения основных компьютеров Министерства обороны в Пентагоне, Шайенн-Маунтин и штаб-квартире SAC.
  23. ^ «Роль Энгельбарта в ранних компьютерных сетях». dougengelbart.org . Проверено 17 декабря 2013 г.
  24. ^ Краснер, Глен; Папа, Стивен (август – сентябрь 1988 г.). «Книга рецептов по использованию парадигмы пользовательского интерфейса модель-представление-контроллер в Smalltalk -80». Журнал объектно-ориентированного программирования .
  25. ^ «Наше влияние». cincomsmalltalk.com . Проверено 16 декабря 2013 г.
  26. ^ Кей, Алан (10 октября 1998 г.). «Прототипы против классов (электронная почта в списке Squeak)».
  27. ^ Гольдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. стр. 31, 75–89. ISBN 0-201-13688-0.
  28. ^ Кларк, AN (1997). «Метаклассы и размышления в Smalltalk». CiteSeerX 10.1.1.33.5755 .  {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  29. ^ Дюкасс, Стефан; Линхард, Адриан; Ренггли, Лукас. «Seaside — платформа веб-приложений с множественными потоками управления» (PDF) . scg.unibe.ch . Группа композиции программного обеспечения Институт информатики и математического анализа Университета Берна, Швейцария . Проверено 16 декабря 2013 г.
  30. ^ Фут, Брайан; Джонсон, Ральф (1–6 октября 1989 г.). «Отражательные средства в Smalltalk-80». Материалы конференции «Объектно-ориентированные системы, языки и приложения программирования» . стр. 327–335. дои : 10.1145/74877.74911 . ISBN 0-89791-333-7. S2CID  14207536 . Проверено 16 декабря 2013 г.
  31. ^ Смит, Брайан С. (1 января 1982 г.). «Процедурная рефлексия в языках программирования». Технический отчет MIT (MIT-LCS-TR-272) . Проверено 16 декабря 2013 г.
  32. ^ Денкер, Маркус; Пек, Мариано Мартинес; Буракади, Нури; Фабресс, Люк; Дюкасс, Стефан. «Эффективные прокси в Smalltalk» (PDF) . {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  33. ^ Дюкасс, Стефан (2001). «Писк: Минималистский синтаксис / Писк: Минималистский синтаксис!» (PDF) . Программаз! Журнал Le Magazine du Développement . 1 . Проверено 15 января 2024 г.
  34. ^ Дюкасс, Стефан. «Объектно-ориентированное проектирование с помощью Smalltalk — чистый объектный язык и его среда» (PDF) . Группа композиции программного обеспечения (Бернский университет) . Проверено 15 января 2024 г.
  35. ^ Гольдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. стр. 17–37. ISBN 0-201-13688-0.
  36. ^ Гольдберг, Адель ; Робсон, Дэвид (1989). Smalltalk-80 Язык . Эддисон Уэсли. стр. 39–53. ISBN 0-201-13688-0.
  37. ^ «Постоянство на основе изображений». книга.море.ст . Проверено 17 декабря 2013 г.
  38. ^ Кей, Аллен (1968). «FLEX – гибкий расширяемый язык». Диссертация MSC Университета Юты .
  39. ^ Фаулер, Мартин. «Образ памяти». martinfowler.com . Архивировано из оригинала 7 октября 2011 г. Проверено 17 декабря 2013 г.
  40. ^ "opensmalltalk-vm", OpenSmalltalk , Git Hub, 03 ноября 2020 г. , получено 8 ноября 2020 г.
  41. ^ Элиот Миранда; Клеман Бера; Элиза Гонсалес Буа; Дэн Ингаллс (2018). Два десятилетия разработки виртуальных машин на Smalltalk: разработка живых виртуальных машин с помощью инструментов моделирования; Виртуальные машины и языковые реализации VMIL 2018, Бостон, США (Отчет). hal.archives-ouvertes.fr. дои : 10.1145/3281287.3281295. Архивировано из оригинала 05.11.2022.
  42. ^ «Сленг». Писк . Проверено 8 ноября 2020 г.
  43. ^ аб Миранд, Элиот; Бера, Клеман; Гонсалес Буа, Элиза; Дэн, Ингаллс (8 октября 2018 г.). «Два десятилетия разработки виртуальных машин Smalltalk: разработка живых виртуальных машин с помощью инструмента моделирования» (PDF) .
  44. Оглавление, Cuis Smalltalk, 24 ноября 2021 г. , получено 25 ноября 2021 г.
  45. ^ Скотт Уоррен (1979). Язык, потерянный для публики - Rosetta Smalltalk Flap, 1979.
  46. ^ «Strongtalk: высокопроизводительный Smalltalk с открытым исходным кодом и дополнительной системой типов» . Проверено 25 ноября 2021 г.

дальнейшее чтение

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