/tiny-C-Compiler

C语言编译器,编译系统

Primary LanguageC

tiny-C-Compiler

简化版C语言编译器,编译系统。

简介(Introduction)

JCC是一个C语言的编译系统,包括编译器(compiler)、汇编器(assembler)和链接器(linker)。最后可以产生x86-elf格式的可执行文件。JCC的含义是Just Compiler Compiler

demo

How to compile

./run.sh

DOS下执行编译脚本,能够产生对应的二进制文件,其中用到的make工具已经放置在make_tool中。若您对代码二次修改,同样可以执行上述命令,这样可以更新JCC

编译源文件步骤,使用如下命令:

jcc.exe jcc src1 src2 ... [-option]

其中src1src2等是一系列的源文件,最后是编译选项,选择不同的编译选项,可以得到不同的目标文件。

-c # 将源文件编译为汇编文件
-s # 将汇编文件汇编为目标文件
-l [output] # 链接多个目标文件,输出可执行文件,其中输出文件名可选,默认值为a.out
-o [output] # 将源文件一步编译为可执行文件,其中输出文件名可选,默认值为a.out

环境(Environment)

OS: windows 10/11
g++:(x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.4.0
# 注意,由于用到了一些C++11的语法特性,要求gcc版本不能过低,至少要支持c++11
# 主要有冲突的部分是unordered_map这一数据类型,如果编译器不支持,请修改对应的容器为hash_map
running env: linux(Ubuntu-i386)
# 由于产生的目标文件是elf(32bit),因此最后在上述虚拟机中测试

附:虚拟机镜像地址

细节(Detail)

参见document

Demo

在文本编辑器中输入以下C语言的代码,这是一段求斐波那契数列的例子。

int Fibonacci(int k){
	if(k == 1 || k == 0){
		return 1;
	}else{
			return Fibonacci(k - 1) + Fibonacci(k - 2);
		}
}

int main(){
	for(int i=1;i<20;i=i+1){
		out << "fib(" + i + "):" + Fibonacci(i) + "\n";
	}
	return 0;
}

在命令行中,输入以下命令:

jcc.exe jcc ./demo/test.tc -o ./demo/fib.out

demo1

执行完成之后,屏幕显示成功输出文件fib.out

把二进制文件fib.out放到虚拟机中,执行。

chmod 777 ./test_dir2/fib.out
./fib.out

最后运行结果:

demo2

END

更新中,目前支持与不支持的语法:

  • struct
  • *(pointer)
  • i += 1 i -= 1 ...
  • i++ i--
  • enum
  • do-while
  • while
  • for
  • if-else
  • condition
  • && ||
  • switch-case
i++; # 暂时不支持自增和自减
i += 1 # 暂不支持所有的这类表达式

当然更加复杂的C语言结构也暂时不支持,例如结构体struct、指针以及一些enum关键字,上述不支持的语法,部分在后续可以得到完善。具体支持的语法特性见document