NG Programmiersprache?



  • ~john schrieb:

    Zeus schrieb:

    Ich interessieren mich über eure Gedanke wie eine Programmiersprache aussehen, bieten muss, damit Sie im Betracht käme, euch näher mit der Programmiersprache zu beschäftigen bzw. auch damit zu arbeiten?

    Ist das jetzt eine Frage nach einer Wunschsprache, oder ist das eine Frage nach den Beweggründen sich mit einer neuen Sprache auseinanderzusetzen?

    Sowohl als auch. Antworten wie programmierloser, rüdiger und volkard auf der ersten Seite bringen mir am Meisten. Weil ich greade in eine Redesign-Phase bin, kann ich diese gedanken gleich einbeziehen. Im Falle von rüdiger Aussagen hatte es direkt einfluß auf Entscheidungen. Volkard hat mir geholfen weil ich jetzt auf meine Platte ein Python/Pascal-Syntax-Mix habe, der mir sehr gut gefällt.



  • FreakY<3Cpp schrieb:

    Für den []-Operator gibt es in C#

    public int this[int index]
    

    Nur weil man jetzt nicht

    public static operator[](int index)
    

    schreiben kann, ist das ein Verbrechen? 😃

    Es ist ein schwäche in Sprachkonzept. IMO ist eine Sprache sehr gut, wenn sie minimal, eindeutig(Nicht nicht nur im Abstieg oder Aufstieg der Grammatikregeln sonder, dass auch zu ein syntaktische Konzept auch nur eine Repräsentation im AST zu finden ist.) und nachvollziehbar ist, d.h. wenn du Teile der Sprache siehst, kannst du intuitive auf andere Sachen schließen wie sie geschrieben wird. (oder POLS für „Principle of least surprise“).



  • Für mich muss eine Sprache ein durchgängiges Konzept vorweisen. Ich mag es z.B. nicht wenn eine Sprache durch zu viele Features glänzen möchte, die zwar Arbeit beim programmieren ersparen sollen, sich aber nicht ins Sprachkonzept einfügen lassen. Statt dessen ist es mir lieber wenn der Compiler gezielt Code generiert, den ich ohne Probleme auch selbst programmieren könnte - nur eben um mich als Programmierer zu unterstützen und nicht um mich zu verwirren.

    Ein Musterbeispiel dafür ist die noch junge Sprache Scala. Sie kombiniert objektorientierte und funktionale Programmierung und sorgt mit einer fantastischen Syntax für angenehm kurzen und trotzdem super lesbaren Code.
    Ermöglicht wird das z.B. durch das Konzept, dass alles ein Objekt ist (auch Operatoren).

    Der Aufruf

    5+3
    

    kann man auch durch

    (5).+(3)
    

    ersetzen. Das + ist der Name einer Methode der Klasse Int, deren Instanzen implizit durch die Zahlen 5 und 3 repräsentiert werden. Scala erlaubt das Weglassen von Punkten und Klammern wenn nur ein Parameter folgt. Eine geniale Regel, die das Sprachkonzept, dass alles ein Objekt ist, nicht beeinträchtigt und gleichzeitig für super lesbaren Code sorgt.

    Die Funktionale Programmierung trägt dazu bei den Code zu verbessern:

    // Java
    boolean nameHasUpperCase = false;
    for (int i = 0; i < name.length(); ++i) {
      if (Character.isUpperCase(name.charAt(i))) {
        nameHasUpperCase = true;
        break;
      }
    }
    
    // Scala
    val nameHasUpperCase = name.exists(_.isUpperCase)
    

    Beide Codebeispiele machen das gleiche, nur, dass der Scala-Code deutlich kürzer ist.

    Die Sprache selbst stellt nur einen kleinen Teil an Schlüsselwörtern, die den Programmfluss steuern, zur Verfügung. Ein Beispiel:

    actor {
      var sum = 0
      loop {
        receive {
          case Data(bytes) => sum += hash(bytes)
          case GetSum(requester) => requester ! sum
        }
      }
    }
    

    Lediglich var und case sind Schlüsselwörter, der Rest (auch das Ausrufezeichen) sind Methoden von Objekten. Einfach zu genial.
    Und noch einfacheren Code, der gleichzeitig lesbar bleibt, kann man schon fast nicht mehr schreiben. Klar muss man erst mal das Konzept der Sprache verstehen bis der Code lesbar ist aber dann gibt es daran nicht mehr viel auszusetzen.

    Der Sprache muss man einfach eine Chance geben...



  • Zeus schrieb:

    Sowohl als auch. Antworten wie programmierloser, rüdiger und volkard auf der ersten Seite bringen mir am Meisten.

    Dann versuche ich mal zu antworten.
    Abgesehen von ganz pragmatischen Gründen, weil es für bestimmte Aufgaben nur bestimmte Programmiersprachen/Frameworks gibt, verwendet werden können, etc. und man sich daher dazu entschließt oder es einfach tun muß, versuche ich mal meine Wunschsprache zu definieren.

    • Sie sollte in Maschinencode direkt übersetzbar sein
    • Exceptions
    • Sie wandelt die Hardware Ausnahmen direkt in Exceptions, d.h. IEEE Under-/Overflows etc. werden von der Sprache als Exceptions behandelt.
    • Zeiger, aber keine Zeigerarithmetik
    • streng typisiert
    • Subtyping
    • echte typedefs (d.h. Typen sind disjunkt und nicht wie bei C nur neue Namen für bestehende Typen)
    • kein GC (höchstens als Option)
    • RAII
    • Operatorenüberladung
    • Komplexe Zahlen
    • Intervallarithmetik
    • generische Programmierung zum Übersetzungszeitpunkt
    • generische Programmierung auch auf Basis von Typwerten und nicht nur Typen
    • eine Art von Precompiler, der alle Typen der Sprache kennt und Typsicher Programmcode aus einem Metaprogramm herauserzeugen kann.
    • OOP
    • statisches Dispatching ist die Regel
    • dynamisches Dispatching nur bei Bedarf
    • Mehrfachvererbung
    • Die Möglichkeit die Reimplementierung in jeder abgeleiteten Klasse zu erzwingen
    • Instanzmethoden, Instanzvariablen
    • Klassenmethoden, Klassenvariablen
    • Multimethoden (multiple dispatch)
    • Metaklassen (für integralen Datentypen nur statisch zugeordnet)
    • kein Duck Typing
    • Namensräume
    • Module

    Das ist so das was mir auf die schnelle einfällt. Das ganze muß nicht Teil des Kerns der Sprache sein, aber das meiste davon wird wohl nur so umzusetzen sein.



  • ~john schrieb:

    Zeus schrieb:

    Sowohl als auch. Antworten wie programmierloser, rüdiger und volkard auf der ersten Seite bringen mir am Meisten.

    Dann versuche ich mal zu antworten.
    Abgesehen von ganz pragmatischen Gründen, weil es für bestimmte Aufgaben nur bestimmte Programmiersprachen/Frameworks gibt, verwendet werden können, etc. und man sich daher dazu entschließt oder es einfach tun muß, versuche ich mal meine Wunschsprache zu definieren.

    • Sie sollte in Maschinencode direkt übersetzbar sein
    • Exceptions
    • Sie wandelt die Hardware Ausnahmen direkt in Exceptions, d.h. IEEE Under-/Overflows etc. werden von der Sprache als Exceptions behandelt.
    • Zeiger, aber keine Zeigerarithmetik
    • streng typisiert
    • Subtyping
    • kein GC (höchstens als Option)
    • RAII
    • Operatorenüberladung
    • Komplexe Zahlen
    • Intervallarithmetik
    • generische Programmierung zum Übersetzungszeitpunkt
    • generische Programmierung auch auf Basis von Typwerten und nicht nur Typen
    • eine Art von Precompiler, der alle Typen der Sprache kennt und Typsicher Programmcode aus einem Metaprogramm herauserzeugen kann.
    • OOP
    • statisches Dispatching ist die Regel
    • dynamisches Dispatching nur bei Bedarf
    • Mehrfachvererbung
    • Die Möglichkeit die Reimplementierung in jeder abgeleiteten Klasse zu erzwingen
    • Instanzmethoden, Instanzvariablen
    • Klassenmethoden, Klassenvariablen
    • Multimethoden (multiple dispatch)
    • Metaklassen (für integralen Datentypen nur statisch zugeordnet)
    • kein Duck Typing
    • Namensräume
    • Module

    Das ist so das was mir auf die schnelle einfällt. Das ganze muß nicht Teil des Kerns der Sprache sein, aber das meiste davon wird wohl nur so umzusetzen sein.

    Zu 95% C++
    Aber Du solltest Dir vielleicht mal D anschauen.



  • veritySeeker schrieb:

    Zu 95% C++
    Aber Du solltest Dir vielleicht mal D anschauen.

    D ist aus meiner Sicht eine Verschlimmbesserung, zuwenig Neues nur vieles anders das rechtfertigt die Inkompatibilität nicht.

    95% C++? Ich sehe schon das war zu knapp beschrieben.
    Das Typsystem von C++ ist mir zu lax, echte Typedefs und Subtypes, dazu ein echtes Modulkonzept wie in Ada das wäre ein großer Fortschritt (kein Pimpl Idiom mehr notwendig). Die Templates von C++ sind mächtig haben aber eine grauenhafte Syntax, wenn man Metaprogramming machen will.



  • ~john schrieb:

    D ist aus meiner Sicht eine Verschlimmbesserung, zuwenig Neues nur vieles anders das rechtfertigt die Inkompatibilität nicht.

    Unabhängig von meiner Meinung über 😨 Bitte an dieser Stelle keinen D-Flamewar anfangen, davon hatten wir schon einige.



  • ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?



  • thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Ein Beispiel wäre wenn du ein fliegendes Auto modellieren(oder ein GUI-Button der mit Klicks und Gesten zurechtkommt) möchtest dann brauchst du nicht zwei Schnittstellen neu implementieren sondern erbst von der Klasse Fahrzeug und Flugzeug. Dabei ist bestimmt ein wenig Vorsicht geboten, aber Sprachen wie C++ sind ja auch nix für den Rookie unter den Programmierern. So ein Feature ist manchmal einfach nice to have.



  • Jaja, das Amphibienfahrzeug jetzt mal als fliegendes Auto. Wieviel PS hat das dann? Soviel wie das Fahrzeug oder das Flugzeug oder ...?

    Mach mal ein Beispiel zu deinem GUI-Button der mit Klicks und Gesten zurechtkommt.



  • freizeit_programmierer schrieb:

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Ein Beispiel wäre wenn du ein fliegendes Auto modellieren(oder ein GUI-Button der mit Klicks und Gesten zurechtkommt) möchtest dann brauchst du nicht zwei Schnittstellen neu implementieren sondern erbst von der Klasse Fahrzeug und Flugzeug. Dabei ist bestimmt ein wenig Vorsicht geboten, aber Sprachen wie C++ sind ja auch nix für den Rookie unter den Programmierern. So ein Feature ist manchmal einfach nice to have.

    eigentlich entweder oder daher auch 2 variablen

    class Amphibienfahrzeug{
    var Fahrzeug = new Fahrzeug()
    var Flugzeug = new Flugzeug()
    }

    wollt aber eigentlich nur mal schauen wie das so mit den signaturen ist 🤡



  • thatway schrieb:

    Wozu brauchst du das?

    Bisher wurde in jeder populären OO-Programmiersprache Interfaces nachgerüstet oder war gleich Teil der Sprache. Mehrfachvererbung ist kein Problem zur Laufzeit, d.h. es kostet keine Performance. Bei Interfaces wird meistens eine Beschränkung der Namen für die Methoden eingeführt, das Konzept kann man für echte Mehrfachvererbung auch auf Elemente ausweiten, oder man nutzt die bekannten Maßnahmen aus den Sprachen mit Mehrfachvererbung um Konflikte aufzulösen. Als Entwickler sollte man soviel Wissen haben, daß man den Diamond of Death vermeidet.



  • ~john schrieb:

    thatway schrieb:

    Wozu brauchst du das?

    Bisher wurde in jeder populären OO-Programmiersprache Interfaces nachgerüstet oder war gleich Teil der Sprache. Mehrfachvererbung ist kein Problem zur Laufzeit, d.h. es kostet keine Performance. Bei Interfaces wird meistens eine Beschränkung der Namen für die Methoden eingeführt, das Konzept kann man für echte Mehrfachvererbung auch auf Elemente ausweiten, oder man nutzt die bekannten Maßnahmen aus den Sprachen mit Mehrfachvererbung um Konflikte aufzulösen. Als Entwickler sollte man soviel Wissen haben, daß man den Diamond of Death vermeidet.

    Ja und? Das führt immer nur zu diesen Superklassen die alles sind anstatt das die Funktionalität aufgeteilt wird. Die meisten "Is-A" Beziehungen könnten auch "Has-A" Bezeihungen sein.


  • Administrator

    ~john schrieb:

    • eine Art von Precompiler, der alle Typen der Sprache kennt und Typsicher Programmcode aus einem Metaprogramm herauserzeugen kann.

    Das wäre definitiv sehr interessant. Wenn wir von zum Beispiel C++ ausgehen, dann die Makros und Templates rausschmeissen, dafür in die eigentliche Sprache hinein eine Code-Generator Sprache implementieren. Ich habe mir sogar schon mal Gedanken darüber gemacht, eine Sprache zu entwickeln, welche nur als Code-Generator dient. Man programmiert dann ein Programm, welches vom Kompiler ausgeführt wird, damit daraus ein Programm zum Übersetzen in die Maschinensprache entsteht. 🙂
    Leider fehlt mir ein wenig die Zeit, diese Gedanken mal besser zu ordnen und niederzuschreiben.

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Gegenfrage: Wieso sollte man es verbieten? Und komm mir bitte nicht mit der Begründung, weil der Programmierer zu dumm ist, dieses Konzept vernünftig anzuwenden, denn dann darfst du ihn erst gar nicht programmieren lassen 😉

    Grüssli



  • Dravere schrieb:

    thatway schrieb:

    ~john schrieb:

    [*]Mehrfachvererbung

    Wozu brauchst du das?

    Gegenfrage: Wieso sollte man es verbieten? Und komm mir bitte nicht mit der Begründung, weil der Programmierer zu dumm ist, dieses Konzept vernünftig anzuwenden, denn dann darfst du ihn erst gar nicht programmieren lassen 😉

    Grüssli

    Weil man es nicht braucht. Keiner konnte mir bisher einen Fall nennen bei dem es vernünftig ist Mehrfachvererbung zu verwenden und es sonst keine bessere Lösung gibt.



  • Wie löst du denn das wenn du Methoden und/oder Eigenschaften von zwei Basisklassen brauchst ohne irgendwas neu implementieren zu müssen?

    Beispiele wurde hier schon genannt und jedem fällt da bestimmt auch noch was ein, außer dir anscheinend. Also entweder willste nicht oder kannst nicht, such es dir aus.

    Mir würde noch einfallen der Fleisch- und Pflanzenfresser. Der Mensch würde dann aus beiden Klassen erben.



  • Wahrscheinlich ist er so ein nur Virtuell-Maschine Programmierer oder halt ein Script-Kiddie oder halt einfach ein Troll der von nix eine Ahnung hat. Bitte gebt sowas keine Bühne hier, das ist das einzige Forum in deutsch wo die wirklichen Profis zu finden sind.



  • mehrfach schrieb:

    Wie löst du denn das wenn du Methoden und/oder Eigenschaften von zwei Basisklassen brauchst ohne irgendwas neu implementieren zu müssen?

    Beispiele wurde hier schon genannt und jedem fällt da bestimmt auch noch was ein, außer dir anscheinend. Also entweder willste nicht oder kannst nicht, such es dir aus.

    Mir würde noch einfallen der Fleisch- und Pflanzenfresser. Der Mensch würde dann aus beiden Klassen erben.

    Ja, immer so schöne Beispiele wie wir sie doch immer programmieren. Ich kann mich noch gut an mein letztes fliegendes Auto das von einem Fleischfresser gesteuert wurde errinnern. Es kommen immer nur so Anfängerbeispiel bei denen ein "Mensch" oder ein "Amphibienfahrzeug" programmiert wird. Vorher wurde "ein GUI-Button der mit Klicks und Gesten zurechtkommt" erwähnt, aber nicht wieso man da Mehrfachvererbung braucht.

    wortmeldung schrieb:

    Wahrscheinlich ist er so ein nur Virtuell-Maschine Programmierer oder halt ein Script-Kiddie oder halt einfach ein Troll der von nix eine Ahnung hat. Bitte gebt sowas keine Bühne hier, das ist das einzige Forum in deutsch wo die wirklichen Profis zu finden sind.

    Das Gefühl hab ich auch, dass es hier nur darum geht, dass C++ Mehrfachvererbung hat und die Leute es deswegen toll finden. Komischerweise finde ich in unserem C++ Code nur sehr selten Mehrfachvererbung und dann nur solche Stellen bei denen was zusammengehackt wurde.



  • In Java z.B. wäre Mehrfachvererbung auch nicht schlecht, zumindest für diesen Fall:

    public class MyFrame extends JFrame implements MouseListener, KeyListener
    {
      // viele leere Methoden
      // bei mehrfachvererbung könnte man schreiben extends MouseAdapter, KeyAdapter
    }
    

    Oder bei meinem letzten Projekt mit C++ musste ich auch sowas schreiben:

    class Window : public wxFrame, public irrklang::ISoundStopReceiver
    {
      // ...
    

    Zeige mir doch bitte eine Alternative ohne Mehraufwand die das selbe macht.
    Also so unnötig ist Mehrfachvererbung gar nicht.



  • Genau das macht man mit Mehrfachvererbung, immer diese Klassen die alles sind, weil man da ja so schön wenig Tipparbeit hat und alles lustig auf alles zugreifen kann. Warum muss ein Fenster irgendwelche Logik für SoundStop enthalten?

    Wie schon anfangs gesagt. Has-A vs. Is-A.
    Einfach mal das lesen: http://www.c-plusplus.net/forum/viewtopic-var-p-is-532117.html


Anmelden zum Antworten