Чистый (язык программирования)
Редактор подал заявку на удаление этой статьи. Вы можете принять участие в обсуждении удаления , в ходе которого будет решено, сохранять его или нет . |
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Парадигма | Функциональное , декларативное , переписывание терминов |
---|---|
Разработано | Альберт Граф |
Разработчик | Альберт Граф |
Впервые появился | 2008 год |
Стабильная версия | 0,68 / 11 апреля 2018 г |
Дисциплина набора текста | сильный , динамичный |
ТЫ | Кроссплатформенность : FreeBSD , Linux , macOS , Windows. |
Лицензия | Меньшая стандартная общественная лицензия GNU |
Веб-сайт | аграф |
Под влиянием | |
Q , Хаскелл , Лисп , Алиса , MATLAB |
Pure , преемник эквационального языка Q , представляет собой динамически типизированный функциональный язык программирования , основанный на переписывании терминов . Он имеет возможности для определяемого пользователем операторов синтаксиса , макросов , арифметики произвольной точности (числа с множественной точностью) и компиляции в собственный код через LLVM . Pure — это бесплатное программное обеспечение с открытым исходным кодом, распространяемое (в основном) по лицензии GNU Lesser General Public License версии 3 или более поздней.
Обзор
[ редактировать ]Pure поставляется с интерпретатором и отладчиком , обеспечивает автоматическое управление памятью , обладает мощными возможностями функционального и символьного программирования и взаимодействует с библиотеками на C (например, для числовых вычислений, протоколов низкого уровня и других подобных задач). В то же время Pure — небольшой язык, разработанный с нуля; его интерпретатор невелик, а модули библиотеки написаны на Pure. Синтаксис Pure напоминает синтаксис Miranda и Haskell , но это язык свободного формата и поэтому для обозначения структуры программы используются явные разделители (а не внешние отступы правил).
Язык Pure является преемником языка эквационального программирования Q, ранее созданного тем же автором Альбертом Грефом в Университете Майнца , Германия. По сравнению с Q, он предлагает некоторые важные новые функции (такие как локальные функции с лексической областью видимости , эффективную поддержку векторов и матриц, а также встроенный интерфейс C), а программы работают намного быстрее, поскольку они компилируются «точно в срок» в собственный код. на лету. В настоящее время Pure в основном ориентирован на математические приложения и научные вычисления , но его интерактивная среда интерпретатора, интерфейс C и растущий набор дополнительных модулей делают его пригодным для множества других применений, таких как искусственный интеллект , символьные вычисления и вычисления в реальном времени. мультимедийная обработка.
Pure плагины Доступны для электронных таблиц Gnumeric и графического мультимедийного программного обеспечения Pure Data от Miller Puckette , которые позволяют расширять эти программы функциями, написанными на языке Pure. Интерфейсы также предоставляются в виде библиотечных модулей для GNU Octave , OpenCV , OpenGL , GNU Scientific Library , FAUST , SuperCollider и liblo (для Open Sound Control (OSC)).
Примеры
[ редактировать ]Числа Фибоначчи (простая версия):
fib 0 = 0;fib 1 = 1;fib n = fib (n-2) + fib (n-1) if n>1;
Лучшая версия ( хвостовая рекурсия и линейное время ):
fib n = fibs (0,1) n with fibs (a,b) n = if n<=0 then a else fibs (b,a+b) (n-1);end;
Вычислите первые 20 чисел Фибоначчи:
map fib (1..20);
Алгоритм решения задачи n ферзей , который использует понимание списка для организации поиска с возвратом:
queens n = search n 1 [] with search n i p = [reverse p] if i>n; = cat [search n (i+1) ((i,j):p) | j = 1..n; safe (i,j) p]; safe (i,j) p = ~any (check (i,j)) p; check (i1,j1) (i2,j2) = i1==i2 || j1==j2 || i1+j1==i2+j2 || i1-j1==i2-j2;end;
Хотя Pure использует нетерпеливую оценку по умолчанию , он также поддерживает ленивые структуры данных, такие как потоки (ленивые списки ). Например, Дэвида Тернера алгоритм [1] для вычисления потока простых чисел методом пробного деления можно выразить в чистом виде:
primes = sieve (2..inf) with sieve (p:qs) = p : sieve [q | q = qs; q mod p] &;end;
Использование &
Оператор превращает хвост сита в кусок, чтобы задержать его вычисление. Thunk оценивается неявно, а затем запоминается (с использованием вызова по необходимости ), когда осуществляется доступ к соответствующей части списка, например:
primes!!(0..99); // yields the first 100 primes
Pure имеет эффективную поддержку векторов и матриц (аналогично поддержке MATLAB и GNU Octave ), включая понимание векторов и матриц. Например, алгоритм исключения Гаусса с частичным поворотом может быть реализован в Pure следующим образом:
gauss_elimination x::matrix = p,xwhen n,m = dim x; p,_,x = foldl step (0..n-1,0,x) (0..m-1) end;step (p,i,x) j= if max_x==0 then p,i,x else // updated row permutation and index: transp i max_i p, i+1, {// the top rows of the matrix remain unchanged: x!!(0..i-1,0..m-1); // the pivot row, divided by the pivot element: {x!(i,l)/x!(i,j) | l=0..m-1}; // subtract suitable multiples of the pivot row: {{x!(k,l)-x!(k,j)*x!(i,l)/x!(i,j) | k=i+1..n-1; l=0..m-1}}when n,m = dim x; max_i, max_x = pivot i (col x j); x = if max_x>0 then swap x i max_i else x;end with pivot i x = foldl max (0,0) [j,abs (x!j)|j=i..#x-1]; max (i,x) (j,y) = if x<y then j,y else i,x;end;/* Swap rows i and j of the matrix x. */swap x i j = x!!(transp i j (0..n-1),0..m-1) when n,m = dim x end;/* Apply a transposition to a permutation. */transp i j p = [p!tr k | k=0..#p-1]with tr k = if k==i then j else if k==j then i else k end;/* Example: */let x = dmatrix {2,1,-1,8; -3,-1,2,-11; -2,1,2,-3};x; gauss_elimination x;
Будучи языком, основанным на переписывании терминов , Pure полностью поддерживает символьные вычисления с помощью выражений. Вот пример, показывающий использование локальных правил перезаписи для расширения и факторизации простых арифметических выражений:
expand = reduce with (a+b)*c = a*c+b*c; a*(b+c) = a*b+a*c;end;factor = reduce with a*c+b*c = (a+b)*c; a*b+a*c = a*(b+c);end;expand ((a+b)*2); // yields a*2+b*2factor (a*2+b*2); // yields (a+b)*2
Вызов функций C из Pure очень прост. Например, для «Привет, мир!» программа , следующее импортирует puts
функцию из библиотеки C и использует ее для печати строки "Hello, world!"
на терминале:
extern int puts(char*);hello = puts "Hello, world!";hello;
См. также
[ редактировать ]Ссылки
[ редактировать ]- Альберт Греф. «Обработка сигналов на чистом языке программирования». Аудиоконференция Linux 2009 .
- Майкл Рипе. «Pure — простой функциональный язык». Архивировано 19 марта 2011 г. на Wayback Machine . Хейзе .
- «Интервью с Альбертом Грефом» . синийпарен.
Примечания
[ редактировать ]- ^ Тернер, Дэвид А. Руководство по языку SASL. Тех. представитель CS/75/1. Департамент вычислительных наук, Университет Сент-Эндрюс, 1975 г.
Внешние ссылки
[ редактировать ]- Официальный сайт
- Документация на чистом языке и библиотеках. Архивировано 5 июля 2014 г. на Wayback Machine.
- Чистый краткий справочник. Архивировано 5 августа 2013 г. на Wayback Machine.
- Чистый праймер
- Динамически типизированные языки программирования
- Функциональные языки
- Языки программирования с переписыванием терминов
- Языки программирования, созданные в 2008 году.
- Языки программирования высокого уровня
- программное обеспечение 2008 года
- Кроссплатформенное бесплатное программное обеспечение
- Кроссплатформенное программное обеспечение