Giter VIP home page Giter VIP logo

minisysy-tutorial's Introduction

miniSysY 编译实验

实验概述

SysY1 语言是本实验的源语言。是一个c语言的子集,SysY 语言是单文件的,以 .sy 作为后缀,去除了c语言中的 include/define/pointer/struct 等较复杂特性,sysy 语言本身不具有 IO 功能,通过链接运行时库的方式进行 IO。

LLVM 是一个模块化的、可重用的编译器和工具链的集合,目的是提供一个现代的、基于 SSA 的、能够支持任意静态和动态编译的编程语言的编译策略。在最近几年已经成为表现上能够和 gcc 对标的项目。

LLVM IR 是 LLVM 项目中通用的中间代码,作为源语言和体系架构的连接部分,是学生需要从源语言中编译并翻译到的目标语言。

本实验的所有变动以及修改都是公开的(包括目前未正式发布的实验),你可以在这里查看我们的进度并通过 issue 的形式向我们提出意见和建议。

实验目的

本实验希望通过将复杂且庞大的 SysY 语言的特性拆分为多个小的模块与实验,引导同学们在思考-设计-实现-重新设计的过程中实现从源语言到 LLVM IR 的编译器,了解编译技术的整个流程,并且掌握一定的优化能力。

若完成所有实验,同学应该:

  • 学会并理解了编译器的翻译流程
  • 掌握了词法分析与语法分析的原理以及操作
  • 掌握了语法制导翻译的原理以及操作
  • 了解了编译优化的**
  • 掌握了部分简单的编译优化
  • 熟悉了 gcc, llvm 等常见编译套件的使用以及用法

实验中不会涉及的东西:

  • 手动内存管理
  • 寄存器分配
  • 对 ABI 的处理
  • 体系结构相关的优化

为什么选择 LLVM IR 而不是 GIMPLE 或者其他体系架构汇编与栈式虚拟机

GIMPLE 过于复杂,学习成本太高,不适宜用作教学实验。

软件学院并没有系统性地学习过 CISC 或者是 RISC 指令集,而且大三上学期软件学院其他课程过于繁重,增加指令集的学习会导致学习内容大幅增加。LLVM IR 本身不需要太多对体系架构的知识,并且完全能够胜任一门目标语言的工作。(而且助教评测起来也很方便)

栈式虚拟机本身结构较为简单,并且生成对应代码也比较简单,但是脱离了现在实际应用中的环境,学习栈式虚拟机指令和学习 LLVM IR 的成本相当,但 LLVM IR 具有实际且广泛的应用场景。

Footnotes

  1. 具体请参考语言定义页面

minisysy-tutorial's People

Contributors

codevka avatar dhy2000 avatar generaluseai avatar roife avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

minisysy-tutorial's Issues

实验二计算表达式简化的有关问题

请问助教学长,实验二中按照LLVM IR的格式对每次运算都输出一条LLVM IR指令,能否在进行运算前将表达式先进行简化,比如(---1)简化成(-1),然后这样只输出一条LLVM IR指令即可
再比如:

String input = "int main() {\n" +
                "    return 1 +-+ (- - - - - - - - -1);\n" +
                "}";

是否可以将运算表达式先简化成:1-(-1)然后再输出LLVM IR指令,这样的简化步骤会引起之后实验的代码重构吗,还是必须不能简化,就按照有几个减号就输出几个sub 0,x的LLVM IR

// 上述程序输出
define dso_local i32 @main(){
简化后的计算表达式为 = 1-(-1)
%x0 = sub i32 0,1
%x1 = sub i32 1,%x0
ret i32 %x1
}

谢谢助教学长!

关于LLVM IR语法的问题

助教学长,这是我的程序根据一段代码生成的LLVM IR代码,但是我用Linux执行lli时却报错了,我始终找不到为啥这样写是错的:
源程序

int main () {
    int a;
    int b;
    int c;
    int d;
    a = 5;
    b = 5;
    c = 1;
    d = -2;
    d = (c * 1 / 2)  + (a - b);
    return e;
}

我生成的LLVM IR代码:

define dso_local i32 @main(){
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 5, i32* %1
store i32 5, i32* %2
store i32 1, i32* %3
%x5 = sub i32 0,2
store i32 %5, i32* %4
%6 = load i32, i32* %3
%7 = load i32, i32* %1
%8 = load i32, i32* %2
%9 = mul i32 %6,1
%10 = sdiv i32 %9,2
%11 = sub i32 %7,%8
%12 = add i32 %10,%11
store i32 %12, i32* %4
ret i32 %12
}
}

报错原因:

hanser@hanser-virtual-machine:~/Desktop$ lli main.ll
lli: main.ll:11:1: error: instruction expected to be numbered '%5'
%6 = load i32, i32* %3
^

我觉得这样的LLVM IR形式代码应该没有问题吧,遇到-2,使用%x5 = sub i32 0,2生成,并存储到了d中,那下面不应该就是%6 = load i32, i32* %3加载c的值了吗,我不知道为什么会报这个错误。
image
image

judge.toml 每次实验的内容是否能叠加而不是全部重新修改

考虑到存在标识符,judge.toml 的内容是不是每次新实验就叠加内容即可,比如这次是

[jobs.lexer]
image = { source = "dockerfile", path = ".", tag = "pre-lexer" }

如果下次标识符是 abc,能不能直接提交

[jobs.lexer]
image = { source = "dockerfile", path = ".", tag = "pre-lexer" }
[jobs.abc]
image = { source = "dockerfile", path = ".", tag = "pre-abc" }

(代码省略大部分细节)

数组参数的语义

将常量数组传入函数,这样的情况应该报错吗?

void func(int a[]){
    a[0]=1;
}
int main(){
    const a[4]={0,0,0,0};
    func(a);
    return 0;
}

实现 pre相关内容

  • LLVM 工具链下载
  • quick primer
  • LLVM 工具链介绍
  • 指令推荐
  • 代码结构以及API推荐
  • 评测机使用
  • 语法分析实验(待定)
  • 评测机上线

pre对代码语言有要求吗?

如果对代码没有要求,那本次实验可不可以在windows环境下用python/java编写?

后续的实验中会涉及到pre实验的代码吗?如果涉及到,需不需要统一代码语言,在ubuntu环境下用C编写?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.