Programming languages 像I'一样向我解释连接语言;我是一个8岁的孩子

Programming languages 像I'一样向我解释连接语言;我是一个8岁的孩子,programming-languages,concatenative-language,Programming Languages,Concatenative Language,我已经读过了,现在我比刚开始的时候更困惑了。:-) 用愚蠢的人的话来说,什么是连接式语言?你无法解释一种语言,只要找到一种(,最好是)并尝试一下就可以了。教程比StackOverflow答案更好。在普通编程语言中,可以自由定义变量,并使用这些变量作为参数调用方法。这些很容易理解,但有点有限。通常,重用现有方法很困难,因为您无法将现有变量映射到方法所需的参数中,或者方法A调用另一个方法B,如果您只能将对B的调用替换为对C的调用,那么A将非常适合您 连接语言使用固定的数据结构来保存值(通常是堆栈或列

我已经读过了,现在我比刚开始的时候更困惑了。:-)


用愚蠢的人的话来说,什么是连接式语言?

你无法解释一种语言,只要找到一种(,最好是)并尝试一下就可以了。教程比StackOverflow答案更好。

在普通编程语言中,可以自由定义变量,并使用这些变量作为参数调用方法。这些很容易理解,但有点有限。通常,重用现有方法很困难,因为您无法将现有变量映射到方法所需的参数中,或者方法A调用另一个方法B,如果您只能将对B的调用替换为对C的调用,那么A将非常适合您

连接语言使用固定的数据结构来保存值(通常是堆栈或列表)。没有变量。这意味着许多方法和函数具有相同的“API”:它们处理其他人留在堆栈上的东西。另外,代码本身被认为是“数据”,即,编写可以修改自身或接受其他代码作为“参数”(即堆栈上的元素)的代码是常见的

这些属性使这种语言非常适合链接现有代码以创建新的内容。重用是内置的。您可以编写一个函数,该函数接受一个列表和一段代码,并为列表中的每个项目调用代码。这将适用于任何类型的数据,只要其行为类似于列表:来自数据库的结果、来自图像的一行像素、字符串中的字符等

最大的问题是你不知道发生了什么。只有两种数据类型(列表、字符串、数字),所以所有内容都映射到了这些类型。当你得到一段数据时,你通常不在乎它是什么或者它来自哪里。但这使得我们很难通过代码跟踪数据来查看数据发生了什么

我相信成功地使用这些语言需要一定的心态。它们并不适合所有人

[编辑]福思有一些渗透力,但没有那么多。您可以在任何现代激光打印机中找到PostScript。所以它们是利基语言


从功能层面来看,它们与LISP、C类语言和SQL相符合:它们都是,所以你可以计算任何东西。这只是需要编写多少代码的问题。有些东西在LISP中更简单,有些在C中更简单,有些在查询语言中更简单。除非你有一个背景,否则“更好”的问题是徒劳的。

对于你的简单问题,这里有一个主观和有争议的答案

我看了这篇文章和几个相关的网页。网页上说他们自己没有真正的理论,所以难怪人们很难给出一个准确和可理解的定义。我想说的是,目前将语言分类为“连接”或“非连接”是没有用的

对我来说,这看起来像是一个让他有机会脱帽致敬的术语,但对其他程序员来说可能没什么用处

虽然后记和其他内容值得研究,但我在Manfred von Thun的Joy编程语言中并没有看到任何非常新颖或有趣的东西。事实上,如果你读了Chris Okasaki的文章,你就可以在一个相对于Joy来说完全是主流的环境中尝试所有这些东西

所以我的答案是,没有简单的解释,因为没有成熟的理论支持连接语言的概念。(正如爱因斯坦和费曼所说,如果你不能向一名大学新生解释你的想法,你就不会真正理解。)我会进一步说,尽管学习其中一些语言,如Forth和PostScript,是对时间的极好利用,试图弄清楚人们说“连接”时的确切含义这可能是在浪费你的时间。

在阅读和借鉴了我十几岁时对福思的一点记忆后,我相信串联编程的关键在于:

  • 根据特定数据堆栈上的值查看数据
  • 函数通过在同一数据堆栈上弹出/推送值来处理内容
请查看上述网页中的这些引用:

有两个术语会被抛出 环绕、堆栈语言和 连接语言。两者都定义了 相似但不相等的类别 语言。但在大多数情况下, 它们是相同的

今天大多数语言被广泛使用 是应用语言:中心语言 语言中的结构是某种形式 函数调用,其中函数是 应用于一组参数,其中 每个参数本身就是 一个函数调用,一个 变量或常量。成堆 语言,函数调用由 只需写下客户的名字 功能;参数是隐式的, 而且他们必须已经在网上了 调用时堆栈。这个 函数调用的结果(如果有) 然后在 函数返回下一个 功能消费,等等。 因为函数的调用很简单 不加任何修饰地提到他们的名字 附加语法、Forth和Factor 将函数称为“单词”,因为 在语法上,它们实际上只是 语言

这与将函数直接应用于特定变量的应用程序语言不同

示例:添加两个数字

应用语言:

连接语言(我自己编的,应该类似于Forth…;)


虽然我不认为级联语言=堆栈语言,正如作者在上面指出的那样,但它似乎类似。

我认为主要思想是1。我们只需将其他程序合并在一起,就可以创建新的程序

还有,2。程序的任何随机块都是有效的函数(或子程序)

好的旧的纯RPN Forth具有这些特性,不包括
int foo(int a, int b)
{
    return a + b;
}

var c = 4;
var d = 3;
var g = foo(c,d);
push 4
push 3
+
pop
( 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
a b c
(c a b)
(c (b a))
(c (b (a)))
( 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)))