人类怎么和计算机进行沟通的?为什么几行代码就可以指挥计算机去解决各种问题?这里就涉及到计算机组成原理、编译原理以及数据结构和算法了。程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。
1预处理
2编译
编译过程主要包括词法分析、语法分析、语义分析等操作。编译完成后生成一个.s文件,即汇编文件。
词法分析是使用一种叫做lex的程序实现词法扫描,它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(运算符、等号等),然后他们放到对应的表中。
语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。对于不同的语言,只是其语法规则不一样。
语法分析完成了对表达式语法层面的分析,但是它不了解这个语句是否真正有意义。有的语句在语法上是合法的,但是却是没有实际的意义,比如说两个指针的做乘法运算,这个时候就需要进行语义分析,但是编译器能分析的语义也只有静态语义。
3汇编
汇编对应生成的文件是目标文件,目标文件由机器码写成。
4链接
目标文件经过链接可以形成一个可执行文件。链接过程主要包括了符号决议和重定位。
有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。比如说inta=6,这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是6。
重新计算各个目标的地址过程叫做重定位,重定位分为以下两步:合并相同类型的节,然后链接器将运行时的内存地址赋给新的聚合节。这一步完成,程序中的每条指令和全局变量都有唯一的运行时内存地址了。链接器修改代码节和数据节中对于每个符号的引用,使得他们指向正确的运行时地址。
对这些如果感兴趣,可以在评论区留言,在这里就不展开详细描述了。