Smalltalk обычно воспринимается как старый, умирающий язык – антиквариат из ушедшей эпохи. Нет ничего более далёкого от истины.
Smalltalk по-прежнему очень актуален. Это отличный язык для обучения программированию людей, не имеющих технического образования. Это превосходный язык прототипирования для стартапов. Это мощный промышленный язык, используемый как крупными, так и малыми компаниями по всему миру. Есть веские причины рассмотреть использование современного Smalltalk сегодня, поскольку многое было сделано за последнее время, чтобы улучшить его возможности.
Вы не обязаны использовать Smalltalk в промышленном программировании, но попробуйте кое-что написать на нём и прислушайтесь к своим ощущениям. Они должны быть знакомы, потому что реализация объектно-ориентированной парадигмы в Smalltalk настолько великолепна, что повлияла на целое поколение ОО языков, таких как Objective-C, Python, Ruby, CLOS, PHP 5, Perl 6, Erlang, Groovy, Scala, Dart, Swift и многих иных.
Изучая Smalltalk, вы поймете, как все эти полезные функции в современных языках стали реальностью. Изучение Smalltalk может также дать вам преимущество среди ваших коллег, и ещё он может быть отличным инструментом для обучения программированию.
Что нам дал Smalltalk?
Вклад Smalltalk в индустрию программного обеспечения огромен. Просто взгляните на этот список функций и технологий, которые он представил:
- Smalltalk представил миру виртуальную машину (VM), которая позволяет программному обеспечению быть независимым от платформы. Это та же технология, которую поддерживает Java (JVM) и .NET, а также Android (Dalvik).
- Smalltalk был пионером JIT компиляции (just-in-time), методики резкого повышения производительности программного обеспечения байт-кодов, такого как Java.
- В Smalltalk появилась первая современная среда разработки (IDE), которая включала текстовый редактор, браузер системы и классов, инспектор объектов и свойств и отладчик. Это привело к возникновению многих IDE, которые сегодня используют разработчики, такие как Visual Studio, Xcode и IntelliJ IDEA. Лично я считаю, что ни одна из этих IDE не может сравниться со Smalltalk в простоте, элегантности и скорости разработки; оригинал все ещё лучший!
- С самого начала Smalltalk имел замыкания, представляющие собой функции первого класса, имеющие лексическую область видимости. По сути, замыкание – это функция обратного вызова (callback) которая может видеть нелокальные переменные в том месте, где они были определены. Это может помочь вам написать гораздо более компактный и читаемый код. Замыкания находят своё применение во многих языках, например, в Java, C# и PHP.
- Smalltalk был первым языком, поддерживающим «живое» программирование и усовершенствованные методы отладки, такие как проверка и изменение кода во время выполнения. Сегодня отладка в реальном времени возможна в C# с помощью Visual Studio функции «Edit and Continue» и Java с использованием HotSwap.
- Smalltalk представил миру концепцию MVC (Model-View-Controller). MVC – это программный архитектурный шаблон для реализации пользовательских интерфейсов. Он популярен в настольных графических приложениях и веб-приложениях. В наши дни это та самая архитектура, которую в первую очередь изучают веб-разработчики.
- В значительной степени именно Smalltalk ответственен за разработку на основе тестов (TDD) и экстремальное программирование (XP), которые очень важны в нынешних «гибких» (Agile) практиках.
- Smalltalk сделал «утиную типизацию» расхожим выражением (ну, если оно ещё расхаживает по вашему дому). В утиной типизации проверка типов отложена до выполнения программы – когда рефлексия используются для обеспечения правильного поведения. Сегодня мы находим утиную типизацию во многих языках, включая Java, Python, Common Lisp, Go, Groovy, Objective-C и PHP.
- Smalltalk первым ввёл использование объектных баз данных. Хотя они и не получили широкого распространения, всё же объектные базы данных имеют свои нишевые рынки. Лучшим примером объектной базы данных является GemStone/S, который хорошо подходит для масштабируемых, высокопроизводительных, многоуровневых распределённых систем.
- Smalltalk представил нам первый браузер рефакторинга. Конечно, поддержку рефакторинга можно найти в большинстве современных IDE.
- Smalltalk сыграл важную роль в разработке графического пользовательского интерфейса (GUI) и пользовательского интерфейса «что видишь, то и получишь» (WYSIWYG).
Но как изучение Smalltalk сделает меня лучшим разработчиком?
Smalltalk имеет целый ряд функций, намного опередивших своё время:
- Основанное на образе сохранение
- Объекты: все является объектом, а объекты обмениваются только сообщениями (наиболее «чистая» реализация ООП и одна из самых ранних)
- «Живое» программирование
- Расширенные методы отладки, такие как изменение кода на лету
- Простой, незагромождённый интерфейс IDE
- Предметно-ориентированные языки (DSL): единственный способ работы Smalltalk, поэтому программистам необходимо сосредоточиться на проблеме, используя язык и нотацию, являющуюся естественной для этой проблемы
И есть ещё несколько фич, которые делают Smalltalk особенным.
По существу, ключевым преимуществом Smalltalk как продуктивного языка и инструмента обучения является то, что он снимает большую часть, если не весь, когнитивный стресс в промышленных OO языках, таких как Java. Smalltalk не содержит синтаксического мусора или сбивающих с толку функций. Он вежливо уступает вам дорогу, так что вы можете сосредоточить всё своё внимание на проблеме или приложении. Дело не в том, что Java – плохой язык, потому что он более сложный (и имеющий 30-символьные имена классов); я говорю о том, что изучение необремененного лишними функциями OO языка на самом деле может сделать вас лучшим Java-программистом, как только вы поймёте концепции OOП с другой точки зрения.
Устранение когнитивного стресса является целью многих языков – например, Python, Ruby, Elixir, Elm и Go. Даже если вы его не чувствуете, стресс есть. Часто говорят, что программирование в Smalltalk или Python похоже на Дзен; ваше сознание просто течёт легко и непринуждённо вместе с решаемой задачей. Это красота и ценность языковой простоты, и Smalltalk обладает ею в полной мере.
В Smalltalk концепция ООП очищена до базовых понятий классов и методов, метаклассов и рефлексии, и, самое главное, передачи сообщений. Smalltalk, в силу своей объектной чистоты и согласованности, даст вам глубокое понимание объектно-ориентированного программирования и того, как использовать его с максимальной эффективностью.
Простота Smalltalk также делает его идеальным учебным языком для обучения программированию, особенно если у вас нет технической подготовки. Простота языка и инструментов позволяет сосредоточить ваши усилия на изучении методов программирования, а не языковых конструкций и формализма.
«Живой» отладчик значительно сокращает цикл редактирование – тестирование – отладка.
Как работает Smalltalk? Основанный на образе подход к программированию
Главная причина успеха Smalltalk – подход к созданию программного обеспечения, основанный на образе. Образ представляет собой моментальный снимок памяти, который содержит все объекты в вашем запущенном приложении. Он инкапсулирует всё состояние выполнения вашей программы. Образ можно сохранить на диск и позже возобновить точно с того места, где вы остановились!
«Образ Smalltalk» может звучать немного необычно, но на самом деле он очень похож на нечто, широко используемое сегодня в ИТ: системные образы в виртуализации ОС, такие как в VMware и VirtualBox. Не забывайте, что Smalltalk первоначально был автономной операционной системой, созданной в Xerox PARC в 1970-х годах.
Образ Smalltalk похож на DOM (Document Object Model) в веб-приложении. Обратите внимание, что веб-приложение представляет собой по существу операционную систему, изолированную в веб-браузере и лишённую прямого доступа к файловой системе хоста и другим ресурсам. Когда веб-браузер закрывается, состояние динамического веб-сайта может быть сохранено или кэшировано, и в следующий раз, когда браузер возобновит работу, веб-сайт может быть восстановлен в браузере (с некоторыми ограничениями).
Даже электронная таблица очень близка к концепции образа. Она инкапсулирует всю нужную информацию. Она не может получить доступ к системным ресурсам. Её можно сохранить и восстановить. И вы должны знать, что электронные таблицы по-прежнему используются для разработки сложных моделей и приложений с собственным языком.
В общем, концепция образа широко распространена. Это настолько удобный способ разработки программного обеспечения, что версия образа была создана для JavaScript в Lively Kernel.
Всё в Smalltalk является объектом
Без исключений: всё есть объект. Нет примитивных типов данных. Нет таких управляющих структур, как выбор и итерация! Всё в Smalltalk делается путём посылки сообщений объектам. Именно это делает Smalltalk настолько простым, элегантным и лёгким в освоении. Именно это делает язык настолько чистым синтаксически.
Например, следующий фрагмент кода расширяет класс
Number
для поддержки нерекурсивной операции факториала: Number extend [
my_factorial [
(self < 2) ifTrue: [ ^1 ]
ifFalse: [ |c|
c := OrderedCollection new.
2 to: self do: [ :i | c add: i ].
^ (c fold: [ :a :b | a * b ] ) ]
]].
7 factorial printNl.
7 my_factorial printNl. “should be the same result as the previous line”
Здесь ifTrue: это ключевое сообщение посылаемое булевому объекту, возвращённому выражением (self < 2). Аргументом для сообщения является блок кода (обозначенный квадратными скобками). На самом деле ifTrue: это первая часть сообщения с двумя аргументами, вторая часть ifFalse:.
Унарное сообщение new отправляется классу
OrderedCollection
для создания новой коллекции. Сообщение printNl отправляется в результат (являющийся объектом) отправки сообщения my_factorial числу 7. Всё это очень похоже на естественный язык! Рефлексия в Smalltalk
Рефлексия в Smalltalk особенно ценна как механизм проверки собственной структуры и вычислений во время выполнения. Это очень мощный механизм, позволяющий программам расширять себя новыми классами и методами или задавать вопрос «кто послал это сообщение мне?»
Рефлексия используется для реализации мощного способа обработки ошибок. Когда объект получает сообщение, которое он не реализует, ему посылается сообщение doesNotUnderstand: и код исходного сообщения. Есть много вещей, которые программа может делать с сообщением doesNotUnderstand:, включая расширение своей функциональности!
Концепция образа и рефлексия также позволяют Smalltalk устранить границу между приложением и IDE. Всё, что нужно для разработки, отладки и запуска приложения, находится в образе. Нет необходимости когда-либо покидать среду вашего приложения. Это совершенно целостный подход к разработке программного обеспечения, который делает всё более дзен-подобным и продуктивным.
Возрождение Smalltalk
Последние 15 лет развития в мире Smalltalk сделали язык более привлекательным.
Smalltalk теперь доступен для программирования веб-интерфейсов с использованием Amber Smalltalk, который транслируется в JavaScript. Выполнение Amber происходит исключительно в браузере. Одна из удивительных особенностей Amber в том, что при импорте библиотеки JavaScript её объекты можно обрабатывать так же, как объекты Smalltalk.
В 2002 году была выпущена веб-платформа Seaside, которая стала самым популярным инструментом для веб-разработки в Smalltalk. Подход, основанный на продолжениях (сontinuation), обеспечил обычный механизм «call / return» для вашего веб-приложения. Это позволило решить проблемы с двойным запросом и кнопкой «Назад». Весьма революционно для своего времени, и до сих пор не реализовано в других веб-фреймворках.
Проект Pharo начался в 2008 году, чтобы сосредоточиться на современных методах разработки программного обеспечения. Он продвинул Smalltalk гораздо дальше, чем предыдущий проект с открытым исходным кодом – Squeak, основанный на диалекте Smalltalk-80. Проект Pharo также начал исследования нового типа IDE под названием Glamorous Toolkit. Он основан на идее, что ваша среда программирования должна быть «пластичной», чтобы соответствовать вашим потребностям.
В прошлом году любимый многими Dolphin Smalltalk стал открытым проектом, предложив ещё один прекрасный вариант для поклонников Smalltalk. Dolphin Smalltalk часто хвалят за то, что он обладает одной из лучших реализаций IDE.
Наследие Smalltalk: программируй с удовольствием
Когда вы используете современные средства разработки программного обеспечения, такие как JVM, Eclipse IDE, замыкания, «живое программирование», MVC, TDD, VMware и даже простое веб-приложение, вспомните об их происхождении в Smalltalk и испытайте уважение к тому, что вы делаете. Будьте признательны ему за языки, которые вы используете, будь то Objective-C, Python, Ruby, Groovy, Scala, Dart или Swift.
Работа с языком, из которого произошли все эти замечательные функции и технологии, предоставляет уникальную возможность значительно улучшить ваши знания, остроту ума и производительность в качестве разработчика программного обеспечения. Слово «удовольствие» не всегда используется в разговорах о программной инженерии, но я думаю, что Smalltalk и его ОО собратья обеспечивают более низкий когнитивный барьер и простоту программирования, которые могут превратить разработку программ в удовольствие.
Об авторе
Ричард Энг – отставной разработчик программного обеспечения из Канады с более чем 30-летним опытом работы в ИТ-индустрии. Он работал в сфере видео графики, баз данных и финансов, программного обеспечения реального времени, мобильных приложений для iOS и Android, а также в веб-разработке. Он писал в основном на C, но также использовал FORTRAN, Tandem TAL, C++, C#, Objective-C, Java, Smalltalk, Python и Go. Сейчас он возглавляет кампанию Smalltalk Renaissance. Большую часть времени Ричард проводит за написанием статей и эссе.