Archive for August, 2009
Wie entwickle ich meine eigene Scriptsprache? (Teil 3: Syntax)
Nun, wie weit sind wir bisher? Wir haben einen Lexer, der unsere Eingabe in Einzelteile spaltet, und wir können einfache Ausdrücke in eine verwertbare Form bringen. Was wir bisher noch nicht (bewusst) gemacht haben, ist, einen Ausdruck zu analysieren und zu prüfen, ob er sinnvoll ist oder nur unzusammenhängend aneinandergereihte Token enthält.
Zur Erinnerung: sowohl “1+2+3″ als auch “1+(” wären Zeichenfolgen, die der Lexer akzeptieren und ohne zu meckern zerkleinern würde. Das ist auch in Ordnung so, da die syntaktische Prüfung ohnehin eher Aufgabe des Parsers ist. Aber was genau gilt es denn dabei zu beachten?
“Syntaxfragen”
- Sind genau so viele öffnende wie schließende Klammern vorhanden und passen diese zusammen?
- Stimmt die Zahl der Parameter, mit der eine Funktion aufgerufen wird?
- Stimmen die Parametertypen, mit denen eine Funktion aufgerufen wird? (“+” arbeitet normalerweise nur auf Zahlen, der Punkt z.B. in PHP auf Strings, etc…)
- Befinden sich Operatoren an den richtigen Positionen? (Die Fakultät einer Zahl wird z.B. durch Anhängen eines Ausrufezeichens gekennzeichnet: “3!”)
- Darf eine Funktion geschachtelt vorkommen? (z.B. wäre “echo(echo(1))” eher sinnlos, wenn “echo” die Ausgabefunktion ist)
- Darf eine Funktion/ein Konstrukt in einer untergeordneten Umgebung vorkommen? (Das wäre z.B. der Fall, wenn man Funktionsdefinitionen innerhalb von Funktionsdefinitionen zulässt.)
Neben der Syntax gibt es noch weitere Punkte, die eine Programmier-/Scriptsprache ausmachen. Eine Auflistung findet man z.B. hier.
Wie entwickle ich meine eigene Scriptsprache? (Teil 2: Grundlagen des Parsens)
Einen wichtigen Schritt haben wir an dieser Stelle bereits hinter uns: Der hier beschriebene Lexer verwandelt eine Eingabesequenz wie “1+3*(4-2)” in eine Liste von Tokens mit Typ und Wert:
zahl : 1 operator : + zahl : 3 operator : * open : ( zahl : 4 operator : - zahl : 2 close : )
Damit haben wir eine maschinenlesbare Repräsentation des gewünschten Ausdrucks – allerdings keine Garantie dafür, dass dieser syntaktisch korrekt ist. Ebensowenig kann eine Maschine, die diese Liste nun vorgelegt bekommt, “einfach mal so” den Wert des Ausdrucks berechnen, da ihr Informationen zur Auswertungsreihenfolge fehlen. (Wenn 1+3 zuerst berechnet wird, lautet das Ergebnis 8, wenn 3*(4-2) zuerst berechnet wird, lautet es 7.)
Wir brauchen also eine Darstellung unseres Ausdrucks, die bezüglich der Reihenfolge der Auswertung eindeutig ist und eine Maschine, die diese erstellt – und wie könnte es anders sein: auch dieses Problem wurde bereits einmal gelöst.
Wandeln wir also auf den Spuren von Edsger W. Dijkstra.
Wie entwickle ich meine eigene Scriptsprache? (Teil 1: Der Lexer)
Die Aufgabe, die ich mir hier gestellt habe, eine eigene Script- oder Programmiersprache zu entwickeln, bringt so ihre Probleme mit sich. Wie und wo fange ich an? Ist das nicht zu viel für mich? Und sollte ich nicht auf bereits vorhandene Bibliotheken zurückgreifen, anstatt alles von Grund auf neu zu entwickeln?
Vor allem die letzte Frage kann einem zu schaffen machen. Warum etwas möglicherweise nicht gut funktionierendes entwickeln, wenn es doch überall schon tausendfach durchdachte Lösungen gibt? Immerhin lautet doch eine der obersten Regeln in der Softwareentwicklung:
Don’t reinvent the wheel!
Nun, ich bin Informatikstudent. Ich will wissen, wie die Dinge “unter der Haube” aussehen, ich will lernen. Und wenn alle nur noch auf vorgefertige Bibliotheken zurückgreifen, weiß doch bald keiner mehr, was dem Zauber eigentlich zugrunde liegt… Dementsprechend:
Don’t reinvent the wheel, unless you plan on learning more about wheels!
Diese Anleitung soll jedem helfen, der interessiert daran ist, was im Inneren eines Interpreters oder Compilers eigentlich (ungefähr so) abläuft. Ich selbst habe gerade erst das zweite Semester hinter mir, d.h. allzu theoretisch wird es hier nicht und jeder mit ein wenig logischem Denken und genug Engagement sollte es hinbekommen, meinen Ausführungen zu folgen.
Lasset uns beginnen.
[Release] LastSharp 0.4.4
Nach den Änderungen bei Last.FM und den zwei Beta-Versionen der letzten 15 Tage kommt nun wieder eine offizielle Version von LastSharp.
Es gab einige Anfragen und Wünsche, von denen jedoch einige noch weitere Überlegungen benötigen, weshalb sie noch nicht realisiert wurden. Das passiert dann in der nächsten Version. Oder der übernächsten.
Neu in LastSharp 0.4.4 ist:
- Last.FM-Abonnenten können das neue Radio-API verwenden.
- Die Parameter, mit denen mp3Gain die heruntergeladenen Dateien normalisiert, sind im Einstellungsdialog modifizierbar.
- Der Name der Cover-Dateien ist nun veränderbar.
- Überlange Titel (tritt vor allem bei klassischer Musik auf) werden nun über eine dreistellige Zeichenfolge am Anfang des Dateinamens eindeutig identifizierbar gemacht.
- Der komplexe Filter unterstützt über das Präfix “t:” nun auch die Filterung nach Titel.
Hinzu kommen einige Bugfixes, sowie die Unabhängigkeit von LastFmLib.Net, die v.a. Platz spart. An dieser Stelle sei nochmals meine eigene, im Moment im Bau befindliche .NET-Schnittstelle für das Last.FM-API erwähnt, die sich an alle richten wird, die “einfach mal schnell” Anfragen an das API schicken wollen und das ganze Drumherum von LastFmLib.Net nicht benötigen.
Dann habe ich mir noch etwas vorgenommen: Wenn es das nächste Mal eine Änderung bei Last.Fm gibt, werde ich sofort eine neue Version rausbringen und nicht erst warten, bis ich genug zusammengetragen habe, um die Versionsnummer zu rechtfertigen…
Viel Spaß mit LastSharp!
Download (Sourceforge): https://sourceforge.net/projects/lastsharp/files/lastsharp/LastSharp%200.4.4/
LastSharp feiert Geburtstag!
Heute, am 8. August 2009 feiert LastSharp seinen ersten Geburtstag! Ich gebe zu, ich habe nicht gedacht, dass das Programm es so lange mitmacht (immerhin schweben da doch einige rechtliche Fragen im Raum…), aber ich freue mich natürlich trotzdem!
Anbei eine kleine (nicht ganz vollständige) Gallerie zur optischen Entwicklung des Programms!
[Beta] LastSharp 0.4.4 Beta 2
Wie angekündigt, die zweite Beta-Version von LastSharp 0.4.4. Oberflächlich gesehen gibt es wieder keine großen Änderungen, aber unter der Haube hat sich dennoch was getan:
- “Meine Playlist (direkt)” sollte nun wieder funktionieren,
- als Abonnent kann man nun das Radio-API von Last.FM verwenden (“Erweiterte Einstellungen” >> “Verschiedenes” >> “Radio-API” aktivieren, dann LastSharp neu starten),
- und das Programm ist nun unabhängig von LastFmLib.Net (spart Platz)
Ich denke, ich werde den Release dieser Version noch Ende dieser/Anfang nächster Woche anstreben und größere (nicht so dringende) Änderungen aufs nächste Mal verschieben. Grundlegende Funktionalität geht eben vor.
Sollte jemand Fehler finden, bitte unbedingt mitteilen!
Download: http://dev.xscheme.de/wp-content/uploads/2009/08/LastSharp044Beta2.rar