Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Brainfuck Interpreter

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Brainfuck Interpreter

    Hallo liebe Community,

    ich habe vor ein paar Tagen einen PHP Brainfuck Interpreter als Klasse geschrieben und wollte mal fragen, wie ich diesen noch vereinfachen könnte, sodass er keine 144 Zeilen lang ist ... ich habe nämlich welche gefunden, die wesentlich kürzer waren, ich aber nicht ganz nachvollziehen könnte.

    https://github.com/dako314/PHP-Brain.../brainfuck.php

    Habt ihr irgendwelche Tipps / Ideen ?

    Viele Grüße
    Dako314

  • #2
    Also ich frage mich ja in erster Linie, wo der Sinn eines Brainfuck-Interpreter ist, da das als "esotherische Sprache" doch nicht wirklich ernst gemeint sein kann...

    Zu deiner Klasse:
    https://github.com/dako314/PHP-Brain....php#L133-L137

    Ich würde nie in einer Klasse ein die() oder exit() nutzen. Als Nutzer der Klasse kann das zu ungewollten Nebenwirkungen führen. Ich würde da ne Exception schmeißen.

    https://github.com/dako314/PHP-Brain....php#L133-L137
    http://php.net/manual/de/function.print-r.php

    print_r kann strings auch zurückgeben. Das wäre imo auch besser, statt der Ausgabe.

    Ansonsten kann ich dazu nicht viel sagen, da ich Brainfuck weder kann noch brauche

    LG
    https://github.com/Ma27
    Javascript Logic is funny:
    [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

    Kommentar


    • #3
      Lass mich raten, du dokumentierst erst im nächsten Leben ?
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        Ab jetzt bin ich Compiler Entwickler... Ich hab mich grade gefragt wie lange es dauert Brainfuck Code mit PHP ausführen zu können. 5 Minuten und das Zeitinstensivste dabei war Wikipedia.

        PHP-Code:
        $code '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.+++.';

        $commands = array(
            
        '>' => '$ptr++;',
            
        '<' => '$ptr--;',
            
        '+' => '$cells[$ptr]++;',
            
        '-' => '$cells[$ptr]--;',
            
        '.' => 'echo chr($cells[$ptr]);',
            
        ',' => 'throw new Exception(", not supported");',
            
        '[' => 'while($cells[$ptr]) {',
            
        ']' => '}'
        );

        $php_code strtr($code$commands);

        $cells = array(0,0,0,0,0,0,0,0);
        $ptr 0;
        eval(
        $php_code); 

        Kommentar


        • #5
          Deine Lösung ist aber recht schnell...

          Trotzdem versteh ich den Sinn immer noch nicht

          LG
          https://github.com/Ma27
          Javascript Logic is funny:
          [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

          Kommentar


          • #6
            Es ist eine nette Übung, wenn man verstehen will, wie Rechner intern so arbeiten (Register, pointer, etc). Also eigentlich rein pädagogischer Wert, praktische Anwendungen haben esoterische Sprachen eigentlich nie. Daher auch der Name.
            [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

            Kommentar


            • #7
              Zitat von Ma27 Beitrag anzeigen
              Trotzdem versteh ich den Sinn immer noch nicht
              Es hat auch kein Sinn. Ich hab das Thread gelesen, dann Wikipedia überflogen und mir gedacht das geht auch einfacher. Wie einfach? Schauen wir mal...

              Zitat von ApoY2k Beitrag anzeigen
              Es ist eine nette Übung, wenn man verstehen will, wie Rechner intern so arbeiten (Register, pointer, etc). Also eigentlich rein pädagogischer Wert, praktische Anwendungen haben esoterische Sprachen eigentlich nie. Daher auch der Name.
              Eher nicht, es könnte eine falsche Vorstellung vermitteln. Eine CPU wird keine x hundert Befehle ausführen um ein Register den Wert 72 zuzuweisen. Um da ein Einblick zu bekommen ist Assembler der bessere Ansatz. Da bekommt man eher eine Vorstellung wie eine CPU arbeitet.

              Kommentar


              • #8
                Zitat von erc Beitrag anzeigen
                Es hat auch kein Sinn. Ich hab das Thread gelesen, dann Wikipedia überflogen und mir gedacht das geht auch einfacher. Wie einfach? Schauen wir mal...



                Eher nicht, es könnte eine falsche Vorstellung vermitteln. Eine CPU wird keine x hundert Befehle ausführen um ein Register den Wert 72 zuzuweisen. Um da ein Einblick zu bekommen ist Assembler der bessere Ansatz. Da bekommt man eher eine Vorstellung wie eine CPU arbeitet.
                Naja, war eher so "just-for-fun", weil ich gesehen habe, dass es andere auch gemacht haben

                Kommentar


                • #9
                  Zitat von tr0y Beitrag anzeigen
                  Lass mich raten, du dokumentierst erst im nächsten Leben ?
                  Hey, wie meinst du das genau?

                  Viele Grüße
                  Dako314

                  Kommentar


                  • #10
                    Zitat von erc Beitrag anzeigen
                    Ab jetzt bin ich Compiler Entwickler... Ich hab mich grade gefragt wie lange es dauert Brainfuck Code mit PHP ausführen zu können. 5 Minuten und das Zeitinstensivste dabei war Wikipedia.

                    PHP-Code:
                    $code '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.+++.';

                    $commands = array(
                        
                    '>' => '$ptr++;',
                        
                    '<' => '$ptr--;',
                        
                    '+' => '$cells[$ptr]++;',
                        
                    '-' => '$cells[$ptr]--;',
                        
                    '.' => 'echo chr($cells[$ptr]);',
                        
                    ',' => 'throw new Exception(", not supported");',
                        
                    '[' => 'while($cells[$ptr]) {',
                        
                    ']' => '}'
                    );

                    $php_code strtr($code$commands);

                    $cells = array(0,0,0,0,0,0,0,0);
                    $ptr 0;
                    eval(
                    $php_code); 
                    Hi,

                    coole und schnelle Lösung ...

                    Du müsstest nur noch einbauen, dass Brainfuck die Zahlen zwischen 0 und 255 annimmt und der Pointer auch nicht negativ sein darf. Außerdem ist der BF-Array 300.000 Felder groß

                    Die Lösung der "while-Schleife" finde ich richtig cool

                    Viele Grüße
                    Dako314

                    Kommentar


                    • #11
                      Zitat von dako314 Beitrag anzeigen
                      Hey, wie meinst du das genau?
                      http://de.wikipedia.org/wiki/PHPDoc
                      [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                      Kommentar


                      • #12
                        PHP-Code:
                            '>' => 'if($ptr++ > 255) throw new Exception("ptr overflow");',
                            
                        '<' => 'if($ptr-- == 0) throw new Exception("ptr underflow");',
                            
                        '+' => 'if($cells[$ptr]++ > 255) throw new Exception("cell overflow");',
                            
                        '-' => 'if($cells[$ptr]-- == 0) throw new Exception("cell underflow");',
                            
                        '.' => 'echo chr($cells[$ptr]);',
                            
                        ',' => 'throw new Exception(", not supported");',
                            
                        '[' => 'while($cells[$ptr]) {',
                            
                        ']' => '}' 
                        Und das mit den 300.000 Zellen, hey das ist php

                        *edit* 300.000 Zellen und ein Byte Pointer?! Das kann nicht stimmen...

                        Kommentar


                        • #13
                          Zitat von erc Beitrag anzeigen
                          *edit* 300.000 Zellen und ein Byte Pointer?! Das kann nicht stimmen...
                          Ich denke, du verwechselst da was.
                          In C ist jeder Pointer 32/64 Bit groß (je nach Betriebsystem), das byte in "byte-pointer" steht nur dafür, wo der Pointer hinzeigt.
                          Code:
                          byte* ptr; //32/64 bit groß
                          [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                          Kommentar


                          • #14
                            Ich meinte damit eine 8 Bit Adressierung, also ein Pointer mit 1 Byte länge. (siehe Code) Das las sich nämlich so:
                            Zitat von dako314
                            dass Brainfuck die Zahlen zwischen 0 und 255 annimmt und der Pointer auch nicht negativ sein darf.

                            Kommentar


                            • #15
                              Zitat von erc Beitrag anzeigen
                              Ich meinte damit eine 8 Bit Adressierung, also ein Pointer mit 1 Byte länge. (siehe Code) Das las sich nämlich so:
                              So wie ich das verstanden hatte bezieht sich das 255/1byte nur auf den Inhalt.

                              Laut http://www.muppetlabs.com/~breadbox/bf/ bewegt sich der Pointer in einem Array von 300.000 bytes, wobei das eine eigenartige Zahl ist...
                              [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                              Kommentar

                              Lädt...
                              X