分享

TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己

 quasiceo 2017-12-17

原创 2015年03月22日 02:16:55

最近,在学习编译器技术, 研究了一下TCC, 记录一下。

Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器,而且是开源的, 小到只有约100K. (VC, GCC动不动几十M几百M的, 汗)

别看它小, 功能还是很强. 可以编译所有C99标准的ANSI C程序 ,  支持CPU包括:X86 32或64位, ARM,支持Windows, Linux, OSX.(跨平台跨系统的能力,比VC强)

TCC是由大牛Fabrice Bellard开发的,这位大牛还开发过 Qemu, FFMpeg (没有FFMpeg, 就没有抄它的腾讯视频,暴风影音...)


一、下载TCC

主页: http:///tcc/

下载页: http://download.savannah./releases/tinycc/


TCC最新版本是0.9.26

下载执行程序: tcc-0.9.26-win32-bin.zip  


无需安装的,只需要解压即可。

解压缩到  c:\tcc ,  可见目录下有 tcc.exe, 这个是编译器命令行程序,没有IDE界面的

将 c:\tcc 加入到 系统路径中 (PATH)后,则可以在任何命令行窗口中使用了。


二、使用TCC

用notepad写一个测试用的c程序,如下,存盘为 hello.c

  1. #include <stdio.h>  
  2.   
  3. main() {  
  4.     printf("hello,world\n");  
  5. }  

用tcc编译,命令如下:

   tcc hello.c

则将生成  hello.exe ,    运行hello.exe看看


TCC可以不编译C程序,而是把它直接运行,就像脚本解释语言那样。命令行如下:

    tcc  -run hello.c

效果:hello.c不需编译,直接运行了

这个将C程序直接运行的功能,是TCC独有的,其它C编译器都不行。



三、更多例程

     tcc\examples 目录下有几个例程

   

 fib.c 是一个标准C语言例程,不多说 , 编译它:tcc fib.c

    hello_win.c 是一个Windows GUI例程, 编译它:tcc hello_win.c

 dll.c 是一个dll 例程,编译它:

  tcc -shared dll.c       //生成dll.dll文件
tiny_impdef dll.dll  // 生成dll.def文件
        tcc hello_dll.c dll.def  //hello_dll.c 是调用 dll.dll 的例程


四,用TCC编译TCC

     书上一直是这样说的: C语言是自己编译自己的, 就是说C语言的编译器是用C语言写的,把编译器的源代码编译一下,就成了C语言编译器

 做一下这个实验: 用TCC编译TCC源码

 

 首先下载TCC的源码,下载页: http://download.savannah./releases/tinycc, 下载源码:tcc-0.9.26.tar.bz2

    解压缩到  c:\tcc-0.9.26

    其中的文件主要有:

    tcc.c  主程序

                libtcc.c  c语言标准库


 写一个BAT批处理文件,用于处理编译过程,存盘到c:\tcc-0.9.26\build.bat, 文件内容如下:

[plain] view plain copy
  1. @echo ====用TCC编译TCC====  
  2.   
  3. @set /p VERSION= < VERSION  
  4. @echo>config.h #define TCC_VERSION "%VERSION%"  
  5.   
  6. @echo 设置tcc为c语言编译器  
  7. @set CC=tcc  
  8. @set target=-DTCC_TARGET_PE -DTCC_TARGET_I386  
  9.   
  10. @echo 编译工具软件:tiny_impdef.exe, tiny_libmaker.exe  
  11. @%CC% %target% win32/tools/tiny_impdef.c -o tiny_impdef.exe  
  12. @%CC% %target% win32/tools/tiny_libmaker.c -o tiny_libmaker.exe  
  13.   
  14. @echo 编译libtcc.dll  
  15. @if not exist libtcc\nul mkdir libtcc  
  16. @%CC% %target% -w -shared -DLIBTCC_AS_DLL -DONE_SOURCE libtcc.c -o libtcc.dll -w  
  17. @tiny_impdef libtcc.dll -o libtcc/libtcc.def  
  18.   
  19. @echo 编译tc.exe  
  20. @%CC% %target% tcc.c -o tc.exe -ltcc -Llibtcc  
  21.   
  22.   
  23. @echo 编译结束, 生成文件:  tc.exe  


运行 build.bat, 结果如下

[plain] view plain copy
  1. C:\tcc-0.9.26>build  
  2. ====用TCC编译TCC====  
  3.  设置tcc为c语言编译器  
  4. 编译工具软件:tiny_impdef.exe, tiny_libmaker.exe  
  5. 编译libtcc.dll  
  6. 编译tc.exe  
  7. tcc.c:81: warning: assignment from incompatible pointer type  
  8. 编译结束, 生成文件:  tc.exe  


OK, 生成 tc.exe, 这个就是新的C语言编译器了


我让编译后生成的文件名是 tc.exe 而不是tcc.exe,  这样是为了方便与原始的编译器tcc.exe区分开


试用一下新的编译器tc.exe, 编译一下之前的 hello.c

 tc  hello.c

显示有错误:

[plain] view plain copy
  1. hello.c:1: error: include file 'stdio.h' not found  

为什么 stdio.h 没找到呢? 因为当前目录下的includes目录中没有stdio.h


新建一个目录    mkdir  c:\newtcc

把相关文件复制进去

copy c:\tcc-0.9.26\*.exe c:\newtcc

copy c:\tcc-0.9.26\libtcc.dll c:\newtcc

xcopy /E c:\tcc\include c:\newtcc\include\

xcopy /E c:\tcc\libtcc c:\newtcc\libtcc\

xcopy /E c:\tcc\lib c:\newtcc\lib\



再用新目录下的 tc.exe 作为编译器

c:\newtcc\tc.exe  hello.c

编译正确,生成 hello.exe

运行hello.exe, 则出现


hello, world


OK, 正确了


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多