编译器算法岗
❶ 计算机专业毕业薪资高吗
计算机学员毕业后薪资多少,这是目前大部分人都比较感兴趣的问题,但是计算机是一个比较大的概念,需要具体看从事的是哪一个行业,目前计算机分为系统开发、软件开发、硬件开发、设计类等不同方向。
最后,大家在冬天也要注意一下饮食问题。比如说冬天应该吃更多的高蛋白食物,比如肉类和鸡蛋,可以让你变得更加温暖,而且肉类中的铁元素还可以增加人们的抗寒能力。不过需要注意的是,尽量不要吃肥肉,也不要吃太多的红肉,可以多吃一些鱼肉来代替。
此外,冬天还应该多吃一些黑色的食物来补肾,比如说黑豆、黑芝麻、黑米等等,这些食物适当的吃一些,不仅可以补肾,还可以增强血管弹性,保护身体健康。
词法/语法分析、程序分析与程序变换、代码生成、内存管理、虚拟机、函数式语言的实现与优化。。。每个话题都能出不止一本书。
用到的算法/数据结构多如牛毛:
各种树、图为主,其他如栈、队列、散列表、并查集。。。
贪心、回溯、动态规划、遗传算法、矩阵变换。。
在一个问题下很难回答好。。 先简单介绍一下和图相关的。
1. 和什么图打交道
CFG(Control Flow Graph)
控制流图是对程序中分支跳转关系的抽象,描述程序所有可能执行路径
节点是语句集合(basic block);
每个basic block有唯一入口和出口;
如果A到B有边,表示A执行完后可能执行B
PDG(Program Dependence Graph)
PDG在编译器中用得不多,常见于软件工程/安全相关的应用(程序切片、安全信息流等)
SSA(Single Static Assignment)
SSA简化了很多数据流分析问题。
其他图
DJ Graph, Loop Nesting Forest, Program Structure Tree等等。
可参考:IR for Program Analysis。下面主要介绍CFG
2. CFG初步处理
CFG构造
dominator树生成
在CFG中,如果A是B的dominator,则从程序入口执行到B的任意路径一定经过A
控制依赖分析
根据dominator和post-dominator分析依赖关系。数据依赖、控制依赖信息在自动并行化中尤其重要(如果循环的每次迭代都没有依赖,那么可以并行处理)
控制流图化简
在复杂度相同的情况下,CFG的规模影响算法的效果。如果一个CFG仅通过如下变换能化简为一个节点,则它是可化简的:
如果节点n有唯一的前驱,那么将其和其前驱合并为一个节点
如果节点存在到自身的边,那么将该边删除
构造SSA
SSA可以由CFG构造。
3. CFG与数据流分析
下面才进入主题。。
一般的文献介绍DFA(Data flow analysis),都会用几个基础的分析为例:Constant Propagation,Range propagation,Avaliable expressions,Reaching Definition。而Reaching Definition的一个应用,就是大家喜闻乐见的“跳转到定义处”(真要做到“智能”跳转并不简单)
这部分涉及东西较多,一些算法也和”图“并不直接相关,不再展开。
PS,很多DFA问题可以用graph reachability统一建模,强烈推荐此文:
Program analysis via graph reachability
❸ 如何更好的掌握编译器的设计与实现
1. 阅读相关书籍:编译原理、编译器设计、编译器实现等;
2. 自学相关编程语言:C、C++、Java等;
3. 实践:可以使用开源的编译器框架,例如ANTLR,搭建自己的编译器;
4. 了解编译器的各个组成部分,并学习它们的工作原理;
5. 阅读技术文章,了解编译器的设计和实现的最新进展;
6. 加入开源项目,编写和维护编译器;
7. 在论坛上交流,和更多的编译器开发者分享心得体会;
8. 参加学术会议,接触到最新的研究成果;
9. 尝试着自己设计一个编译器,用实践来加深理解。