Erste Ergebnisse mit Go back to frontpage

Ich habe mich die letzten Wochen intensiv mit Go beschäftigt und - wie kann man eine Sprache ansonsten am besten lernen - viel darin programmiert. Es sind diverse Projekte entstanden, von denen ich zwei nun online gestellt habe.

Die Projekte sind selbstredend experimentell, klein, einfach und dienen möglicherweise keinem höheren Zweck. Vielleicht interessiert sich trotzdem jedoch jemand für den Code oder hat Lust, ihn weiterzuentwickeln (was nicht heißen soll, dass ich nicht auch irgendwann mal daran weiterschraube, wenn ich Lust und Zeit habe).

Da ist zunächst eine kleine smtpd-Library (gomaild), die ganz einfaches SMTP spricht und eingehende Mails an einen Handler übergibt. Mein mitgeliefertes Hauptprogramm speichert derzeit diese Mails zu Demonstrationszwecken im current working directory unter dem Timestamp ab. Ich habe die Lib ein wenig kommentiert, sodass sie mit GoPkgDoc inspiziert werden kann.

Das zweite Projekt ist ein Python Bytecode-Interpreter (GoPy), der kompilierten Python Bytecode einliest, interpretiert und dann ausführt. Selbstverständlich ist er keineswegs vollständig und es fehlt noch ein Haufen Arbeit. Es lassen sich jedoch kleine Programme bereits in ihm ausführen:

a = 5
b = 10
print a, "*", b, "=", a*b

… als Python-Datei mytest.py abgespeichert und kompiliert (python -c 'import mytest') wird in GoPy wie folgt ausgeführt:

$ go run main.go -filename mytest.pyc 
GoPy 0.1 - (C) 2012 Florian Schlachter, Berlin
2012/07/16 20:44:34 [Settings filename=mytest.pyc]
2012/07/16 20:44:34 Parsing...
2012/07/16 20:44:34 File created: 2012-07-16 20:44:12 +0200 CEST (timestamp: 1342464252)
2012/07/16 20:44:34 Parsing finished
2012/07/16 20:44:34 VM created [filename=mytest.py,name=<module>]
2012/07/16 20:44:34 Running...
2012/07/16 20:44:34 [VM] Stacksize = 2
5 * 10 = 50 
2012/07/16 20:44:34 [VM] Returning value: None (*vm.PyNone)
2012/07/16 20:44:34 [VM] Execution of program took 135us.
2012/07/16 20:44:34 Running finished (19 instructions ran).

Mit dem -debug-Flag lassen sich einzelne Instruktionsschritte anzeigen:

GoPy 0.1 - (C) 2012 Florian Schlachter, Berlin
2012/07/16 20:45:39 [Settings filename=mytest.pyc]
2012/07/16 20:45:39 Parsing...
2012/07/16 20:45:39 File created: 2012-07-16 20:44:12 +0200 CEST (timestamp: 1342464252)
2012/07/16 20:45:39 Token = 'c' (99)
2012/07/16 20:45:39 Token = 's' (115)
2012/07/16 20:45:39 Token = '(' (40)
2012/07/16 20:45:39 Token = 'i' (105)
2012/07/16 20:45:39 Token = 'i' (105)
2012/07/16 20:45:39 Token = 't' (116)
2012/07/16 20:45:39 Token = 't' (116)
2012/07/16 20:45:39 Token = 'N' (78)
2012/07/16 20:45:39 Token = '(' (40)
2012/07/16 20:45:39 Token = 't' (116)
2012/07/16 20:45:39 Token = 't' (116)
2012/07/16 20:45:39 Token = '(' (40)
2012/07/16 20:45:39 Token = '(' (40)
2012/07/16 20:45:39 Token = '(' (40)
2012/07/16 20:45:39 Token = 's' (115)
2012/07/16 20:45:39 Token = 't' (116)
2012/07/16 20:45:39 Token = 's' (115)
2012/07/16 20:45:39 Parsing finished
2012/07/16 20:45:39 VM created [filename=mytest.py,name=<module>]
2012/07/16 20:45:39 Running...
2012/07/16 20:45:39 [VM] Stacksize = 2
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load const: 5 (pushing on stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Store name: a = 5
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load const: 10 (pushing on stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Store name: b = 10
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load name a (= 5, push to stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print item
5 2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load const: * (pushing on stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print item
* 2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load name b (= 10, push to stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print item
10 2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load const: = (pushing on stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print item
= 2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load name a (= 5, push to stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load name b (= 10, push to stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Beginning math operation (20)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Operation finished: 5 [20] 10 = 50
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print item
50 
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Print newline
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Load const: None (pushing on stack)
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Return value: None
2012/07/16 20:45:39 [mytest.py/<module>:DEBUG] Evaluation took 229us.
2012/07/16 20:45:39 [VM] Returning value: None (*vm.PyNone)
2012/07/16 20:45:39 [VM] Execution of program took 247us.
2012/07/16 20:45:39 Running finished (19 instructions ran)

(Es ist übrigens nicht mein erster Python Bytecode-Interpreter. Vor einiger Zeit stellte ich auch eine JavaScript-Implementierung (JS/Py) vor (Demo, die jedoch derzeit nicht mehr funktioniert, weil sich die Browser weiterentwickelt haben. Ein kurzer Blick verrät, dass es wohl ein Problem mit einem Ajax-Request gibt; ich war bislang jedoch zu faul, ihn zu fixen.). :-)

Habt Spaß mit dem Code! Feedback ist gerne gesehen, insbesondere, weil ich ja auch noch intensiv am Lernen bin. :-)


New comment

Comments are moderated and therefore are not published instantly.





Comments

No comments yet. Be the first! :-)