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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM