Login
Newsletter
Di, 14. Juni 2005, 22:52

C-Programme interpretieren

C-Programme muß man normalerweise erst compilieren, bevor Änderungen im Quellcode wirksam werden - diesen Schritt kann man sich mitunter auch sparen.

C als Skriptsprache mag vielen ungewöhnlich vorkommen, wenn man sich aber vor Augen hält, daß auch bekannte Skriptsprachen wie Perl und Tcl eine C-ähnliche Syntax haben, sollte das nicht so abwegig sein. Probieren wir es aus anhand des folgenden trivialen Programms:

#include <stdlib.h>
#include <stdio.h>
#include <sys/vfs.h>

int main() {
  struct statfs s;

  int ret = statfs("/etc/fstab", &s);
  if (ret < 0) {
    perror("statfs");
    exit(-ret);
  }
  printf("Type: %ld\n", s.f_type);
  printf("Size: %ld\n", s.f_blocks);
  printf("Blocksize: %ld\n", s.f_bsize);
  return 0;
}

Nun gibt es nicht nur ein Programm unter Linux, das C-Programme interpretieren kann, sondern mehrere. Gefunden habe ich den Debugger UPS, den Tiny C Compiler und Cint. Nicht näher angesehen habe ich Ch Standard Edition und C COD.

Der UPS-Debugger enthält einen vollständigen C-Interpreter. Dieser wird jedoch per Default nicht compiliert. Man muß den Quellcode beschaffen, zuerst den Debugger bauen, ins Unterverzeichnis ups gehen und dort make cx cg xc aufrufen. Dann kann man den Interpreter mit

cg -I statfs.c

aufrufen. Leider stellt sich heraus, daß der Interpreter offenbar nicht mit den C++-Headern von GNU klarkommt, zumindest nicht mit long long. Schade, denn die Software kann offenbar auch eine Art Bytecode erzeugen. Im Unterverzeichnis interpreter ist das Ganze gut dokumentiert.

Tiny C kann C-Code als Skript ausführen. Dies kann man testen, indem man an den Anfang des Quellcodes folgende Zeile schreibt:

#!/usr/bin/tcc -run

Dann muß man den Code noch ausführbar machen und aufrufen:

chmod a+x statfs.c
./statfs.c

C++ bleibt hier natürlich außen vor. Es ist nicht ganz klar, ob der C-Code wirklich interpretiert oder zuerst compiliert wird. Interessant ist, daß TCC offenbar in der Lage ist, den gesamten Linux-Kernel zu interpretieren. Eine Bootdiskette, die das demonstriert, ist verfügbar.

Cint ist ein C- und C++-Interpreter, der 95% des Sprachumfangs abdeckt. Zur Compilierung und Installation des Programms verwendete ich folgende Befehle:

sh setup platform/linux_slackware9_gcc3
CINTSYSDIR=/home/hjb/cint-5.15
PATH=$PATH:$CINTSYSDIR
MANPATH=$MANPATH:$CINTSYSDIR/doc
export PATH CINTSYSDIR MANPATH

Nun kann man versuchen, ein C-Programm ausführen zu lassen oder zu debuggen. Mir gelang es mit keinem einzigen Programm, da es immer irgendwelche Fehler in Include-Dateien (die von gcc stammen) gab oder Symbole, die aus den Include-Dateien stammen, nicht gefunden wurden.

Fazit: C-Programme lassen sich unter Linux mit Hilfe von tcc als Skripte einsetzen. Mit C++ gelang mir das mit den getesteten Tools nicht. Vielleicht testet ja einmal jemand weitere Interpreter und fügt die Informationen zu einem ganzen Artikel zusammen.

  • Dieses Werk wurde von seinem Urheber zur uneingeschränkten Nutzung freigegeben und ist damit gemeinfrei (»public domain«).

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten