Programiersprache für Anfänger
-
asc schrieb:
OMG - Da ist mir C++ jedenfalls logischer xD.
versuch dich mal in einen absoluten anfänger zu versetzen. welchen code würde er wohl eher kapieren? den perl-code oder einen c++ code, der gleiches macht?
-
~fricky schrieb:
versuch dich mal in einen absoluten anfänger zu versetzen. welchen code würde er wohl eher kapieren? den perl-code oder einen c++ code, der gleiches macht?
Ganz ehrlich: Ich tippe sogar auf den C++ Code, der aber wesentlich mehr Codezeilen hätte. Das Perlzeugs finde ich jedenfalls von allen mir bekannten Sprachen bisher das kryptischste (Von Mehrdeutigkeiten die ja Gegen C++ genannt werden ebenso abgesehen).
-
uber perle schrieb:
[flame]bezüglich syntax komplexizität und kontext sensitivität sind ja beide sprachen pillepalle, perl ist da vieeeel schöner.[/flame]
perl ist schöner, aber APL ist kürzer
-
asc schrieb:
isklar schrieb:
asc schrieb:
Der Name ist Programm... Wenn du C++ als " Unlogisch und kompliziert" betrachtest, gilt dies erst recht für C.
http://www.artima.com/cppsource/safebool.html
Kannst du mal schnell das mit dem safe bool idiom und dem Rückgabewert bool oder void* erklären, ich hab das noch nicht ganz verstanden. Sollte doch auch einfach, logisch und unkompliziert ohne 3 Seiten Text gehen, da C++. Und wie war das mit dem assign operator und exception safety?Interessantes Problem, aber es erklärt nich nicht warum C weniger Kompliziert ist als C++, da es die gleichen Probleme hat, weniger Typsicherheit besitzt...
Ich hab zwar noch nicht soviel mit C gemacht, aber mir kommt es um einiges einfacher vor als C++. Einige C Libraries mögen ja fehleranfälliger sein, aber ein std::transform um einen String in Uppercase zu convertieren ist auch nicht einfach und intuitiv. Außerdem hat C auch weniger Sprachfeatures z.B. keine Exceptions und Operatorüberladung, welche in C++ große Fehlerquellen sind (siehe safe bool und assignment operator).
-
Ich denke es sollte hier unterschieden werden zwischen "wie einfach ist es eine sprache zu lernen (alle relevanten sprachfeatures zu kennen und zu wissen wie man sie anwendet)" und "wie einfach ist es in einer bestimmten zeit eine sprache zu lernen und dann brauchbare programme (also ohne viele grobe fehler) damit zu entwickeln".
was den ersten punkt angeht ist C viel einfacher als C++. was den zweiten angeht IMO nicht. obwohl C++ einem mehr möglichkeiten gibt dinge falsch zu machen, nimmt einem C++ (wenn man es auch nur halbwegs richtig einsetzt) auch viele dinge ab wo man viel falsch machen könnte wenn man sie immer "zu fuss" machen muss (container, smart-pointer etc.). und sobald man beide sprachen mal gut kann ist es in C++ denke ich einfacher, d.h. man kommt schneller zu einem brauchbaren ergebnis als mit C.
im allgemeinem. spezialfälle wie embedded-systems, treiberentwicklung etc. mal ausgenommen.
p.S.: was jetzt nicht heissen soll dass ich C oder C++ für eine sprache halte mit der man besonders leicht einsteigen kann. da eignen sich sprachen wie python, java oder auch PHP/Perl vermutlich besser, auch wenn ich mich mit keiner dieser sprachen selbst besonders anfreunden konnte (am ehesten noch java) - aber das ist wieder rein subjektiv.
-
hustbaer schrieb:
obwohl C++ einem mehr möglichkeiten gibt dinge falsch zu machen, nimmt einem C++ (wenn man es auch nur halbwegs richtig einsetzt) auch viele dinge ab...
das ist es, was ich weiter oben ansprach: man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
hustbaer schrieb:
...auch wenn ich mich mit keiner dieser sprachen selbst besonders anfreunden konnte (am ehesten noch java)...
ich dachte immer, du kommst aus der windows-welt. daher hätte ich auf C# getippt.
-
man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
Mit den "meistens viel fieseren" Fehlerquellen bekommt man IMO nur zu tun wenn man sich überschätzt, Dinge verwendet wo man sich nicht ganz sicher ist bzw. die man einfach nicht richtig verstanden hat etc. Lässt sich IMO recht einfach vermeiden. Ist aber natürlich nur meine persönliche Meinung.
ich dachte immer, du kommst aus der windows-welt. daher hätte ich auf C# getippt.
Ich komme aus der Amiga 500/3000 Welt und bin mittlerweile in der Windows Welt zuhause. Was aber nicht heisst dass ich C# so toll finde. Für gewisse Dinge (RAD, GUI-Kram etc.) ist es nett, für andere Dinge wieder der Horror. Und gerade auf C# bzw. das .NET Framework trifft IMO das zu was du über C++ schreibst: man kann sehr schnell was auf die Beine stellen, handelt sich dabei aber Probleme/Fehlerquellen ein die zumindest der typische C# Programmierer überhauptnichtmehr versteht. Das .NET Framework hat einige Fallstricke parat wo man sich schön Memory-Leaks bzw. allgemein Resource-Leaks einfangen kann. Und andere Probleme wie verfrühte Finalisierung die in bestimmten Situationen möglich ist, die man mit Hand verhindern muss. Alles andere als schön und anfängerfreundlich. Und bestimmt noch viele andere Dinge.
-
hustbaer schrieb:
Was aber nicht heisst dass ich C# so toll finde. Für gewisse Dinge (RAD, GUI-Kram etc.) ist es nett, für andere Dinge wieder der Horror. Und gerade auf C# bzw. das .NET Framework trifft IMO das zu was du über C++ schreibst: man kann sehr schnell was auf die Beine stellen, handelt sich dabei aber Probleme/Fehlerquellen ein die zumindest der typische C# Programmierer überhauptnichtmehr versteht.
ach du schreck! und ich dachte, .NET wär (unter win) eine ernstzunehmende alternative zu Java. etwas, mit dem auch 'schlechte' programmierer was halbwegs stabiles auf die beine stellen können.
-
hustbaer schrieb:
man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
Mit den "meistens viel fieseren" Fehlerquellen bekommt man IMO nur zu tun wenn man sich überschätzt, Dinge verwendet wo man sich nicht ganz sicher ist bzw. die man einfach nicht richtig verstanden hat etc. Lässt sich IMO recht einfach vermeiden.
Man kann sich halt schon beim Assignment-Operator überschätzen.
-
~fricky schrieb:
das ist es, was ich weiter oben ansprach: man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
Das konnte ich bislang nicht feststellen - vor allem nicht "viel fiesere". Zumindestens wüsste ich jetzt nicht wo ich mir - sofern es sich um "echte" C++ Programmierung geht - jemals den Speicher zerschossen habe. Aber vielleicht hat da auch jeder andere Erfahrungen.
Wenn man es so betrachtet würden sich aber vermutlich alle Sprachen für einen Anfänger ausschließen. Beispielsweise hat man sowohl bei C# als auch Java eine mächtige Bibliothek, die so sehr gekapselt ist das einige Fehler sich einen Anfänger nicht erschließen. Aber grundsätzlich ist Programmierung, wenn es den über wenige Zeilen hinaus geht, ohnehin eine komplexe Thematik die zumindestens ein grundlegenes logisches Denkvermögen erfordert.
cu André
-
asc schrieb:
~fricky schrieb:
man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
Das konnte ich bislang nicht feststellen - vor allem nicht "viel fiesere".
ich schon. Beispiel: Copy-Konstruktur einer Klasse muß überschrieben werden, sobald die Objekte dieser Klasse Daten enthalten, die nicht einfach kopiert und dann weiterbenutzt werden können. Sonst erlebt man bei der pass-by-value-Übergabe von Objekten dieser Klasse bei Funktionsaufrufen sein blaues Wunder.
Eine typische Anfänger-Falle. Der Anfänger muß dabei wissen, daß bei Funktionsaufrufen Kopien von Objekten hergestellt werden, die dann als Argument übergeben werden, und daß und wie man den Kopier-Mechanismus mit dem copy-Konstruktur "customisiert".
-
@u_ser-l: Einen eigenen copy-constructor zu schreiben mag zwar sehr früh in vielen Tutorials und Büchern vorkommen. Tatsächlich benötigt das ein Anfänger aber kaum bis nie. Selbst ein fortgeschrittener Programmierer verwendet das nur um RAII-Klassen für Ressourcen zu schreiben. Dann erledigt der Kompiler den Rest. Ein Anfänger sollte aber keine eigenen RAII-Klassen schreiben.
Du greifst hier einen Punkt von C++ an, den man wenig kritisieren kann, da gibt es viel bessere Beispiele. Gerade in Flame-Wars ist es erstaunlich, dass man meist nur sehr schwache Gegenargumente findet, obwohl es wesentlich bessere gibt. Ich will dir nichts unterstellen, aber das zeigt meist, dass Leute gegen etwas flamen, dass sie nicht mal genau kennen.
Gruß
Don06
-
asc schrieb:
~fricky schrieb:
das ist es, was ich weiter oben ansprach: man kann mit C++ unsicherheiten vermeiden, die man sich mit eingehandelt C hätte, holt sich im gegenzug aber andere (und meistens viel fiesere) mögliche fehlerquellen an bord.
Das konnte ich bislang nicht feststellen
andere aber schon: http://www.horstmann.com/cpp/pitfalls.html
-
u_ser-l schrieb:
ich schon. Beispiel: Copy-Konstruktur einer Klasse muß überschrieben werden, sobald die Objekte dieser Klasse Daten enthalten, die nicht einfach kopiert und dann weiterbenutzt werden können.
Neben den Kommentar von Don06 möchte ich mal wissen aus welchen Quellen du lernst. Alle Bücher die ich kenne und die sich auch ernsthaft mit C++ befassen (also nicht nur C-mit-Klassen) weißen sehr früh darauf hin wann man den einen Kopierkonstruktor braucht und wann nicht. Zudem setze zumindestens ich in C++ nicht viele Zeiger direkt ein.
Davon abgesehen ist einer der aller ersten Fehler die ich zu C sehe, der Versuch mal wieder Strings zu kopieren, zuzuweisen, anzuhängen... Also komm mir nicht mit diesen Zeigerproblematiken unter C++ an.
Nenn mir mal bitte Probleme die C im Gegensatz zu C++ nicht hat, und auf die ein C++ Anfänger schnell stößt. Auch das Kopieren von Werten bei Übergaben (nehmen wir mal strukturen als Wertübergabe) kann man ebenso in C machen. Nur hast du in C++ wenigstens die Möglichkeit dort speziell beim Kopieren vorzugehen. Ja C++ ist komplex, ohne Frage - ich spreche aber auch C die gleiche Complexität zu.
Wenn aber jemand ins Blaue programmiert ohne sinnvolles Buch oder ähnliches wird er in JEDER Programmiersprache scheitern. Und da sind Sprachen die nah an der Hardware sind (Assembler, C, C++...) zwar stärker betroffen, aber auch die ach so sicheren Sprachen wie beispielsweise VB, C#, Java und Co sind ebenso betroffen.
-
Don06 schrieb:
Einen eigenen copy-constructor zu schreiben mag zwar sehr früh in vielen Tutorials und Büchern vorkommen. Tatsächlich benötigt das ein Anfänger aber kaum bis nie.
Ja gut, ich rede hier nicht von "hello, world".
Ich benötigte das (copy Konstr.) gleich bei meinem *ersten* größeren Programm (10k+ Zeilen), und da im Objekt ein Filehandle vorkam, der nicht zweimal verwendet werden kann, mußte ich den copy Konstruktor selbst schreiben. Das fiel aber erst auf, als Objekte per-value übergeben wurden, und Objekte per-value übergeben ist für einen Anfänger das natürlichste der Welt - kaum einAnfänger rechnet damit, daß er mit Referenzen arbeiten muß, nur um ein Objekt an eine Funktion zu übergeben.
Don06 schrieb:
Ich will dir nichts unterstellen, aber das zeigt meist, dass Leute gegen etwas flamen, dass sie nicht mal genau kennen.
Es würde entschieden seriöser wirken, wenn Du sachlich geblieben wärest
-
asc schrieb:
Nenn mir mal bitte Probleme die C im Gegensatz zu C++ nicht hat, und auf die ein C++ Anfänger schnell stößt.
C ist für Anfänger schon deshalb einfacher, weil übersichtlicher, andererseits verlangt es etwas mehr technischen Background, sonst kann man sich unter Zeigern oder dem Sinn der Gleichsetzung von Array und Zeiger schwer etwas vorstellen - es ist auch nicht ein Anfänger wie der andere.
Aber mal ganz konkret gefragt: bist du allen Ernstes der Meinung, eine Sprache wie C++, deren Beschreibung hunderte von Seiten benötigt, die Bibliotheken noch nicht eingerechnet, wäre genauso einfach zu lernen wie bspw. Smalltalk, deren Syntax man auf einer halben Seite darstellen kann, oder Python, das man lesen kann, ohne die Sprache überhaupt genauer zu kennen ?
-
u_ser-l schrieb:
...da im Objekt ein Filehandle vorkam, der nicht zweimal verwendet werden kann, mußte ich den copy Konstruktor selbst schreiben ...
std::i/ofstream? Wenn du ein OS-abhängiges Filehandle verwendest, zähle ich das nicht mehr zu dem, was ein Anfänger so macht. OS-spezifisches Zeug ist meist etwas frickelig, da C-Interfaces auf C++-Code treffen.
u_ser-l schrieb:
Es würde entschieden seriöser wirken, wenn Du sachlich geblieben wärest
Ich will nicht seriös sein
Hier mal ein Beispiel, was ziemlich verwirrend sein kann:
A B(C)
Die Bedeutung des Codes hängt davon ab, was C ist. Es kann ein Typ sein, dann ist es eine Funktionsdeklaration. Es kann aber auch eine Variable/Konstante sein, dann ist es eine Variablendaklaration. Wie hier im Thread schon gesagt wurde, ist Mehrdeutigkeit, eines der größten Probleme von Anfängern. Und davon hat C++ viele. Dass man sich um die Verwaltung seiner Ressourcen selbst kümmern, muss, gilt hingegen sogar in Sprachen, die einen Müll-Sammler haben, da der nur für die Verwaltung des dynmaischen Speichers, nicht aber für externe Ressourcen, wie Filehandles verantwortlich ist.
Gruß
Don06
-
Hallo zusammen
Ich Möchte Programmieren (C) lernen.
Kann man mir sagen was für einen softwareoder Programm
ich brauche und wo ich das finde?
Danke
-
Don06 schrieb:
Dass man sich um die Verwaltung seiner Ressourcen selbst kümmern, muss, gilt hingegen sogar in Sprachen, die einen Müll-Sammler haben, da der nur für die Verwaltung des dynmaischen Speichers, nicht aber für externe Ressourcen, wie Filehandles verantwortlich ist.
Files automatisch schließen geht im allgemeinen ja auch gar nicht. Schließlich weiß die Programmiersprache nicht in jedem Fall, ob das Programm später den Filehandle noch einmal benutzen wird - z.B. könnte man im Programm per Zufall entscheiden lassen, ob das File in Zukunft noch einmal beschrieben wird oder nicht, und da wäre es beim Compilieren unmöglich zu entscheiden, ob das Filehandle gelöscht werden kann oder nicht.
Sonderfall: wenn keine Referenz mehr auf ein File-Objekt verweist, dann kann auch das Programm nicht mehr auf das File zugreifen (gilt für Sprachen ohne direkte Speichermanipulation per Zeiger o.ä.); dann könnte die Garbage Collection, die ja nicht-referenzierte Objekte findet, das File flushen und schließen. In einigen früheren Python-Versionen gab es das angeblich, aber es wird nicht empfohlen, sich darauf zu verlassen.
In Sprachen mit direkter Speichermanipulations-Möglichkeit über Zeiger geht das ohnehin nicht.
-
Don06 schrieb:
Dass man sich um die Verwaltung seiner Ressourcen selbst kümmern, muss, gilt hingegen sogar in Sprachen, die einen Müll-Sammler haben, da der nur für die Verwaltung des dynmaischen Speichers, nicht aber für externe Ressourcen, wie Filehandles verantwortlich ist.
Was ist mit Finalizern?