К функциональным языкам программирования относят

Языки функционального программирования

В традиционных языках программирования (например, C++) вызов функции приводит к вычислению всех аргументов. Этот метод вызова функции называется вызов-по-значению. Если какой-либо аргумент не использовался в функции, то результат вычислений пропадает, следовательно, вычисления были произведены впустую. В каком-то смысле противоположностью вызова-по-значению является вызов-по-необходимости. В этом случае аргумент вычисляется, только если он нужен для вычисления результата. Примером такого поведения можно взять оператор конъюнкции всё из того же C++ (&9amp;), который не вычисляет значение второго аргумента, если первый аргумент имеет ложное значение.

Если функциональный язык не поддерживает отложенные вычисления, то он называется строгим. На самом деле, в таких языках порядок вычисления строго определен. В качестве примера строгих языков можно привести Scheme, Standard ML и Caml.

Языки, использующие отложенные вычисления, называются нестрогими. Haskell — нестрогий язык, так же как, например, Gofer и Miranda. Нестрогие языки зачастую являются чистыми.

Очень часто строгие языки включают в себя средства поддержки некоторых полезных возможностей, присущих нестрогим языкам, например бесконечных списков. В поставке Standard ML присутствует специальный модуль для поддержки отложенных вычислений. А Objective Caml помимо этого поддерживает дополнительное зарезервированное слово lazy и конструкцию для списков значений, вычисляемых по необходимости.

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

§ Lisp (List processor). Считается первым функциональным языком программирования. Нетипизирован. Содержит массу императивных свойств, однако в общем поощряет именно функциональный стиль программирования. При вычислениях использует вызов-по-значению. Существует объектно-ориентированный диалект языка — CLOS.

§ ISWIM (If you See What I Mean). Функциональный язык-прототип. Разработан Ландиным в 60-х годах XX века для демонстрации того, каким может быть язык функционального программирования. Вместе с языком Ландин разработал и специальную виртуальную машину для исполнения программ на ISWIM’е. Эта виртуальная машина, основанная на вызове-по-значению, получила название SECD-машины. На синтаксисе языка ISWIM базируется синтаксис многих функциональных языков. На синтаксис ISWIM похож синтаксис ML, особенно Caml.

§ Scheme. Диалект Lisp’а, предназначенный для научных исследований в области computer science. При разработке Scheme был сделан упор на элегантность и простоту языка. Благодаря этому язык получился намного меньше, чем Common Lisp.

§ ML (Meta Language). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями. ML преподается во многих западных университетах (в некоторых даже как первый язык программирования).

§ Standard ML. Один из первых типизированных языков функционального программирования. Содержит некоторые императивные свойства, такие как ссылки на изменяемые значения и поэтому не является чистым. При вычислениях использует вызов-по-значению. Очень интересная реализация модульности. Мощная полиморфная система типов. Последний стандарт языка — Standard ML-97, для которого существует формальные математические определения синтаксиса, а также статической и динамической семантик языка.

§ Caml Light и Objective Caml. Как и Standard ML принадлежит к семейству ML. Objective Caml отличается от Caml Light в основном поддержкой классического объектно-ориентированного программирования. Также как и Standard ML строгий, но имеет некоторую встроенную поддержку отложенных вычислений.

§ Miranda. Разработан Дэвидом Тернером, в качестве стандартного функционального языка, использовавшего отложенные вычисления. Имеет строгую полиморфную систему типов. Как и ML преподаётся во многих университетах. Оказал большое влияние на разработчиков языка Haskell.

§ Haskell. Один из самых распространённых нестрогих языков. Имеет очень развитую систему типизации. Несколько хуже разработана система модулей. Последний стандарт языка — Haskell-98.

§ Gofer (GOod For Equational Reasoning). Упрощённый диалект Haskell’а. Предназначен для обучения функциональному программированию.

§ Clean. Специально предназначен для параллельного и распределённого программирования. По синтаксису напоминает Haskell. Чистый. Использует отложенные вычисления. С компилятором поставляется набор библиотек (I/O libraries), позволяющих программировать графический пользовательский интерфейс под Win32 или MacOS.

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

Функциональный подход породил целое семейство языков, родоначальником которых, как уже отмечалось, стал язык программирования LISP. Позднее, в 70-х годах, был разработан первоначальный вариант языка ML, который впоследствии развился, в частности, в SML, а также ряд других языков. Из них, пожалуй, самым «молодым9quot; является созданный уже совсем недавно, в 90-х годах, язык Haskell.

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

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

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

Благодаря реализации механизма сопоставления с образцом, такие языки функционального программирования как ML и Haskell хорошо использовать для символьной обработки.

Естественно, языки функционального программирования не лишены и некоторых недостатков.

Часто к ним относят нелинейную структуру программы и относительно невысокую эффективность реализации. Однако первый недостаток достаточно субъективен, а второй успешно преодолен современными реализациями, в частности, рядом последних трансляторов языка SML, включая и компилятор для среды Microsoft .NET.

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

Заметим, что под термином «функция9quot; в математической формализации и программной реализации имеются в виду различные понятия.

Так, математической функцией f с областью определения A и областью значений B называется множество упорядоченных пар

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

Для формализации понятия «функция9quot; была построена математическая теория, известная под названием лямбда-исчисления. Более точно это исчисление следует именовать исчислением лямбда-конверсий.

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

Кроме того, конверсии обеспечивают переход к вновь введенным обозначениям и, таким образом, позволяют представлять предметную область в более компактном либо более детальном виде, или, говоря математическим языком, изменять уровень абстракции по отношению к предметной области. Эту возможность широко используют также языки объектно-ориентированного и структурно-модульного программирования в иерархии объектов, фрагментов программ и структур данных. На этом же принципе основано взаимодействие компонентов приложения в .NET. Именно в этом смысле переход к новым обозначениям является одним из важнейших элементов программирования в целом, и именно лямбда-исчисление (в отличие от многих других разделов математики) представляет собой адекватный способ формализации переобозначений.

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

Рассмотрим эволюцию языков программирования, развивающихся в рамках функционального подхода.

Ранние языки функционального программирования, которые берут свое начало от классического языка LISP (LISt Processing), были предназначены, для обработки списков, т.е. символьной информации. При этом основными типами были атомарный элемент и список из атомарных элементов, а основной акцент делался на анализе содержимого списка.

Развитием ранних языков программирования стали языки функционального программирования с сильной типизацией, характерным примером здесь является классический ML, и его прямой потомок SML. В языках с сильной типизацией каждая конструкция (или выражение) должна иметь тип.

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

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

На современном этапе развития возникли языки функционального программирования «нового поколения» со следующими расширенными возможностями: сопоставление с образцом (Scheme, SML, Miranda, Haskell), параметрический полиморфизм (SML) и так называемые «ленивые9quot; (по мере необходимости) вычисления (Haskell, Miranda, SML).

Семейство языков функционального программирования довольно многочисленно. Об этом свидетельствует не столько значительный список языков, сколько тот факт, что многие языки дали начало целым направлениям в программировании. Напомним, что LISP дал начало целому семейству языков: Scheme, InterLisp, COMMON Lisp и др.

Не стал исключением и язык программирования SML, который был создан в форме языка ML Р. Милнером (Robin Milner) в MIT (Massachusetts Institute of Technology) и первоначально предназначен для логических выводов, в частности, доказательства теорем. Язык отличается строгой типизацией, в нем отсутствует параметрический полиморфизм.

Развитием «классического9quot; ML стали сразу три современных языка с практически одинаковыми возможностями (параметрический полиморфизм, сопоставление с образцом, «ленивые9quot; вычисления). Это язык SML, разработанный в Великобритании и США, CaML, созданный группой французских ученых института INRIA, SML/NJ – диалект SML из New Jersey, а также российская разработка – mosml («московский9quot; диалект ML).

Близость к математической формализации и изначальная функциональная ориентированность послужили причиной следующих преимуществ функционального подхода:

1. простота тестирования и верификации программного кода на основе возможности построения строгого математического доказательства корректности программ;

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

3. безопасная типизация: недопустимые операции с данными исключены;

4. динамическая типизация: возможно обнаружение ошибок типизации во время выполнения (отсутствие этого свойства в ранних языках функционального программирования может приводить к переполнению оперативной памяти компьютера);

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

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

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

1. интеграция различных языков функционального программирования (при этом максимально используются преимущества каждого из языков, в частности, Scheme предоставляет механизм сопоставления с образцом, а SML – возможность вычисления по мере необходимости);

2. интеграция различных подходов к программированию на основе межъязыковой инфраструктуры Common Language Infrastructure, или CLI (в частности, возможно использование C# для обеспечения преимуществ объектно-ориентированного подхода и SML – функционального, как в настоящем курсе);

3. общая унифицированная система типизации Common Type System, CTS (единообразное и безопасное управление типами данных в программе);

4. многоступенчатая, гибкая система обеспечения безопасности программного кода (в частности, на основе механизма сборок).

Основными особенностями функциональных языков программирования, отличающими их как от императивных языков, так и от языков логического программирования, являются прозрачность по ссылкам и детерминизм. В функциональных языках существует значительный разброс по таким параметрам как типизация, правила вычисления. Во многих языках порядок вычисления строго определен. Но иногда строгие языки содержат средства поддержки некоторых полезных элементов, присущих нестрогим языкам, например бесконечных списков (в Standard ML присутствует специальный модуль для поддержки отложенных вычислений). Напротив, нестрогие языки позволяют в некоторых случаях выполнять энергичные вычисления.

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

Многие современные языки функционального программирования являются строго типизированными языками (строгая типизация). Строгая типизация обеспечивает большую безопасность. Многие ошибки могут быть исправлены на стадии компиляции, поэтому стадия отладки и общее время разработки программ сокращаются. Строгая типизация позволяет компилятору генерировать более эффективный код и тем самым ускорять выполнение программ. Наряду с этим, существуют функциональные языки с динамической типизацией. Тип данных в таких языках определяется во время выполнения программы (гл. 3). Иногда их называют «безтиповыми». К их, достоинствам следует отнести то, что программы, написанные на этих языках, обладают большей общностью. Недостатком можно считать отнесение многих ошибок на стадию выполнения программы и связанную с этим необходимость применения функций проверки типов и соответствующее сокращение общности программы. Типизированные языки способствуют генерации более «надежного» кода, а типизированные более «общего».

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

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

Common Lisp. Версия Лиспа, которая с 1970 г. может считаться стандартом языка, благодаря поддержке со стороны лаборатории искусственного интеллекта Массачусетского технологического института, безтиповый, энергичный, с большим набором императивных включений, допускающих присваивание, разрушение структур. Практический. Достаточно сказать, что на Лиспе был написан векторный графический редактор Автокад.

Scheme. Диалект Лиспа, предназначенный для научных исследований в области компьютерной науки и обучения функциональному программированию. Благодаря отсутствию императивных включений язык получился намного меньше, чем Common Lisp. Восходит к языку, разработанному Дж. Маккарти в 1962 г. Академический, безтиповый, энергичный, чистый.

Refal. Семейство языков, разработанных В. Ф. Турчиным. Старейший член этого семейства впервые реализован в 1968 году в России. Широко используется и поныне в академических кругах. Содержит элементы логического программирования (сопоставление с образцом). Поэтому язык Refal предлагается в данном учебном пособии в качестве языка для самостоятельного изучения.

Miranda. Строго типизированный, поддерживает типы данных пользователя и полиморфизм. Разработан Тернером на основе более ранних языков SALS и KRC. Имеет ленивую семантику. Без императивных включений.

Haskell. Развитие языка пришлось на конец прошлого века. Широко известен в академических кругах. В некоторых западных университетах используется в качестве основного языка для изучения студентами. Один из наиболее мощных функциональных языков. Ленивый язык. Чисто функциональный язык. Типизированный. Haskell – отличный инструмент для обучения и экспериментов со сложными функциональными типами данных. Программы, написанные на Haskell, имеют значительный размер объектного кода и невысокую скорость исполнения.

Clean. Диалект Haskell, приспособленный к нуждам практического программирования. Как и Haskell, является ленивым чисто функциональным языком, содержит классы типов. Но Clean также содержит интересные особенности, которые не имеют эквивалента в Haskell. Например, императивные возможности в Clean основаны на уникальных типах, идея которых заимствована из линейной логики (linear logic). Clean содержит механизмы, которые позволяют значительно улучшить эффективность программ. Сред этих механизмов явное подавление отложенных вычислений. Реализация Clean является коммерческим продуктом, но свободная версия доступна для исследовательских и образовательных целей.

ML(Meta Language). Разработан группой программистов во главе с Робертом Милиером в середине 70-х гг. в Эдинбурге (Edinburgh Logic for Computable Functions). Идея языка состояла в создании механизма для построения формальных доказательств в системе логики для вычислимых функций. В 1983 язык был пересмотрен дополнен такими концепциями, как модули. Стал называться стандартный ML. ML – это сильно типизированный язык со статическим контролем типов и аппликативным выполнением программ. Он завоевал большую популярность в исследовательских кругах и в области компьютерного образования.

Функциональные языки программирования

Чистота (отсутствие побочных эффектов)

Отложенные вычисления (Lazy evaluation)

Языки функционального программирования

Список используемой литературы

Internet-ресурсы по функциональному программированию

Функциональное программирование ставит своей целью придать каждой программе простую математическую интерпретацию. Эта интерпретация должна быть независима от деталей исполнения и понятна людям, которые не имеют научной степени в предметной области. Архитектура языков программирования должна была быть максимально приближена к архитектуре компьютера. Компьютер состоит из центрального процессора и памяти. Поэтому программа должна была состоять из последовательности инструкций, выполняемых процессором и модифицирующих память. Функциональная программа представляет собой определения функций. Функции определяются через другие функции или рекурсивно — через себя. В процессе выполнения программы, функции получают параметры, вычисляют и возвращают результат, в случае необходимости вычисляя значения других функций. Почти каждый из нас так или иначе использовал функциональный подход к программированию. Возьмем к примеру, всем известный MicrosoftExcel. Записывая содержимое ячейки в виде, похожем на обычную математическую формулу, мы не задумываемся о действительном порядке вычислений этой формулы, возлагая эти функции на встроенный в Excel интерпретатор. А этот интерпретатор построен так, что правильный порядок вычисления этого выражения и, следовательно, правильный результат гарантированы. Как описывать вычисления на языке более близком человеку, чем компьютеру?». На этот вопрос призваны ответить универсальные функциональные языки программирования.

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

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

3. Сделать обзор современных функциональных языков программирования.

1. Ознакомления с языками функционального программирования.

2. Рассмотрение истории развития функциональных языков программирования.

3. Обзор современных функциональных языков программирования

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

Объектом исследования послужили языки функционального программирования и история развития функциональных языков программирования.

Функциональное программирование ставит своей целью придать каждой программе простую математическую интерпретацию. Эта интерпретация должна быть независима от деталей исполнения и понятна людям, которые не имеют научной степени в предметной области. Паулсон, Лоренс В 40-х годах нашего века были построены первые цифровые компьютеры. Самые первые модели этих компьютеров ‘программировались’ на машинных языках, посредством соединения плат проводками вручную или, в лучшем случае, путем установки в нужное положение сотен переключателей. Машинные языки плохо воспринимаются человеком, поэтому следующим шагом стало создание различных ассемблеров. В ассемблере машинные команды получают компактные мнемокоды типа LOAD, STORE, ADD и т.п. В конце 50-х годов сотрудник IBM Джон Бэкус решил, что записывать Формулы вида о к тому же эти формулы могут быть выполнены на любой машине, для которой есть специальная программа, которую назвали компилятором. Первый компилятор был создан для языка FORTRAN (FORmulaTRANslator — Транслятор Формул). В те дни компьютеры были очень дороги. Поэтому создатели первых языков программирования высокого уровня в погоне за эффективностью пошли по наиболее простому пути. Архитектура языков программирования должна была быть максимально приближена к архитектуре компьютера. Компьютер состоит из центрального процессора и памяти. Поэтому программа должна была состоять из последовательности инструкций, выполняемых процессором и модифицирующих память. На основе этого принципа был разработан так называемый императивныйстильпрограммирования. Основными признаками императивных языков программирования являются ориентированность, в первую очередь, на последовательное исполнение инструкций оперирующих с памятью (присваиваний) и итеративные циклы. Но не это главное. Со времен возникновения FORTRAN-а прошло почти 50 лет. За это время были разработаны сотни намного более развитых императивных языков, таких как Pascal, C++, Ada, Java и т.д. Значительно усовершенствованы механизмы и методы императивного программирования. Однако идея, лежащая в его основе, остается прежней. Программы на этих языках описывают процесс последовательного, пошагового решения задачи. Как следствие, полученные программы слабо напоминают оригинальную спецификацию задачи, которая, как правило, не содержат никаких упоминаний о различных массивах, указателях и счетчиках. На протяжении последних 400 лет, центральным понятием математики является понятие функции. Математические функции выражают связь между параметрами (входом) и результатом (выходом) некоторого процесса. Так как вычисление — это тоже процесс, имеющий вход и выход, функция — вполне подходящее средство задания вычислений. Именно этот простой принцип положен в основу функциональногостиляпрограммирования. Функциональная программа представляет собой определения функций. Функции определяются через другие функции или рекурсивно — через себя. В процессе выполнения программы, функции получают параметры, вычисляют и возвращают результат, в случае необходимости вычисляя значения других функций. Программируя на функциональном языке, программист не должен описывать порядок вычислений. Ему необходимо просто описать желаемый результат в виде системы функций. Почти каждый из нас так или иначе использовал функциональный подход к программированию. Возьмем к примеру, всем известный MicrosoftExcel. Записывая содержимое ячейки в виде, похожем на обычную математическую формулу, мы не задумываемся о действительном порядке вычислений этой формулы, возлагая эти функции на встроенный в Excel интерпретатор. А этот интерпретатор построен так, что правильный порядок вычисления этого выражения и, следовательно, правильный результат гарантированы. Фактически, вся таблица представляет собой набор функций и констант (которые, в общем, тоже функции), определенных друг через друга.

Другим простым примером могут послужить языки запросов к базам данных. В большинстве своем эти языки используют один из двух подходов. В языках, основанных на реляционнойалгебре. результат записывается в терминах операций над таблицами, демонстрируя тем самым явно императивный подход. Языки же, основанные на реляционномисчислении (например, всем известный SQL или QBE), напротив, описывают только результат, являясь тем самым по сути функциональными. По мере развития вычислительной техники, компьютерное время удешевляется, поэтому особую важность приобретает вопрос «Как описывать вычисления на языке более близком человеку, чем компьютеру?». На этот вопрос призваны ответить универсальные функциональные языки программирования, программы на которых гораздо больше напоминают изначальную спецификацию задачи чем программы, написанные с помощью императивных языков программирования.

История возникновения функциональных языков


язык программирование функциональный запрос


Теоретические основы императивного программирования были заложены в 30-х годах Аланом Тьюрингом и Джоном фон Нейманом. Теория положенная в основу функционального подхода, также родилась в 20-х — 30-х годах. В числе разработчиков математических основ функционального программирования можно назвать Мозеса Шёнфинкеля (Германия и Россия) и Хаскелла Карри (Англия), разработавших теорию комбинаторов, а также АлонзоЧёрча (США), создателя лямбда исчисления. Теория так и оставалась теорией, пока в начале 50-х Джон МакКарти не разработал язык Lisp, который стал первым почти функциональным языком программирования и на протяжении многих лет оставался единственным таковым. Хотя Lisp все еще используется (как и FORTRAN), он уже не удовлетворяет некоторым современным запросам, которые заставляют нас взваливать как можно большую ношу на компилятор, облегчив тем самым непосильный труд программиста. Необходимость в этом, конечно же, возникла из-за все возрастающей сложности программного обеспечения. В связи с этим обстоятельством все большую роль начинает играть типизация. В конце 70-х — начале 80-х интенсивно разрабатываются модели типизации, подходящие для функциональных языков. Большинство этих моделей включали в себя поддержку таких мощных механизмов как абстракция данных и полиморфизм. Появляется множество типизированных функциональных языков: ML, Scheme, Hope, Miranda, Clean и многие другие. Вдобавок постоянно увеличивается число диалектов. В результате вышло так, что практически каждая группа, занимающаяся функциональным программированием, использовала собственный язык. Это препятствовало дальнейшему распространению этих языков и порождало многочисленные более мелкие проблемы. Чтобы исправить ситуацию, объединенная группа ведущих исследователей в области функционального программирования решила воссоздать достоинства различных языков в новом универсальном функциональном языке. Первая реализация этого языка, названного Haskell в честь Хаскелла Карри, была создана в начале 90-х годов. В настоящее время действителен стандарт Haskell 98. Большинство примеров в этой статье будут приводиться именно на этом языке. В первую очередь большинство функциональных языков программирования реализуются как интерпретаторы, следуя традициям Lisp-а. Интерпретаторы удобны для быстрой отладки программ, исключая длительную фазу компиляции, тем самым укорачивая обычный цикл разработки. Однако с другой стороны, интерпретаторы в сравнении с компиляторами обычно проигрывают по скорости выполнения в несколько раз. Поэтому помимо интерпретаторов существуют и компиляторы, генерирующие неплохой машинный код (например, ObjectiveCaml) или код на C/C++ (например, GlasgowHaskellCompiler). Что показательно, практически каждый компилятор с функционального языка реализован на этом же самом языке.


Свойства функциональных языков

Краткость и простота


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


pow n 0 = 1


pow n m | even m = pow (n * n) (m `div` 2)


| otherwise = n * pow n (m — 1)


Строгая типизация


Практически все современные языки функционального программирования являются строго типизированными языками. Строгая типизация обеспечивает безопасность. Программа, прошедшая проверку типов просто не может выпасть в OS с сообщением подобным «segmentationviolation». Большая часть ошибок может быть исправлена на стадии компиляции, поэтому стадия отладки и общее время разработки программ сокращаются. Вдобавок к этому строгая типизация позволяет компилятору генерировать более эффективный код и тем самым ускорять выполнение программ. Вернемся к примеру, с быстрой сортировкой Хоара. Помимо уже упомянутых отличий между вариантом на языке C и вариантом на Haskell есть еще одно важное отличие: функция на C сортирует список значений типа int (целых чисел), а функция на Haskell — список значений любого типа, который принадлежит к классу упорядоченных величин Ord. Поэтому функция на Haskell может сортировать и список целых чисел, и список чисел с плавающей запятой, и список строк. Мы можем описать какой-нибудь новый тип. Определив для этого типа операции сравнения и cделав его тем самым экземпляром класса Ord, мы без перекомпиляции сможем использовать qsort и со списками этого нового типа. Это полезное свойство системы типов называется параметрическим или истинным полиморфизмом, и поддерживается большинством функциональных языков.


Еще одной разновидностью полиморфизма является перегрузка операций (overloading), позволяющая давать различным, но в чем-то схожим функциям одинаковые имена. Типичным примером перегруженной операции является обычная операция сложения. Функции сложения для целых чисел и чисел с плавающей запятой различны, однако для удобства они носят одно и то же имя. Некоторые функциональные языки, например, все тот же Haskell, помимо параметрического полиморфизма, поддерживают и перегрузку операций.


Программист, знакомый с C++, может возразить: «Да, все это хорошо, но я могу легко определить такую же полиморфную функцию qsort и на C++, воспользовавшись механизмом шаблонов». Да, это так. В стандартную библиотеку C++ STL входит такая функция и множество других полиморфных функций. Но шаблоны C++, как и родовые функции Ada, на самом деле порождают множество перегруженных функций, которые, кстати, компилятор должен каждый раз компилировать, что неблагоприятно сказывается на времени компиляции и размере кода. А в Haskell полиморфная функция qsort это одна функция.


В некоторых языках, например, в Ada, строгая типизация вынуждает программиста явно описывать тип всех значений и функций. Чтобы избежать этого, в строго типизированные функциональные языки встроен специальный механизм, позволяющий компилятору определять типы констант, выражений и функций из контекста. Этот механизм называется механизмом выводатипов (typeinference ). Известно несколько таких механизмов, однако большинство из них являются разновидностями модели типизации Хиндли-Милнера, разработанной в начале 80-х. Таким образом в большинстве случаев можно не указывать типы функций. Однако в примерах, приводимых в этой статье, типы функций указаны явно. Это позволяет компилятору дополнительно контролировать корректность типов определяемых функций.


Модульность


Механизм модульности позволяет разделять программы на несколько сравнительно независимых частей (модулей) с четко определенными связями между ними. Тем самым облегчается процесс проектирования и последующей поддержки больших программных систем. Поддержка модульности не является свойством именно функциональных языков программирования. Существуют очень развитые модульные императивные языки. В качестве примеров подобных языков можно привести Modula-2 и Ada-95. В этой статье, однако, речь идет о языках функционального программирования. Поэтому для примера рассмотрим систему модулей функционального языка Standard ML. Standard ML — строго типизированный язык, это накладывает свой отпечаток и на систему модулей. Поэтому каждый модуль (в терминах языка — структура) имеет тип (сигнатуру). Сигнатура определяет часть структуры доступную извне. Именно так в Standard ML реализуется механизм абстракции данных. По аналогии с соответствиями сигнатура = тип и структура = значение, должно быть определено и какое-нибудь соответствие понятию функции. В самом деле, в Standard ML существует возможность определять функции над структурами. Такие функции называются функторами, по аналогии с термином из общей алгебры. Функторы позволяют преобразовывать структуры, соответствующие одной сигнатуре, в структуры, соответствующие другой, тем самым одновременно являя собой механизм реализующий наследование и параметрический полиморфизм на уровне целых модулей. Standard ML является одним из немногих функциональных языков с такой интересной системой модулей. В Haskell, например, реализована намного более простая система, сходная с системой модулей в языке Modula-2.Функции — это значенияв функциональных языках функции могут быть переданы другим функциям в качестве аргумента или возвращены в качестве результата. Функции, принимающие функциональные аргументы, называются функциями высших порядков или функционалами. Самый, пожалуй, известный функционал, это map. map применяет некоторуюфункцию ко всем элементам списка, формируя из результатов другой список. Например, определив функцию возведения целого числа в квадрат как:


square::Int ->Int


square n = n * n


мы можем воспользоваться этой функцией для возведения в квадрат всех элементов списка


l2 = mapsquare [1, 2, 3, 4] результатсписок[1,4,9,16]


Каждый тип имеет литералы, например, тип Boolean имеет литералы True и False, а тип Char имеет 256 литералов, представляющих ASCII символы. Функциональный тип также имеет свои литералы, которые являются ничем иным, как безымянными функциями. Функциональные литералы называются лямбда-абстракциями (это название появилось из лямбда-исчисления Чёрча) или просто лямбдами. Например, для получения списка кубов можно воспользоваться записью


l3 = map (\x -> x * x * x) [1, 2, 3, 4] результатсписок[1,8,27,64]


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


sum1. (Int, Int) ->Int


sum1 (n, m) = n + m


sum2. Int ->Int ->Int


sum2 n m = n + m


Вопреки первому впечатлению функция sum1 принимает всего один аргумент — пару чисел, и возвращает результат — их сумму. Функция sum2 (эквивалентная стандартному оператору (+)) — пример частично вычисляемой функции. Эта функция принимает в качестве аргумента число (типа Int) и возвращает функцию прибавляющую это число к своему аргументу. Зачем это нужно? Функция sum2 позволяет легко определять свои частные случаи. Например — функция инкремент, увеличивающая свой аргумент на 1 определяется как частный случай sum2 следующим образом:


inc. Int ->Int


inc = sum2 1


Функция map — тоже пример частично-вычисляемой функции. Эта функция принимает в качестве аргумента функцию и возвращает функцию принимающую список и возвращающую другой список. Это легко понять если взглянуть на пример:


sinsпринимаетсписокдействительныхчисел(типаDouble)


ивозвращаетсписокихсинусов


sins. [Double] -> [Double]


sins = mapsin


Чистота (отсутствие побочных эффектов)


В императивных языках функция в процессе своего выполнения может читать и модифицировать значения глобальных переменных и осуществлять ввод/вывод. Поэтому, если мы вызовем одну и ту же функцию дважды с одним и тем же аргументом, может случиться так, что мы получим два различных результата. Такая функция называется функцией с побочными эффектами. Описывать функции без побочных эффектов позволяет практически любой язык. Однако некоторые языки поощряют или даже требуют от функции побочных эффектов. Например, во многих объектно-ориентированных языках в функцию передается скрытый параметр (чаще он называется this или self), который функция неявно модифицирует.


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


Отложенные вычисления (Lazyevaluation)

В традиционных языках программирования (например, C++) вызов функции приводит к вычислению всех аргументов. Этот метод вызова функции называется вызов-по-значению (call-by-value). Если какой-либо аргумент не использовался в функции, то результат вычислений пропадает, следовательно, вычисления были произведены впустую. В каком-то смысле противоположностью вызова-по-значению является вызов-по-необходимости (call-by-need). В этом случае аргумент вычисляется, только если он нужен для вычисления результата. Предположим, что мы хотим определить оператор конъюнкции (логическое и). На C мы можем прибегнуть к следующему определению (намеренно не используя оператор&9amp;):


int and (int x, int y) < if (x) return y; else return 0; >


Мы не сможем пользоваться этим оператором также как предопределенным оператором, потому что даже если x == FALSE, y все равно будет вычислен перед вызовом функции, так что простой оператор


if (and (y != 0.0, 1.0 / y > 2.0)) printf («y = %g\n», y);


в случае если y окажется равным 0.0 произойдет деление на 0, а это совсем не то, что нам нужно.Если же мы определим подобную функцию на Haskell (который поддерживает отложенные вычисления), то все будет работать как должно:


возвращаетTrue,еслиобааргументаистинны


and. Bool -> Bool -> Bool


and x y = cond (x, y, False)


cond. Bool -> a -> a


cond True result _ = result


condFalse _ result = result


обратите внимание на функцию cond, которая представляет собой не что иное как аналог конструкции if-then-else в традиционных языках программирования. В языках, использующих вызов-по-значению определить такую функцию невозможно, т.к. вне зависимости от логического условия будут вычислены оба других аргумента, хотя в каждом случае вычислять нужно только один .Одним из самых полезных свойств отложенного вычисления является, пожалуй, возможность определения потенциально бесконечных структур данных, чаще всего — списков (lazylists). Например, Haskell позволяет очень просто определить список всех простых чисел.


возвращаетсписокделителейаргумента


divisors. Int -> [Int]


divisors n = [m | m <- [1. n], n `mod` m == 0]


предикат,возвращаетTrue,еслиаргументпростоечисло


числоявляетсяпростым,еслионоделитсятолькона1инасебя


isPrime. Int -> Bool


isPrime n = (divisors n) == [1, n]


возвращаетсписоквсехпростыхчисел,получаяегофильтрацией


множестванатуральныхчиселпредикатомisPrime


primes. [Int]


primes = filter isPrime [1..]


Разумеется, это далеко не самый быстрый способ вычисления простых чисел, однако один из самых простых. Если функциональный язык не поддерживает отложенные вычисления, то он называется строгим (strict). В самом деле, в таких языках порядок вычисления строго определен. В качестве примера строгих языков можно привести Scheme, Standard ML и Caml. Языки использующие отложенные вычисления называются нестрогими (non-strict или lazy). Haskell — нестрогий язык, так же как, например, Gofer и Miranda. Нестрогие языки зачастую являются чистыми. Зачастую строгие языки включают в себя средства поддержки некоторых полезных элементов, присущих нестрогим языкам, например, бесконечных списков. В поставке Standard ML присутствует специальный модуль для поддержки отложенных вычислений. А ObjectiveCaml помимо этого поддерживает дополнительное зарезервированное слово lazy и конструкцию для списков значений, вычисляемых по необходимости.


Языки функционального программирования

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


ѕ Lisp (Listprocessor). Считается первым функциональным языком программирования. Нетипизирован. Содержит массу императивных свойств, однако в общем поощряет именно функциональный стиль программирования. При вычислениях использует вызов по значению. Существует объектно-ориентированный диалект языка — CLOS.


ѕ ISWIM (If you See What I Mean). Функциональный язык-прототип. Разработан Ландиным в 60-х годах для демонстрации того каким может быть язык функционального программирования. Вместе с языком Ландин разработал и специальную виртуальную машину для исполнения программ на ISWIM-е. Эта виртуальная машина, основанная на вызове-по-значению, получила название SECD-машины. На синтаксисе языка ISWIM базируется синтаксис многих функциональных языков. На синтаксис ISWIM похож синтаксис ML, особенно Caml.


ѕ Scheme. Диалект, Lisp-а, предназначенный для научных исследований в области компьютерной науки. При разработке Scheme был сделан упор на элегантность и простоту языка. Благодаря этому язык получился намного меньше, чем CommonLisp.


ѕ ML (MetaLanguage). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями. ML преподается во многих западных университетах (в некоторых даже как первый язык программирования).


ѕ Standard ML. Один из первых типизированных языков функционального программирования. Содержит некоторые императивные свойства, такие как ссылки на изменяемые значения и поэтому не является чистым. При вычислениях использует вызов-по-значению. Очень интересная реализация модульности. Мощная полиморфная система типов. Последний стандарт языка — Standard ML-97, существует формальное математическое определения синтаксиса, статической и динамической семантик языка.


ѕ Caml Light и Objective Caml. Как и Standard ML принадлежит к семейству ML. ObjectiveCaml отличается от CamlLight в основном поддержкой классического объектно-ориентированного программирования. Также, как и Standard ML строгий, но имеет некоторую встроенную поддержку отложенных вычислений.


ѕ Miranda. Разработан Дэвидом Тернером, в качестве стандартного функционального языка, использовавшего отложенные вычисления. Имеет строгую полиморфную систему типов. Как и ML преподавается во многих университетах. Оказал большое влияние на разработчиков языка Haskell.


ѕ Haskell. Один из самых распространенных нестрогих языков. Имеет очень развитую систему типизации. Несколько хуже (на мой взгляд) разработана система модулей. Последний стандарт языка — Haskell 98.


ѕ Gofer (GOodFor Equational Reasoning). Упрощенный диалект Haskell. Предназначен для обучения функциональному программированию.


ѕ Clean. Специально предназначен для параллельного и распределенного программирования. По синтаксису напоминает Haskell. Чистый. Использует отложенные вычисления. С компилятором поставляется набор библиотек (I/O libraries), позволяющие программировать графический пользовательский интерфейс под Win32 или MacOS.


Заключение

В качестве заключения хотелось бы написать, что для примера чистого функционального языка можно привести Haskell. Однако большинство функциональных языков являются гибридными и содержат свойства как функциональных, так и императивных языков. Яркие примеры — языки Scala и Nemerle. В них органично сочетаются характеристики как объектно-ориентированных языков, так и функциональных. Реализована хвостовая рекурсия и её оптимизация, функция является полноправным объектом, то есть может быть сохранена в переменной, передана в качестве аргумента в другую функцию или возвращена из функции.

Также функциональные языки делят на строгие и нестрогие. К нестрогим языкам относят те, которые поддерживают отложенные вычисления (F#), то есть аргументы функции вычисляются только тогда, когда они действительно понадобятся при вычислении функции. Ярким примером нестрогого языка является Haskell. В качестве примера строгого языка можно привести Standard ML.

Некоторые функциональные языки реализованы поверх платформообразующих виртуальных машин (JVM,.NET), то есть приложения на этих языках могут работать в среде времени исполнения (JRE, CLR) и использовать встроенные классы. К ним относятся Scala, Clojure (JVM), F#, Nemerle, SML.NET (.NET).

Список используемой литературы

1. В.Э. Фигурнов. Изд. 6, М. «Инфра-М», 2001.

2. К.С. Ахметов. История возникновения функциональных языков 2000 год.

3. А.Е. Борзенко. «Компьютер-пресс», 1999.

4. В. Денисов. Чистые функции С-Пб, «Питер», 1998.

5. Н. Николь, Р. Альбрехт. М. «Эком», 1997.

6. В.В. Фаронов. ФП в нефункциональных языках

Кн.1, М. МВТУ, 1998.

7. А. Гончаров. Свойства функциональных языков

8. http://www.haskell.org — очень насыщенный сайт, посвященный функциональному программированию в общем и языку Haskell в частности. Содержит различные туториалы, список интерпретаторов и компиляторов, Haskell-а (в настоящий момент все интерпретаторы и компиляторы — freeware). Кроме того, имеется обширный список интересных ссылок на ресурсы по теории функционального программирования и другим языкам (Standard ML, Clean). Очень рекомендую.

ѕ http://cm.bell-labs.com/cm/cs/what/smlnj — Standard ML of New Jersey. Очень хороший компилятор. В бесплатный дистрибутив помимо компилятора входят утилиты MLYacc и MLLex и библиотека Standard ML BasisLibrary. Отдельно можно взять документацию по компилятору и библиотеке.

ѕ http://www.harlequin.com/products/ads/ml/ — HarlequinMLWorks, коммерческий компилятор Standard ML. Однако в некоммерческих целях можно бесплатно пользоваться версией с несколько ограниченными возможностями.

ѕ http://caml.inria.fr — институт INRIA. Домашний сайт команды разработчиков языков CamlLight и ObjectiveCaml. Можно бесплатно скачать дистрибутив ObjectiveCaml, содержащий интерпретатор, компиляторы байт-кода и машинного кода, Yacc и Lex для Caml, отладчик и профайлер, документацию, примеры. Качество компилированного кода у этого компилятора очень хорошее, по скорости опережает даже Standard ML ofNewJersey.

Размещено на Allbest.ru

Подобные документы

Характеристика языков программирования: краткая история, хронология. Основные виды языков программирования: ассемблер; бейсик. Создание и использование формул в Excel. Применение операторов в формулах. Использование функций в Excel. Сайт дома отдыха.

отчет по практике [139,1 K], добавлен 03.06.2011

Классификация языков программирования. Использование циклических конструкций и выполнение итерационных процессов. Алгоритмические структуры циклов языков C, C++, Java, C#. Особенности современных языков программирования высокого уровня и их применение.

курсовая работа [345,6 K], добавлен 13.11.2009

Сравнительный анализ наиболее распространенных языков, их классификация, описание достоинств и недостатков. Использование процедур, функции и подпрограмм в языках программирования высокого уровня. Разработка и реализация программы «Бортовой компьютер».

курсовая работа [329,8 K], добавлен 22.06.2014

Основные сведения о языках программирования и их состав. Программа для компьютера. Использование компилятора и операторы. Языки программирования высокого уровня. Концепции объектно-ориентированного программирования. Языки искусственного интеллекта.

презентация [6,3 M], добавлен 14.08.2013

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

презентация [873,4 K], добавлен 23.01.2013

Основные концепции языков программирования, механизмы типизации данных. Описание языков программирования и методов трансляции. Конечные автоматы и преобразователи. Общие методы синтаксического анализа. Формальные методы описания языкового перевода.

курс лекций [5,5 M], добавлен 04.12.2013

История развития и классификация высокоуровневых языков логического программирования. Определение понятий графического интерфейса, сетевых протоколов и моделей баз данных. Современные системы программирования компании Borland/Inprise и фирмы Microsoft.

курсовая работа [72,3 K], добавлен 11.07.2011

Эволюция языков программирования от низкого уровня до современности. Языки программирования второго поколения — ассемблер. Императивные, функциональные, логические и объектно-ориентированные языки. Машинная независимость. Парадигмы программирования.

презентация [353,5 K], добавлен 14.10.2013

Использование языков программирования, работающих на стороне клиента. Теговые языки логической разметки документов. Скриптовые языки программирования. Работоспособность клиентских технологий. Функциональные интерактивные сайты и сроки их разработки.

лабораторная работа [2,1 M], добавлен 27.04.2009

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

курсовая работа [400,6 K], добавлен 10.11.2016

Язык функционального программирования это:

Язык функционального программирования

Функциональное программирование объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий и методов символьной обработки данных. Сформулированная Джоном Мак-Карти (1958) концепция символьной обработки информации компьютером восходит к идеям Черча и других математиков, известным как лямбда-исчисление с конца 20-х годов XX века. Выбирая лямбда-исчисление как теоретическую модель, Мак-Карти предложил рассматривать функции как общее базовое понятие, к которому достаточно естественно могут быть сведены все другие понятия, возникающие при программировании. Существуют различия в понимании функции в математике и функции в программировании. вследствие чего нельзя отнести Си -подобные языки к функциональным, использующим менее строгое понятие. Функция в математике не может изменить вызывающее её окружение и запомнить результаты своей работы, а только предоставляет результат вычисления функции.

Программирование с использованием математического понятия функции вызывает некоторые трудности, поэтому функциональные языки, в той или иной степени предоставляют и императивные возможности, что ухудшает дизайн программы (например возможность безболезненных дальнейших изменений). Дополнительное отличие от императивных языков программирования заключается в декларативности описаний функций. Тексты программ на функциональных языках программирования описывают «как решить задачу», но не предписывают последовательность действий для решения. Первым спроектированным функциональным языком стал Лисп. Он был предложен Джоном Мак-Карти в качестве средства исследования границ применимости компьютеров, в частности, методом решения задач искусственного интеллекта. Лисп послужил эффективным инструментом экспериментальной поддержки теории программирования и развития сферы его применения. Вариант данного языка широко используется в системе автоматизированного проектирования AutoCAD и называется AutoLISP

В качестве основных свойств функциональных языков программирования обычно рассматриваются [кем? ] следующие:

Программы на функциональных языках обычно намного короче и проще, чем те же самые программы на императивных языках.
Пример (быстрая сортировка Хоара на абстрактном функциональном языке) :

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

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

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

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

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

Некоторые языки функционального программирования

Классификация функциональных языков

В качестве примера чистого функционального языка можно привести Haskell. Однако большинство функциональных языков являются гибридными и содержат свойства как функциональных, так и императивных языков. Яркие примеры — языки Scala и Nemerle. В них органично сочетаются характеристики как объектно-ориентированных языков, так и функциональных. Реализована хвостовая рекурсия и её оптимизация, функция является полноправным объектом, то есть может быть сохранена в переменной, передана в качестве аргумента в другую функцию или возвращена из функции.

Также функциональные языки делят на строгие и нестрогие. К нестрогим языкам относят те, которые поддерживают отложенные вычисления (F#), то есть аргументы функции вычисляются только тогда, когда они действительно понадобятся при вычислении функции. Ярким примером нестрогого языка является Haskell. В качестве примера строгого языка можно привести Standard ML .

Некоторые функциональные языки реализованы поверх платформообразующих виртуальных машин (JVM. NET), то есть приложения на этих языках могут работать в среде времени исполнения (JRE, CLR) и использовать встроенные классы. К ним относятся Scala, Clojure (JVM), F#, Nemerle, SML.NET (.NET).

Смотреть что такое «Язык функционального программирования» в других словарях:

язык прграммирования Лисп — Язык функционального программирования. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN Lisp … Справочник технического переводчика

Язык программирования Лисп — универсальный язык программирования высокого уровня. Язык Лисп: относится к декларативным языкам функционального типа; предназначен для обработки символьных данных, представленных в виде списков. Основой языка являются функции и рекурсивные… … Финансовый словарь

Alice (язык программирования) — У этого термина существуют и другие значения, см. Alice. Alice Семантика: функциональный Тип исполнения: компиляция в байткод для виртуальной машины Появился в: 2002 … Википедия

Scala (язык программирования) — У этого термина существуют и другие значения, см. Scala. Scala Класс языка: Мультипарадигмальный: функ … Википедия

Oz (язык программирования) — Oz Семантика: функциональный, процедурный, декларативный, объектно ориентированный, вычисления с ограничениями, Н модели, параллельные вычисления Тип исполнения: компилируемый Появился в: 1991 Автор(ы): Gert Smolka his students Релиз … Википедия

AWL (язык программирования) — AWL (Alternative Web Language) Класс языка: мультипарадигмальный: функциональный, процедурный, объектно ориентированный Тип исполнения: интерпретируемый Появился в: 2005 г. Типизация данных: динамическая … Википедия

Леда (язык программирования) — У этого термина существуют и другие значения, см. Леда (значения). Леда (Leda) мультипарадигмальный язык программирования, спроектированный Тимоти Баддом. Язык Leda исходно создавался с целью совмещения императивного программирования, объектно… … Википедия

Эрланг (язык программирования) — Erlang Файл:Erlang logo.png Семантика: мультипарадигмальный: конкурентное, функциональное программирование Появился в: 1987 г. Автор(ы): Типизация данных: строгая, динамическая Основные реализации: E … Википедия

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

История языка программирования Python — Python был задуман в 1980 х годах, а его создание началось в декабре 1989 года Гвидо ван Россумом в составе центра математики и информатики в Нидерландах. Язык Python был задуман как потомок языка программирования ABC, способный к обработке… … Википедия

  • Язык функционального программирования. Джесси Рассел. Эта книга будет изготовлена в соответствии с Вашим заказом по технологии Print-on-Demand. High Quality Content by WIKIPEDIA articles! Функциональное программирование объединяет разные… Подробнее Купить за 1125 руб
  • Создание облачных, мобильных и веб-приложений на языке F. Дэниел Мол. Книга рассказывает о ключевых аспектах создания облачных, мобильных и веб-решений на языке F в комбинации с различными технологиями для платформы. NET. На практических примерах… Подробнее Купить за 622 грн (только Украина)
  • Создание облачных, мобильных и веб-приложений на F#. Мол Д. Книга рассказывает о ключевых аспектах создания облачных, мобильных и веб-решений на языке F# в комбинации с различными технологиями для платформы. NET. На практических примерах… Подробнее Купить за 563 руб

Другие книги по запросу «Язык функционального программирования» >>

Классификация языков программирования

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

К функциональным языкам программирования относят

Рисунок 1. Классификация языков программирования. Автор24 — интернет-биржа студенческих работ

Процедурные языки

Процедурные языки являются языками высокого уровня, в которых используется метод разбиения программ на отдельные связанные между собой модули – подпрограммы (процедуры и функции). Компоненты языка состоят из последовательности операторов, которые используют библиотечные процедуры и функции. Первым процедурным языком был Fortran, затем появился Cobol, Algol, Pascal, C, Ada.

Языки программирования низкого уровня

Программирование на первых компьютерах происходило с помощью двоичных машинных кодов. Такое программирование довольно трудоемкое и тяжелое. Для упрощения процесса программирования разрабатывались языки программирования низкого уровня, которые позволяли задавать машинные команды в понятном для человека виде. Чтобы преобразовать их в двоичный код создавались специальные программы – трансляторы.

К языкам низкого уровня относится:

  • программирование в машинных кодах;
  • ассемблер;
  • макроассемблер.

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

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

Языки программирования высокого уровня

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

Недостаток некоторых языков высокого уровня состоит в большом размере программ по сравнению с программами на языках низкого уровня. В то же время текст программ на языке высокого уровня гораздо меньше, но в байтах код, написанный на ассемблере, будет более компактным. Поэтому языки высокого уровня преимущественно используют для создания программного обеспечения для компьютеров и вычислительных устройств с большим объемом памяти. Языки же низкого уровня используются для написания программ к устройств, для которых критичным является размер программы.

Языки высокого уровня делятся на универсальные и проблемно-ориентированные.

Наиболее распространенные универсальные языки C#, C++, Basic, Pascal (Delphi) используются для разработки Windows-приложений. Большой вклад в программирование на начальных этапах внесли языки Fortran, Cobol, Algol, C и др.

Языки программирования для разработки Интернет-приложений скорее относятся к универсальным языкам. К ним относятся современные версии C#, Basic, J#.

Проблемно-ориентированными языками, которые используются на Интернет-серверах и клиентских Интернет-приложениях, являются PHP, Perl, JavaScript, VBScript.

Объектно-ориентированные языки

Объектно-ориентированные языки стали дальнейшим уровнем развития процедурных языков, основной концепцией которых есть совокупность программных объектов. Написание программы на языке представляется в виде последовательности создания экземпляров объектов и использование их методов. К ним относятся из первых языков Simula и SmallTalk, далее C++, Java.

Декларативные языки программирования

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

Функциональные языки программирования

Функциональные языки являются языками искусственного интеллекта. Программа, написанная на функциональном языке, состоит из последовательности функций и выражений, которые необходимо вычислить. Основной структурой данных является связный список. Функциональное программирование принципиально отличается от процедурного. Основными функциональными языками являются Lisp, Miranda, Haskel.

Логические языки программирования

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

Языки сценариев (скрипты)

Языки относятся к объектно-ориентированным языкам, используются для написания программ, которые исполняются в определенной программной среде. Тексты программ, написанные на языке сценариев, можно включать в тело Html-документа. Первыми скриптами были Perl и Python, которые изначально были разработаны для операционной системы Unix, а уже в дальнейшем появились версии языков для операционных систем Windows и Macintosh. Для написания программ на языке сценариев необходимо знание процедур и функций системных библиотек.

Языки, ориентированные на данные

Языки ориентированы на работу с одним определенным типом данных. Например, APL работает с матрицами и векторами, Snobol обрабатывает строки, SETL выполняет операции над множествами.

Особое развитие получили языки для работы с базами данных:

Широкими возможностями обработки документов текстового процессора Microsoft Word, электронных таблиц MS Excel, баз данных MS Access и даже программ подготовки слайдовых презентаций MS PowerPoint обладает встроенный язык системы MS Office – Visual Basic for Application (VBA).

Существуют различные классификации языков программирования

Понятие языка программирования. Классификация языков программирования.

Существуют различные классификации языков программирования.

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

Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам, – языком низкого уровня.

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

Машинно–ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).

К языкам программирования высокого уровня относят Фортран (переводчик формул – был разработан в середине 50–х годов программистами фирмы IBM и в основном используется для программ, выполняющих естественно – научные и математические расчеты), Алгол, Кобол (коммерческий язык – используется, в первую очередь, для программирования экономических задач), Паскаль, Бейсик (был разработан профессорами Дармутского колледжа Джоном Кемени и Томасом Курцом.), Си (Деннис Ритч – 1972 году), Пролог (в основе языка лежит аппарат математической логики) и т.д.

Эти языки машинно–независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках.

Программу, написанную на языке программирования высокого уровня, ЭВМ не понимает, поскольку ей доступен только машинный язык. Поэтому для перевода программы с языка программирования на язык машинных кодов используют специальные программы – трансляторы.

Существует три вида транслятора: интерпретаторы (это транслятор, который производит пооператорную обработку и выполнение исходного кода программы), компиляторы (преобразует всю программу в модуль на машинном языке, после чего программа записывается в память компьютера и лишь потом исполняется) и ассемблеры (переводят программу, записанную на языке ассемблера, в программу на машинном языке).

Языки программирования также можно разделять на поколения:

– языки первого поколения: машинно–ориентированные с ручным управлением памяти на компьютерах первого поколения.

– языки второго поколения: с мнемоническим представлением команд, так называемые автокоды.

– языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль.

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

– языки программирования пятого поколения: языки декларативные, объектно–ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.

Языки программирования также можно классифицировать на процедурные и непроцедурные .

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

Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки. Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.

Непроцедурное (декларативное) программирование появилось в начале 70-х годов 20 века. К непроцедурному программированию относятся функциональные и логические языки.

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

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

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

Visual Basic — это последняя версия одного из популярных языков программирования. В настоящее время с помощью Visual Basic можно быстро создавать приложения, работающие в среде Windows для любой области компьютерных технологий: бизнес-приложения, мультимедиа, приложения типа клиент — сервер и приложения управления базами данных. Кроме того, Visual Basic является встроенным языком для приложений Microsoft Office. Многие разработчики приложений также используют Visual Basic в качестве внутреннего языка своих приложений.

Visual Basic представляет собой интегрированную среду разработки, которая содержит набор инструментов, облегчающих и ускоряющих процесс разработки приложений. Причем процесс разработки заключается не в написании программы (программного кода), а в проектировании приложения. Приложение формируется средствами графического редактирования (компоновки), что позволяет свести процесс создания программного кода к минимуму.

Как и во всех современных системах визуального проектирования, в Visual Basic применяется объектно-ориентированный подход к программированию. Любое приложение, написанное на Visual Basic, представляет собой совокупность объектов.

Объект — некая сущность, которая четко проявляет свое поведение и является представителем некоторого класса подобных себе объектов. Почти все, с чем производится работа в VB, является объектами. Например: Форма, Командная кнопка, Текстовое поле и т. д.

Каждый объект характеризуется:

Свойство — это имеющий имя атрибут объекта. Свойства определяют характеристики объекта (цвет, положение на экране, состояние объекта).

Методы — это действия или задачи, которые выполняет объект (то, что можно делать с объектами).

Классом объектов в объектно-ориентированных языках программирования называется общее описание таких объектов, для которых характерно наличие множества общих свойств и общих действий, которые способны выполнять эти объекты (например, класс Командная кнопка — общее описание кнопок в окнах приложений). Они должны иметь множество общих свойств и других характеристик (например событий, одинаковых для всех этих объектов: щелчок мышью).

Приложение, создаваемое в среде Visual Basic, называется проектом. Программный проект — это совокупность частей, составляющих будущее WINDOWS-приложение. Любой проект должен обязательно состоять из экранных форм (хотя бы одной) и программных модулей (хотя бы одного). Visual Basic хранит каждый проект в отдельном файле с расширением vbp.

Экранная форма — это графическое представление WINDOWS-приложения вместе с содержанием этого окна. Содержание включает в себя:

совокупность свойств этого окна с их значениями;

совокупность, объектов, находящихся в этом окне;

совокупность свойств этих объектов с их значениями.

В Visual Basic экранная форма хранится в отдельном файле с расширением frm.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *