Pure , преемник эквационального языка Q , представляет собой динамически типизированный функциональный язык программирования, основанный на переписывании терминов . Он имеет средства для пользовательского синтаксиса операторов , макросов , арифметики произвольной точности (числа с множественной точностью) и компиляции в собственный код через LLVM . Pure - это бесплатное программное обеспечение с открытым исходным кодом, распространяемое (в основном) под Стандартной общественной лицензией ограниченного применения GNU версии 3 или более поздней.
Парадигма | Функциональный , декларативный , переписывание терминов |
---|---|
Разработано | Альберт Греф |
Разработчик | Альберт Греф |
Впервые появился | 2008 |
Стабильный выпуск | 0,68 / 11 апреля 2018 г . |
Печатная дисциплина | Сильный , динамичный |
Операционные системы | Кроссплатформенность : FreeBSD , GNU / Linux , macOS , Windows |
Лицензия | Стандартная общественная лицензия ограниченного применения GNU |
Веб-сайт | agraef |
Под влиянием | |
Q, Haskell , Lisp , Алиса , MATLAB |
Pure поставляется с интерпретатором и отладчиком, обеспечивает автоматическое управление памятью, обладает мощными возможностями функционального и символьного программирования и интерфейсом с библиотеками на C (например, для числовых, низкоуровневых протоколов и других подобных задач). В то же время Pure - это небольшой язык, созданный с нуля; его интерпретатор невелик, а библиотечные модули написаны на Pure. Синтаксис Pure похож на синтаксис Miranda и Haskell , но это язык свободного формата, поэтому для обозначения структуры программы используются явные разделители (а не отступы внешних правил ).
Язык Pure является преемником эквационального языка программирования Q, ранее созданного тем же автором, Альбертом Графом из Университета Майнца , Германия. По сравнению с Q, он предлагает некоторые важные новые функции (такие как локальные функции с лексической областью видимости , эффективная поддержка векторов и матриц, а также встроенный интерфейс C), а программы работают намного быстрее, поскольку они точно вовремя компилируются в собственный код. на лету. В настоящее время Pure в основном нацелен на математические приложения и научные вычисления , но его интерактивная среда интерпретатора, интерфейс C и растущий набор дополнительных модулей делают его подходящим для множества других приложений, таких как искусственный интеллект , символьные вычисления и работа в реальном времени. обработка мультимедиа.
Плагины Pure доступны для электронной таблицы Gnumeric и графического мультимедийного программного обеспечения Miller Puckette Pure Data , которые позволяют расширять эти программы функциями, написанными на языке Pure. Интерфейсы также предоставляются в виде библиотечных модулей для GNU Octave , OpenCV , OpenGL , научной библиотеки GNU , FAUST , SuperCollider и liblo (для Open Sound Control (OSC)).
Примеры
Эти числа Фибоначчи (наивная версия):
fib 0 = 0;фиб 1 = 1;fib n = fib (n-2) + fib (n-1), если n> 1;
Лучшая ( хвостовая рекурсивная и линейная ) версия:
fib n = fibs (0,1) n с fibs (a, b) n = если n <= 0, то a else fibs (b, a + b) (n-1);конец;
Вычислите первые 20 чисел Фибоначчи:
карта fib (1..20);
Алгоритм для ˝n˝ Куинз задачи , которая использует список понимание для организации поиска с возвратами:
ферзей n = поиск n 1 [] с search nip = [reverse p], если i> n; = кошка [поиск n (i + 1) ((i, j): p) | j = 1..n; сейф (i, j) p]; safe (i, j) p = ~ any (check (i, j)) p; проверить (i1, j1) (i2, j2) = i1 == i2 || j1 == j2 || i1 + j1 == i2 + j2 || i1-j1 == i2-j2;конец;
Хотя Pure по умолчанию использует активную оценку , он также поддерживает ленивые структуры данных, такие как потоки (ленивые списки ). Например, алгоритм Дэвида Тернера [1] для вычисления потока простых чисел путем пробного деления может быть выражен в Pure:
простые числа = сито (2..inf) с решето (p: qs) = p: sieve [q | q = qs; q mod p] &;конец;
Использование &
оператора поворачивает хвост сита в стук , чтобы задержать его вычисления. Преобразователь оценивается неявно, а затем запоминается (с использованием оценки вызова по необходимости ) при доступе к соответствующей части списка, например:
простые числа !! (0..99); // дает первые 100 простых чисел
Pure имеет эффективную поддержку векторов и матриц (аналогично MATLAB и GNU Octave ), включая векторные и матричные представления. Например, алгоритм исключения Гаусса с частичным поворотом может быть реализован в Pure следующим образом:
gauss_elimination x :: matrix = p, xкогда n, m = dim x; p, _, x = foldl step (0..n-1,0, x) (0..m-1) end;шаг (p, i, x) j= если max_x == 0, то p, i, x иначе // обновленная перестановка строк и индекс: трансп i max_i p, i + 1, {// верхние строки матрицы остаются без изменений: х !! (0..i-1,0..m-1); // сводная строка, разделенная на элемент сводки: {x! (i, l) / x! (i, j) | l = 0..m-1}; // вычитаем подходящие кратные из сводной строки: {{x! (k, l) -x! (k, j) * x! (i, l) / x! (i, j) | k = i + 1..n-1; l = 0..m-1}}когда n, m = dim x; max_i, max_x = pivot i (col xj); x = если max_x> 0, поменять местами xi max_i else x;закончить с pivot ix = foldl max (0,0) [j, abs (x! j) | j = i .. # x-1]; max (i, x) (j, y) = если x,>конец;/ * Меняем местами строки i и j матрицы x. * /поменять местами xij = x !! (transp ij (0..n-1), 0..m-1), когда n, m = dim x end;/ * Применяем транспонирование к перестановке. * /transp ijp = [p! tr k | k = 0 .. # p-1]с tr k = if k == i then j else if k == j then i else k end;/* Пример: */пусть x = dmatrix {2,1, -1,8; -3, -1,2, -11; -2,1,2, -3};Икс; gauss_elimination x;
Как язык, основанный на переписывании терминов , Pure полностью поддерживает символьные вычисления с помощью выражений. Вот пример , показывающий использование местных переписывающих правил для расширения и фактор простых арифметических выражений:
expand = уменьшить с помощью (a + b) * c = a * c + b * c; а * (Ь + с) = а * Ь + а * с;конец;коэффициент = уменьшить с помощью а * с + б * с = (а + б) * с; а * б + а * с = а * (б + с);конец;развернуть ((a + b) * 2); // дает a * 2 + b * 2коэффициент (a * 2 + b * 2); // дает (a + b) * 2
Вызывать функции C из Pure очень просто. Например, следующее импортирует puts
функцию из библиотеки C и использует ее для печати строки "Hello, world!"
на терминале:
extern int put ( char * ); hello = помещает "Привет, мир!" ; привет ;
Смотрите также
- Функциональное программирование
- Функциональные языки
- Чистый (язык программирования)
Рекомендации
- Альберт Граф. «Обработка сигналов на чистом языке программирования». Linux Audio Conference 2009 .
- Майкл Рипе. "Pure - eine einfache funktionale Sprache" . Heise .
- «Интервью с Альбертом Графом» . blueparen.
Заметки
- ^ Тернер, Дэвид А. Руководство по языку SASL. Tech. представитель CS / 75/1. Департамент вычислительных наук Университета Сент-Эндрюс 1975 г.
Внешние ссылки
- Официальный веб-сайт
- Чистый язык и документация библиотеки
- Чистый краткий справочник
- Чистая грунтовка