运行代码

本节阅读量:

这一节只解决一个很实际的问题:

1
看到课程里的命令时,知道自己在运行什么。

进入代码目录

每章代码都放在:

1
code/<chapter>/

例如第一章代码是:

1
code/01_numbers/

所以先进入第一章代码目录:

1
cd code/01_numbers

这里的 cd 是 change directory,意思是切换当前目录。后面的命令都会在这个目录里执行。

构建 mini

进入章节代码目录后,运行:

1
make

它会读取当前目录下的 Makefile,把这一章的 C++ 代码编译成一个小程序:

1
mini

mini 就是这一章的命令行工具。每章都有自己的 mini,所以读哪一章,就先进入哪一章的代码目录再运行 make

如果想清理生成出来的文件,可以运行:

1
make clean

然后再重新构建:

1
make

运行 mini

构建成功后,当前目录会出现:

1
mini

运行解释器:

1
./mini run examples/add.lang

这里的意思是:

1
2
3
./mini                 运行当前目录下的 mini
run                    使用解释器模式
examples/add.lang      输入程序文件

查看 AST:

1
./mini ast examples/add.lang

查看 IR:

1
./mini ir examples/add.lang

生成汇编:

1
./mini compile examples/add.lang -o out.s

这里的 -o out.s 表示:

1
把输出写到 out.s。

汇编怎么执行

out.s 还不是可以直接运行的程序。它只是汇编文本。

在 Linux、WSL 或常见 x86-64 环境里,完整流程是:

1
2
3
4
5
./mini compile examples/add.lang -o out.s
cat out.s
cc out.s -o out
./out
echo $?

其中:

1
2
3
4
cat out.s          查看生成的汇编文本
cc out.s -o out    把汇编组装、链接成可执行文件 out
./out              运行生成出来的程序
echo $?            查看上一个程序的退出码

如果 examples/add.lang 的内容是:

1
(+ 40 2)

最后应该看到:

1
42

注意,这里的 42 是程序退出码,不是 ./out 主动打印出来的内容。退出码通常只适合看小整数。后面章节如果需要真正打印结果,会用运行时或系统调用来做。

macOS 上的差异

macOS 上,程序入口名字通常是 _main,Linux 上通常是 mainmini compile 会按当前系统自动选择。也可以手动指定目标:

1
2
./mini compile examples/add.lang -o out.s --target macos
./mini compile examples/add.lang -o out.s --target linux

如果你在 Apple Silicon Mac 上,cc 默认可能按 arm64 汇编。但本课程生成的是 x86-64 汇编,所以链接时可以写:

1
cc -arch x86_64 out.s -o out

如果系统没有 x86-64 工具链或 Rosetta,这一步可能会失败。可以先换到 x86-64 Linux、Intel Mac,或者装好对应工具后再继续。

常见问题

如果看到:

1
make: command not found

说明当前命令行环境里没有 make

如果看到:

1
c++: command not found

说明当前环境里没有 C++ 编译器,或者编译器不在 PATH 里。

这两个问题都不是课程代码的问题,而是本机开发工具还没准备好。你可以先换到已经有 make 和 C++ 编译器的环境,例如 Linux、macOS 或 WSL。


0.0 路线图

上一节

0.2 命令是怎么进入代码的

下一节