Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/98cae9ac6fb08a90fb46bfed8badfafa to your computer and use it in GitHub Desktop.
Save anonymous/98cae9ac6fb08a90fb46bfed8badfafa to your computer and use it in GitHub Desktop.
Основные свойства языков программирования

Основные свойства языков программирования


Основные свойства языков программирования



Стандартизация языков программирования
Языки и методы программирования
Основы функционального программирования/Вводная лекция















Функциональное программирование ставит своей целью придать каждой программе простое математическое толкование. Это толкование должно быть независимо от деталей исполнения и понятно людям, не имеющим научной степени в предметной области. Перед началом описания непосредственно функционального программирования следует обратиться к истории программирования вообще. В х годах появились первые цифровые компьютеры , которые программировались переключением различного рода тумблеров, проводков и кнопок. Число таких переключений достигало порядка нескольких сотен и росло с усложнением программ. Потому следующим шагом развития программирования стало создание всевозможных ассемблерных языков с простой мнемоникой. Но даже ассемблеры не могли стать тем инструментом, которым смогли бы пользоваться многие люди, поскольку мнемокоды всё ещё оставались слишком сложными, а всякий ассемблер был жёстко связан с архитектурой, на которой исполнялся. Шагом после ассемблера стали так называемые императивные языки высокого уровня: Бейсик , Паскаль , Си , Ада и прочие, включая объектно-ориентированные. Вызовы функций и процедур, даже рекурсивные , не избавляли такие языки от явной императивности. В парадигме функционального программирования краеугольный камень, — это функция. Математические функции выражают связь между исходными данными и итоговым продуктом некоторого процесса. Процесс вычисления также имеет вход и выход, поэтому функция — вполне подходящее и адекватное средство описания вычислений. Именно этот простой принцип положен в основу функциональной парадигмы и функционального стиля программирования. Функциональная программа представляет собой набор определений функций. Функции определяются через другие функции или рекурсивно через самих себя. При выполнении программы функции получают параметры, вычисляют и возвращают результат, при необходимости вычисляя значения других функций. На функциональном языке программист не должен описывать порядок вычислений. Нужно просто описать желаемый результат как систему функций. Функциональное программирование, как и логическое программирование , нашло большое применение в теории искуственного интеллекта и её приложениях. Поэтому здесь функциональное программирование рассматривается скрупулёзно и со всеми возможными подробностями. Далее в этой лекции описывается история функционального программирования, свойства функциональных языков, решаемые задачи и некоторые справочные сведения. Как известно, теоретические основы императивного программирования были заложены ещё в х годах Аланом Тьюрингом и Джоном фон Нейманом. Нужда в этом возникла из-за всё более возрастающей сложности программного обеспечения. Большинство этих моделей включали в себя поддержку таких мощных механизмов как абстракция данных и полиморфизм. Появляется множество типизированных функциональных языков: ML , Scheme , Hope , Miranda , Clean и многие другие. Вдобавок постоянно увеличивается число диалектов. В результате вышло так, что практически каждая группа, занимающаяся функциональным программированием, использовала собственный язык. Это препятствовало дальнейшему распространению этих языков и порождало многие более мелкие проблемы. Чтобы исправить положение, объединённая группа ведущих исследователей в области функционального программирования решила воссоздать достоинства различных языков в новом универсальном функциональном языке. Ныне действителен стандарт Haskell Большинство функциональных языков программирования реализуются как интерпретируемые , следуя традициям Лиспа примечание: Таковые удобны для быстрой отладки программ, исключая длительную фазу компиляции, укорачивая обычный цикл разработки. С другой стороны, интерпретаторы в сравнении с компиляторами обычно проигрывают по скорости выполнения. Это же характерно и для современных реализаций Лиспа, кроме того среда разработки Лиспа позволяет выполнять компиляцию отдельных частей программы без остановки программы вплоть до добавления методов и изменения определений классов. В этом курсе для описания примеров функционального программирования будет использован либо некий абстрактный функциональный язык, приближенный к математической нотации, либо Haskell, бесплатные компиляторы которого можно скачать с сайта haskell. Программы на функциональных языках обычно короче и проще, чем те же самые программы на императивных языках. Как видно на этом примере, функциональная формулировка алгоритма короче и яснее чем императивная, хоть последняя в данном случае и выигрывает в эффективности исполнения, сортируя массив "на месте", внутри себя, в то время как версия на Хаскеле создает новые списки в ходе работы. Кроме того, все операции с памятью выполняются автоматически. При создании какого-либо объекта под него автоматически выделяется память. Когда объект выполнит своё предназначение, он вскоре будет также автоматически уничтожен сборщиком мусора , который имеется в любом функциональном языке. Ещё одно средство, позволяющее сократить программу, — встроенный механизм сопоставления с образцом. С ним можно описывать функции как индуктивные определения. Механизм сопоставления с образцом будет расмотрен в дальнейших лекциях, однако здесь видно, что функциональные языки выходят на более абстрактный уровень, чем традиционые императивные языки здесь не рассматривается объектно-ориентированная парадигма и её расширения. Из современных языков программирования многие суть строго типизированные. Строгая типизация позволяет компилятору оптимизировать программы, использовать конкретные типы и контейнеры конкретных типов вместо шаблонных , вариантных типов, более громоздких в реализации. Читабельность программ повышается, если используются псевдонимы типов или сложные типы, собранные на основе простых, вместо базовых элементарных целых , строк и т. В примере с быстрой сортировкой Хоара видно, что есть ещё одно важное отличие между вариантом на Си и вариантом на Хаскеле: Последняя функция может сортировать и список целых чисел, и список чисел с плавающей точкой , и список строк. Можно описать какой-нибудь новый тип. Определив для этого типа операции сравнения, возможно без перекомпиляции использовать функцию quickSort и со списками значений этого нового типа. Это полезное свойство системы типов называется параметрическим или истинным полиморфизмом , и поддерживается большинством функциональных языков. Ещё одно проявление полиморфизма — перегрузка функций , позволяющая давать разным, но подобным функциям одинаковые имена. Типичный пример перегруженной операции — обычная операция сложения. Функции сложения для целых чисел и чисел с плавающей точкой различны, но для удобства они носят одно имя. Некоторые функциональные языки помимо параметрического полиморфизма поддерживают и перегрузку операций. А в функциональных языках полиморфная функция quickSort — это одна единственная функция. С другой стороны, функциональные языки в этом плане проигрывают по скорости выполнения. В некоторых языках, например в Аде, строгая типизация вынуждает программиста явно описывать тип всех значений и функций. Для избежания этого, в строго типизированные функциональные языки встроен механизм, позволяющий компилятору определять типы констант, выражений и функций из контекста, — механизм автоматического вывода типов. Известно несколько таких механизмов, однако большинство из них суть разновидности модели типизации Хиндли — Милнера , разработанной в начале х. Поэтому в большинстве случаев можно не указывать типы функций. Механизм модульности позволяет разделять программы на несколько сравнительно независимых частей модулей с чётко определёнными связями между ними. Поддержка модульности не есть свойство именно функциональных языков программирования, но поддерживается большинством таких языков. Существуют очень развитые модульные императивные языки. В функциональных языках, равно как и вообще в языках программирования и математике, функции могут быть переданы другим функциям в качестве аргумента или возвращены в качестве результата. Функции, принимающие функциональные аргументы, называются функциями высших порядков или функционалами. Самый, пожалуй, известный функционал — функция map. Она применяет некоторую функцию ко всем элементам списка, формируя из результатов заданной функции другой список. Например, определив функцию возведения целого числа в квадрат как:. Можно воспользоваться функцией map для возведения в квадрат всех элементов некоторого списка:. В императивных языках функция в процессе своего выполнения может читать и изменять значения глобальных переменных и осуществлять операции ввода-вывода. Поэтому, если вызвать одну и ту же функцию дважды с одним и тем же аргументом, может случиться так, что в качестве результата вычислятся два различных значения. Изменение функцией состояния программы иначе, чем через возвращение значения, называется побочным эффектом. Описывать функции без побочных эффектов позволяет практически любой язык. Однако некоторые языки поощряют или даже требуют от функции побочных эффектов. Например, во многих объектно-ориентированных языках в функцию-член класса передаётся скрытый параметр чаще он называется this или self , который эта функция неявно изменяет. В чистом функциональном программировании оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путём разбора и сбора существующих. О ненужных объектах позаботится встроенный в язык сборщик мусора. Благодаря этому в чистых функциональных языках все функции свободны от побочных эффектов. Однако это не мешает этим языкам имитировать некоторые полезные императивные свойства, такие как исключения и изменяемые массивы. Каковы же преимущества чистых функциональных языков? Помимо упрощения анализа программ есть ещё одно — параллелизм. Раз все функции для вычислений используют только свои параметры, мы можем вычислять независимые функции в произвольном порядке или параллельно, на результат вычислений это не повлияет. Причём параллелизм этот может быть организован не только на уровне компилятора языка, но и на уровне архитектуры. В нескольких научных лабораториях уже разработаны и используются экспериментальные компьютеры, основанные на подобных архитектурах. В качестве примера можно привести Lisp-машину. Этот метод вызова функции называется вызов по значению. Если какой-либо аргумент не использовался в функции, то результат вычислений пропадает, следовательно, вычисления были произведены впустую. В каком-то смысле противоположностью вызова по значению является вызов по необходимости. В этом случае аргумент вычисляется, только если он нужен для вычисления результата. Если функциональный язык не поддерживает отложенные вычисления, то он называется строгим. На самом деле, в таких языках порядок вычисления строго определён. В качестве примера строгих языков можно привести Scheme, Standard ML и Caml. Языки, использующие отложенные вычисления, называются нестрогими. Haskell — нестрогий язык, так же как, например, Gofer и Miranda. Нестрогие языки зачастую являются чистыми. Очень часто строгие языки включают в себя средства поддержки некоторых полезных возможностей, присущих нестрогим языкам, например бесконечных списков. В поставке Standard ML присутствует специальный модуль для поддержки отложенных вычислений. А Objective Caml помимо этого поддерживает дополнительное специальное слово lazy и конструкцию для списков значений, вычисляемых по необходимости. В качестве задач, традиционно рассматриваемых в курсах функционального программирования, можно выделить следующие:. Эта задача решается только на узком классе программ. Требуется построить математическое описание функции. Все эти задачи достаточно легко решаются средствами функционального программирования, но практически неразрешимы в императивных языках. В этом разделе приведено краткое описание некоторых языков функционального программирования очень немногих. Дополнительную информацию можно почерпнуть, просмотрев ресурсы, перечисленные в следующем разделе. Благодарю Сергиевского Георгия Максимовича, который в своё время обучил меня основам функционального программирования и помог с организацией этого курса лекций. Основы функционального программирования Вводная лекция Структуры данных и базисные операции: Навигация Персональные инструменты Вы не представились системе Обсуждение Вклад Создать учётную запись Войти. Пространства имён Учебник Обсуждение. Просмотры Читать Править История. Навигация Заглавная страница Каталог учебников Кулинарная книга Случайная статья. Участие Справка Форум Свежие правки Новые страницы Пожертвовать. На других языках Добавить ссылки. Эта страница последний раз была отредактирована 14 января в Текст доступен по лицензии Creative Commons Attribution-ShareAlike , в отдельных случаях могут действовать дополнительные условия. Политика конфиденциальности Описание Викиучебника Отказ от ответственности Разработчики Соглашение о cookie Мобильная версия.


Фабрика мебели эстель пермь каталог
Новый сандеро степвей технические характеристики
Клубника добрыня описание сорта фото
Bosch piccolo посудомойка skt 1022 инструкция
Напольная башенка bus
Аир целебные свойства
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment