sketch
管理员
硬件科技协会编译器方向培养计划
序言:
为什么要学编译器设计
Java 程序员熟悉的 Hibernate 和 Spring,前者用到了编译技术做 HQL 的解析,后者对注解的支持和字节码动态生成也属于编译技术。所以,如果要深入理解和用好这类工具,甚至想写这种类型的工具,会需要编译技术。而PHP 程序员在写程序的时候,一般会用到模板引擎实现界面设计与代码的分离。模板引擎对模板进行编译,形成可执行的 PHP 代码。模板引擎可以很强大,支持条件分支、循环等语法。如果了解编译技术,会更容易掌握这些模板引擎,甚至写出更符合领域需求的模板引擎。除此之外需要用户自定义功能的软件,比如报表软件、工资管理软件等,都需要编译技术。如果你要参与编写一个基础设施类的软件,比如数据库软件、ETL 软件、大数据平台等,很多需要采用编译技术提供软件自带的语言功能,比如 SQL。这种功能无法由外部通用语言实现。而解析用户输入,防止代码注入,为前端工程师提供像 React 那样的 DSL,像TypeScript 那样把一门语言翻译成另一门语言,像 CMake 和 Maven 那样通过配置文件来灵活工作,以及运维工程师分析日志文件等等高级别的需求,都要用到编译技术。
除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要。现在一些大公司在招聘程序员时,有难度的面试题都是涉及底层机制的。因为理解了底层机制,才能有更深入思考问题,以及深层次解决问题的能力,而不是只能盲目地搜索答案,从表面解决问题。而学习编译原理能让你从前端的语法维度、代码优化的维度、与硬件结合的维度几个方面,加深对计算机技术的理解,提升自己的竞争力。
所以,无论你是前端工程师、后端工程师,还是运维工程师,不论你是初级工程师还是职场老手,编译技术都能给你帮助,甚至让你提升一个级别。
第一阶段:
学习数据结构,如:数组,链表、栈和队列,树,图等。
编译器需要处理大量的源代码,并在编译过程中生成中间代码或目标代码。因此,对于高效地存储和处理代码的数据结构的选择和设计至关重要。例如,词法分析器和语法分析器需要使用合适的数据结构来表示词法单元、语法树、符号表等。对于符号表的组织和管理,需要合适的数据结构(如哈希表、树等)来实现高效的符号查找和符号属性的管理。
熟练使用 C 语言,熟悉常见的算法(在leetcode等平台多练习),熟悉指针、内存布局等概念;理解程序的编译链接过程。
学习C++,熟悉面向对象编程,了解设计模式
学习Linux操作系统及内核,学习Linux系统编程,学习Linux网络编程
了解一些计算机组成原理,汇编的知识
学习Git培养版本管理以及协作工作的能力,学习GNU Make构建工具以及CMake为做项目打下基础。
学习正则表达式。
第二和三阶段:学习编译原理以及完成自己的简单编译器设计
学习词法分析是编译器的第一步,它将源代码分解成一系列的词法单元(Token)。
语法分析是编译器的第二步,它将词法单元序列转换为语法树或抽象语法树。
语义分析是编译器的第三步,它对语法树或抽象语法树进行语义检查,包括类型检查、作用域检查、语法糖展开等。
中间代码生成是编译器的第四步,它将源代码转换为中间表示形式,例如三地址码、虚拟机代码等。
代码优化是编译器的一步重要过程,它对中间代码进行优化,以提高目标代码的性能和效率。代码优化包括常量折叠、死代码删除、循环展开、寄存器分配等技术。
代码生成是编译器的最后一步,它将优化后的中间代码转换为目标代码,例如机器码、汇编语言等形式。代码生成过程通常涉及到指令选择、寄存器分配、指令调度等技术。了解代码生成的原理和技术可以帮助编译器能够生成高效、可执行的目标代码。
除了上述基本原理外,还有一些其他的编译器相关概念和技术,如符号表管理、错误处理、优化技术(如循环优化、内联展开等)、前端和后端优化、目标代码生成等。学习这些概念和技术可以帮助深入理解编译器的工作原理和实现方式,从而能够编写高效、优化的编译器。
学习编译原理推荐课程:
可以参考以下资料设计编译器:
书籍推荐:
第四阶段:深入学习
解析源码,深入了解自己使用的语言的编译器,阅读真实世界中编译器的源代码,跟踪它的执行过程,弄懂它的运行机制。
可以学习 Java 编译器(javac)、Java 的 JIT 编译器(Graal)、Python 编译器(CPython)、JavaScript 编译器(V8)、Julia 语言的编译器、Go 语言的编译器(gc),以及 MySQL 的编译器。
学习LLVM, LLVM 为 Swift、Rust、C++、C 等多种语言提供了优化和后端的支持。
这些编译器采用了各种不同的编译技术。这些编译器,有的是编译静态类型的语言,有
的是动态类型的语言;有的是即时编译(JIT),有的是提前编译(AOT);有高级语言,也有 DSL(SQL);解释执行的话,有的是用栈机(Stack Machine),有的是用寄存器机,等等。不同的语言特性,就导致了编译器采用的技术会存在各种差异,从而更加有利于开阔视野。
通过研究多种编译器,可以多次迭代对编译器的认知过程,并通过分析对比,发现这些编译器之间的异同点,探究其中的原因,激发出更多的思考,从而得到更全面的、更深入的认知
推荐课程:
比赛:
- 下载图片
- 复制图片
2025-03-25
浏览846
01
登录后评论
5
评论
分享