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

最近,在学习编译器技术, 研究了一下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://bellard.org/tcc/

下载页: http://download.savannah.gnu.org/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

#include

main() {

printf("hello,world\n");

}

用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.gnu.org/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, 文件内容如下:

@echo ====用TCC编译TCC====

@set /p VERSION= < VERSION

@echo>config.h #define TCC_VERSION "%VERSION%"

@echo 设置tcc为c语言编译器

@set CC=tcc

@set target=-DTCC_TARGET_PE -DTCC_TARGET_I386

@echo 编译工具软件:tiny_impdef.exe, tiny_libmaker.exe

@%CC% %target% win32/tools/tiny_impdef.c -o tiny_impdef.exe

@%CC% %target% win32/tools/tiny_libmaker.c -o tiny_libmaker.exe

@echo 编译libtcc.dll

@if not exist libtcc\nul mkdir libtcc

@%CC% %target% -w -shared -DLIBTCC_AS_DLL -DONE_SOURCE libtcc.c -o libtcc.dll -w

@tiny_impdef libtcc.dll -o libtcc/libtcc.def

@echo 编译tc.exe

@%CC% %target% tcc.c -o tc.exe -ltcc -Llibtcc

@echo 编译结束, 生成文件:  tc.exe

运行 build.bat, 结果如下

C:\tcc-0.9.26>build

====用TCC编译TCC====

设置tcc为c语言编译器

编译工具软件:tiny_impdef.exe, tiny_libmaker.exe

编译libtcc.dll

编译tc.exe

tcc.c:81: warning: assignment from incompatible pointer type

编译结束, 生成文件: tc.exe

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

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

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

tc  hello.c

显示有错误:

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, 正确了

c语言自己编译自己,TCC研究(一): Tiny C Compiler最小的C语言编译器,自己编译自己...相关推荐

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

    Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器.第一课: 安装,试用, 用TCC编译自己 最近,在学习编译器技术, 研究了一下TCC, 记录一下. Tiny ...

  2. Tiny C Compiler最小的C语言编译器

    TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己,tcccompiler 最近,在学习编译器技术, 研究了一下TCC, 记录一下. Tiny C Compiler(简 ...

  3. c语言程序设计 长春大学,“C语言程序设计”双语教学改革研究.pdf

    · 150 · 价值工程 语言程序设计''双语教学改革研究 ResearchonBilingualEducationofC ProgrammingLanguage 郭来德①GuoLaide:窦玲②Do ...

  4. PL/0语言编译器扩展 编译原理课程实践(1)

    转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...

  5. 【CIPS 2016】(4-5章)语言认知模型、语言表示以及深度学习(研究进展、现状趋势)

    CIPS 2016 笔记整理 <中文信息处理发展报告(2016)>是中国中文信息学会召集专家对本领域学科方 向和前沿技术的一次梳理,官方定位是深度科普,旨在向政府.企业.媒体等对中文 信息 ...

  6. matlab里面的sul,MATLAB语言在电机控制系统仿真研究中的应用

    MATLAB语言在电机控制系统仿真研究中的应用 宋凌锋李立毅程树康 [摘要]简要介绍了MATLAB语言,并把MATLAB语言应用于电机控制系统的仿真研究中,同时以一个具体实例较为深入地对其进行了说明. ...

  7. 大模型“研究源”告急:2026年高质量语言数据或将耗尽

    Datawhale干货 作者:李梅  编辑:陈彩娴 来源:AI科技评论 审校:黄元帅 前 言 语言模型的缩放定律(Scaling law)表明,其规模大小取决于可用数据的数量,所以在过去几年,大约有一 ...

  8. (附源码)python《C语言程序设计》课程案例库研究 毕业设计 030946

    Python<C语言程序设计>课程案例库研究系统 摘 要 <C语言程序设计>课程案例库研究系统系统主要功能模块包括学生用户管理.管题库信息管理.题库练习等,采取面对对象的开发模 ...

  9. Go 语言又称 Golang,是谷歌(Google)开发的一种静态强类型、编译型、并发型的编程语言。2009 年 11 月 10 日,Go 语言以开源方式向全球发布,如今许多大公司纷纷选择使用 Go

    Go 语言又称 Golang,是谷歌(Google)开发的一种静态强类型.编译型.并发型的编程语言.2009 年 11 月 10 日,Go 语言以开源方式向全球发布,如今许多大公司纷纷选择使用 Go ...

最新文章

  1. SVD(奇异值分解)小结
  2. 各种SmartPhone上的跨平台开源框架的总结
  3. mongo connections url string 的问题
  4. windows下redis安装,注册成系统服务
  5. simulink 快捷键 运行_【泡泡读者来搞】ROS、Simulink、Carsim的互联与规划、控制算法的验证...
  6. 个人博客网站的设计与实现_基于BIS的网站建设的设计与实现
  7. WordPress——SMTP Error: Could not authenticate.
  8. asterisk queue 队列
  9. 也谈UpdatePanel与UrlRewrite一起work时出现Form Action属性的问题
  10. configure: error: gperf is needed
  11. select中常用的对象
  12. 递归算法的基本理解以及基本算法,多行注释详解,适合编程小白,刚接触递归的编程新手
  13. 如何免费CAJ完整转换成Word
  14. C#上位机工作感想2(2020.4.15-2021.7.24)
  15. ug初始化错误未能创建服务器,UG10.0提示初始化错误-15的处理操作方法
  16. java根据年份计算生肖
  17. cad化工设备绘图_化工CAD制图基础篇,管道布置图学起来
  18. 23、python对数据进行求和、方差、平均值等基本统计指标计算
  19. word批注怎么删除计算机名字,Word批注怎样删掉用户名
  20. deepin入坑前必读(懊悔篇)

热门文章

  1. ES6学习笔记03:变量的解构赋值
  2. 一般编译器错误_[翻译]MLIR:摩尔定律终结的编译器基础结构
  3. requestmapping注解访问404_开发人员都必须知道的Spring注解概览
  4. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结
  5. mybatis手动切换数据库_在Spring项目中使用 Mybatis 如何实现动态切换数据源
  6. Algorithms Part 1-Question 2-QuickSort-快速排序算法
  7. linux 运行程序的方法,linux 长期运行程序的 四种方法
  8. cleanmymac3.9.6_Spring Boot中文参考指南(2.1.6) 46.3.6、使用 JMX
  9. Vulkan in 30 minutes
  10. UE4 Roadmap