C Code in einem C++ Compiler übersetzen


Der folgende C-Code gibt Primzahlen aus. Er ist rein prozedural geschrieben und enthält keinerlei C++ Sprachelemente. Wenn man ihn in der Datei prim.c speichert kann man ihn ganz normal mit GCC übersetzen. Aber lässt sich der selbe Code auch unter C++ ausführen? Die Antwort lautet ja, man speichert ihn in die Datei prim.cpp und verwendet den clang Compiler. Er kann das schlüsselwort printf genauso verarbeiten.

#include<stdio.h>

int main() {
  for(int a = 0; a < 1000000; a = a + 1 ) {
    int flag=0;
    for(int b = 2; b <= a/2; b = b + 1 ) {
      if(a%b==0) {
        flag=1;
        break;
      }
    }
    if (flag==0) printf("%d\n",a);
  }
	return 0;
}

Aber wie ist die Ablaufgeschwindigkeit der Binärdatei? Sie ist mit GCC am schnellsten, die anderen C und C++ Compiler sind geringfügig langsamer:

gcc 1.c -O3        real	0m53.965s
g++ 2.cpp -O3      real	0m54.221s
clang++-3.8 2.cpp -O3   real 1m0.305s
clang-3.8 -O3 1.c         real	1m0.339s

In einem Podcast über C++ war mal zu hören, dass wenn man alle Programmiersprachen verbieten würde und nur eine einzige erlaubt sei, dass dann C++ übrigbleiben würde. Leider ist das nicht ganz richtig, weil nicht C++ sondern C übrig bleiben dürfte. Also reines C ohne diesen objektorientierten Quatsch und ohne den Unsinn mit den cout Befehlen.

Ein wenig anders sieht die Lage aus, wenn man dezidierte C++ Frameworks wie SFML verwenden möchte. Wenn man die folgende .c Datei in einem GCC Compiler übersetzen will, gibt es eine Fehlermeldung. Wenn man hingegen den g++ Compiler verwendet funktioniert es tadellos.

#include <stdio.h>
#include <SFML/Graphics.hpp>

int main() {
  sf::RenderWindow window;
  window.create(sf::VideoMode(400, 225), "window");
  while (window.isOpen()) {     
    window.clear(sf::Color(200,200,200));
    window.display();
  }
  return 0;
}

Obwohl SFML intern auf die OpenGL Bibliothek zugreift welche in klassischem C programmiert wurde, sind wohl noch einige Extras mit dabei welche den Anwender zwingen einen C++ Compiler einzusetzen. Dennoch kann auch mit SFML weitgehend in C programmieren und zwar dadurch dass man konsequent nur die C-Syntax des Compilers nutzt, also printf anstatt des Cout und auf Class-Befehle gänzlich verzichtet zugunsten von globalen static Variablen. Einige in der C++ Community behaupten, dies wäre schlechter Stil weil man prozedurale mit objektorientieren Methoden vermischt, doch wer bitteschön hat damit angefangen die Dinge zu verwässern? Richtig, C war die Sprache die zuerst da war und C Programmierer setzen die Standards.

Es gibt noch eine weitere Methode, und zwar installiert man zuerst die C-Bindings für SFML

sudo apt-get install libcsfml-dev

Anschließend muss man noch den Code anpassen, hier ein Beispiel Hello World für CSFML https://gist.github.com/def-/fee8bb041719337c8812 Da es in reinem C keine Klassen gibt, muss man dort alles über Pointer initialisieren. Das mag für SFML Kenner etwas kompliziert klingen die normalerweise mit C++ arbeiten ist aber mit etwas Übung langfristig einfacher zu warten als die unsinnige C++ Syntax. Die Spiele wären besser, wenn die Leute reine C Programme schreiben würden. Und nicht diesen Unsinn von Bjarne Stroustrup nachplappern wonach man objektorientierte Programmierung in einer kompilierten Sprache haben könnte.

Aber wenn man in C programmiert und keine Klassen verwendet gehen dadurch nicht auch die Vorteile von OOP verloren? Ja, das ist der Kompromiss den man eingehen muss. Er führt dazu, dass sich der Entwicklungsaufwand erhöht. Nur, bei der C Programmierung ist der Zeitaufwand egal weil es letztlich auf die Qualität ankommt. Also in welcher Geschwindigkeit der Code von der CPU ausgeführt wird, ob es Core-Dumps gibt und wie leicht man den Code in gängige Repositorien wie Ubuntu integriert bekommt. Wenn man hingegen auf einer High-Level-Ebene GUI Prototypen basteln möchte und noch gar nicht so genau weiß wie die Software einmal aussieht dann ist C die falsche Sprache dafür. Aber auch C++ und Java sind keine gute Wahl. Besser ist es, auf eine scripting OOP Sprache wie Python zu wechseln. Dort sind die Edit-Compile-Run Zyklen gegenüber C besser und man kann mit weniger Lines of Code zum gleichen Ziel gelangen. Das erkauft man sich jedoch mit einem 10x langsameren Code, häufigen Abstürzen und einem Work-in-Progress-Feeling was bedeutet, dass Python für Programmierer ein Traum ist, aber für Endanwendungen nicht gut genug ist.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s