【cs基础】编译原理+数据库+软工

参考编译面试问题
参考数据库面试问题


1.编译原理

1.1函数调用的过程

参考链接link
如下结构的代码,

int main(void)
{

d = fun(a, b, c);
cout<<d<<endl;

return 0;
}
1
2
3
4
5
6
7
8
调用fun()的过程大致如下:

main()========
1).参数拷贝(压栈),注意顺序是从右到左,即c-b-a;
2).保存d = fun(a, b, c)的下一条指令,即cout<<d<<endl(实际上是这条语句对应的汇编指令的起始位置);
3).跳转到fun()函数,注意,到目前为止,这些都是在main()中进行的;
fun()=====
4).移动堆栈(Stack)指针寄存器,指向堆栈顶部;栈底寄存器形成新的栈帧结构;
5).压栈(push)形成临时变量并执行相关操作;
6).return一个值;
7).出栈(pop);
8).恢复main函数的栈帧结构;
9).返回main函数;
main()========

1.2 编译过程

(1)词法分析
即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。所以当单词不符合构词规则时词法分析会报错。
读入一个一个的字符(输入),对这些字符进行扫描和分解,从而识别出一个个单词(输出)。

(1)语法分析
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.

在词法分析的基础上,将单词序列(输出)分解成各类语法短语。(赋值语句等语句)
语法分析依据语言的语法规则,确定整个输入串是否在语法上正确。
If else是否匹配,无论是LL(1)文法分析,自顶向下还是自底向上都是要按照给定的语法,判断词法分析的词语是不是满足语法要求(标识符定义是否正确,括号是否匹配,关键字是否正确,标识符,函数定义是否正确,使用的函数或者标识符是否定义等等)

(2)语义分析
审查源程序有无语义错误,为代码生成阶段收集类型信息(如类型转化,类型匹配,上下文相关性等)。
主要是类型相容检查,有以下几种:
各种条件表达式的类型是不是boolean型?
运算符的分量类型是否相容?
赋值语句的左右部的类型是否相容?
形参和实参的类型是否相容?
下标表达式的类型是否为所允许的类型?
函数说明中的函数类型和返回值的类型是否一致?
V[E]中的V是不是变量,而且是数组类型?
V.i中的V是不是变量,而且是记录类型?i是不是该记录的域名?
x+f(…)中的f是不是函数名?形参个数和实参个数是否一致?
每个使用性标识符是否都有声明?有无标识符的重复声明?
在语义分析同时产生中间代码,在这种模式下,语义分析的主要功能如下:
语义审查
在扫描声明部分时构造标识符的符号表
在扫描语句部分时产生中间代码

(3)中间代码生成
中间代码是一种结构简单,含义明确的记号系统。
将源程序生成一种内部表示形式,这种内部表示形式叫中间代码。(四元式就是一种中间代码形式)

(4)代码优化
对中间代码进行等价变换,以便生成更高效的目标代码

(5)目标代码生成
把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码,它的工作与硬件系统和指令含义有关.

1.3 编译原理中的0、1、2、3型文法及其关系。

文法的四种类型:
① 0型文法:没什么特别约束,对任一产生式α→β,都有α∈(VN∪VT)且至少含有一个非终结符, β∈(VN∪VT) 左边至少一个非终结符
【左边至少包含一个非终结符】
② 1型文法(上下文有关):右侧式子的长度大于左侧的,S→ε除外,将上下文中间的一个非终结符替换为终结符。
③ 2型文法(上下文无关语法):左边都是非终结符
④ 三型文法(正规文法):常用来描述程序设计语言中单词的结构。是二型文法的特例,每一个非终结符都推出非终结符+终结符,或者直接推出终结符。

1.4 中间代码优化的目的

在这里插入图片描述

1.5 解释性和编译型语言

编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。
解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。
1,、C/C++、Go 等都是编译型语言,而Java,C#等都是解释型语言。

2.数据库

2.1 范式

  • 1NF:
    表中无表
  • 2NF:1NF基础上,非主属性完全依赖于候选码,简单的说,所有非主属性只能由主属性的全体所决定(不存在非主属性对码的部分依赖)
  • 3NF:在2NF的基础上,不存在非主属性对码的传递函数依赖。
    (例子)学号->姓名学号->班级号 班级号->班级名
    拆成R1(学号,姓名,班级号)R2(班级号,班级名)
  • BCNF:不能存在主属性对码的部分和传递函数依赖 每一个主属性只能被其余的共同所决定 属性键不能传递依赖 (每一决定因素都包含候选码)
    (例 (S,J)→T,(S, T)一J,T一J (S.J)、(S,T)都是候选码,但t不是包含候选码的决定因素
    (S,J)->T T->J这里传递函数依赖

【补】主属性:包含于某一候选码的属性

2.2【触发器—TRIGGER】

【注意】一般insert delete update等对数据进行修改的操作才会触发触发器,select一类不会。
[例18] 定义一个BEFORE行级触发器,
为教师表Teacher定义完整性规则“教授的工资不得低于4000元,
如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/触发事件是插入或更新操作/
FOR EACH ROW /行级触发器/
AS BEGIN /定义触发动作体,是PL/SQL过程块/
IF (new.Job=‘教授’) AND (new.Sal < 4000) THEN
new.Sal :=4000;
END IF;
END;

2.3 【存储过程】利用存储过程来实现下面的应用:从账户1转指定数额的款项到账户2中。

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用: 1)可以用一个命令对象来调用存储过程。 2)可以供外部程序调用,比如:java程序。

CREATE OR REPLACE PROCEDURE
TRANSFER(inAccount INT,outAccount INT,amount FLOAT)
/定义存储过程TRANSFER,其参数为转入账户、转出账户、转账额度/
AS DECLARE /定义变量/
totalDepositOut Float;totalDepositIn Float;inAccountnum INT;
BEGIN /*检查转出账户的余额 /
SELECT Total INTO totalDepositOut FROM Accout
WHERE accountnum=outAccount;
IF totalDepositOut IS NULL THEN
/如果转出账户不存在或账户中没有存款/
ROLLBACK; /回滚事务/
RETURN;
END IF;
SELECT Accountnum INTO inAccountnum FROM Account
WHERE accountnum=inAccount;
IF inAccount IS NULL THEN /如果转入账户不存在/
ROLLBACK; /回滚事务/
RETURN;
ENDIF;
…COMMIT; /
提交转账事务 */
END;

优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差

2.4 在数据库中查询语句速度很慢,如何优化?

1.建索引 2.减少表之间的关联 3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面 4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 5.尽量用PreparedStatement来查询,不要用Statement

2.5 如何维护数据库的完整性和一致性?

尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

2.6 如何优化数据库,如何提高数据库的性能?

1)给数据库做索引,合理的索引能立即显著地提高数据库整个系统的性能。

2)在适当的情况下,尽可能的用存储过程而不是SQL查询。因为前者已经过了预编译,运行速度更快。

3)优化查询语句,通过高性能的查询语句提高数据库的性能。

19、说出一些数据库优化方面的经验?

用PreparedStatement 一般来说比Statement性能高。

有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

根据扫描的原理,第一条子查询语句要比第二条关联查询的效率高:

1)select e.name,e.salary where e.managerid=(select id from employee where name=‘zxx’);

2)select e.name,e.salary,m.name,m.salary from employees e,employees m where e.managerid = m.id and m.name=‘zxx’;

2.7 S锁&X锁

X锁(排他锁):所谓X锁,是事务T对数据A加上X锁时,只允许事务T读取和修改数据A
S锁(共享锁):所谓S锁,是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值