C编译器剖析_1.1_ 语言、文法与递归

1.1 语言、文法与递归

    我们对语言这个概念再熟悉不过了,汉语和英语等都是自然语言。而C语言和C++语言,这些是编程语言,更专业的术语,这些是形式语言, 老外称之为Formal  Language。Formal这个单词的原意是“正式的”,非常准确地表达了形式语言和自然语言的区别。C语言和C++这些语言之所以被称为形式语言,原因在于这些语言的产生过程是先有正式的语法结构,之后才由这些语法结构来产生语言。而汉语和英语则正好相反,原始人从树上刚走下来时,是不会先开会讨论一下语法结构的,最原始的呼喊经数万年的演化和交融,自然而然地形成了汉语和英语等自然语言。很多时侯,我们讲“自然而然地”,往往是因为我们对具体的形成过程也不太明了。数万年的语言发展,岂能那么一清二楚?若干年之后,广大语文老师们才聚在一起研究语法结构的问题。这种先上车后补票的行为,当然不够formal了。这也是为什么自然语言的识别,会成为人工智能领域的一个令人头大的问题;而C语言的识别从语言一诞生就能得到很好解决的原因之一。

    计算机相关学科的人会在大二时学一门叫《离散数学》的课程,里面一个很重要的概念就是集合,这个曾引起第三次数学危机的名词,是个放之四海皆适用的名词。我们要讨论的语言,实际上也是个集合。如何表达一个集合?一般而言,有这么两种方法:一个是列举法,一个是描述法。对于个数有限的集合,可以用列举法一一列出;而对于无穷的集合,则多用描述法来表达。例如,S = {张三、李四、王五} 构成了一个有限集合。而要表达偶数这样的无穷集合,我们则使用 E = {x | x = 2n, n是正整数} 这样的描述法。既然我们要把C语言看成一个集合,那么每个合法的C源代码就是这个集合里的一个元素,合法的C源代码有无穷多个,那我们要用什么样的描述方法来表达C语言这个无穷集合?让我们不妨先看看下面这个比C语言简单得多的语言。

    T = {a, a+a, a+a+a, ……}                      (1-1)

    我们不难发现,上述集合T是由若干个a相加构成,这是个无穷集合,省略号“……”的意思是“这个集合的元素太多了,我们列举不下,你自个儿研究已列出的元素,然后去找规律吧”。这种“你猜你猜你猜猜”的描述方法,显然不能让追求完美的我们感到满意。那我们就来探索一下有没有更好的表达方法。让我们先把集合T一分为二。

   T = {a,  a+a,         a+ a + a, ……}

     = {a}  U  {a+a,         a+a+a, ……}                                   

   我们仔细观察其中的{a+a,a+a+a,…..},越看越觉得这个式子跟T有点相似。如果把{a+a,a+a+a,…}里的每个元素的前缀“a+”移到大括号之外,我们就有

   T = {a}  U  a+ {a,a+a,a+a+a,……}

     = {a}  U  a+T                                     

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值