Gibt es im Sprachumfang reduzierte C Dialekte und welche Sprachfeatures wären der kleinste gemeinsame Nenner?



  • Was ich gerne mal wissen würde, ist, ob es im Sprachumfang reduzierte C Dialekte gibt?

    Und wenn man so einen C Dialekt entwerfen wollte, dessen Sprachumfang man auf den kleinsten gemeinsamen Nenner reduzieren würde, was würde dann an Features noch übrig bleiben?

    Der kleinste gemeinsame Nenner sollte so beschaffen sein, damit man damit noch ein einfaches Minix ähnliches Betriebssystem schreiben könnte.

    Auf so einfache Dinge wie for(;;) und do{}while() Schleifen als Sprachfeatures könnte man sicherlich verzichten, solange man while() hat, genauso auch auf ein double Datentyp wenn man float hat, aber könnte man bspw. auf Funktionszeiger verzichten?

    Benötigt man unbedingt if(){}else{} oder reicht auch einfach if()?

    Wie weit würde sich also C reduzieren lassen, damit man damit noch ein Minix ähnliches Betriebssystem programmieren könnte?
    Sprich, es wird eine minimale Sprache mit dem kleinsten Sprachumfang gesucht mit der sich noch ein Betriebssystem realisieren lässt.


  • Mod

    Jedes C-Programm (oder auch jedes Programm in einer beliebigen Sprache überhaupt), welches einfach nur irgendetwas berechnet, lässt sich in ein Programm bestehend aus + , - , = , == , if , goto , und stop umschreiben. Wenn man zusätzlich noch mit irgendetwas außerhalb der Black-Box des C-Programms reden möchte (z.B. mit dem Betriebssystem, um Fenster zu malen; oder für dein Minix mit der Hardware), dann braucht man noch einen Mechanismus, um diese Aktion auszulösen und das Ergebnis zu erhalten, also so etwas wie call .

    Man kann es auch noch minimaler machen, aber dann kommen wir in den Mindfuck-Bereich der theoretischen Informatik, wohingegen bei obigem Anweisungssatz noch ohne größere Erklärung nachvollziehbar sein sollte, dass man damit irgendwie alles machen kann.

    PS: Nein, dies gibt es nicht in der Wirklichkeit. Das ist etwas aus der theoretischen Informatik, wo man sich eben solche Fragen stellt, was ein Computer minimal können muss, damit man damit alles machen kann.



  • Entscheidend ist die Turing-Vollständigkeit.
    Du kannst auch mal die Beiträge in Are there minimum criteria for a programming language being Turing complete? oder What makes a language Turing-complete? dazu durchlesen.
    Da selbst Brainfuck Turing-vollständig ist, ist es also nur eine Frage der Bequemlichkeit (für den Anwender der Sprache), welche Sprachkonstrukte (und deren Syntax) man haben möchte.



  • Oskar schrieb:

    Auf so einfache Dinge wie for() und do{}while() Schleifen als Sprachfeatures könnte man sicherlich verzichten, solange man while() hat, genauso auch auf ein double Datentyp wenn man float hat, aber könnte man bspw. auf Funktionszeiger verzichten?

    Benötigt man unbedingt if(){}else{} oder reicht auch einfach if()?

    es reicht ein "gotoif()", damit kannst du das ausdrücken:

    unbedingter Sprung: ~ gotoif(1)
    if(x) goto ...: ~ gotoif(x)
    if(x) ... else ...: ~ gotoif(!x) Else; ...; gotoif(1) ExitIf; Else: ...; ExitIf: ...
    while(x) ...: ~ { Loop: gotoif(!x) ExitLoop; ...; gotoif(1) Loop; } ExitLoop: ...
    

    Ähnlich für for, do ... while, switch ... case usw.


Log in to reply