F#: горячая новинка

Функциональное программирование и платформа .NET в одном флаконе

Ещё совсем недавно трудно было даже предположить, что появится язык программирования для платформы .NET, полноценно поддерживающий парадигму функционального программирования. И, тем не менее, такой язык программирования появился, более того, его создала сама корпорация Microsoft. Так что самое время познакомиться с ним поближе...


Вступление, или, по крайней мере, что-то вроде того

Сравнительно недавно я рассказывал в "Компьютерных вестях" о функциональном программировании (см. статью "Знакомьтесь: функциональное программирование" в №24 за этот год). Думаю, если вы действительно заинтересовались языком F# и ничего раньше даже не слышали о таком диковинном звере, как функциональное программирование, то сначала вам стоит познакомиться с самой парадигмой, а затем уже читать про F#. Тем не менее, об основных моментах я всё же расскажу, поскольку иначе будет трудно воспринимать информацию об этом языке программирования.

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

"Да можно ли так вообще программировать и при этом писать хоть минимально полезные приложения?", - можете спросить вы. Да, действительно, это не совсем то, чему нас учат, когда в институтах, на курсах или дома по книгам мы изучаем C++, Java или даже Delphi. Однако и ничего смертельного, как показывает практика, в этом нет. В ряде случаев функциональное программирование оказывается куда более удобным, чем более традиционные подходы. В общем-то, создание корпорацией Microsoft функционального языка для своей платформы .NET - самое что ни на есть замечательное подтверждение этого простого по своей сути факта.

Что ж, давайте теперь посмотрим, под каким именно соусом и с какими приправами преподносят нам функциональное программирование разработчики из Microsoft. Блюдо обещает получиться очень интересным...


Первое знакомство

Официальная страница на сайте Microsoft, посвящённая языку программирования F#, располагается по следующему адресу research.microsoft.com/fsharp/fsharp.aspx. Там можно прочитать подробную документацию по этому языку, а также скачать предварительную версию инструментов, необходимых для того, чтобы писать на нём программы. Размер дистрибутива этой самой предварительной версии совсем невелик - чуть меньше пятнадцати мегабайт, однако для того, чтобы работать с этим программным продуктом, вам потребуется установленный на вашем компьютере Microsoft .NET Framework 2.0 и (опционально, но, на самом деле, весьма и весьма желательно) Microsoft Visual Studio 2008. Для того, чтобы F# интегрировался в Visual Studio, лучше скачивать инсталляционный пакет в формате Windows Installer (тот, который с расширением MSI). Стоит заметить, что, вообще говоря, можно работать с F# и без .NET Framework'а - для этого нужна аналогичная ему кросс-платформенная библиотека Mono. Инструкция по "стыковке" F# и Mono находится внутри дистрибутива CTP-версии F#, и вы сможете найти её безо всяких проблем, но здесь уже лучше всё-таки скачивать не MSI, а ZIP-файл с дистрибутивом.

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


Функциональный? Не только!

Тех, кто из вступления понял, что функциональное программирование существенным образом конфликтует со всеми привычными ему принципами написания программ, спешу успокоить: на самом деле, поскольку F# - это язык программирования для платформы .NET, то он попросту обязан быть объектно-ориентированным. То есть, согласно принятой классификации, F# - это мультипарадигменный язык программирования, в равной степени поддерживающий парадигмы функционального, объектно-ориентированного и императивного программирования. Фактически, для вас это означает, в основном, что F# предлагает сравнительно безболезненный переход к функциональному программированию от программирования объектно-ориентированного, с которым программист имеет дело в таких .NET-языках, как C# или Visual Basic .NET. На самом деле, наверное, нельзя сказать, что это плохо, хотя приверженцы чисто функционального программирования, наверное, со мной не согласятся.

Одна из главных особенностей F# состоит в том, что явная декларация типов переменных в этом языке не требуется - компилятор в большинстве случаев способен самостоятельно распознать, какой тип должна иметь используемая программистом переменная, и именно этим типом воспользоваться при создании исполняемого кода программы. Хотя, конечно же, это вовсе не означает, что явное определение типов переменных вовсе запрещено - конечно, программист может помочь компилятору, указав, какой именно тип данных имеет та или иная переменная.


Типизация в F#

Что касается самих типов, то они, в силу нацеленности этого языка на .NET Framework, объектны и могут быть классами .NET Framework'а. Но эти классы частный вид типа переменных в F#. Вообще же разработчики языка предусмотрели два вида типов (ну да, не слишком красивая языковая конструкция, зато она точно отражает, что именно разработчики предусмотрели). Первый - это изменяющиеся (mutable) типы, а второй, соответственно, неизменяющиеся. Переменные изменяющихся типов могут быть изменены непосредственно, а при изменении переменных неизменяющихся типов создаётся новый экземпляр, а старый при этом не перезаписывается. Стоит отметить, что .NET-классы относятся к изменяющимся типам, в то время как неизменяющиеся типы предусмотрены, в общем-то, именно для функционального программирования в его классическом виде.

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


Что ещё из особенностей?

Одна из идей функционального программирования, заложенная разработчиками Microsoft в F#, - это так называемые энергичные вычисления. Вкратце эту концепцию можно записать так: "вычислять, не откладывая, всё, что возможно". В общем-то, конечно, можно долго и с пеной у рта спорить о том, хороша идея энергичных вычислений или нет, но факт остаётся фактом, и с тем, что они реализованы в F#, в процессе написания программного кода на этом языке нельзя не считаться.

Конечно, на самом деле особенностей у языка программирования F# столько, что обо всех них рассказать в одной-единственной статье попросту не представляется возможным. Здесь, конечно, стоило бы не просто упомянуть, а подробно рассказать о таких интересных и полезных вещах, как лямбда-функции, сопоставление по образцу (pattern matching), асинхронные выражения... Тем не менее, объём газетной статьи ограничен, и потому рассказать обо всём я сейчас не имею возможности. Если же вы действительно заинтересовались этим замечательным и, безусловно, перспективным языком программирования, то я рекомендую вам прочитать статью Тэда Ньюарда "Первое знакомство с F#: использование приемов функционального программирования в .NET Framework", русский вариант которой можно найти по адресу msdn.microsoft.com/ru-ru/magazine/cc164244.aspx.

Напоследок приведу пример программного кода на F# - это программа, которая с помощью сопоставления по образцу (pattern matching) вычисляет рекурсивным способом факториал:

let rec fac n = match n with
| 0 -> 1
| _ -> n * fac(n - 1)
do printf "10! = %d" (fac 10)

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


Подведём, пожалуй, итоги...

Что ж, конечно, в этой статье недостаёт практики, однако невозможно всё рассказать сразу - думаю, если вы действительно заинтересуетесь функциональным программированием и именно этим языком, то безо всяких особенных трудностей сможете найти достаточно документации, посвящённой именно практике программирования на F#. Мы же сейчас попробуем подвести итоги тому, что было сказано выше.

Как видите, Microsoft созданием ориентированного на платформу .NET языка функционального программирования фактически подписалась под тем, что функциональное программирование - не просто интересная с академической точки зрения парадигма, а идея, имеющая реальную, измеряемую в деньгах ценность и очень большой потенциал в коммерческой разработке приложений. Конечно, F# - это не чисто функциональный язык программирования, однако, думаю, это трудно отнести к его недостаткам. Без поддержки функционального и императивного программирования мы бы получили не перспективный язык программирования для платформы .NET, а просто очередной концепт, имеющий чисто умозрительную ценность для большинства разработчиков.

Так что, как видите, раз уж Microsoft решила реализовать поддержку функционального программирования в .NET Framework'е, то пришло время изучать функциональное программирование - вряд ли Microsoft принялась бы за такой проект, не имея намерений распространять F# среди разработчиков...

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

43 за 2008 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!