【问题标题】:Syntaxless programming language [closed]无语法编程语言 [关闭]
【发布时间】:2011-08-20 23:58:58
【问题描述】:

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

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

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

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

Edit 2 很多人都对语法部分束手无策。忘记语法,关注任何输入都会产生 UNIQUE 输出这一事实。

【问题讨论】:

  • Perl,当然! (我开玩笑,我开玩笑。)
  • 任何(和所有)机器码都有效吗?或者有些人会用“不计算”来吐回。请记住,运行时和逻辑错误不同于语法错误。
  • @ultimatebuster:谁会给出“不计算”错误?机器代码下面没有底层。好吧,除了 CPU 微码,但它会继续为任何输入做任何事情(甚至是奇怪的事情)。
  • 我知道你从哪里来,要求每个唯一输入都有唯一输出,但这太严格了:在一个完整的语言中,有无数种方法来计算给定的结果。不过,我不完全确定如何阐明真正的需求。
  • 人们对语法部分“束手无策”,因为这就是你问的问题!是的,有一些方法可以将输入映射到输出 s.t.每个输入都有一个唯一的输出,每个输出对应一个特定的输入。此类映射称为 bijective functions 或简称为 bijections。然而,该特征对于将某物称为“语言”既非必要也不充分。

标签: programming-languages computer-science theory genetics


【解决方案1】:

您可以创建一种程序语言,在其中定义输入字符集(例如,[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 的可执行代码有什么不同。

【讨论】:

    【解决方案2】:

    有点。

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

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

    • 计算a 个字符。
    • 统计b 个字符。
    • 忽略其他所有内容。
    • 产生两个计数的商。

    这是一个图灵完备的:

    • 计算a 个字符。
    • 计算b 个字符。
    • 忽略其他所有内容。
    • a 个字符计数的二进制表示。
    • 在其前面加上与 b 字符数相等的零个数。
    • 将结果评估为Jot 程序。

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

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

    【讨论】:

    • 我想你和我在想同样的事情。语法和顺序一样,每个可能的输入项都有含义。不同的订单/数量可能会做完全不同的事情,或者做些不同的事情。
    【解决方案3】:

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

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

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

    【讨论】:

    • 操作语义(给定输入的含义)与语法(输入的结构以表示它的作用)是分开的。但是为“语法错误”+1,因为那是“定义的输出”,它是否是错误完全取决于用户解释。作为编译器,当我遇到语法错误时,我可以生成“独角兽和雏菊”,那么程序是否仍然是错误的,或者只是调用独角兽和雏菊的程序?
    • 无语法编程语言可能是一个糟糕的词选择。更新以更好地描述它。
    • @Jon Purdy:你是对的——我改变了几个词来远离语义。
    • @ultimatebuster,我认为您仍然需要澄清。您添加的其他约束并没有真正改变太多,并且对您的问题没有帮助。 Rot13 为每个输入提供不同的输出并接受所有字符串,但您不会将其称为语言。同时,任何重要的语言都应该能够为多个输入产生相同的输出,例如“2+2”、“1+3”和“8/2”。
    • 是的,从一个新问题开始可能会有所帮助。我早上会这样做,因为我现在需要睡觉了。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • (好吧,现在我想起来了,我想可能是语法错误,如果输入的运算符太多,会消耗堆栈中的所有值。)
      • 有趣的解释。您可以通过使用一个惰性堆栈来解决空堆栈问题,例如,如果在空时弹出则为零。
      【解决方案6】:

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

      【讨论】:

      • mutations 仍然是一个输出。就计算机而言,这只是逻辑/运行时错误。
      • 如果遗传密码被严重破坏,DNA分子将无法自我克隆,或者无法产生寿命足够长的细胞以再次分裂,因此结果将是死亡有机汤。您可能认为 DNA 的每种组合都会产生一些输出,但这只是因为在您看到结果之前,无效的组合就会自行淘汰。生物学清除失败的 DNA 就像编译器清除语法错误一样有效(尽管生物学的诊断信息不太有用)。
      • 当然。在这种情况下,程序不会说语法错误,而是简单地遇到许多逻辑和运行时错误,然后失败,但无论如何都会尝试运行(没有语法错误)。
      【解决方案7】:

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

      【讨论】:

      • 您将语法与语义混淆了。语义是代码的含义,机器执行的操作。语法是代码的正式结构。不过,您可能会争辩说,简单地使用一串位是某种最小语法,而不是没有语法。
      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2011-03-05
      • 2014-12-26
      相关资源
      最近更新 更多