LINUX.ORG.RU

[philosophy] В чем заключается революционность перехода от функциональщины к ООП?


1

0

Так уж повелось, что первый язык, который я изучал, был делфи. Потом всякие сишарпики, С++, лисп, и т.п. В итоге, как мне кажется, у меня ООП головного мозга. Когда возникала задача писать на С, я начал реализовавывать обьектную модель в этом языке.

«Стоп», сказал я себе и подумал. Почему сейчас все кругом вопят про ООП и про его архиполезность и архиправильность? Далее, по ходу раздумий, пришел к мысли, что все, что пишется с использованием ООПшной парадигмы, может быть написано и без нее.

Почему появились языки, которые взяли ООП за главенствующую идею (java, c#, етц)?

Неужели те преимущества, которые предлагает ООП (полиморфизм, инкапсуляция, наследование), дают прирост в эффективности, скорости написания программ, понимания их работы и поддержке? Здесь было бы интересно сравнить одну и ту же программу, написанную на С и на С++, чтобы узреть принципиальные архитектурные различия (может такие уже есть?).

Сухой остаток. ООП представляет из себя еще один уровень абстракции, который позволяет оперировать про проектировании не функциями, а обьектами. А неужели это так меняет дело и делает разработку более удобной?

Было бы интересно без срачей услышать компетентное мнение.

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

> Вовсе нет. Несколько человек совсем не ждут от тебя чуда, но им чертовски интересно, как ты будешь выкручиваться. ;)))

Все, что надо было написать, я уже написал (см. последние 3 кусочка кода в http://www.linux.org.ru/jump-message.jsp?msgid=5034750&cid=5050216), и даже больше — там пошел уж совсем детский сад, так что мне пришлось заняться чтением вслух с выражением написанного кода.

Соответственно ждать больше нечего, позиция изложена.

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

> Ну, если ты не понимаешь, что речь не об этом...
Речь не конкретно об этом, но это и есть пример _использования_ не введенного значения. У тебя же таких примеров не было

oh
()
Ответ на: комментарий от www_linux_org_ru
(deftype hex () '(integer 0 15))

(defun foo (x)
  (declare (type hex x))
  (1+ (ash x -1)))

(defun bar (x)
  (declare (type (integer 100 200) x))
  (foo x))

(defun baz ()
  (foo 16))
; compiling file "D:\\SBCL\\int.lisp" (written 27 JUN 2010 11:10:07 PM):
; compiling (DEFTYPE HEX ...)
; compiling (DEFUN FOO ...)
; compiling (DEFUN BAR ...)

; file: D:\SBCL\int.lisp
; in: DEFUN BAR
;     (FOO X)
; 
; note: deleting unreachable code
; 
; caught WARNING:
;   Asserted type (UNSIGNED-BYTE 4) conflicts with derived type
;   (VALUES (INTEGER 100 200) &OPTIONAL).
;   See also:
;     The SBCL Manual, Node "Handling of Types"

; compiling (DEFUN BAZ ...)

; file: D:\SBCL\int.lisp
; in: DEFUN BAZ
;     (FOO 16)
; 
; note: deleting unreachable code
; 
; caught WARNING:
;   Asserted type (UNSIGNED-BYTE 4) conflicts with derived type
;   (VALUES (INTEGER 16 16) &OPTIONAL).
;   See also:
;     The SBCL Manual, Node "Handling of Types"
; 
; compilation unit finished
;   caught 2 WARNING conditions
;   printed 2 notes

; D:\SBCL\int.fasl written
; compilation finished in 0:00:00.453
Love5an
()
Ответ на: комментарий от tailgunner

Ты упоролся чтоль? Где я это делал? Это ты такое утверждал, а не я.

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

> приведи пример такого компилятора

хинт: привести пример невозможно, если в том примере int foo(int) throw(); тебе придется загнать константы в сигнатуру либо прямо int foo(Int<0,15>) throw() либо через придумывание класса

frama-c

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

> Вы съезжаете с темы в идиотский разговор о возможностях компилятора по части оптимизаций.

Это не имеет отношение к оптимизациям.

Везде выше по топику выражение «компилятор знает» означает возможность _программиста_ использовать значение в вычислениях времени компиляции.

Разве началом не был пост где рассказывалось про проверку |a+b+c+d+e|==|a+e+d+b+c|?

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

> между нереалистичным «телепатическим шаблоном» и «рантаймом» есть куча промежуточных (и реалистичных!) способов использования типизации;

В плюсах - нет. Либо время компиляции, либо время выполнения. Tertium non datur. Максимум, что можно сделать - вынести типизацию в один из этапов препроцессинга до компиляции, чем, кстати, занимаются шаблоны и всевозможнные #define size_t/ptrdiff_t & K°.

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

> Пройди по ссылке и увидь текст

Который я скопировал, чтобы показать тебе? Ну, прям даже и не знаю, смогу ли я его прочесть и уж тем более понять...

ты хотел просто повыпендриваться своей практичностью.


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

Разговор имеет смысл, если он предметен, сколь бы абстрактным ни был этот предмет. Но если разговор беспредметен, то и смысл из него испаряется самым волшебным образом.

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

> Это не имеет отношение к оптимизациям.

Статический анализ кода, усечение графов и определение диапазонов значений - это всё способы оптимизации. Речь шла совершенно не об этом.


Разве началом не был пост где рассказывалось про проверку |a+b+c+d+e|==|a+e+d+b+c|?


Был. Проверка должна была делаться компилятором, т.е. выполняться, как вычисление времени компиляции.

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

> Я хотел «повыпендриваться» предметным разговором

...на уровне студента 2-го курса? А по-моему, было как здесь: http://lib.ru/SHUKSHIN/srezal.txt

Статический анализ кода, усечение графов и определение диапазонов значений - это всё способы оптимизации.

Хорошо, что ты это сказал. Сразу многое прояснилось.

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

> Статический анализ кода, усечение графов и определение диапазонов значений - это всё способы оптимизации.

Какой параметр оптимизируется?

Речь шла совершенно не об этом.

Конечно не об этом, речь шла о статических проверках, в том числе и зависящих от значений, вводимых во время выполнения программы.

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

> на уровне студента 2-го курса?

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


Хорошо, что ты это сказал. Сразу многое прояснилось.


Я это сказал еще вот тут: http://www.linux.org.ru/jump-message.jsp?msgid=5034750&cid=5049770

Долго прояснялось. ;)

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

>> Хорошо, что ты это сказал. Сразу многое прояснилось.

Я это сказал еще вот тут: http://www.linux.org.ru/jump-message.jsp?msgid=5034750&cid=5049770

Ты там сказал «оптимизации». Про то, что статический анализ и определение диапазонов значений - это оптимизации, ты сказал только сейчас. Особенно умилило про статический анализ.

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

> Какой параметр оптимизируется?

Время выполнения/объём памяти. (К.О.) Ты не поверишь, но даже ленивость или разворачивание хвостовой рекурсии - это всё _оптимизации_. То, что эти оптимизации гарантированны и являются частью формальных требовний к языку, не делает их не оптимизациями и не меняет абстрактную машину завязанных на них языков вообще от слова «никак». Если не согласен, прочти предыдущее предложение еще раз и попробуй вникнуть в разницу между абстрактной машиной и реальными возможностями её конкретной имплементации.


речь шла о статических проверках, в том числе и зависящих от значений, вводимых во время выполнения программы...


... в абстарктной машине С++.

Договаривай, чего уж там.

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

> Особенно умилило про статический анализ.

Ну и что тебя умилило? То, что статический анализ можно использовать не только для оптимизации?

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

> Ну и что тебя умилило? То, что статический анализ можно использовать не только для оптимизации?

То, что его используют прежде всего _не_ для оптимизации. Собственно, о применении статического анализа для оптимизации я ничего не видел.

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

> Время выполнения/объём памяти. (К.О.)

Каким же образом проверка из примера уменьшает объём памяти (кстати что это) или время выполнения?

Ты не поверишь, но даже ленивость или разворачивание хвостовой рекурсии - это всё _оптимизации_.

Ну ничего себе! А то, что замена ленивого порядка на строгий и наоборот, превращает одни программы в не завершающиеся, а другие - в завершающиеся, это получается мелочь, никакого значения не имеющая. :) Хороша оптимизация :)

речь шла о статических проверках, в том числе и зависящих от значений, вводимых во время выполнения программы...

... в абстарктной машине С++.

... в которой ничто не мешает их сделать

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

> Собственно, о применении статического анализа для оптимизации я ничего не видел.

А что, по-твоему такое, отсечение unreachable code в компиляторе? ;)

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

> Каким же образом проверка из примера уменьшает объём памяти .. или время выполнения?

Проверка из примера вообще ничерта не делает, кроме проверки. (К.О.)

(кстати что это)


Погугли.

Ну ничего себе!


Я знал, что тебя это шокирует. ;)

это получается мелочь


Это получается зависит от модели языка. Если язык _зависит_ от такой оптимизации, это не делает оптимизацию не оптимизацией. Повторяю во второй и _последний_ раз.

в которой ничто не мешает их сделать


Proof of concept в студию.

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

> Собственно, о применении статического анализа для оптимизации я ничего не видел.

А как же любимый всеми хаскеляторами strictness analysis?

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

>> Собственно, о применении статического анализа для оптимизации я ничего не видел.

А что, по-твоему такое, отсечение unreachable code в компиляторе? ;)

Есть общеиспользуемый термин «статический анализ». У него есть общепринятое значение. То, что у тебя он имеет значение, отличающееся от общепринятого - это твои личные проблемы.

P.S. Общепринятое значение термина «статический анализ»: http://en.wikipedia.org/wiki/Static_code_analysis

</thread>

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

Бинго! Я рад, что ты сходил на википедию и нашел там нужную статью. Но мне грустно, что ты не прочёл ни единой строчки. Раз так, цитирую (вдруг прочтешь здесь):

Static code analysis is the analysis of computer software that is performed without actually executing programs built from that software

Догадаешься сам, каким именно способом gcc выполняет оптимизацию ON, где N выше нуля? ;)

Очень странно, что я объясняю тебе такие вещи.

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

> Повторяю во второй и _последний_ раз.

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

anonymous
()

ого сколько я пропустил. счас чайку приготовлю да почитаю, пожалуй

jtootf ★★★★★
()

демагогия_бегин :)

Вообще, я не случайно упомянул про состояние. Дело в том, что состояние - первоочередное и неприводимое к чему-либо свойство, в то время как полиморфизм, например, таковым не является. Если у нас есть полностью чистый язык (в смысле отсутствия состояний), то определить его силами язык с состояниями будет невозможно (а то я спросил - никто не ответил, значит нельзя (?)). Это даже философский вопрос - если в языке полностью отсутствую состояния, то нет категории времени, а если её нет - как её внести? Вот, а полиморфизм гораздо проще - фактически достаточно наличия case и RTTI для реализации обычного ad-hoc полиморфизма. Тот же Си можно наделить ООП свойствами средствами самого языка без написания интерпретатора, чисто семантически это возможно, проблема будет в синтаксисе, поэтому, собственно, Страуструп создал С++ а не библиотеку для Си (хотя... изначально там было что-то среднее :)). Точно также в Scheme или CL ООП вводится средствами языка, но не требует написания интерпретатора - тут есть регулярный синтаксис и макросы (макросы - как следствие регулярного синтаксиса). Кстати, регулярность синтаксиса это не обязательно «скобочки», какой-нибудь «закрученный» синтаксис тоже может быть регулярным.

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

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

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

А Хаскелевская монада State что, магическим образом сделана? Таки нет, она определена в самом языке:

newtype State s a = State (s -> (s, a))
Miguel ★★★★★
()
Ответ на: комментарий от LamerOk

Ну и как может использоваться _еще не введеное_
(и, следовательно, неизвестное) значение во время компиляции?

Узнать значение и запустить компиляцию в рантайме? (это если в языке есть возможность раскручивать comile-time -> run-time -> compile-time -> ... сколько угодно раз).

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

А Хаскелевская монада State что, магическим образом сделана?

Расскажи подробнее, плиз. Я только слышал, что функции обеспечивающие ПЭ это чистые функции, возвращающие действия. А то IFPL я пока не прочитал.

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

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

грубо

(define (eval expressions environment)
  (unless (null? expressions)
    (eval (rest expressions)
          (update-env (eval (first expressions)) environment))))
пойдёт?

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

Насчёт варианта с environment - язык с environment имеет модель состояний (собственно - environment, глобальный и локальные).

Точно также лямбда исчисление обладает моделью состояний - есть категория времени, так как последовательность редукций можно расположить последовательно во времени.

Вообще в любом языке полном по Тьюрингу есть в том или ином виде объекты, время и состояние.

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

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

Помниться то место в SICP где говориться, что при построении интерпретатора A(B) TCO в языке A присутствует при её наличии её в B, и наоборот.

Вот я говорю, что с категорией времени - то же самое.

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

Расскажи подробнее, плиз.

А чего тут такого?

Есть тип, по сути дела представляющий собой «преобразование», где на входе - состояние, а на выходе - новое состояние плюс какой-то «выхлоп» (зависящий от исходного состояния).

Есть комбинатор, позволяющий сделать два таких преобразования подряд, причём второе может зависеть ещё и от «выхлопа» первого.

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

И всё.

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

хотя на самом деле происходит не что иное как композиция функций

Ну да, т.е. такая комбинаторика? Эт понятно - время в LC это возможность установить то, что одна редукция предшествует другой. Короче, в LC *есть* категория времени => есть возможность моделировать состояния.

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

Ну да, т.е. такая комбинаторика? Эт понятно - время в LC это возможность установить то, что одна редукция предшествует другой. Короче, в LC *есть* категория времени => есть возможность моделировать состояния.

Ни одной фразы не понял.

Не то я сегодня тупой, не то ты обкуренный.

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

> Точно также лямбда исчисление обладает моделью состояний - есть категория времени, так как последовательность редукций можно расположить последовательно во времени.

Ну что значит «модель состояний»? Есть подозрение, что ты так и арифметику назовешь моделью состояний. Натуральные числа же можно расположить последовательно во времени.

Если у нас есть полностью чистый язык (в смысле отсутствия состояний)

Это какое-то новое определение чистоты, явно не из ФЯП. В ФЯП чистота означает отсутствие побочных эффектов, а не отсутствие состояния. Состояние без побочных эффектов выражается замыканиями.

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

> frama-c

int is_prime(int i) { return (i%2) && (i%3) && (i%5); }

пока ты не вытащил в сигнатуру функции то, что 1<i<49, большинство статических анализаторов это не поймет

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

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

? натуральные числа тут причём. Если что - там ассоциативность, транзитивность и т.п. Редукци в LC не транзитивны, они вполне-упорядочены во времени. Т.е. тот самый eval в LC он по определению осуществляет редукцию последовательно во времени.

Это какое-то новое определение чистоты, явно не из ФЯП.
В ФЯП чистота означает отсутствие побочных эффектов, а не отсутствие состояния.

смотри - «чистый язык (в смысле отсутствия состояний)» я в скобках написал что имеется ввиду, ну чиста-без-состояний, понимаешь? ОК, лучше просто говорить «язык в котором нет состояний»/«язык без категории времени»/«чисто-декларативный язык» (вроде логики 2 порядка).

Состояние без побочных эффектов выражается замыканиями.

Связь замыканий и LC я пока не раскурил 0_o... Какая там связь?

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

Ни одной фразы не понял.
Не то я сегодня тупой, не то ты обкуренный.

Тогда нужно заканчивать с демагогией :)

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

* пока ты не вытащил в сигнатуру функции то, что 1<i<49, большинство статических анализаторов не догадается, что на самом деле имелась в виду сигнатура int is_prime(Int<2,48>)

с другой сторноы, если в коде встретится

if( 2<=i && i<=48 && is_prime(i) ) return 1.0/(i%7);

то эти анализаторы вероятно запаникуют

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

> > Состояние без побочных эффектов выражается замыканиями.

Связь замыканий и LC я пока не раскурил 0_o... Какая там связь?

Если LC — это lambda calculus, то тебе пора заканчивать с наркотиками. Серьезно.

смотри - «чистый язык (в смысле отсутствия состояний)» я в скобках написал что имеется ввиду, ну чиста-без-состояний, понимаешь? ОК, лучше просто говорить «язык в котором нет состояний»/«язык без категории времени»/«чисто-декларативный язык» (вроде логики 2 порядка).

Не знаю таких языков. Подскажешь? С твоей логикой «чистый язык» — это язык, с помощью которого нельзя проводить вычисления. /me разводит руками.

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

> пока ты не вытащил в сигнатуру функции то, что 1<i<49, большинство статических анализаторов не догадается, что на самом деле имелась в виду сигнатура int is_prime(Int<2,48>)

По

int is_prime(int i) { return (i%2) && (i%3) && (i%5); }

ни один из анализаторов не догадается, что речь про положительные натуральные числа до 48 включительно. Ибо в коде этого намерения программист не выразил. /me догадался что имеется ввиду только после прочтения названия функции.

Чисто для прикола дай кому-нибудь этот код, только поменяй is_prime на myfunc. И спроси у людей, какой смысл в код этой функции вложил программист.

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

Если LC — это lambda calculus, то тебе пора заканчивать с наркотиками.

Мда. Похоже, я не тупой.

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

Если LC — это lambda calculus, то тебе пора заканчивать с наркотиками. Серьезно.

И всё таки - что не так? Всё что я сказал - бред?

/me разводит руками.

/me далеко занесло. Это даже не ЯП, просто какой-нибудь формальный декларативный язык (без вычислений вообще). Пример (ещё раз) - логика 2 порядка. А чем не язык?

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

Всё что я сказал - бред?

«Бред» - это когда говорят «дважды два - пять». Ты сказал что-то вроде «дважды два - крокодилий хвост ночью».

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

«дважды два - крокодилий хвост ночью».

Может быть там было много бреда? А можно какую-нибудь отдельную непонятную фразу привести (или две, три) - вдруг я объясню.

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