LINUX.ORG.RU

Почему ООП стало более популярным и соответствующие языки и технологии программирования чем то же ФП?

 ,


2

4

Заранее прошу прощения за то, что не в Talks, а сюда. Так получается, что теперь в Talks просто так постить нельзя, нужна некая карма и я должен «страдать» (Почему я не могу писать в раздел Talks? (комментарий)). Я в упор не помню данные своего старого аккаунта. Зарабатывать карму здесь и сейчас у меня нет ни времени, ни возможности, ни необходимости. Почему сюда, а не на другие форумы? Потому что считаю, что здесь обитают люди, которые смогут ответить на вопросы ниже и, возможно, даже, которые застали те самые времена (если конечно те самые люди ещё здесь).

Всем доброго времени суток! Не срача ради, а понимания для. Хочется понять историчность и почему так произошло. Понятно, что сейчас уже стали внедрять функциональные фичи много куда (в те же Java, C++, C# и т.д.). Стало появляться много функциональных языков (в том числе совсем новых). Но почему спустя столько времени? Почему спрашиваю:
- Functional programming has its origins in lambda calculus, a formal system developed in the 1930s (!!!) to investigate computability, the Entscheidungsproblem, function definition, function application, and recursion. Many functional programming languages can be viewed as elaborations on the lambda calculus (отсюда: https://en.m.wikipedia.org/wiki/Functional_programming);
- Lisp появился ажно в 1958 году;
- после лиспа ещё была целая куча функциональных языков (APL, IPL, ML, Miranda, Erlang, etc.);
- C++ в 1985;
- Haskell в 1990;
- Java в 1995;

Сама идея ООП (и то я так понял весьма размытая, каждый понимал (и, кстати, по-моему до сих пор понимает) по-своему) вроде как витала со времени создания самого лиспа, но до конкретных реализаций она добралась ближе к концу 80-х - начала 90-х годов.
(поправьте меня, если не прав)
И это ещё при всём при том, что ФП имеет под собой весьма конкретный математический базис (чего я, пожалуй, не могу сказать про ООП).
Я так понял, что благодаря таким крупным компаниям как Microsoft, Oracle...
Но почему они так сильно повлияли на развитие этих технологий и как именно они это сделали я, честно говоря, не совсем понимаю.
Ок, ладно, тогда железо было не такое как сейчас, памяти было маловато для нормального существования функциональных языков на x86 платформе.
Но ведь была же та же, например, Symbolics, которая вроде бы весьма активно продавала лисп-машины?
Ок, Symbolics развалилась благодаря неблагоприятному стечению обстоятельств и «эффективным» манагерам, но их наработки оказались никому не нужны что ли?
И опять-таки, когда нужное железо появилось почему выбор этих и других крупных компаний пал именно на эти языки?
Почему не на функциональные языки?
Потому что в то время функциональные языки в основном использовались сугубо в академической среде или как?
Или если перефразировать всё вышесказанное словами моего коллеги: «если всё так круто (про ФП), то почему оно ещё не захватило рынок?»

Ответ на: комментарий от eao197

Ссыль я уже давал: http://aras-p.info/blog/2018/12/28/Modern-C-Lamentations/

Этот «плач Ярославны» уже обсосали и обосрали 100500 раз.

При мне не обоссывали.
Второй не получилось раскопать в итосрии. Я не пишу на крестах и не люблю этот язык, потому с ходу не приведу хороших сравнений одного алгоритма в разных реализациях. Собсна, примеры ты сам можешь у себя найти, поискав классы, где объявления занимают больше, чем реализация, при этом сами эти объявления и реализации мелко нашинкованы и разбросаны по проекту - типичная архитектура крестов: https://github.com/chromium/chromium/blob/master/chrome/browser/autofill/addr...

byko3y ★★★★
()
Ответ на: комментарий от monk

В программировании зависит от функции, например результат POSIX sin зависит только от аргумента

верно, стало быть в общем случае, программисткая функция зависит не только от аргумента, в частном — пожалуйста

И программировать на математических функциях невозможно

я всю дорогу думал что ФП — как раз про это. Чистые функции.

Так как ассемблерные конструкции «запись в порт», «чтение из порта» не реализуются математическими функциями.

ну так запили абстракцию, в которой все реализуется. Я не прав? Я просто про ФП толком ниче не знаю, спорить не возьмусь

pihter ★★★★★
()
Ответ на: комментарий от eao197

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

Во-первых, вписывать что?

Ах да, чуть не забыл, что вписывать надо. А вписывать надо мелкие функции с используемыми ими данными. Например, наследовать «лямбду» от объекта/интерфейса.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

Тем временем ТС молчит как рыба, то есть как истинный тролль.

Да я не сомневаюсь, что это трололо тред. Мне ж лучше.

byko3y ★★★★
()

Сильно способствуют UML, IDEF и базы данных, которые вот прямо удобно перекладывать в ООП, в отличии от функциональщины. Ладно, БД с запросами не совсем удобно, но разбиение данных из мешанины в структурированный вид способствует.

peregrine ★★★★★
()
Ответ на: комментарий от byko3y

Там нет наследования

Есть. Первый элемент новой структуры - родитель

там нет инкапсуляции

void*-мембер и все шито-крыто

trex6 ★★★★★
()
Ответ на: комментарий от byko3y

это трололо тред. Мне ж лучше

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

anonymous
()
Ответ на: комментарий от pihter

ну так запили абстракцию, в которой все реализуется. Я не прав? Я просто про ФП толком ниче не знаю, спорить не возьмусь

Математически можно считать, что у функции входящие аргументы == «явно указанные ∪ состояние мира» и результат «явно указанный ∪ новое состояние мира». Но тогда возвращаемся к тому, что функция, зависящая от фазы луны, является математической, так как фаза луны неявно входит в её аргументы.

monk ★★★★★
()
Ответ на: комментарий от trex6

void*-мембер и все шито-крыто

Зачем так жестить, достаточно указателя на struct, определение которого недоступно пользователю

annulen ★★★★★
()
Ответ на: комментарий от peregrine

GTK+GDK? Мешанина жуткая, да.

Это называется «процедурная парадигма», и то с серьезными нотками ООП. Функциональная парадигма - совсем о другом.

byko3y ★★★★
()
Ответ на: комментарий от trex6

Есть. Первый элемент новой структуры - родитель

Неа, нет никакого родителя. Структура сама себе и родитель, и сын, и зять с тещей.

byko3y ★★★★
()
Ответ на: комментарий от monk

Но тогда возвращаемся к тому, что функция, зависящая от фазы луны, является математической, так как фаза луны неявно входит в её аргументы

хм ) ты только что убедительно доказал что все в мире программирования — ФП, просто не все умеют хорошо считать аргументы

ТАк выпьем же за кибернетика!

// а как же квантовая неопределенность? Мы принципиально не можем занть жив кот или мертв, через это не можем использовать это как аргумент детерминированной функции, иначе результат будет разный раз от раза

pihter ★★★★★
()
Ответ на: комментарий от byko3y

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

Это что же получается? Вы выдвинули некий бредовый тезис, а доказывать его предлагаете мне? O_o

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

А голой функциональной вообще быть не может в чём-то больше hello world или академического исследования на тему применимости функциональной парадигмы, т.к. она в голове плохо воспринимается. Напоминает почему на регулярках + какие-нибудь минимальные костыли для полноты по тьюрингу ПО не пишут.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Сильно способствуют UML, IDEF и базы данных, которые вот прямо удобно перекладывать в ООП, в отличии от функциональщины.

IDEF0 наоборот на функциональщину хорошо ложится.

monk ★★★★★
()
Ответ на: комментарий от monk

Только IDEF0 и ложится хорошо, потому что он и сделан для функциональщины, но есть IDEF4, а главное UML очень развит.

peregrine ★★★★★
()
Ответ на: комментарий от pihter

хм ) ты только что убедительно доказал что все в мире программирования — ФП, просто не все умеют хорошо считать аргументы

Если отталкивать от определения, то да. А также всё в мире ООП, так как все любые данные определённо являются объектами и относительно любой функции эти объекты делятся на классы (по критерию применимости в качестве аргумента).

Поэтому выделяют именно стили программирования. Если программа выглядит как установитьданные(данные), действие1(), действие2(), действие3(), действие4(), значит процедурный стиль. Если как данные.действие1(), данные.действие2(), данные.действие3().действие4(), значит ООП. Если как (действие1 >> действие2 >> действие3 . действие4) $ данные, значит ФП.

monk ★★★★★
()

Потому что 95% населения — идиоты.

Ваш К.О.

rebforce
()
Ответ на: комментарий от peregrine

Только IDEF0 и ложится хорошо, потому что он и сделан для функциональщины

Ещё IDEF3 есть.

есть IDEF4, а главное UML очень развит.

Это как раз потому, что ООП востребован. То есть выбор парадигмы в данном случае не ограничивается доступностью инструменатов проектирования. Но вот выбор инструментов определяется выбором парадигмы. Если выбрал ООП, то естественно будешь брать IDEF4 и UML.

monk ★★★★★
()
Ответ на: комментарий от peregrine

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

Обновление модели происходит как в Actor Systems, но функция обновления тоже чистая. (msg, model) => newModel. Тоже можно представить что модель заново пересоздается, до опять, внутри этого не происходит за счёт персистентных структур данных.

Я реально так мог бы научить писать фронтенд за несколько часов. Разве это не просто?

vertexua ★★★★★
()
Ответ на: комментарий от pihter

Мы принципиально не можем занть жив кот или мертв, через это не можем использовать это как аргумент детерминированной функции, иначе результат будет разный раз от раза

Детерминированная функция будет в терминах волновой функции. А коллапс результирующей волновой функции будет вне чистого вычисления.

monk ★★★★★
()
Ответ на: комментарий от peregrine

Напоминает почему на регулярках + какие-нибудь минимальные костыли для полноты по тьюрингу ПО не пишут.

Пишут и еще как: посмотри на APL и, особенно, на наследников - регулярки тихо курят в углу.

yyk ★★★★★
()
Ответ на: комментарий от byko3y

Мое мнение по реализации лямбд в C++: сделайте простые вложенные функции и сделайте анонимные классы,

ай ной зет филинз, бро. мне тоже так кажется. сегодняшние лямбды - хрень какая то.

хотя анонимные классы уже есть в какой то степени

template <typename T>
void f(T &t) {
  t.method1();
  t.method2();
}

int main() {
  struct {
    void method1() {puts("hello!");}
    void method2() {puts("bye!");}
  } a;
  f(a);
}

но удручает, что так сделать нельзя, например:

f(struct {
  void method1() {puts("hello!");}
  void method2() {puts("bye!");}
} ());

а также наследование и доступ к контексту вне класса в пролёте

int i= 42;
f(struct [i например] {
  void method1() {printf("hello with %d", i);}
  void method2() {puts("bye!");}
} ());

такое было бы вообще бімбой

struct iface {
  virtual void method() = 0;
};

void f(iface &t) {
  t.method1();
  t.method2();
}

int main() {
  int i= 42;
  f(struct : iface {
    void method1() override {printf("hello with %d", i);}
    void method2() override {puts("bye!");}
  } ());
}
с таким не надо было бы никаких лямбд, плюс был бы бонус в виде перегрузки методов, что было бы примитивным паттерн матчингом, но комитет свернул куда то не туда :(

anonymous
()
Ответ на: комментарий от eao197

Пример в студию.

class hello_actor final : public so_5::agent_t {
public:
   using so_5::agent_t::agent_t;

   void so_evt_start() override {
      std::cout << "Hello, World!" << std::endl;
      // Finish work of example.
      so_deregister_agent_coop_normally();
   }
};

оформи это в виде лямбды, хехе :)

anonymous
()
Ответ на: комментарий от peregrine

А самому, значит, найти и хоть бегло посмотреть kx.com религия не позволяет?

yyk ★★★★★
()
Ответ на: комментарий от Eddy_Em

эдик, я могу и на асме написать и 5000000000 строк кода, но поддерживать это будешь ты, хехе)

anonymous
()
Ответ на: комментарий от Eddy_Em

Иы тред прочитал? Я имел в виду что лично я все равно скатывпбсь в ООП хоть и на си. ООП в кавычках

pihter ★★★★★
()
Ответ на: комментарий от eao197

Хамоватый ты стал в последнее время...

anonymous
()
Ответ на: комментарий от rassol

про какое именно ООП идёт речь? (здесь (и не только здесь и не только сейчас) очень много было высказано чем оно является и чем нет)
и какой же у ООП математический базис?

Eid010n
() автор топика
Ответ на: комментарий от monk

Математически можно считать, что у функции входящие аргументы == «явно указанные ∪ состояние мира»

В ФП нет никакого состояния мира, есть только аргументы внешней функции, которые могут быть использованы как аргументы внутренней.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Вы очень плохо себе представляете способ реализации ООП в чистом С.

trex6 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Я не пишу на крестах и не люблю этот язык

Я не пишу на X, но уверен что он плох. (с)

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

byko3y ★★★★
()
Ответ на: комментарий от eao197

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

Это что же получается? Вы выдвинули некий бредовый тезис, а доказывать его предлагаете мне? O_o

Я дал новую ссыль с типовым модулем на крестах, я не увидел «обоссывания» моего первого аргумента - я не вижу вообще попытки ответной аргументации. Я тут вроде лектором не нанимался.

byko3y ★★★★
()
Ответ на: комментарий от peregrine

А голой функциональной вообще быть не может в чём-то больше hello world или академического исследования на тему применимости функциональной парадигмы, т.к. она в голове плохо воспринимается.

Вот именно. Потому адепты ФП аля Haskell - отбитые наглухо. Как они элементарные конструкции завернули в монады и превратили в сложнопонимаемое нечто - это один из примеров.

byko3y ★★★★
()

Почему ООП стало более популярным и соответствующие языки и технологии программирования чем то же ФП?

Потому что зачем делать сложнее то, что можно сделать проще

vasily_pupkin ★★★★★
()
Ответ на: комментарий от anonymous

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

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

Я тебе скажу, куда свернул коммитет: он пытается оправдать свое жалкое существование, но сделать это непросто на фоне того, что созданная ими модель ООП полностью дискредетировала себя; тогда они делают резкий переворот и притворяются адептами ФП, внося в язык лямбды в абсолютно чуждом всему остальному языку виде.

Иными словами. поведение коммитета похоже на поведение создателей других хайповых технологий/методов, как то Java, MySQL, Docker, разных технологий JavaScript, REST API, Blockchain, Server-oriented architecture, Bigdata, Agile, Cloud computing - просто вброс красивых слов, как еще один инстурмент маркетинга. Как я уже писал, в IT индустрии многое в принятии решения елжит в области иррационального.

byko3y ★★★★
()
Ответ на: комментарий от pihter

Иы тред прочитал? Я имел в виду что лично я все равно скатывпбсь в ООП хоть и на си. ООП в кавычках

Нет, ты скатываешься к своему пониманию ООП, которое у тебя весьма странное и всепоглощающее.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

И меж тем, правильное использование элементов функционального программирования очень удобно и хорошо, при условии нормального компилятора. Как пример, цикл for часто можно на map + функция менять, что теоретически позволяет параллельно код выполнять, правда в том же питоне для этого костыли нужно нести, да и медленный он слишком, чтобы был смысл его параллелить на текущем количестве ядер в машинах.

peregrine ★★★★★
()
Ответ на: комментарий от monk

Haskell: https://wiki.haskell.org/IO_inside#Welcome_to_the_RealWorld.2C_baby
Clean: Start:: *World -> *World
ФП без состояния мира разве что XSLT, но это не язык общего назначения.

Вот именно, они постоянно борятся за чистоту рассы, загоняя все нечистые функции в угол, как бы устраняя их из игры. Потому «hello world» на хаскеле - это элементарный пример нечистой программы.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Я дал новую ссыль с типовым модулем на крестах

И что там я должен был увидеть?

я не увидел «обоссывания» моего первого аргумента - я не вижу вообще попытки ответной аргументации

Какого аргумента? У вас не было аргументов от слова совсем, было ваше личное мнение. На что вам было высказано другое личное мнение, а именно: хорошо, что ваше мнение не учитывали при развитии C++.

И, если вы не поняли, «обсосали и обосрали» относилось не вам и вашему личному мнению о C++, а о ссылке на старую статью «Modern C++ Laminations», которую в свое время обсуждали в Интернетах чуть ли не на каждом шагу.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Вот именно, они постоянно борятся за чистоту рассы, загоняя все нечистые функции в угол, как бы устраняя их из игры. Потому «hello world» на хаскеле - это элементарный пример нечистой программы.

Советую все же прочитать хороший учебник по хаскелю перед тем, как нести пургу о нем. Или чтобы понимать термины.

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

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

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.