Почему каждый Ruby-разработчик должен знать Smalltalk?

Оставить комментарий

Вне зависимости от языка программирования, который вы используете, вы наверняка что-то слышали о Smalltalk. И на это есть свои причины. Влияние этого языка на то, что и как программисты делают сейчас, сложно переоценить. Такие понятия, как рефакторинг, экстремальное программирование, разработка через тестирование, различные механизмы виртуальных машин, — все это пришло из общества Smalltalk. Программисты всегда имеют склонность восторгаться какими-нибудь новыми фишками и абсолютно не помнят историю своего ремесла. Node.js вырывается в тренд? Давайте все начнем его учить и говорить только о нем! Как результат, люди снова и снова стараются решить одни и те же проблемы, зачастую выбирая для этого неправильные инструменты. Чтобы этого избежать, Виктор Савкин, разработчик Enterprise приложений из Торонто, в своем блоге советует уделить внимание «историческим» технологиям, таким как Smalltalk или Lisp. Вот несколько причин, почему это стоит сделать.

Что же такого интересного в этом Smalltalk?

1. Синтаксис Smalltalk

Smalltalk: service: = WeatherForecastService forLocation: 'Toronto'. forecast: = service forecastForDays: 5 format: 'Xml'. Ruby: service = WeatherForecastService.forLocation 'Toronto' forecast = service.forecastForDaysInFormat (5, «xml») Он намного ближе к английскому, чем, например, к Ruby. Для людей, которые привыкли использовать символ. как оператор вызова метода, это, возможно, будет слегка непривычно, однако Виктор считает, что код на Smalltalk выглядит намного более читаемым. Еще одна особенность синтаксиса, которая привлекает его в Smalltalk, — это использование блочных литералов. Если вам нужно передать несколько блоков в метод в Ruby, это выглядит несколько неуклюже, и наверняка именно поэтому так мало кто делает: service.forecastFor ->{puts «Do stuff"}, ->{puts «handling errors"} Этот же код на Smalltalk выглядит гораздо лучше: service forecastFor: [Transcript show: 'Do stuff'] error: [Transcript show: 'Error! ']. Эти особенности позволяют применять огромное количество паттернов, которые используются Smalltalk-программистами, но закрыты для тех, кто пишет на Ruby.

2. Минималистичность языка

В Smalltalk очень мало обязательных элементов. Например, в этом языке нет синтаксиса для условий или циклов: (1 = 1) ifTrue: [Transcript show: 'True'] ifFalse: [Transcript show: 'False'] Да, именно так пишется условие в Smalltalk. Просто отправка сообщения ifTrue: ifFalse объекту Boolean. Почему это круто? Потому что это придает невиданную гибкость языку! Многие жалуются, что в Ruby 0 и пустой массив эквивалентны: if []     puts 'true' else     puts 'false' end Приведенный выше пример выведет «true», и вы никак не сможете переопределить это поведение в Ruby. Сделать это в Smalltalk очень просто. Если вы хотите, чтобы пустой массив равнялся false, просто напишите свою реализацию метода ifTrue: ifFalse. Так как в Smalltalk нет синтаксиса для условий, простое переопределение метода ifTrue: ifFalse решает эту проблему. И вам не нужно использовать никаких «магических» трюков из виртуальной машины. Виктор подчеркивает, что он никоим образом не хочет сказать, что Ruby хуже, чем Smalltalk, — просто у них разные предназначения. Ruby обладает очень богатым синтаксисом. В нем есть множество специальных конструкций на разные случаи жизни, использование которых, часто позволяет писать очень элегантный код. Smalltalk, напротив, предлагает вам небольшое количество базовых конструкций, которые можно расширять и переопределять, исходя из ваших нужд.

3. «Образный» язык

Синтаксис — не единственная удивительная вещь в Smalltalk. Что действительно отличает его от других языков программирования — Smalltalk является больше, чем языком. Smalltalk = Виртуальная машина + Язык Программа на Smalltalk = Виртуальная машина Как происходит разработка на Smalltalk? Когда вы начинаете писать приложение на Smalltalk, вы не запускаете Emacs или RubyMine, вы запускаете виртуальную машину. И уже именно она предоставляет вам инструменты для разработки, такие, как отладчик или инспектор классов. А затем, используя эти инструменты, вы вносите изменения непосредственно в виртуальную машину. В общем, каждый проект на Ruby может быть рассмотрен как исходный код и запущенное в интерпретаторе приложение. Исходный код — это просто текст, а приложение — это набор объектов, взаимодействующих друг с другом. В Smalltalk такого разделения нет. Вы редактируете исходный код вашего приложения во время его выполнения. Платформы, которые реализуют подобный подход, называются image-based. Каждый раз при остановке виртуальной машины ее образ будет сохранен на диске, и при следующем запуске она восстановится из него в том самом виде, в котором была остановлена. Когда ваше приложение будет готово, Smalltalk сгенерирует образ для распространения, в котором будут включены только те части виртуальной машины, которые используются приложением. Поэтому среда разработки в ваш релиз не попадет.

4. Потрясающий инструментарий

Тот факт, что программа на Smalltalk, будучи частью виртуальной машины, знает все о самой себе, делает процесс разработки очень легким. Даже в наши дни, через 40 лет с момента первого выпуска Smalltalk, его инструментарий все еще кажется поразительным. Несмотря на динамическую типизацию языка, приложения легко рефакторить. Процесс отладки поистине изумляет. Если вы отправите сообщение, которое Smalltalk не сможет распознать, он уточнит, не опечатались ли вы при наборе и предложит несколько вариантов, которые вы вероятно хотели отправить. Если ваше приложение допустит исключительную ситуацию, Smalltalk отобразит диалоговое окно с иерархией допустивших эту ситуацию вызовов. Вы можете выбрать любой элемент этой иерархии и просмотреть состояние объектов. Разве это не потрясающе?

5. И еще кое-что…

Есть еще множество великолепных вещей в Smalltalk, которые Виктор не упомянул: распределенное хранение объектов, сохранение состояния приложения и много других.

6. Реализации

Если у вас возник интерес к Smalltalk, Виктор советует начать знакомство с одного из двух образов виртуальной машины: Pharo Squeak *** Пост Виктора Савкина вызвал в среде разработчиков целую волну обсуждений. Одни соглашаются с автором, другие вступают в дискуссию. Вот несколько наиболее интересных комментариев: joshsusser Я работаю со SmallTalk уже много лет, начиная от разработки приложений и написания кода и заканчивая созданием виртуальных машин в Xerox. И этот опыт все во многом повлиял на всё, что я пишу на Ruby. Ruby великолепный язык, однако в нем есть много не объектно-ориентированных возможностей, которые могут вас запутать, если вы не понимаете, что именно вы делаете. Потратив время на работу с предельной простотой языка Smalltalk, вы сможете получить лучшее представление о том, как применять все возможности Ruby. Enrique Garcia Cota Я действительно не считаю, что аргумент «синтаксис Smalltalk близок к естественному английскому» справедлив. По крайней мере, приведенный в статье пример. На Ruby можно написать точно так же: service = WeatherForecastService forLocation: 'Toronto' forecast = service.forecast days: 5, format: «xml» Что касается блочных литералов, то здесь я соглашусь. Действительно, в Ruby хотелось бы более удобного вызова. Хотя и здесь есть прогресс: до введения нотации –> { } была только возможность лямбда-функции { }. Теперь о виртуальной машине — саму идею я понял. Но я не понял, зачем она нужна. Я вижу, что ее использование накладывает дополнительные условия и некоторые усилия по осмыслению концепции, но я не вижу какие проблемы это решает. Гибкость в переопределении? Это достаточно противоречиво. С одной стороны — это классно. Но с другой — что если одна библиотека переопределит 0 как true, а другая будет ожидать обратного? Насчет инструментария. Я использую Vim и терминал, и эти программы тоже превосходны. И я могу использовать их для разработки на любом языке/фреймворке. Так зачем же мне изучать еще один, специфический инструмент для одного лишь Smalltalk? Источник А что вы думаете о Smalltalk?


Читать на dev.by