[QUIZ#12] Perkussionist

kabel2

Erfahrenes Mitglied
Ich sehe, hier gibts Leute die sich unbedingt selbst geißeln wollen...
Für die echte Herausforderung lieber eine Sprache, deren Turing-Vollständigkeit noch nicht bewiesen ist ... gibts sowas überhaupt? :)
 

DosCoder

Erfahrenes Mitglied
Ich sehe, hier gibts Leute die sich unbedingt selbst geißeln wollen...
Für die echte Herausforderung lieber eine Sprache, deren Turing-Vollständigkeit noch nicht bewiesen ist ... gibts sowas überhaupt? :)
Ich weiß ja nicht, was andere Freaks noch so im Keller versteckt halten :D Ich glaube aber nicht, das ich so lange an einem BrainFuck-Programm(oder änlichem) sitzen würde, wenn ich nicht wüsste, dass es funktionieren kann...

Ciao
DosCoder
 

Freak

NULL
Naja mit Brainfuck kann ich dank Turing-Vollständigkeit alle mathematischen Probleme lösen.

Aber das Arbeiten mit Dateien, Sounds und alles was über mit Zahlen gefüllte Zellen hinausgeht, ist da ja nicht umsetzbar.
 

DosCoder

Erfahrenes Mitglied
Aber ich hoffe, dass sich das mit der Zeit ändert. Leider wird man damit aber dann mehr Zeichen benötigen, und 8 fand ich für eine Programmiersprache sehr passend. :D

Ciao
DosCoder
 

OnlyFoo

Erfahrenes Mitglied
Aber ich hoffe, dass sich das mit der Zeit ändert. Leider wird man damit aber dann mehr Zeichen benötigen, und 8 fand ich für eine Programmiersprache sehr passend. :D

Ciao
DosCoder

Das ist auch garnicht wahr. Man könnte eine Art SysCall implementieren.
zB können wir "Datei öffnen" so implementieren:
  1. Schreibe den Dateinamen, nullterminiert, in die Speicherzellen 2 bis n
  2. Schreibe eine '1' für "open" in die Speicherzelle 1
  3. Erhöhe den Wert in Speicherzelle 0 um 1
  4. Lese das Dateihandle aus Speicherzelle 1

Der Interpreter achtet dann auf veränderungen der Speicherzelle 0. Wenn dort ein "+" ausgeführt wird, führe den Befehl in Speicherzelle 1 + die korrekte Anzahl an Argumenten aus, schreibe das Ergebnis nach Speicherzelle 1und setzte Speicherzelle 0 wieder auf 0, um bereit für den nächsten SysCall zu sein.

So könnte man Dateizugriffe, Graphische Oberflächen, Netzwerkfähigkeit und ähnliches in Brainfuck implementieren, ohne wirklich was an der Sprache zu ändern.

Hmm, ob ich Zeit finde *interessiert guck*
 

DosCoder

Erfahrenes Mitglied
... ohne wirklich was an der Sprache zu ändern...
Außer sie noch unübersichtlicher zu machen. Grafische Oberflächen mit deiner Technik, ohne Objektorientierung! Oder willst du die auch noch irgendwie rein implementieren. Ich wünsch' dir viel Spaß, bitte benachrichtige mich, wenn du fertig bist :D.

Ciao
DosCoder
 

OnlyFoo

Erfahrenes Mitglied
Außer sie noch unübersichtlicher zu machen. Grafische Oberflächen mit deiner Technik, ohne Objektorientierung! Oder willst du die auch noch irgendwie rein implementieren. Ich wünsch' dir viel Spaß, bitte benachrichtige mich, wenn du fertig bist :D.

Ciao
DosCoder


Naja komm, objektorientierte GUI-Programmierung hast du mit der WindowsAPI doch auch nicht.

proof-of-concept: ein simples Brainfuck Programm, was eine Zeile mit einem Dateinamen von der Standardeingabe einließt, dann diese Dtaei öffnet und bis zum EOF (bzw zum ersten 0 byte) ließt

Code:
goto mem 2
>>

read line (the filename)
,----------[++++++++++>,----------]

goto mem 1
<[<]

call syscall 1 (open)
+<+

goto 2 and set mem 2 to 0
>>[-]

move mem(1) to mem(2)
<[->+<]

put 1 to mem(1)
+

do while mem(1) != 0
[
  set mem(1) = 0
  [-]
  
  call syscall 2 (read)
  ++<+

  print the result
  >.
]

Und er zugehörige, grob zusammen geschusterte Interpreter:
Python:
# -*- encoding: utf8 -*-

import re, sys

class Brainfuck( object ):
    def __init__( self ):
        self.code = []
    
    
    def parse( self, source ):
        self.code = []
        stack = []
        
        source = list( re.sub( r'[^+-.,<>\[\]]', "", source ) )
        for char in source:
            if char in "+-":
                self.code.append( ('add', {'+': 1, '-': -1}[char] ) )
            
            if char in '<>':
                self.code.append( ('move', {'>': 1, '<': -1}[char] ) )
            
            if char == '[':
                stack.append( len( self.code ) )
                self.code.append( [ 'push', None ] )
            
            if char == ']':
                last = stack.pop()
                self.code[last][1] = len( self.code ) - last
                self.code.append( ( 'pop', len( self.code ) - last ) )
            
            if char == '.':
                self.code.append( ('io_put', None) )
            
            if char == ',':
                self.code.append( ('io_get', None) )
        
        # print self.code
            
    
    def run( self ):
        code = self.code
        ip = 0
        length = len( code )
        stack = []
        mem = [0] * 30000
        mp = 0
        files = {}
        
        while ip < length:
            op, arg = code[ip]
            #print op, arg, mp
            if op == 'add':
                if mp == 0:
                    syscall = mem[1]
                    if syscall == 1:
                        fname = "".join( map( __builtins__.chr, mem[2: mem.index( 0, 2 ) ] ) )
                        fp = max( [0] + files.keys() ) + 1
                        files[ fp ] = open( fname, "rb" )
                        mem[1] = fp
                    
                    if syscall == 2:
                        fp = files[ mem[2] ]
                        ch = fp.read(1)
                        mem[1] = ord(ch) if ch else 0
                    
                else:
                    mem[mp] = (mem[mp] + arg) % 255
                
            elif op == 'move':
                mp = (mp + arg) % 30000
            
            elif op == 'push':
                if mem[mp] == 0:
                    ip += arg
            
            elif op == 'pop':
                if mem[mp] != 0:
                    ip -= arg
                    
            elif op == 'io_put':
                sys.stdout.write( __builtins__.chr(mem[mp]) )
            
            elif op == 'io_get':
                chr = sys.stdin.read(1)
                mem[mp] = ord( chr ) if chr else 0
            
            ip += 1
        
        # print mem[0:20]


if __name__ == '__main__':
    source = "".join( open( sys.argv[1] ).readlines() )
    
    bf = Brainfuck()
    bf.parse( source )
    bf.run()

Code:
olli@desktop:/tmp$ echo 'hallo tutorials.de!' > input.txt
olli@desktop:/tmp$ python brainfuck.py open.bf
input.txt
hallo tutorials.de!
olli@desktop:/tmp$
 
Zuletzt bearbeitet:

DosCoder

Erfahrenes Mitglied
Hi,
hast du eigentlich sonst nichts zu tun? :D
Und zum Thema Objektorientierung:
objektorientierte GUI-Programmierung hast du mit der WindowsAPI doch auch nicht...
deshalb verwende ich sie ja auch nicht, nicht umsonst bin ich auch überzeugter Pinguin!

Zurück zu BrainFuck:
Wende dich doch mal an Urban Müller, vielleicht kauft der dir deinen Interpreter ab. Da der ja mit Python geschrieben ist, hat man dadurch auch endlich Plattformunabhängigkeit. Ist also noch eine Verbesserung.

Ciao
DosCoder