Portable C Compiler (pcc)

Der PCC wurde unter der BSD Lizenz entwickelt und hat im Jahr 2011 die Version 1.0 erreicht - nach rund 30 Jahren^^. PCC war ursprünglich von "Stephen C. Johnson" von den "Bell Labs" in den 70ern entwickelt worden und war sehr lange der Standardcompiler in den BSD-Systemen, eben aufgrund seiner Lizenz. Die GNU/GPL Lizenz mag zwar weit verbreitet sein, ist jedoch aufgrund der CopyLeft Klausel um einiges restriktiver als die BSD Lizenz und der Umstieg auf den GNU C/C++ Compiler ist vielen BSD-Entwicklern ein Dorn im Auge.

Der PCC hat jedoch noch einen weiteren Vorteil. Die Compiler-Software ist sehr einfach gehalten und daher auch (fast) Ideal als Einstieg in den praxisnahen Compilerbau geeignet. Denn im Gegensatz zu den meisten Phantasiecompilern, die man im Studium und der Compilerliteratur so vorfindet, compiliert der PCC Standard C Code und produziert reale EXE/ELF-Dateien für Windows, Linux, MacOSX, usw.

Die Nachteile von PCC sind jedoch genauso schnell aufgezählt. Der Compiler hat eine bewegte Vergangenheit hinter sich, war zwar zeitweise in BSD Systemen der Standard, wurde aber nicht grundlos durch GNU C/C++ abgelöst und erst 2004 von dem Entwickler "Anders Magnusson" mit Hilfe von Spenden aus dem BSD-Fund wiederbelebt. PCC ist dennoch letztendlich eine One-Man-Show und selbst nach zig Jahren strotzt der Compiler nur so vor Fehlern (siehe offizielle Maillingliste auf der PCC Homepage), es fehlt die C++ Unterstützung und für das Assemblieren und Linken der Programme sollte weiterhin GNU C/C++ verwendet werden. Desweiteren bedient sich PCC massiv an fremden Quellen und Tools, siehe "Copyright(C) Caldera International Inc. 2001-2002" in versch. c-Dateien in den PCC Sourcen und in wie weit die Verwendung von "Flex", "Bison", sowie dem Linker/Assembler von GNUC/C++ gg. die BSD-Lizenz verstoßen ist noch zu prüfen. Zu guter Letzt gibt es selbst zw. den BSD-Systemen keine Einigkeit, denn während die OpenBSD Community sich dem PCC (in Ansi-C geschrieben) zugewandt hat, haben sich die FreeBSD-User (inkl. Apple) dem alternativen LLVM/Clang (in C++ geschrieben) verschrieben, welcher zwar weitaus moderner aber keineswegs bugfreier ist.

... wie auch immer, PCC ist jedenfalls ein C-Compiler.

 

Homepage:

=> http://pcc.ludd.ltu.se

 

PCC-CVS-Sourcen

Auf der Webseite werden die Sourcen zu dem Compiler zwar auch als tar.gz-Datei angeboten, allerdings sind die Dinger irgendwie beschädigt. Über einen CVS-Download kommt man aber problemlos an den Sourcecode, der übrigens in der Tat nur wenigen MB schlank ist. Sofern CVS noch nicht auf dem eigenen System vorhanden ist, muss es vorher installiert werden.

  • sudo apt-get install cvs
  • mkdir [pcc-src] (= beliebiges neues Verzeichnis für die Quellen)
  • cd  [pcc-src]
  • cvs -d :pserver:anonymous@pcc.ludd.ltu.se:/cvsroot checkout pcc

 

Linux

Der PCC Compiler ist ansich primär für den Einsatz unter BSD-Unix vorgesehen, unterstützt aber - zumindest lt. den Unterverzeichnissen des Compilers - auch Linux, Windows und MacOSX. Aufgrund der Nähe der Systeme entscheide ich mich für die ersten PCC-Compilierungsschritte für ein aktuelles Ubuntu-Linux (v10, 64bit.).

 

Bison+Flex

Um den PCC compilieren zu können sind die Tools "Bison" und "Flex" notwendig.

  • sudo apt-get install flex
  • sudo apt-get install bison

 

PCC Quellen compilieren

Anschl. kann der PCC mit folgenden Befehlen compiliert werden.

  • cd [pcc-src-verzeichnis]
  • ./configure
  • make
  • sudo make install

Der PCC-Compiler wird mit dem GNU C/C++ Compiler gebaut und dann autom. unter "/usr/local/bin/pcc" und "/usr/local/lib/pcc" abgelegt.

 

Mit PCC andere C-Quellen compilieren

Mit folgendem Befehl lassen sich dann andere C-Dateien kompilieren

  • pcc main.c ('main.c' = ein selbsterstelltes 'HelloWorld' Programm)
  • pcc -v -c main.c

Der 1. Befehl versucht nach dem Compilieren auch gleich die Objektdatei zu binden (linken). Der 2. Befehl wird die C-Datei nur compilieren (ohne zu linken), gibt jedoch detaillierte Infos aus (Parameter '-v' = verbose).

Leider lässt sich ein einfaches "Hello World" unter Linux nicht so einfach mit PCC kompilieren. Das liegt an den sog. Headerdateien. PCC liefert keine eigenen mit, sondern verwendet normalerweise die von den BSD-Unixen und hat aber gleichzeitig Probleme, wenn in Headerdateien #includes auf andere Headerdateien definiert wurden, diese aber nicht existieren! Andere Compiler geben dies nur als Warnung aus. Der PCC dagegen bricht die Kompilierung komplett ab. Nur leider benötigt selbst ein einfach "HelloWorld" bereits die Bibliothek für die Bildschrimausgabe 'stdio.h' und in dieser ist unter GNU/Linux ein Verweis auf die Headerdatei 'stddef.h' vermerkt, welche aber häufig nicht vorhanden ist. C/C++ mag ja normiert sein, die Hilfstools, wie der Pre-Compiler und der Links sind es aber nicht! PCC bricht die Kompilierung mit folgender Fehlermeldung ab:

  • /usr/include//stdio.h:34: error: cannot find 'stddef.h'

Aber auch später, wenn man das Header-Problem gelöst hat (in dem man bspw. die Headerdateien von OpenBSD verwendet), ist es mit PCC nicht möglich das Programm fertigzustellen, weil der Linker von PCC unter Linux nicht sauber arbeitet! Das Linken sollte man aktuell noch dem GNU C++ überlassen (bspw. mit'setarch i686 gcc -m32 -o test test.o').

... und schon hat man einen Grund, sich genauer mit den Sourcen zu PCC zu beschäftigen.^^

Netbeans

=> http://www.netbeans.org

Um den Quellcode von PCC bearbeiten und debuggen zu können, verwende ich Netbeans (aktuelle Version), da es eine sehr gute Unterstützung für C/C++ hat. Unter Linux wird in Netbeans idR. auch gleich ein Profil für den GNU C/C++ Compiler erstellt.

Anschließend erstellt man unter Netbeans ein "neues C/C++ Projekt mit bestehenden Quellen"

  1. Tab: Projekt
  2. Kontextmenü: "New Project"
  3. Categories C/C++
  4. Projects: C/C++ Project with Existing Source
  5. 'next' Button drücken
  6. Pfad mit den PCC Sourcen auswählen
  7. Tools-Collection = GNU
  8. Configuration Mod = Auto
  9. 'finish' Button drücken

Nach einer kurzen Zeit hat man dann den PCC SourceCode in Netbeans importiert. Netbeans wird dabei auch gleich einen eigenen Kompilierungsversuch durchführen. Wenn das aber bereits vorher auf der Konsole mit den og. 'configure/make/make install' funktioniert hat, dann klappt das idR. auch in Netbeans.