пятница, 24 июня 2011 г.

[prog] Чем может отличаться sequence от sequence_?

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

Помнится, несколько лет назад на RSDN я защищал короткие имена методов, принятые в стандартной библиотеки Ruby – вроде to_i (а не ToInteger), to_a (а не ToArray) и пр. Поскольку у меня большой C/C++ опыт, то ничего страшного в to_i по сравнению с strcpy не видел и не вижу. Тем не менее, сейчас я сам оказался в ситуации своего тогдашнего оппонента. Но смолчать не смогу :)

Читаю статью Beautiful Concurrency Саймона Пейтона Джонса. Дохожу до примера в разделе 4.3 на стр.17:

sequence_ [ elf elf_group n | n <- [1..10] ]

Конструкция в квадратных скобках – это list comprehension, т.е. формирование списка элементов вида [elf elf_group 0, elf elf_group 1, ...,elf elf_group 10].

Намного интереснее функция sequence_. Делает она простую вещь – перебирает последовательно элементы переданного ей списка. И возвращает, грубо говоря, void. Т.е. имеет прототип:

sequence_ [IO a] :: IO ()

В принципе, ее цель понятна. Но почему название такое, с подчеркиванием на конце? А потому, что уже есть sequence без подчеркивания с прототипом:

sequence [IO a] :: IO [a]

которая берет один список и возвращает второй список. А не void.

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

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

четверг, 23 июня 2011 г.

[prog] Небольшая ремарка в связи с выходом Eclipse 3.7

Состоялся релиз очередной версии платформы Eclipse – 3.7. Из текста новости я выделю одно короткое предложение:

Общий объем выпущенных в рамках Eclipse 3.7 исходных текстов составляет 46 млн строк кода.

Предлагаю вдуматься в эту цифру. Сорок шесть миллионов строк кода!

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

вторник, 21 июня 2011 г.

[life.humour] Решил спросить у Wikipedia про натуральный логарифм

По ошибке зашел на en.wikipedia.org вместо ru.wikipedia.org. Был поражен результатом поиска:

[prog.flame] Понравилось высказывание Бертранда Мейера

Цитата из свежей записи в блоге Бертранда Мейера:

Functional programming languages have also offered interesting idioms for concurrency, taking advantage of the non-imperative nature of functional programming. Advocacy papers have argued for Haskell [10] and Erlang [11] in this role. But should the world renounce other advances of modern software engineering, in particular object-oriented programming, for the sake of these mechanisms? Few people are prepared to take that step, and (as I have discussed in a detailed article [12]) the advantages of functional programming are counter-balanced by the superiority of the object-oriented model in its support for the modular construction of realistic systems.

Что, в моем переводе звучит как:

Функциональные языки программирования так же предлагают интересные идиомы для конкурентности, получающие преимущества из неимперативной природы функционального программирования. Пропагандистские публикации указывают на Haskell [10] и Erlang [11]. Но должен ли мир оказаться от других преимуществ современной инженерии программного обеспечения, объектно-ориентированного программирования в частности, ради этих механизмов? Некоторые приготовились сделать этот шаг, но (как я более подробно рассматривал в статье [12]) преимущества функционального программирования перевешиваются превосходством объектно-ориентированной модели в поддержке модульного конструирования реалистичных систем.

Вот упомянутые в цитате ссылки:

[10] Simon Peyton-Jones: Beautiful Concurrency, in Beautiful Code, ed. Greg Wilson, O’Reilly, 2007, also available online.

[11] Joe Armstrong: Erland, in Communications of the ACM, vol. 53, no. 9, September 2010, pages 68-75.

[12] Bertrand Meyer: Software Architecture: Functional vs. Object-Oriented Design, in Beautiful Architecture, eds. Diomidis Spinellis and Georgios Gousios, O’Reilly, 2009, pages 315-348, available online.

Понравилась цитата потому, что как и Б.Мейер, я являюсь приверженцем объектного подхода (пусть не таким продвинутым) и так же имею сильные сомнения на счет преимуществ функционального подхода. Поэтому отрадно, когда аналогичные сомнения высказывает намного более сведущий в computer science специалист, чем я.

PS. В заключение дам ссылку на свою старую заметку: Об интуитивности императивного и функционального программирования.

понедельник, 20 июня 2011 г.

[prog] Хороший пример прикладной ниши для C++ (от разработчиков POCO)

На форумных флеймах часто слышны вопли о том, что для С++ не осталось никаких прикладных ниш. Понятное дело, что все это ерунда и особо заморачиваться не стоит, если только нет желания отвести душу разбрасывая какашки по форумам :)
Но когда есть хороший пример удачного применения C++, то об этом не грех и рассказать.

Разработчики библиотеки POCO в своем блоге похвастались о получении премии Constantinus Award. Компания Applied Informatics для своего заказчика PSP GmbH разработала программно-аппаратный комплекс BWIM (Bridge Weigh In Motion). Как я понял, это система из нескольких сенсоров, которые работают под управлением embedded Linux. Она измеряет деформацию моста и на основании собранных данных дает возможность классифицировать по типам проезжающие по мосту машины.

Софт для сбора и обработки данных, web-сервер для мониторинга и конфигурирования, средства для передачи данных на центральный сервер и пр. были разработаны на C++ с использованием библиотеки POCO.

Имхо, как раз хороший пример задачи, для которой применение C++ (а так же других близких к железу языков, вроде C, Modula-2, Ada, Eiffel) более чем оправдано. Причем по сравнению с более экзотическими конкурентами – Modula-2, Ada и Eiffel – специалистов по C++ и готовых инструментов для C++ намного больше. Если же сравнивать с C, то в отсутствии необходимости засовывать программу в совсем уж урезанный девайс, C++ может облегчить жизнь разработчиками своими более высокоуровневыми возможностями – ООП и шаблонами, например.

PS. Время от времени завидую тем, кто занимается подобными проектами. Это, даже при имеющихся там заморочками и тараканами, все-таки далеко не сраный Ынтырпрайз.

воскресенье, 19 июня 2011 г.

[prog.wow] Еще одно достижение JavaScript-а: MP3 декодер

Узнал об этом из новости на OpenNet-е: Представлен проект JSMad, с реализацией проигрывателя MP3 на языке JavaScript.

Раз уж браузеры становятся самодостаточными операционками, то пора бы предоставлять больше возможностей для разработки приложений под них. Не JavaScript-ом же в конце-концов, единым :) И не ActionScript-ом :)) Пора в браузеры встроить какую-нибудь виртуалку опенсурсную (из llvm, например). Чтобы можно было программы для браузера на каком-нибудь статически-типизированном языке разрабатывать. Да хоть и на C++ ;)

Ну или, как альтернатива, пора делать для популярных языков трансляцию в JavaScript. Популяризаторам новых языков (да того же Nemerle в частности) на заметку ;)