有一道题目,问解释程序和编译程序的知识
其中答案A的描述是错误的(原因是正确描述只有C),
答案A为
“在解释方式下,对源程序不进行词法分析和语法分析,直接进行语义分析”
答案解释里面是这么解释的
在词法分析,语义分析,语法分析方面,编译方式和解释方式都一样
然后本人找了一下资料,发现没有说解释方式需要此词法语义语法分析的,只有一个语法分析(如下图)
所以是不是解释的方式并不进行词法语义分析,直接进行语法分析?
谢谢各位了
其中答案A的描述是错误的(原因是正确描述只有C),
答案A为
“在解释方式下,对源程序不进行词法分析和语法分析,直接进行语义分析”
答案解释里面是这么解释的
在词法分析,语义分析,语法分析方面,编译方式和解释方式都一样
然后本人找了一下资料,发现没有说解释方式需要此词法语义语法分析的,只有一个语法分析(如下图)
所以是不是解释的方式并不进行词法语义分析,直接进行语法分析?
谢谢各位了
解决方案
10
语法分析,不可能没有词法分析
但是语法分析和词法分析可以结合到一起,不加区分(假如词法很简单的话)
但是语法分析和词法分析可以结合到一起,不加区分(假如词法很简单的话)
10
语义分析会有的
代码生成,可能会有,也可能不会有
不生成代码的,(虚拟机)直接解释执行了,
大致就是调用内置函数(过程)执行,
简单的也可以直接处理,例如加减乘除这种数学计算。
生成代码的。虚拟机解释 生成的中间代码执行。
简单的语义分析 和解释执行可能就一步到位了
例如VB6 就可以将 程序生成 p-code 然后解释执行
但不是完全都是生成 p-code 执行的
代码生成,可能会有,也可能不会有
不生成代码的,(虚拟机)直接解释执行了,
大致就是调用内置函数(过程)执行,
简单的也可以直接处理,例如加减乘除这种数学计算。
生成代码的。虚拟机解释 生成的中间代码执行。
简单的语义分析 和解释执行可能就一步到位了
例如VB6 就可以将 程序生成 p-code 然后解释执行
但不是完全都是生成 p-code 执行的
10
语义分析 是词法,语法分析之后做的事情。
解释器,假如不做代码生成的话。
语义分析以后, 就开始执行 了。
象 a + b 这是个表达式,结果是二者之和 这是语义分析部分要做的
假如是生成 p 代码 a,b + 这两个操作数,一个运算符,都要用 p 代码表示出来
那就成了代码生成了
假如不做代码生成,那么就会调用内部函数,处理这个表达式求出结果来
语义分析,这一步得出 这个表达式是合法的,这个+ 号怎么样处理 a,b怎么样处理
复杂表达式怎么样处理
这就是语义分析了
假如是词法分析 就可以分解出 a,+ ,b 三个符号,判断他们能否是合法的标识符(以及符号)
语法分析 判断出表达式 a+b 能否合法的表达式 运算符是+,a ,b 是操作数
语义分析 a+b 这个表达式各个元素,对应的p代码的那些元素。
或对应内部那些 函数,过程 怎么样处理操作数
对于不带 代码生成的,下一步就是执行
对于带代码生成,下一步生成代码(p代码),执行代码(p代码)
解释器,假如不做代码生成的话。
语义分析以后, 就开始执行 了。
象 a + b 这是个表达式,结果是二者之和 这是语义分析部分要做的
假如是生成 p 代码 a,b + 这两个操作数,一个运算符,都要用 p 代码表示出来
那就成了代码生成了
假如不做代码生成,那么就会调用内部函数,处理这个表达式求出结果来
语义分析,这一步得出 这个表达式是合法的,这个+ 号怎么样处理 a,b怎么样处理
复杂表达式怎么样处理
这就是语义分析了
假如是词法分析 就可以分解出 a,+ ,b 三个符号,判断他们能否是合法的标识符(以及符号)
语法分析 判断出表达式 a+b 能否合法的表达式 运算符是+,a ,b 是操作数
语义分析 a+b 这个表达式各个元素,对应的p代码的那些元素。
或对应内部那些 函数,过程 怎么样处理操作数
对于不带 代码生成的,下一步就是执行
对于带代码生成,下一步生成代码(p代码),执行代码(p代码)
10
解释器一次处理,大约是这个样子:
读取程序代码–> 出错处理
|
v
词法分析–> 出错处理
|
v
语法分析 –> 出错处理
|
v
语义分析 –>出错处理
|
V
(代码生成)–>出错处理
|
V
执行–>出错处理
|
V
得出结果
读取程序代码–> 出错处理
|
v
词法分析–> 出错处理
|
v
语法分析 –> 出错处理
|
v
语义分析 –>出错处理
|
V
(代码生成)–>出错处理
|
V
执行–>出错处理
|
V
得出结果
10
解释程序也要翻译成中间码
5
可能需要,也可能不要
看怎么样实现这个解释器
加括号,表示可能不会有这一步
10
其实,java 是编译后,解释执行的
.net 上的语言(VB,C#,C++CLI)有两种执行方式
一种是编译成 中间语言,解释执行
一种是编译成中间语言,执行时编译为本地代码,然后执行
此前的语言
Basic 早期是解释执行的,微软后来QBasic,Qick Basic 变为也给他编译执行了,
他有两种执行方式,IDE内调试时,可以解释执行,
也可以脱离环境 编译为 exe 执行
Pacal 是编译执行的,但是也有人研制出解释执行的pascal
怎么执行,其实是和编译系统,或解释器的实现相关的。
和语言的关系,只是方便不方便处理成 编译,或解释执行而已。
方便的难度小,否则难度大,
但是都是可以,编译或解释执行的
很多系统,是编译和解释都有的
例如,MS 的VB6 虽然是编译执行为主,
但是 可能会编译成p-code 解释执行一部分代码。
MS VB 不是完全的编译执行的。
.net 上的语言(VB,C#,C++CLI)有两种执行方式
一种是编译成 中间语言,解释执行
一种是编译成中间语言,执行时编译为本地代码,然后执行
此前的语言
Basic 早期是解释执行的,微软后来QBasic,Qick Basic 变为也给他编译执行了,
他有两种执行方式,IDE内调试时,可以解释执行,
也可以脱离环境 编译为 exe 执行
Pacal 是编译执行的,但是也有人研制出解释执行的pascal
怎么执行,其实是和编译系统,或解释器的实现相关的。
和语言的关系,只是方便不方便处理成 编译,或解释执行而已。
方便的难度小,否则难度大,
但是都是可以,编译或解释执行的
很多系统,是编译和解释都有的
例如,MS 的VB6 虽然是编译执行为主,
但是 可能会编译成p-code 解释执行一部分代码。
MS VB 不是完全的编译执行的。
5
参考解释和编译执行C的开源项目。