You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# PW6 实验报告
* 舒英特 PB21111704
* 杨宇航 PB21051030
## 问题回答
* 1-1 一个`while`语句对应三个标签:第一个标签处执行判断,第二个标签处执行函数体,第三个标签对应`while`的末尾。`br`指令有两种形式:`br label a`表示直接跳转到`a`标签处;`br i1 x, label a, label b`表示`x`是真则跳到`a``x`是假则跳到`b`。
* 1-2 函数调用语句的格式是call <return-type> @<func-name>(<para-type> <para-reg>),包含了返回值类型,参数类型及、其具体值。
* 2-1 两种用法的区别为,使用的指针类型不同,前者数据类型为 `i32`,指针类型为 `i32\*`,只有一个参数,表示一维的偏移量;后者数据类型为 `[10 x i32]`(数组),指针类型为 `[10 x i32]*`,有两个参数,分别表示一个维度的偏移量
* 3-1 在`scope`中单独处理`func`方便管理在当前作用域中的变量,方便处理局部变量以及实现整个`modul`的结构层次
## 实验设计
* task1理解LLVM IR指令含义首先将所给的sy代码翻译成单赋值中间表示然后翻译为LLVM IR
* task2理解提供的生成器接口调用接口实现生成Task1中的LLVM IR
* task3根据生成的语法树遍历语法树的节点补充对各个节点的访问代码生成对应的LLVM IR
## 实验难点及解决方案
* 主要难点为理解生成LLVM IR模块的用法然后对应到具体的LLVM IR语句参考所给示例进行理解熟悉用法从而解决
* 其次是根据对语法树结点的访问调用正确的接口来生成对应的LLVM IR代码语句参考PW5的形式进行解决
## 实验总结
* 本次实验使我们组成员进一步了解了LLVM IR的语法
* 本次实验使我们组员可以将课堂理论知识中的IR部分与实践相结合理解更加透彻
* 本次实验使我们组成员更深入理解了LLVM的部分工作原理和机制
* 本次实验使我们组成员提升了对于C++语法中共享指针的熟练程度
## 实验反馈
* task1和task2中所需要完成翻译的sy代码都相对简单可以考虑提供一个具体算法的代码类似于所给demo可以进一步加深理解
* task3中可以适当提供给一个实现示例可以帮助同学们更快熟悉和理解接下来所需要完成的实验任务
## 组间交流
* 无