Tiny C Compiler(Tcc)
catalog
. Tcc introduction
. Tcc安装配置
. Tcc Programing
1. Tcc introduction
TCC基本和GCC兼容
. 符合ANSI C(C89/C90)规范
. 符合新版的ISO C99标准规范
. 兼容GNU C扩展的内嵌汇编语言(即inline assembler)功能汇编语言
0x1: TCC的特点
TCC与其他C语言编译器的不同处在于
. 容量小
软件大小约为1MB左右,可存储于1.44MB的磁盘片中使用 . 速度快
以TCC开发的程序可运行于x86(/32位)与x86-(64位)环境中,运行比GCC较来得相当快速。程序亦可以包含汇编语言(inline Assembler)于其中运行与编译 . 无限制
其他C语言的动态Library祗要符合ISO C99规范,皆可以给予TCC来使用与编译 . 安全性
TCC包含一个可选的memory(存储器)和boundschecker(程序检测器),经过检测的代码可以随意地混合于标准代码内,其他,TCC为命令行式的使用,目前并无集成性开发环境,但可以配合其他的编辑软件使用(如:UltraEdit ...等) . TinyCC (简称TCC)是一个小且很快的C编译器。不像其他C编译器,他可以自依赖,我们不需要扩展汇编器或连接器,因为TCC已经准备好了 . TCC还可以用于C脚本,例如一段C代码可以像Perl或Python脚本那样运行。编译速度很快,有如可执行文件一样(把编译语言当成解释型脚本使用) . TCC还会自动生成所有C指针操作的内存边界检查。TCC做这些是无需补丁库的 . 使用libtcc,你可以用TCC作为动态代码生成的后端
0x2: TCC的应用场景
需要明白的是,Tcc是一款小巧的嵌入式的编译器,对于需要使用Tcc的程序来说,需要把Tcc的源代码合并到主程序中一起编译,编译完成后,主程序就具备了"代码编译"这个能力,可以对外提供即时代码编译,可以允许外部第三方程序传入C源代码,进行即使编译并在内存中直接执行
. Google Andriod系统: 曾经将Tcc内置于其中,于Andriod .0版本中
. libacc: Android .0内置的轻量级C Compiler
. 通过libtcc来扩充C语言
. Cinpy: 一个Python的库,它可以让你在Python的模块中实现C的函数
. PHP TCC 扩展: 让PHP直接执行C代码,无需编译
0x3: 使用汇编语言
inyCC即集成了Assembly于其中,使用TinyCC assembler的语法兼容于GNU assembler即可,但是使用时仍是有限制条件如下
. 必须是C或C++的指令有支持
. 由于指针符号相同于C,所以无法使用符号有"."或"$"
. 支持32位为主
. 必须为inline Assembler内嵌汇编语言(或内联汇编大陆用语)使用
相关支持的汇编语言语法如下列所示
.align n[,value]
.skip n[,value]
.space n[,value]
.byte value1[,...]
.word value1[,...]
.short value1[,...]
.int value1[,...]
.long value1[,...]
.quad immediate_value1[,...]
.globl symbol
.global symbol
.section section
.text
.data
.bss
.fill repeat[,size[,value]]
.org n
.previous
.string string[,...]
.asciz string[,...]
.ascii string[,...]
Relevant Link:
http://zh.wikipedia.org/wiki/Tiny_C_Compiler
http://gashero.iteye.com/blog/1211797
2. Tcc安装配置
. 编译成可执行文件
tcc.exe <filename.c> . 编译结果只会存放于记忆中而己,运行完毕后即释放,而不会产生对应的可执行文件(即EXE)
tcc -run <filename.c>
aaarticlea/png;base64,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" alt="" />
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWkAAABhCAIAAACbPcfAAAAEXklEQVR4nO3dy5YURRAG4HolXoIX4REHBrl47JWAiOgDuPI2XARlo+5czLFtqjKjI6MKZhq+b1WTnRMZdcmfbu1zZnr59q8bN29NAENe/fG37ACGyQ6g4tWfsgMY91p2AAWyA6j4XXYABbIDqHjzTnYA4968+0d2AMNe+F4pUPDDj29lBzDsq+9fyA5g2JfPL27cvLV7X7nabmGzRrd2zds7LYXb3XtITuLhYZqm6eHzi8v3Hfu7lbxtzTmzCitjqPDS6BLBWTCkttuDW+AuXHcPv5tnx7S4c8G/D82am9z4j/NUDZ0XAdnx2Slnx3JaPL47kBlv1tktrKm/XOVD1G8u1yx+tKVM/XjRZvF40aHz6p1Lr05+fJPrzJYeJLIj0JzZu/H542Sp9fULbRTqZxba/7i+/kyzfn6tzLq9skMXNhjf8DqzmQfPVmVHc3JmJL9Q8BidRP3l/EPNV5PzhxxWWB4kj4/Wnx0f7T95YUf7WXmtSMlkx9EHN7jTvZF4PJi25hHMTNi2/tD85XXecA8cPa/McbL+/rhw/Zvjo/1seN3oWmZHbzvlH4J4Q9ae0WV7ozXjroKFVtbf5fbA0LoF8cmuX7f5K0fr9Irnr9s0eJ3ZzP1nm32/4/BxCW5wcrxXf2o9K+V1ewtt0n9+fvBj/voEkk0uD5a9xfXz/e8W8uPx6kfns4373174XikwTHYAFfdkB1AgO4AK2QFUyA6gQnYAFZfZMfr/86ctvq9xteI+T+IU4CqVsyOefCobL+jzVE4Brsa9p7JjN/oSMH3x9Lc4OzLv7TPjm3yWafYW1D8caS4d9yk7oOswO5Z7JsiUYHA5frROUq9sUH82p5kUm/cJn774fUcvU/auKjtmkXE0O5bTPmif8OnLZEfw66eSHcn+ZQdk5bOjuZc2yY7dfzINH80L2QEfw93qfyvdLeTHZz2sz45e/cyivT6XSwD/u8yOK2zA/oSTdPebX30nHRh2LjuAAtkBVMgOoOL8iewAxp0/+UV2AMNkB1AhO4CKO7IDKJAdQMWdx7IDGCc7gArZAVTcfvyz7ACGyQ6g4vYj2QGMkx1AhewAKmQHUHEmO4CCs0c/yQ5gmOwAKi6zo/mXSgp6f/TkGrrm7cF1t3/fMfoHjZpzZhVWxlDhpdElxAcUnX09z46p/yfXDn8x2Hib7MlekW03vPiAonJ2LKfF470PMsEHnHhyr8l8/fgsgEgmOwJDez5/nCy1vv7Rl4C2ldnRnJzc8MmFZnOSEVOuD6Ss+cwym9D7sTkSjwfTts0OwQFFy+zo7fz8JoyzI3Mc1G/2WasvOKDuMjt276uVOtzSQQAlx3v1p06W1dZdLtEUNwafo/37DibZAXmy45DsgCzZcUh2QJbsACpkB1AhO4AK2QFUyA6gQnYAFbIDqJAdQIXsACpkB1AhO4AK2QFUyA6gQnYAFbIDqJAdQIXsACpkB1AhO4AK2QFUyA6gQnYAFbIDqJAdQMG/9hcjM6ITT7wAAAAASUVORK5CYII=" alt="" />
Relevant Link:
http://bellard.org/tcc/
http://zh.wikipedia.org/wiki/Tiny_C_Compiler
3. Tcc Programing
如果要在Tcc的C源码中使用到第三方库的头文件,需要显式在编译命令行中指明库文件的位置
. -B 选项
设置 tcc 寻找函数库文件的路径 . -I 选项
设置 tcc 寻找 C 语言头文件的路径
0x1: PHP TCC
apt-get install tcc
直接使用pecl进行安装
yum install php-pear 进行安装
pecl install tcc
pecl install channel://pecl.php.net/tcc-0.1.2
code.php
<?php
$buf = 'int main(){printf("hello world"); return 0;}';
$tcc = tcc_new();
$ret = tcc_compile_string($tcc, $buf); $ret = tcc_run($tcc);
?>
0x2: Tcc in Python
Cinpy是一个Python的库,它可以让你在Python的模块中实现C的函数
import ctypes
import cinpy # Fibonacci in Python
def fibpy(x):
if x<=: return
return fibpy(x-)+fibpy(x-) # Fibonacci in C
fibc=cinpy.defc("fib",
ctypes.CFUNCTYPE(ctypes.c_long,ctypes.c_int),
"""
long fib(int x) {
if (x<=) return ;
return fib(x-)+fib(x-);
}
""") # ...and then just use them...
# (there _is_ a difference in the performance)
print fibpy()
print fibc()
0x3: 从脚本使用Tcc
CC可以从脚本调用,有如shell脚本一样。只需要将 #! /usr/local/bin/tcc -run 加到你的C源码开头即可
#! /usr/local/bin/tcc -run
#include <stdio.h> int main()
{
printf("Hello World!\n");
return ;
}
0x4: 从命令行使用Tcc
TCC可以使用"-"选项,从标准输入读入C源码来替换输入文件,例如
echo 'main(){puts("hello");}' | tcc -run -
0x5: 在 Shell 管道中使用 TCC
TCC 和 Shell 管道的配合有两个方面
. TCC 编译器本身如何使用管道
在 GNU/Linux 系统上处理管道输入的常见的办法,是让命令行程序可以处理特殊的减号(-)作为命令行参数。本来需要从某一个文件读取输入数据的命令行程序,在接收到这个减号作为命令行参数以后,就改为从标准输入(stdin)读取数据。这样就可以和 Shell 的管道机制配合起来。但是在当前的 TCC 0.9. 版本中还不能处理这个减号作为命令行参数。不过我们可以有一个替代的办法,就是利用 GNU/Linux 系统上的 /dev/stdin 设备文件
cat hello.c | tcc -run /dev/stdin
///dev/stdin 其实是一个指向 /dev/fd/0 的符号链接;而后者又是一个指向 /dev/pts/0 的符号链接。如果你的 GNU/Linux 系统上没有 /dev/stdin 的话,你还可以使用 /proc/self/fd/0 来代替 . TCC 编写的 C 语言脚本程序如何使用管道
只要在你的 C 语言脚本程序中恰到好处地使用标准输入(stdin)和标准输出(stdout)就可以
#include <stdio.h>
int main(int argc, char **argv)
{
int c;
while ((c = fgetc(stdin)) != EOF)
{
fputc(c, stdout);
fputc(c, stdout);
}
return ;
}
Relevant Link:
http://blog.csdn.net/shania_wang/article/details/5966492
http://blog.csdn.net/rainday0310/article/details/7618098
http://coolshell.cn/articles/786.html
https://www.ibm.com/developerworks/cn/linux/l-tinyc/part1/
Copyright (c) 2015 LittleHann All rights reserved
Tiny C Compiler(Tcc)的更多相关文章
- Tiny C Compiler简介-wiki
Tiny C Compiler(缩写为TCC.tCc或TinyCC)是一个用于x86(16/32位)或x86-64(64位)系统的C编译器,开发者为Fabrice Bellard.软件是设计用于低级计 ...
- TCC(Tiny C Compiler)介绍
TCC是一个超小.超快的标准C语言编译器.她可以从这里(http://bellard.org/tcc/)下载到:注意,要下载http://download.savannah.nongnu.org/re ...
- TCC : Tiny C Compiler (2018-2-6)
饭墙下载,有缘上传: https://files.cnblogs.com/files/bhfdz/tcc-0.9.27-win32-bin.zip https://files.cnblogs.com/ ...
- Tcc学习笔记(一) 开篇
TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器 ...
- Awesome C/C++
Awesome C/C++ A curated list of awesome C/C++ frameworks, libraries, resources, and shiny things. In ...
- CodeBlocks使用技巧
快键键 注释:选中后Shfit + C 取消注释:选中后Shfit + X 查找替换:Ctrl + R Build(Ctrl + F9) Run (Ctrl + F10) Build + Run (F ...
- C/C++ 框架,类库,资源集合
很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchrono ...
- awesome cpp
https://github.com/fffaraz/awesome-cpp Awesome C/C++ A curated list of awesome C/C++ frameworks, lib ...
- 【干货】国外程序员整理的 C++ 资源大全【转】
来自 https://github.com/fffaraz/awesome-cpp A curated list of awesome C/C++ frameworks, libraries, res ...
随机推荐
- mac上开启ftp
开启 sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist 关闭 sudo -s launchctl unload -w ...
- struts2: 玩转 rest-plugin
近期使用struts2的rest-plugin,参考官方示例struts2-rest-showcase,做了一个restful service小项目,但官网提供的这个示例过于简单,埋下了巨坑无数,下面 ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- 教你如何反编译Android安装文件apk来偷窥源代码
本文章首发于浩瀚先森博客,地址:http://www.guohao1206.com/2016/08/23/970.html 1. 准备 - java环境 安装java并配置环境 => JAVA环 ...
- "Timeout"在测试框架里是如何被实现的
今天组里的小伙伴问了我一个问题:“我这里有一个底层驱动的接口,我想在测试它的时候加上超时限制,时间一过就fail掉它,执行后面的测试用例.怎么办到呢?”.我问:“它自己没有超时响应的机制么? 超时抛e ...
- 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane
塔机力矩限制器,tower crane 适用于各种类型的固定臂塔机和可变臂塔机 塔机力矩限制器是塔式起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台,软件算法采用国内最先进的三滑轮取 ...
- Bootstrap系列 -- 8. 代码显示
一. Bootstrap中的代码块 代码块一般在博客中使用的较多,比较博客园中提供的贴代码. 在Bootstrap中提供了三种形式的代码显示 1. 使用<code></code> ...
- Android多线程文件下载
版本信息 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion " ...
- [AJAX系列]$.get(url,[data],[fn],[type])
$.get(url,[data],[fn],[type]) 概述 通过远程HTTP GET请求载入信息 参数 url:待载入页眉的URL地址 data:待发送key/value参数 callback: ...
- 使用ContentProvider进行应用程序间的数据交互
什么是ContentProvider: ContentProvider用来管理数据的访问规则.它允许你的应用程序向外界暴露需要被访问的数据. 是Android的四大组件之一. ContentProvi ...