Jump to content

Чистый (язык программирования)

Чистый
Использование Pure с TeXmacs
Парадигма Функциональное , декларативное , переписывание терминов
Разработано Альберт Граф
Разработчик Альберт Граф
Впервые появился 2008 год ; 16 лет назад ( 2008 )
Стабильная версия
0,68 / 11 апреля 2018 г .; 6 лет назад ( 11.04.2018 )
Дисциплина набора текста сильный , динамичный
ТЫ Кроссплатформенность : FreeBSD , Linux , macOS , Windows.
Лицензия Меньшая стандартная общественная лицензия GNU
Веб-сайт аграф .github .что /pure-lang
Под влиянием
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;

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Тернер, Дэвид А. Руководство по языку SASL. Тех. представитель CS/75/1. Департамент вычислительных наук, Университет Сент-Эндрюс, 1975 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 49fe529102b018a727e630769ef0712b__1722663900
URL1:https://arc.ask3.ru/arc/aa/49/2b/49fe529102b018a727e630769ef0712b.html
Заголовок, (Title) документа по адресу, URL1:
Pure (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)