Warum C Alle sagen, wenn man in C programmieren kann kann man leicht andere P-Sprachen lernen... Also... was ist die beste Wahl?
8 Antworten
Sag ma es so. Die wichtigsten Sachen im Programmieren sind "If then else", "for i = 0 to irgendwas", "for each bla in blabla do" etc.
Diese Vorgänge gibt es so gut wie in jeder Sprache.
Was dann in C noch hast sind entsprechende Variablendeklarationen. Du musst also den richtigen Datentyp für eine Variable angeben.
Noch was anderes ist die Objektorientierung die du bei C hast. Des dürfte dir auch wieder einen wichtigen einblick in die Programmierung geben. Evtl dass dir noch Batch anschaust und den Unterschied dazwischen mal ansiehst.
Äh was noch. Jo des wars eigentlich. Es gibt viele andere Elemente die du noch mit C verwenden kannst(eigentlich alles) z.B. .Ini Datein, xml Dateien, Datenbanken, andere Skripts, Programme etc. etc. etc.
Und wenn ich von einem Flugzeug rede, ist natürlich davon auszugehen, dass ich ein Schiff meine. Wenn man von C redet, geht man von C aus. Redet man von C++, geht man von C++ aus und bei C# ist von C# auszugehen. So und nicht anders.
Ich bin von C als alle drei ausgegegangen. Mögen zwar verschiedene Sprachen sein und jede ist für was anderes brauchbar aber im Großen und ganzen unterscheidet sich die Syntax ja nicht so extrem.
Bin zwar nicht so Tief drin aber ich hab kein Problem zerst ein C "Skript" zu schreiben und danach bisschen Objektorientiert mit C# irgendwo was zu verbessern ohne durcheinandere zu kommen.
C++ kann ich sowieso nur sehr spärlich(eigentlich noch gar nicht).
Das würde nicht nur auf die Antwort von newb33 ein ganz anderes Licht werfen, sondern auch auf die Frage:
"Warum C Alle sagen, wenn man in C programmieren kann kann man leicht andere P-Sprachen lernen"
Ich kann mir einfach nicht vorstellen, dass dem Fragesteller von mehreren Seiten angeraten wurde, mit originärem C anzufangen, es sei denn, er hat nur mit in die Jahre gekommenden C-Gurus zu tun, die sich selbst im Bereich Programmiersprachen nicht weiter umgeschaut haben.
Im akademischen Umfeld (Universität) wird in der Regel mit Java angefangen. Wenn man Java beherrscht, kann man quasi auch C-Sharp. (Die Sprachen sind extrem ähnlich. C-Sharp ist quasi "Java auf Steroiden". ;-) )
C ist nicht objektorientiert und insbesondere interessant für die Systemprogrammierung.
Für die Uni brauche ich inzwischen auch Go, was relativ einfach zu erlernen ist, wenn man bereits C beherrscht. Allerdings ist auch Go, wie C, nicht objektorientiert.
Python brauche ich auch recht häufig für die Uni, aber ich verwende die Sprache an sich nicht "gern". Vollständig interpretiert, ausschließlich dynamisch typisiert, Whitespace hat semantische Bedeutung. Nein, danke! Es gibt aber recht viele Menschen, die diese Sprache "mögen".
Das ganze "Web-Gedöns" (HTML, JavaScript, PHP, ...) empfehle ich niemandem. Auch, wenn mich immer wieder wundert, was man mit JavaScript (und Ajax) für tolle Dinge tun kann, "versauen einem diese Sprachen und dieses Denkmuster in meinen Augen reichlich den Stil".
Dann gibt es noch so genannte "funktionale Sprachen", die eher der Denkweise eines Mathematikers entsprechen, als der eines Informatikers. Die findest Du aber fast nur im akademischen Umfeld und es ist auch kaum möglich, Wissen aus der prozeduralen und objektorientierten Programmierung auf die funktionale Programmierung zu übertragen. Für mich sind das vollkommen getrennte Welten. Zwischen Sprachen gleichen Paradigmas hingegen kann man recht gut Wissen übertragen und auch zwischen prozeduralen und objektorientierten Sprachen, kann man recht leicht Wissen übertragen.
In der Objektorientierung fassen Klassen Datenstrukturen und die darauf operierenden Unterprogramme, die dann als Methoden bezeichnet werden, zusammen. Die in der prozeduralen Programmierung strikte "Trennung von Code und Daten", die übrigens auch in der Maschine vorherrscht, wird dabei aufgehoben. Daher ist das ganze etwas "abstrakter" und man denkt eher in "funktionalen Einheiten" (Klassen). Aber letztlich ist das eine recht "milde" Form der Abstraktion, die der Compiler dort vornimmt. Man kann sich Methoden einfach als Funktionen vorstellen, die als ersten Parameter eine implizite Referenz auf die Datenstruktur, auf der sie operieren ("this"-Referenz) übergeben bekommen. In manchen Sprachen (z. B. Python) sieht man das auch noch explizit. Dort heißt der erste Parameter, der an Methoden übergeben wird "self". In vielen anderen Sprachen (C++, Java, ...) gibt es ein eigenes Schlüsselwort namens "this" und die Selbstreferenz taucht im Code nicht mehr explizit auf. Letztlich ist das aber nicht viel mehr, als eine leichte Abstraktion durch den Compiler. Letztlich wird die Selbstreferenz einfach auf dem Stack übergeben, wie jeder Aufrufparameter auch.
Nicht C# is Java on Steroids sondern Scala. C# ist nichts weiter als eine billige Kopie. Und Scala als funktionale Sprache findet durchaus Anwendug außerhalb des akademischen Umfelds.
C-Sharp ist zwar gewissermaßen "eine Kopie von Java" (ähnliche Syntax, "Bytecode-Compiliert" und dann von einer Laufzeitumgebung per JIT-Compilation in nativen Code übersetzt, ...), allerdings wurde hier von Microsoft, Intel, HP, ... (wer war noch alles im Konsortium?) einiges richtig gemacht, was Sun Microsystems und Oracle mit Java "falsch gemacht haben".
Insbesondere, dass Generics in Java per "type erasure" umgesetzt werden, ist sehr schade. Auch, dass die primitiven Datentypen keine Objekte sind (in C-Sharp: int = System.Int32, long = System.Int64, ...) und dass es keine "unsigned types" und keinen "echten" Enum-Datentyp gibt, ist ziemlich "schade". Dann kommt noch dazu, dass man Callbacks über Interfaces machen muss und so weiter und so fort.
Das einzige, was ich an .NET/C-Sharp so richtig schlecht finde, ist, dass man bei Stringkonvertierungsfunktionen explizit einen IFormatProvider (System.Globalization.CultureInfo.InvariantCulture) übergeben muss, wenn man kulturneutral konvertieren möchte. In meinen Augen sollte eine kulturabhängige Konvertierung immer eine bewusste Entscheidung des Entwicklers sein, die er explizit hinschreiben muss und eine kulturneutale Konvertierung der "Standardfall". In .NET ist die kulturabhängige Konvertierung leider der Defaultwert und wenn man kulturneutral konvertieren will, muss man dies explizit hinschreiben. Das finde ich äußerst "uneinsichtig" und es sorgt mit Sicherheit für viele "subtile" Fehler, die beim Testen auf englischsprachigen Systemen niemals gefunden werden.
Das ganze "Web-Gedöns" (HTML, JavaScript, PHP, ...) empfehle ich niemandem.
also ich glaub die zeit ist irgendwie an dir vorbeigegangen, heute wandert ALLES ins www (ja es gibt wie immer ausnahmefälle) :D
Nein, das ist nicht an mir vorbeigegangen. Aber Du verallgemeinerst hier sehr stark. Erstens ist eine Webanbindung nicht immer sinnvoll. Zweitens kann man "Web-Gedöns" ja z. B. durchaus für's Frontend verwenden, sofern man denn unbedingt seine Anwendung "web-fähig" machen möchte.
Mach mal "high-performance computing" in PHP oder wissenschaftliche Anwendungen. Viel Spaß! Ein Webinterface kannst Du vielleicht für die Ein-/Ausgabe der Datensätze brauchen oder um die Visualisierung darzustellen. Wobei Du bei komplexen und umfangreichen Darstellungen auch schnell wieder nativ bei OpenGL bist, weil Du z. B. Deine auf der GPU berechneten Ergebnisse gleich in ein VBO (vertex buffer object) "gießen" und herausrendern lassen kannst und Dir so viel Zeit für's Zeichnen sparst. Mach das mal in JavaScript. ;-)
problemlos mit JS möglich... :D guck dir mal das game mit einem aktuelen browser an, ist auch nur JS :D
Wenn Du mir zeigst, wie ich GPU-Computing per OpenCL von JS aus machen kann oder numerische Koprozessoren oder DSPs ansprechen kann, dann glaube ich Dir, dass man darin eine wissenschaftliche Anwendung entwickeln kann. ;-)
(Selbst wenn man es könnte, heißt das noch nicht, dass ich das tatsächlich "wollen würde". Aber ich bezweifle, dass man es kann. ;-) )
Aber ich gebe Dir Recht, das ist schon recht beeindruckend. Mein "geliebtes C" würde ich für "seriöse Anwendungen" trotzdem nicht durch sowas ersetzen wollen. ;-)
Du kannst doch Javascript und PHP nicht gänzlich von einer Empfehlung ausschließen. Wenn jemand weiß, dass er Web machen möchte und nichts anderes, dann macht PHP und Javascript nun mal den meisten Sinn und nicht etwa C++. Außerdem ist es mir schleierhaft, wie du mit HTML deinen Stil versauen willst, einer schlichten Formatierungssyntax.
Wenn jemand weiß, dass er Web machen möchte und nichts anderes, dann macht PHP und Javascript nun mal den meisten Sinn und nicht etwa C++.
Das (Web und nichts anderes) ist aber ein recht spezieller Anwendungsfall und davon hat der Fragesteller auch nichts erwähnt.
Außerdem ist es mir schleierhaft, wie du mit HTML deinen Stil versauen willst, einer schlichten Formatierungssyntax.
Ich meinte eher mit der "Sprachfamilie". Nunja und HTML hat auch eine "schlechte" (und sogar uneindeutige!) Syntax, da SGML schon nicht semantisch eindeutig ist. Bei XHTML sieht es dann zum Glück schon besser aus.
Die (funktionalen Sprachen) findest Du aber fast nur im akademischen Umfeld...
Tehe, guter Witz.
Mit Java 8 sind nicht umsonst funktionale Elemente in die Programmiersprache eingeflossen (Lambdas, Options, Function, Predicate,...). Das wurde gemacht, weil es "normale" Entwickler aus der Wirtschaft wollen und es seit ein paar Jahren einen Hype darum gibt. In C# sind diese Elemente schon länger vorhanden.
Für dich mögen funktionale und imperative Sprachen bzw. deren Elemente wenig gemeinsam haben, man kann sie aber gut einem Projekt zusammen verwenden. Das ist natürlich am einfachsten, wenn man eine Sprache wählt, die beides unterstützt (zum Beispiel Java oder C#). Ansonsten muss man erst wieder einen Weg finden, 2 Programme unterschiedlicher Sprachen miteinander kommunizieren zu lassen.
Du hast mich missverstanden. Ich sagte nicht, dass "funktionale Konzepte" nicht außerhalb des akademischen Umfelds Anwendung finden.
Aber ein Lambda-Ausdruck ist zunächst nichts anderes, als eine anonyme Methode. Von einem echten "funktionalen Paradigma" (Variablen sind nicht variabel) ist da noch nicht zu sprechen. Du hast immer noch Zuweisungen, Schleifen, Inkrement/Dekrement/whatever.
Mich würde interessieren was es an javascript auszusetzen gibt? ist OO und serverseitig mit nodejs/iojs ziemlich mächtig geworden.
Die "Objektorientierung" ist prototypenbasiert und alles andere, als "typsicher".
Objekte in JavaScript:
function MyClass(a, b) {
this.a = a;
this.b = b;
this.getA = function() {
return this.a;
}
this.getB = function() {
return this.b;
}
}
var x = new MyClass(1, 2);
alert(x.getA());
alert(x.getB());
x.a = 9; /* Encapsulation?! */
alert(x.getA());
"Objektorientiert", aua! ;-)
Ja, ich weiß, inzwischen geht es auch anders, aber das war die "ursprüngliche Syntax". Von Kapselung nichts zu spüren. Und alles, was Du heute machst, ist mehr oder weniger "syntactic sugar" für das selbe Konzept.
Ich könnte es sogar noch schlimmer treiben.
var x = new MyClass(1, 2);
x.getA = function() { return a + b; };
alert(x.getA());
*schauder*
Äquivalent wäre übrigens folgendes.
var x = new MyClass(1, 2);
x['getA'] = function() { return a + b; };
alert(x['getA']());
Und natürlich könnte ich auch über "x['a']" und "x['b']" auf die inneren Attribute des "Objekts" zugreifen.
Die "Objekte" in JavaScript sind letztlich nichts weiter, als Dictionaries, die nicht nur Werte, sondern auch Funktionen beinhalten. Und Dictionaries widerum sind für die Sprache letztlich auch nicht wirklich etwas anderes, als Arrays. Man spricht ja auch von "assoziativen Arrays".
In diesem Zusammenhang von "Objektorientierung" zu sprechen ist Hohn. Man kann zufällig Funktionen als Elemente in (assoziativen) Arrays ablegen. Das ist auch schon die gesamte "Objektorientierung", die JavaScript beherrscht. Der Rest ist "syntactic sugar". Der Dereferenzierungsoperator (".") ist letztlich nichts anderes, als ein Elementzugriff auf einem (assoziativen) Array ("[...]").
Wenn man C++ zum Beispiel kann, dann programmiert man näher an der Maschine, als wenn man zum Beispiel mit VBScript programmiert.
Man hat viel mehr Möglichkeiten, wie zum Beispiel das Operieren mit Zeigern. Diese Fülle an Möglichkeiten machen diese Programmiersprache sehr komplex. Man muss sich um viele Dinge kümmern (zum Beispiel Speicherfreigabe), die in anderen Programmiersprachen automatisch übernommen werden.
Also wer C++ o. ä. beherrscht, wird es recht leicht haben, andere Programmiersprachen zu lernen.
Will man aber mit dem Programmieren erst anfangen, würde ich mich aus didaktischen Gründen vom Einfachen zum Schweren hochhangeln.
Das bedeutet, man kann ruhig mit einer Scriptsprache beginnen.
Einfache Konzepte wie Abfragen, Schleifen, Funktionen und (einfache) Objekte finden dort ebenso Verwendung.
Und das Gute ist das man dann bei C++ sofort mit SFML oder SDL beginnen :)
C ist mehr oder weniger die „Muttersprache“ der meisten hier genannten Sprachen. Es ist eine imperative Sprache und sie ist eine Vorstufe zu vielen objekt-orientierten Sprachen wie C++, Java und Objective-C.
Als Kernighan und Ritchie ihre C-Bibel herausbrachten, waren u.a. die Unterrichtsmethoden noch nicht so weit, wie sie für OOP notwendig wären. Aber bei geeigneten Bezeichnern könnte man durchaus auch mit C objekt-orientiert programmieren. Grundsätzlich hat C alles, was OOP ebenfalls haben. U.U. muss man eben „mitdenken“.
Eine Klasse besteht in OOP aus einer Sammlung statischer Variablen (In C gibt es das „struct“!) und dynamischen Methoden (Was nichts anderes als Funktionen in C sind!). In OOP sind diese Variablen und Methoden fest aneinander gebunden.
Es gibt die Spezialfälle der Getter und Setter, die statische Variablen ändern bzw. erfragen. Auch dies sollte in C kein wirkliches Problem sein. Wenn ein neues Struct-Objekt erzeugt wird, müssen auch seine Variablen (Member) initialisiert und gesetzt werden und man muß auch ihre jeweiligen Werte erfragen können.
Die Datentypen sind hier wie dort gleich: Es gibt ints ints diversen Größen, Strings, chars, boolsche Variablen, float und double …
Die Operatoren sind hier wie dort gleich: +, -, *, /, =, ==, *=, &, …
Viele Programmierer, die Java, C++, Ruby, Python, Objective-C oder was sonst auch immer verwenden, sind sich gar nicht bewusst, wieviel C in ihren Programmiersprachen steckt! Sie glauben, sie lernen C++ – aber das meiste davon ist eigentlich noch immer C!
Wer also C kann, kommt recht zügig auch mit den anderen Sprachen zurecht!
Das ist immer wieder eine ziemliche Streitfrage. Ich persönlich bin auch ein Fan davon, mit C anzufangen, v.a. wenn man es von jemandem beigebracht kriegt, der das alles gut erklären kann. Zwar werden die wenigsten (mich eingeschlossen) später mal mit C arbeiten, aber man lernt grundlegende Konzepte kennen, und muss sich mit Dingen wie Speicherverwaltung und Pointern beschäftigen. Die werden einem in anderen Sprachen mehr oder weniger komplett abgenommen, sodass man prinzipiell auch ohne diese Kenntnisse Programmieren kann, aber es ist doch oft hilfreich, diese Konzepte im Hinterkopf zu haben, um besser zu verstehen, was der eigene Code eigentlich macht. So können auch Fehler schneller gefunden oder gleich vermieden werden.
Viele fangen mit Java an. Da kann man auch recht einfach viel machen, aber wie gesagt, einige technische Grundlagen kriegt man nie praktisch zu Gesicht. Aber wenn man schonmal ein bisschen C gemacht hat und jetzt den nächsten Schritt machen will, ist Java ähnlich wie C# ein angenehmer Übergang in die objektorientierte Programmierung. Wenn man schon die grundlegenden Techniken wie IF-Bedingungen, switches, schleifen etc. beherrscht, kann man sich jetzt auf die Besonderheiten der Objektorientierung und der jeweiligen Sprache konzentrieren. Und wenn man dann Java kann, sind es auch keine allzu großen Schritte mehr zu C#, Swift und Javascript oder auch zu Sprachen, die etwas anders "aussehen", wie Objective C und PHP. Die haben natürlich alle ihre Eigenheiten, aber man braucht nicht mehr alles von neuem zu lernen.
Nun aber noch ein sehr umstrittenes Thema: die typischen "Websprachen" HTML, JavaScript und PHP. HTML lasse ich hier mal außen vor. Manch ein XML-Fanatiker wird sich ja über HTML aufregen können, aber hier geht es eben um Programmiersprachen, nicht um das Design von Webseiten. Ich persönlich arbeite gerne mit PHP und JavaScript, kann aber auch nachvollziehen, wieso viele Programmierer diese Sprachen verabscheuen. Zunächst mal: beide sind sehr flexibel und überraschend mächtig. Schon allein die Flexibilität ist vielen ein Dorn im Auge. Typsicherheit und ist quasi überhaupt nicht gegeben und Fehler werden erst erkannt, wenn die versuchte Ausführung, die im Code völlig legitim erscheint, plötzlich schief geht. Für einen anderen Punkt zitiere ich Spidermans Onkel Ben: "Aus großer Macht folgt große Verantwortung." In JS und PHP ist es z.B. egal, wie viele Parameter du einer Methode übergibst, es gibt also keine sogenannten "überladungen", sondern dein Code muss entscheiden, was er mit den Parametern macht. Man kann im Prinzip eine komplette Anwendung in einer Datei schreiben, die niemand mehr überblicken kann. Allgemein gesagt: Die Sprachen zwingen dich in keinster Weise dazu, sauberen Code zu schreiben. Du bist komplett selbst dafür verantwortlich, dass du eine ordentliche Struktur aufbaust und nach einiger Zeit nochmal auf den Code schauen kannst und weißt, was da passiert (oder dass andere deinen Code verstehen können). Da die meisten Entwickler das scheinbar vernachlässigen und hier und da mal noch was dazwischen quetschen, anstatt es anderweitig ordentlich einzubinden, enden viele JS und PHP Projekte im Chaos das kaum noch jemand überblicken kann. Bei JavaScript kommt noch hinzu, dass es nicht einen allgemein gebrauchten Interpreter gibt, sondern die unterschiedlichen Browser auch ihre eigenen JavaScript-Engines mitbringen, die teilweise anders funktionieren und den selben Code unterschiedlich handhaben, bzw. einen unterschiedlichen Funktionsumfang haben. Daher auch ein Tipp am Rande: Setze zur Web-Entwicklung nicht (nur) Chrome ein. Der Schluckt vieles, was andere Browser nicht können. Bin da selbst schon mehrfach auf die Schnautze gefallen.
Also nochmal zusammengefasst: Ich schlage vor, erst mit C anzufangen, dann auf Java zu wechseln und wenn du dann schon Programmieren kannst und selbst das Bedürfnis nach einem sauberen Stil hast, auch noch in Web-Sprachen einzusteigen. Denn gerade JavaScript im Frontend wird immer wichtiger (Node.js ist zwar nett, hab ich aber noch nie in einem wirklich anspruchsvollen, großen und komplexen Projekt gesehen). Immer mehr Anwendungen wandern in den Browser und da geht ohne JavaScript in Verbindung mit jQuery oder AngularJS sogut wie nichts mehr. UND WEHE IRGENDEINER KOMMT HEUTE NOCH MIT FLASH!!!
Zwar werden die wenigsten (mich eingeschlossen) später mal mit C arbeiten
Hö? o.O
Im kommerziellen Umfeld sind C/C++ nach wie vor "eine der", wenn nicht die Sprachen schlechthin. (Java im Enterprise-Bereich sicher auch noch.)
Außerdem: Woher weißt Du jetzt schon, woran Du später mal arbeiten wirst? Und glaubst Du im Ernst, Du wirst Dein Leben lang mit der gleichen Sprache arbeiten? Ein Informatikstudium ist so "breit", dass es ziemlich nah an einer Generalistenausbildung ist. Und das hat seinen Grund. Mit "Schmalspur" wirst Du nicht weit kommen. Die Anforderungen verändern sich ständig.
UND WEHE IRGENDEINER KOMMT HEUTE NOCH MIT FLASH!!!
Ich hoffe das traut sich niemand mehr, nachdem Adobe selbst das Produkt 2011/2012 endlich faktisch aufgegeben hat.
Das hängt stark davon ab, was du tun willst. Es gibt natürlich Bereiche, in denen das so ist, v.a. in der nativen PC-Programmierung, also bei Spielen und Desktop-Programmen und bei Microcontrollern/Embedded Systems. Aber der Anteil an Programmierern, die in dem Bereich arbeiten, sinkt (nicht unbedingt die Zahl, aber der Anteil), während Web-Systeme und mobile Anwendungen (Apps) immer beliebter werden, bei denen eigentlich kaum etwas mit C/C++ gemacht wird. Außerdem will nicht jeder, der Programmieren lernt, das später auch mal beruflich machen. Deswegen denke ich schon, dass die Aussage, dass die meisten C später nicht mehr brauchen, gerechtfertigt ist, ohne dabei diese Sprachen als veraltet oder unnötig abzustempeln. Und wie gesagt, mir hat C sehr dabei geholfen, zu verstehen, wie Programme funktionieren und Wie gewisse Vorgänge ablaufen, wovon ich auch bei anderen Sprachen schon oft profitiert habe.
C kennt zwar noch keine Klassenobjekte, aber wenn man von C redet, geht man natürlich davon aus, dass C++ oder C# gemeint ist.