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 <stdio.h>

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

时间: 2024-08-03 19:27:25

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

TCC研究(2) 把C语言当作脚本,解释执行,并嵌入各类程序

Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器. TCC有一个突出的特点:就是可以把C语言当作脚本使用.试用记录如下: 首先,安装好TCC. 在Windows下, 下载执行程序: tcc-0.9.26-win32-bin.zip. 解压到c:\tcc, 将c:\tcc添加到PATH目录中. 测试安装是否成功,在命令行窗口中打入命令   tcc -v , 看到TCC版本号即是成功 方式一: 以TCC解释执行C语言文本 解释执行,就是不编译,直接运行. 写

Tiny C Compiler(Tcc)

catalog 1. Tcc introduction 2. Tcc安装配置 3. Tcc Programing 1.  Tcc introduction TCC基本和GCC兼容 1. 符合ANSI C(C89/C90)规范 2. 符合新版的ISO C99标准规范 3. 兼容GNU C扩展的内嵌汇编语言(即inline assembler)功能汇编语言 0x1: TCC的特点 TCC与其他C语言编译器的不同处在于 1. 容量小 软件大小约为1MB左右,可存储于1.44MB的磁盘片中使用 2. 速

Tiny语言编译器简介

1.简介:编译器是将一种语言翻译成另一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.例如源代码为C/C++等高级语言,那么目标语言就是目标机器的机器代码,也就是可以直接运行的机器代码(各种二进制).下面就是一个编译过程的简单例子: x=2 (高级语言) MOV x,2 (汇编语言) C7 06 0000 0002 (机器代码) 2.相关程序 a.解释程序(interpreter):它会立即执行程序而不是编译完成后在执行,典型的解释程序有Java,Lisp等 b.汇

Tiny语言编译器简单介绍

1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够直接执行的机器代码(各种二进制). 以下就是一个编译过程的简单样例: x=2 (高级语言) MOV x,2 (汇编语言) C7 06 0000 0002 (机器代码) 2.相关程序 a.解释程序(interpreter):它会马上运行程序而不是编译完毕后在运行,典型的解释程序有Java,Lisp等

研究C语言的新型编译环境TCC

C语言综合研究1 搭建一个tcc环境 研究过程: 问题引出:为什么要使用tcc环境,甚至连图形界面都没有,为什么要使用这样的化境? 按照我们学习的本质来讲,可能是为了体验C语言底层的相关特性,但是在研究1中尚不能体会这点,所以这个问题待后续回答 我们将相关文件放到DOS环境下的C盘中去,用记事本书写一个简单的c程序. 使用c:\c\tcc a.c命令打算对.c文件进行编译. 发现,提示错误:不能找到a.c文件. 那么应该是无法识别路径,或者是相关的问题?那么推测是,难道tcc  环境在工作的时候

CentOS7最小化安装下源码编译搭建LAMP环境

CentOS7最小化安装 CentOS7官网下载:http://www.centos.org 1.为了方便与主机交换文件建立共享文件夹:点击对话框顶部"选项",选择"共享文件夹",右侧点击"总是启用"点击"添加"按提示添加自己想要添加的目录,然后点击"确认",完成虚拟机设置. 2.按"Enter"建,选择"install CentOS 7".选择"中文 Ch

Tcc学习笔记(一) 开篇

TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器.       Tiny C Compiler(缩写为TCC, tCc或TinyCC)用于x86(16/32位)或是x86-64(64位)系统的Ccompiler,而开发者为Fabrice Bellard.软件是设计用于低级电脑环境,或是于磁盘容量有限的空间中(1.44磁片或是硬盘).TCC是在GN

也谈 Euler Problem 13

题目 昨天,类型安全的心园友发表了一篇随笔"[Project Euler]加入欧拉 Problem 13 被卡住了,调试不出正确结果囧".这道题目是要求计算出下面的100个50位数字的和的前十位数字: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

用gdb调试程序笔记: 以段错误(Segmental fault)为例

用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5.gdb调试入门 一.背景介绍这个笔记主要介绍开源的程序调试器(gdb)的入门知识,目的是使unix/linux环境的编程新手能够快速学会使用gdb调试程序的方法,同时也是对我使用gdb的一个经验总结.本文假设你能使用简单的unix/linux命令并能用gcc(GNU C Compiler, GNU