一些简答题
请简述编译器、解释器、混合编译器的区别
编译器:读入以某种语言 (源语言) 编写的程序,输出等价的用另一种语言 (目标语言) 编写的程序,通常目标程序是可执行的。
解释器:直接利用用户提供的输入,执行源程序中指定的操作。不生成目标程序,而是根据源程序的语义直接运行。
混合编译器:Java语言的处理结合了编译和解释,Java源程序编译成字节码(bytecode)中间表示,然后在虚拟机上解释执行。
编译器前端和后端的主要区别
编译器前端主要负责语法检查、语义检查、和初步的代码⽣成,包括词法分析、语法分析和语义分析等。它通常与源语⾔紧密相关,但与⽬标机器⽆关。⽽后端主要负责代码优化和⽬标代码⽣成,它通常与源语⾔⽆关,但是与⽬标机器紧密相关。
请写出参数传递的几种机制并简述区别
请简述自底向上的语法分析中,移入-归约操作是如何工作的
请简述上下文无关文法和正则表达式的异同
上下文无关文法比正则表达式的能力更强,所有的正则表达式都可以使用文法描述,但有一些用文法描述的语言不能用正则表达式描述。直观的讲:有穷自动机不能无穷计数。
和文法相比,正则表达式更加简洁和易于理解
根据正则表达式自动构造的词法分析器的效率高于根据任意文法自动构造得到分析器
但没有严格的指导方针,哪些东西应该放到词法/语法规则中
正则最适合描述id、常量、关键字这样的语言构造的结构
文法最适合描述嵌套结构,如对称的括号、对应的
if-then-else
等,这些无法用正则描述
自顶向下语法分析技术和自底向上语法分析技术的异同及优缺点
⾃上⽽下解析从根(起始符号)开始构建解析树,尝试找到⼀条从根到叶⼦的路径与输⼊串匹配。常⻅算法有递归下降解析、LL 等。⾃下⽽上解析从输⼊串开始,逐步进⾏归约,直到归约到起始符号。常⻅算法有 LR 解析、SLR 解析、LALR 解析等。
自顶向下算法根据极为有限的信息预测(猜)产生式。能识别的文法有局限性:
需要改造文法消除左递归
改造后的文法不直观
生成的语法树不易理解和处理
自底向上,先看足够输入,再选择产生式。
综合属性、继承属性、S属性SDD、L属性SDD
抽象语法树(AST)的优势
为什么要把代码尽可能放在被调用者中
假设有N个地方调用函数f,放在被调用者中可避免生成多份冗余代码
调用代码序列
Last updated