最近,在学习编译器技术, 研究了一下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, 正确了
C语言发展到今天,有了不少C语言编译器相关的软件,通过了解比对,大约有以下这些比较主流好用的C语言编译器:
Dev-C++,Turbo C,mingw,WIN-TC,Cygwin,Visual stdudio,Visual c++6.0 ,Code::Blocks,C-Free,Tiny cc
今天,我们主要介绍以下tiny cc及其相关运用。
TCC(Tiny C Compiler)简介
Tin...
今天发现一个好玩的东西,简单的说,可以将C语言跟Python一样直接解析运行,而不用经过编译。像用Python一样直接运行一个hello.c文件,而不会生成任何 .obj .a .exe等中间文件(至于是否生成了其他地方不知道,反正hello.c所在的文件夹很干净啥也没有),现在请主角儿隆重出场,她就是 TinyCC。
tcc是一个轻量级的C语言编译器,根据官方介绍,完全支持ANSI C...
tinycc源码 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是一个超小、超快的标准C语言编译器。她可以从这里(http://bellard.org/tcc/)下载到;注意,要下载http://download.savannah.nongnu.org/releases/tinycc/tcc-0.9.25-win32-bin.zip
和notepad2一样,TCC也是免费的!(再一次酷毙了!!!)
下载好之后,...
一直想学习
编译器,偶然的机会接触到
TCC(
TinyC)
编译器源码。分析源代码是学习一个项目的最好的学习途径之一。自己最爱的母语—中文(汉语或华语)竟然没有一个
编译器。果断自己汉化一个。现将汉化源码分享出来。可以实现
编译器自举(自我迭代)。
zhi.c完整源码如下:
#导入 "zhi.h"
#如果 是_源文件
# 导入 "hexinku.c"
Seata TCC是一个分布式事务框架,它提供TCC(Try-Confirm-Cancel)模式来保证分布式事务的一致性。下面是一个简单的Seata TCC例子的解释:
1. 首先,客户端应用程序会向Seata TCC服务注册所需的分布式事务。在这个过程中,Seata TCC会生成一个全局事务ID,用于标识整个分布式事务。
2. 接着,Seata TCC会向各个参与者(例如数据库或缓存)发送“Try”请求,参与者需要回复“Try”或“Cancel”,以表示是否准备好执行事务。
3. 如果所有参与者都回复了“Try”,Seata TCC会继续向各个参与者发送“Confirm”请求,并等待参与者回复“Ack”表示确认执行事务。
4. 如果某个参与者在“Try”或“Confirm”阶段执行失败或未回复,“Cancel”请求将被发送到所有参与者,以取消事务。
5. 当所有参与者都回复“Ack”后,Seata TCC会提交整个事务,完成分布式事务的一致性。
以上是Seata TCC简单例子的原理解释。需要注意的是,Seata TCC的具体实现方式可能因版本不同而有所不同,开发者在使用时需要参考相应的文档和示例代码。
zym_123456: