Programm entdeckt: tcc

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Programm entdeckt: tcc

Beitrag von weedy » 07.12.2003 19:28:33

Ich habe neulich einen kleinen C-Compiler entdeckt, der und das Package, in dem er beheimatet ist, tcc heisst. Nun fragen sich sicherlich viele, warum man denn nun einen neuen C-Compiler brauchen könnte, es gibt doch den gcc. Das ist prinzipiell richtig und mann sollte für grössere Projekte auch den gcc nehmen, da er überall vorhanden ist und gewissermaßen den Standard unter Linux darstellt. Nun hat der tcc (Tiny C-Compiler) ein paar Eigenschaften, die ihn trotzdem sehr interessant machen: (1) er ist sehr klein, (2) er kompiliert schneller, als der gcc (selbst ausprobiert) und (3) er ist zum Scripten geeignet. Wer unter Linux häufig in C unterwegs ist, für den ist der tcc das wilkommene Scripting tool, denn um ein kleines Script zu schreiben( so, wie man es gelegentlich mit der Bash tut) ist in dem Fall kein allzugroßes Umdenken notwendig, und wer die Bash gut kennt, weiß, daß man auch da immer wieder auf Grenzen stößt, die sich in C vermeiden lassen.
Und so sieht das Ganze mal in Action aus:

Code: Alles auswählen

#!/usr/bin/tcc -run 

#include <stdio.h>

int main()
{
    printf("Hello World\n");
    return 0;
}

Der Compiler ist auch in der Lage, Libs zu linken, es gibt in der Package eine kleine Beispielsammlung (/usr/share/doc/tcc/examples), in der auch mal ein X-Fenster geöffnet wird.

Leider gibt es nicht (und darauf hatte ich ein bisschen gehofft, als ich den tcc zufällig fand und mal probehalber ausgepackt habe) die Möglichkeit, eval auszuführen. Von Scriptsprachen sollte man das eigentlich erwarten können. Da ich gerne mal Quellcode zur Laufzeit generiere, ist das ein nahezu unumgängliches Feature. Aber die Kleinigkeit und die damit verbundene Überschaubarkeit (im ggs. zum gcc) lassen mich hoffen, daß man irgendwann eine libtcc.so zu seinem Programm dazulinken kann und dann gibts auch eval unter C :-)

weedy.

Benutzeravatar
abi
Beiträge: 2219
Registriert: 20.12.2001 19:42:56
Wohnort: München
Kontaktdaten:

Beitrag von abi » 07.12.2003 21:31:54

sieht gut aus und ist in der Tat schön schnell.

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Beitrag von weedy » 08.12.2003 14:02:10

Sehr bequem ist im übrigen auch die Verwendung von tcc zusammen mit SQLITE, da SQLITE (Packages sqlite/libsqlite-dev/libsqlite0-dev) keinen extra Server benötigt und das eröffnet ganz andere Möglichkeiten in Bezug auf C-Scripting. Man kann quasi ohne grossen Installations und einrichtungsstress losproggen. Beispiel zu sqlite mit tcc:

Die Datei main3.c hat folgenden inhalt:

Code: Alles auswählen

#!/usr/bin/tcc -run -L/usr/lib/ -lsqlite

#include <stdio.h>
#include <sqlite.h>

int callback1( void* p1, int p2, char** p3, char** p4)
{
 {
  int i;
  for( i= 0; p3[ i]; i++) printf( "p3 %s ", p3[i ]);
  for( i= 0; p4[ i]; i++) printf( "p4 %s ", p4[i ]);
 }
 printf( "callback1 called p1 %d\n", p1);
 return 0; // hört bei 1 auf
}

int main()
{
 sqlite *sp= sqlite_open( "test3.db", 0 /* mode, notsupported, immer rw*/, NULL /* char **errmsg */);

 if( sp)
 {

  sqlite_exec( sp, "drop table a", NULL, NULL, NULL);
  sqlite_exec( sp, "create table a ( i int, k varchar)", NULL, NULL, NULL);
  sqlite_exec( sp, "insert into a ( i, k ) values( 3, 'd') ", NULL, NULL, NULL);
  sqlite_exec( sp, "insert into a ( i, k ) values( 5, 'x') ", NULL, NULL, NULL);


  printf( "select i from a:\n");
  sqlite_exec( sp, "select i from a", callback1, NULL, NULL);
  printf( "select i, k from a:\n");
  sqlite_exec( sp, "select i, k from a", callback1, NULL, NULL);

  close( sp);
 }

 return 0;
}

Das Programm legt ein File test3.db an, wenn es noch nicht existiert, ansonsten wird eine bestehende Datenbank geöffnet; deswegen muss man als erstes im Testbeispiel auch erstmal die Tabelle löschen und wieder anlegen, sonst wird die durch die folgenden Aufrufe (eintragen der Testdaten) immer größer mit jedem Aufruf von dem Programm main3.c. Für den Fall, daß man ein von überall aus zugängliches Programm schreiben wil sei angemerkt, daß sqlite das DB-File relativ zum cwd (CurrentWorkingDirectory) anlegt, so daß in dem Fall besser ein Absoluter Pfad für das File verwendet wird. Es kann natürlich auch Fälle geben, wo das DB-File gerade dort erzeugt werden soll, wo man sich befindet. Abschliessend sei noch angemerkt, daß sqlite von sich behauptet, schneller zu sein als Mysql.
Was will man mehr: ein schneller tcc und eine flotte sqlite-DB mit DB-File für C/SQL-Scripting; ideal für flotte Admins :-)

weedy.

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 08.12.2003 14:47:27

Habs jetzt mal verschoben. Ich denke, hier ist es besser aufgehoben.

Ja, klingt alles ganz interessant. Zumindest wenn man mit C besser vertraut ist als mit Perl/Python/...
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Ruhollah
Beiträge: 362
Registriert: 31.12.2002 15:18:09
Wohnort: Chemnitz

Beitrag von Ruhollah » 08.12.2003 15:09:17

Da kann man auch gleich die CSH nutzen.

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Beitrag von weedy » 08.12.2003 16:17:16

Ruhollah hat geschrieben:Da kann man auch gleich die CSH nutzen.
Kann man in der CSH libs zum Programm dazulinken? Und Headerfiles includen? Ne, irgendwie isses das nich. Wobei die CSH sicherlich ihre Berechtigung hat. Ich selber hatte z.B. mal eine Weile mit der ZSH geliebäugelt, aber die hat dann doch nicht alles gekonnt, was die BASH kann ( z.B. kann die nicht 'set -o vi') und deswegen bin ich dann doch zu den Roots zurückgewurzelt. Aber, den tcc zum Scripting zu verwenden, ist einfach ein ganz anderer Ansatzpunkt. Ok, der tcc bringt die notwendige Fähigkeit schon mit, womit man *.c-Binaries erstellen kann ( nämlich die Option -run), und sicherlich wäre dies mit einem kleinen Wrapper auch für den gcc gegangen. Aber der tcc ist eben einfach besser dafür geeignet, wg. Schlankheit und Schnelligkeit und deswegen denk ich jetzt doch schon eher mal daran, mit dem tcc zu Scripten. Der gcc ist dafür einfach etwas zu plump, gelinde gesagt.

weedy.

Antworten