Jump to content

Lucid (язык программирования)

Ясный
Парадигма Поток данных
Разработано Эдвард А. Эшкрофт
Уильям В. Уэдж
Впервые появился 1976
Дисциплина набора текста Бестиповый
Основные реализации
Люцид, ЦЫГАНКА
Диалекты
Гранулярный Lucid, Индексный Lucid, Тензорный Lucid, Forensic Lucid, Lucx, JOOIPL
Под влиянием
ИСВИМ
Под влиянием
СИЗАЛЬ , PureData , Блеск

Lucid — это язык программирования потоков данных , предназначенный для экспериментов с моделями программирования, отличными от фон Неймана . Он был разработан Биллом Уоджем и Эдом Эшкрофтом и описан в книге 1985 года Lucid, the Dataflow Programming Language . [1]

pLucid был первым переводчиком Lucid.

Lucid использует модель вычисления данных, основанную на спросе. Каждое утверждение можно понимать как уравнение, определяющее сеть процессоров и линий связи между ними, по которым проходят данные. Каждая переменная представляет собой бесконечный поток значений, а каждая функция — это фильтр или преобразователь. Итерация моделируется с помощью «текущих» значений и оператора «fby» (читается как «за которым следует»), позволяющего компоновать потоки.

Lucid основан на алгебре историй, история представляет собой бесконечную последовательность элементов данных. С функциональной точки зрения историю можно рассматривать как запись изменяющихся значений переменной, а исторические операции, такие как first и next, можно понимать так, как это следует из их названий. Первоначально Lucid задумывался как дисциплинированный, математически чистый, однозадачный язык, в котором проверка будет упрощена. Однако интерпретация потока данных оказала важное влияние на направление развития Lucid. [1]

Подробности

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

В Lucid (и других языках потоков данных переменную, ) выражение, содержащее еще не связанную ожидает, пока переменная не будет привязана, прежде чем продолжить. Выражение вроде x + y будет ждать, пока x и y не будут связаны, прежде чем вернуться с выводом выражения. Важным следствием этого является то, что избегается явная логика обновления связанных значений, что приводит к существенному сокращению кода по сравнению с основными языками.

Каждая переменная в Lucid представляет собой поток значений. Выражение n = 1 fby n + 1 определяет поток с помощью оператора «fby» ( мнемоника «за которым следует»). fby определяет, что будет после предыдущего выражение. (В этом случае поток выдает 1,2,3,...). Значения в потоке могут быть адресованы этими операторами (при условии, что x — это используемая переменная):

'first x' - извлекает первое значение в потоке x,

'x' - текущее значение потока,

'next x' — извлекает следующее значение в потоке.

'asa' - оператор, который выполняет какое-либо действие «как только» заданное условие становится истинным.

'x upon p' - on — это оператор, который повторяет старое значение потока x и обновляет новые значения только тогда, когда поток p выполняет true доступная стоимость. (Служит для замедления потока x) то есть: x upon p — это поток x с новыми значениями, появляющимися при истинности p.

Вычисления выполняются путем определения фильтров или функций преобразования, которые действуют на эти изменяющиеся во времени потоки данных.

fac
  where
    n = 0 fby (n + 1);
    fac = 1 fby ( fac * (n + 1) );
  end

fib
  where
    fib = 0 fby ( 1 fby fib + next fib );
  end

Итого последовательности

[ редактировать ]
total
  where
     total = 0 fby total + x
  end;

Текущее среднее

[ редактировать ]
running_avg
  where 
     sum = first(input) fby sum + next(input);
     n = 1 fby n + 1;
     running_avg = sum / n;
  end;
prime
  where
     prime = 2 fby (n whenever isprime(n));
     n = 3 fby n+1;
     isprime(n) = not(divs) asa divs or prime*prime > N
                     where
                       N is current n;
                       divs = N mod prime eq 0;
                     end;
  end
qsort(a) = if eof(first a) then a else follow(qsort(b0),qsort(b1)) fi
  where
     p = first a < a;
     b0 = a whenever p;
     b1 = a whenever not p;
     follow(x,y) = if xdone then y upon xdone else x fi
                     where
                        xdone = iseod x fby xdone or iseod x; 
                     end
  end

Схема потока данных

[ редактировать ]
    --------> whenever -----> qsort ---------
   |             ^                           |
   |             |                           |
   |            not                          |
   |             ^                           |
   |---> first   |                           |
   |       |     |                           |
   |       V     |                           |
   |---> less ---                            |
   |             |                           |
   |             V                           V
---+--------> whenever -----> qsort -----> conc -------> ifthenelse ----->
   |                                                       ^   ^
   |                                                       |   |
    --------> next ----> first ------> iseod --------------    |
   |                                                           |
    -----------------------------------------------------------
sqroot(avg(square(a)))
  where
     square(x) = x*x;
     avg(y)    = mean
        where
          n = 1 fby n+1;
          mean = first y fby mean + d;
          d = (next y - mean)/(n+1);
        end;
     sqroot(z) = approx asa  err < 0.0001
        where
          Z is current z;
          approx = Z/2 fby (approx + Z/approx)/2;
          err    = abs(square(approx)-Z);
        end;
   end
h
   where
     h = 1 fby merge(merge(2 * h, 3 * h), 5 * h);
     merge(x,y) = if xx <= yy then xx else yy fi
        where 
          xx = x upon xx <= yy;
          yy = y upon yy <= xx;
        end;
   end;

Диаграмма потока данных

[ редактировать ]
Диаграмма потока данных задачи Хэмминга
Hamming problem dataflow diagram
  1. ^ Уодж, Уильям В.; Эшкрофт, Эдвард А. (1985). Lucid, язык программирования потоков данных . Академическая пресса. ISBN  0-12-729650-6 . Проверено 8 января 2015 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8c4884a72ffa1c9325eef6cccdc267ee__1677354960
URL1:https://arc.ask3.ru/arc/aa/8c/ee/8c4884a72ffa1c9325eef6cccdc267ee.html
Заголовок, (Title) документа по адресу, URL1:
Lucid (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)