4

这可能是一个非常奇怪的问题,而且确实如此。我对如何用传统方法制作编程语言不太熟悉,所以我想知道,是否有可能设计一种无语法的编程语言?这意味着任何输入都是有效的并执行一定的计算,并且相同的输入总是会做同样的事情。不会出现语法错误(允许出现逻辑和运行时错误,程序可能会崩溃,进行随机计算等)。

我之所以想到这一点,是因为据我所知,遗传学基本上就是这样。

编辑:我认为有一些误解。无语法只是意味着所有输入都将计算,解释器/编译程序将遵循特定的指令集,无论它可能是随机的。

它还必须符合每个输入只有 1 个且只有 1 个输出的事实。有诸如语法错误之类的东西违反了该规则。

编辑 2 许多人对语法部分感到困惑。忘记语法,关注任何输入都会产生唯一输出的事实。

4

7 回答 7

8

有点儿。

语法是指输入的顺序,所以如果你有一种语言,它的意义不依赖于顺序,这样一个有意义的“句子”就可以不管输入的形式如何构造,那么是的,你可以有一种无语法的语言。这种语言必须以某种方式改变大小写,或者简单地为输入的每个可能的可分离项(标记、字符等)定义一个含义。你不能依赖这些项目的顺序,但你可以依赖它们的数量,所以就是这样。

总而言之,这将是相当深奥的,因为操作语义通常依赖于语法,而且对于大多数人来说,这种依赖并不是绝对必要的并不是很明显。这是一种非图灵完备的无语法语言:

  • 计算a字符。
  • 计算b字符。
  • 忽略其他一切。
  • 产生两个计数的商。

这是一个图灵完备的:

  • 计算a字符。
  • 计算b字符。
  • 忽略其他一切。
  • 采用字符数的二进制表示a
  • 前缀的数量等于b字符数的零。
  • 将结果评估为Jot程序。

再说一遍,兔子洞有多深?你输入的基本单位是什么?如果是字节或字符,那么您就有大量可能的输入标记可供使用。但是,如果您承认字符中的位存在基本顺序,那么您必须进一步减少问题,并且仅取决于 0 位和 1 位的数量,当然,这仍然绰绰有余从中构建有意义的程序的信息。以我的图灵完备示例为例,分别用“清除位”和“设置位”替换a和。b

当然,也有人认为 Lisp 在某种程度上是无语法的,因为它的语法是程序抽象结构的直接表示,更不用说整个程序即数据的事情了。实际上,Lisp 及其衍生产品并不是严格意义上的无语法,而是它们在语法和含义之间具有一一对应的关系。就像整数文字一样,Lisp 程序实际上只是一个很棒的大代码文字。

于 2011-05-08T04:30:59.373 回答
3

如果相同的输入总是做“同样的事情”,那么就有一些规则来管理如何使用输入。这些规则就是语法。没有语法,就没有结构。所以,不,不可能。

如果您想知道是否有可能创建一种没有语法错误的语言,那么可以确定...您所要做的就是让编译器(或解释器,或其他任何东西)为任何没有语法错误的输入发出一些固定的输出有一个更有用的结构。您可以输出 1、0 或“谢谢您的输入”。当然,您可以选择更具描述性的内容,例如“语法错误”。

我不认为计算机代码和遗传代码之间有确切的相似之处。然而,如果你认为将 DNA 翻译成蛋白质的过程就像编译一样,那么你必须记住,只有极少数的人类 DNA 真正编码蛋白质。我们的大部分 DNA 都是非编码的,并且可能充满了语法错误的遗传版本。

于 2011-05-08T04:28:54.537 回答
3

我认为反向波兰语会符合您的定义。至少在您到达输入流的末尾之前,如果您输入了随机的值字符串(所有相同类型)和二元运算符,则不会检测到错误。

于 2011-05-08T04:41:23.433 回答
3

您可以创建一种程序语言,在其中定义输入字符集(例如,[a-z0-9])并且该集中的每个字符串都是有效的程序。例如,采用这种语言(其中 ? 代表任何字符)。

a? : add one to register ? if ? is a numeral, nop otherwise
b? : subtract one to register ? is a numeral, nop otherwise
p? : print register ?

任何其他两个字符序列都是 nop。如果字符串末尾有多余的字符,则为 nop。

这符合您的要求。使其成为图灵完备并不难(j?意味着跳转到寄存器中保存的地址?s?意味着将寄存器 0 的内容存储在地址中?)。

但是,我不知道这与让 C 编译器生成在语法错误的情况下执行 nop 的可执行代码有什么不同。

于 2011-05-08T05:06:35.803 回答
2

语言完全取决于您如何解释它们。必须有一种语法,它可能非常复杂,但必须如此。就像你用英语做的问题一样,它有正确的语法语法,这就是我理解它的原因。如果我们可以制作这样一种编程语言,它可以检测自然语言并基于它们得出它们的命令,比如“嘿,你为什么不给我做个计算器”,然后计算机为你做一个计算器。没有语法意味着使用不那么严格的语法。例如,如果您说德语,我不会理解一个词,这意味着我无法检测到我应该解释和反应的语法,而是我有一些其他反应“这家伙在说什么”或“这是说德语的人?” 所以解释变得不同。语法不太可能意味着系统通过从环境和环境中学习而动态生成的语法。两者之间实际上需要有一个协议来传达它应该如何解释,这就是语法。

于 2011-05-08T04:33:19.887 回答
1

当引入无法计算的代码(突变、四肢缺失等)时,即使是遗传密码也会出错。

于 2011-05-08T04:24:14.493 回答
-1

不。 在某些时候,处理器必须知道如何处理你放在硬盘上的随机垃圾,无论这可能是任意的。即使它因系统而异,这仍然是语法。

于 2011-05-08T04:20:38.000 回答