Чистый (язык программирования) - Pure (programming language)
Парадигма | Функциональный , декларативный , переписывание терминов |
---|---|
Разработано | Альберт Греф |
Разработчик | Альберт Греф |
Впервые появился | 2008 |
Стабильный выпуск | 0,68 / 11 апреля 2018 г .
|
Печатная дисциплина | Сильный , динамичный |
Операционные системы | Кроссплатформенность : FreeBSD , Linux , macOS , Windows |
Лицензия | Стандартная общественная лицензия ограниченного применения GNU |
Интернет сайт | agraef |
Под влиянием | |
Q, Haskell , Lisp , Алиса , 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 и графического мультимедийного программного обеспечения Miller Puckette Pure Data , которые позволяют расширять эти программы функциями, написанными на языке Pure. Интерфейсы также предоставляются в виде библиотечных модулей для GNU Octave , OpenCV , OpenGL , научной библиотеки GNU , 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 по умолчанию использует активную оценку , он также поддерживает ленивые структуры данных, такие как потоки (ленивые списки ). Например, алгоритм Дэвида Тернера для вычисления потока простых чисел путем пробного деления может быть выражен в Pure:
primes = sieve (2..inf) with sieve (p:qs) = p : sieve [q | q = qs; q mod p] &; end;
Использование &
оператора поворачивает хвост решета в стук , чтобы задержать его вычисления. Преобразователь оценивается неявно, а затем запоминается (с использованием оценки вызова по необходимости ) при доступе к соответствующей части списка, например:
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 Audio Conference 2009 .
- Майкл Рипе. "Pure - eine einfache funktionale Sprache" . Heise .
- «Интервью с Альбертом Графом» . blueparen.