zoukankan      html  css  js  c++  java
  • 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!
    ");
        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

  • 相关阅读:
    UVA1627-Team them up!(二分图判断+动态规划)
    UVA10817-Headmaster's Headache(动态规划基础)
    UVA1626-Brackets sequence(动态规划基础)
    UVA11584-Partitioning by Palindromes(动态规划基础)
    UVA11584-Partitioning by Palindromes(动态规划基础)
    UVA11400-Lighting System Design(动态规划基础)
    UVA12563-Jin Ge Jin Qu hao(动态规划基础)
    UVA116-Unidirectional TSP(动态规划基础)
    JavaScriptCore框架在iOS7中的对象交互和管理
    iOS7新JavaScriptCore框架入门介绍
  • 原文地址:https://www.cnblogs.com/LittleHann/p/4431974.html
Copyright © 2011-2022 走看看