Wie groß sind die verschiedenen Unterschiede zwischen den Conputersprachen?

... komplette Frage anzeigen

3 Antworten

Es gibt ein paar grundlegende Konzepte, die man - einmal verstanden - evtl. mit anderer Syntax auch in andere Sprachen übernehmen kann.

Aaaaaaaaaaber ...

Du wirst auch oft so etwas hören wie: "Kann man eine Programmiersprache, kann man alle. Nur die Syntax ist etwas unterschiedlich." ... aber das stimmt ganz und gar nicht. Solche Aussagen kommen größtenteils von Leuten, die höchstens erst wenige Jahre programmieren.

Zu einer Programmiersprache gehören auch Konzepte oder sog. Paradigmen. Diese zu verinnerlichen dauert sehr lange, auch wenn man vorher schon X Programmiersprachen relativ gut beherrscht.

Vergleichen wir mal die Funktionsweise eine einfachen Schleife, mal völlig von syntaktischen Unterschieden abgesehen:

Java: Funktioniert durch inkrementieren eines primitiven Integers.

Ruby: Wie Java, wobei der Integer ein höheres Objekt ist.

Python: Funktioniert mit Generatoren.

Pascal: Funktioniert auch ähnlich wie Java, aber auch ohne Bedingung.

C++ Template: Funktioniert durch Klassenerzeugung zur Kompilierzeit.

Bash: Funktioniert durch Aufruf eines test-Programms.

Assembler: Funktioniert mit reinen Sprüngen.

Haskell: Funktioniert funktional.

Scheme: Rekursiv mit Lambdas.

Verilog: Funktionieren so extrem anders, dass ich es jetzt nicht weiter ausführe.

Disclaimer für mitlesende Profis: Ich weiß, a) viele der Sprachen kennen auch andere Schleifentypen, b) Assembler und vor allem Verilog ist nicht direkt als Programmiersprache zu bezeichnen, c) es geht mir nicht darum zu zeigen, was mit den genannten Sprachen möglich ist, sondern was allgemein getan wird, d)ich will hier jetzt nicht den Rahmen mit Details sprengen. :)

Allein bei Schleifen gibt es unglaublich viele Unterschiede, die nicht nur Syntaktischer Natur sind. Bei erweiterten for-Schleifen in einigen Sprachen, bei Generatoren, bei Objekten, bei Sprüngen und bei Rekursion muss man völlig unterschiedliche Dinge im Hinterkopf behalten um sicher und effizient programmieren zu können.

Wenn man sich allein hierbei denkt: "Och, ist ja nur ne andere Syntax." dann schneidet man sich arg ins eigene Fleisch. So, und das waren nur Schleifen! Es gibt aber noch mehr primitives Zeug wie Ausdrücke, Bedingungen, Operatoren und dann deutlich komplexere Sachen wie Funktionen, Klassen oder gar Generics.

All das wissen der genannten Punkte kann man nur sehr sehr bedingt von einer Sprache in die andere übernehmen. Gerade bei OOP gibt es da sehr viele subtile Eigenheiten und allein die Unterschiede zwischen C# und Objective-C würden alleine schon ein dickes Buch füllen.

So ... bis hier hin reden wir fast nur von Syntax und sprachlichen Eigenheiten. Jetzt kommt aber noch die Standardbibliothek einer Sprache und die dazu gehörenden Entwurfsmuster und Designentscheidungen dazu.

Zum Beispiel C++ Iteratoren sind konzeptionell vöööööllig anders als Javas Iteratoren. Und hinzu kommt, dass C++ ab Version 17 noch einen Schritt weiter geht und das Konzept stark erweitert, was einen riesigen Teil der Standardbibliothek zu überladenen Alternativen zwingen wird. (Obwohl man beide Konzepte bedingt auch in beiden Sprachen implementieren könnte, was im Endeffekt aber ineffizienter wäre.)

Bleiben wir bei C++ und Java: Beide kennen Templates, aber bei C++ sind diese Templates eine Turing-Vollständige und eigenständige Programmiersprache die zur Übersetzungszeit ausgeführt wird, und konstante Ausdrücke erzeugt. Bei Java gibt es Typlöschung, was wiederum völlig anders funktioniert als bei C++.

Javas Generics kann man sehr komfortabel einschränken, bei C++ muss man etwas umständlich mit Traits und static_assert arbeiten, aber auch hier kommt ab Version 17 ein Konzept, dass lustigerweise "Konzepte" heißt. :)

Aber zurück zum Thema: Das Wissen über Generics / Templates beider Sprachen kann man nicht austauschen. Ein C++ler mit mäßigen Java-Kenntnissen wird zwar mit Ach und Krach etwas funktionierendes bauen können, aber nur der Java-Entwickler kennt wichtige Details. Aufgrund des Featureumfangs ist es umgekehrt sogar noch viel extremer, wenn ein Java-Programmierer sich ohne größere Vorkenntnisse an C++-Templates wagt.

Wie gesagt: Es braucht viel Zeit wichtige Paradigmen einer Sprache zu verinnerlichen.

Ob eine Schleife jetzt überall mit "for" oder "while" eingeleitet wird, ist mehr oder weniger uninteressanter Kinderkram. :)

Zu einer ähnlichen Frage hier bei GF, hatte ich mal das Beispiel des Öffnen und des Schließens einer Datei genannt. Dabei geht es nicht mal um das Lesen und Schreiben von Daten, sondern nur den "nackten" Öffnen- und Schließ-Vorgang.

Das ist nämlich genau so ein Beispiel, bei dem viele Einsteiger sagen: "Das ist doch einfach, kann ich locker in mehreren Sprachen". Aber die wenigsten können es tatsächlich, nämlich im Hinblick auf Sicherheit und die Vermeidung von möglichem Datenverlust.

Ich kenne viele Python, C#, Java und C++ Entwickler, die eine Datei mit der entsprechenden close() bzw. Close() Methode schließen würden, aber wenn diese im Gültigkeitsbereich des Dateiobjektes direkt aufgerufen wird, kann man mit zu 99%iger Sicherheit sagen, dass der Programmierer einen Fehler gemacht hat.

In Python benutzt man dafür Scope-Guards, in C# using und Disposable, in Java Try-With-Ressources, in C++ ein Aufräum-Objekt und in anderen Programmiersprachen eben andere entsprechende Konstrukte, aber KEINEN direkten close()-Aufruf.

Um deine Frage zu beantworten:

Wenn du eine oder mehrere Programmiersprachen relativ flüssig kannst, geht es im Laufe der Zeit immer schneller, dir eine neue Syntax, Konventionen für Bezeichner, den Aufbau der Standardbibliothek und gängige Entwurfsmuster einer weiteren Sprache einzuprägen.

Um die Konzepte einer neuen Sprache zu verinnerlichen, wirst du aber immer (fast) gleich lange brauchen, auch wenn du vorher schon mit über 20 Sprachen zu tun hattest.

Bei Assembler, Erlang und AspectJ zum Beispiel muss man erst mal wieder (fast) bei Null anfangen, zumindest auf die Konzepte bezogen, die sich nicht mit anderen Sprachen schneiden.

Andere Sprachen haben viele kleine nette Konzepte, die man so nur in abgewandelter Form bei anderen Sprachen findet. (Rubys Blöcke vs. Groovy's Closures und curry()) Auch hier sind die Unterschiede nicht bloß syntaktischer Natur.

Fazit:

In je mehr Sprachen du Vorkenntnisse hast, desto schneller kannst du die Syntax und die Basics einer weiteren neuen Sprache lernen. Für wirkliches Verständnis und die Fähigkeit wirklich akzeptabel in der neuen Sprache programmieren zu können, brauchst du aber jedes mal aufs neue fast die selbe Zeit.

Bis man wirklich clever, effizient, sicher und elegant in einer neuen Sprache entwickeln kann, vergeht jedes mal aufs neue viel Zeit. Die einzige Ausnahme ist hier wohl die zu aller erst gelernte Programmiersprache, für die man wohl immer am längsten braucht. :)

(Das ist auch der Grund, warum ich hier auf GF fast nichts zu Swift, D, Go, Rust, Vala oder Lua, schreibe, da ich mich in den Konzepten dieser Sprachen darin doch nicht sicher genug fühle, als dass ich anderen auf diesem Gebiet Ratschläge geben möchte.

Zu anderen Sprachen wie PHP schreibe ich bewusst wenig, da diese Sprache ein riesen Haufen Murks ist. Perl und JS sind zwar gewöhnungsbedürftig, aber im Grunde ganz interessant, allerdings mache ich damit in letzter Zeit kaum etwas, sodass ich vermutlich nicht mehr ganz auf dem neuesten Stand bin.)

So, das war jetzt länger als ursprünglich geplant, aber egal. :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von SchakKlusoh
27.11.2016, 11:45

Gehe ich recht in der Annahme, daß Du keine Ahnung von Systematik, Programmierparadigmen und Software-Engineering hast?

Das sind drei Seiten auf meinem Bildschirm mit einem Kuddelmuddel an unstrukturierter Meinung.

Bist Du echt EXPERTE für PROGRAMMIEREN?

0

Gibt sehr viele Ähnlichkeiten aber auch große Unterschiede. Wenn du eine Sprache bzw. gelernt hast, übersichtilich und nachvollziehbar zu programmieren, fällt dir jede weitere deutlich leichter.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von skminga
27.11.2016, 00:17

Hast du vergleiche?

0
Kommentar von SchakKlusoh
27.11.2016, 19:32

Weißt Du, was das Wort Syntax bedeutet? Oder Paradigma? Oder Prozedural?

1

Im Prinzip sind alle ähnliche, sie basieren auf der Englischen Sprache und so ist der grossteil selbst erklärend.

Meistens musst du nur wissen was genau du machen kannst, wie du es schreiben musst und wie verbinden.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
27.11.2016, 04:16

Im Prinzip sind alle ähnliche, sie basieren auf der Englischen Sprache und so ist der grossteil selbst erklärend.

Diese Aussage bezweifle ich dann doch sehr sehr stark. :)

(siehe meine Antwort für Erläuterungen)

0
Kommentar von SchakKlusoh
27.11.2016, 11:46

Mach Dich mal schlau über Programmierparadigmen.

Schau Dir mal Assembler, Java und Forth an. Du wirst Dich wundern, wie ÄHNLICH die sich sind.

1
Kommentar von SergeantPinpack
27.11.2016, 14:21

Diese Antwort ist auf so vielen Ebenen falsch, da weiß man gar nicht, wo man anfangen soll.

1
Kommentar von SchakKlusoh
27.11.2016, 19:30

Wer hat so wenig Ahnung, daß er bei dieser Antwort DREIMAL auf "Pfeil hoch" klickt???????

1

Was möchtest Du wissen?