# cjcc **Repository Path**: ddaren/cjcc ## Basic Information - **Project Name**: cjcc - **Description**: Write a C compiler in cangjie lang. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-06 - **Last Updated**: 2024-11-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 为什么 很多很多年前,我刚开始接触电脑时,程序对我来说,就像魔法,神秘、神奇,我甚至很难想象那些会写程序的人们是怎么做到的。后来,自己会写一点程序了,知道程序背后有一个编译器(或解释器,或二者都有)。于是,编译器这个黑盒子又对我不时发出“诱惑”——它是怎么把我写的人类可读的字符串变成机器可以执行的代码的?为了回答自己的问题,我看了一些书,比如编译原理之类,但中途都放弃了,因为,就像看别人解释怎么游泳而不去自己游,总感觉中间还隔着很远的路。 一晃又过去很久,久到我每次想起编译器,它的形象就会变大一点,直到快变成一个我认为此生都没有时间再去处理的庞然大物。然而,有那么一天,我遇到了:1.《用 GO 语言写一个解释器》和《用 GO 语言写一个解释器》这两本书,作者都是 [Thorsten Ball](https://interpreterbook.com/) 。2. [chibicc](https://github.com/rui314/chibicc) ,一个用 C 语言实现的 C 编译器。当然,还有一些其他人写的关于自己动手实现系列的书和文章。于是,解释器、编译器的神秘面纱被慢慢揭开。我把这一发现的过程记录在这里,体现在 git log 里面,因此,这个项目就是我的学习笔记。在这一过程中我学到了很多,现在公开这个项目,是希望能吸引到一些有共同兴趣的伙伴,一起学习,一起享受写程序的乐趣。 以上就是这个项目的起因和动机。 最后,必须要指出的是,里面的 parser 和 codegen 部分有大量的代码借鉴(说抄袭也可)了 chibicc,感谢 chibicc 的作者。 # 是什么 目前阶段:这是一个可以将 C 源代码编译成 x86 汇编码( AT&T 风格)的编译器。 # 体验一下? 实现语言是华为最新的“仓颉”语言,所以要编译这些代码,仓颉编译器是必须的依赖项。另,还需要一个能将 x86 汇编码编译成机器码,并解决链接问题的编译器。下面是操作步骤: 假设你在项目文件夹下有一个 tmp.c 的 C 源代码文件需要编译。 首先,在项目文件夹下执行 ```cjpm build -i``` 。 然后,执行 ```./target/release/bin/main tmp.c``` 。 此时你将得到一个名为 ```tmp.s``` 文件。 第三步,执行 ```gcc -static -o tmp tmp.s``` ,得到 ```tmp``` 可执行文件。 # 运行测试 执行 ```cjpm test src/codegen```即可。 # 参考资料 1. Thorsten Ball: [Writing An Interpreter In Go](https://interpreterbook.com) , [Write A Compiler In Go](https://compilerbook.com/) 2. [chibicc](https://github.com/rui314/chibicc) 3. [c4](https://github.com/rswier/c4) 4. Pete Novig: [lispy](http://norvig.com/lispy.html), [lispy2](http://norvig.com/lispy2.html) 5. 王垠:[怎样写一个解释器](http://www.yinwang.org/blog-cn/2012/08/01/interpreter) 6. [How to implement a programming language in JavaScript](https://lisperator.net/pltut/) 7. [the-super-tiny-compiler](https://github.com/jamiebuilds/the-super-tiny-compiler) 8. [x86 and amd64 instruction reference](https://www.felixcloutier.com/x86/) # LICENSE MIT.