概述
读一段程序和读一篇文章的处理是有相似之处的
首先需要能够认出一个个字符(字,单词或者标点)
然后理解文章的结构(段落,句子,句子内部主谓宾等结构)
最后再结合一些前置的知识和上下文,推导、理解每一句的含义,最后理解整个文章的含义
以上就对应了编译的前三个阶段 词法分析 语法分析 语义分析
但是编译的目的是让计算机或者运行环境(而不是人脑)理解程序的含义,所以语义分析的阶段就特别困难,因为人脑可以自然的学习和理解语言,但我们却不知道人脑是怎么做到的。我们只能保证语言的形式可以以语法树的结构来表示和验证,而语义的部分由形式本身来确定。这种由完全由形式确定语义的语言称作形式语言(formal language),它可以使让机器无歧义地理解程序这一目的变得容易实现。理解形式语言与自然语言的不同能够将编译的研究领域与自然语言识别的领域区分开来。
所以我们最终会由一棵语法树来生成机器能够理解的机器代码,这个过程中会涉及到许多的优化技术,以及底层相关的知识。同时为了保证语言本身的跨平台特性,或者是出于优化的需要和编译器实现的模块化要求,通常会先由语法树生成中间代码,这个过程中进行与平台无关的优化。再由中间代码生成机器相关的代码,中间掺杂进行机器相关的优化。
总结来说,编译器的实现大概以中间代码生成为界分为了前端和后端
整体步骤是:词法分析->语法分析->语义分析(类型检查,中间代码生成和优化)->目标代码生成和优化
因为有像LLVM这样的项目,我们设计一门语言可以只完成编译器的前端,生成某种形式的中间