C是属于编译型语言,Java是解释型语言,他们两个的共同点是都有词法分析,语法分析和语义分析的一个过程,然后C可以直接生成目标代码后执行程序,但是Java不能,Java是先通过解释器,然后边解释边执行,他不会生成目标代码,并且相比于C,他的执行效率要低一些,但是C有一个致命缺点,就是他的可移植性差,如果我从windows上写一个程序,他只能在Windows上跑,不能在Linux上运行,但是Java可以,他的灵活性要好,可移植性也高。
词法分析
词法分析,是将输入的文本分解成一个个有意义的基本单位,这些基本单位被成为词素(Token),词法分析器负责识别这些词素。
语法分析
语法分析,也称为句法分析,它是在词法分析的基础上,根据语言的语法规则,将词素组合成一个结构化的表示形式,他对句子中的结构进行分析,来确定其组成部分(如单词与短语)之前的关系,并识别出这些组成部分在句子中所扮演的角色。通过语法分析,可以构建出句子的结构树,这种结构树通常被称为句法树,它能够清晰的展示出句子中各个成分之间的层次关系。
语义分析
语义分析,是在语法分析的基础上,进一步检查和理解语法树的含义,确保程序的逻辑正确性。语法分析器会进行类型检查,符号表管理等操作。
- 动态语义分析
- 发生在程序运行时
- 也叫动态语义错误
- 陷入死循环、变量取零时做除数、引用数组元素下标越界等错误。
- 静态语义分析
- 编译时所发现的程序错误
- 分为语法错误和静态语义错误
- 语法错误包括:单词拼写错误,标点符号错误,表达式中缺少操作数,括号不匹配等有关语言结构上的错误
- 静态语义分析:运算符与运算对象类型不合法等错误
总结说明
词法分析将输入字符串分解成词素(如关键字(例:int,如果输入的是nit,则词法分析也可以检查出错误)、标识符、运算符等);语法分析根据语法规则将这些词素组合成结构化的语法树,(例:语言结构出错、if....end if 不匹配,缺少分号、括号不匹配、表达式缺失操作数等);而语义分析则进一步检查这个结构化的输入是否有意义,例如变量是否已声明、类型是否匹配等(例:运算符和运算类型不符合,取余时用浮点数等)。