Roadmap für ALLE Programmiersprachen

BeBur schrieb:
Da wo man Java einsetzt mag das ab und zu mal sein. Da wo man C++ einsetzt ist das absolut undenkbar. Letztendlich ist das kein "entweder oder". Man programmiert mehr denn je und es gibt mehr "no code" Lösungen als jemals zuvor. Das wird auch auf absehbare Zeit noch so weiter gehen. Programmierer werden immer dafür bezahlt Produkte zu bauen, die ein Consultant nicht mal eben zusammen klicken kann.
So ist es. Aber erkläre das mal vielen Nichtprogrammierern oder Schülern ...

Den Java-Rant kann man jetzt aber auch mal gut sein lassen, aus meiner Sicht. Niemand zwingt jemanden, (privat) etwas zu verwenden.
 
CyborgBeta schrieb:
Den Java-Rant kann man jetzt aber auch mal gut sein lassen, aus meiner Sicht. Niemand zwingt jemanden, (privat) etwas zu verwenden.
War sicherlich im Geiste eines Rants noch so geschrieben. Aber war auch ein stückweit ernst und insbesondere ohne Abwertung gemeint. Java verorte ich eher dort, wo man vllt. auch mal mit nocode Lösungen ran kann. Audio processing, raytracing, high performance computing und Co. ist dagegen nicht die Domäne von nocode.

Wie gesagt ist das kein "entweder oder". Es wird nicht weniger programmiert nur weil es mehr nocode Frameworks gibt.
 
  • Gefällt mir
Reaktionen: CyborgBeta
CyborgBeta schrieb:
Den Java-Rant kann man jetzt aber auch mal gut sein lassen
Naja. Ich seh' da kein Rant im Sinne von "wir bashen jetzt mal Java".
Und ja. Hier wurde natürlich viel über eher nicht so schönen Aspekte gesprochen.
Aber natürlich hat Java auch so einiges auf der Haben-Seite. So ist die Sprache relativ einfach zu erlernen, hat für ihr Abstraktionsniveau eine passable Geschwindigkeit, es gibt viel Dokus, Libs usw. dafür, und noch vieles mehr.
Hier behauptet also keiner, das das eine durch und durch unbenutzbare Sprache ist.

Die Fragestellung ging aber darum, ob sie gut durchdacht ist (was Du ja auch selbst aufgegriffen hast). Und ich würde mal sagen, da gibts deutlich Luft nach oben.
Und diesbezüglich würde ich auch dann eher nicht mit C++ vergleichen, sondern mit Smalltalk (oder einer modernen Implementierung wie Pharo, die Smalltalk noch Traits hinzufügt - im Java-Sprech würde man sagen: Interfaces die nicht nur Deklaration, sondern auch Implementation können).
Natürlich hat auch Smalltalk seine Nachteile, aber vom Sprachdesign her finde ich es wesentlich "durchdachter" als Java. Weil es das OOP konsequenter durchzieht und auf Spezialkonstrukte in der Sprache verzichtet.

Wobei man bei Java fairerweise sagen muss, das Kompromisse eingegangen worden sind zugunsten anderer Ziele (z.B. Performance).
Und ich finde das ansich auch kein Problem. Es gibt eben unterschiedliche Zielsetzungen die auch häufig nicht miteinander vereinbar sind und jede Sprache hat da halt ihren eigenen Schwerpunkt (was ja gut ist; weil 100 Sprachen die letztlich gleich sind braucht ja niemand).

Von daher kann man das doch alles ganz entspannt sehen. :-)
 
BeBur schrieb:
Programmierer werden immer dafür bezahlt Produkte zu bauen, die ein Consultant nicht mal eben zusammen klicken kann.
Neh, so wie Du das jetzt darstellst ist das nicht. Die Consultants, die da klicken, können und müssen sogar programmieren können. Ein Consultant muß ja flexibel sein. Das reine Klicken kommt direkt dann bei den Kunden vor (wobei da auch bei meinen Projekten einige fitte Leute darunter waren, die sehr wohl programmieren konnten). Wie Du es richtig sagst, man kann nicht alles modellieren.
BeBur schrieb:
Klar, eine Programmsiersprache ist eine Technologie für den Zweck, einen Computer zu programmieren. Das ist bei Maple wohl gegeben. Ist natürlich keine "general purpose" Programmiersprache.
Ich kenn das noch als problemorientierte Programmiersprache. Heute sagt man wohl dazu domänenspezifische Sprache oder anwendungsspezifische Sprache. Sonst könnte man ja Terraform, Shell wie sh, ksh, bash oder Ansible auch als Programmiersprache bezeichnen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BeBur
nutrix schrieb:
als Programmiersprache bezeichnen
Was man als Programmiersprache bezeichnen kann, darüber lässt sich streiten. Da müsste man sich erst mal eine Definition überlegen.

So ein allgemeiner Common sense war ja immer, das die Sprache turing-complete sein sollte. Worunter dann letztlich alles fällt, womit Du Werte speichern kannst und Kontrollstrukturen wie Schleifen und Bedingungsprüfung/Verzweigung hast, ums jetzt mal salopp zu formulieren.

Aber auch das mit der Turing-Vollständigkeit ist durchaus streitbar. So gibt es auch Programmiersprachen, die bewusst auf komplette Turing-Vollständigkeit verzichten, wie beispielsweise Crema.
 
  • Gefällt mir
Reaktionen: BeBur
nutrix schrieb:
Ich kenn das noch als problemorientierte Programmiersprache.
Ich kenne das unter dem Paradigma logische Programmiersprachen: https://de.wikipedia.org/wiki/Logische_Programmierung
Ergänzung ()

andy_m4 schrieb:
So ein allgemeiner Common sense war ja immer, das die Sprache turing-complete sein sollte. Worunter dann letztlich alles fällt, womit Du Werte speichern kannst und Kontrollstrukturen wie Schleifen und Bedingungsprüfung/Verzweigung hast, ums jetzt mal salopp zu formulieren.
Sogar printf erfüllt dies. 😬
Ergänzung ()

Edit:

 
  • Gefällt mir
Reaktionen: nutrix
andy_m4 schrieb:
Und ja. Hier wurde natürlich viel über eher nicht so schönen Aspekte gesprochen.
Es ist viel zielführender, wenn jeder über "seine eigene" Sprache rantet. Gerade auf Reddit gesehen: das hier kompiliert (clang 18, C++20):
C++:
constexpr auto foo() {
    static constexpr std::string a("0123456789abcde");
    static constexpr std::string b("0123456789abcde");

    return a.size() + b.size();
}

int main() {
    constexpr auto bar = foo();
    std::cout << "bar: " << bar << std::endl;
}
Das hier allerdings nicht:
C++:
constexpr auto foo() {
    static constexpr std::string a("0123456789abcde");
    static constexpr std::string b("0123456789abcdef"); // <=== Added a character to b

    return a.size() + b.size();
}

int main() {
    constexpr auto bar = foo();
    std::cout << "bar: " << bar << std::endl;
}
Und noch schöner: Das Verhalten kann variieren, je nachdem welche STL implementierung oder welcher Compiler verwendet wird. Der Grund liegt darin, wie std::string implementiert ist. "Kurze" strings werden anders gespeichert als "lange".
Ergänzung ()

andy_m4 schrieb:
Aber auch das mit der Turing-Vollständigkeit ist durchaus streitbar. So gibt es auch Programmiersprachen, die bewusst auf komplette Turing-Vollständigkeit verzichten, wie beispielsweise Crema.
Zusätzlich ist alles mögliche Turing-Complete z.B. Minecraft. Aber das macht Minecraft nicht zu einer Programmiersprache. Ist also weder ein hinreichendes, noch ein notwendiges Kriterium. Bitcoin Script ist ein weiteres Beispiel einer Programmiersprache, die absichtlich nicht Turing-Complete ist. Das Argument mit dem Turing-Complete ist irgendwie so ein Klugscheißer-Ding von Studierenden das sich so halbwegs durchgesetzt hat, weil 99% nur der Masse folgen und nicht selber nachdenken.
 
  • Gefällt mir
Reaktionen: andy_m4, nutrix und CyborgBeta
Also ... ich denke nicht, dass Alan Turing irgendwie keinen Weitblick hatte. ;)
 
Aber er hat ein Modell entworfen, oder sagen wir ein abstraktes Konstrukt bzw. eine (theoretische) Maschine, wodurch heute von vielen mit Konsens definiert wird, was eine Programmiersprache ist (also Merkmale und so) oder nicht. ;)
Aber egal, Bett ruft
 
CyborgBeta schrieb:
wodurch heute von vielen mit Konsens definiert wird, was eine Programmiersprache ist
Bezweifel ich, mich würde seriöse (wissenschaftliche) Literatur dazu aber durchaus interessieren.

CyborgBeta schrieb:
er hat ein Modell entworfen
Das spannende und erstmal überhaupt nicht selbstverständliche an der Turing-Vollständigkeit ist, dass sie die einzige praktisch relevante Berechenbarkeitsklasse darstellt. Church (btw. Doktorvater von Turing) hat z.B. das Lambda-Kalkül entdeckt, den theoretischen Unterbau für Funktionale Programmierung (Begriffe wie Lambda oder Closure kommen direkt aus der Theorie des Lambda-Kalküls). Rekursive Funktionen sind ein weiteres unabhängiges Pradigma und es gibt noch einige mehr. Überraschenderweise können die aber alle das selbe (nicht) berechnen. Und das sind die selben Dinge, die Programmiersprachen üblicherweise berechnen können.

Von daher gibt es da durchaus einen engen Zusammenhang, aber die Turing-Vollständigkeit ist halt nicht das, was eine Programmiersprache charakterisiert.
 
  • Gefällt mir
Reaktionen: andy_m4
CyborgBeta schrieb:
Sogar printf erfüllt dies.
:-)

BeBur schrieb:
Es ist viel zielführender, wenn jeder über "seine eigene" Sprache rantet.
Ja. :-)
Ich würde sagen, sowohl als auch.

BeBur schrieb:
Ist also weder ein hinreichendes, noch ein notwendiges Kriterium.
Sehe ich genauso. Genau deshalb hab ich es ja genannt und dann gleichzeitig relativiert.
Die Ausgangsfrage war ja, wie man eine Programmiersprache definieren kann. Und da Turing-Vollständigkeit ein eher nicht so gutes Kriterium ist, stellt sich halt die Frage, wie man es besser definieren kann.
Bis hin zu Dingen, ob es zwingend Textform haben muss.

CyborgBeta schrieb:
Aber er hat ein Modell entworfen, oder sagen wir ein abstraktes Konstrukt bzw. eine (theoretische) Maschine, wodurch heute von vielen mit Konsens definiert wird, was eine Programmiersprache ist (also Merkmale und so) oder nicht.
Ja. Nur ging es bei der Turing-Maschine ja nie im Programmiersprachen. Das wird auch aus dem Konzept deutlich, denn eine Turing-Maschine hat zum Beispiel unendlich viel Speicher. Und egal wie gut durch die Hardware künftig noch entwickeln mag: Unendlich viel Speicher können wir prinzipbedingt nicht haben.

Die Turing-Maschine ist nicht dafür da, um Programmiersprachen zu charakterisieren, sondern ist ein abstraktes Modell, um Algorithmen zu klassifizieren. Um grundsätzliche Aussagen darüber zu treffen, ob die "berechenbar" sind oder nicht.
Ansonsten hat ja BeBur ja bereits was dazu gesagt.
 
andy_m4 schrieb:
Die Turing-Maschine ist nicht dafür da, um Programmiersprachen zu charakterisieren, sondern ist ein abstraktes Modell, um Algorithmen zu klassifizieren. Um grundsätzliche Aussagen darüber zu treffen, ob die "berechenbar" sind oder nicht.
Ja, da widerspreche ich ja auch nicht.

Ich hab hier eine Definition gefunden:
1734775936403.png

https://verify.rwth-aachen.de/programmierungWS03/folien/I2_Grundlagen_von_Programmiersprachen.pdf

Der englischsprachige Wikipedia-Artikel geht aber noch weiter:

A programming language is a system of notation for writing computer programs.[1] Programming languages are described in terms of their syntax (form) and semantics (meaning), usually defined by a formal language. Languages usually provide features such as a type system, variables, and mechanisms for error handling. An implementation of a programming language is required in order to execute programs, namely an interpreter or a compiler. An interpreter directly executes the source code, while a compiler produces an executable program.

In one usage, programming languages are described as a subset of computer languages.[3] Similarly, the term "computer language" may be used in contrast to the term "programming language" to describe languages used in computing but not considered programming languages[citation needed] – for example, markup languages.[4][5][6] Some authors restrict the term "programming language" to Turing complete languages.[1][7] Most practical programming languages are Turing complete,[8] and as such are equivalent in what programs they can compute.

https://en.wikipedia.org/wiki/Programming_language

Also, ganz vereinfacht gesagt so, wie von dir bereits beschrieben:

  • Speicher/Variablen
  • Operanden und Operatoren
  • Kontrollstrukturen, Bedingungen und Schleifen
  • syntaktischer Zucker

Das würde für mich eine Programmiersprache ausmachen.

Man könnte dabei auch noch die Chomsky-Hierarchie ins Spiel bringen: https://de.wikipedia.org/wiki/Chomsky-Hierarchie#Übersicht

Hier geht es zwar um Automaten und Grammatiken, aber jede Programmiersprache hat vielleicht auch eine Typ-3-Grammatik.
 
Neben solche "formalen" Kriterien kann man natürlich auch noch andere Kriterien hinzuziehen.
Beispielsweise die Frage von I/O.
Also nehmen wir zum Beispiel mal C und denken uns die ganzen Bibliotheksfunktionen weg, die uns ermöglichen auf den Bildschirm zu schreiben oder mit Dateien und Netzwerk was zu machen.
Dann hätten wir eine Programmiersprache(?) mit der wir Schleifen etc. alles haben und auch "alles" berechnen können, aber wir können niemals das Ergebnis der Berechnung sehen.
Würde das dann trotzdem als Programmiersprache zählen? Obwohl das Ergebnis äquivalent zu dem wäre, ein leeres Programm zu haben?
 
  • Gefällt mir
Reaktionen: CyborgBeta
Am Ende ist es ziemlich egal, daher haben sich schärfere Definitionen nie durchgesetzt.

andy_m4 schrieb:
aber wir können niemals das Ergebnis der Berechnung sehen.
Bei einer Turing-Maschine kann man aufs Band drauf gucken... im echten Rechner kannst du ja in den RAM reinschauen.
 
  • Gefällt mir
Reaktionen: CyborgBeta
BeBur schrieb:
Bei einer Turing-Maschine kann man aufs Band drauf gucken... im echten Rechner kannst du ja in den RAM reinschauen.
Ja. Du könntest auch von außen auf die CPU gucken und anhand von Stromverbrauch, Temperatur u.ä. Ableitungen machen. Aber darum ging es ja nicht.
Es war mehr eine Art Gedankenexperiment. Was wäre, wenn man zwar prinzipiell rechnen könnte aber das Ergebnis nicht bekommt.

BeBur schrieb:
Am Ende ist es ziemlich egal
Ich würde sagen, das ist der Typ von Fragen bei dem es gar nicht darum geht, eine letztgültige Antwort zu finden, sondern wo der Fokus darauf liegt sich mit der Frage auseinanderzusetzen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CyborgBeta und BeBur
BeBur schrieb:
Klar, man braucht generell überhaupt keine sinnvollen Sprachkonstrukte oder 30 Jahre Weiterentwicklung was Programmiersprachen angeht. Programmieren so wie Großmutter früher :p.
Ursprünglich war es wohl so, dass solche "Tricks" wie Assembler als "Zeitverschwendung" angesehen wurden, man konnte doch gleich in Maschinencode schreiben - wozu also der Zwischenschritt? John von Neumann hat seinerzeit Mitarbeiter gerügt, die solche Ambitionen hatten:

jvm.webp
 
  • Gefällt mir
Reaktionen: andy_m4, BeBur und CyborgBeta
blöderidiot schrieb:
man konnte doch gleich in Maschinencode schreiben
Das wäre mir zu viel Recherche und Rechnerei. ;)
Asm soll einem ja diese Schritte ersparen und die Übersichtlichkeit erhöhen.
 
BeBur schrieb:
Klar, man braucht generell überhaupt keine sinnvollen Sprachkonstrukte oder 30 Jahre Weiterentwicklung was Programmiersprachen angeht. Programmieren so wie Großmutter früher :p.

Du hast ganz offensichtlich keine Ahnung wovon du redest. C ist gerade wegen der Simplizität so beliebt, weswegen es fast immer eingesetzt wird wenn Stabilität und Performance wichtig ist.

Ist ja schon fast peinlich deine Aussage aus Entwickler Sicht.
 
Zuletzt bearbeitet:
wilk84 schrieb:
wenn Stabilität und Performance wichtig ist.
Performance? Ja.
Stabilität? Hat schon nen Grund, dass selbst Torvalds sich Rust im Kernel nicht mehr versperren konnte.
 
  • Gefällt mir
Reaktionen: andy_m4 und CyborgBeta
Zurück
Oben