自制编译器篇(1):Cb 编译器的安装和使用

Author: stormQ

Created: Saturday, 27. February 2021 03:36PM

Last Modified: Saturday, 27. February 2021 08:08PM



摘要

本文介绍了如何在 64 位 Linux 系统中安装和使用 Cb 编译器的方法。


安装 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:9Error: invalid instruction suffix for `push'
hello.s:12Error: invalid instruction suffix for `push'
hello.s:19Error: invalid instruction suffix for `pop'
cbc: erroras 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


一个简单的 Cb 语言程序

本节描述了在 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.2for GNU/Linux 3.2.0not stripped

从上面的结果可以看出,可执行目标文件hello是一个 32 位程序。

step 3: 运行 Cb 程序

$ ./hello 
Hello, World!

从上面的结果可以看出,可执行目标文件hello正常输出了字符串Hello, World!


Cb 编译器的使用

我们可以通过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).

References


下一篇:自制编译器篇(2):JavaCC 应用案例——解析正整数加法运算

上一篇:自制编译器之目录

首页