Чистый (язык программирования)
Редактор подал заявку на удаление этой статьи. Вы можете принять участие в обсуждении удаления , в ходе которого будет решено, сохранять его или нет . |
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
![]() | |
![]() Использование Pure с TeXmacs | |
Парадигма | Функциональное , декларативное , переписывание терминов |
---|---|
Разработано | Альберт Граф |
Разработчик | Альберт Граф |
Впервые появился | 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,x
when 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*2
factor (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 года
- Кроссплатформенное бесплатное программное обеспечение
- Кроссплатформенное программное обеспечение