12.07.2015 Views

Выпуск 14

Выпуск 14

Выпуск 14

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

СЕМИНАР44сентябрь 2011 / ИНФОРМАТИКАдачу не входит полностью описать эту практическинеобъятную область. Как и всегда, к моему сожалению,вынужден отправить любопытных читателейв [4, 5, 6].Как быстро это все работает?Рассуждения о производительности программныхсистем всегда очень субъективны, поэтомуя даже не стану пытаться выгораживать себяи убеждать вас в том, что мои потуги в этом направлениисильно отличаются в сторону объективностиот чьих-либо чужих, коих полно вИнтернете, специальной литературе и публицистике.Думаю, у вас уже назрел вполне ожидаемыйвопрос: а сколько ресурсов мы теряем дляподдержания работы такой мощной среды программирования,в которой работают программы,написанные на языке Haskell? Ведь, разумеется,скажете вы, такие легкие и непринужденные действияи операции над списками, функциями, любымидругими видами данных не могут пройтибезболезненно. Вы будете абсолютно правы: программына Haskell работают медленнее аналогичныхпо функциональности программ на языкеС или Pascal и тратят большее число памятипри своей работе. Однако результаты тестов показывают,что обычно производительность программна Haskell редко падает больше чем в 1,5раза, и лишь в самых исключительных случаяхфункциональные программы медленнее соответствующихимперативных в 9–10 раз. В настоящеевремя ведутся активные работы по разработкекомпилятора Haskell, который сможет сравнятьпроизводительность функциональных и императивныхпрограмм, и эти работы весьма успешны:в них используются концепции метавычислений,позволяющих создавать оптимизирующие компиляторы,“заточенные” под каждую отдельнуюпрограмму (!). Из серьезных минусов производительностифункцио нальных сред разработкиможно назвать, пожалуй, чрезмерно высокуютребовательность компиляторов к ресурсам, ввидувысокой сложности применяемых оптимизаций.К сожалению, эта проблема действительноимеет место, и решить ее, не ухудшив скоростигенерируемого кода, не представляется возможным.В целом, суммируя сказанное в этом разделе,можно сказать, что Haskell представляетсерьезную угрозу для императивного программирования,являясь одним из немногих действительнобыстрых функциональных языков, поэтомуон как минимум заслуживает того, чтобы кнему присмотрелись поближе.Заключение: а серебряная ли пуля?Завершая этот краткий обзор, я надеялся ответитьна вопрос: а является ли Haskell той самойсеребряной пулей, которая поможет нам справитьсяс оборотнем сложности проектированияи реализации программных систем? Когда же янапрямую подошел к написанию этого раздела, японял, что так и не могу дать вам этот ответ и одновременноне запутать вас и не сбить с пути, поэтому,думаю, вам, читателям, предстоит для себярешить, нужен ли и интересен ли вам Haskell ифункциональное программирование вообще, кажутсяли они вам мощнее императивных языков,могут ли они стать вашим повсе дневным инструментом.В этой статье я не успел охватить глубиныязыка Haskell, но, надеюсь, я смог показать егоневероятную простоту вкупе с сильнейшей теоретическойи математической обоснованностьювсех языковых конструкций. В общем, делайтевыводы, выбирайте язык программирования подуше и ни в коем случае не ставьте себя в какиенибудьжесткие рамки, делая этот выбор.ПримерыВ данном разделе я размещу 20 простых программна языке Haskell, решающих разнообразныечасто встречающиеся алгоритмические и математическиезадачи. Неясные моменты будут сопровождатьсяаннотациями. Для запуска в интерпретаторевсе примеры должны быть сохраненыкак определения функций — в отдельном файле ипотом загружены с помощью команды :l. Запускосуществляется вызовом соответствующей функцииили функции main. Результатом некоторыхпрограмм могут являться списки (в том числебесконечные).1. 99 бутылок колыОдин из самых бесполезных, но в то же время довольнонетривиальных примеров. Задача состоит втом, чтобы вывести стихотворение:“99 bottles of cola on the wall, 99 bottles of cola.Take one down and pass it around, 98 bottles of colaon the wall.98 bottles of cola on the wall, 98 bottles of cola.Take one down and pass it around, 97 bottles of colaon the wall....”и так далее.bob n = (num n) ++ ' bottle' ++(s n) ++ ' of cola'wall = ' on the wall'pass 0 = 'Go to the store and buysome more, 'pass _ = 'Take one down and passit around, 'up (x : xs) = x : xs

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!