Crash-Override
28.02.2009, 21:59
Hallo,
vielleicht erinnert sich noch einer an meinen ersten Versuch eine eigene kleine Programmiersprache zu entwickeln: Das Ergebnis war dann mein Bot-Simulator (http://www.multimediaxis.de/showthread.php?t=70839&highlight=). Damals noch sehr einfach gehalten und in Delphi geschrieben war diese einfache Skriptsprache damals recht faszinierend.
Da ich im Moment nicht allzuviel zu tun habe ich deshalb mal wieder Lust bekommen mich an einem derartigen Projekt zu versuchen. Das Ergebnis ist XQYZi (XQYZ's Interpreter [wobei XQYZ nur einer meiner 50 Nicks ist die ich gelegentlich mal hier und da verwende, ersetzt es also nach belieben durch Crash, Crash-Override, WordsBG, B.G., HChKn oder Patrick).
Das einfachste Beispiel fuer ein Programm in meiner Sprache waere:
function main ( )
{
printline ( "Hallo Welt!" )
}
Screenshot (http://img87.imageshack.us/img87/7484/screen2z.png)
dafuer muesste man das allerdings ueber die Konsole xqyzi.exe -emain ausfuehren. Standardmaessig ist der Einstiegspunkt des Programmes die Funktion "main" in der Klasse Program, also etwa so wie hier:
class Program
{
function main ( )
{
printline ( "Hallo Welt!" )
}
}
Das besondere an XQYZi (bzw. der Sprache die er interpretiert) ist das es keine Zuweisungen im Klassischen Sinne gibt, also etwa a = b, sondern alles mehr oder weniger als Funktion geschrieben wird (Prefix Artig) wie in a ( b ). Ein anderes Beispiel waere eine Addition: a ( + ( 2 3 ) ). In Delphi waere es so geschrieben: a := (3 + 2);, wobei a noch deklariert werden muss, was hier (wie bei vielen Skriptprachen) nicht noetig ist. Ein komplexeres Beispiel was man bereits machen kann:
# (c) 2009 by Patrick Lerner [PaddyLerner@gmail.com]
#include Math
class Program
{
function Sum ( num1 num2 )
{
result ( + ( num1 num2 ) ) # Sets a new variable named result to the summation of num1 and num2
return ( result ) # returns the value of result
}
function main ( )
{
printline ( "3 + 5 = " Sum ( 3 5 ) )
printline ( "Squareroot of 9: " Math.Sqrt ( 9 ) )
printline ( "Pi: " Math.Pi ( ) )
printline ( "=== Circle ===" )
printline ( "Radius: 3" )
printline ( "Area: " Math.Circle.Area ( 3 ) )
printline ( "Circumference: " Math.Circle.Circumference ( 3 ) )
}
}
Screenshot (http://img3.imageshack.us/img3/4136/screenu.png)
Math (http://pastebin.com/f7e29aefc) ist dabei eine kleine Bibliothek im inc-Verzeichnis des Interpreters.
Der Quellcode des Interpreters ist in C# verfasst (auch wenn die erste Version in Delphi geschrieben ist) und hat um die 1000 Zeilen Quellcode.
Der Quelltext ist halbwegs gut kommentiert, falls sich einer Tatsaechlich das Teil ansehen will.
Freigegeben ist das ganze unter der GPL (v3) und funktioniert unter Vista/.NET 3.5.
Bezueglich des Syntaxes noch ein kleiner Hinweis: Der 100% korrekte Weg ist jedes "Wort", also jeder Token des Quelltextes durch ein Whitespace zu separieren. Der Interpreter ist aber zumindest ein wenig tolerant, so laeft auch der folgende Quelltext:
class Program {function main()
{printline ( "Hallo Welt!" )
}
}
Es gibt aber auch ne Menge Sachen die einfach nicht gehen, etwa main(){. Also wenn *irgendwas* schief geht und das Programm abstuerzt, mit ziemlicher Wahrscheinlich ein Syntax-Fehler.
Download (http://www.box.net/shared/2mx9xqcr6m) (Source ist das mit Source im Namen, das andere ist Binaries und Beispielprogramm).
PS (keine Ahnung wo ich das noch anmerken koennte, aber faellt mit grad noch ein): Alle Variablen sind nur in der Momentanen Funktion gueltig, auch wenn man theoretisch Klassen-globale Funktionen verwenden kann wenn sie schon deklariert worden waeren. Steht aber recht weit oben auf meiner ToDo-Liste. Aber zunaechst brauche ich noch Bedingungen, auch wenn ich mir noch nicht ganz sicher ueber den Syntax bin.
vielleicht erinnert sich noch einer an meinen ersten Versuch eine eigene kleine Programmiersprache zu entwickeln: Das Ergebnis war dann mein Bot-Simulator (http://www.multimediaxis.de/showthread.php?t=70839&highlight=). Damals noch sehr einfach gehalten und in Delphi geschrieben war diese einfache Skriptsprache damals recht faszinierend.
Da ich im Moment nicht allzuviel zu tun habe ich deshalb mal wieder Lust bekommen mich an einem derartigen Projekt zu versuchen. Das Ergebnis ist XQYZi (XQYZ's Interpreter [wobei XQYZ nur einer meiner 50 Nicks ist die ich gelegentlich mal hier und da verwende, ersetzt es also nach belieben durch Crash, Crash-Override, WordsBG, B.G., HChKn oder Patrick).
Das einfachste Beispiel fuer ein Programm in meiner Sprache waere:
function main ( )
{
printline ( "Hallo Welt!" )
}
Screenshot (http://img87.imageshack.us/img87/7484/screen2z.png)
dafuer muesste man das allerdings ueber die Konsole xqyzi.exe -emain ausfuehren. Standardmaessig ist der Einstiegspunkt des Programmes die Funktion "main" in der Klasse Program, also etwa so wie hier:
class Program
{
function main ( )
{
printline ( "Hallo Welt!" )
}
}
Das besondere an XQYZi (bzw. der Sprache die er interpretiert) ist das es keine Zuweisungen im Klassischen Sinne gibt, also etwa a = b, sondern alles mehr oder weniger als Funktion geschrieben wird (Prefix Artig) wie in a ( b ). Ein anderes Beispiel waere eine Addition: a ( + ( 2 3 ) ). In Delphi waere es so geschrieben: a := (3 + 2);, wobei a noch deklariert werden muss, was hier (wie bei vielen Skriptprachen) nicht noetig ist. Ein komplexeres Beispiel was man bereits machen kann:
# (c) 2009 by Patrick Lerner [PaddyLerner@gmail.com]
#include Math
class Program
{
function Sum ( num1 num2 )
{
result ( + ( num1 num2 ) ) # Sets a new variable named result to the summation of num1 and num2
return ( result ) # returns the value of result
}
function main ( )
{
printline ( "3 + 5 = " Sum ( 3 5 ) )
printline ( "Squareroot of 9: " Math.Sqrt ( 9 ) )
printline ( "Pi: " Math.Pi ( ) )
printline ( "=== Circle ===" )
printline ( "Radius: 3" )
printline ( "Area: " Math.Circle.Area ( 3 ) )
printline ( "Circumference: " Math.Circle.Circumference ( 3 ) )
}
}
Screenshot (http://img3.imageshack.us/img3/4136/screenu.png)
Math (http://pastebin.com/f7e29aefc) ist dabei eine kleine Bibliothek im inc-Verzeichnis des Interpreters.
Der Quellcode des Interpreters ist in C# verfasst (auch wenn die erste Version in Delphi geschrieben ist) und hat um die 1000 Zeilen Quellcode.
Der Quelltext ist halbwegs gut kommentiert, falls sich einer Tatsaechlich das Teil ansehen will.
Freigegeben ist das ganze unter der GPL (v3) und funktioniert unter Vista/.NET 3.5.
Bezueglich des Syntaxes noch ein kleiner Hinweis: Der 100% korrekte Weg ist jedes "Wort", also jeder Token des Quelltextes durch ein Whitespace zu separieren. Der Interpreter ist aber zumindest ein wenig tolerant, so laeft auch der folgende Quelltext:
class Program {function main()
{printline ( "Hallo Welt!" )
}
}
Es gibt aber auch ne Menge Sachen die einfach nicht gehen, etwa main(){. Also wenn *irgendwas* schief geht und das Programm abstuerzt, mit ziemlicher Wahrscheinlich ein Syntax-Fehler.
Download (http://www.box.net/shared/2mx9xqcr6m) (Source ist das mit Source im Namen, das andere ist Binaries und Beispielprogramm).
PS (keine Ahnung wo ich das noch anmerken koennte, aber faellt mit grad noch ein): Alle Variablen sind nur in der Momentanen Funktion gueltig, auch wenn man theoretisch Klassen-globale Funktionen verwenden kann wenn sie schon deklariert worden waeren. Steht aber recht weit oben auf meiner ToDo-Liste. Aber zunaechst brauche ich noch Bedingungen, auch wenn ich mir noch nicht ganz sicher ueber den Syntax bin.