Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функциональные языки против традиционных, ML, OCaml, Haskell против С++, Java, C# 
:(
    Опции темы
 
Как, по-вашему, что в итоге будет более востребовано со временем?
Традиционные языки программирования [ 55 ]  [78.57%]
Функциональные языки программирования [ 15 ]  [21.43%]
Всего проголосовавших: 70
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
mr.DUDA
Дата 3.8.2008, 23:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 4
Всего: 232



Недавно сломал себе мозг чтением вводной документации по OCaml. Хоть и многие идеи лично мне близки (лямбда-функции, корректный и логичный вывод типов, функции как аргументы функций, замыкание, мега-перекрытие операторов, сокращённая запись), но там настолько кошмарный синтаксис для "традиционно" настроенного программерского мышления, что я решил провести некоторую перепись - как считаете лично вы, что более удобно, перспективно и технологично с точки зрения любых возможных критериев оценки? Для себя ещё не определился, пока что C-подобная ветвь языков кажется более оправданной даже с учётом всё возрастающих по сложности задач. 

Мой критерий оценки: большие затраты на понимание кода не окупаются сокращением времени на его написание. Грубо говоря, не каждый поймёт чужой или даже свой собственный код через полгода будь он написан на С++, а если речь о функциональном ЯП....  smile 

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

Будущее за ML-языками или нет ???


--------------------
user posted image
PM MAIL WWW   Вверх
nickless
Дата 3.8.2008, 23:54 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата
Традиционные языки программирования


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


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
mr.DUDA
Дата 3.8.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 4
Всего: 232



Да-да, питон... Насчёт питона хотел отдельно тут сказать, но ты опередил: смешанные ЯП не рассматриваем, речь о парадигме программирования (функциональные vs. остальные). Питон будем считать коллаборационистом-шпионом в обоих лагерях smile


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 4.8.2008, 07:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



О какая тема smile
Функциональщина в нынешнем виде в массы не пойдёт из-за описанных симптомов мозгового взрыва.
С другой стороны, в следующей версии Visual Studio мы увидим среди основных языков F#, который более походит всё же на OCaml, нежели на C#. Думаю, тогда в сравнительно короткие сроки он побьёт по популярности OCaml и выйдет куда-нибудь во второй-третий десяток рейтинга TIOBE.
Непонятно так же, какие подходы станут мейнстримными в «борьбе» с многоядерностью: Erlang-style, STM, что-то ещё.
В конечном итоге, думаю, востребован открытый ум, готовый ко всяким инновациям.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 4.8.2008, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(mr.DUDA @  4.8.2008,  03:56 Найти цитируемый пост)
смешанные ЯП не рассматриваем,

зря. будущее за ними. Да и настоящее уже тоже

Добавлено через 23 секунды
не голосовал, пожалйста.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 4.8.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 4
Всего: 232



Цитата(Mayk @  4.8.2008,  07:42 Найти цитируемый пост)
зря. будущее за ними. Да и настоящее уже тоже

Если добавить ещё один вариант в голосование, ясное дело кто победит. Поэтому умышленно его пропустил.  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
JackYF
Дата 4.8.2008, 11:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
kemiisto
Дата 4.8.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(mr.DUDA @  4.8.2008,  00:16 Найти цитируемый пост)
Недавно сломал себе мозг чтением вводной документации по OCaml.

Аналогично! Только причина "поломки" - Haskell.

Цитата(nickless @  4.8.2008,  00:54 Найти цитируемый пост)
Имхо со временем все интересные и удобные идеи функциональных языков будут добавлены в традиционные языки (см. питон)

Как что, так сразу Python! В C# 3.0 тоже появились некоторые идеи из ФП. smile 

Цитата(Void @  4.8.2008,  08:37 Найти цитируемый пост)
Непонятно так же, какие подходы станут мейнстримными в «борьбе» с многоядерностью: Erlang-style, STM, что-то ещё.

В качестве что-то ещё: Smalltalk + разрешить объекту продолжать свои действия после посылки сообщения и после отправки ответа. 
ConcurentSmalltalk.

Это сообщение отредактировал(а) kemiisto - 4.8.2008, 18:40


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lazin
Дата 4.8.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



серебряной пули нет
PM MAIL Skype GTalk   Вверх
Shaggie
Дата 4.8.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(kemiisto @  4.8.2008,  19:38 Найти цитируемый пост)
причина "поломки" - Haskell.

А когда "въедешь", будешь говорить - просто, просто  smile 


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
kemiisto
Дата 4.8.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Shaggie @  4.8.2008,  20:00 Найти цитируемый пост)
А когда "въедешь", будешь говорить - просто, просто  smile

Я пытался, пытался - и забил. Сейчас нет, нет, да загляну в Foundations of F#. Там как то попонятней, чем в той книге по которой я "ломал" мозг с помощью Haskell.



--------------------
PM MAIL WWW GTalk Jabber   Вверх
Aristotelb
Дата 4.8.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: нет
Всего: 5



Цитата(kemiisto @  4.8.2008,  19:21 Найти цитируемый пост)
Там как то попонятней, чем в той книге по которой я "ломал" мозг с помощью Haskell.


Душкин ?       
ИМХО крайне неудачная книга

советую обратить пристальное внимание на CL, по нему есть оч. хорошая литература.
PM MAIL ICQ   Вверх
kemiisto
  Дата 4.8.2008, 20:52 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Aristotelb @  4.8.2008,  21:25 Найти цитируемый пост)
Душкин ?

 smile Как Вы угадали?

Цитата(Aristotelb @  4.8.2008,  21:25 Найти цитируемый пост)
советую обратить пристальное внимание на CL, по нему есть оч. хорошая литература.

CL = Common Lisp? 
Aristotelb, а можно ссылочки на хорошую литературу? 
По ФП листал (кроме уже упомянутого Душкина и Robert Pickering):
  • Harold Abelson and Gerald Jay Sussman with Julie Sussman - Structure and Interpretation of Computer Programs в русском переводе. ЯП = Scheme, тяжеловато идёт.
  • John Harrison - Введение в функциональное программирование.  smile

В итоге всё сводится к непониманию исчисления лямбда конверсий (или как его там правильно). По сему два вопроса:
  • это вообще познаваемо?  smile 
  • а нужно ли понимание этой математической теории для того, чтобы писать код на функциональных языках?



--------------------
PM MAIL WWW GTalk Jabber   Вверх
Aristotelb
Дата 4.8.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: нет
Всего: 5



Цитата(kemiisto @  4.8.2008,  20:52 Найти цитируемый пост)
Как Вы угадали?


на сколько я знаю она единственная по Haskell на русском языке.

по Common Lisp:

"Мир лиспа" Хювяннен и Сеппянен (1990 г) книга хоть и старая, но очень основательная и доступная для понимания (есть в эл. виде)

Practical Common Lisp посовременнее и есть неплохое описание объектной модели CLOS

ну это классика

P.S можно на ты.

PM MAIL ICQ   Вверх
Shaggie
Дата 4.8.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(kemiisto @  4.8.2008,  21:52 Найти цитируемый пост)
это вообще познаваемо?

Очень даже.

Цитата(kemiisto @  4.8.2008,  21:52 Найти цитируемый пост)
а нужно ли понимание этой математической теории для того, чтобы писать код на функциональных языках?

Желательно... и развитое логическое мышление приветствуется. Но научиться можно всему.

Итак, Haskell. Если есть базовое знание английского - рекомендую Yet Another Haskell Tutorial. Чтение несложное, в конце каждой главы есть практические задания (с решениями на случай полного невтупления; здорово просветляют). Осторожно, там почти мегабайтная пэдээфка, не тыкайте ссылку при нехватке трафика.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
kemiisto
Дата 4.8.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



AristotelbShaggie спасибо за ссылки. Посмотрю - отпишусь как дело пойдёт. 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Любитель
Дата 7.8.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Ну что ж так тема заглохла?! Я тут, понимаете ли, жду мегакода на хаскеле, эрленге и пр. Скучно :(


--------------------
PM MAIL ICQ Skype   Вверх
Void
Дата 7.8.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Любитель, так вопрос ведь стоял, не докажите чем лучше, а получит распространение или нет. Тут реалисты в основном smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Любитель
Дата 7.8.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Цитата(Void @  7.8.2008,  14:09 Найти цитируемый пост)
 Тут реалисты в основном 

Ну, если почитать несколько соседних топиков, если честно иногда вызывает сомнение smile Тут просто весёлые холиварщики, я считаю (по крайней мере так должно быть!).


--------------------
PM MAIL ICQ Skype   Вверх
mr.DUDA
Дата 8.8.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 4
Всего: 232



Void, ну покажи пример, а ?...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 8.8.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



mr.DUDA, дык, какой? Микропримеры на 10 строчек в контексте темы не катят, а что-нибудь реальное поди напиши. Могу только ссылками покидаться в ответ на провокации smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
nerezus
Дата 9.8.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 13
Всего: 43



А почему против? Как по мне - так питон сочетает их. Его и юзаю )

Цитата

Как что, так сразу Python!
 Потому что он очень яркий.
Ну сам посуди:
Область применения - от десктопного гуевого софта и серверных приложений до игр и софта под мобилы.
Куча библиотек, многие нереально мощные. Twisted, PyQt4, Django.
Выразительность языка и очень богатые языковые возможности.
Вот поэтому и приводят его в пример )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
mr.DUDA
Дата 9.8.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 4
Всего: 232



Void, ну приведи какой-нибудь коронный пример парсера...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Амортизатор2
Дата 8.9.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 6.2.2006

Репутация: 0
Всего: 2



haskell интересный язык, изучение его будет очень полезным.
Меня сейчас в свете semantic web больше интересует другая ветвь декларативного программирования - логическое, и базы знаний. Изучаю RDF и OWL, благо эти вещи, еще вчера казавшиеся игрушками, получили серьезную поддержку в Oracle 11g. Там реализована поддержка семантической сети, причем реализована как говорится эффективно и масштабируемо. Правда SPARQL в 11ой версии не реализован, но его обещают в будущем, а пока можно использовать инструменты от третьих фирм, для которых oracle будет идти бекэндом (в качестве rdf-store).
PM MAIL   Вверх
Амортизатор2
Дата 8.9.2008, 12:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 6.2.2006

Репутация: 0
Всего: 2



Цитата(mr.DUDA @  9.8.2008,  14:50 Найти цитируемый пост)
Void, ну приведи какой-нибудь коронный пример парсера... 



Посмотри на haskell.org, там есть примеры использования parsec. Только не зная haskell все равно их не поймешь. Насколько я понял, тебе интересно, стоит ли тратить время на изучение ФП? Определенно стоит, даже если использовать фя не будешь. Собственно, есть три основных способа описания вычислительного процесса, и желательно представлять их себе хотя бы приблизительно.

1. Традиционная машинка Тьюринга - с этим понятно
2. Лямбда-исчисление (ФП)
3. Мат. логика, предикаты первого порядка (логическое программирование).

Для изучения второго оптимален haskell, но пойдет и ocaml, для третьего - prolog, но можно сразу взять RDF/OWL, так как это ближе к практике.
PM MAIL   Вверх
GoldFinch
Дата 27.3.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



а в системном программировании ФЯ применить можно? 

допустим реализовать функцию int GetModuleHandle("xxxx")

императивный алгоритм такой:
1) получить указатель на структуру PEB из FS:[0x30]
2) пройтись по цепочке указателей в структурах до связанного списка структур описывающих загруженные модули
3) поиском по этому связанному списку найти структуру нужного модуля
4) взять в этой структуре искомый хендл
PM MAIL ICQ   Вверх
LSD
Дата 27.3.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



И в чем вопрос? 
  Можно ли на ФЯ реализовать подобный алгоритм? - Да можно.
  Имеет ли смысл? - Нет не имеет.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
GoldFinch
Дата 27.3.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



LSD, т.е. исходник для этого алгоритма на ФЯ будет на порядок длиннее чем на С++, 
и код на ФЯ будет написан с использованием разнообразных хаков, не свойственных обычным программам на ФЯ ?
PM MAIL ICQ   Вверх
Void
Дата 27.3.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



GoldFinch, ФЯ применить можно, только ФП в этом будет маловато.
Любой функциональный язык имеет нетривиальный рантайм, прежде всего, сборщик мусора. Следовательно, обращения к памяти, не находящейся под его управлением, должны быть обставлены церемониями с FFI.
В Haskell, навскидку, через Foreign можно сделать всё описанное, кроме первого шага, который придётся вынести во внешнюю библиотечку из одной функции. Но никаких особенных преимуществ перед кодом на Си не будет: ноги отстреливаются с той же лёгкостью, а синтаксис довольно многословен. Не для микроскопа гвоздь выходит.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lazin
Дата 27.3.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Любитель @  7.8.2008,  12:22 Найти цитируемый пост)
Ну что ж так тема заглохла?! Я тут, понимаете ли, жду мегакода на хаскеле, эрленге и пр. Скучно :(

давайте что-нибудь напишем, на ФЯ и сравним с обычным ЯП smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 27.3.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Lazin, я тольк что предложил алгоритм, вот его и напиши на ФЯ
PM MAIL ICQ   Вверх
Lazin
Дата 27.3.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(GoldFinch @  27.3.2009,  13:57 Найти цитируемый пост)
Lazin, я тольк что предложил алгоритм, вот его и напиши на ФЯ

если ты это имел ввиду
Цитата(GoldFinch @  27.3.2009,  12:34 Найти цитируемый пост)
1) получить указатель на структуру PEB из FS:[0x30]
2) пройтись по цепочке указателей в структурах до связанного списка структур описывающих загруженные модули
3) поиском по этому связанному списку найти структуру нужного модуля
4) взять в этой структуре искомый хендл

то он будет выглядеть так-же, да и не серьезно это как-то)
я имел ввиду что-то более серьезное, например реализовать какой-нибудь алгоритм на графе, поиск кратчайшего пути например
то, что на haskell/ocaml/erlang нет смысла писать системные приложения это всем и так понятно
PM MAIL Skype GTalk   Вверх
Void
Дата 27.3.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Lazin @  27.3.2009,  17:06 Найти цитируемый пост)
я имел ввиду что-то более серьезное, например реализовать какой-нибудь алгоритм на графе, поиск кратчайшего пути например

Сейчас тебе справедливо выскажут, что кратчайший путь в графе тоже не тянет на пример серьёзной задачи smile

А почему, собственно, нет. Haskell — неплохой императивный язык smile
GoldFinch, у меня нет GHC на Windows, так что код я не проверял и вполне мог не всё понять правильно из MSDN, но для иллюстрации пойдёт (здесь с подсветкой):
Код

import Foreign
import Data.List
import qualified Data.Text as T
import Data.Text.Foreign
import Data.Word

data Entry = Offset Int | DeRef

peekAt :: Storable a => [Entry] -> Ptr b -> IO a
peekAt [] p = peek $ castPtr p
peekAt (Offset n : path) p = peekAt path (p `plusPtr` n)
peekAt (DeRef : path) p = peek (castPtr p) >>= peekAt path

sizeT = sizeOf (undefined :: IntPtr)

{- typedef struct _LSA_UNICODE_STRING {
   USHORT Length;
   USHORT MaximumLength;
   PWSTR  Buffer;
} UNICODE_STRING; -}
newtype UnicodeString = UnicodeString String deriving (Eq, Ord, Show)

instance Storable UnicodeString where
    sizeOf _ = 4 + sizeT
    alignment _ = 4 -- ??
    peek p = do
        length <- (peek $ castPtr p) :: IO Word16
        str <- peekAt [Offset 4] p
        text <- fromPtr str (fromEnum $ length `div` 2)
        return $ UnicodeString $ T.unpack text
    poke _ _ = error "Not implemented"

{- typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY; -}
data ListEntry a = ListEntry {
      backLink :: Ptr a
    , forwardLink :: Ptr a
    }

instance Storable (ListEntry a) where
    sizeOf _ = 2 * sizeT
    alignment _ = 4 -- ??
    peek p = do
        back <- peek $ castPtr p
        forward <- peek $ castPtr (p `plusPtr` sizeT)
        return $ ListEntry back forward
    poke _ _ = error "Not implemented"

readNext :: (Storable a) => ListEntry a -> IO (Maybe a)
readNext entry =
    let p = forwardLink entry in
    if p == nullPtr then return Nothing
    else peek p >>= return . Just

readDList :: (Storable a) => ListEntry a -> (a -> ListEntry a) -> IO [a]
readDList head extract = do
    entry <- readNext head
    case entry of
        Just x -> readDList (extract x) extract >>= return . (x:)
        Nothing -> return []

{- typedef struct _LDR_DATA_TABLE_ENTRY {
    BYTE Reserved1[2];
    LIST_ENTRY InMemoryOrderLinks;
    PVOID Reserved2[2];
    PVOID DllBase;
    PVOID EntryPoint;
    PVOID Reserved3;
    UNICODE_STRING FullDllName;
    BYTE Reserved4[8];
    PVOID Reserved5[3];
    union {
        ULONG CheckSum;
        PVOID Reserved6;
    };
    ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY; -}
data LdrTableEntry = LdrTableEntry {
      listEntry :: ListEntry LdrTableEntry
    , fullDllName :: UnicodeString
    , dllBase :: IntPtr
    }

instance Storable LdrTableEntry where
    sizeOf _ = 66 -- лень считать с sizeT было
    alignment _ = 4 -- ??
    peek p = do
        entry <- peekAt [Offset 2] p
        base <- peekAt [Offset 18] p
        name <- peekAt [Offset 30] p
        return $ LdrTableEntry entry name base

getModuleHandle :: String -> IO (Maybe IntPtr)
getModuleHandle modName = do
    pPEB <- getPEBPtrByForeignMagic -- дёргаем единственную внешнюю функцию на Си
    head <- peekAt [Offset $ 4 + 2 * sizeT, DeRef, Offset $ 8 + 3 * sizeT] pPEB
    list <- readDList head listEntry
    let x = find (\x -> fullDllName x == UnicodeString modName) list >>= return . dllBase
    return x

Если всерьёз понадобится много тягать внешние структуры из Haskell, можно соорудить библиотечку EDSL, сделать deriving Storable на Template Haskell и т.д.

Предлагаю реализовать на чём угодно вторую задачу из конкурса дельфистов, на многопоточное программирование. Визуализацию можно консольную, но с GUI будет идеально. С меня решение на Haskell. Холивар? smile

Это сообщение отредактировал(а) Void - 27.3.2009, 20:00


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
GoldFinch
Дата 27.3.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(Void @  27.3.2009,  20:00 Найти цитируемый пост)
Предлагаю реализовать на чём угодно вторую задачу из конкурса дельфистов, на многопоточное программирование. Визуализацию можно консольную, но с GUI будет идеально. С меня решение на Haskell. Холивар?

хорошая идея)
PM MAIL ICQ   Вверх
Lazin
Дата 27.3.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



smile

Добавлено через 11 минут и 53 секунды
Цитата(Void @  27.3.2009,  20:00 Найти цитируемый пост)
Предлагаю реализовать на чём угодно вторую задачу из конкурса дельфистов,

я не понял, в чем прикол задачи, придумать алгоритм поведения для хулигана и для дворника? или просто сделать это все через потоки?
PM MAIL Skype GTalk   Вверх
Void
Дата 27.3.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Lazin @  28.3.2009,  00:35 Найти цитируемый пост)
я не понял, в чем прикол задачи, придумать алгоритм поведения для хулигана и для дворника? или просто сделать это все через потоки? 

Просто реализовать описанное асинхронное поведение.
Вот это условие:
Цитата(Alexeis @  10.10.2008,  11:53 Найти цитируемый пост)
  Условие поимки. Попытка одновременного доступа (2х потоков) к общей ячейке.

мы переформулируем, чтобы не заострять внимание на деталях реализации:
Цитата
Хулиган пойман, когда ячейка, в которой он находился, подверглась очистке со стороны дворника.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lazin
Дата 27.3.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



то-есть они не должны как-то оптимизировать свое поведение, что-бы увеличить шанс успеха?
PM MAIL Skype GTalk   Вверх
Void
Дата 27.3.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Lazin, нет, задачка чисто техническая. В оригинале предлагалось минимизировать блокировки, ну а нам надо бы показать, что есть весёлого в ФЯ на тему параллелизма smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Void
Дата 1.4.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Придётся первому, значит smile

Сразу решил делать что-то вроде актёров: два потока, хулиган и дворник, отсылают через асинхронную очередь сообщения третьему, который хранит состояние поля и обновляет его в соответствии с полученными данными. Очередь на основе STM уже в стандартной библиотеке. Актёр крутится в бесконечном цикле, при этом его состояние хранится в монаде State.
Визуализацию сделал на Gtk2Hs и Cairo. Скриншот в аттаче. Поскольку GTK не потокобезопасен, получилось четыре потока: добавился главный поток GUI, в контексте которого можно выполнить действие с помощью библиотечной функции postGUIAsync.

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

Тестировал на Linux с GHC 6.10.1 и Gtk2Hs 0.10.0. На 6.8.* не скомпилируется из-за изменений в системе исключений, а с 6.10 работает Gtk2Hs не ранее 0.10, так что свободы выбора особо нет. Собирать с -threaded, конечно же.
с подсветкой
Код

{-# LANGUAGE GADTs, FlexibleContexts, DeriveDataTypeable #-}
import Control.Concurrent
import Control.Concurrent.STM
import Control.Exception
import Control.Monad
import Control.Monad.State
import Data.Array.Diff
import Data.Maybe
import Data.Typeable
import Graphics.Rendering.Cairo hiding (scale)
import Graphics.Rendering.Cairo.Matrix
import Graphics.UI.Gtk hiding (get, fill)
import Graphics.UI.Gtk.Abstract.Widget
import System.IO
import System.Random

sendMsg :: TChan a -> a -> IO ()
sendMsg chan msg = atomically $ writeTChan chan msg

sendMsgs :: TChan a -> [a] -> IO ()
sendMsgs chan msgs = atomically $ forM_ msgs $ writeTChan chan

loBound = 1
hiBound = 60

data Message = ComeTo Int | DropBag | Disappear | Clean [Int] deriving (Eq, Show)

newtype HooliganS = HooliganS {
      bagCount :: Int
    }

hooligan :: TChan Message -> StateT HooliganS IO ()
hooligan chan = forever $ do
    bags <- gets bagCount
    let drop = bags > 0
    when drop $ put $ HooliganS (bags - 1)
    liftIO $ do
        pos <- randomRIO (loBound, hiBound)
        sendMsgs chan $ [ComeTo pos] ++ if drop then [DropBag] else []
        threadDelay 60000
        sendMsg chan Disappear
        threadDelay 300000

runHooligan :: TChan Message -> IO ()
runHooligan chan =
    evalStateT (hooligan chan) (HooliganS 22)

data JanitorS = JanitorS {
      position :: Int
    , direction :: Int
    }

janitor :: TChan Message -> StateT JanitorS IO ()
janitor chan = forever $ do
    (JanitorS pos dx) <- get
    let clean = [x | x <- [pos - 1 .. pos + 1], x >= loBound && x <= hiBound]
    liftIO $ sendMsg chan $ Clean clean
    let dx' = if pos == loBound && dx < 0 || pos == hiBound && dx > 0 then -dx else dx
    put $ JanitorS (pos + dx') dx'
    liftIO $ threadDelay 400000

runJanitor :: TChan Message -> IO ()
runJanitor chan =
    evalStateT (janitor chan) (JanitorS loBound 1)

data Cell = Empty | Bag

data Field where
    Field :: IArray a Cell => a Int Cell -> Field

data Playground = Playground {
      hooliganPos :: Maybe Int
    , janitorPos :: [Int]
    , field :: Field
    }

instance Show Playground where
    show (Playground hooligan janitor (Field field)) =
        map pchar (assocs field)
            where pchar (i, _)
                    | (Just i) == hooligan = 'H'
                    | i `elem` janitor = 'J'
                  pchar (_, Empty) = '.'
                  pchar (_, Bag) = 'X'

updateField p@(Playground _ _ (Field a)) d = p { field = Field $ a // d }

data HooliganCaught = HooliganCaught Int deriving (Show, Typeable)

instance Exception HooliganCaught

mainLoop :: TChan Message -> (Playground -> IO ()) -> IO ()
mainLoop chan draw = do
    let field = listArray (loBound, hiBound) (repeat Empty) :: DiffArray Int Cell
    catchJust (\e -> (fromException e) :: Maybe HooliganCaught)
        (evalStateT loop (Playground Nothing [] (Field field)))
        (const $ return ()) where
        loop = do
            state@(Playground hooligan janitor (Field field)) <- get
            liftIO $ draw state
            let caught = (hooligan >>= return . (`elem` janitor)) == Just True
            when caught $ liftIO $ throwIO $ HooliganCaught $ fromJust hooligan
            msg <- liftIO $ atomically $ readTChan chan
            liftIO $ print msg
            put $ case msg of
                    ComeTo x -> state { hooliganPos = Just x }
                    DropBag -> updateField state [(fromJust hooligan, Bag)]
                    Disappear -> state { hooliganPos = Nothing }
                    Clean xs -> (updateField state (zip xs $ repeat Empty)) { janitorPos = xs }
            loop

renderPlayground :: Playground -> Render ()
renderPlayground (Playground hooligan janitor (Field field)) = do
    setSourceRGB 255 255 255
    paint
    let cellRGB x r g b = do
            setSourceRGB r g b
            newPath
            rectangle (realToFrac $ x - 1) 0 1 1
            fill
    let drawElem (i, _)
            | (Just i) == hooligan =
                if fromJust hooligan `elem` janitor then do
                    setSourceRGB 255 0 0
                    newPath
                    arc (realToFrac i - 0.5) 0.5 0.4 0 (2 * pi)
                    fill
                else cellRGB i 255 255 0
            | i `elem` janitor = cellRGB i 255 0 0
        drawElem (i, Bag) = cellRGB i 0 0 255
        drawElem (_, Empty) = return ()
    forM_ (assocs field) drawElem

drawPlayground :: WidgetClass a => a -> Playground -> IO ()
drawPlayground widget playground = postGUIAsync $ do
    drawWindow <- widgetGetDrawWindow widget
    (w, h) <- drawableGetSize drawWindow
    drawWindowBeginPaintRect drawWindow (Rectangle 0 0 w h)
    renderWithDrawable drawWindow $ do
        setMatrix $ scale 15 15 identity
        renderPlayground playground
    drawWindowEndPaint drawWindow

main = do
    unsafeInitGUIForThreadedRTS
    window <- windowNew
    set window [ containerBorderWidth := 10, windowTitle := "Hooligan and Janitor",
                 windowWindowPosition := WinPosCenter ]
    window `onDestroy` mainQuit
    area <- drawingAreaNew
    area `onSizeRequest` return (Requisition 900 15)
    buttonQuit <- buttonNewWithLabel "Quit"
    buttonQuit `onClicked` (widgetDestroy window)
    vbox <- vBoxNew False 20
    window `containerAdd` vbox
    boxPackStartDefaults vbox area
    boxPackStartDefaults vbox buttonQuit
    
    chan <- newTChanIO
    t1 <- forkIO $ runHooligan chan
    t2 <- forkIO $ runJanitor chan
    forkIO $ do
        mainLoop chan (drawPlayground area)
        killThread t1
        killThread t2
    
    widgetShowAll window
    mainGUI



Это сообщение отредактировал(а) Void - 2.4.2009, 00:27

Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  hooligan.png 6,61 Kb


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Unlocker
Дата 2.4.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 2.11.2007
Где: Москва - Знаменск (Капустин Яр)

Репутация: нет
Всего: 2



Прошу не считать меня невеждой, но в обсуждении я так и не нашел хотя бы краткого перечня задач, для которого программирование на функциональных языках будет по каким-то причинам предпочтительнее, чем на традиционных.
Я ни разу не писал код на Haskell или Ocaml (использовал Python одно время для инженерных расчетов), но из обсуждения непонятно есть ли перспектива изучения подобных языков и в каких областях. Как коррелируется изучение этого класса ЯП с применением в различных практических областях?
Прошу внести ясность, если кто-то может.

Это сообщение отредактировал(а) Unlocker - 2.4.2009, 09:56
--------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b."
PM MAIL ICQ Skype GTalk Jabber   Вверх
Rickert
Дата 2.4.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Будущее за классикой, ибо она - золотая середина вся.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Void
Дата 2.4.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Unlocker, во-первых, не обязательно противопоставлять ФП привычному структурному и ОО-подходу. Они вполне могут сочетаться, и тому есть хорошие примеры: F#, Scala.
Трудно сразу показать на практическом примере преимущества ФП. Обычно следуют такие возражения:
1. Это непонятно. Пусть при императивном подходе будет больше кода, но я его быстрее напишу и другие быстрее поймут.
2. Как следствие из предыдущего: где найти программистов, которые будут это поддерживать и кто мне позволит использовать ФЯ на работе?
3. Это неэффективно и будет тормозить.
4. Для ФЯ нет инфраструктуры: библиотек и сред разработки.
Всё это в какой-то мере справедливо. Глупо выдавать ФП за серебряную пулю, но перечисленного недостаточно, чтобы закрыть на него глаза.
ФП, как и любое новшество, требует времени на обучение. Нет никаких доказательств того, что ФП фундаментально сложнее. Напротив, оно ориентировано на работу от базовых принципов, а не перечисление неформальных особенностей поведения. ФП благосклонно к более формальному подходу, но отнюдь не требует зубодробительной математики. Неоднократно слышал, как программист, поставленный перед необходимостью использования ФЯ на работе (да, бывает и такое), в минимальные сроки разбирался и начинал писать код — не больше проблем, чем с очередным фреймворком (пруфлинк, первый попавшийся).
Гибридные языки вроде F# позволяют сохранить привычную компонентную структуру на высоком уровне и в то же время получить в распоряжение набор новых инструментов для создания программной логики уровнем ниже. Возьму на себя смелость утверждать, что подход, основанный на композиции чистых функций над неизменяемыми структурами данных, проще, легче поддерживается и менее подвержен ошибкам.
Тем, кто работает на платформе .NET, однозначно надо попробовать F#. Microsoft тянет его в мейнстрим и одновременно обогащает C# ФП-возможностями. Заодно отпадает вопрос об IDE и библиотеках.
Другое направление, в виде Haskell, стремится развить как можно более строгую систему типов со статическими проверками. Здесь сложнее обещать немедленный эффект, но на мой взгляд стоит хотя бы попробовать, что такое отделение чистых функций на уровне типов, классы типов, всеобщая ленивость и т.д.

Задачку никто больше решать не будет? Erlang бы взял кто-нибудь, хоть с консолью, хоть с gs.
А код на Haskell комментировать? Хотя бы в духе «это хуже чем Perl» :-)


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Lazin
Дата 2.4.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Void @  2.4.2009,  15:44 Найти цитируемый пост)
А код на Haskell комментировать? Хотя бы в духе «это хуже чем Perl» smile 

дык оно-же не работает с моим ghc, нужно скачивать 6.10
Цитата(Void @  2.4.2009,  15:44 Найти цитируемый пост)
Задачку никто больше решать не будет? Erlang бы взял кто-нибудь, хоть с консолью, хоть с gs

будет smile 
PM MAIL Skype GTalk   Вверх
Lazin
Дата 3.4.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



написал то-же самое на с++, но без GUI, все выводится в консоль, всего есть 3 потока, один для хулигана, один для дворника и основной поток, первые два потока отправляют основному потоку свое состояние через очередь(порт завершения), основной поток выступает в роли брокера, и вычисляет общее состояние
Код

// forvingrad.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <cassert>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
#include <set>
#include <string>
#include <conio.h>


class UserInterface
{
public:
    void Write(const std::set<int> packets, int hooligan, int sweep)
    {
        std::string field(60, ' ');
        for (std::set<int>::const_iterator i = packets.begin(); i != packets.end(); ++i)
        {
            assert(*i > -1);
            assert(*i < 60);
            field[*i] = 'P';
        }
        if (sweep != -1)
        {
            field[sweep] = 'O';
            field[sweep + 1] = 'O';
            field[sweep + 2] = 'O';
        }
        if (hooligan != -1)
            field[hooligan] = 'X';

        std::cout << field << std::endl;
    }
};

class Workfield
{
    enum 
    {
        position_status,
        drop_bag_status,
        sweep_status,
        hide_status
    };
    struct PositionEvent : OVERLAPPED
    {
        int index;
        PositionEvent(int ix) 
            : index(ix)
        {
            ZeroMemory(this, sizeof(OVERLAPPED));
            Offset = position_status; 
        }
    };
    struct DropBagEvent : OVERLAPPED
    {
        DropBagEvent()
        {
            ZeroMemory(this, sizeof(OVERLAPPED));
            Offset = drop_bag_status;
        }
    };
    struct SweepEvent : OVERLAPPED
    {
        int first;
        SweepEvent(int ix)
            : first(ix)
        {
            ZeroMemory(this, sizeof(OVERLAPPED));
            Offset = sweep_status;
        }
    };
    struct HideEvent : OVERLAPPED
    {
        HideEvent()
        {
            ZeroMemory(this, sizeof(OVERLAPPED));
            Offset = hide_status;
        }
    };
    HANDLE cport_;
    volatile LONG done_;
public:
    enum
    {
        hooligan_wins = 1,
        janitor_wins = 2
    };
    Workfield()
        : cport_(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0))
        , done_(0)
    {
        if (!cport_)
        {
            DWORD last_error = ::GetLastError(); 
            boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": CreateCompletionPort failed"); 
            boost::throw_exception(e); 
        }
    }
    int IsDone()
    {
        return InterlockedExchangeAdd(&done_, 0);
    }
    void Done(int who_wins)
    {
        InterlockedExchange(&done_, who_wins);
    }
    void StepTo(int ix)
    {
        PositionEvent* pos_evt = new PositionEvent(ix);
        if(!PostQueuedCompletionStatus(cport_, 0, 0, pos_evt))
        {
            DWORD last_error = ::GetLastError(); 
            boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": PostQueuedCompletionStatus failed"); 
            boost::throw_exception(e); 
        }
    }
    void Hide()
    {
        HideEvent* hide_evt = new HideEvent();
        if(!PostQueuedCompletionStatus(cport_, 0, 0, hide_evt))
        {
            DWORD last_error = ::GetLastError(); 
            boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": PostQueuedCompletionStatus failed"); 
            boost::throw_exception(e); 
        }
    }
    void Sweep(int first)
    {
        SweepEvent* sweep_evt = new SweepEvent(first);
        if(!PostQueuedCompletionStatus(cport_, 0, 0, sweep_evt))
        {
            DWORD last_error = ::GetLastError(); 
            boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": PostQueuedCompletionStatus failed"); 
            boost::throw_exception(e); 
        }
    }
    void DropBag()
    {
        DropBagEvent* drop_evt = new DropBagEvent();
        if(!PostQueuedCompletionStatus(cport_, 0, 0, drop_evt))
        {
            DWORD last_error = ::GetLastError(); 
            boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": PostQueuedCompletionStatus failed"); 
            boost::throw_exception(e); 
        }
    }

    void ProcessQueue(UserInterface& ui)
    {
        OVERLAPPED *event;
        ULONG_PTR ck;
        DWORD bytes_tr;
        std::set<int> packets;
        int hooligan_state = -1;
        int janitor_state = -1;
        while(!IsDone())
        {
            BOOL res = GetQueuedCompletionStatus(cport_, &bytes_tr, &ck, &event, INFINITE);
            if(!res)
            {
                DWORD last_error = ::GetLastError(); 
                boost::system::system_error e(boost::system::error_code(last_error, boost::system::get_system_category()), __FUNCTION__": GetQueuedCompletionStatus failed"); 
                boost::throw_exception(e); 
            }
            if(event)
            {
                int type = event->Offset;
                switch(type)
                {
                    case position_status:
                        {
                            PositionEvent* pos_evt = (PositionEvent*)event;
                            hooligan_state = pos_evt->index;
                            delete pos_evt;
                        }
                        break;
                    case drop_bag_status:
                        {
                            DropBagEvent* drop_evt = (DropBagEvent*)event;
                            packets.insert(hooligan_state);
                            delete drop_evt;
                        }
                        break;
                    case sweep_status:
                        {
                            SweepEvent* sweep_evt = (SweepEvent*)event;
                            janitor_state = sweep_evt->first;
                            delete sweep_evt;
                            for(int i = 0; i < 3; ++i)
                                packets.erase(i + janitor_state);
                            if(hooligan_state != -1)
                            {
                                int dp = hooligan_state - janitor_state;
                                if (dp < 3 && dp >= 0)
                                {
                                    //caught
                                    Done(janitor_wins);
                                }
                            }
                        }
                        break;
                    case hide_status:
                        {
                            HideEvent* hide_evt = (HideEvent*)event;
                            hooligan_state = -1;
                            delete hide_evt;
                        }
                        break;
                    default:
                        throw std::runtime_error(__FUNCTION__"Queue error");
                };
                ui.Write(packets, hooligan_state, janitor_state);
            }
        }
    }
};

class Hooligan
{
    Workfield& field_;

public:
    void ThreadProc()
    {
        for(int i = 0; i < 22; ++i)
        {
            int pos = rand() % 60;
            field_.StepTo(pos);
            field_.DropBag();
            Sleep(60);
            field_.Hide();
            Sleep(300);
            if(field_.IsDone()) return;
        }
        field_.Done(Workfield::hooligan_wins);
    }
    Hooligan(Workfield& f) 
        : field_(f)
    {
    }
};

class Janitor
{
    Workfield& field_;

public:
    void ThreadProc()
    {
        int i = 0;
        for (;"Ever";)
        {
            for(; i < 20; ++i)
            {
                Sleep(400);
                field_.Sweep(i*3);
                if (field_.IsDone()) return;
            }
            for(;i;--i)
            {
                Sleep(400);
                field_.Sweep(i*3 - 3);
                if (field_.IsDone()) return;
            }
        }
    }
    Janitor(Workfield& f)
        : field_(f)
    {
    }
};



int main(int argc, char* argv[])
{
    srand((unsigned int)time(NULL));
    UserInterface ui;
    Workfield field;
    Hooligan h(field);
    Janitor j(field);
    boost::thread hthread( boost::bind(&Hooligan::ThreadProc, &h) );
    boost::thread jthread( boost::bind(&Janitor::ThreadProc, &j) );
    field.ProcessQueue(ui);
    hthread.join();
    jthread.join();
    if(field.IsDone() == Workfield::hooligan_wins)
        std::cout << "Hooligan Wins" << std::endl;
    else
        std::cout << "Janitor Wins" << std::endl;
    system("pause");
    return 0;
}



300 строк, почти в 2 раза больше чем у Void

Добавлено через 3 минуты и 55 секунд
ps
winsows only
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 6.4.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



не очень понятна фраза "Дворник бегает от края до края поля за раз сметая 3 бумажки (очищая 3 соседние ячейки) в течении 400мс."
PM MAIL ICQ   Вверх
Void
Дата 7.4.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



GoldFinch, это значит что область в три клетки каждые 400 мс смещается на одну клетку, «отражаясь» от краёв поля.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
fixxer
Дата 23.4.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: нет
Всего: 27



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

Код

-module(hooligan).
-export([start/0]).

start() ->
  Loop = spawn(fun() -> loop(100, 1) end),
  spawn(fun() -> cleaner(Loop, 1, fun(X) -> X + 3 end) end),
  spawn(fun() -> start_hooligan(Loop) end).
  
start_hooligan(Pid) ->
  {A1, A2, A3} = now(),
  random:seed(A1, A2, A3),
  Pid ! {hooligan_in, random:uniform(60)},
  hooligan_out(Pid, 22).

hooligan_in(Pid, 0) -> Pid ! {hooligan_done};
hooligan_in(Pid, Count) ->
  timer:sleep(300),
  Pid ! {hooligan_in, random:uniform(60)},
  hooligan_out(Pid, Count).

hooligan_out(Pid, Count) ->
  timer:sleep(60),
  Pid ! {hooligan_out},
  hooligan_in(Pid, Count - 1).

cleaner(Pid, X, Fun) -> 
  timer:sleep(400),
  Pid ! {cleaner, X},
  case X of
    58 -> F = fun(N) -> N - 3 end;
    1 -> F = fun(N) -> N + 3 end;
    _ -> F = Fun
  end,      
  cleaner(Pid, F(X), F).

loop(Hooligan, Cleaner) -> 
  receive
    {hooligan_in, X} when 
      Cleaner =:= X; 
      Cleaner + 1 =:= X; 
      Cleaner + 2 =:= X ->
        io:format("Hooligan is caught in ~p while cleaner in ~p~n", [X, Cleaner]);
    {hooligan_in, X} ->
      io:format("Hooligan in ~p~n", [X]),
      loop(X, Cleaner);
    {hooligan_out} ->
      io:format("Hooligan out~n"),
      loop(100, Cleaner);
    {hooligan_done} ->
      io:format("Hooligan done~n");
    {cleaner, X} when 
      X =:= Hooligan; 
      X + 1 =:= Hooligan; 
      X + 2 =:= Hooligan ->
        io:format("Hooligan is caught in ~p while cleaner in ~p~n", [Hooligan, X]);
    {cleaner, X} ->
      io:format("Cleaner in ~p~n", [X]),
      loop(Hooligan, X)
  end.


С подсветкой

Это сообщение отредактировал(а) fixxer - 23.4.2009, 17:38


--------------------
user posted image
PM MAIL ICQ   Вверх
kemiisto
  Дата 26.4.2009, 16:23 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Voidfixxer, а теперь собственно хотелось бы услышать, где же тут преимущества. Кроме alien-look кода, я ничего не увидел.

Блин. Как обидно, что почти все умные мысли уже оформлены в слова... И не тобой. smile 

Ещё подумалось, что неспроста же машины императивны. Ведь создавали же мы(?) smile их по собственному образу и подобию. Точнее, по нашим собственным представлениям о нас самих, о природе нашего мыслительного процесса. А он, походу (в смысле, мне так думается), императивен. Это не классический процедурный императив, но ООП - как раз то, что надо! Окружающий нас мир, состоящий из объектов, характеризуется неким состоянием. Да и у самих объектов состояние имеется. И мы на них воздействуем посылая сообщения и тем самым их состояние изменяя.

Так что ФП, по моему скромному мнению, не более чем ещё одна неудачная идея, неожиданно начинающая приобретать популярность. Цепь событий, примерно, понятна. Умные дяденьки-тётеньки, закончивышие всяческие Гарварды-Оксфорды, хотять получать побольше денежек и идут работать в различные R&D (пусть же будет это, для примеру, Microsoft Research). Дабы поразить работодателя и будучу людьми не глупыми, понимающими на чём мир стоит, эти дяденьки-тётеньки рассказывают про ФП. Что за зверь такой, работодателю не ведемо... Но разве это главное... "Функциональное говорите? Красиво звучит! Математики придумали? Ай хорошо! Экий фантик будет! Давьненько у нас ничего принципиально новенького не было..." - сказал манагер из MS и пошло-поехало... Далее всё и так понятно...

Фаньтик... Фаньтик и не более того... Вот такое впечатление...

Это сообщение отредактировал(а) kemiisto - 26.4.2009, 16:25


--------------------
PM MAIL WWW GTalk Jabber   Вверх
nickless
Дата 26.4.2009, 17:02 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



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

Цитата(kemiisto @  26.4.2009,  15:23 Найти цитируемый пост)
Ещё подумалось, что неспроста же машины императивны. Ведь создавали же мы(?) smile их по собственному образу и подобию

Их создавали практики, а функциональные языки - теоретики, каждый для себя smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Void
Дата 26.4.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(kemiisto @  26.4.2009,  18:23 Найти цитируемый пост)
Окружающий нас мир, состоящий из объектов, характеризуется неким состоянием. Да и у самих объектов состояние имеется. И мы на них воздействуем посылая сообщения и тем самым их состояние изменяя.

По поводу «объектности мышления» у dz как раз недавно баталии разворачивались. Это палка о двух концах. ФПшники скорее предлагают выводить ООП из некоторой математической базы, как безусловно полезную в некоторых случаях концепцию, а не брать за основу всего и вся.
Сторонников ФП часто обвиняют в религиозном рвении, но на мой взгляд попытки причесать программную индустрию и тем более человеческое мышление под Истинный Объектный Путь (и пророк его Java/Oberon/подставьте по вкусу) куда более религиозны по сути. Не в пику их практической эффективности: в религиозном «фреймворке» люди работают уже тысячи лет, массово, надёжно. Но по некоторым вопросам мозги рекомендуется отключить и на полочку, во избежание.
Чем по тысячному разу перемывать... вот человек хорошо сказал (не далее как вчера, хех): ЯПомерам посвящается.
Цитата
Читал я тут всякое ЯПомерство заполнившее на пике весеннего обострения мою фленту... ООП, ФЯП, бугага и угугу... Раньше я был взял шашку, на коня, да в гущу сражения размахивать и вопить... Покажите! А ну ка покажите как удобно писать компиляторы на Haskell! Ух! Эх! Вжих!
Но совсем недавно я понял: никто ничего показать никому не сможет... Просто потому что все задачи такие задачиразные... Все программисты разные! И вообще красота мира в его разнообразии, харе кришна, харе рама!
Вот начал я писать на Хаскелле и понял: здесь удобно, а тут не очень, а здесь мне извилину жмёт, а здесь --- болтается... Но никто, никто не мог бы мне этого заранее объяснить, это нужно прочувствовать, до этого нужно дойти. Возможно стоптать ноги по дороге, в кровь, в мозоли, но дойти!



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
Дата 26.4.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
kemiisto, с теоретической точки зрения функциональные языки намного лучше

Ну да, ну да... smile 

Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
особенно их верифицировать и доказывать корректность

Я что-то невижу пока, чтоб кто-то всерьёз этим занимался. Это раз. А два... nickless, не в обиду, но я как бы эти лозунги не первый раз слышу. Начитаются в интернетах и давай декламировать...

Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
Для них легче делать компиляторы, оптимизировать и автоматически распалеллировать код, у них даже система типов интереснее.

Опять же - просто слова. Не вижу я простоты создания компиляторов! И её быть не может. Ты по ссылке ходил в моём сообщении. Ежу же понятно, что если железка императивна, то и легче реаоизовать соотв. ЯП.

Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
В моём универе почти все профессора помешаны на функциональных языках

Вот откуда ветер дует. smile Значит не в интернетах начитался, а у профессоров наслушался... Ну, профессоров то много... Кстати, утали моё любопытство, что за университет?

Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
А с практической - не знаю

Вот я (точнее Вирт smile ) как раз об этом...

Void, приведённая тобой цитата согласуется с твоей же подписью. smile 
Цитата(Void @  26.4.2009,  15:36 Найти цитируемый пост)
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett

Оно, конечно, да. Но жизнь, штука, короткая. smile Я это уже понял... За двумя зайцами погонишься - от обоих ... получишь! К тому же, мне кажется изучать ФП вообще и, по крайней мере, в нашем веке - разбрасоваться по мелочам.

И вот ещё что... Это что-то навроде доверять или проверять? Всё проверять, повторюсь, времени не хватить. А вот кому доверять, каждый выбирает сам. Я выбрал, и мнение этого человека привёл. Это не моё мнение, но мнение, которому я доверяю...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Void
Дата 26.4.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(kemiisto @  26.4.2009,  21:07 Найти цитируемый пост)
особенно их верифицировать и доказывать корректность

Я что-то не вижу пока, чтоб кто-то всерьёз этим занимался. 

А ты интересовался? Или всерьёз — это когда в Visual Studio 20xx добавили кнопку «Proof correctness» или, на худой конец, в ETH Zurich заинтересовались? Системы типов именно для верификации и создаются.
Цитата(kemiisto @  26.4.2009,  21:07 Найти цитируемый пост)
К тому же, мне кажется изучать ФП вообще и, по крайней мере, в нашем веке - разбрасоваться по мелочам.

Ну вот и не изучай, заставляют тебя что ли :-)
При наличии фактов успешного коммерческого применения ФЯ, пусть и немногочисленных, делать столь глобальные выводы мне кажется как минимум поспешным.
Цитата(kemiisto @  26.4.2009,  21:07 Найти цитируемый пост)
Всё проверять, повторюсь, времени не хватить.

«Изучение бесконечности требует бесконечного времени. Поэтому работай, не работай — всё едино!»

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
Дата 26.4.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Void @  26.4.2009,  18:03 Найти цитируемый пост)
А ты интересовался?

Нет.

Цитата(Void @  26.4.2009,  18:03 Найти цитируемый пост)
Или всерьёз — это когда в Visual Studio 20xx добавили кнопку «Proof correctness»

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

Цитата(Void @  26.4.2009,  18:03 Найти цитируемый пост)
Вот говорю же, религия!

Неа! smile Слепая вера != заслуженное доверие.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lazin
Дата 26.4.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(kemiisto @  26.4.2009,  19:07 Найти цитируемый пост)
Опять же - просто слова. Не вижу я простоты создания компиляторов! И её быть не может. Ты по ссылке ходил в моём сообщении. Ежу же понятно, что если железка императивна, то и легче реаоизовать соотв. ЯП.

я ходил, и я бы не верил слепо тому, что там написано
к примеру там есть один забавный перл, о том, что Prolog - единственный логический ЯП
либо вот это:
Цитата

В то время, как это обстоятельство может быть истинным и, возможно, минимальным преимуществом функциональных языков, объектно-ориентированный подход предлагает более эффективный способ хорошего использования параллелизма, когда поведение каждого объекта представляется в виде отдельного процесса.
 
За то, что у ФП больше будущее говорит хотя-бы то, что единственная нормальная реализация composed transactional memory есть в haskell. Программисты на c#, pascall итд о таком и мечтать пока не могут. smile 

Цитата(kemiisto @  26.4.2009,  19:07 Найти цитируемый пост)
Вирт

фи... smile 
PM MAIL Skype GTalk   Вверх
Любитель
Дата 26.4.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Ну.. В своё время, говорили, что за ООП будущее. Однако, наиболее успешны сегодня гибридные языки. ИМХО тоже касается и ФП. Какие-то концепции в том же шарпе или питоне активно используются уже сегодня. Но вот полного перехода на ФП-шные языки, я думаю, не будет.


--------------------
PM MAIL ICQ Skype   Вверх
kemiisto
Дата 26.4.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Lazin @  26.4.2009,  18:30 Найти цитируемый пост)
к примеру там есть один забавный перл, о том, что Prolog - единственный логический ЯП

Почему перл? Классификации однозначной нет. Некоторые даже Пролог не относят к логическим ЯП.

Цитата(Lazin @  26.4.2009,  18:30 Найти цитируемый пост)
За то, что у ФП больше будущее говорит хотя-бы то, что единственная нормальная реализация composed transactional memory есть в haskell. Программисты на c#, pascall итд о таком и мечтать пока не могут.

Я не знаю, что такое composed transactional memory. А Вирт, скорее всего, имел ввиду Active Oberon и ОС Bluebottle.

Цитата(Lazin @  26.4.2009,  18:30 Найти цитируемый пост)
фи... 

Что фи?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
fixxer
Дата 27.4.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: нет
Всего: 27



Цитата(kemiisto @ 26.4.2009,  16:23)
Voidfixxer, а теперь собственно хотелось бы услышать, где же тут преимущества. Кроме alien-look кода, я ничего не увидел.

Ну так сравни мои 60 строк с 300 на C++, в которых почти половина инфраструктурного кода и синтаксических приседаний. На Erlang оверхеда почти нет. Учится он за два вечера под пиво, прост как валенок. Из фишек ФП которые у меня были использованы:
- нет состояния. вообще нет переменных, только формальные параметры функций. (F не считается можно обойтись и без нее).
- функции высшего порядка
- анонимные функции
- хвостовая рекурсия
- паттерн матчинг, очень мощная вещь
- ну и главная фишка Erlang'а: потоки и сообщения.

Все это по отдельности не более как просто интересно, но вместе позволяют писать очень мощно и выразительно.

Добавлено через 11 минут и 20 секунд
Цитата(kemiisto @ 26.4.2009,  16:23)
Так что ФП, по моему скромному мнению, не более чем ещё одна неудачная идея, неожиданно начинающая приобретать популярность. Цепь событий, примерно, понятна. Умные дяденьки-тётеньки, закончивышие всяческие Гарварды-Оксфорды, хотять получать побольше денежек и идут работать в различные R&D (пусть же будет это, для примеру, Microsoft Research). Дабы поразить работодателя и будучу людьми не глупыми, понимающими на чём мир стоит, эти дяденьки-тётеньки рассказывают про ФП. Что за зверь такой, работодателю не ведемо... Но разве это главное... "Функциональное говорите? Красиво звучит! Математики придумали? Ай хорошо! Экий фантик будет! Давьненько у нас ничего принципиально новенького не было..." - сказал манагер из MS и пошло-поехало... Далее всё и так понятно...

Фаньтик... Фаньтик и не более того... Вот такое впечатление...

По поводу "фантиков". Да вся история развития программирования заключается в формулировании этих самых "фантиков". А именно формирование способов представления абстракций как элемента борьбы со сложностью. С объективной сложностью, кстати. Как говорил Абельсон в своих лекциях, при изучении нового языка вас должны волновать лишь две вещи: means of abstraction и means of combination. smile


--------------------
user posted image
PM MAIL ICQ   Вверх
kemiisto
Дата 27.4.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(fixxer @  27.4.2009,  10:31 Найти цитируемый пост)
Ну так сравни мои 60 строк с 300 на C++, в которых почти половина инфраструктурного кода и синтаксических приседаний.

Ну, во-первых, C++. А, во-вторых, и что? Ну у тебя меньше. Но, то, что Lazin написал я хоть понял...

Эх, блин, ещё раз цитирую сами знаете кого:
Цитата
В ряде университетов на общепризнанный разрыв между желательным, с точки зрения образования, и практикой “реального мира” был дан ответ посредством выбора функционального языка для первоначального обучения программированию. Однако эта увертка только увеличила разрыв, т.к. теперь обучение стало вестись в рамках другой парадигмы программирования и мышления при создании программ и, как следствие, требуется известное усилие при переходе от обучения к профессиональной деятельности. В результате научная дисциплина и инженерная практика программирования стали восприниматься как разные сущности, почти не имеющие видимой связи. Первая осталась своего рода искусством для искусства, вторая эволюционирует как комбинация эвристик и интуиции, все более изощренного hacking’а. Но все это не может служить фундаментом научной дисциплины, каковая должна, в конце концов, лечь в основу любых инженерных конструкций.


Итак, если коротко. Существует достаточно строгая (в математическом плане) теория императивного программирования. Хоар, Дейкстра, Вирт, наша новосибирская школа. НО! О ней мало кто знает. А вот об ФП (особенно в русскоязычном комьюнити) трубят как о единственной начной, математически обоснованной, и ко всему прочему ещё и единственной идеально подходящей для параллельных вычислений, концепции. Оно и понятно, рухнул железный занавес люди получили доступ к заруюежной литературе. Что читать? Конечно же американскую! Они там все такие вумные, богатые. А у них там бум ФП. Вот собственно и фсё! А про европейскую то школу императивного программирования никто и не вспомнит... И про нашу, новосибирскую, тоже. А зачем? Ведь в ФП же так много
Цитата(fixxer @  27.4.2009,  10:31 Найти цитируемый пост)
фишек

 smile 

Это сообщение отредактировал(а) kemiisto - 27.4.2009, 13:10


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Void
Дата 27.4.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(kemiisto @  27.4.2009,  15:09 Найти цитируемый пост)
Но, то, что Lazin написал я хоть понял...

Объясни одну вещь, а при чём тут тыsmile
Только не надо на голубом глазу заявлять, что код на C++ можно прочитать, не зная C++.
«Язык плох, потому что его мало кто знает. А поскольку он плох, его никто не будет учить. Единственный способ стать популярным — это быть популярным. Ваши каракули нечитаемы, потому что мы привыкли читать другие каракули».
Таким образом можно поставить под сомнение перспективы широкого распространения ФП (а здесь вроде никто не обещает миллион программирующих на Хаскеле к концу пятилетки), но все остальные выводы — демагогия чистой воды.
Цитата(kemiisto @  27.4.2009,  15:09 Найти цитируемый пост)
Оно и понятно, рухнул железный занавес люди получили доступ к заруюежной литературе. Что читать? Конечно же американскую! Они там все такие вумные, богатые. А у них там бум ФП. Вот собственно и фсё! А про европейскую то школу императивного программирования никто и не вспомнит... И про нашу, новосибирскую, тоже. А зачем? Ведь в ФП же так много фишек

Уыыыаа. закатывает глаза
kemiisto, кончай фричеством заниматься. Ты же знаешь, как нелепо выглядят все эти срывания покровов и поиски следов ZOG в естественных науках.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
Дата 27.4.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Void @  27.4.2009,  11:37 Найти цитируемый пост)
Объясни одну вещь, а при чём тут ты?

Я только за себя отвечать могу. Это такой нескрываемый искренний эгоизм! А кто исчо то? Тут жеж нет никог... smile И к тому же:
Цитата(Void @  4.8.2008,  05:37 Найти цитируемый пост)
Функциональщина в нынешнем виде в массы не пойдёт из-за описанных симптомов мозгового взрыва.

 smile 

Цитата(Void @  27.4.2009,  11:37 Найти цитируемый пост)
но все остальные выводы — демагогия чистой воды.

Угу, конечно... smile Как что супротив ФП, так сразу демагогия. А вот где демагогия чистой воды, так это мы, какбе, не замечаем:
Цитата(nickless @  26.4.2009,  15:02 Найти цитируемый пост)
kemiisto, с теоретической точки зрения функциональные языки намного лучше, т.к. с ними проще работать, особенно их верифицировать и доказывать корректность. Для них легче делать компиляторы, оптимизировать и автоматически распалеллировать код, у них даже система типов интереснее.


Цитата(Void @  27.4.2009,  11:37 Найти цитируемый пост)
Уыыыаа. закатывает глаза

Гы! smile Тебе нравиццо!?

Цитата(Void @  27.4.2009,  11:37 Найти цитируемый пост)
kemiisto, кончай фричеством заниматься. Ты же знаешь, как нелепо выглядят все эти срывания покровов и поиски следов ZOG в естественных науках. 

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

Это сообщение отредактировал(а) kemiisto - 27.4.2009, 14:26


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lazin
Дата 27.4.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(kemiisto @  27.4.2009,  13:09 Найти цитируемый пост)
Ну, во-первых, C++

напиши это на паскале, посмотрим что лучше smile 
Лично мне нравится смешанный подход, к примеру реализация lazy evalation в python, можно писать чисто в ФП стиле используя generator expressions и itertools, а можно это дело смешивать с генераторами, написанными в традиционном, императивном стиле используя кл.слово yield, или алгоритмы STL, в сочетании с биндами из библиотеки boost и прочей функциональщиной. smile 
PM MAIL Skype GTalk   Вверх
Void
Дата 27.4.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(kemiisto @  27.4.2009,  16:25 Найти цитируемый пост)
Я только за себя отвечать могу.

Ситуация: ты Эрланг не знаешь, и для себя решил, что изучения он не стоит. Хорошо, твоё право. На C++ ты плюёшься, но пишешь. Тоже запретить нельзя. А потом заявляешь: «код на Эрланге ерунда, потому что код на C++ я хотя бы прочитать могу». Блаб-синдром? По-моему, да.
Цитата(kemiisto @  27.4.2009,  16:25 Найти цитируемый пост)
Воспринимай моё прибывание на форуме (и в этом топике в т.ч.) как попытку донести ещё одну точку зрения. Не в пику другой. Просто для сохранения равновесия.

В данном топике твоя точка зрения сводится к: «Я этого не знаю. Поэтому оно фигня. И нас таких миллион! Значит точно фигня». В такой ситуации у нас нет базиса для спора.
Я же не против критики, и фанатизмом не страдаю. Но ты не привёл ни одного технического аргумента. А разборки на уровне кто кому прищемил и кого недооценил N-цать лет назад — это не просто неконструктивно, но даже для пофлеймить неинтересно.

Это сообщение отредактировал(а) Void - 27.4.2009, 15:57


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
Дата 27.4.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Void @  27.4.2009,  13:56 Найти цитируемый пост)
«Я этого не знаю. Поэтому оно фигня. И нас таких миллион! Значит точно фигня»

Ну, тут скорее, "сходу" (интуитивно) так и не понял.

Цитата(Void @  27.4.2009,  13:56 Найти цитируемый пост)
Но ты не привёл ни одного технического аргумента.

Приехали... Я то как раз привёл, причём железный. Повторю ещё раз: наши железные други, будучи построены по принципам фон Неймана, императивны по определению. Хорошо это или плохо - другой вопрос. Но понятно же, что реализация трансляторов для языков, построенных на иных, неимперативных, принципах как минимум в разы сложней, менее эффективна... Да и зачем...
И снова,
Цитата(Никлаус Вирт)

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


Это сообщение отредактировал(а) kemiisto - 27.4.2009, 16:29


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lazin
Дата 27.4.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(kemiisto @  27.4.2009,  16:17 Найти цитируемый пост)
Приехали... Я то как раз привёл, причём железный. Повторю ещё раз: наши железные други, будучи построены по принципам фон Неймана, императивны по определению. Хорошо это или плохо - другой вопрос. Но понятно же, что реализация трансляторов для языков, построенных на иных, неимперативных, принципах как минимум в разы сложней, менее эффективна... Да и зачем...

цитата, которую ты привел, наверняка была сказана в бородатые 80-е годы, это уже давно не актуально, современное программирование все дальше и дальше от этого, и слава богу smile 
вот небольшая презентация, в которой какой-то чувак из Epic games рассуждает на тему следующего mainstream языка программирования
http://www.st.cs.uni-saarland.de/edu/semin...docs/sweeny.pdf
может и боян, но довольно интересный smile 
PM MAIL Skype GTalk   Вверх
kemiisto
Дата 27.4.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Lazin @  27.4.2009,  14:47 Найти цитируемый пост)
цитата, которую ты привел, наверняка была сказана в бородатые 80-е годы, это уже давно не актуально, современное программирование все дальше и дальше от этого, и слава богу

Good Ideas through the Looking Glass by Niklaus Wirth, Computer, V. 39, No 1, January 2006 

Цитата(Lazin @  27.4.2009,  14:47 Найти цитируемый пост)
может и боян, но довольно интересный

Поглядим.

Добавлено через 10 минут и 35 секунд
Lazin, ну, предпоследний слайд:
Цитата
Why Haskell is Not My Favorite Programming Language
§ The syntax is … scary

 smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
nickless
Дата 27.4.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата(kemiisto @  26.4.2009,  18:07 Найти цитируемый пост)
с теоретической точки зрения функциональные языки намного лучше

Ну да, ну да... 

Зря смеёшься, вот ты видел хотя бы одну научную работу на эту тему? Доказывать что-либо о императивных языках очень сложно. Их обычно или урезают до функциональных, или оно работает только в крайне простых случаях.
Вот маленький пример, попробуй докажи, что функция f всегда возвращает 7:
Код

int g = 0;

int fun() {
    g = 10;
    if (g == 10)
        return 7;
    while (true) {}
}

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

Цитата(kemiisto @  26.4.2009,  18:07 Найти цитируемый пост)
Опять же - просто слова. Не вижу я простоты создания компиляторов! И её быть не может.

Опять же, алиасинг, указатели и прочие сайд-эффекты. Без них оптимизировать значительно проще и быстрее, т.к. всё делается локально.

Цитата(kemiisto @  27.4.2009,  15:17 Найти цитируемый пост)
реализация трансляторов для языков, построенных на иных, неимперативных, принципах как минимум в разы сложней, менее эффективна... Да и зачем...

Гы, а ты знаешь, что оптимизация под железо - это лишь одна, самая последняя стадия оптимизации? А все остальные проводятся на промежуточных представлениях кода, в которых от императивности почти ничего не остаётся?

Цитата(kemiisto @  26.4.2009,  18:07 Найти цитируемый пост)
Кстати, утали моё любопытство, что за университет?

Universität des Saarlandes

Добавлено через 5 минут и 45 секунд
Цитата(Lazin @  27.4.2009,  15:47 Найти цитируемый пост)
вот небольшая презентация, в которой какой-то чувак из Epic games рассуждает на тему следующего mainstream языка программирования

Знакомый URL smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
gcc
Дата 28.4.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



не удобно когда нету объекта

Код

sub new {
    my ( $self, $c ) = @_;
    $self = $self->SUPER::new($c);
    $self->{namespace}               ||= ref $self;
    $self->{additional_base_classes} ||= ();
    for my $sub ( @{$self->{subroutines}} ) {
        my $target_class = $self->{target_class};
        unless ( $CLASS_CACHE{$target_class}{$sub} ) {
            $c->log->debug( "Installing sub:$sub from target_class:$target_class into proxy" ) if $c->debug;
            $CLASS_CACHE{$target_class}{$sub} = 1;
            no strict 'refs';
            *{__PACKAGE__ . "::$sub"} = sub {
                shift;
                return $c->model($target_class)->$sub(@_);
            }
        }
    }
    return $self;
}

PM WWW ICQ Skype GTalk Jabber   Вверх
Lazin
Дата 28.4.2009, 11:20 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



мои глаза!!! %#&*

Добавлено через 1 минуту и 18 секунд
вот теперь я по настоящему понял что-значит write only programming language smile 
PM MAIL Skype GTalk   Вверх
Lateralus
Дата 8.11.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 5.11.2011

Репутация: нет
Всего: нет



Scheme-не понял,буду изучать Haskell,Ocaml и другие.
PM MAIL   Вверх
Void
Дата 9.11.2011, 14:06 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Lateralus @  8.11.2011,  20:11 Найти цитируемый пост)
Scheme-не понял

Цитата(Lateralus @  8.11.2011,  20:11 Найти цитируемый пост)
буду изучать Haskell

Пожелаем удачи товарищу...


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
  Дата 9.11.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



 smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
k0rvin
Дата 10.11.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Lateralus @ 8.11.2011,  18:11)
буду изучать Haskell,Ocaml и другие.

это уже не модно, изучайте Coq, Agda и Epigram


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.2995 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.