C oder C++ oder C#?

cwriter

Erfahrenes Mitglied
Das kommt wirklich ganz auf dich an.
Wenn du etwas Ähnliches wie Java haben willst, dann C#.
C/C++ sind Sprachen, die auf Performance optimiert sind, C# und Java gehen eher Richtung Convenience.

C ist der Uropa fast aller Sprachen. Das Alter ist ihm anzumerken, und die allermeisten Dinge musst du selbst organisieren. Du hast keine Sprachunterstützung für Klassen oder Generics, z.B.
Das halte ich aber für das Beste Argument für C: Du lernst gezwungermassen, wie alles funktioniert. Der Nachteil ist, dass man gerade als Anfänger sehr lange hat, um ein Projekt fertigzustellen.
Langfristig ist es ein Vorteil, wenn du eher auf Betriebssystem-/Hardwareebene arbeiten willst, da C dort noch immer der Standard ist.

C++ hat den Vorteil, eine grosse Standardbibliothek mitzubringen. Du hast OOP und mit RAII wird dir viel Arbeit abgenommen. Für Java-ler ist es auch ein bisschen einfacher, umzusteigen. Mit C++ beginnen würde ich nicht: Es ist mittlerweile so gross und flexibel, dass mal als Anfänger schlicht erschlagen wird. Zudem kannst du von C relativ leicht auf C++ aufsteigen, umgekehrt eher nicht.

Also zusammenfassend: Um die Programmierung als Kunst kennenzulernen, beginne mit C. Das ist zwar ein steiniger Weg, aber er bringt dich sehr weit.
Wenn du aber "nur" Programme schreiben willst, bist du mit C# deutlich besser dran, vor allem, wenn du meistens auf Windows arbeiten willst.
Mit C++ kannst du zwar auch beginnen, aber da musst/solltest du auch C gut können, daher macht es wenig Sinn, mit C++ anzufangen.

Um das klarzustellen: C/C++ gehören zusammen wie C#/Java. C# und C/C++ kann man nicht so einfach vergleichen. Und sehr modernes C++ sieht anders aus als C, aber tief im Inneren schlummert C noch.

Wie auch immer du dich entscheidest: Viel Spass beim Lernen!

Gruss
cwriter
 

ComFreek

Mod | @comfreek
Moderator
Um die Programmierung als Kunst kennenzulernen, beginne mit C.
Das sehe ich etwas differenzierter ;) Zu der Kunst des Programmierens gehört für mich auch maßgeblich ein tiefes Verständnis von Typen, Generics, Lambdas, Higher Order Functions und damit einhergehend von funktionaler Programmierung. C kann leider nur grundlegende Typen bedienen. Ich finde eine Sprache, die einem all diese Möglichkeiten bietet, ist für Anfänger vorteilhafter, weil sie dann von Anfang an die Natürlichkeit dieser Sprachelemente verinnerlichen. Wird einem erst spät das Konzept von Higher Order Functions oder Closure bekannt gemacht, ist es gefühlt fast so, als müsste man sie konzeptionell neu einordnen, obwohl sie doch so natürlich sind, siehe z. B. https://stackoverflow.com/questions/36636/what-is-a-closure.

Zur Kunst des Programmierens gehört aber auch klar Wissen über Speichermanagement und Zeiger, was Sprachen wie Java und JavaScript (bzw. TypeScript) sehr gut kaschieren.

C++ kann alle oben genannten Dinge, kann dich jedoch auch erschlagen wie @cwriter anmerkte :)

Was C# nativ kann und in C# sehr idiomatisch ist (im Gegensatz zu C++ soweit ich weiß, korrigiert mich gerne) sind asynchrone Funktionen.

Zusammenfassend würde ich dir also C# empfehlen, mit dem du ein breites Spektrum von Programmierparadigmen abdeckst, aber immer noch higher level als C++ bist. Wenn du irgendwann einmal bereit bist, tiefer in die Maschinerie hineinzublicken, wie alles funktioniert, kannst du dir C oder C++ ansehen.

PS: Übrigens finde ich, dass TypeScript einem auch all diese Konzepte bis auf Speichermanagement und Zeiger sehr gut beibringt.
PPS: Unit Tests sind in C auch nicht gerade angenehm zu schreiben :)
 

cwriter

Erfahrenes Mitglied
Zu der Kunst des Programmierens gehört für mich auch maßgeblich ein tiefes Verständnis von Typen, Generics, Lambdas, Higher Order Functions und damit einhergehend von funktionaler Programmierung.
Dem widerspreche ich nicht. Aber wie tief ist das Verständnis, wenn man es einfach vorgesetzt bekommt?
C hat Typen, die man aber nach Lust und Laune umgehen kann.
Generics sind an sich nichts anderes als vermiedenes Copy-Paste, und daher eher eine Bequemlichkeit als ein Konzept (dass Generics wichtig sind, um Code einigermassen schnell zu schreiben, ist klar).
Lambdas sind ebenfalls Convenience. Genau genommen sind sie in manchen Sprachen sogar problematisch, z.B. PHP. In C++ werden Lambdas zu normalen Funktionen umgebaut.
Higher Order Functions: Warum soll C das nicht können? "Function Pointers" tönt zwar nicht so hip, ist aber durchaus mächtig. Und selbst Currying kann man mit ein bisschen Tricksen in C recht leicht hinkriegen (varargs).
Closures sind Callbacks (z.T. mit Structs), eines der Grundlegenden Konzepte von C.

C kann alles auch - nur halt nicht auf Sprachenebene, sondern auf eigener Programmierung aufbauend. Dafür kann man C auf fast jeder Maschine kompilieren, was schon bei C++ für Probleme sorgt. Und: Man lernt, wie es intern funktioniert.

Was C# nativ kann und in C# sehr idiomatisch ist (im Gegensatz zu C++ soweit ich weiß, korrigiert mich gerne) sind asynchrone Funktionen.
C++ hat std::async und Konsorten. Nicht sehr nativ, aber so weit davon entfernt ist es auch nicht mehr (sogar C hat mit C11 mittlerweile Standard-Threads).

Ich finde eine Sprache, die einem all diese Möglichkeiten bietet, ist für Anfänger vorteilhafter, weil sie dann von Anfang an die Natürlichkeit dieser Sprachelemente verinnerlichen.
Und hier unterscheiden sich unsere Meinungen. Man kann Computer auf 2 Arten betrachten: 1) Als magic box, die einfach funktioniert, und 2) Als FSM.
Die Magic Box ist sehr verlockend, aber man verliert den Überblick über die Hardware. Die Grundregel von C, "weniger Zeilen bedeutet schnellerer Code" (die nicht immer stimmt, aber oft hinkommt) trifft bei Funktionalen Elementen nicht mehr unbedingt zu (Haskell (++) *hust* O(n) append *hust*). Eine FSM führt einem anhand einer minimalen Spielwiese an die Konzepte heran, statt sie vorauszusetzen.

PPS: Unit Tests sind in C auch nicht gerade angenehm zu schreiben :)
Dafür nimmt man i.d.R. ein C++-Testing-Framework und setzt den C-Code ein. Die paar Unterschiede fallen nicht ins Gewicht.

Im Prinzip unterscheiden sich unsere Aussagen in einem einzigen Punkt: "Was ist leichter zu wechseln?"
Mein Standpunkt ist: C->C++/C# ist einfacher als umgekehrt.
Deiner ist C#->C ist einfacher.

Ich denke, beide Aussagen haben ihre Argumente.


Gruss
cwriter