小明学C++第三篇:编译原理

懒惰是人类第一生产力,抽象是计算机伟大的思想。我们都知道计算机只认识0和1,而且是按照冯诺依曼结构组织起来的。数据跟指令都存放在主存里,根据不同的指令周期来区分是数据还是指令。在早期的计算机,人类必须编写很长只有0和1的机器语言来跟计算机交流,但这是非常低效的,因为0和1只要稍不留神,就会写错,最后可能造成很大的程序错误。于是人们就发明了以助记符为标志的汇编语言,这个已经好多了,毕竟可以通过语句直接知道每条语句的意义,但是其实每一个助记符跟二进制串是有唯一的对应关系的,也就是说,用汇编写的代码还是很长很长,最后人们发明了高级语言C,才比较接近于人类的思维和语法特点。于是问题就来了,一边接近于人类自然语言的高级语言,另一边是接近于机器的01串,如何完成这个转换呢?下面我们就来讲讲编译器的那些事情。

背景

前面的一篇博客里面写到小明写了一个多边形面积计算的C++程序(一个.cpp文件),然后小明点击了编译器的编译按钮,就生成了一个.exe可执行文件(即二进制代码)。下面我们就以面积计算函数calculate的这条语句为例,说明编译器是如何将其转化成二进制代码的:

S=( (A.x-B.x)*(A.y-C.y) - (A.x-C.x)*(A.y-B.y) )/2;

算术表达式的形式定义

大家请注意形式二字,这是抽象的象征。

好吧,怎么定义算术表达式呢?

我们先来看看中文“我喜欢你”吧。
这四个字可以组成很多排列:我喜欢你、你喜欢我、我你喜欢、喜欢你我、我喜你欢…
上面的排列有些是有意义的,有些是没有意义的。

我们是怎么定义一个完整的句子(合法有意义)的?
我们可以用下列的结构来判断句子是否合法:

定语 主语 状语 谓语 定语 宾语

“我喜欢你”中,我是人称代词做主语,喜欢是一个动词做谓语,你是人称代词做宾语,整个句子符合定义,因此是一个合法的句子。
而“喜欢你我”中,喜欢是动词不能做主语,因此不是一个完整的句子。

伟大的乔姆斯基在研究了人类的语言以后,就从语言产生的角度去定义一门语言。
在他的理论中,它把语言分成四种,短语语言,上下文有关语言、上下文无关语言以及正则语言。而我们的C++语言是一种上下文无关语言。
至于具体他是怎么分的,我就不讲了,大家可以去找找有关形式语言的资料。

我们还是看看怎么定义这个算术表达式吧。
大家根据中文句子的定义可以去定义一下。
下面是我定义出来的算术表达式的结构:

这里写图片描述
上图包含四个式子。第一个式子是一个赋值表达式,由变量=表达式构成。
而表达式又由一些中间变量和终结符(+、-、*、/、(、)、number构成)。
上图叫做算术表达式的文法。
有了上面那个东西,就可以产生很多不同的算术表达式了。只有用上述表达式能够生成的式子才叫算术表达式,其它的都不是。
比如a=3+2*4可以经过下列步骤产生:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值