【问题标题】:chomsky hierarchy and programming languages乔姆斯基层次结构和编程语言
【发布时间】:2011-02-25 03:34:54
【问题描述】:

我正在尝试学习 Chomsky Hierarchy 的一些与编程语言相关的方面,但我仍然需要阅读 Dragon Book。

我了解到大多数编程语言都可以解析为上下文无关语法 (CFG)。就计算能力而言,它等于下推非确定性自动机之一。我说的对吗?

如果是真的,那么 CFG 怎么可能拥有图灵完备的无限制文法 (UG)?我之所以问,是因为即使 CFG 描述了编程语言,它们实际上也用于描述图灵机,因此通过 UG。

我认为这是因为至少有两个不同级别的计算,第一个是 CFG 的解析,侧重于与语言的结构(表示?)相关的语法,而另一个侧重于语义(感觉,数据本身的解释?)与图灵完备的编程语言的能力有关。同样,这些假设是否正确?

【问题讨论】:

    标签: programming-languages context-free-grammar turing-machines formal-languages chomsky-hierarchy


    【解决方案1】:

    我了解到大多数编程语言都可以解析为上下文无关语法 (CFG)。就计算能力而言,它等于下推非确定自动机之一。我说的对吗?

    技术上是的。有用的是,没有。

    至少有两种有用的方式来思考这些问题:

    • 如果您正在考虑一组字符串,那么您就有了一种语言
    • 如果您正在考虑一种算法来确定字符串是否属于某种语言,那么您遇到了一个决策问题

    困难在于,虽然大多数编程语言都有一个可以用上下文无关文法轻松描述的底层结构(Tcl 是一个有趣的例外),很多用上下文无关文法描述的句子实际上并不是“使用该语言”,其中“使用该语言”是指“使用该语言的有效程序”。这些额外的句子通常被某种形式的静态语义所排除。例如,以下话语是 C 程序上下文无关文法中的一个句子,但它本身不在有效 C 程序集中:

    int f(void) { return n + 1; }
    

    这里的问题是n 不在范围内。 C 需要“使用前声明”,并且该属性不能使用上下文无关文法来表达。

    真正的编程语言的典型决策过程是编译器或解释器的前端的一部分,它至少有两个部分:一,解析器 ,在决策能力上等同于下推自动机;但是第二个进行了额外的检查,排除了许多无效的话语。如果这些检查需要任何类型的使用前定义属性,则无法通过下推自动机或上下文无关文法来完成。

    如果是真的,那么 CFG 怎么可能持有图灵完备的无限制文法 (UG)?

    CFG 不“持有”任何东西——它只是描述一种语言。

    ...即使编程语言由 CFG 描述,它们实际上也用于描述图灵机,因此通过 UG。

    您在这里跳过了一些重要的间接级别。

    我认为这是因为至少有两个不同级别的计算,第一个是 CFG 的解析,侧重于与语言的结构(表示?)相关的语法,而另一个侧重于语义(感觉,数据本身的解释?)与图灵完备的编程语言的能力有关。同样,这些假设是否正确?

    我觉得他们有点糊涂,但你走在正确的轨道上。一个关键问题是“语言编程语言有什么区别?”答案是编程语言具有计算解释。计算解释有很多种,但并不是所有的都是图灵完备的。 但神奇之处在于解释,而不是语法,因此 Chomsky 层次结构在这里并不是很相关。

    为了证明我的观点,举一个极端的例子:常规语言[1-9][0-9]*在以下解释下是图灵完备的:

    • SK-combinator 语言是图灵完备的。
    • SK 项目数不胜数。
    • 可以轻松地以唯一且确定的方式枚举它们。
    • 因此我们可以将每个正整数与一个 SK 程序相关联。
    • 如果我们以标准方式将一个数字序列解释为一个正整数,我们同样可以将相同的数字序列解释为一个 SK 程序,而且,any SK 程序可以表示使用有限的数字序列。

    因此整数文字的语言是图灵完备的。

    如果你的头现在不疼,应该会。

    【讨论】:

    • 仅供参考,您可以为 Tcl 做一个 BNF。它只是比大多数语言提供的信息少,因为通常的递归术语(ifwhile、一般的程序块)完全在语义级别定义。也就是说,它们是标准库函数,仅此而已。 (另一方面是,在 Tcl 程序中嵌入外来语法真的很容易,只要它们是括号平衡的。几乎所有东西都是……​​)
    • @Donal:是的,除非任何程序都可以动态地将任意新产生式添加到“语法”中。有一个解析器在实践中用处不大——你不能真正分析一个 Tcl 程序——而且 Tcl 没有太多的解析器。但是嵌入陌生感确实非常非常非常容易。
    • 非常感谢!这是我正在寻找的那种回应。不确定这一切都清楚,但它更清楚。我想我明白了,“神奇在于解释,而不是语法”。
    • “一个关键问题是“语言和编程语言之间有什么区别?”答案是编程语言具有计算解释。 ——这就是语言学家对语言的看法,但这是错误的。口语中的句子不只是生成解析树或数据结构。它们具有计算解释,否则它们不会对听众产生影响。这对于命令式显然是正确的。
    • Perl 没有 BNF,因为它被刻意设计成上下文相关的。实际上,编译器代码的某些部分(例如用于解释智能匹配运算符和“间接对象”表示法)试图猜测程序员想要什么。不幸的是,这并没有赋予语言更多的计算能力。它只是让它更难使用。
    【解决方案2】:

    这绝对不是真的。大多数编程语言都有可以用 CFG 或 BNG 描述的语法,但符合语法并不能保证程序合法。语法中涵盖了各种额外的条件,例如“变量必须在使用前声明”或“此表达式中的类型必须以合法的方式组合”,即是什么使语言非上下文无关。 (这有点像 XML,它有一个形式上可验证的定义,但通常还有解析器无法验证的额外约束。)

    【讨论】:

      【解决方案3】:

      非常好的语言示例,它的语法没有 CFG 是 C++。您似乎没有完全了解UG。通用语法是一个解释问题,被描述为包含图灵机代码和该图灵机接受的单词的单词语言。因此,您无需对语言本身(一组单词)进行编码,而是对其进行图灵机编码。现在到了重点——你可以拥有一种无限词的语言,但你不能拥有一种无限符号的词。这意味着,UG 也包含有限的单词,因此对图灵机的所有描述都是有限的。图灵机的描述(编程语言中的程序)因此具有有限数量的符号(语句),因此描述语言(编程语言语法语法)甚至可以是规则的。以Binary Combinatory Logic 为例。

      【讨论】:

        猜你喜欢
        • 2012-07-17
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多