|
|
Informatik - Computerwissenschaften
Der Stand der Dinge - eine politische Vorbemerkung
Wer heute in einer Fachbuchhandlung nach Literatur über Programmiersprachen sucht, wird
meterweise Bücher über C++, Java, Perl, Visual Basic, C finden, sowie einiges über
"Scripting-Languages" oder auch "Web-Languages".
Ferner werden ihm unzählige Bücher über HTML, XML, CSS, Datenbanken, ständig
neue Entwurfsmethodologien sowie Spezialbücher
aus der Unix/Linux Welt bzw. dem konkurrierenden Microsoft-Universum begegnen.
Sucht er hingegen Bücher über Algorithmen oder über die Programmiersprachen Eiffel, Ada,
Smalltalk oder Lisp wird er wahrscheinlich selbst in einer sehr gut sortierten Buchhandlung
nur auf ein oder zwei Bücher über Algorithmen stossen und Bücher zu Eiffel, Ada und Lisp
sollte er wohl besser gleich bei einem Internet-Buchhändler per Katalog bestellen - der
Buchladen seines Vertrauens wird sie nicht vorrätig haben.
Auf ernstzunehmende
Bücher zur Geschichte der Computertechnik, die die grossen Entwicklungslinien
aufzeigen und historische Vergleiche ermöglichen, braucht er übrigens gar nicht zu hoffen -
das wenige, was in der Buchhandlung ausliegt, sind oberflächlich zusammengeschriebene
Machwerke von Journalisten - immerhin kann sich der ernsthaft Interessierte mit wissenschaftlichen
Vorkenntnissen einiges an Quellenmaterial im Internet beschaffen, vieles bleibt jedoch
auf zahllose Fachartikel in den wissenschaftlichen Bibliotheken verstreut.
Der polemische Ton, den ich oben angeschlagen habe, wird es schon angedeutet haben: Ich halte
diesen Zustand nicht für ideal, sondern für die Kulmination von Fehlentwicklungen, die
seit Mitte der 80er Jahre ihren Anfang im Bereich der "Mikrocomputer" genommen haben.
Leider gibt es zu diesem ganzen Komplex noch keine konzentrierte geschichtliche Darstellung,
entweder in Buchform oder im Internet. Eine solche Darstellung würde enthüllen, dass noch
jenseits des allseits bekannten Krieges zwischen "Linux" und "Microsoft",
zwischen "Open Source" und "Intellectual Property" technische und
technik-organisatorische Chancen vertan wurden, deren Wahrnehmung uns eine völlig andere -
und bessere - Computerwelt beschert hätte.
Wer diese Behauptung an den Fakten überprüfen will, wird viele Einstiegspunkte auf meinen
Lisp-Seiten finden - besonders eine Erkundung der Geschichte der Lisp-Maschinen und ihres
legendären Betriebssystems "Genera" dürfte dem aufgeschlossenen Betrachter wohl die Augen
übergehen lassen.
C++ - Ideologie und Wahrheit
WWW C++ Information, FZ Jülich
Ian Joyner: C++ ?:A Critique of C++ (3rd ed.)
Die Linksammlung des renommierten FZ Jülich zum Thema C++ zeichnet sich nicht nur durch
ihre sinnvolle Zusammenstellung für denjenigen aus, der in C++ programmieren muss oder will,
sondern auch durch die Fairness, mit der Kritik an dieser Sprache
unter der Rubrik "C++ Critique" zugänglich gemacht wird.
Der (lange, genaue und materialreiche) Artikel von Joyner, der C und C++ einerseits
immanent kritisiert und andererseits mit Alternativen wie Eiffel vergleicht könnte für
manchen, der bisher schon ein leichtes Unbehagen über C++ empfand, zum Augenöffner werden.
Wer eher etwas positives über C++ lesen will, findet eine gute Übersicht
auf den Seiten des Erfinders, Bjarne Stroustrup.
C++: Konklusio
Alles in allem wird man, wohl oder übel, noch eine ganze Zeit mit C++ leben müssen und es ist - ich
will es gar nicht abstreiten - in C++ sehr viel möglich, wenn auch mit barocken Komplikationen
im Quellcode. Der Hauptvorteil von C++ wird aber wohl immer der folgende bleiben:
Es zwingt, wie auch C davor, den Programmierer zur Effizienz, indem es ihm keinen "leichten Weg"
eröffnet, wie (als extremster Gegensatz) Common Lisp ihn immer bereithält. Exploratives,
spielerisches Programmieren ist bei C++ nicht gefragt, hier wird konstruiert, vorgeplant
und dann so planmäßig umgesetzt, wie auf einer Großbaustelle der Baubetrieb abläuft. Dagegen gleicht
der Umgang mit Lisp eher der Gestaltung einer Plastik aus Lehm oder (wie von Paul Graham bemerkt)
dem Malen eines Ölgemäldes. Verschiedene Welten also...
Eine C++ Demo
Daß C++ auch schön sein kann, habe ich mit einem kleinen Spielprojekt entdeckt, wo ich versucht
habe, Grundfunktionen eines symbolischen Algebraprogramms - ich will hier nicht das Wort "System"
gebrauchen - in C++ möglichst elegant zu realisieren. Leider fehlt mir zum weiteren Ausbau die Zeit,
hätte ich unbegrenzt von ihr zur Verfügung, würde ich dieses Projekt schon aus Freude an der
Klarheit und Stringenz des Programmaufbaus sicherlich weitertreiben.
Wer interessiert ist: Polysim im gleichnamigen Ordner.
Und als tar.gz Download Polysim.tar.gz
Template Metaprogramming
Daß in C++ viel möglich ist, beweist übrigens das vielbewunderte "Template Metaprogramming", das
auf der "Entdeckung" beruhte, daß der Template-Instanziierunsprozeß Turing-vollständig ist.
(Man hatte das lange Zeit übersehen, obwohl die Standard-kompatiblen Compiler diese Möglichkeit
längst boten. C++ hatte sich wieder einmal als "Wundertüte" erwiesen). Ein Beispiel dafür liefert
der folgende Code, der meine persönliche Rekonstruktion dieser Idee wiedergibt:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
vector<int> v;
template<int i> class f {
public:
const static int val = i * f<i-1>::val;
};
template<> class f<1> {
public:
const static int val = 1;
};
template<int x, bool a, bool b> class isf {
public:
const static bool val = b;
};
template<bool a, bool b> class isf<0,a,b> {
public:
const static bool val = a;
};
template<bool x> void isfb (int j) {
v.push_back(j);
};
template<> void isfb<false> (int j) {
return;
};
template<bool x, int tval, int fval> class myif {
public:
const static int val = tval;
};
template<int tval, int fval> class myif<false, tval, fval> {
public:
const static int val = fval;
};
template<int i, int j> class p {
public:
const static bool val =
isf<(i % j),false,p<i,j-1>::val>::val;
};
template<int i> class p<i,1> {
public:
const static bool val = true;
};
template<int i> void l() {
const bool bb = p<i,i-1>::val;
isfb<bb>(i);
l<i-1>();
};
template<> void l<1>() { return; }
int main (int argc, char* argv[]) {
int ff = f<12>::val;
cout << "fak = " << ff << endl;
l<25>();
cout << "test = " << myif<1==0,12,22>::val << endl;
typedef vector<int>::iterator vintIt;
for (vintIt it = v.begin(); it < v.end(); it++ ) {
cout << *it << endl;
};
};
Wenn man das mit gcc -S ee.cpp -O2 übersetzt (ee.cpp enthalte den obigen Programmtext)
so findet man in ee.s... (wird nicht verraten...).
...to be continued !
|
|