-
01.从0实现一个JVM语言之架构总览
01.从0实现一个JVM语言之架构总览
文章集合以及项目展望
源码github仓库, 如果这个系列对您有帮助, 希望获得您的一个star!
致亲爱的读者:
个人的文字组织和写文章的功底属实一般, 写的也比较赶时间, 所以系列文章的文字可能比较粗糙,
难免有词不达意或者写的很迷惑抽象的地方
如果您看了有疑问或者觉得我写的实在乱七八糟, 这个很抱歉, 确实是我的问题, 您如果有不懂的地方
的地方或者发现我的错误(文字错误, 逻辑错误或者知识点错误都有可能), 可以直接留言, 我看到都会回复您!
系列食用方法建议
由于时间原因, 目前测试并不完善, 所以推荐如下方式根据您的目的进行阅读
如果您是学习用, 建议您先将整个项目clone到本地, 然后把感兴趣的章节删除, 自己重写对照着重写
书写完每一步测试一下能否正常运行(在指定的路径去读取源码测试能否编译成功并在命令行执行
java Application(类名)
尝试能否输出期望结果, 我没有研究Junit对编译器输出class文件进行测试, 所以目前可能需要您手动测试)
按照以上步骤, 等您将所有模块重写一遍, 大概也对这个系列的脉络有深刻理解了! 如果您重头开始重写,
往往可能由于出现某些低级错误导致长时间debug才找得到错误, 所以对于初学者, 推荐采用自己补写替换模块的
方式
对于希望贡献代码的朋友或者对Cva感兴趣的朋友, 欢迎贡献您的源码与见解, 或者对于该系列一些错误/
bug愿意提出指正的朋友, 您可以留言或者在github发issue, 我看到后一定及时处理!
本节提纲
-
文章目录
-
架构简介及设想
文章目录
00.一个JVM语言的诞生
01.从0实现一个JVM语言之架构总览
02.从0实现一个JVM语言之词法分析器-Lexer
03.从0实现一个JVM语言系列之语法分析器-Parser
04.从0实现一个JVM语言系列之语义分析-Semantic
05.从0实现一个JVM语言之目标平台代码生成-CodeGenerator
项目架构构想
项目其实已经写完成了一个能实现简单功能的框架, 每个模块的功能标注如下
如果有地方没有写清楚对您造成了困惑, 欢迎留言, 我看到后会回复!
├─src
│ ├─main
│ │ ├─go // 暂时被这个小项目遗弃的go们
│ │ │ └─golang
│ │ │ ├─handler
│ │ │ └─main
│ │ ├─java
│ │ │ ├─cn
│ │ │ │ └─misection
│ │ │ │ └─cvac
│ │ │ │ ├─ast // 前端抽象语法树
│ │ │ │ │ ├─clas // Cva类
│ │ │ │ │ ├─decl // Cva 声明
│ │ │ │ │ │ └─nullobj // 所有nullobj package都是空对象模式的空对象 下同
│ │ │ │ │ ├─entry // Cva 主类, Cva程序的入口
│ │ │ │ │ ├─expr // Cva 表达式
│ │ │ │ │ │ ├─nonterminal // 非终结符
│ │ │ │ │ │ │ ├─binary // 二元表达式
│ │ │ │ │ │ │ ├─ternary // 三元表达式
│ │ │ │ │ │ │ └─unary // 一元表达式
│ │ │ │ │ │ ├─nullobj // 空对象
│ │ │ │ │ │ └─terminator // 终结符
│ │ │ │ │ ├─method // Cva 方法
│ │ │ │ │ ├─program // Cva 语法树根节点
│ │ │ │ │ ├─statement // Cva声明
│ │ │ │ │ │ └─nullobj
│ │ │ │ │ └─type // Cva类型
│ │ │ │ │ ├─advance // 进阶类型, String, array && 指针, 目前只实现了string
│ │ │ │ │ ├─basic // 基础类型, Java基本类型
│ │ │ │ │ └─reference // 引用类型, 其实string和array也是
│ │ │ │ ├─codegen
│ │ │ │ │ └─bst // backend syntax tree 目标平台(JVM)抽象语法树
│ │ │ │ │ ├─bclas
│ │ │ │ │ ├─bdecl
│ │ │ │ │ ├─bentry
│ │ │ │ │ ├─bmethod
│ │ │ │ │ ├─bprogram
│ │ │ │ │ ├─btype
│ │ │ │ │ │ ├─advance
│ │ │ │ │ │ ├─basic
│ │ │ │ │ │ └─reference
│ │ │ │ │ └─instructor
│ │ │ │ │ └─write
│ │ │ │ ├─config // 主要是条件编译的宏常量等
│ │ │ │ ├─constant // 常数池, TODO 将所有常数池以及package-info的常量用枚举重构
│ │ │ │ ├─io // 文件流读写
│ │ │ │ ├─lexer // 词法分析
│ │ │ │ ├─optimize // 编译优化
│ │ │ │ ├─parser // 语法分析
│ │ │ │ ├─pkg // Cva包管理
│ │ │ │ └─semantic // 语义分析
│ │ │ └─META-INF // 打包jar入口
│ │ └─resources
│ └─test // 单元测试
│ └─java
│ └─cn
│ └─misection
│ └─cvac
│ ├─ast
│ ├─codegen
│ │ └─bst
│ │ └─instructor
│ ├─lexer
│ │ └─report
│ └─unit
└─target
// ... .class 文件...
以上是对项目源码各部分的功能解析, 一般的编译器完成就那么几个步骤, 词法分析, 语法分析, 语义分析,
中间代码生成, 编译器优化, 我们也不能免俗, 文章的章节会大致以这些展开, 之后可能会介绍怎么去生成
打包文件, 方便制作发行版分发给其他用户, 在过程中如果有大家疑问比较多或者我说的很不详细的地方,
欢迎大家留言, 如果是大的问题, 我将专门为其写一篇随笔解决这些技术或者配置问题
由于方才才获悉博客园文章默认不放在首页的, 原创文章主要通过随笔显示, 所以将文章迁移到随笔;
这篇帖子将后续更新, 欢迎关注! 这段时间要忙着春招实习, 所以项目更新会慢一点,
语言组织也会比较随意, 毕竟时间有限, 限于个人文笔和水平, 没办法太过雕琢了. 如果您有什么疑问,
或者看到我有什么错误, 欢迎留言指出, 我看到都会回复!
出处:https://www.cnblogs.com/misection/p/14429158.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比