Thema: Welches C ?

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#13

Re: Welches C ?

  Alt 26. Jan 2008, 18:11
Hi,
was man mal ganz klar sagen muss ist, dass die von Dir genannten C's (es gibt noch weitere, z.B. C-- und Objective C) komplett unterschiedliche Sprachen sind. Es wurde hier schon erwähnt, dass C++ eigentlich eine Objekt Orientierte Sprache ist (man merkt's halt nicht an jedem C++-Programm), das Gleiche gilt aber auch für C#. C# hat (wie auch schon mehrfach gesagt wurde) nicht wirklich viel mit C oder C++ gemeinsam. Wenn Du Java kannst, dann wird Dir vieles in C# bekannt vorkommen, einiges auch an Delphi erinnern (wie das Schlüsselwort override, in Java greift man eher zu Annoationen).

Ohne jetzt wirklich detailliert auf die Unterschiede eingehen zu wollen, kann man die Sprachen grob in bestimmte Kategorien unterteilen, für die diese entworfen wurden.

Ganz unten auf dem Abstraktionslevel findet man C. C ist eine sehr sehr einfache Sprache. Damit ist nicht gemeint, dass man wenig Möglichkeiten hat, ganz im Gegenteil! Es gibt aber an sich sprachlich nur wenige Elemente. C kennt eigentlich nur primitive Datentypen, Funktionen und Strukturen. Natürlich gibt es auch noch Schleifen und Bedingungen, Zeiger und Makros, aber das dürfte es schon fast gewesen sein. An sich kennt C jedenfalls keine besondere Abstraktion, keine aut. Speicherverwaltung und achtet auch nicht sonderlich auf Datensicherheit. Hierin liegen dann auch schon die Vor- und Nachteile von C.
Da C keine Abstraktion kennt und nur mit einfachen Strukturen arbeitet, kann man C sehr leicht aus anderen Sprachen heraus nutzen. Die meisten Sprachen bieten auch direkt eine Schnittstelle an um C - Bibliotheken zu verwenden (z.B. möglich unter Java, C++, Delphi, Haskell, Python, ...).
Durch die fehlende Abstraktion und die nicht vorhandene Typprüfung ist C zudem äußerst schnell in der Abarbeitung. Gleichzeitig muss man aber auch sagen, dass die Programmierung dadurch sehr viel fehleranfälliger wird. Möchte man z.B. in C auf ein Array zugreifen, übergibt man einfach nur den Zeiger auf das erste Element. Ein Array wird immer so erzeugt, dass beginnend bei dieser Adresse alle weiteren Daten linear im Speicher angeordnet werden. C weiß nur leider zu keinem Zeitpunkt, wie groß das Array ist. Erzeugt man sich ein Array mit 10 Feldern, kann man problemlos auf das 10.000te Element zugreifen. C wird diesen Fehler nicht bemerken und man greift auf einen Speicherbereich zu, den man nicht näher kennt. Was genau passiert hängt vom Programm und Betriebssystem ab, klar sollte aber sein, dass es nichts erwünschtes ist!
C zu lernen ist auf keinen Fall falsch. Man kann, wie gesagt, C als kleinsten gemeinsamen Nenner vieler Sprachen sehr gut nutzen bzw. immer mal wieder brauchen. Trotzdem heißt das auch immer, dass man auf diesen kleinsten Nenner runter gehen muss. Paradigmen wie die OOP haben durchaus einen Sinn (größere Projekte würden sich ohne viel schwieriger umsetzen und vorallem erweitern bzw. pflegen lassen!). HW - nah macht hingegen die Abstraktion wenig Sinn, ein Treiber lässt sich kaum für eine ganz andere HW wiederverwenden.
Auch ist das Lernen der C - Syntax von Vorteil, da man diese in sehr vielen Sprachen findet. So verwenden Sprachen wie C, C++, Java, Python, PHP, ... eine in vielen Elementen ähnliche Syntax. Allerdings muss man auch klar sagen, dass ein paar C - Elemente zum Glück nicht überall zu finden sind! Man kann in C sehr hässliche Konstrukte erstellen, die kaum lesbar sind. Häufig wird das ausgenutzt und Programme mit möglichst wenig LOC erzeugt. Davon muss man immer ganz klar abraten! Was Du Dir (gerade bei C, aber auch bei jeder anderen Sprache) unbedingt angewöhnen solltest ist, immer sauber zu programmieren (so dass alles gut lesbar bleibt). Zuweisungen haben z.B. nie etwas in einer if-Abfrage verloren, auch wenn's möglich ist. Auch Makros sind nur bedingt schön (erhöht nicht unbedingt die Lesbarkeit).

Ja, zu C++ wurde ja schon das Wichtigste gesagt. Die Sprache ist der Versuch C um Objekt Orientierung zu erweitern. Guter Gedanke, nur imho leider miserabel umgesetzt! An sich findet man natürlich alle Elemente der Objekt Orientierung. Eine Besonderheit, die man einfach selten bei anderen Sprachen findet besteht z.B. darin, dass auch Mehrfachvererbung möglich ist. Leider wurde aber auch versucht, zu C "abwärtskompatibel" zu bleiben. Da liegen dann auch die meisten Nachteile von C++, es gibt immer noch viel Code, der eher eine schlechte Mischung aus C und C++ darstellt, schwer lesbar und kaum wartbar ist. Liegt allerdings immer am Entwickler, das sollte klar sein. Natürlich kann man auch sehr saubere und schöne C++ Programme schreiben. Trotzdem ist hier das Konzept von Java oder C#, die einen gleich zu reiner OO zwingen und auf Präprozessor - Anweisungen (und auch den Präprozessor selbst) verzichten.
C++ hat gegenüber C eben viele weitere Möglichkeiten (Klassen und OO, Namensräume, Templates/Generizität/Polymorphie, ...).

C# wiederum ist eine Sprache, die zusammen mit dem .Net - Framework entstanden ist. Die Sprache hat auch eine C - Syntax, ähnelt aber Java in fast allen Punkten deutlich mehr als C++. Auch C# ist eine Objekt Orientierte Sprache, anders als in C++ beherscht diese aber z.B. nur die Einfachvererbung (Mehrfachvererbung kann nur über Interfaces erreicht werden).
Der eigentlich wichtigste Unterschied bei C# liegt allerdings darin, dass für die Sprache "managed code" erzeugt wird. Das managed kommt dabei aus der Eigenschaft, dass C# sich selbst um die Speicherverwaltung kümmert. Anders als in Delphi, C++, und C braucht man sich in C# nie um die Freigabe von Speicher kümmern. Wurde Speicher angefordert, so zählt C# selbst die Referenzen. Ist ein Feld, ein Exemplar einer Klasse, eine Struktur oder ähnliches nicht mehr erreichbar, so gibt C# diese automatisch frei. Es entstehen hier also nie Speicherlöcher! Zudem arbeitet C# deutlich abstrakter. Es gibt keine expliziten Zeiger mehr, man arbeitet statt dessen mit Referenzen (implizite Zeiger). Das bringt deutliche Vorteile bei der Typsicherheit (allerdings muss man auch sagen, dass C++ schon sehr typsicher ist, gerade im Vergleich mit C!).
C# arbeiet einfach viel abstrakter, für die HW - nahe Programmierung wurde die Sprache nicht entworfen. Natürlich ist es sehr praktisch, dass C# sich selbst um die Speicherverwaltung kümmert, was man dabei aber auch berücksichtigen muss ist, dass dies immer zu Lasten der Perfomance erfolgt.

Welche dieser Sprachen Du lernen solltest hängt vorallem davon ab, was Du damit machen möchtest. Wie gesagt findest Du Unterschiede in der Perfomance, sowie in den zugrunde liegenden Paradigmen. Und obohl C++ und C# objekt orientiert sind, wirst Du auch hier viele Unterschiede finden (C# eben deutlich abstrakter, strenger OO, managed und bei .Net nur in einer bestimmten Laufzeitumgebung lauffähig).
Die Programmierung von PDAs kann mit allen Sprachen möglich sein. Viele SDKs verwenden C (wie gesagt, ist fast immer der kleinste gemeinsame Nenner, da sehr einfach). C++ kommt damit auch immer in Frage (da abwärtskompatibel). Gleichzeitig gibt es auch einen starken Trend zu speziellen Laufzeitumgebungen auf solchen Plattformen. So gibt es von .Net auch mobile Varianten, die dann auch das ausführen von C# auf so einem PDA ermöglichen (es werden entsprechende Bibliotheken zur Verfügung gestellt). Der Vorteil liegt einfach darin, dass man nur noch die Laufzeitumgebung an die HW anpasst und alle darauf aufsetzenden Programme direkt laufen (ohne diese Abstraktionsschicht müsste man alle Programme ggf. anpassen). Zu dem Beispiel möchte ich aber dann auch gleich drauf verweisen, dass Java hier (im Moment?) eher das Rennen macht, da hat Google jetzt eine Handy-Plattform veröffentlicht, die auf Java basiert und frei verfügbar ist (und vom Handy zum PDA ist nicht so der große Sprung).

Ach ja, zu allen Sprachen findest Du kostenlose Compiler und Bücher! Für C# empfiehlt sich der Einsatz von Microsofts VS C# Express bzw. für die Kommandozeile findest Du auch im .net SDK den CSC (C# Compiler). Bei C++ findest Du in der Gnu Compiler Collection (gcc) g++ (cygwin und msys wurden ja schon genannt, ansonsten ist die gcc Standard unter den Unixen, Linux und BSD), sowie natürlich auch Turbo C++ Explorer. Auch für C gibt es einen freien Compiler in der GCC (der heißt dann auch gleich gcc), ich glaube Borland stellt auch einen Kommandozeilen - Compiler zur Verfügung, kann dann auch gleich mit einem Plugin innerhalb der Eclipse Umgebung genutzt werden). Aufpassen musst Du bei der Verwendung eines C++ - Compiler für C. Die Syntax ist zwar kompatibel, aber C++-Bibliotheken sind anders aufgebaut als die in C! So kennt C++ die Überladung von Funktionen und C nicht. Entsprechend ist jeder FUnktionsname in C eindeutig, während C++ noch die Parameter mit berücksichtigt (führt eben zu einer abweichenden Benennung). Willst Du also eine mit C++ übersetzte Datei / Bibliothek durch einen C-Compiler binden lassen, hast Du ein Problem (gibt allerdings in C++ entsprechende sprachliche Mittel das Problem zu umgehen).

Gruß Der Unwissende
  Mit Zitat antworten Zitat