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

Lucid
ПарадигмаПоток данных
РазработаноЭдвард А. Эшкрофт
Уильям В. Уэдж
Впервые появился1976
Печатная дисциплинаБестиповый
Основной реализации
pLucid
Диалекты
GIPSY, Granular Lucid
Под влиянием
Я ПЛАВАЮ
Под влиянием
СИЗАЛ, PureData, Блеск

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

pLucid был первым устный переводчик для Lucid.

Модель

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

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

Подробности

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

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

'первый х' - выбирает первое значение в потоке x,

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

'следующий x' - выбирает следующее значение в потоке.

'как' - оператор, который что-то делает "сразу после" выполнения заданного условия.

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

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

Примеры

Факториал

fac, где n = 0 fby (n + 1); fac = 1 fby (fac * (n + 1)); конец

Последовательность Фибоначчи

fib, где fib = 0 fby (1 fby fib + next fib); конец

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

total, где total = 0 fby total + x end;

Среднее значение

running_avg, где сумма = первая (входная), f по сумме + следующая (входная); n = 1 по n + 1; running_avg = сумма / число; конец;

простые числа

prime where prime = 2 fby (n всякий раз, когда простой (n)); n = 3 по n + 2; isprime (n) = not (divs) asa divs или prime * prime> N, где N - текущий n; divs = N mod prime eq 0; конец; конец

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

Диаграмма потока данных последовательности простых чисел (Lucid) .png

Быстрая сортировка

qsort (a) = if eof (first a) then a else follow (qsort (b0), qsort (b1)) fi, где p = first a 

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

    --------> всякий раз, когда -----> qsort --------- | ^ | | | | | нет | | ^ | | ---> первая | | | | | | | V | | | ---> меньше --- | | | | | V V --- + --------> всякий раз, когда -----> qsort -----> conc -------> ifthenelse -----> | ^ ^ | | | --------> следующий ----> первый ------> iseod -------------- | | | -------------------------------------------------- ---------

Среднеквадратичное значение

sqroot (avg (square (a))), где square (x) = x * x; avg (y) = среднее, где n = 1 f на n + 1; среднее значение = первое y f, среднее значение + d; d = (следующий y - среднее) / (n + 1); конец; sqroot (z) = приблизительно asa err <0,0001, где Z - текущий z; приблизительно = Z / 2 fby (приблизительно + Z / приблизительно) / 2; err = abs (квадрат (приблизительно) -Z); конец; конец

Проблема Хэмминга

h, где h = 1 f путем слияния (слияние (2 * h, 3 * h), 5 * h); merge (x, y) = if xx <= yy then xx else yy fi, где xx = x при xx <= yy; yy = y при yy <= xx; конец; конец;

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

Диаграмма потока данных задачи Хэмминга

Рекомендации

  1. ^ Уэдж, Уильям У .; Эшкрофт, Эдвард А. (1985). Lucid, язык программирования потоков данных. Академическая пресса. ISBN  0-12-729650-6. Получено 8 января 2015.

внешняя ссылка