{"id":13667248,"url":"https://github.com/arcsysu/SYsU-lang","last_synced_at":"2025-04-26T15:32:29.403Z","repository":{"id":41962204,"uuid":"459888257","full_name":"arcsysu/SYsU-lang","owner":"arcsysu","description":"A mini, simple and modular compiler lab for SYsU/SysY(tiny C). Based on Clang/LLVM/ANTLR4/Bison/Flex.","archived":false,"fork":false,"pushed_at":"2024-11-25T08:12:08.000Z","size":1195,"stargazers_count":208,"open_issues_count":0,"forks_count":35,"subscribers_count":2,"default_branch":"latest","last_synced_at":"2024-11-25T09:23:01.579Z","etag":null,"topics":["antlr","antlr4","bison","clang","compiler","flex","lex","lexer","llvm","llvm-ir","parser","sysy","yacc"],"latest_commit_sha":null,"homepage":"https://arcsysu.github.io/SYsU-lang/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arcsysu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-16T06:57:55.000Z","updated_at":"2024-11-25T08:12:13.000Z","dependencies_parsed_at":"2024-01-20T08:26:14.476Z","dependency_job_id":"20478a5c-0428-4e86-9e2b-c0b131f8b178","html_url":"https://github.com/arcsysu/SYsU-lang","commit_stats":null,"previous_names":[],"tags_count":4,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsysu%2FSYsU-lang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsysu%2FSYsU-lang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsysu%2FSYsU-lang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsysu%2FSYsU-lang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arcsysu","download_url":"https://codeload.github.com/arcsysu/SYsU-lang/tar.gz/refs/heads/latest","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251008807,"owners_count":21522180,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["antlr","antlr4","bison","clang","compiler","flex","lex","lexer","llvm","llvm-ir","parser","sysy","yacc"],"created_at":"2024-08-02T07:00:33.874Z","updated_at":"2025-04-26T15:32:29.390Z","avatar_url":"https://github.com/arcsysu.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# SYsU-lang\n\nSYsU 是一个教学语言，应用于中山大学（**S**un **Y**at-**s**en **U**niversity）[编译原理课程](https://xianweiz.github.io/teach/dcs290/s2022.html)的教学。本项目是该课程的实验模板，可以得到一个 SYsU language 的编译器组件。实验的设计目标包括：\n\n1. 在兼容 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 语言的基础上，增加最少的语法支持，使其可以编译 [Yat-sen OS](https://github.com/NelsonCheung-cn/yatsenos-riscv)。\n2. 按照自顶向下的顺序进行实验，各个实验模块之间可通过管道进行通信（微 内 核）。\n3. 实验模块无缝对接 Clang/LLVM，避免前一个实验失败影响后续实验开展。\n4. 支持在线/本地/Github Action 自动批改。\n\n在 2022 春季学期的教学中，学生实现的编译器的性能可达 `clang -O3` 的 48%，相较于初始版本加速比超过 400%，推荐阅读相关[论文](https://github.com/arcsysu/SYsU-lang-paper)以了解我们的理念与实验设计，也欢迎其他高校相关课程使用并反馈！我们同样开放了[实验文档](https://github.com/arcsysu/SYsU-lang/wiki)与基于 docker 的[在线评测框架](https://zhuanlan.zhihu.com/p/479027855)。\n\n## 编译运行\n\n需要注意的是，[SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 语言允许编译时能够求值的 `const int` 作为数组大小，导致部分算例不能通过 `gcc` 的编译，因此为保持兼容推荐使用 `clang` 编译。经过测试的实验环境为 `ubuntu:24.04`。\n\n```shell\n# 安装依赖\napt-get install -y --no-install-recommends \\\n  libantlr4-runtime-dev default-jre-headless pkg-config uuid-dev flex bison \\\n  clang llvm-dev zlib1g-dev libzstd-dev lld python3 cmake ninja-build git\n\ngit clone \\\n  -c feature.manyFiles=true \\\n  --depth=1 \\\n  https://github.com/arcsysu/SYsU-lang\n\ncd SYsU-lang\n\n# 编译安装\n# `${CMAKE_C_COMPILER}` 仅用于编译 `.sysu.c`\n# 非 SYsU 语言的代码都将直接/间接使用 `${CMAKE_CXX_COMPILER}` 编译（后缀为 `.cc`）\nrm -rf $HOME/sysu\ncmake -G Ninja \\\n  -DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n  -DCMAKE_C_COMPILER=clang \\\n  -DCMAKE_CXX_COMPILER=clang++ \\\n  -DCMAKE_CXX_STANDARD=17 \\\n  -DCMAKE_INSTALL_PREFIX=$HOME/sysu \\\n  -DCMAKE_PREFIX_PATH=\"$(llvm-config --cmakedir)\" \\\n  -DCPACK_SOURCE_IGNORE_FILES=\".git/;tester/third_party/\" \\\n  -B $HOME/sysu/build\ncmake --build $HOME/sysu/build\ncmake --build $HOME/sysu/build -t install\n\n# 检查各实验的得分\nCTEST_OUTPUT_ON_FAILURE=1 cmake --build $HOME/sysu/build -t test\n\n# 打包源代码以提交作业\ncmake --build $HOME/sysu/build -t package_source\n\n# 检查编译结果\n( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-compiler -S -o a.S tester/functional/000_main.sysu.c \u0026\u0026\n  clang -O0 -lsysy -lsysu -o a.out a.S \u0026\u0026\n  ./a.out ;\n  echo $? \u0026\u0026\n  rm -f a.S a.out )\n\n# 编译器自举（预留接口，当前直接调用 clang）\nrm -rf $HOME/sysu-stage2\ncmake -G Ninja \\\n  -DCMAKE_C_COMPILER=$HOME/sysu/bin/sysu-compiler \\\n  -DCMAKE_CXX_COMPILER=clang++ \\\n  -DCMAKE_INSTALL_PREFIX=$HOME/sysu-stage2 \\\n  -DCPACK_SOURCE_IGNORE_FILES=\".git/;tester/third_party/\" \\\n  -DSYSU_TESTER=1 \\\n  -B $HOME/sysu-stage2/build\ncmake --build $HOME/sysu-stage2/build\ncmake --build $HOME/sysu-stage2/build -t install\n```\n\n对于使用其他操作系统的同学，我们准备了一份 [docker 开发环境](https://hub.docker.com/r/wukan0621/sysu-lang)。\n\n```shell\ndocker pull wukan0621/sysu-lang\ndocker run \\\n  --name sysu-lang \\\n  -v \"$PWD/workspace:/workspace\" \\\n  -it wukan0621/sysu-lang \\\n  sh\n# 随后可以在宿主机当前目录的 workspace/SYsU-lang 目录下开发\n```\n\n## 语法特征\n\nSYsU 是 C 语言的子集，同时也是 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 语言的超集，在后者的基础上进行了一些调整，以适应课程需要：\n\n1. 源代码后缀名由 `.sy` 调整为 `.sysu.c`。\n2. 元素类型增加 `char`、`long long`。\n3. 常量类型增加字符串常量。多行字符串只支持多个`\"\"`的拼接，不支持斜杠 `\\` 语法。\n4. 不支持字符常量，而应当用字符串常量与下标寻址表示（如`\"c\"[0]`）。\n5. 语句类型增加 `do` - `while` 循环。\n6. 源代码通过**预处理器**（如 `clang -E`）处理后传给**编译器**。\n7. 预处理语句以 `#` 开头，并且总是占据一整行。\n8. 运行时库提供的函数需要预先 `#include`。\n9. 不要求每个文件都包含 `main` 函数，可以分模块编译并链接。\n10. Do what you want to do\n\n## 运行架构\n\n本项目的运行架构如下图。\n\n```mermaid\nflowchart TB\nsubgraph sysu-compiler\ndirection TB\nsubgraph frontend\ndirection LR\npreprocessor--Code--\u003egrammar\ngrammar--JsonAST--\u003egenerator\npreprocessor--Code--\u003elexer\nlexer--TokenFlow--\u003eparser\nparser--JsonAST--\u003egenerator\nend\nsubgraph midend\noptimizer\nend\nsubgraph backend\ndirection LR\ntranslator--Assemble--\u003elinker\nend\nfrontend--LLVM IR--\u003emidend\nmidend--LLVM IR--\u003ebackend\nend\n```\n\n### `compiler`\n\nSYsU 编译器的上层驱动，类似于 `clang`。当前支持的额外功能包括：\n\n- `-h`：查看完整使用帮助\n- `--unittest`：单元测试\n- `--convert-sysy`：转换 SysY 到 SYsU\n\n```shell\n( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-compiler tester/functional/000_main.sysu.c )\n```\n\n后续功能开发中，详见 `-h`；未支持的参数将尝试传递给 `clang` 执行。\n\n### `preprocessor`\n\nSYsU 的预处理器。当前 `sysu-preprocessor` 直接调用 `clang --driver-mode=cpp`，学有余力的同学也可自行实现。\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c )\n# 1 \"tester/functional/000_main.sysu.c\"\n# 1 \"\u003cbuilt-in\u003e\" 1\n# 1 \"\u003cbuilt-in\u003e\" 3\n# 341 \"\u003cbuilt-in\u003e\" 3\n# 1 \"\u003ccommand line\u003e\" 1\n# 1 \"\u003cbuilt-in\u003e\" 2\n# 1 \"tester/functional/000_main.sysu.c\" 2\nint main(){\n    return 3;\n}\n```\n\n### `grammar`\n\nSYsU 的新基于 antlr4 的文法分析器，用于代替被诟病已久的 flex+bison 旧实验，产生类似于 `clang -cc1 -dump-tokens 2\u003e\u00261`、`clang -cc1 -ast-dump=json` 的输出。作为文法分析实验模块，本仓库中的 `sysu-grammar` 并不能处理完整的 SYsU，但提供了一个模板，需要学生将其文法分析规则补充完整（[详细实验要求](grammar/README.md)）。\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-grammar -dump-tokens )\nint 'int'               Loc=\u003ctester/functional/000_main.sysu.c:1:1\u003e\nidentifier 'main'               Loc=\u003ctester/functional/000_main.sysu.c:1:5\u003e\nl_paren '('             Loc=\u003ctester/functional/000_main.sysu.c:1:9\u003e\nr_paren ')'             Loc=\u003ctester/functional/000_main.sysu.c:1:10\u003e\nl_brace '{'             Loc=\u003ctester/functional/000_main.sysu.c:1:11\u003e\nreturn 'return'         Loc=\u003ctester/functional/000_main.sysu.c:2:5\u003e\nnumeric_constant '3'            Loc=\u003ctester/functional/000_main.sysu.c:2:12\u003e\nsemi ';'                Loc=\u003ctester/functional/000_main.sysu.c:2:13\u003e\nr_brace '}'             Loc=\u003ctester/functional/000_main.sysu.c:3:1\u003e\neof ''          Loc=\u003ctester/functional/000_main.sysu.c:3:2\u003e\n```\n\n\u003c!-- {% raw %} --\u003e\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-grammar )\n{\"inner\":[{\"inner\":[{\"inner\":[{\"inner\":[{\"kind\":\"IntegerLiteral\",\"value\":\"3\"}],\"kind\":\"ReturnStmt\"}],\"kind\":\"CompoundStmt\"}],\"kind\":\"FunctionDecl\",\"name\":\"main\"}],\"kind\":\"TranslationUnitDecl\"}\n```\n\n\u003c!-- {% endraw %} --\u003e\n\n### `lexer`\n\nSYsU 的旧词法分析器，产生类似于 `clang -cc1 -dump-tokens 2\u003e\u00261` 的输出。作为词法分析实验模块，本仓库中的 `sysu-lexer` 并不能处理完整的 SYsU，但提供了一个模板，需要学生将其词法规则补充完整（[详细实验要求](lexer/README.md)）。\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-lexer )\nint 'int'               Loc=\u003ctester/functional/000_main.sysu.c:1:1\u003e\nidentifier 'main'               Loc=\u003ctester/functional/000_main.sysu.c:1:5\u003e\nl_paren '('             Loc=\u003ctester/functional/000_main.sysu.c:1:9\u003e\nr_paren ')'             Loc=\u003ctester/functional/000_main.sysu.c:1:10\u003e\nl_brace '{'             Loc=\u003ctester/functional/000_main.sysu.c:1:11\u003e\nreturn 'return'         Loc=\u003ctester/functional/000_main.sysu.c:2:5\u003e\nnumeric_constant '3'            Loc=\u003ctester/functional/000_main.sysu.c:2:12\u003e\nsemi ';'                Loc=\u003ctester/functional/000_main.sysu.c:2:13\u003e\nr_brace '}'             Loc=\u003ctester/functional/000_main.sysu.c:3:1\u003e\neof ''          Loc=\u003ctester/functional/000_main.sysu.c:3:2\u003e\n```\n\n### `parser`\n\nSYsU 的旧语法分析器，接受来自 `sysu-lexer` 的输入，输出一个 json 格式的语法分析树（类似于 `clang -cc1 -ast-dump=json`）。作为语法分析实验模块，本仓库中的 `sysu-parser` 并不能处理完整的 SYsU，但提供了一个模板，需要学生将其语法规则补充完整（[详细实验要求](parser/README.md)）。\n\n\u003c!-- {% raw %} --\u003e\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-lexer |\n  sysu-parser )\n{\"inner\":[{\"inner\":[{\"inner\":[{\"inner\":[{\"kind\":\"IntegerLiteral\",\"value\":\"3\"}],\"kind\":\"ReturnStmt\"}],\"kind\":\"CompoundStmt\"}],\"kind\":\"FunctionDecl\",\"name\":\"main\"}],\"kind\":\"TranslationUnitDecl\"}\n```\n\n\u003c!-- {% endraw %} --\u003e\n\n当然，也可以直接从 `clang -cc1 -dump-tokens 2\u003e\u00261` 获得输入。\n\n```shell\n( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  clang -E tester/functional/000_main.sysu.c |\n  clang -cc1 -dump-tokens 2\u003e\u00261 |\n  sysu-parser )\n```\n\n### `generator`\n\n`sysu-generator` 将 `sysu-parser` 得到的语法分析树转换为 LLVM IR。作为代码生成实验模块，本仓库中的 `sysu-generator` 并不能处理完整的 SYsU，但提供了一个模板，需要学生将其补充完整（[详细实验要求](generator/README.md)）。\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-grammar |\n  sysu-generator )\n; ModuleID = '-'\nsource_filename = \"-\"\n\ndefine i32 @main() {\nentry:\n  ret i32 3\n}\n```\n\n### `optimizer`\n\n`sysu-optimizer` 是 SYsU 的优化器，从 `sysu-generator` 获得输入，输出优化后的 LLVM IR。作为代码优化实验模块，本仓库中的 `sysu-optimizer` 并没有实现优化 IR 的功能，需要学生将其补充完整（[详细实验要求](optimizer/README.md)）。\n\n注意在以下的输出中，`; ModuleID = '\u003cstdin\u003e'` 前的输出来自 `stderr`，包含了一个来自 [banach-space/llvm-tutor](https://github.com/banach-space/llvm-tutor/blob/main/lib/StaticCallCounter.cpp) 的 `StaticCallCounter` Pass，可以统计生成代码中包含哪些 `call` 调用。\n\n```shell\n$ ( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  sysu-preprocessor tester/functional/000_main.sysu.c |\n  sysu-grammar |\n  sysu-generator |\n  sysu-optimizer )\n=================================================\nsysu-optimizer: static analysis results\n=================================================\nNAME                 #N DIRECT CALLS\n-------------------------------------------------\n-------------------------------------------------\n\n; ModuleID = '\u003cstdin\u003e'\nsource_filename = \"-\"\n\ndefine i32 @main() {\nentry:\n  ret i32 3\n}\n```\n\n同时提供了一个 LLVM 插件 `libsysuOptimizer.so`，可以使用 `opt` 直接加载。这意味着 `sysu-optimizer` 中的 pass 也可直接用于 LLVM 生态。\n\n```shell\n( export PATH=$HOME/sysu/bin:$PATH \\\n  CPATH=$HOME/sysu/include:$CPATH \\\n  LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \\\n  LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH \u0026\u0026\n  clang -E tester/mizuno_ai/mizuno_ai.sysu.c |\n  clang -cc1 -S -emit-llvm |\n  opt -S -load-pass-plugin=libsysuOptimizer.so -passes=\"sysu-optimizer-pass\" )\n```\n\n### `translator`\n\n将 LLVM IR 翻译成汇编或二进制文件。当前 `sysu-translator` 直接调用 `llc`，学有余力的同学也可自行实现。\n\n### `linker`\n\n链接器。当前 `sysu-linker` 直接调用 `ld.lld`，学有余力的同学也可自行实现。\n\n### `librarian`\n\n#### SysY 运行时库\n\n为了可移植性以及与 C 标准库的兼容性，此处自行实现了 `libsysy`，与 [nscscc/compiler2021](https://gitlab.eduxiji.net/nscscc/compiler2021/) 中提供的 [`sylib.h`](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/%E5%85%AC%E5%BC%80%E7%94%A8%E4%BE%8B%E4%B8%8E%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93/sylib.h) 保持 API 兼容性，但不保证 ABI 兼容性。换言之，原有的 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 代码需要转换为 SYsU 并重新编译。\n\n#### SYsU 运行时库\n\n`libsysu` 暴露了类似于 `open()`、`read()`、`write()`、`close()`、`fork()` 的系统调用，使 SYsU 具有了处理文件、使用多进程的可能。\n\n后续会逐步支持更多 C 标准库函数与 Linux 系统函数，以用于 [Yat-sen OS](https://github.com/NelsonCheung-cn/yatsenos-riscv) 或实现编译器自举。\n\n### `tester`\n\n目录下提供了一系列 SYsU 格式的测试代码以及对应程序的输入输出，修改自 [nscscc/compiler2021](https://gitlab.eduxiji.net/nscscc/compiler2021/) 中提供的算例。\n\n大算例以 `git submodule` 的形式存放在 `tester/third_party`。加载方式：\n\n```shell\ngit submodule update --init --recursive --depth 1\n```\n\n## 实验反馈\n\n- 交流实验中遇到的困难：[![Discussions](https://img.shields.io/github/discussions/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/discussions)\n- 提出实验设计的问题：[![Issues](https://img.shields.io/github/issues/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/issues)\n- 改善这个实验：[![Issues-pr](https://img.shields.io/github/issues-pr/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/pulls)\n\n### Q \u0026 A：为什么要基于 LLVM，而不是真正的从零开始实现一个框架？\n\n1. 即使我们重新实现一个实验框架，也并没有让学生“从零开始写编译器”，学生仍然要去熟悉助教提供的实验框架。\n2. LLVM 是久经考验的编译器框架，我们希望学生可以熟悉 LLVM，培养出业界真正需要的人才。\n3. 本项目中每个实验提供的模板都只有一百行左右，可以降低学生上手的门槛；当学生完成整个项目后，也会具备从零开始实现一个编译器的能力，从课堂教学的角度已经足够。\n\n### Q \u0026 A：为什么是编译到 LLVM IR，而不是某种汇编，如 RV32I？\n\n1. 一个观点是，在编译原理课程上，不应该过多涉及硬件架构的细节。\n2. LLVM IR 已经相对底层，非常好翻译成各种汇编，实际上也可以用与本项目相同的方式写一个编译器。\n3. 我们也预留了 LLVM IR 到汇编的接口 `sysu-translator` 以及链接器的接口 `sysu-linker`，相关部分的可选实验设计正在进行中，学有余力的同学也可以自行实现。\n\n### Q \u0026 A：为什么将词法分析器等模块实现为单独的可执行文件，可能导致运行低效率？\n\n1. 面向教学用的编译器，并不会用于生产环境，低效是可以接受的。实际上学生也可以调整代码，将各个模块链接成一个可执行文件。\n2. 自顶向下的开展实验，可以和老师的教学进度同步。各个模块可以直接由 `clang` 代替 ，避免学生一个实验不成功影响到后续实验的开展。\n3. 如果按照其他高校类似实验中的方案（不断在已有的实现上增加语法），虽然更符合现实中一门语言以及编译器的发展情况，但是学生在学习的开始并不具备对编译原理体系的理解，很难快速掌握自顶向下的完整技术栈。\n\n### Q \u0026 A：为什么要对 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 语法进行调整？\n\n1. 不直接使用 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 语法，避免学生直接抄袭比赛的实现。\n2. 后缀名变成 `.sysu.c`，指明了 SYsU 是 C 的严格子集，可以让 `clang` 直接编译代码，方便学生与正确实现对拍。\n3. 加入 `#include` 等预处理语句的支持，可以让学生更加熟悉预编译过程（即使不用实现一个预编译器），也为 SYsU 增加了实现库或调用外部库的可能（可用于实现 [Yat-sen OS](https://github.com/NelsonCheung-cn/yatsenos-riscv)）。\n4. 增加 `do` - `while` 循环，因为这是很好用的[语法糖](https://mp.weixin.qq.com/s/Wwu-prowKKNDsNlzC2k9Ow)。\n5. 增加 `char`、`long long` 和字符串，同样便于实现 OS。\n6. 不支持字符常量，因为对其的支持和字符串常量是完全类似的，但在词法分析的时候可能会与词法分析器的输出格式产生微妙的冲突。\n\n### Q \u0026 A: 本项目的版本管理的规则是？为什么项目名为 SYsU-lang，而非 SYsU-compiler ？\n\n[`latest`](https://github.com/arcsysu/SYsU-lang/tree/latest) 分支下为中大课程教学中使用的代码，功能较为稳定，预期在 `ubuntu:24.04` 环境中工作。文档可能不会及时更新，以对应 [Dockerfile](https://github.com/arcsysu/SYsU-lang/blob/latest/Dockerfile) 中的测试语句为准。\n\n对于中大以外的高校教学者与个人自学者，我们建议使用 [releases](https://github.com/arcsysu/SYsU-lang/releases) 中最新发布的实验框架源码以及对应版本号的 [docker image](https://hub.docker.com/r/wukan0621/sysu-lang)。它们可能在时间上略有落后，但经过了中大一学期的教学检验，不存在潜在的可能导致教学事故的错误。我们也十分欢迎来自你们的课堂反馈[![Discussions](https://img.shields.io/github/discussions/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/discussions) 与改进建议[![Issues](https://img.shields.io/github/issues/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/issues)[![Issues-pr](https://img.shields.io/github/issues-pr/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/pulls) 。\n\n版本号的命名格式为 `\u003cmajor\u003e.\u003cminor\u003e.\u003cpatch\u003e.\u003ctweak\u003e`，如 `2404.0.0.20240229`。一般来说，对于使用 `latest` 分支代码的用户，`\u003cmajor\u003e`、`\u003cminor\u003e`、`\u003cpatch\u003e` 发生变化时，我们建议尽快更新至最新版本。\n\n- `\u003cmajor\u003e` 指示了该版本的软件依赖为对应的 ubuntu/debian 版本\n- `\u003cminor\u003e` 指示了该版本的功能版本，不同 `\u003cminor\u003e` 间可能不直接兼容\n- `\u003cpatch\u003e` 指示了该版本的补丁版本，不同 `\u003cpatch\u003e` 间预期可以直接更新，修正前一个版本中存在的问题\n- `\u003ctweak\u003e` 指示了当前版本代码（不含文档）的日期，可能存在微调，但不同 `\u003ctweak\u003e` 的代码应当具有完全相同的表现\n\n由于本项目并没有提供一个完整的 `sysu-compiler`，而只提供了相关的开发环境，因此项目名为 SYsU-lang。[完整实现](https://github.com/SYSU-SCC/sysu-compiler)的开发已在进行，暂不对外开放。\n\n## 你可能会感兴趣的\n\n- [SYsU-lang 实验一、二总结+常见问题指导（不定期更新）](https://wu-kan.cn/2022/05/12/SYsU-lang-%E5%AE%9E%E9%AA%8C%E4%B8%80-%E4%BA%8C%E6%80%BB%E7%BB%93+%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%8C%87%E5%AF%BC-%E4%B8%8D%E5%AE%9A%E6%9C%9F%E6%9B%B4%E6%96%B0/)\n- [全国大学生计算机系统能力大赛——编译系统设计赛](https://compiler.educg.net)\n  - 可找到各参赛学校的开源代码\n- 其它基于 [SysY](https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf) 或类似语法设计的编译器实验\n  - [buaa-se-compiling/miniSysY-tutorial](https://github.com/buaa-se-compiling/miniSysY-tutorial)\n  - [Komorebi660/SysYF-Compiler](https://github.com/Komorebi660/SysYF-Compiler)\n  - [pku-minic/online-doc](https://github.com/pku-minic/online-doc)\n  - [tinsir888/Compiler-SysY](https://github.com/tinsir888/Compiler-SysY)\n  - [yan-lang/ycc](https://github.com/yan-lang/ycc)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcsysu%2FSYsU-lang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farcsysu%2FSYsU-lang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcsysu%2FSYsU-lang/lists"}