воскресенье, 1 марта 2009 г.

Scheme: функциональный рай

1. Функциональное прошлое и будущее


Выдержки из учебного пособия:

bq. На функциональном языке программист не должен описывать порядок вычислений. Нужно просто описать желаемый результат как систему функций.
В чистом функциональном программировании оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путём разбора и сбора существующих.
Каковы же преимущества чистых функциональных языков? Помимо упрощения анализа программ есть ещё одно — параллелизм. Раз все функции для вычислений используют только свои параметры, мы можем вычислять независимые функции в произвольном порядке или параллельно, на результат вычислений это не повлияет. Причём параллелизм этот может быть организован не только на уровне компилятора языка, но и на уровне архитектуры.

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

1.1 Происхождение


Lisp как первый функциональный язык придуман давно, диалектов создано тоже предостаточно. Императивные языки, в основной массе которые объектно ориентированные, начинаю разрастаться лямбда расширениями. Что это даёт: мешанину мух и котлет, вопросы по типу "А чем пользоваться?", разрываться. Переходный момент? Возможно. Что останется? Если будущее за параллельными вычислениями - функциональные, а потом и другие, более совершенные, более абстрактны, человеко-ориентированные. Если провести параллель с искусственным интеллектом - самое то: распределённая сеть функциональных узлов, завязанная на знании, опыте.

1.2 Концепция


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

2. Совмещение


2.1 Java


Что есть здесь? А здесь пожалуйста: тот же scheme в ре-инкарнации kawa: (пишите на scheme, компилируете в байт-код, исполняемый на виртуальной машине java; плюс ко всему доступ к бесчисленным библиотекам).
Нашёлся ещё один язык для jvm - Clojure. Подробное введение описано здесь. Ну и scala не будь дурой также для jvm.

2.2 CSharp


В .net 3.0 появились безымянные функции, придумали даже F#. Тенденция, однако.

2.3 Others


Насколько я помню, собираются лямбда расширение прикрутить и к PHP. Ну что ж, весьма. Ребята не отстают.

3. Web


Для web-сервисов применение функциональных языков более, чем оправданно. Наткнулся на пример выполнения скрипта на scheme. Интересно дико. А главное - прозрачно и открывает глаза на то, как доступно и понятно можно описать. Однозначно - не зря мигрируют на эту парадигму. Если кого заинтересовало, то вот проект PLT-Scheme в состав которого входят IDE, JIT, web server, библиотеки и документация. Кросс-платформенный. Кроме того, имеются хорошее пособие по scheme и книга рецептов.

3.1 CGI


Запускать веб-приложения можно как fastCGI, или же "нативно" - посредством PLT-Scheme.

4. ПО


Scheme как самостоятельный продукт - используем DrScheme, входящий в PLT-Scheme.
Ниже окно программы: лаконичное, минимальный функционал. Пример такой: нужно добавить к слову заданную последовательность символов дважды. В данном случае - к "hello" дважды восклицательный знак. Сверху функции, снизу исполнение.

Комментариев нет: