前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编译原理工程实践—01编译器前端技术核心三步

编译原理工程实践—01编译器前端技术核心三步

原创
作者头像
CS逍遥剑仙
修改于 2025-05-11 17:33:44
修改于 2025-05-11 17:33:44
1091
举报
文章被收录于专栏:禅林阆苑禅林阆苑

编译原理工程实践—01编译器前端技术核心三步

文本主要介绍编译器前端技术的实现和应用。

1. 编译技术无处不在

什么是编译器的前端技术?我们在大学课堂里学习的《编译原理》大多侧重讲解编译器的 "前端(Front End)" 技术,即编译器对程序代码的分析和理解过程。而与之对应的 "后端(Back End)" 则是生成目标代码和优化的过程,跟目标机器有关。

总体来看,编译器前端技术的核心三步分别为:

  • 词法分析:通过构造有限自动机把程序源码分割为一个个 Token
  • 语法分析:用递归下降算法识别程序结构,并形成一棵便于由计算机处理的抽象语法树 AST
  • 语义分析:消除语义模糊,生成一些属性信息,用于生成目标代码

在现实中的大部分场景,依靠编译器前端技术就能解决,而前端编译过程也无处不在,例如,正则表达式的使用就是词法分析的过程;而解析文本、配置文件或是编写自定义表达式就是语法分析的过程。

在实际工作中,无论是前端还是后端开发者都常会碰到需要编译技术的场景:

【前端】代码转换、性能优化和工具链开发

  • 现代前端框架与编译器:如利用 词法分析 & 语法分析 实现 Vue/React/Svelte 等框架的模板编译(template=>render函数),还可以开发改造出符合特殊需求的模板引擎,对异型循环、条件分支等语法的支持都不在话下;利用编译技术还能实现如 TypeScript 般对不同 语言翻译转换,利用Babel的 AST 转换 将 ES6+ 代码降级为 ES5;Svelte 直接编译生成高效原生 JS 代码,减少运行时开销。
  • 打包工具与 Tree Shaking:如 Webpack 通过 AST 分析模块依赖、import() 实现动态加载模块,再如 Rollup 的 Tree Shaking 移除未使用的代码。
  • CSS 预处理与优化:如 Sass/Less/Stylus 编译成 CSS,PostCSS 优化样式,利用 词法分析 解析 Sass 的嵌套规则,PostCSS 的 autoprefixer 功能自动添加浏览器前缀(代码生成)。
  • WebAssembly(Wasm):利用编译后端技术,如 字节码生成 技术可以将 Rust/C++ 编译成 Wasm,前端通过 JS 调用。

【后端】语言运行时优化、代码生成和数据库查询优化

  • 代码生成与 ORM 框架:如 ORM 工具的模板引擎解析 #{}${} ,利用 AST 操作实现 HQL 转 SQL,还能实现 SQL 查询优化。
  • RPC 框架与协议编解码:如根据协议生成不同客户端和服务端执行代码,还可以实现如注解的支持、自定义 DSL,对静态语言代码的解释性执行,为特殊场景下的开发提效。

【运维】优化构建、部署和监控流程

  • 配置管理与模板渲染:解析 YAML/JSON 配置文件、生成 k8s 配置,优化 CI/CD 流水线,优化增量编译和缓存等等。
  • 日志与监控数据处理:利用词法和语法分析更高效灵活地解析日志文件

编译原理不仅是"实现编程语言"的理论,更是提升代码质量、开发效率和解决复杂问题的关键工具。

2. Step1: 词法分析(Lexical Analysis): 识别单词Token

计算机执行代码的第一步需要先"阅读"代码,和人类阅读文章时需要识别一个个单词一样,程序也需要首先将源码识别为一个个词法记号: Token。词法分析在日常开发中可能用的比想象多,因为 正则表达式 的应用就是词法分析的过程,如校验用户是否输入了合法的邮箱。

词法分析程序如何识别 Token?词法分析依赖一套规则和一套算法:正则文法(Regular Grammar) 和 有限自动机(Finite-state Automaton),就是常说的 FSA

我们在下一篇将实现一个简单的词法分析器程序,这里先举个简单的例子,如下图所示,词法分析器读取到代码字符串 age>=18 后逐字符解析,在遇到不同的字符后会迁移至不同状态。词法分析过程,本质是一个个状态迁移的过程。

实际的生产环境中很少纯手写词法分析器,开发者只需要编写符合 "正则文法" 规则的 "正则表达式",结合市面上的词法分析器工具生成 "有限自动机" 算法即可实现。

3. Step2: 语法分析(Syntactic Analysis, or Parsing): 识别语法结构

前面的词法分析识别出了源码的一个个单词 Token,而语法分析是为了继续识别出程序结构。为了方便计算机理解和执行,语法分析过程会将程序语法结构构造成树形结构。一个程序对应一棵 抽象语法树 (Abstract Syntax Tree),也就是我们熟知的 AST。树的每个节点(子树)对应一个语法单元,即"语法"。

通过网站 https://www.jointjs.com/demos/abstract-syntax-tree 可以可视化地观察 AST 的结构化表示。如下图展示了将表达式 1+2*3 赋值给变量 a 的 AST:

上面 AST 的结构计算机是方便处理的,除了上面的语法,再增加循环、条件分支等语法节点,就可以实现一门脚本语言了。而执行脚本语言的过程,其实就是遍历 AST 的过程。

语法分析的实现需要借助 递归下降算法,这是一种自顶向下的算法,我们在后面的篇章中将会详细介绍语法分析器的实现。

其实在日常工作中,我们或多或少也会接触到语法分析,如要实现用户自定义公式的计算,对公式的解析就是语法分析过程。另外分析日志文件时对每行日志的解析,本质上也是语法分析过程。

同样的,实际的生产环境中也很少从零手写语法分析器,改一改网上找到的开源语法规则文件,就能用 Antlr 等工具生成语法分析器。

4. Step3: 语义分析(Semantic Analysis): 让计算机理解意图

识别出程序结构后,此时距离编译器后端生成目标代码还缺少一些上下文信息。在语义分析阶段,编译器会根据语义规则,基于上下文对 AST 节点的属性做各种解析、标注和合法性检查,完成这些属性标注后,编译器后端就可以依据这些信息生成目标代码了。

语义分析阶段的成果,大多会作为属性标注在 AST 抽象语法树上。如标记节点数据类型,如前面提到的表达式 age>=18,会在 AST 的标识符节点 age 和字面量节点 18 上标注数据类型为数值类型;再如标记节点的源代码行列号,以方便报错信息的定位。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
前端工程师为什么要学习编译原理?
普遍的观点认为,前端就是打好 HTML、CSS、JS 三大基础,深刻理解语义化标签,了解 N 种不同的布局方式,掌握语言的语法、特性、内置 API。再学习一些主流的前端框架,使用社区成熟的脚手架,即可快速搭建一个前端项目。胜任前端工作非常容易。再往深处学习,你会发现前端这个领域,总是有学不完的框架、工具、库,不断有新的轮子出现。技术推陈出新,版本快速迭代,但万变不离其宗。工具致力于流程自动化、规范化,服务于简洁、优雅、高效的编码,将问题高度抽象化、层次化。在如今前端开源界如此火热的现状下,框架的使用者与框架的维护者联系更加紧密,不仅能深入源码来更彻底地认识框架,还能够提出问题,参与讨论,贡献代码,共同解决技术问题,推进前端生态的发展和壮大。而编译原理,作为一门基础理论学科,除了 JS 语言本身的编译器之外,更成为 Babel、ESLint、Stylus、Flow、Pug、YAML、Vue、React、Marked 等开源前端框架的理论基石之一。了解编译原理能够对所接触的框架有更充分的认识。
Nealyang
2019/09/29
1.6K0
前端工程师为什么要学习编译原理?
编译器架构 ( Compiler Architecture )
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:
一个会写诗的程序员
2021/06/29
1.9K0
走进Golang之编译器原理
当我们敲下 go build 的时候,我们写的源码文件究竟经历了哪些事情?最终变成了可执行文件。
大愚
2019/11/19
1.6K0
【愚公系列】软考中级-软件设计师 013-程序设计语言基础知识(语言处理程序基础)
语言处理程序基础是指语言处理程序设计与实现的基本原理和技术方法。它包括了以下几个关键方面:
愚公搬代码
2024/01/25
4481
夯实基础,编译器原理前端部分浅析
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
掘金安东尼
2022/09/22
5950
夯实基础,编译器原理前端部分浅析
看懂编译原理:词法/语法/语义分析阶段 原理
词法分析器的目的是识别高级语言中编写的代码转换为token,也就是识别高级语言中的每个单词token
北洋
2023/12/03
1.3K0
为什么编译原理被称为龙书?
这本书很有意思,它的书名是 《Compilers: Principles, Techniques, and Tools》,也就是编译器的原则、技术和工具。但它却画出了一个恐龙和骑士,恐龙身上写的是 Complexity of Compiler Design,也就是复杂的编译器设计,骑士的盾上写的是 Syntax Directed Granslation,也就是语法翻译。骑士的剑上看的不是很清楚,我猜测应该是优秀的编译器的意思。这是征服复杂性的隐喻。优秀的编译器会直接征服复杂的编译,复杂的编译设计永远无法攻破语法翻译。
cxuan
2020/07/17
1.4K0
编译原理工程实践—02基于正则文法和有限自动机实现简易词法分析器
前面讲过,词法分析器的目标是从源码中识别出一个个"单词"Token。这个过程和人类"聆听"时边听边提取信息的过程类似,词法处理器也是边读取边处理字符,最终形成一个个连续的 Token。本章将通过一个简单的案例来体会词法处理器使用有限自动机实现 Token 的分割。
CS逍遥剑仙
2025/05/12
1020
hiphop原理分析1
Hiphop是Facebook开发一款PHP二进制化的一个工具,最开始是由php转为C++,但是后来发现编译为c++的话,许多的时间会花费在编译代码上面,调试不方便,对于代码来说也不是即见即所得。 所以hiphop经历了这么几个阶段: HPHPC=>HPHPI=>HHVM HPHPC是静态编译,也就是把php转为c++ HPHPI是一个过渡产品,类似php zend虚拟机,性能还不如zend虚拟机,但是可以运行查看效果; HHVM是在HPHPI基础上,应用了JIT技术,性能已经接近了HPHPC,目前face
小小科
2018/05/02
1.5K0
hiphop原理分析1
java编译原理
(1)javac是一种编译器,能够将一种语言规范转换成另一种用语言规范,通常编译器是将便于人们理解的语言规范成机器容易理解的语言规范。
全栈程序员站长
2022/08/25
1.9K0
编译原理入门-编译的全过程
程序里面的单词叫做Token,Token的类型包括:关键字、标识符、字面量、操作符等
没事就要多学习
2024/07/18
1350
编译原理入门-编译的全过程
一篇文章理解编译全过程
https://www.cnblogs.com/fisherss/p/13905395.html
zz_jesse
2020/11/06
1.2K0
一篇文章理解编译全过程
大学课程 | 编译原理知识点
令 X 为一个文法符号(一个终结符或非终结符)或 ε ,则集合 First (X) 由终结符组成,此外可能还有 ε ,它的定义如下:
Justlovesmile
2021/12/14
1.4K0
大学课程 | 编译原理知识点
编译原理初学者入门指南
作者:pixelcao,腾讯 IEG 后台开发工程师 一、引子 最近的工作需要用表达式做一些参数的配置,然后发现大脑一片空白,在 Google 里试了几个关键词(起初搜了下“符号引擎”,发现根本不是我想要的)之后,明白过来自己应该是需要补一些编译原理的知识了。在掉了两晚上头发之后,决定整理一下自己的知识网络。 要解析的表达式大概长这个样子: avg(teams[*].players.attributes[skill])*rules[latency].maxLatency 正则表达式是个办法,但不是最优
腾讯技术工程官方号
2021/01/21
2.5K0
编译原理复习总结-耗子尾汁
2. 上下文无关法 一个上下文无关法G是一个四元式 ,其中 :终结符集合(非空) :非终结符集合(非空),且
唔仄lo咚锵
2021/12/31
1.3K0
编译原理复习总结-耗子尾汁
Java底层-Javac编译器
当我们执行这个命令后,就会得到一个class文件,这一步其实就是编译,在前面一节我们提及到Java不同于C/C++,它首先需要将Java文件编译成class文件, 然后再由JVM将二进制文件代码转为与机器适配的机器码,而java文件编译成class文件就是由Javac编译器来完成。通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的,比如HotSpot VM中的C1、C2编译器。此外对于程序的优化也主要集中在后端运行时编译,这样可以使非Javac编译器产生Class文件(Scala,Groovy等语言的Class文件)也能享受到编译器优化的好处。
每天学Java
2020/06/18
2.1K0
【编译原理】Chapter 0:当你学习编译原理之前需要了解什么
编译原理(Compiler Design)是计算机科学中研究程序编译过程的学科。编译过程的核心任务是将高级编程语言(如C、Java等)写的源代码转换为低级语言(如汇编或机器代码),使得程序能够被计算机硬件执行。
Skrrapper
2025/03/06
1610
【编译原理】Chapter 0:当你学习编译原理之前需要了解什么
java实现编译器_实现一个简单的编译器
简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的字节码。
全栈程序员站长
2022/09/08
2.8K0
java实现编译器_实现一个简单的编译器
编译原理:2. 词法分析
词法的(Lex-i-cal):与语言的单词或词汇有关,但有别于语言的文法和结构的。
浪漫主义狗
2023/09/04
7690
编译原理:2. 词法分析
85.精读《手写 SQL 编译器 - 智能提示》
词法、语法、语义分析概念都属于编译原理的前端领域,而这次的目的是做 具备完善语法提示的 SQL 编辑器,只需用到编译原理的前端部分。
黄子毅
2022/03/14
4K0
85.精读《手写 SQL 编译器 - 智能提示》
相关推荐
前端工程师为什么要学习编译原理?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档