自制编译器篇(1):Cb 编译器的安装和使用
Author: stormQ
Created: Saturday, 27. February 2021 03:36PM
Last Modified: Saturday, 27. February 2021 08:08PM
本文介绍了如何在 64 位 Linux 系统中安装和使用 Cb 编译器的方法。
本节描述了在 Ubuntu 20.4 64-bit 系统中安装 Cb 编译器的步骤。
step 1: 安装 Cb 编译器的运行环境
运行 Cb 编译器需要 JRE(Java 运行时环境)。执行如下命令进行安装:
$ sudo apt install default-jre
安装完成后,查看 java 的版本:
$ java --version
openjdk 11.0.10 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
step 2: 安装依赖
$ sudo apt-get install -y gcc-multilib g++-multilib libc6-i386 lib32stdc++6
step 3: 安装 Cb 编译器
1) 下载 Cb 编译器
$ git clone https://github.com/leungwensen/cbc-ubuntu-64bit.git
2) 安装 Cb 编译器
$ cd cbc-ubuntu-64bit/
$ sudo ./install.sh
安装过程的输出:
prefix=/usr/local/cbc
mkdir -p /usr/local/cbc/bin
install -m755 bin/cbc /usr/local/cbc/bin
mkdir -p /usr/local/cbc/lib
cp lib/cbc.jar lib/libcbc.a /usr/local/cbc/lib
rm -rf /usr/local/cbc/import
cp -r import /usr/local/cbc/import
cbc successfully installed as /usr/local/cbc/bin/cbc
从上面的结果可以看出,Cb
编译器的存放路径为/usr/local/cbc/bin/cbc
。
3) 建立 cbc 软连接
为了能够直接使用cbc
命令,我们需要增加一个软连接:
$ sudo ln -s /usr/local/cbc/bin/cbc /usr/bin/cbc
4) 建立 cbc 别名
在 64-bit Linux 系统中,直接使用cbc
命令编译 Cb 程序,会报如下错误:
$ cbc ./hello.cb
hello.s: Assembler messages:
hello.s:9: Error: invalid instruction suffix for `push'
hello.s:12: Error: invalid instruction suffix for `push'
hello.s:19: Error: invalid instruction suffix for `pop'
cbc: error: as failed. (status 1)
cbc: error: compile error
我们需要以这样的方式使用——cbc -Wa,"--32" -Wl,"-melf_i386" ./hello.cb
,才可以正常编译 Cb 程序。为了方便,我们为其增加一个别名:
$ alias cbc='cbc -Wa,"--32" -Wl,"-melf_i386"'
此后,执行cbc
命令实际就是执行cbc -Wa,"--32" -Wl,"-melf_i386
。
本节描述了在 Ubuntu 20.4 64-bit 系统中编译并运行 Cb 程序的步骤。
step 1: 示例程序
hello.cb:
import stdio;
int main(void)
{
printf("Hello, World!\n");
return 0;
}
注:Cb 语言程序的源文件以.cb
结尾。
注意: 在 Cb 语言中,如果函数的参数列表为空,那么必须显式地添加void
关键字,否则会编译报错。
step 2: 编译 Cb 程序
$ cbc ./hello.cb
注:cbc
不需要添加任何选项,执行上述命令生成的可执行目标文件的名称就是hello
。
查看可执行目标文件hello
:
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, not stripped
从上面的结果可以看出,可执行目标文件hello
是一个 32 位程序。
step 3: 运行 Cb 程序
$ ./hello
Hello, World!
从上面的结果可以看出,可执行目标文件hello
正常输出了字符串Hello, World!
。
我们可以通过cbc --help
命令查看cbc
支持的选项。结果如下:
$ cbc --help
Usage: cbc [options] file...
Global Options:
--check-syntax Checks syntax and quit.
--dump-tokens Dumps tokens and quit.
--dump-ast Dumps AST and quit.
--dump-semantic Dumps AST after semantic checks and quit.
--dump-ir Dumps IR and quit.
--dump-asm Dumps AssemblyCode and quit.
--print-asm Prints assembly code and quit.
-S Generates an assembly file and quit.
-c Generates an object file and quit.
-o PATH Places output in file PATH.
-v Turn on verbose mode.
--version Shows compiler version and quit.
--help Prints this message and quit.
Optimization Options:
-O Enables optimization.
-O1, -O2, -O3 Equivalent to -O.
-Os Equivalent to -O.
-O0 Disables optimization (default).
Parser Options:
-I PATH Adds PATH as import file directory.
--debug-parser Dumps parsing process.
Code Generator Options:
-O Enables optimization.
-O1, -O2, -O3 Equivalent to -O.
-Os Equivalent to -O.
-O0 Disables optimization (default).
-fPIC Generates PIC assembly.
-fpic Equivalent to -fPIC.
-fPIE Generates PIE assembly.
-fpie Equivalent to -fPIE.
-fverbose-asm Generate assembly with verbose comments.
Assembler Options:
-Wa,OPT Passes OPT to the assembler (as).
-Xassembler OPT Passes OPT to the assembler (as).
Linker Options:
-l LIB Links the library LIB.
-L PATH Adds PATH as library directory.
-shared Generates shared library rather than executable.
-static Linkes only with static libraries.
-pie Generates PIE.
--readonly-got Generates read-only GOT (ld -z combreloc -z now -z relro).
-nostartfiles Do not link startup files.
-nodefaultlibs Do not link default libraries.
-nostdlib Enables -nostartfiles and -nodefaultlibs.
-Wl,OPT Passes OPT to the linker (ld).
-Xlinker OPT Passes OPT to the linker (ld).
下一篇:自制编译器篇(2):JavaCC 应用案例——解析正整数加法运算
上一篇:自制编译器之目录