Quote:
Originally Posted by abdu931
Firemonkey, Lazarus, QT für für für etwas, man sollte es wirklich so schwer sein etwas zu verstehen? :D
Ich denke ich fange an mit C# oder C++, was denkst du was besser ist? Oder was ist überhaupt der Unterschied von den beiden und wo sollte ich es am Besten erlernen?
|
Ok hier mal eine kleine Erklärung:
Zunächst einmal die Begriffe:
Programmiersprache, Formale Sprache mit Syntax und Semantik zum Beschreiben von Programmen
Syntax, Regeln zur Form von Programmen, so zu sagen die Grammatik der Programmiersprache (z.B. das Programm muss mit dem Schlüsselwort Program beginnen und mit end. enden)
Eine Syntax wird Strikt genannt, wenn sie nur wenige Abweichungen zulässt.
Semantik, Regeln wie ein Programmcode ausgeführt werden soll (was das Programm macht, z.B. das a+b die addition beschreibt)
Bibliothek, Sammlung an Hilfsmitteln zur Programmierung, z.B. Funktionen, Konstanten, Komponenten, oder aber auch Resourcen wie Grafiken (z.B. Quelltextdateien die von anderen bereitgestellt werden, welche du von deinem Programm einfach aufrufen kannst)
Framework, Sammlung an Bibliotheken die Rahmenbedingungen aufstellen (z.B. .Net, dieses bearbeitet fast eigenständig den Programmablauf, und stellt Funktionen bereit, die der Programmierer nicht selbst implementieren muss)
Plattform, Rahmenbedingungen auf denen das Programm laufen soll, dazu gehören CPU Architektur, Betriebsystem, aber auch Bibliotheken (wie z.B. OpenGL oder OpenGL/ES), (Beispiel, meine aktuelle Plattform ist ein x86_64-Intel Rechner mit Microsoft Windows, ein Android Smartphone ist zumeist eine 32 oder 64 Bit ARM Linux(Android) Plattform)
Mono, Quelloffene Implementierung von Microsofts .Net für die Programmiersprache C# auf verschiedenen Plattformen (Windows, OSX, Linux, iOS, Android)
QT, ein (hauptsächlich C++) Framework zur entwicklung Grafischer Anwendungen (mit vielen weiteren Funktionen) für verschiedene Plattformen (alle gängigen)
Firemonkey, ein Framework für Delphi und C++ zur Cross-Plattform Entwicklung Grafischer Anwendungen (Windows, OSX, iOS, Android)
LCL, ein Framework für FreePascal enthalten in Lazarus (einer IDE) zur Grafischen Entwicklung für verschiedene Plattformen (alle gängigen, aber zum Teil noch nicht voll ausgereift).
IDE,
Integrated
Development
Environment, Sammlung an Werkzeugen zur Anwendungsentwicklung (z.B. Codeeditor, Compilerinterface, Debuggerinterface, Formulareditor)
Compiler, Software die Programmcode in ein Ausführbares Programm (oder anderen Code) übersetzt
Debugger, Programm um die Ausführungsschritte eines Programmes zu analysieren
Interface, Schnittstelle, z.B. Compilerinterface, Schnittstelle zwischen IDE und Compiler, damit der User sich nicht mit dem Compiler selbst auseinander setzen muss und alles aus der IDE erledigen kann
Formular (GUI), Grafisches Fenster, mit Komponenten drauf (Buttons, Edits, etc)
Usecases, Einsatzgebiete (z.B. ist der Usecase eines Bohrers löcher Bohren)
Server, Rechner/Software welche einen Dienst (Service) bereitsellt.
Nativ, Software die direkt auf der Maschine läuft, und von der CPU direkt ausgeführt wird.
Interpretiert, Software die von einer anderen Software(Interpreter) ausgeführt wird (und damit auch den Interpreter zum laufen braucht).
Systemnah, Wenn der Programmierer direkt die Funktionen des Betriebsystems verwendet, und somit seine Software für dieses System schreibt
So wenn du nun diese Begriffe kennst kann ich dir ein wenig über Programmiersprachen erklären.
Es gibt Programmiersprachen wie Sand am Meer, und alle haben verschiedene Use Cases. Um mal einige zu nennen C++, C# (ausgesproche C-Sharp), Pascal, Javascript, Haskell, Fortran, Cobol, Java, Swift. Und jede dieser Programmiersprachen haben andere Vor und Nachteile. Man sollte die Programmiersprache wie ein Werkzeug betrachten, wer versucht mit einem Schraubenzieher einen Nagel in die Wand zu schlagen ist schlicht und ergreifend ein Kackboon (schönes Wort).
Bevor ich nun weiter auf die Programmiersprachen, ihr Einsatzgebiet und vor bzw Nachteile eingehe möchte ich die Einsatzgebiete zunächst Grob Kategorisieren.
Zunächst gibt es Apps, die Lokal laufende Software, das ist Software die meist Vollfunktionsfähig ausgeliefert wird, (unter Windows als .exe) welche Lokal auf dem Rechner läuft, und von einem Nutzer gesteuert wird (z.B. der Browser).
Dann gibt es die Webentwicklung, das bezeichnet Software welche durch einen Webserver bereitgestellt wird. Ein typisches Beispiel ist eine Website, diese wird vom Server bereitgestellt, und sowohl auf dem Server, als auch auf dem Clienten (im Browser) kann Code ausgeführt werden.
Als nächstes gibt es noch die Serviceentwicklung bzw Daemons, das ist Software die anderer Software Dienste bereitstellt (ein Server) und vor allem im Hintergrund läuft und kaum/keine Interaktion des Nutzers benötigt.
Programme, so bezeichne ich den Rest, diese sind Oft mischungen aus den drei obigen Kategorien, z.B. Compiler welche Sowohl für den Nutzer bereit stehen (so wie Apps) allerdings auch anderer Software bereitsteht (wie ein Server).
Nun könnte man über diese Kategorisierung meckern, ich bin auch nicht 100% glücklich damit, aber für den Anfang sollte das reichen um ein grobes Bild zu vermitteln.
Nun ein Wenig zu den Oben genannten Programmiersprachen, Cobol und Fortran darfst du direkt mal vergessen (Cobol ist eine Banksprache und Fortran eine Hyper Computing Sprache, beide aus den 50er'n, reine Nieschensprachen) die habe ich nur mal angeführt um zu zeigen es gibt noch viele Sprachen, grade wenn man sich Spezialisiert.
C++ ist eine Native Sprache welche vom Compiler direkt in Maschinencode Übersetzt wird, und somit sehr Hardware und Systemnah läuft, was gute Optimierung im Bezug auf Geschwindigkeit zulässt. Allerdings ist C++ eine Low Level Sprache, und man ist auf viele Bibliotheken von Dritten angewiesen (z.B. QT) um ein Level an abstraktion zu erhalten, damit die Software nicht nur auf einer Plattform läuft. C++ ist Grundsätzlich Plattform unabhängig, allerdings bieten die Standardbibliotheken nicht allzuviele Komponenten und Funktionen, weswegen sehr schnell auf Systemfunktionen zurückgegriffen werden muss, wodurch der Code Plattformabhängig wird. Außerdem gibt es viele Verschiedene Compiler, und ein Code der im g++(ein C++ Compiler) läuft muss nicht zwangsläufig im VC++ (ein andere Compiler ;)) laufen. Außerdem ist man auch von der Prozessorarchitektur abhängig, wenn Code auf x86 gut läuft kann er unter ARM viele Fehler machen.
C++ eignet sich vor allem sehr gut für Systemnahe Anwendungen, sowie Services. Für Grafische Anwendungen benötigt man meist Bibliotheken (wie QT), und es passiert schnell, das ein eigentlich Plattformunabhängiges Programm nur unter der Entwicklungsplattform vernünftig läuft. Durch die Gute Möglichkeit der Optimierung an die Plattform und sehr guter Compiler Optimierung wird C++ auch gerne genommen wenn man eine gute Leistung erzielen will. C++ hat meines Erachtens nach zwei große Nachteile, zum einen Brauchen die Compiler ewig (man benötigt für ein etwa 150MB großes Projekt schon gut und gerne mal 30-45 Minuten), zum anderen hat C++ eine sehr Lasche Syntax, und lässt sehr viele Konstrukte zu, die sehr schnell zu Fehlern führen können (z.B. = statt == und der Compiler wirft nicht mal ne Warnung), allerdings kann man somit viel Platz und Zeit sparen. Und diese lasche Syntax erlaubt auch dass ein Code zwar funktionieren mag, aber unter anderen Voraussetzungen (z.B. anderer Compiler) plötzlich ungewollte Fehler auftreten.
C# ist eine von Microsoft entwickelte Sprache für das .Net Framework. Die Sprache wird zwar in einen Bytecode Kompiliert, die Anwendungen werden allerdings von der CLR, eine Software welche Teil des .Net ist Ausgeführt, und laufen somit nicht Nativ. (Allerdings auch nicht Interpretiert, die CLR Emuliert eine eigene Maschiene, mit eigener Architektur, welche in der Form nicht exsistiert, und auf dieser virtuellen Maschine wird der Code ausgeführt)
Somit ist C# nicht so Systemnah wie Native Sprachen, und können somit von jedweder Plattform abstrahiert werden. Auf einfach, C# läuft überall wo eine .Net Implementierung (z.B. Mono) drauf läuft.
C# ist vor allem zur einfachen Entwicklung von Apps, vor allem Grafischen Nutzeranwendungen ausgelegt, und als High Level Sprache muss man sich mit Technischen Details wie Speicherverwaltung nicht beschäftigen. C# wurde Ursprünglich für Windows entwickelt, läuft dank Mono allerdings mittlerweile auf verschiedenen Systemen (wie gut sei dahingestellt, habe es lange nicht mehr verwendet). Mit C# lassen sich natürlich auch Service Anwendungen schreiben, und mit ASP.Net auch Webentwicklung betreiben, aber der Kernfokus liegt auf der App Entwicklung (für Windows und Windows Phone). C# punktet vor allem durch die einfachen Forms, mit einem Formeditor, mit welchem du mit ein Paar Klicks eine Voll funktionsfähige Formularanwendung zusammenklicken kannst, außerdem bietet das .Net eine große Reihe an Funktionen und Klassen bietet, womit viele komplexe Probleme sich einfach realisieren lassen. Außerdem ist C# ich nenn es gern Idiotensicher, man kann relativ wenig falsch machen (im vergleich zu C++) und das .Net spuckt herforagende Fehlermeldungen aus, mit denen sich Fehler leicht auffinden und beheben lassen. Nachteil von C# ist, es läuft nicht nativ, wer Systemnah programmieren will wird wohl kaum seinen Spaß haben. Außerdem steht die CLR zwischen dem Programm und dem System was dazu führt das die Programme mehr Ram benötigen, und nicht so fix laufen. Außerdem bist du an Plattformen gebunden auf denen .Net (oder Mono) läuft, und je nach Plattform ist das unterschiedlich weit und gut Implementiert (z.B. BSD wird von einer Separaten Crew gemacht)
Pascal ist wie C++ eine Native Sprache, welche in 2 Hauptableger hat, Delphi und FreePascal. Während Delphi hauptsächlich auf die Windows Entwicklung abziehlt ist FreePascal auf Cross Plattform Kompatiblität ausgelegt. Beide ziehlen vor allem (ähnlich zu C#) auf die App Entwicklung ab, und bieten auch ähnliche Vorteile wie C#. Allerdings ist Pascal eine Low Level sprache, und man muss sich mit der Maschine (z.B. dem Speicher) auseinandersetzen. Delphi und Lazarus (eine IDE für FreePascal) bieten die VCL bzw LCL, ein Framework welches zur erstellung Grafischer Anwendungen dient, und die IDE's stellen auch einen Formeditor ähnlich zu dem von C#. Die Frameworks von Delphi bzw. FreePascal sind auch relativ groß und bieten viele einfach zu nutzenden Objekte und Funktionen, allerdings ist es nicht ganz so Groß wie das .Net. Pascal ist eher ein Mittelding zwischen C++ und .Net (bzw eher sogar Java). Neben Apps lassen sich mit Pascal auch Serviceanwendungen und andere Programme sehr gut schreiben, und die Anwendung sind auch relativ klein, und resourcesparend wie bei C++. Die Syntax ist sehr Strikt, was damit zu tun hat, das Pascal als Lernsprache für Studenten entwickelt wurde um Sauberes Programmieren zu lehren. Heutzutage ist Pascal nicht mehr so Strikt, allerdings im Vergleich zu C und C++ liegen dennoch Welten dazwischen. So muss man oft mehr Code schreiben, der Code ist dafür aber besser Wartbar, leserlicher, und weniger Fehleranfällig. Durch das Unit System von Pascal Compiliert Pascal Code aber Signifikant schneller als C++ (ein Faktor 10 ist schonmal mindestens drin). Nachteile sind, zum einen das der Pascal Ableger Delphi sehr Teuer ist, außerdem das bei FreePascal viele (grade weiterführende dinge wie Cross Compiling) schon recht viel erfahrung brauchen und nicht sehr Anfängerfreundlich ist. Außerdem sind die Pascal fehlermeldungen komplett für die Katz und komplett nichtssagend.
Javascript ist eine Komplett interpretierte Sprache, eine so genannte Skriptsprache, und kommt ursprünglich aus der Webentwicklung. Javascript wurde entwickelt damit Websiten Code im Browser ausführen können, und nicht alle Berechnungen Serverseitig stattfinden müssen. Mittlerweile gibt es mit z.B. Node.js oder Angular.js gibt es auch Javascript Ableger für Serviceanwendungen bzw. Apps. Die Javascript Syntax lässt nahezu alles zu, und ist ziemlich einfach zu erlernen. Da der Interpreter sich um alles kümmert muss man sich auch recht wenige Gedanken über die Daten oder ähnliches machen.
Die Nachteile von Javascript sind vor allem, das Javascript immer einen Interpreter braucht, außerdem der Code recht schmutzig gehalten werden kann und somit die Wartbarkeit und Lesbarkeit komplett vor die Hunde geht.
Haskell ist eine Funktionale Sprache, und unterscheidet sich somit vom Fundamentalen Konzept von den anderen Programmiersprachen die ich hier genannt habe. Bei Imperativen Sprachen wie C++ oder C# sagt man dem Computer Schritt für Schritt was er tun soll. Bei Funktionalen Sprachen wie Haskell sagt man Haskell was er rechnen soll (natürlich auch ein bisschen wie) aber um die Umsetzung kümmert sich dann Haskell selbst. Haskell wird Kompiliert und kann problemlos was Geschwindigkeit und Ram Auslastung angeht mit Sprachen wie C++ und Pascal mithalten. In Haskell sind vor allem Algorithmen deutlich kürzer, ein Quicksort (sortieralgorithmus) ist in Haskell ein Dreizeiler in C++ ist man nicht kürzer als 15 Zeilen. Außerdem ist Haskell Code sehr gut Wartbar und leserlich. Haskell wird oft in Kombination mit Imperativen Programmiersprachen verwendet, wobei die Logik und die Berechnungen durch Haskell erledigt wird, und z.B. das Grafische Layout durch eine Imperative Sprache, da diese dabei deutlich besser sind.
Swift wurde von Apple als Nachfolger von Objective-C für iOS und OSX entwickelt. Hier brauch ich eigentlich nicht viel über swift zu sagen, denn die Frage ob man swift lernen sollte lässt sich einfach beantworten: Hast du einen Mac, willst du Software exklusiv für OSX oder iOS schreiben? Wenn ja ist Swift die Sprache der Wahl, wenn nicht, Finger weg von Swift.
Und zu guter letzt Java. Das mach ich kurz Java ist Konzeptionell ähnlich zu C#, großes Framework was viel arbeit abnimmt, Virtuelle Maschine die den Code ausführt, High Level Sprache. Im gegensatz zu C# is Java allerdings nicht auf die Windows App Entwicklung ausgelegt, sondern auf die Cross plattform Entwicklung. Java Code läuft überall gleich, und das ist der Wichtigste Punkt für Java. Mit Java lassen sich sowohl Webanwendungen, Services und Apps schreiben, und in Java wird von Autoradiosoftware, bis hin zu Webservern alles geschrieben, was Java zu einer guten allarounder sprache macht wenn Plattformunabhängigkeit wichtig ist. Java ist außerdem die Haupt Android Sprache. Der größte Kritikpunkt an Java ist wohl die Unterirdische performance (verglichen mit z.B. C# oder gar nativen Sprachen). Außerdem ist Java recht Strikt und schränkt den Entwickler der z.B. C# gewohnt ist schon ein wenig ein.
So nun damit hätte ich eine kurze Erklärung zu ein Paar Sprachen. Es gibt natürlich noch Tausende mehr. Jetzt liegt es an dir, mein Rat, sieh dir ein wenig Quellcode an, und dann überleg dir welche Sprache du lernen möchtest. Im Leben eines Programmierers lernt man sowieso mehrere Sprachen, die Frage die sich jetzt stellt ist eher mit welcher du einsteigen möchtest.
Ich persönlich nutze Privat fast ausschließlich Pascal, da ich hauptsächlich Apps für Windows und OSX schreibe, und ich die Strikte Syntax mag und gerne Low Level programmiere.
Außerdem ist Pascal für jeden der wirklich Programmieren lernen will durch die Hardware und Systemnähe, und die didaktisch gut gewählte Syntax sowie den für jeden Einsehbaren Quelltext der Standardbibliotheken gut geeignet, aber durch das Große Framework zu Anfang nicht so frustrierend wie z.B. C++.
Wer eher schnell gute Ergebnisse möchte wird mit Pascal eher weniger Froh werden, da man auch die Technischen Hintergründe und das System verstehen muss, für den wäre eher C# oder Javascript was.