Programmiersprachen - immer gleicher Ablauf?

Das Ergebnis basiert auf 10 Abstimmungen

Ja, so ist das. 90%
Nein, stimmt nicht. 10%

6 Antworten

Ja, es gibt bei verschiedenen Sprachen oft Gemeinsamkeiten bei der Liste an Features und auch die Herangehensweise bei Problemen kann gleich sein, da das gewählte Programmierparadigma gleich ist. Somit ist es etwas leichter, wenn man auf bereits bekannte Ideen/Begriffe stößt oder sich die Syntax generell ziemlich ähnlich ist.

Dennoch sollte man ziemlich aufpassen, dass sich eben nicht nur die Syntax erheblich unterscheiden kann, sondern ebenso das Verhalten (in verschiedenen Situationen) oder eben doch die grundsätzliche Auffassung von Begriffen.

Dazu ein paar Beispiele:

  • Java, C, Delphi und PHP kennen jeweils Arrays. Alle drei setzen diese aber völlig unterschiedlich um bzw. haben ein anderes Verständnis davon, wie sich ein Array verhalten kann/darf.
  • Es gibt unterschiedliche Formen von Vererbung oder Polymorphie (Vergleiche JavaScript mit Java).
  • Nicht in jeder Programmiersprache gibt es immer die gleichen Kontrollstrukturen (Bsp.: cond, switch-case).
  • Variablensichtbarkeiten verhalten sich je Programmiersprache anders. In JavaScript wird eine als var-deklarierte Variable im for-Schleifenkopf für den Kontext, in dem die Schleife liegt, angelegt und nicht nur für den Schleifenkörper. Das wäre in Java, C, C#, ... nicht der Fall. Hinsichtlich objektorientierter Zugriffsbeschränkungen unterscheiden sich default modifier und überhaupt die Auswahl an Zugriffsmodifikatoren (vergleiche C#, Python und Go)
  • Der Begriff Referenz wird in bspw. Java anders verstanden, als in C++.
  • Häufig gibt es unterschiedliche Auflistungen an primitiven Datentypen (in JavaScript gehört bspw. ein String dazu und es gibt keine Unterscheidung zwischen un-/signed Integers).
  • Die Wertebereiche von Datentypen können sich unterscheiden. In PHP läuft ein Integer in einen Float über. In C nimmt der boolsche Typ _Bool explizit 0/1 entgegen, sofern man nicht die Makros true/false aus stdbool.h einbindet.
  • Öfter gibt es Unterschiede in der Umsetzung bestimmter Algorithmen oder Konstrukte (Vergleiche.: Delegation in Java, Objective-C, C#, JavaScript; Duff's Device in C und Java; Enums in Java, C++ und JavaScript; structs in C#, Go und C).
  • Verschiedene Programmierparadigmen gehen vollkommen unterschiedlich an Probleme heran. Vergleiche CLisp, Haskell, QML, Go, Java und C miteinander.
  • Die technologische Basis hat ebenfalls einen Einfluss darauf, was es gibt und was man nutzt. Beispiel: Makros (in C++) oder ereignisgesteuerte Programmierung (JavaScript) statt des Einsatz verschiedener Threads (Java).

Also auch wenn man nach bspw. Java schneller auf C# umsteigen kann, sollte man Acht darauf geben, Themen beim Lernen nicht komplett zu überspringen und sich ebenso mit dem Stil/der Motivation der neuen Sprache beschäftigen. Eine Verschiebung findet bereits statt, wenn sich Sprache A auf ein Aufgabengebiet A festgelegt hat und eine Sprache B wiederum auf ein Aufgabengebiet B.

Teils-teils

Die grundlegende abstrakte Denkweise (man nutzt Variablen/Pointer, etc.) ist immer gleich, egal bei welcher Programmiersprache. Das ist für viele die größte Hürde, entsprechend fällt die mit zunehmender Erfahrung weg.

Darüber hinaus gibt's noch weitere Konzepte (wie die for-Schleife), die sich oft ähneln, aber die sind eben nicht immer gleich. Z.B. kennt Assembler sowas wie eine for-Schleife nicht, aber Du kannst die technische Grundlage selber nachbauen.

Auch bei höheren Sprachen und Konzepten gibt's Unterschiede. Z.B. sind C# und Java streng typisierte objektorientierte Sprachen, heißt: Ein Objekt hat ein Typ und kann das, was der Typ kann, mehr nicht.
Es gibt aber auch JavaScript, das ist eine dynamisch typisierte objektorientierte Sprache, heißt: Der Typ definiert sich durch das, was das Objekt kann bzw. hat und Du das kannst Du ständig ändern.

Und darüber hinaus gibt noch einen wichtigen Punkt, den gerade unerfahrene Entwickler gerne übersehen: Eine Programmiersprache und die dafür entwickelten Frameworks folgen meist einem gewissen Prinzip. Frameworks für C#/.NET sind konzeptionell meist ähnlich aufgebaut, PHP-Frameworks ticken oft völlig anders.

Dieser Unterschied ist der, der am aufwendigsten zu lernen ist, es dauert viel Zeit, bis man ein Gefühl dafür hat, wie die "Welt" um eine Programmiersprache herum tickt.
Man kann zwar auch ohne dieses Verständnis für diese "Welt" arbeiten, allerdings bauen solche Einsteiger gerne mal unschöne Konzepte ein, die sich an vielen Stellen mit bereits vorhandenen Dingen beißen. Ein Beispiel wäre z.B. eine Arbeitsweise mit Error-Codes, die bei C++-Entwicklern beliebt ist, bei C#, das grundlegend auf Exceptions aufgebaut ist, aber zu einer Art "Nebenwelt" führt, die nicht mit dem eigentlichen Verfahren zusammenpasst.

Das lässt sich natürlich nicht nur auf die Sprache beziehen, einige Frameworks bauen auf architektonisches Grundwissen auf, ohne das man das jeweilige Framework nicht richtig nutzen kann bzw. permanent daran vorbei arbeitet und sich viele Probleme schafft. WPF oder ASP.NET Core wären solche Beispiele, Ersteres baut auf MVVM auf, Letzteres auf einer Sammlung von Patterns, begonnen mit DependencyInjection.

Aber ja - wenn es um das reine Benutzen einer Programmiersprache geht, hast Du schon recht. Allerdings sind die Leute, die mit dieser Herangehensweise glauben, sie wüssten, was sie tun, meist noch sehr weit davon entfernt ;)
Der erste Aufwand zum Lernen der Programmiersprache fällt also weg, doch der größte Auwand, bis man auch weiß, was man tut, der bleibt.
Wirklich lernen kann man das aber nicht, das ist rein Erfahrung.

Ja, so ist das.

Natürlich ist die Syntax schon etwas unterschiedlich, aber die grundlegenden Vorgänge und Gedanken sind immer ähnlich.
Autovergleich: wenn man ein Auto mit Automatik fahren kann, kann man eines mit Handschaltung auch eher fahren, als wenn man noch nie ein Auto gefahren hat.

Nein, stimmt nicht.

Das stimmt nur eingeschränkt. Natürlich gibt es einen gewissen Grundstock an Konzepten, der überall passt.

  • Es gibt Sprachen mit grundsätzlich anderen Paradigmen als man's vielleicht gewohnt ist. Beispiele wären Lisp (z.B. Scheme, Clojure), Haskell, Prolog, Erlang, wenn man aus der gängigeren Ecke der gemäßigten Multiparadigmen-Sprachen wie C++/Java/Python kommt. Und natürlich wird man als hochsprachengewohnter Entwickler erstmal schlucken, wenn man mit Assembler zu tun hat.
  • Wer immer nur den "gemeinsamen Nenner" lernt, ist in jeder Sprache ein schlechter Entwickler. Python ist z.B. eine Sprache mit Eigenheiten, die man verstehen muss, um wirklich effektiv zu sein: es ist zwar eigentlich intern sehr objektorientiert, aber zwingt den Entwickler nicht dazu. Als guter Python-Entwickler muss man eher mit Konzepten umgehen können die aus der funktionalen Programmierung kommen (Generatoren/Iteratoren, Pattern Matching). Wer C gelernt hat, kann sich in C++ erstmal in einer Nische von C-Code wohlfühlen - solange er die Wohlfühlzone nicht verlässt wird er aber nie effektiv C++ programmieren.
  • Ebenso entwickelt sich fast jede Sprache selbst weiter (und schnappt dabei Konzepte anderer Sprachen auf). Wer Java vor 20 Jahren gelernt hat, könnte immer noch genauso Java entwickeln. Aber die Programme werden unnötig lang, umständlich und fehleranfälliger sein als in modernen Versionen der Sprache.
Ja, so ist das.

Ja, das lässt sich auch auf andere Sachen übertragen.

Zum Beispiel wenn du dein 2tes Instrument lernst verläuft dies auch deutluch schneller und einfacher.

Denn wie du schon sagst auch wenn es Unterschiede gibt so ist der Kern doch immer gleich.