Объясните мне конкатенационные языки, как будто мне 8 лет - PullRequest
26 голосов
/ 25 мая 2009

Я прочитал статью Википедии о конкатенативных языках , и теперь я в замешательстве, чем когда я начинал. : -)

Что такое язык конкатенации в терминах глупых людей?

Ответы [ 7 ]

18 голосов
/ 25 мая 2009

В обычных языках программирования у вас есть переменные, которые можно свободно определять, и вы вызываете методы, используя эти переменные в качестве аргументов. Это просто понять, но несколько ограничено. Часто трудно повторно использовать существующий метод, потому что вы просто не можете отобразить существующие переменные в параметры, необходимые для метода, или метод A вызывает другой метод B, и A подойдет вам, если вы сможете заменить вызов только B с вызовом на C.

Конкатенационный язык использует фиксированную структуру данных для сохранения значений (обычно это стек или список). Там нет переменных. Это означает, что многие методы и функции имеют один и тот же «API»: они работают над чем-то, что кто-то еще оставил в стеке. Плюс сам код считается «данными», т. Е. Обычно пишется код, который может изменять себя или который принимает другой код в качестве «параметра» (т. Е. Как элемент в стеке).

Эти атрибуты делают эти языки идеальными для объединения существующего кода в создание чего-то нового. Встроенное повторное использование. Вы можете написать функцию, которая принимает список и фрагмент кода и вызывает код для каждого элемента в списке. Теперь это будет работать с любыми типами данных, если они ведут себя как список: результаты из базы данных, ряд пикселей на изображении, символы в строке и т. Д.

Самая большая проблема в том, что у вас нет намека на то, что происходит. Существует только пара типов данных (список, строка, число), поэтому все сопоставляется с этим. Когда вы получаете часть данных, вам, как правило, все равно, что это и откуда. Но это затрудняет отслеживание данных через код, чтобы увидеть, что с ним происходит.

Я полагаю, что для успешного использования языков требуется определенный разум. Они не для всех.

[РЕДАКТИРОВАТЬ] Форт имеет некоторое проникновение, но не так много. Вы можете найти PostScript в любом современном лазерном принтере. Так что это нишевые языки.

На функциональном уровне они находятся на одном уровне с LISP, C-подобными языками и SQL: все они Turing Complete , так что вы можете вычислить что угодно. Это просто вопрос того, сколько кода вы должны написать. Некоторые вещи более просты в LISP, некоторые более просты в C, некоторые более просты в языках запросов. Вопрос «лучше» бесполезен, если у вас нет контекста.

14 голосов
/ 03 мая 2012

Сначала я собираюсь опровергнуть утверждение Нормана Рэмси об отсутствии теории.

Теория конкатенативных языков

Конкатенационный язык - это функциональный язык программирования, где операцией по умолчанию (что происходит, когда два термина находятся рядом) является составление функции вместо применения функции. Это так просто.

Так, например, в исчислении комбинаторов SKI (одном из простейших функциональных языков) два термина бок о бок эквивалентны применению первого термина ко второму. Например: S K K эквивалентно S(K)(K).

На языке конкатенации S K K будет эквивалентно S . K . K в Хаскеле.

Так в чем же дело

Чистый конкатенационный язык обладает интересным свойством, что порядок оценки терминов не имеет значения. На конкатенативном языке (S K) K совпадает с S (K K). Это не относится к исчислению SKI или любому другому функциональному языку программирования, основанному на функциональном приложении.

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

Теперь для реального мира

Семантика стековых языков, которые поддерживают функции более высокого порядка, может быть объяснена с помощью конкатенативного исчисления. Вы просто отображаете каждый термин (команда / выражение / подпрограмма) как функцию, которая принимает функцию в качестве входных данных и возвращает функцию в качестве выходных данных. Вся программа фактически является функцией преобразования одного стека.

Реальность такова, что вещи всегда искажаются в реальном мире (например, FORTH имеет глобальный словарь, PostScript делает странные вещи, где важен порядок оценки). Большинство практических языков программирования не совсем соответствуют теоретической модели.

Заключительные слова

Я не думаю, что обычный программист или 8-летний должен когда-либо беспокоиться о том, что такое язык конкатенации. Я также не нахожу это особенно полезным для языков программирования голубиного типа, как типа X или Y.

5 голосов
/ 28 мая 2009

Прочитав http://concatenative.org/wiki/view/Concatenative%20language и опираясь на то, что я мало помню о том, как возился с Фортом в подростковом возрасте, я считаю, что ключевая вещь в конкатенативном программировании связана с:

  • просмотр данных в терминах значений в конкретном стеке данных
  • и функции, управляющие вещами в терминах выталкивания / выталкивания значений в один и тот же стек данных

Проверьте эти цитаты с вышеуказанной веб-страницы:

Есть два термина, которые выбрасываются вокруг, составлять язык и конкатенационный язык. Оба определяют похожие, но не равные классы языки. По большей части, хотя, они идентичны.

Большинство языков широко используются сегодня Прикладные языки: центральный построить в языке некоторую форму вызова функции, где функция применяется к набору параметров, где каждый параметр сам является результатом вызов функции, имя переменная или константа. В стеке языки, вызов функции производится просто писать имя функция; параметры неявные, и они уже должны быть на стек, когда вызов сделан. результат вызова функции (если есть) затем остается в стеке после функция возвращает, для следующего функция потреблять и так далее. Потому что функции вызываются просто упомянув их имя без каких-либо дополнительный синтаксис, Forth и Factor относиться к функциям как «слова», потому что в синтаксисе они действительно просто слова.

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

Пример: добавление двух чисел.

Аппликативный язык :

int foo(int a, int b)
{
    return a + b;
}

var c = 4;
var d = 3;
var g = foo(c,d);

Язык сочленения (я придумал, должен быть похож на Forth ...;))

push 4
push 3
+
pop

Хотя я не думаю, что конкатенативный язык = язык стека, как указывают авторы выше, он кажется похожим.

4 голосов
/ 22 февраля 2012

Я считаю, что основная идея: 1. Мы можем создавать новые программы, просто объединяя другие программы.

Кроме того, 2. Любой случайный фрагмент программы является допустимой функцией (или подпрограммой).

У старого доброго чистого RPN Forth есть те свойства, исключая любой случайный не RPN-синтаксис.

В программе 1 2 + 3 * подпрограмма + 3 * принимает 2 аргумента и дает 1 результат. Подпрограмма 2 принимает 0 аргументов и возвращает 1 результат. Любой кусок - это функция, и это хорошо!

Вы можете создавать новые функции, смешивая две или более других вместе, при желании с небольшим количеством клея. Это будет работать лучше всего, если типы совпадают!

Эти идеи действительно хороши, мы ценим простоту.

Он не ограничен ни последовательным языком в стиле RPN Forth, ни императивным или функциональным программированием. Эти две идеи также работают для графического языка, где программными единицами могут быть, например, функции, процедуры, отношения или процессы.

В сети взаимодействующих процессов каждая подсеть может действовать как процесс.

В графе математических отношений каждый подграф является действительным отношением.

Эти структуры являются «конкатенативными», мы можем разбить их любым способом (нарисовать круги) и соединить их разными способами (нарисовать линии).

Ну, вот как я это вижу. Я уверен, что пропустил много других хороших идей из конкатенационного лагеря. Хотя я увлекаюсь графическим программированием, я новичок в этом сосредоточении на конкатенации.

1 голос
/ 20 декабря 2014

Мое прагматическое (и субъективное) определение для конкатенативного программирования (теперь вы можете избежать прочтения всего остального):

-> экстремальная компоновка функций (с синтаксисом RPN):

( Forth code )
: fib
  dup 2 <= if
    drop 1
  else
    dup 1 - recurse
    swap 2 - recurse +
  then ;

-> все является функцией или, по крайней мере, может быть функцией:

( Forth code )
: 1 1 ; \ define a function 1 to push the literal number 1 on stack

-> аргументы неявно передаются через функции (хорошо, похоже, это определение для неявного программирования), но это в Forth:

a b c

может быть в Лиспе:

(c a b)
(c (b a))
(c (b (a)))

итак, легко генерировать неоднозначный код ... Вы можете написать определения, которые помещают xt (токен выполнения) в стек и задают небольшой псевдоним для «execute»:

( Forth code )
: <- execute ; \ apply function

итак, вы получите:

a b c <- \ Lisp: (c a b)
a b <- c <- \ Lisp: (c (b a))
a <- b <- c <- \ Lisp: (c (b (a)))
0 голосов
/ 28 мая 2009

На ваш простой вопрос вот субъективный и аргументированный ответ.

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

Для меня это выглядит как термин, который дает Манфреду фон Туну место, где можно повесить шляпу, но он может оказаться бесполезным для других программистов.

Хотя PostScript и Forth заслуживают изучения, я не вижу ничего страшного нового или интересного в языке программирования Маня Фреда фон Туна. В самом деле, если вы читаете статью Криса Окасаки о Методы для встраивания языков Postfix в Haskell , вы можете попробовать все это в обстановке, которая, по сравнению с Джой, полностью распространена. *

Итак, мой ответ: простого объяснения нет , потому что в основе идеи конкатенативного языка нет зрелой теории. (Как сказали Эйнштейн и Фейнман, если вы не можете объяснить свою идею первокурснику из колледжа, вы на самом деле не понимаете ее.) Я пойду дальше и скажу, что изучение некоторых из этих языков, таких как Forth и PostScript, является превосходное использование времени, попытка понять, что именно люди имеют в виду, когда говорят «конкатенация», вероятно, пустая трата вашего времени.

0 голосов
/ 25 мая 2009

Вы не можете объяснить язык, просто возьмите один ( Коэффициент , предпочтительно) и попробуйте некоторые учебные пособия . Уроки лучше, чем ответы на переполнение стека.

...