【编译原理】什么是上下文无关文法?

上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思。

例如:

...
a = 0;
...

这是一个赋值语句,无论此语句的前后是什么代码,此语句所代表的操作是确定的。即:

给变量a赋予值0

换句话说,CPU遇到什么语句就执行什么语句,不用管其他的。


编程语言为什么不用人类的语言(自然语言),而是用上下文无关的文法呢?
因为

  1. 便于设计编译器。
    试想一下,如果可以用自然语言写代码,那不就是实现了人工智能了吗?客观上技术目前无法实现。
  2. 便于代码开发维护。
    如果开发出来的代码像高考的语文阅读理解一样,每个人都有不同的理解,那么,到底哪个才是作者真正想要表达的?如果人类都确定不了含义,那计算机同样也确定不了,最终结果就是错误执行或无法执行。
  3. 汇编语言/机器语言是上下文无关的。CPU执行指令时,读到哪条执行哪条。如果CPU需要考虑上下文,来决定一个语句到底要做什么,那么CPU执行一条语句会比现在慢千倍万倍。考虑上下文的事情,完全可以用户在编程的时候用算法实现。既然机器语言是上下文无关的,那高级语言也基本上是上下文无关的,可能有某些个别语法为了方便使用,设计成了上下文相关的,比如脚本语言的弱类型。在便于使用的同时,增加了解析器的复杂度。

综上:编程语言基本上都采用上下文无关的原则设计语法。


附:
上下文无关文法—维基百科

posted @ 2022-05-22 11:22  撬动未来的支点  阅读(257)  评论(0编辑  收藏  举报