编译器的具体作用:
一个源文件(.c)在编译器经过编译和链接两个大的过程而生成可执行文件(.exe),而编译又分为分为三个阶段:预处理(预编译)、编译、汇编,这是一个翻译的过程。而可执行文件生成在运行环境可以直接运行。
首先在Ubuntu上面安装gcc编译器:
查看gcc版本为5.0.4
创建一个hello.c文件
然后编写一个hello world的c文件:
然后将其编译为可执行文件:
在刚开始的时候遇到了这样的报错,多尝试几次即可
然后输入命令开始即可
至此,就在Linux系统中完成了最简单的文件反编译
什么是合并段表和合并符号表,sum.c是另一个源文件,里边的内容是Add函数的声明,它只有一个符号表(Add)
词法分析
词法分析是编译的第一步,主要任务是读入源程序的输入字符(将代码一个字符一个字符的读入),将其组成词素(一个字符序列),生成并输出一个词法单元序列。由于负责读取程序源码,它还有一些其他任务。如:过滤程序中的注释和空白(合并空格,删除换行符、制表符等);将编译器生成的错误消息与源程序的位置联系起来(给错误赋予行号)。具体如下图所示:
词法分析使用正则表达式来表示一个匹配模式,然后根据各个需要识别的词法单元的匹配模式来构造出代码。在这其中首先要构造出状态转换图,使得词法分析器在扫描输入串的过程中寻找和某个模式匹配的元素,然后根据一组状态转移图构造出一个词法分析器。
如果在状态0时看到“=”,那么直接从状态5返回信息,如果看到“<”表明进入状态1,然后继续往下扫描。如果没有看到“<”“=”“>”,表明此处没有relop的词素,该状态图不会使用。
这只是手工将正则表达式转成状态转移图,词法分析器生成工具Lex使用不确定的/确定的有穷自动机根据一组正则表达式集合构造出状态转移图。
词法分析器一般产生如下格式词法单元:
其中token-name表示词法分析过程中的抽象符号,类似于为该词法单元赋予唯一id,而attribute-value指向存储词法单元相关信息的符号表中的某一条。如前图的赋值语句,这条词法语句中的词素将会被映射成如下词法单元,用于下一阶段的语法分析。