| Author |
Message |
|
| bmario |
Posted: Sat Mar 06, 2010 12:30 pm |
|
|
|
Joined: 06 Mar 2010
Posts: 2
Location: Dresden, Germany
|
Hi,
schön das es doch eine deutschsprachige Community gibt.
Ich studiere grade im 3.ten Semester Mathematik mit Informatiknebenfach.
Dabei hab ich mittlerweile schon einige Programmiersprachen und auch Paradigmen gesehen. Wir hatten Haskell in einer Vorlesung und die funktionale Programmierung hat es mir ein wenig angetan. Wahrscheinlich, weil es dem Mathematiker in mir so bekannt vorkommt Jedenfalls fand ich zwar Haskell in der Theorie sehr schön aber leider nicht für praktische Anwendungen geeignet.
Vor kurzem hab ich dann Erlang für mich entdeckt und finde es einfach schön.
Nun lernt man ja nix wenn man sich nur die Theorie einbläut, also habe ich gleichmal mein Wissen in Erlang ausgereizt und ein Programm geschrieben, das AM0 Assembler ausführen kann. (AM0 ist eine, in der oben kurz erwähnten Vorlesung, definierte, verkleinerte Assemblersprache, in die eine kleine Teilmenge von C übersetzt werden kann. Im übrigen auch eine Teilmenge von Haskell)
Mein Grundgedanke ist, stur die Definition dieser AM0 zu nehmen,
das ist also ein 5-Tupel bestehend aus dem Befehlszähler, dem Datenkeller, dem Hauptspeicher und dem Ein- und Ausgabeband. Ersterer ist ein purer Integer, der einfach immer hoch gezählt wird, der Datenkeller (oder auch Stack genannt) ist ein kleiner Zwischenspeicher, ähnlich den Registern in x86, auf den die Operationen ausgeführt werden. (so holt z.b. ADD die ersten zwei Elemente vom Datenkeller und speichert die Summer der beiden wieder drauf), der Hauptspeicher ist eine Funktion die jedem N ein HS(N) zuordnet, quasi das was man vom Hauptspeicher sich erwartet. Das Ein- und Ausgabeband habe ich weggelassen und statt dessen gleich mit read() und format() abgebildet.
Der Code der ausgeführt werden soll, muss meiner VM als eine Liste von Befehlen gegeben werden. Diese Befehler sind als Tupel dargestellt. Jeder Befehl hat als erstes Element des Tupels ein Atom, das den Befehl eindeutig identifiziert. Manche Befehle haben zusätzlich einen Integer als Parameter. Befehle sind also z.b. {add}, {mul}, {jmp, 12}, {read, 3} ...
Die Funktion mainloop() führt nun schritt jeweils einen Schritt aus. Der Befehlszähler bestimmt, welcher Befehl ausgeführt werden soll. Danach ruft sich dann die mainloop() mit inkrementierten Befehlszähler selbst wieder auf.
Das funktioniert alles soweit
Das Einlesen der *.am0-Dateien macht mir mehr "Sorgen".
Meine Variante finde ich sehr unschön, da mit sub_word() die benötigten Teile raus zu basteln. Ich vermute, dass es mit Pattern-matching besser geht, nur leider hab ich keine Vorstellung wie?
Auch so allgemein, würde mich freuen, wenn jemand erfahreneres als ich, mir vielleicht Tips geben könnte
Der Quellcode befindet sich auf github unter http://github.com/bmario/am0vm.
Mario.
ps: Entschuldigt, ist ja doch ein ganz schöner Textblock geworden  |
|
|
| Back to top |
|
| bpuzon |
Posted: Sun Mar 07, 2010 12:39 pm |
|
|
|
User
Joined: 05 Aug 2009
Posts: 23
Location: Cracow, Poland
|
Mario,
Gib uns ein kurzes Exempel an dem Problem, bitte. Das hilft die Antwort zu bekommen. |
_________________ Saludos,
Bartłomiej Puzoń
Erlang Solutions |
|
| Back to top |
|
| bmario |
Posted: Sun Mar 07, 2010 12:48 pm |
|
|
|
Joined: 06 Mar 2010
Posts: 2
Location: Dresden, Germany
|
Danke für die Antwort.
Der Assembler Code steht in einer Plaintext-File.
Eine Zeile hat den folgenden Aufbau:
oder
und das würde ich gerne in ein Tupel übersetzen mit:
bzw.
wobei befehl als ein Atom mit dem Namen des Befehls ist und N der Wert des Parameters. Kann man das mit Patternmatching direkt erreichen?
Mario. |
|
|
| Back to top |
|
| bpuzon |
Posted: Sun Mar 07, 2010 1:05 pm |
|
|
|
User
Joined: 05 Aug 2009
Posts: 23
Location: Cracow, Poland
|
Das kannst du leider nicht mit Pattermatching erreichen vorausgesetzt, dass der Assembler Code weißen Charakters enthalten kann.
Für die Schnelligkeit, könntest du das Einlesen mit C machen. |
_________________ Saludos,
Bartłomiej Puzoń
Erlang Solutions |
|
| Back to top |
|
| Volkert |
Posted: Sat Mar 13, 2010 10:47 am |
|
|
|
User
Joined: 30 May 2005
Posts: 24
Location: Laufenburg, Germany
|
Sollte so recht einfach gehen:
1) Befehle als Folge von Tupel in einer Datei ablegen.
2) Folge mit file:consult einlesen (wird ne Liste)
3) Jedes Element aus der Liste nehmen und auswerten (gegen Funktion mit entsprechendem Pattern-Kopf).
Schau mal hier: http://www.erlang-dach.org/blog/files/4be00b2e85c5dcd2c82ecfed55b23bd9-17.html
Eigentlich könntest du deinen ganzen Prozessor 5-Tupel in eine Datei als Erlang Term ablegen.
Gruesse,
Volkert |
|
|
| Back to top |
|
|
|
All times are GMT
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|
|