ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4396177
Jetzt (Chat):
15 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

FAQ - Frequently Asked Questions - Allgemeine Programmierung


Unterschiede zwischen C und C++ && aspectc Intro

Zitat:

C ist eine eher maschinennahe Programmiersprache, d.h. der Programmierer weiss z.B., das int * ein Pointer ist und auch als void * übergeben werden kann, oder gar in einen long gecastet. Die Grenze zu Assembler ist eher gering. Sicher kann man bis zu einem gewissem Maß in C auch objektorientiert programmieren, mit den seit C'99 verfügbaren Klassen umso mehr.

C++ abstrahiert das ganze ein wenig mehr. Der Geschwindigkeitsunterschied zu C ist marginal, die Hauptvorteile liegen eher im strengen statischen Typsystem von C++. Ein cast, wie oben beschrieben, wäre eine Todsünde im Sinne von C++. Der C++-Entwickler versucht möglichst generellen Code zu schreiben, der bereits durch sein Design die meisten Fehler bei der benutzung verhindert. Anstelle eines void-Pointers erwartet hier eine Funktion die Basisklasse oder ist eine Templatefunktion - wenn man casten muss, dann weiss man, dass man nicht im Sinne des Authors handelt.


Die Unterschiede sind generell eher ideologischer Natur. Eingefleischte Anhänger der strukturierten Programmierung nutzen häufig nur C, während die OOPler, nicht zuletzt mangels guten Compilern mit C'99-Unterstützung, mehr oder weniger dazu gezwungen sind, C++ zu verwenden.

Microsoft hat meines Wissens keine Pläne, C99 noch zu unterstützen. Im aktuellen Compiler wurde auch keine Anstrengungen unternommen, das zu tun.

Wer mal ein bisschen mit C99 herumexperimentieren möchte kann sich ja mal den Comau-Compiler angucken, 'nen Online-Test, wo man Quellcode in eine Textbox eingeben kann gibt's auch: www.comeaucomputing.com

von Cygon



Zitat:
Nun gut jetzt muss ich auch mal eine Lanze für C++ Brechen, ich kann mir kaum vorstellen, dass Oracle und Co auf C# oder gar Java umsteigen werden, grade Java ist für sehr große Software Projekte einfach nur mist. Auf der BS musste ich mir 1 Jahr Java antun, und ehrlich gesagt weiß nicht nicht, was die Leute daran finden, die Syntax ist im vergleich zu den C Sprachen einfach nur verschlimmbessert, oder besser Müll. In Sachen Programmierung ist es ein Rückschritt, genau wie C# ich finde es schon fast pervers wie einem als Programmierer dort die Freiheiten genommen wurden.

Zu C*, es handelt sich bei dem Namen um einen Vorschlag des AspectC++ Konsortiums, ist als nicht binden, wer Informationen dazu sucht, der sollte sich mal folgende HP anschauen:

http://www.aspectc.org/


AspectC++ oder C* hat nicht mehr viel gemein mit den Bisherigen OOP Techniken, und ist meiner Meinung nach, ein verdammt wichtiger schritt für die Softwareentwicklung. Wer schon einmal an größeren Projekten gearbeitet hat, wird die AOP schon nach ein paar stunden nicht mehr missen wollen. Die Mächtigkeit der C++ Eigenschaften wie templates oder präprozessor wird hier noch deutlicher, indem man bisherigen C++ Compilern die AOP Eigenschaft, einfach mit ein paar templates hinzugefügt hat. Ich finde es einfach nur absurd, dass es noch keiner der Großen Compiler herstellet umsetzt, da der Standart quasi fertig ist. Und ausnahmslos jedes Projekt zur AOP ein voller Erfolg war.

Kurz zur AOP

Der sinn und Zweck ist relativ simpel erklärt, in der OOP gibt es sein sehr großes Problem mit Abhängigkeiten zwischen klassen, was die eigentliche Integrität von Objekten in den grundfesten zerstört. Dazu mal ein Beispiel. Nehmen wir mal an wir haben eine Simple Listen klasse und möchten nun die Laufzeit der Methoden Push und Pop untersuchen, dazu steht uns eine klasse Profiler zur Verfügung. Der normale weg währe jetzt, eine Instanz der klasse Profiler in die Listen klasse zu holen, die Methoden Push und Pop zu ändern um die Zeitmessungen vornehmen zu können. Unnötig zu erwähnen, dass die Profiler klasse wiederum eine Protokoll klasse enthält usw… wir kenne ja das durcheinander was daraus entsteht nur alt zu gut.

In der AOP gibt es solche direkt in die klasse geholten Instanzen nicht mehr, und sind verboten, so dass die klassen in sich sauber bleiben. Stattdessen übergibt man nun bei der Objektkonstruktion nicht nur den Typ, des Objektes, sondern auch ein „Aspekt“ In unserem fall müssen die Push und Pop Methoden ja geändert werden, und dies erreichen wir mit einem „pointcut“ die Syntax schaut dabei so ähnlich aus.


Code:
aspect aProfilerList
{

Profiler;

// […]
pointcut pop()
{
    before Profiler->CountDownBegin();
    after    Profiler->CountDownEnd();
}

pointcut push()
{
    before Profiler->CountDownBegin();
    after    Profiler->CountDownEnd();
}
};


Im Prinzip erweitern wir hier über einen Aspekt die klasse Liste um die funktionalität der klasse Profiler, beide Klassen bleiben in sich 100% bestehen, und werden nur über den Aspekt miteinander verwoben, dies passiert über den neu hinzugekommenen „Object weaver“ und kann zur jeder zeit durchgeführt werden, Preecompiling , Compiling, Linking oder Runtime, je nachdem wann es sinnvoll, oder gewünscht ist. In diesem Beispiel werden die aufrufe der Methoden einfach vor „before“ der eigentlichen POP und danach „after“ aufgerufen.

Aspekte sind KEINE klassen, obwohl man von ihnen erben kann, sie können auch rein virtuell sein, und unterstützen template Mechanismen. Dem einen oder anderen wird es jetzt vielleicht dämmern wie einfach, und schnell, man nun komplexe Konstrukte erstellen kann. Diese Technik ist einfach nur genial, und ich möchte sie nicht mehr missen.

von Maverick



Zitat:


Ganz genau! C hat eigentlich nichts mit C++ zu tun, verstehe also gar nicht erst warum die Leute von C/C++ als eine Programmiersprache sprechen. C++ wurde von Stroustroup seperat erstellt, die Programmier-Paradigmen von C++ sind sowohl objektorientiert als auch prozedural/strukturiert. C++ soll also keine reine OO-Sprache sein, weil man damit auch Systemprogrammierung betreiben können muß!

Und nur weil C als Subset enthalten ist (hat auch strategische Gründe mit C als Untermenge um die alten C´ler zu ködern), heisst es noch lange nicht dass man C lernen sollte (im Gegenteil, C´ler können sich ihren alten C-Kram nicht abgewöhnen).
von Designer