Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Interpreter mit Ruby
BeitragVerfasst: 18 Mär 2017, 12:41 
Offline
Lehrling
Benutzeravatar

Registriert: 21 Sep 2016, 19:20
Beiträge: 57
Wie kann ich einen Interpreter mit Ruby schreiben? Wie kann ich es am besten machen? Was macht ein Parser und ein Lexer bei einem Interpreter? Was soll ich bei dem Parser und dem Lexer schreiben? (Ich habe schon mal von diesen 2 Teilen gehört bei einem Interpreter)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 18 Mär 2017, 14:30 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
LuckyChicken hat geschrieben:
Wie kann ich einen Interpreter mit Ruby schreiben? Wie kann ich es am besten machen? Was macht ein Parser und ein Lexer bei einem Interpreter? Was soll ich bei dem Parser und dem Lexer schreiben? (Ich habe schon mal von diesen 2 Teilen gehört bei einem Interpreter)


Eine schwierigere Aufgabe stand wohl gerade nicht zur Verfügung, oder? Das ist so, als wollte ich, der ich keine Ahnung von Architektur habe, ein Haus planen. Die Erstellung professioneller Programmiersprachen — um die es wohl geht, anderenfalls benötigst du keinen Lexer — ist ein hochkomplexes Thema. Wenn dich das Thema wirklich interessiert, dann lies mal die Dokumentation von GNU Bison (das ist der Lexer, den auch Ruby verwendet). Ein Informatikstudium sei dir empfohlen.

Einfacher ist es, eine DSL (Domain-specific language) zu verwenden. Hier unterscheidet man zwischen einer „internen“ DSL, bei der schlicht die zugrundeliegende Programmiersprache selbst die formale Grammatik stellt und du nur noch spezifische „Befehle“ anbietest (ein Beispiel für eine interne DSL ist Rake), und einer „externen“ DSL, bei der du selbst einen Parser für die formale Grammatik schreibst (dafür wirst du in Ruby in der Regel strscan aus der stdlib verwenden). In jedem Fall handelt es sich um eine auf einen spezifischen Zweck zugeschnittene Sprache, die daher auch keine wahnsinnig komplexe Grammatik aufweist und deshalb ohne Lexer auskommt.

Zur Terminologie, soweit sie mir geläufig ist. Ich entwickle keine Programmiersprachen, daher lies das folgende bitte mit der gebührenden Vorsicht. Ein Parser ist ein Programm, das eine formale Sprache in einen maschinenlesbaren Anweisungsbaum (Abstract Syntax Tree, AST) übersetzt. Bei komplexen Sprachen nutzt man einen Lexer, der eine Art Parser-Schablone vorgeneriert, die man dann weiter ausfüllt. Ein Interpreter ist ein Programm, das den AST zur Laufzeit in Maschinenanweisungen übersetzt und sodann auf dem Prozessor ausführt. Ein Compiler ist ein Programm, das den AST zur Kompilationszeit in Maschinenanweisungen übersetzt, sodass eine ausführbare Datei (executable) ensteht.

Ich würde dir bei deinem Kenntnisstand ernsthaft davon abraten, dich mit formalen Sprachen zu beschäftigen. Selbst eine interne DSL als einfachster Anwendungsfall verlangt von dir eine solide Kenntnis von Rubys Metaprogrammierungsfunktionalität.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 18 Mär 2017, 17:54 
Offline
Lehrling
Benutzeravatar

Registriert: 21 Sep 2016, 19:20
Beiträge: 57
Jaja ich weiß auf jedenfall dass eine eigene Programmiersprache etwas heftig ist aber ich meine eigentlich so etwas kleines wie die Implementierung von LOLCODE (Programmiersprache) in Ruby. Und der Code da war jetzt auch nicht mega krass ehrlich gesagt: https://github.com/qoobaa/lol


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 19 Mär 2017, 11:18 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
Es ist nur bedingt wahr, dass man für komplexere Programmiersprachen zwingend einen Lexer benötigt. Eigentlich kommt das viel eher darauf an wie man den Parser erstellt. Ausserdem ist ein Informatikstudium für die Lektüre der Bison Anleitung nicht nötig, eher andersherum wird üblicherweise wärend des Studiums mit einem Bison ähnlichen Tool gearbeitet. Im übrigen gibt es auch Programmiersprachen die komplett ohne Parser auskommen und nur einen Lexer nutzen (TeX)

Aber erst einmal zu ben Begriffen:

Ein Lexer, Scanner oder auch Tokenizer zerlegt einen Strom von Zeichen in einen Strom von Tokens. In aller Regel geschieht dieses um die Mächtigkeit des Eingabealphabets am Parser zu reduzieren.

Ein Parser transformiert einen Strom von Zeichen seines Eingabealphabetes in einen Abstrakten Syntax Baum.

In sehr einfachen Sprachen (ohne selbst definierte Funktionen und Prozeduren sowie Sprüngen) kann man nun bereits durch einfaches Graphen-Falten den AST auf seinen Endwert Reduzieren und hat seinen Interpreter fertig, in der Regel reicht das aber nicht aus.

Also sind noch weitere Stufen notwendig, diese sollen aber nicht Bestandteil dieses Posts sein, denn als nächstes möchte ich näher darauf eingehen, wie man Lexer und Parser schreiben kann. In der Regel sind diese nämlich weit komplizierter als der Rest.

Für beide Stufen gibt es sogenannte Generatoren, sie nehmen Definitionsdateien in ihrem jeweils eigenen Format und erzeugen daraus jeweils Lexer und Parser. In aller Regel sind sie jeweils Paarweise zu nutzen damit der Tokenstrom vom Parser auch akzeptiert wird. Bei der Verwendung von Generatoren muss man immer 2 Sprachen zusätzlich zu der Implementierungssprache lernen, nämlich jene der Generatoren.

Eine alternative dazu sind die Parserkombinatoren, mit ihnen kann man sich einen Parser mithilfe einer Embedded (internen) DSL seinen Parser aus vielen kleinen Einzelparsern zusammenstecken. In aller Regel ist der Umgang mit ihnen etwas einfacher zu erlernen da man in der Implementierungssprache bleibt, dafür gelten sie aber gerade bei interpretierten Sprachen als langsam, da der Kombinator bereits komplizierte Datenstrukturen mitbringt für seine interne Verwaltung.

Allerdings ist mir nicht bekannt welche der beiden Varianten in Ruby "idiomatischer" ist, oder ob es gar Kombinatoren gibt, ich kenne sie überwiegend aus der funktionalen Welt.

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 19 Mär 2017, 22:23 
Offline
Lehrling
Benutzeravatar

Registriert: 21 Sep 2016, 19:20
Beiträge: 57
Ok wie kann ich denn am besten Anfangen? Wie fang ich jetzt mit einem Parser oder Lexer an? Gibt es irgendwo Beispiele? Tutorials?


Als ich das erste mal an sowas gedacht hab, hab ich so angefangen:



1
2
3
4
5
6
7
8
9
10
11

if code=="print"
print code[6..-1] #gibt alles hinter "print" aus
elsif code=="exit"
exit
elsif code=="println"
puts code[6..-1] #gibt alles hinter "println" aus
elsif code=="if"
eval("if #{code[2..-1]}") #prueft alles hinter dem "if"
#und das ganze immer weiter und weiter mit komplexem, unuebersichtlichem, komischem code...
#hab grad bemerkt dass das ganze gar nicht wirklich funktionieren wuerde aber irgendwie hab ich damals so eine art wie das gemacht. Ist ja auch egal. Ist nur ein Beispiel


Könnte man das nicht sogar so machen? Oder so ähnlich? Mit einer anderen Technik? Ich weiß ja nich


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 19 Mär 2017, 23:02 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
Es gibt sie wie Sand am Meer, allerdings überwiegend in englischer Sprache. Ob da welche in Ruby zwischen sind bin ich mir nicht sicher, denn Ruby wird eher für eDSLs verwendet denn für die Abbildung beliebiger Compiler. Auch setzen die meisten Tutorials die ich bisher gefunden habe ein gewissen Wissen in dem Themengebiet der Formalen Sprachen vorraus. Klassischerweise wirst du hier eher Tutorials für C, C++, Haskell und diverse MLs finden.

Wenn du wirklich eine Sprache abbilden willst, die nicht mit dem von dir gezeigten einfachen if..else-parsing halbwegs lesbar zu implementieren ist, rate ich dir einen studierten ins Boot zu holen oder zumindest in einer nahe gelegenen Universität die Inhalte der Vorlesungen "Automaten", "Formale Sprachen" und "Compilerbau" mit zu nehmen. "Automaten" und "Formale Sprachen" werden häufig auch kombiniert gehalten, fast immer aber stehen sie im selben Semester auf dem Plan. Geschickt aufgeteilt und gut aufgepasst solltest du also in etwa einem Jahr soweit sein.

Es tut mir wirklich leid dich hier demotivieren zu müssen, aber es ist halt so, dass es beim Design von Sprachen viele Dinge zu beachten gibt (kontextfreie Grammatik oder eben nicht? LL-Parser, LR oder doch LALR? und vieles mehr) Die Gesamtheit der Antworten auf diese Frage schreibt dir überhaupt erst vor, was du für Werkzeuge benutzen kannst oder musst um deinen Scanner und Parser zu schreiben, was wiederum dich zumeist auf eine oder zwei Implementierungssprachen festlegt.

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Interpreter mit Ruby
BeitragVerfasst: 20 Mär 2017, 22:39 
Offline
Obfuscator

Registriert: 20 Jul 2003, 22:14
Beiträge: 597
Vielleicht für den Anfang sich einfach mal an Brainfuck oder False versuchen. Das motiviert bestimmt. :)

_________________
Please could you stop the noise I'm trying to get some rest?
From all the unborn chicken voices in my head....


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: