编译原理和组成原理这一块,是我们比较头疼的。这一块接触的比较少,所以再理解起来的时候,就比较困难。但是所有的知识都是相联系的,万变不离其宗。
例如,学习组成原理的时候,我们联系我们以前的拆装机 ,学习编译原理的时候,我们联系我们学的java和.Net等编程语言等。
由于,计算机的硬件只能识别0和1,组成的机器指令程序,所以计算机编程语言由低级语言(机器语言、汇编语言)发展到了我们现在用的高级语言(java、.net、VB、C++等) 。
为什么我们说这一块的学习,要联系我们的java呢?
Java是一种编程语言,当我们编写好代码的时候,它是怎么跟计算机的硬件打交道的呢?我们在安装Java的时候,我们需要安装java虚拟机。它是一个想象中的机器,有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
导入java语言虚拟机后,java语言在不同平台上运行时,就不需要重新编译。因此跨平台性好。java编写的程序执行的过程是,只需要在java虚拟机上运行目标代码(字节码),就可以在多种平台上不加修改地运行,最后虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
这就相当于是,java的虚拟机就相当于是一个中间码,负责跟前台与后台进行沟通交流。例如:A同学会说汉语,B同学只会说英语。A与B要进行交流,那只能找一个既会英语又会汉语的翻译。
因此高级语言要想让计算机硬件识别,就需要经过转换。这里主要介绍一下编译性语言和解释性语言。
编译性语言:在程序执行之前就把源程序全部编译成二进制代码的可运行程序。
解释性语言:在程序运行期间把做好的源程序翻译一句,然后执行一句,直至结束!
区别:
编译型语言:执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran。
解释型语言:执行速度慢、效率低;依赖解释器、跨平台性好。如Java、Basic.
通俗的说,编译语言是在编译后可以直接运行,而解释语言的执行需要一个解释环境。
编译器的工作流程图如下:
编译原理各阶段介绍:
词法分析:逐个扫描源程序字符,识别出“单词”符号
语法分析:关注句子结构,如表达式、语句、程序
语义分析:各个语法成分的含义,关注句子的含义
中间代码生成:根据语义分析的输出生成中间代码。中间代码,尽管可以将源程序直接翻译成目标语言代码,但使用机器无关的中间表示形式具有两优点:
1.重置目标比较容易不同机器上的编译器可以在已有前端的基础上附加一个适合这个机器的后端来生成。
2.可以在中间表示上应用与机器无关的代码优化器
代码优化:生成的中间代码在时间上和空间上有较大的浪费。所以需要进行优化
目标代码生成:把中间代码转换成指令代码或汇编指令代码
编译出错处理:
1.静态错误:编译阶段发现的程序错误,分五语法错误和静态语义错误。
2.动态错误:发生在程序运行是,例如除数为零,引用数组元素下标错误等。
编译原理,听起来貌似很玄乎。但是我们前面既学习过Java、VB.Net,又接触过C语言和C++。所以解释性语言和编译性语言,都不陌生。接下来要学习的文法,其实就是对一种语言语法的结构的形式规则的一种描述。而对应到我们的编程中,就是我们之前VB.NET和VB中定义的语法规则。必须以下划线和字母开头。文法可以说就是检测这个用的。
软考基础知识—编译原理,码迷,mamicode.com