Erlang/OTP Forums

Author Message

<  Erlang-DACH  ~  Text einlesen

bmario
Posted: Sat Mar 06, 2010 12:30 pm Reply with quote
Joined: 06 Mar 2010 Posts: 2 Location: Dresden, Germany
Hi,

schön das es doch eine deutschsprachige Community gibt. Smile

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 Wink 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 Smile

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 Wink

Der Quellcode befindet sich auf github unter http://github.com/bmario/am0vm.

Mario.

ps: Entschuldigt, ist ja doch ein ganz schöner Textblock geworden Confused
View user's profile Send private message
bpuzon
Posted: Sun Mar 07, 2010 12:39 pm Reply with quote
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
View user's profile Send private message Visit poster's website
bmario
Posted: Sun Mar 07, 2010 12:48 pm Reply with quote
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:
Code:
Befehl;
oder
Code:
Befehl N;

und das würde ich gerne in ein Tupel übersetzen mit:
Code:
{befehl}
bzw.
Code:
{befehl, N}

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.
View user's profile Send private message
bpuzon
Posted: Sun Mar 07, 2010 1:05 pm Reply with quote
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
View user's profile Send private message Visit poster's website
Volkert
Posted: Sat Mar 13, 2010 10:47 am Reply with quote
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
View user's profile Send private message

Display posts from previous:  

All times are GMT
Page 1 of 1
This forum is locked: you cannot post, reply to, or edit topics.

Jump to:  

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