首页 > 其他分享 >编译实践学习 Part2

编译实践学习 Part2

时间:2024-03-16 19:55:05浏览次数:24  
标签:std outstr IR 实践 编译 Part2 Koopa koopa output

本文以 CC BY-SA 4.0 协议发布。

闲话

重写了 Part1 里因为手滑而删除的 AST。

LunarVim IDE,你值得拥有(

代码传上了 github(推荐 https://mirror.ghproxy.com 加速).

Koopa IR

遍历 AST,然后根据 Koopa IR 语法输出字符串。

发现 std::ostringstream 还挺好用。

比如:

constexpr const char* INDENT = "  ";
using Ost = std::ostringstream;

// ...

class FuncDefAST: public BaseAST{
public:
	std::unique_ptr<BaseAST> func_typ;
	std::string ident;
	std::unique_ptr<BaseAST> block;
	void output(Ost &outstr, std::string prefix) const override{
		outstr << prefix << "fun @" << ident << "():";
		func_typ->output(outstr, "");
		outstr << "{\n";
		block->output(outstr, prefix + INDENT);
		outstr << "\n" << prefix << "}";
	}
};

// ...

想输出到 stderr 时直接把 Ost 类型改了就行。

为什么不用 template?因为 C++ 的虚函数不能是模板。(可能不准确,如果错了请大佬指出)

然后用 koopa_parse_from_string 把字符串转成 koopa_raw_program_t .

注意 std::ostringstream::str() 返回的是临时对象,也就是说还要用一个 std::string 保存.

risc-v

为什么 Koopa IR 里的宏定义要写成 RSIK 啊……

感觉遍历 Koopa IR 然后生成汇编的过程和遍历 AST 然后生成 Koopa IR 的过程差不多。

新开了文件 ir.cppir.hpp 来处理 Koopa IR \(\rightarrow\) RISC-V.

然后就完事了。

命令行参数

getopt,你值得拥有。

大概就是配置一下长命令参数然后就能用了。

PKU 文档里要求形如 -koopa 的命令行参数,所以只能用 getopt_long_only.

extern char* optarg;
extern int optind, opterr, optopt;
static const struct option long_opt_args[] = {
	{"koopa", no_argument, NULL, 1001},
	{"riscv", no_argument, NULL, 1002},
	{"output", required_argument, NULL, 1003},
	{"o", required_argument, NULL, 1003},
	{0, 0, 0, 0}
};

bool output_koopa = false;

int main(int argc, char **argv) {
	int now_opt = 0;
	std::string outp;
	while((now_opt = getopt_long_only(argc, argv, "", long_opt_args, NULL)) != -1){
		switch(now_opt){
			case 1001:
				output_koopa = true;
			break;
			case 1002:
				output_koopa = false;
			break;
			case 1003:
				outp = optarg;
			break;
			case '?':
				return 114514;
			default:
			assert(0);
		}
	}
	// ...
}

话说回来,我又不在他们的 OJ 上评测,为什么非要支持单横线呢?

加了几个小脚本。

标签:std,outstr,IR,实践,编译,Part2,Koopa,koopa,output
From: https://www.cnblogs.com/x383494/p/18077496

相关文章

  • 政安晨:【深度学习处理实践】(八)—— 表示单词组的两种方法:集合和序列
    咱们接着这个系列的上一篇文章继续:政安晨:【深度学习处理实践】(七)——文本数据预处理https://blog.csdn.net/snowdenkeke/article/details/136697057机器学习模型如何表示单个单词,这是一个相对没有争议的问题:它是分类特征(来自预定义集合的值),我们知道如何处理。它应该被编码......
  • OpenMP - 编译制导(五)task、team
    task制导显式地将代码块作为任务创建,并将这些任务分配给线程池中的线程执行,多个任务可以并行执行,每个任务都可能在不同的线程上执行。通过#pragmaomptask指令来创建任务,以及通过#pragmaomptaskwait指令来等待任务的完成。#include<iostream>#include<omp.h>usingnamesp......
  • 安装交叉编译器
    参考博客:安装交叉编译器arm-linux-gnueabihf-gccLinaro官网:https://www.linaro.org/downloads/ 下载完编译器安装包之后,使用:tar-Jxvfgcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz解压安装包,pwd获取当前目录,可见目录下有lib和bin两个文件夹。在~/.ba......
  • 使用systemctl来管理手动编译安装的Nginx
    FastDFS(https://github.com/happyfish100/fastdfs/wiki)推荐的nginx启动方式是直接执行/usr/local/nginx/sbin/nginx如果配成用systemctl管理的话,更符合常规使用习惯,而且可以设为开机启动,具体如下:/lib/systemd/system/nginx.service[Unit]Description=nginx-highperform......
  • 后端返回的数据结构可能是多样的,前端需要对数据进行处理,以适应页面展示的需求。请给出
    在前端开发中,针对后端返回的多变数据结构进行处理以适应页面展示需求的最佳实践包括以下几个方面:定义清晰的数据模型:在前端根据UI设计和功能需求明确所需的数据结构,并创建对应的JavaScript对象模型(或使用TypeScript等类型语言提供静态类型检查)。这有助于前端开发者预先了解......
  • 前端开发时,应该如何考虑开发的主次先后,比如数据结构、数据流转、UI绘制,js逻辑等等,请给
    前端开发时,应该如何考虑开发的主次先后,比如数据结构、数据流转、UI绘制,js逻辑等等,请给出你的最佳实践在前端开发中,正确规划和安排各项任务的主次先后对于项目的顺利进行至关重要。以下是一个针对数据结构、数据流转、UI绘制以及JavaScript逻辑等方面的开发优先级与最佳实践建议:......
  • 深度学习入门:基于Python的理论与实践 笔记
    深度学习入门:基于Python的理论与实践笔记一,Python基础由于本人之前已经系统学习过Python,此处只总结有关深度学习的Python的库NumPy生成NumPy数组要生成NumPy数组,需要使用np.array()方法。np.array()接收Python列表作为参数,生成NumPy数组(numpy.ndarray)>>>x=np.array......
  • 深入理解 Java 多线程、Lambda 表达式及线程安全最佳实践
    Java线程线程使程序能够通过同时执行多个任务而更有效地运行。线程可用于在不中断主程序的情况下在后台执行复杂的任务。创建线程有两种创建线程的方式。扩展Thread类可以通过扩展Thread类并覆盖其run()方法来创建线程:publicclassMyThreadextendsThread{public......
  • 深入了解WebAssembly:编译与测试指南
    在当今的Web开发中,WebAssembly(简称Wasm)作为一种新型的低级字节码格式,正在逐渐流行。它提供了一种高效的方式,使得在Web浏览器中运行性能密集型应用程序成为可能。这里我们将深入探讨如何编译和测试Wasm文件,以及相关的最佳实践和工具。1.WebAssembly简介: WebAssembly(Wasm)是一......
  • 算法进阶之路:十大经典排序算法详解与实践
    算法进阶之路:十大经典排序算法详解与实践在计算机科学的世界里,排序算法是基础且至关重要的一环。无论是数据库查询、数据分析还是日常的编程任务,高效的排序算法都能显著提升程序的性能。本文将带你深入了解十大经典排序算法,包括它们的原理、优缺点以及代码实现,帮助你在算法......