Как стать автором
Обновить

Комментарии 24

Что, в соответствии с мыслями Алана Кэя, является самым главным в ООП? — … Динамическая привязка (т.е. Позднее связывание)…
Что в ООП несущественно? — … Полиморфизм…

Но, Полиморфизм — это не что иное как реализация позднего связывания!
Тезис Чёрча-Тьюринга показал, что лямбда-исчисление и машины Тьюринга функционально эквивалентны.

Тезис Чёрча-Тьюринга не об этом.
Есть один вопрос. Кто сказал, что значение термина ООП не изменилось, с тех пор как этот термин был придуман? И на каком основании он это сказал?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

А лучше не медитировать, а пописать на Smalltalk в котором между написанием программы и ее рантаймом нет никакой разницы.


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


В современных "динамических" языках информация о "типах" доступна только в рантайме. Так как в этих языках динамичность осталась только в рантайме, но момент написания все еще статический (текстовые файлы), то создается mismatch.


Smalltalk — совсем другой фрукт. Он делает динамическим не только способ работы системы как таковой, но и принцип работы человека с системой. В Smalltalk нет файлов. Кент Бек по этому поводу сказал "I mean, source code in files; how quaint, how seventies!". Да, в Smalltalk исходный код — это текст, но он находится не в файлах.

Я вот склонен говорить о типах.
Очень забавный момент в этом плане — что Хаскель в статье упоминается, как пример свободы — в то время как у него жуть какая строгая система типов, C++ отдыхает. И то, что эта система позволяет описывать вещи, которые в C++ делаются через всякий ад вроде dynamic_cast — это не меньшая строгость, а бОльшая продуманность системы (правда, отчасти доступная только за счёт иммутабельности). С JavaScript сравнивать не приходится… (увы-увы, мне порой приходится писать на js, и никогда на хаскеле — и жёсткой типизации очень не хватает)

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


«Течет по памяти» не лисп, а дизайн программы (развивая мысль далее — структура, алгоритм). На любом (garbage-collected и не только) языке запросто устроить бесконечную «утечку» памяти в виде списка или мапы в которую ежесекундно будут добавляться (и не освобождаться) терабайты.

Я бы сказал что напротив, у лиспа, не отличающего данные и код полнейший контроль программы. Правда, это приносит известные проблемы — так как лисповое состояние обладает персистентностью (т.е. можно сохранять/загружать) то со временем трудно сказать (и понять, и отлаживать) что представляет собой программа. Иными словами, у лиспа проблемы с масштабируемостью вверх на большие и сверхбольшие проекты.

Любопытный факт — понятие mudball идет с лиспа. https://en.wikipedia.org/wiki/Big_ball_of_mud#In_relation_to_Lisp поэтому уход лиспа в специфическую нишу определен конечно же не проблемами с памятью, а развитием ООП, которое позволило сделать разработку и работу больших проектов предсказуемой (т.к. она разделена на изолированные классы).
Есть распространённое заблуждение, в соответствии с которым машины Тьюринга могут вычислить всё, поддающееся вычислению. Существуют классы проблем (например — проблема остановки), которые могут быть вычислимыми с использованием машин Тьюринга лишь для некоторых случаев.

«Вычислимо» и «вычислимо на машине Тьюринга» — синонимы (сверхтьюринговых вычислений никто пока не смог придумать), и проблема останова никак этому не противоречит. Что вообще значил этот тезис? Ну и дальше идёт какая-то шизофазия про противопоставление лямбд императивному подходу (императивность — это антоним декларативности, а не лямбдам), и прочие сектантсткие «Правильные трактования слов Отца ООПа». Это не история ООП, это ассоциативный ряд запутавшегося в тьюринговой трясине джуниора.
Тезис Чёрча утверждает «Все функции, вычислимые в неформальном смысле, вычислимы и с помощью лямбда-термов». Тезис Тьюринга утверждает то же самое про машины Тьюринга. То есть именно «машины Тьюринга могут вычислить всё, поддающееся вычислению». До этого считалось, что вычислимость — понятие философское и формализовать её нельзя.
Они реализуют стандартизированные интерфейсы, а это значит, что они могут взаимодействовать друг с другом.

Вот как эти стандартизированные интерфейсы выглядят, и как вместе с сообщениями передавать информацию о произошедших событиях — это большой вопрос, потому что это всё сильно попахивает WinAPI'шными, прости г-ди, lParam / wParam.

Упрощению описания управления потоками событий может помочь ныне популярная реактивно-функциональная парадигма, как раз прежде всего в UI-фреймворках и широко применяемая ныне — ReactiveX.
Исправьте опечатку плиз «таковыми в List»

Конечно, мы не будем приводить в пример концепции ООП Кея Erlang, а будем со всех сил тянуть за уши JS.

Плюсую. Вообще по моему опыту люди рассуждающие о "будущем программирования" и "единственно верной парадигме", которая к нему приведёт, обычно знают мало языков и этих самых парадигм. Что приводит к попыткам переизобрести пролог: давайте опишем что мы хотим, а оно само как-то заработает.

Жаль, что Erlang довольно низкоуровневый в плане реализации ООП. Если в Smalltalk для обработки сообщения объектом достаточно создать метод с нужным селектором, то в Erlang принято сначала писать сервер, который умеет обрабатывать определенные сообщения, а потом клиент для этого сервера.


Но Erlang создавался для решения конкретных инженерных задач, и он справляется с этими задачами на ура. Очень приятный язык.

Есть такой проект — Lisp flavoured Erlang, может, там с ООП получше (сам не использовал и даже пока подробно не изучал).
Мне вообще сразу вспомнились акторы. Это как раз про обмен сообщениями, инкапсуляцию, рантаймовое связывание. Erlang пощупать не удалось, но когда-то пробовал Akka (акторы для JVM), и мне очень понравилось. Ещё есть Quasar, который считается более современной реализацией.
Есть еще одна вещь, изначально пребывавшая в идее Simula и SmallTalk. В настоящее время её частично отражает сервис-ориентированная архитектура. Описываемые автором «компоненты» — можно и следует рассматривать именно как как отдельные программы. Подобное рассмотрение в виде отдельных, (возможно асинхронных) изолированных, коммуницирующих «живых» программ помогает лучше приблизиться к пониманию изначальной сути ООП и проектировать лучшие системы. Подобный взгляд отличается от взгляда на объекты как на «данные с кодом». Казалось бы, данная мысль просто «виньетка», ан нет…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий