LINUX.ORG.RU

[вброс]Почему объектно-ориентированное программирование провалилось?

 


2

7

http://citforum.ru/gazeta/165/

по линку многабукаф, немного для Ъ:

факт остаётся фактом: сторона, представлявшая объектно-ориентированное программирование, во время открытой дискуссии с противниками под смех зала даже запуталась в своих же концепциях. Люди вспоминают, что у всех создалось стойкое впечатление, что аргументация Lisp’еров была куда убедительней и последовательней, чем сторонников ООП.

Другой крупный критик ООП – это известный специалист по программированию Александр Степанов, который, работая в Bell Labs, участвовал в создании C++ вместе c Бьерном Страуструпом (Bjarne Stroustrup), а впоследствии, уже после приглашения в HP Labs, написал Standard Template Library (STL). Александр Александрович полностью разочаровался в парадигме ООП; в частности, он пишет: “Я уверен, что парадигма ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, только тогда на этой основе выводится аксиома. Т.е. в математике вы заканчиваете аксиомой. Тоже самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы вы приходите к тому, что оказываетесь в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг – из-за ущербности парадигмы вы просто обречены на переписывание программы, уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле”.

Ричард Столлман (Richard Stallman) также известен своим критическим отношением к ООП, особенно он любит шутить насчет того мифа объектников, что ООП “ускоряет разработку программ”: “Как только ты сказал слово «объект», можешь сразу забыть о модульности”.

Ричард Гэбриел неожиданно сравнивает нынешнюю ситуацию с ООП с провалом эфиродинамики в физике начала 20 века, когда, в сущности, произошла “тихая революция”.

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

ну и какой смысл в форте, если из-за типизации стэк раздуется в 1.5 раза?

Вот я и говорю - а где он (стек, память) не раздувается из-за типизации. По моему во всех динамических языках. Можно пытаться разбоксировать всё и вся и строить безтэговую модель памяти. Но бестеговая модель стека - это как?

Например:

typedef enum {
  BOOLEAN,
  INT16,
  ...
} TypeTag;

typedef struct {
  TypeTag type;
} Object;

typedef struct {
  union {
    TypeTag type;
    ...
  }
} Boolean;

typedef struct {
  union {
    TypeTag type;
    ...
  }
} Int16;

...

Операции

Object* push(Object *object);
Object* pop();

Будут определены, а вот если убрать тэги со стека - push ещё ладно, но как будет работать pop?

(Можно хранить структуры в памяти, а на стек класть/снимать указатели , но это незначительно - чтобы сделать pop, нужно перейти по указателю и прочесть... сколько? нужен тэг?)

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

> ну и какой смысл в форте, если из-за типизации стэк раздуется в 1.5 раза?

Да ладно! Тебя же, вон, чего-то раздуло раза в полтора-два, так... Сижу, вот, теперь, думаю: подколоть или ну его, а то монитор заляпаешь?

P.S. Кстати, а при чём здесь стек?

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

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

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

> Но бестеговая модель стека - это как?

Бог мой! А это что ещё за хрень?! Что значит теговая-бестеговая? Это, вообще, о чём? Сколько нужно заплатить, чтобы от этого избавиться?!

а вот если убрать тэги со стека - push ещё ладно, но как будет работать pop?

Эта... старый-добрый способ ( id0 id1 id2 id3 id4 .. id[n-1] n — ) не то?

И что такое теги на стеке, зачем их убирать со стека и что они там, вообще, делают?

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

Бог мой! А это что ещё за хрень?! Что значит теговая-бестеговая? Это, вообще, о чём? Сколько нужно заплатить, чтобы от этого избавиться?!

И что такое теги на стеке, зачем их убирать со стека и что они там, вообще, делают?

Эта, я не понимаю вашего не понимания. Что такое тайптег не знаете? Чтобы отделять объекты разных типов в рантайме динамических языков - то что называется латентной (скрытой) типизацией у typeless языков.

Таки как будет работать pop без тайптегов?

Кстати, вот что интересно:

( id0 id1 id2 id3 id4 .. id[n-1] n — )

Это что? Это на форте что-то? Если да - при чём тут закорючки target языка?

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

s/не понимания/непонимания/

s/typeless/dynamic typed/ скорее всего.

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

Таки как будет работать pop без тайптегов?

А проблемы связи pop с тайптегами очень важны? Неужели так сложно определить размер структуры и сколько данных нужно выкинуть со стека без тайптегов?

( id0 id1 id2 id3 id4 .. id[n-1] n — )

Эта запись отображает состояние стека, когда на его вершине лежит число n, а под ним n ячеек (размера CELL, например 4 байта) данных.

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

Неужели так сложно определить размер структуры и сколько данных нужно выкинуть со стека без тайптегов?

Размер структуры и определятеся в зависимости от тайптега:

size_t size_of(Object *object) {
  switch object->type {
    case BOOLEAN: return sizeof(Boolean);
    case INT16:   return sizeof(Int16);
    ...
  }
}

Например - на вершине стека лежит объект (число, символ (указатель на него), структура (указатель на неё)) нужно его удалить. Вопрос - сколько байт удалять? И как вообще узнать - число там или символ или что? Вот тайптег и указывает - что именно лежит и сколько удалять.

Нужно поправится - Forth допустим typeless, т.е. вопрос о тэгировании значений на стеке может выглядеть странным (точно не знаю), но ведь еть другие языки (Factor, напрмер) где этот вопрос естесвеннен. Это www_linux_org_ru захотел и типизировать значения на стеке и чтобы без тайптегов - вот я и удивился, как это можно сделать (?)

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

Вопрос - сколько байт удалять? И как вообще узнать - число там или символ или что?

Да, причём не в семантике форта, а в семантике реализации его VM.

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

> типизировать значения на стеке и чтобы без тайптегов - вот я и удивился, как это можно сделать (?)

А отказ от пользовательских значений на стеке и использование всеми операциями адресов структур операндов может быть решением проблемы?

Вообще-то говоря, распознать на бестиповом стеке типы структур - занятие, мягко говоря, даже выглядит сомнительным. И совершенно непонятно: зачем?

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

А отказ от пользовательских значений на стеке и использование всеми операциями адресов структур операндов может быть решением проблемы?

В принципе да. По крайней мере после того как адрес будет взят со стека и мы возьмём по нему структуру - тут ситуация сведётся к подобным в других языках программирования.

Например пусть на стеке (даже уже не важно что на стеке) могут лежать целые числа (integer) и рациональные числа rational как пара (integer, u_integer). И нужно построить, для начала, полиморфную операцию (+), это по крайней мере:

(+) :: integer,  integer  -> integer
(+) :: integer,  rational -> integer or rational
(+) :: rational, integer  -> integer or rational
(+) :: rational, rational -> integer or rational

И тут два варианта:

1) Поле типа при структурах, четыре спецификации для (+) и один generic.

2) Немного другая терминология - компиляция абстракции паттерн-матчинга такая, что специфичные (+) функции будут ссылать на те области памяти которые по типам гарантировано совпадают с соответсвующим типом спецификации, в этом случае таптег можно убрать (tagless).

Вообще-то говоря, распознать на бестиповом стеке типы структур - занятие, мягко говоря, даже выглядит сомнительным. И совершенно непонятно: зачем?

Ну можно взять гетерогенные списки типизированных значений и построить на них базовые операции форта - будет типизированный динамический стек.

А сами типы, видимо, нужны ради типов - например вот есть статья про вывод типов на типизированном стековом языке: Simple Type Inference for Higher-Order Stack-Oriented Languages.

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

>(Можно хранить структуры в памяти, а на стек класть/снимать указатели , но это незначительно - чтобы сделать pop, нужно перейти по указателю и прочесть... сколько? нужен тэг?)

форт еще как-то можно спасти, если тэги хранить где-то параллельно... типа как на стэке возвратов; но со мной предпочитают ругаться, а не слушать :-)

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

>форт еще как-то можно спасти, если тэги хранить где-то параллельно...

Да вагон там вариантов. Это-то и погубило в своё время Форт. Слишком легко реализуются слишком разные варианты. Каждый затачивает под себя и плевать ему на других.

Если уже тэги приспичит хранить именно на стеке, то лучше это делать не в параллельном стеке, а в основном же. Как под DOS указатели хранили в виде двух 16-битных целых. Или как всю жизнь в классическом Форте на стеке хранят строки.

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

> Да вагон там вариантов. Это-то и погубило в своё время Форт. Слишком легко реализуются слишком разные варианты. Каждый затачивает под себя и плевать ему на других.

Кстати, да. Слишком много возможностей. Слишком легко, ещё на начальном этапе, реализуются разные варианты. А первоначальное решение использовать те или иные инструменты или эффекты, заложенное в фундамент, как правило диктует дальнейшую методику работы. Цена ошибки проектирования заложенной в фундамент становится слишком высокой. К примеру, можно наблюдать огромное количество реализаций ООП в Forth (в виде классов, микроклассов и пр. характерных для изначально не предназначенных для этого языков), а родные механизмы остаются, как правило, недостаточно изучены и поняты.

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

К примеру, решение пометить все генераторы и экземпляры метками типов, с последующей реализацией механизма наследования (например, по типу связного однонаправленного списка как слов в словаре), предопределит дальнейшую работу с типами по принципу специального полиморфизма, пусть и на самом деле мы, в конечном итоге, хотели реализовать в DSL нечто вроде параметрического полиморфизма. Но это скорее проблемы проектирования (классификации) и понимания разницы между инструментом и решением поставленной задачи. Момент, когда инструмент становится решением поставленной задачи, определять должен программист, а не инструмент. Вот, собственно, где-то здесь проблема и проявляется.

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

форт еще как-то можно спасти, если тэги хранить где-то параллельно...

Если посмотреть на Factor, который и динамически типизирован и имеет статические типы с кое-киким выводом (прям стэковый CL какой-то) то можно замететь, что автор действительно испытал сильное влияние SBCL ;) там такие же tagged pointers - в принципе это тот же подход что и структуры с полем типа, только более гибкий - тегируются («толстые») указатели на данные а не сами данные, при этом integers тоже 29 битные как и в SBCL ;D

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.