Autor Tema: Tiny C Compiler. Un pequeño compilador muy potente.  (Leído 8491 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Tiny C Compiler. Un pequeño compilador muy potente.
« en: 17 de Enero de 2013, 17:12:47 »
Quiero presentaros un pequeño compilador de C para ordenadores PC muy potente:

Tiny C Compiler

Es un ejecutable muy pequeño (100 kbytes) que puede incluirse en un disquette de rescate.
Es 8 veces más rápido compilando que el GCC.
Crea archivos binarios o ejecuta directamente en la memoria (como un lenguaje script)
Puede compilar todo el código de una distribución de Linux en pocos segundos y ejecutarla a continuación en memoria (cumple con ISOC99)
Es de código libre.

Saludos.
« Última modificación: 17 de Enero de 2013, 17:44:19 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Tiny C Compiler
« Respuesta #1 en: 17 de Enero de 2013, 17:15:54 »
El compilador proviene de un programa de C ofuscado que se escribió para ganar el International Obfuscated C Code Contest en 2002. El código fuente de este compilador original ocupaba sólo 2000 caracteres y era capaz de compilarse a si mismo.

Obfuscated Tiny C Compiler

Código fuente en C ofuscado del compilador de C:
Código: [Seleccionar]
#include <stdio.h>
#define k *(int*)
#define a if(
#define c ad()
#define i else
#define p while(
#define x *(char*)
#define b ==
#define V =calloc(1,99999)
#define f ()
#define J return
#define l ae(
#define n e)
#define u d!=
#define F int
#define y (j)
#define r m=
#define t +4
F d,z,C,h,P,K,ac,q,G,v,Q,R,D,L,W,M;
E(n{
x D++=e;
}
o f{
a L){
h=x L++;
a h b 2){
L=0;
h=W;
}
}
i h=fgetc(Q);
}
X f{
J isalnum(h)|h b 95;
}
Y f{
a h b 92){
o f;
a h b 110)h=10;
}
}
c{
F e,j,m;
p isspace(h)|h b 35){
a h b 35){
o f;
c;
a d b 536){
c;
E(32);
k d=1;
k(d t)=D;
}
p h!=10){
E(h);
o f;
}
E(h);
E(2);
}
o f;
}
C=0;
d=h;
a X f){
E(32);
M=D;
p X f){
E(h);
o f;
}
a isdigit(d)){
z=strtol(M,0,0);
d=2;
}
i{
x D=32;
d=strstr(R,M-1)-R;
x D=0;
d=d*8+256;
a d>536){
d=P+d;
a k d b 1){
L=k(d t);
W=h;
o f;
c;
}
}
}
}
i{
o f;
a d b 39){
d=2;
Y f;
z=h;
o f;
o f;
}
i a d b 47&h b 42){
o f;
p h){
p h!=42)o f;
o f;
a h b 47)h=0;
}
o f;
c;
}
i{
e="++#m--%am*@R<^1c/@%[_[H3c%@%[_[H3c+@.B#d-@%:_^BKd<<Z/03e>>`/03e<=0f>=/f<@.f>@1f==&g!='g&&k||#l&@.BCh^@.BSi|@.B+j~@/%Yd!@&d*@b";
p j=x e++){
r x e++;
z=0;
p(C=x e++-98)<0)z=z*64+C+64;
a j b d&(m b h|m b 64)){
a m b h){
o f;
d=1;
}
break;
}
}
}
}
}
l g){
p g&&g!=-1){
x q++=g;
g=g>>8;
}
}
A(n{
F g;
p n{
g=k e;
k e=q-e-4;
e=g;
}
}
s(g,n{
l g);
k q=e;
e=q;
q=q t;
J e;
}
H(n{
s(184,n;
}
B(n{
J s(233,n;
}
S(j,n{
l 1032325);
J s(132+j,n;
}
Z(n{
l 49465);
H(0);
l 15);
l e+144);
l 192);
}
N(j,n{
l j+131);
s((e<512)<<7|5,n;
}
T y{
F g,e,m,aa;
g=1;
a d b 34){
H(v);
p h!=34){
Y f;
x v++=h;
o f;
}
x v=0;
v=v t&-4;
o f;
c;
}
i{
aa=C;
r z;
e=d;
c;
a e b 2){
H(m);
}
i a aa b 2){
T(0);
s(185,0);
a e b 33)Z(m);
i l m);
}
i a e b 40){
w f;
c;
}
i a e b 42){
c;
e=d;
c;
c;
a d b 42){
c;
c;
c;
c;
e=0;
}
c;
T(0);
a d b 61){
c;
l 80);
w f;
l 89);
l 392+(e b 256));
}
i a n{
a e b 256)l 139);
i l 48655);
q++;
}
}
i a e b 38){
N(10,k d);
c;
}
i{
g=k e;
a!g)g=dlsym(0,M);
a d b 61&j){
c;
w f;
N(6,g);
}
i a u 40){
N(8,g);
a C b 11){
N(0,g);
l z);
c;
}
}
}
}
a d b 40){
a g b 1)l 80);
r s(60545,0);
c;
j=0;
p u 41){
w f;
s(2393225,j);
a d b 44)c;
j=j t;
}
k r j;
c;
a!g){
e=e t;
k e=s(232,k n;
}
i a g b 1){
s(2397439,j);
j=j t;
}
i{
s(232,g-q-5);
}
a j)s(50305,j);
}
}
O y{
F e,g,m;
a j--b 1)T(1);
i{
O y;
r 0;
p j b C){
g=d;
e=z;
c;
a j>8){
r S(e,m);
O y;
}
i{
l 80);
O y;
l 89);
a j b 4|j b 5){
Z(n;
}
i{
l n;
a g b 37)l 146);
}
}
}
a m&&j>8){
r S(e,m);
H(e^1);
B(5);
A(m);
H(n;
}
}
}
w f{
O(11);
}
U f{
w f;
J S(0,0);
}
I y{
F m,g,e;
a d b 288){
c;
c;
r U f;
c;
I y;
a d b 312){
c;
g=B(0);
A(m);
I y;
A(g);
}
i{
A(m);
}
}
i a d b 352|d b 504){
e=d;
c;
c;
a e b 352){
g=q;
r U f;
}
i{
a u 59)w f;
c;
g=q;
r 0;
a u 59)r U f;
c;
a u 41){
e=B(0);
w f;
B(g-q-5);
A(n;
g=e t;
}
}
c;
I(&m);
B(g-q-5);
A(m);
}
i a d b 123){
c;
ab(1);
p u 125)I y;
c;
}
i{
a d b 448){
c;
a u 59)w f;
K=B(K);
}
i a d b 400){
c;
k j=B(k j);
}
i a u 59)w f;
c;
}
}
ab y{
F m;
p d b 256|u-1&!j){
a d b 256){
c;
p u 59){
a j){
G=G t;
k d=-G;
}
i{
k d=v;
v=v t;
}
c;
a d b 44)c;
}
c;
}
i{
A(k(d t));
k d=q;
c;
c;
r 8;
p u 41){
k d=m;
r m t;
c;
a d b 44)c;
}
c;
K=G=0;
l 15042901);
r s(60545,0);
I(0);
A(K);
l 50121);
k r G;
}
}
}
main(g,n{
Q=stdin;
a g-->1){
e=e t;
Q=fopen(k e,"r");
}
D=strcpy(R V," int if else while break return for define main ")+48;
v V;
q=ac V;
P V;
o f;
c;
ab(0);
J(*(int(*)f)k(P+592))(g,n;
}

Edito: Esta versión sólo compila un pequeño subconjunto del C. No es un compilador de C99 completo.

Saludos.
« Última modificación: 17 de Enero de 2013, 17:42:56 por Picuino »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tiny C Compiler
« Respuesta #2 en: 17 de Enero de 2013, 17:34:02 »
Hola Picuino, conocía la versión ofuscada que era un pseudo-compilador. Gracias por la data !

Saludos !

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #3 en: 17 de Enero de 2013, 17:54:23 »
La versión ofuscada sólo puede compilar un subconjunto del C, pero el Tiny C Compiler es ya un compilador completo (acepta C99) y puede compilar y lanzar un kernel linux completo en pocos segundos.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #4 en: 17 de Enero de 2013, 18:01:58 »
Hola Picuino, si si tenes razón, estuve leyendo las especificaciones. Sabes si los fuentes están ?

Saludos !

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #5 en: 17 de Enero de 2013, 19:30:18 »
Los fuentes del Tiny C Compiler se distribuyen bajo licencia GNU Lesser General Public License:

tcc-0.9.25.tar.bz2

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #6 en: 17 de Enero de 2013, 19:31:28 »
Gracias !!!

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #7 en: 18 de Enero de 2013, 11:38:24 »
hola
este solo es el compilador
pero que ide recomiendas usar,
bien para windows o para linux?,

Un ejemplito demostracion en este hilo
y queda bordado el hilo.

Un Saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #8 en: 18 de Enero de 2013, 17:29:03 »
Eso va a gusto de cada uno. A mi me gustan UltraEdit y Notepad++.

También puedes trabajar con el notepad y la línea de comandos.

Almacenas este código en un archivo y le nombras hello.c
Código: [Seleccionar]
void main(void) {
   printf("Hello World\n");
}

Ahora hay que  bajarse TCC en la versión Windows y descomprimir los archivos.
A continuación ejecutas en la línea de comandos:

tcc -run hello.c

y el resultado es:

Código: [Seleccionar]
D:\tcc>tcc -run hello.c
Hello World

D:\tcc>_


Saludos.
« Última modificación: 18 de Enero de 2013, 17:36:31 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #9 en: 18 de Enero de 2013, 17:32:02 »
Una de las ventajas de este compilador es que ocupa sólo 100k.

Puedes generar código C99 con cualquier compilador/IDE y el código que generes será 100% compatible con TCC.

TCC sirve para ejecutar código sin necesidad de compilarlo. Puede ejecutar directamente los ficheros fuente de C compilándolos sobre la RAM "just in time" justo antes de ejecutarlo.

Para generar los ficheros fuente puedes utilizar el IDE que quieras.

Saludos.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Tiny C Compiler. Un pequeño compilador muy potente.
« Respuesta #10 en: 24 de Enero de 2013, 11:12:18 »
Gracias Picuino por la info.  ((:-))
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes