手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

16|生成本地代码第1关:先把基础搭好

你好,我是宫文学。
到目前为止,我们已经初步了解了 CPU 架构和 X86 汇编代码的相关知识点,为我们接下来的让编译器生成汇编代码的工作打下了不错的基础。
不过,我总是相信最好的学习方法就是实践。因为,只有你自己动手尝试过用编译器生成汇编代码,你才会对 CPU 架构和汇编的知识有更深刻的了解,总之,遇到问题,解决问题就好了。
所以呢,今天这节课,我们就开始着手生成 X86 汇编代码。我会带你分析生成汇编代码的算法思路,理解寄存器机与栈机在生成代码上的差别,以及了解如何在内存里表示汇编代码。
看上去工作有点多,不着急,我们一步步来。那首先,我们就通过一个实例,让你对生成汇编代码的算法思路有一个直觉上的认知。

生成汇编代码的算法思路

在前面的课里,我们已经学会了如何生成字节码。你也知道了,基本上,我们只需要通过遍历 AST 就能生成栈机的字节码。
但当时我们也说过,为栈机生成代码是比较简单的,比寄存器机要简单,这具体是为什么呢?
你可以保留这个疑问,先来跟我分析一个例子,看看我们要怎么把它转化成汇编代码,以及在这个过程中会遇到什么问题:
function foo(a:number, b:number):number{
let c = a+b+10;
return a+c;
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了生成本地代码的基础知识和算法思路。作者首先强调了实践的重要性,并通过一个实例展示了如何将函数转化成汇编代码的算法思路。文章指出了在生成汇编代码时遇到的问题,如寄存器数量有限和寄存器分配算法。同时,还介绍了现代编译器快速生成汇编代码的算法和在JIT编译器中的应用。最后,文章提到了需要设计一套数据结构来在内存中表示汇编代码。通过对内存数据结构的分析,文章详细介绍了模块、基本块、指令、操作数等对象的表示方式。接着,文章讲解了为基础功能生成汇编代码的逻辑,包括处理整数字面量节点、变量、二元表达式等关键节点的处理过程。通过这些逻辑,读者可以了解如何将简单的函数编译成汇编代码。整体而言,本文通过实例和算法思路,为读者提供了对生成本地代码的初步了解,使读者能够快速了解生成本地代码的基础知识和相关问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 奋斗的蜗牛
    老师很厉害,我看完这块,都有茅塞顿开的感觉
    2021-09-14
    2
  • 功夫熊猫
    老师,使用寄存器的话是不是可以先跳过前面的栈机的实现方式
    2022-11-21归属地:江苏
  • ifelse
    学习打卡
    2022-09-17归属地:浙江
  • 有学识的兔子
    尽可能的使用寄存器在存放临时数据,一旦有临时数据不再使用及时复用对应寄存器,这带来的好处是减少数据在寄存器和内存之间的交换次数以及栈存储数据带来的rsp指针移动和可能的空间申请。指令的话,可不可以参考ABI的规定来设计,转化汇编时对其进行优化。
    2021-09-19
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部