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. 速度快
以TCC开发的程序可运行于x86(16/32位)与x86-64(64位)环境中,运行比GCC较来得相当快速。程序亦可以包含汇编语言(inline Assembler)于其中运行与编译 

3. 无限制
其他C语言的动态Library祗要符合ISO C99规范,皆可以给予TCC来使用与编译

4. 安全性
TCC包含一个可选的memory(存储器)和boundschecker(程序检测器),经过检测的代码可以随意地混合于标准代码内,其他,TCC为命令行式的使用,目前并无集成性开发环境,但可以配合其他的编辑软件使用(如:UltraEdit ...等)

5. TinyCC (简称TCC)是一个小且很快的C编译器。不像其他C编译器,他可以自依赖,我们不需要扩展汇编器或连接器,因为TCC已经准备好了 

6. TCC还可以用于C脚本,例如一段C代码可以像Perl或Python脚本那样运行。编译速度很快,有如可执行文件一样(把编译语言当成解释型脚本使用)

7. TCC还会自动生成所有C指针操作的内存边界检查。TCC做这些是无需补丁库的 

8. 使用libtcc,你可以用TCC作为动态代码生成的后端

0x2: TCC的应用场景

需要明白的是,Tcc是一款小巧的嵌入式的编译器,对于需要使用Tcc的程序来说,需要把Tcc的源代码合并到主程序中一起编译,编译完成后,主程序就具备了"代码编译"这个能力,可以对外提供即时代码编译,可以允许外部第三方程序传入C源代码,进行即使编译并在内存中直接执行

1. Google Andriod系统: 曾经将Tcc内置于其中,于Andriod 2.0版本中
2. libacc: Android 2.0内置的轻量级C Compiler
3. 通过libtcc来扩充C语言
4. Cinpy: 一个Python的库,它可以让你在Python的模块中实现C的函数
5. PHP TCC 扩展: 让PHP直接执行C代码,无需编译

0x3: 使用汇编语言

inyCC即集成了Assembly于其中,使用TinyCC assembler的语法兼容于GNU assembler即可,但是使用时仍是有限制条件如下

1. 必须是C或C++的指令有支持
2. 由于指针符号相同于C,所以无法使用符号有"."或"$"
3. 支持32位为主
4. 必须为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安装配置

1. 编译成可执行文件
tcc.exe <filename.c>

2. 编译结果只会存放于记忆中而己,运行完毕后即释放,而不会产生对应的可执行文件(即EXE)
tcc -run <filename.c>

Relevant Link:

http://bellard.org/tcc/
http://zh.wikipedia.org/wiki/Tiny_C_Compiler

3. Tcc Programing

如果要在Tcc的C源码中使用到第三方库的头文件,需要显式在编译命令行中指明库文件的位置

1. -B 选项
设置 tcc 寻找函数库文件的路径

2. -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<=1: return 1
    return fibpy(x-1)+fibpy(x-2)

# Fibonacci in C
fibc=cinpy.defc("fib",
                ctypes.CFUNCTYPE(ctypes.c_long,ctypes.c_int),
                """
                long fib(int x) {
                    if (x<=1) return 1;
                    return fib(x-1)+fib(x-2);
                }
                """)

# ...and then just use them...
# (there _is_ a difference in the performance)
print fibpy(30)
print fibc(30)

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 0;
}

0x4: 从命令行使用Tcc

TCC可以使用"-"选项,从标准输入读入C源码来替换输入文件,例如

echo ‘main(){puts("hello");}‘ | tcc -run -

0x5: 在 Shell 管道中使用 TCC

TCC 和 Shell 管道的配合有两个方面

1. TCC 编译器本身如何使用管道
在 GNU/Linux 系统上处理管道输入的常见的办法,是让命令行程序可以处理特殊的减号(-)作为命令行参数。本来需要从某一个文件读取输入数据的命令行程序,在接收到这个减号作为命令行参数以后,就改为从标准输入(stdin)读取数据。这样就可以和 Shell 的管道机制配合起来。但是在当前的 TCC 0.9.19 版本中还不能处理这个减号作为命令行参数。不过我们可以有一个替代的办法,就是利用 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 来代替

2. 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 0;
}

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

时间: 2024-11-10 13:04:28

Tiny C Compiler(Tcc)的相关文章

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开发的,这位大牛还开

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

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语言文本 解释执行,就是不编译,直接运行. 写

libtcc源码分析(一)概览

关于libtcc .... libtcc的源码仓库:libtcc libtcc是一个微型的C编译器,它可以将C源码直接编译成机器码,并且通过libtcc提供的接口函数,在宿主程序里可以很方便的获取到libtcc编译后的函数或变量地址,这样相比其他脚本语言,libtcc就具有了以下的特点: 脚本完全使用c语言编写,对大多数用c语言入门的人来说,几乎没有任何学习成本,但是同样,处理字符串会变得和c一样麻烦 速度,libtcc是直接将源码文件(或者可以说脚本文件)直接编译成机器码的,在编译一次后,再执

【干货】国外程序员整理的 C++ 资源大全【转】

来自 https://github.com/fffaraz/awesome-cpp A curated list of awesome C/C++ frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff Standard Libraries C++ Standard Library - including STL Containers, STL Aglorithm, STL Functio

ubuntu下如何配置codeblocks字体颜色主题

1.在ubuntu的home中ctrl+h显示隐藏文件夹,找到一个.codeblocks的文件夹,然后那个文件夹中有一个default.conf的文件,选择打开方式gedit.然后将下面的代码复制进去,在复制进去之前,最好将你自己的配置文件备份好. 配置代码: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <CodeBlocksConfig version=&q

C 语言学习准备

摘要:用 C#语言学习了一些数据结构,突然想学习 C 语言,为了学习C,本文准备好资料. 作者:乌龙哈里 时间:2015-11-17 平台:Window7 64bit,Visual Studio Community 2015 参考: 章节: 编译器 IDE 编程入门资料 正文: 一.编译器: Tiny C Compiler 0.9.26-win64 官方主页 下载 查找了一些资料,想着本来就是学习之用,越方便越好,结果找到了 TCC,号称全世界最小的C编译器.下载解压后,比如放在D:\Tcc,在

windows 下修改codeblocks颜色主题

从http://blog.sina.com.cn/s/blog_7d6898410101e620.html出转载. 1. 在C盘下搜索文件default.conf,用文本编辑器打开.然后用下面的代码替代. 2. 可能用新的界面风格会看不到光标,这个在CodeBlocks内修改, Settings->Configure editor->Margins and caret->Caret->Colour,选择一个可以辨识的颜色. 3. 修改字体,字体修改在 Settings->Co

为什么计算机的学生要学习 Linux 开源技术

by falcon of TinyLab.org 2013/08/25 Linux开源相关技术对于学生来说,特别是计算机专业的学生来说,非常重要,下面就几个方面进行讨论: 研究平台 因为开源的优势,有非常多的开放的文案可以参考,有很多有趣的点子可以拿来做深入的研究.任何一个点挖进去都是一片天地. 专业视野 通过那些开放的项目,你可以通过邮件列表.Linkedin.Google Group接触到来自全球各地的天才,不仅可以提升英文读写能力,认识国际友人,还可以把握领域前沿,甚至还有机会得到大佬们的