Startseite < Informatik < Algorithmen Datenstrukturen / Software-Engineering / Programmiersprachen < Compiler Interpreter < Setty [ DRUCK , 2004 , 2005 , 2006 , 2007 , 2008 , 2009 ] Tinyray < Tinyray-Scanner Tinyray-Parser / Tinyray-Language Tinyray-Raytracer / Tinyray-Wallpapers > > / Java C/C++ POV-Ray LaTeX > / Künstliche Intelligenz > Schach Privates / Inhalt >
Tinyray
Eine weitere Sprache zur exemplarischen Demonstration der Arbeitsweise eines Interpreters.
Einführung Definitionen zur Sprache: Tinyray
Tinyray
Tinyray ist eine kontextfreie Sprache zur Beschreibung einfacher 3D-Szenen und soll dem interessierten Leser eine Hilfestellung zur Entwicklung und Interpretation eigener Programmiersprachen bieten.

Sie werden sehen, wie
  • wichtige Entwurfsmuster (sogenannte Design-Patterns) bei der Entwicklung des Interpreters sinnvoll zum Einsatz kommen,
  • nebst Interpreter ein einfach gelagerter Raytrayer realisiert wird.
Voraussetzungen, die Sie mitbringen sollten, sind:
  • Gute Kenntnisse in Java (Generic Java).
    Der gesamte Tinyray-Interpreter (Version 2) kommt mit den Standardklassen von Java 1.6 aus. Es werden keine zusätzlichen Packages benötigt!
  • Ein gewisses Maß an Grundkenntnissen in Compilerbau. Als Voraussetzung dürfte Setty vollkommen ausreichen. Sie sollten zumindest mit den Begriffen Token, Scanner, Parser und Syntaxbaum etwas anfangen können.
  • Ein gutes Verständnis bezüglich Vektorrechnung. Der Raytracer-Part ist nichts anderes als angewandte Vektormathematik.
Mit der Tinyray-Sprache werden dreidimensionale Szenen beschrieben.

Um einen besseren Einstieg in eine neue Programmiersprache zu bekommen, beginnt man traditionellerweise mit einem „Hallo Welt”-Programm. Das erste Code-Beispiel der Tinyray-Sprache implementiert eine zentral positionierte Kugel (Sphere) in einer 3D-Szene. Die einzige Lichtquelle dieser Szene ist eine weiße Sonne (Sun).
Hallo Welt!
// Hallo Welt!

Tinyray {
    Sphere {
        [0, 0, 0]; // Wo liegt die Kugel?
        2.0        // Welchen Radius besitzt die Kugel?
    }
    Sun {
        [1, 1, 1]; // In welcher Richtung befindet sich die Sonne?
        [1, 1, 1]  // Welche Farbe hat die Sonne?
    }
}
Hallo Welt!
Der Raytracer-Part des Interpreters produziert aus dem „Hallo Welt”-Programm. ein Bild mit einer beleuchteten, grauen Kugel. Die Kugel ist grau, weil für geometrische Objekte die graue Farbe voreingestellt ist.

Der Tinyray-Interpreter besitzt neben der Bilderzeugung auch noch weitere Features, wie beispielsweise die Portierung eines Tinyray-Programmes in POV-Ray-Code oder auch in Glut/OpenGL-C-Code.
Mit ein bisschen Übung können Sie eventuell auch folgende oder gar hochwertigere Bilder mit Tinyray erzeugen.
Platz 3 der Fußball-WM-2006
Ein Tinyray-Bild, welches ich zur Zeit der Fussball-WM-2006 renderte.
Mit Tinyray entwickelt!
Mein persönliches Desktopbild
Ein Schacht mit nur 6 Kugeln
Ebenfalls mit Tinyray entwickelt!
Einfach nur Kugeln im Kreis
Kugeln im Kreis
Ebenfalls mit Tinyray entwickelt!

Im Prinzip können auch Sie beliebige Bilder mit Tinyray entwickeln.
Wie jede andere Sprache basiert auch Tinyray auf einer Grammatik — der Tinyray-Grammatik TG.

Lassen Sie sich nicht von dem Umfang der Tinyray-Grammatik abschrecken! Es werden noch viele Tinyray-Programmbeispiele folgen.
Tinyray-Grammatik
Tinyray-Grammatik TG = (NTPS) mit

N = {
    Tinyray, Global, Defaults, Geo, Sun, Camera,
    Background, Ambience, Fog, Bounding, Triangle,
    Sphere, Plane, Parameters, Vector
},

T = {
    TINYRAY    := 'Tinyray',        CAMERA   := 'Camera',
    BOUNDING   := 'Bounding',       SPHERE   := 'Sphere',
    TRIANGLE   := 'Triangle',       PLANE    := 'Plane',
    AMBIENCE   := 'Ambience',       SUN      := 'Sun',
    BACKGROUND := 'Background',     FOG      := 'Fog',
    DEFAULTS   := 'Defaults',

    LBRACE     := '{',              RBRACE   := '}',
    LBRACKET   := '[',              RBRACKET := ']',
    SEP        := ','|';',

    REAL       := ['+'|'-'] ((('0'-'9')+) | (('0'-'9')*'.'('0'-'9')+))
                  [('E'|'e') ['+'|'-'] ('0'-'9')+]
},

P = {
    Tinyray    ::= TINYRAY LBRACE (Global | Defaults | Geo | Sun)* RBRACE,

    Global     ::= Camera | Background | Ambience | Fog,
    Defaults   ::= DEFAULTS LBRACE Parameters RBRACE,
    Geo        ::= Bounding | Triangle | Sphere | Plane,
    Sun        ::= SUN LBRACE Vector SEP Vector RBRACE,

    Camera     ::= CAMERA LBRACE Vector SEP Vector [ SEP Vector ] RBRACE,
    Background ::= BACKGROUND LBRACE Vector RBRACE,
    Ambience   ::= AMBIENCE LBRACE Vector RBRACE,
    Fog        ::= FOG LBRACE Vector SEP REAL RBRACE,

    Bounding   ::= BOUNDING LBRACE (Bounding | Triangle |
                       Sphere | Defaults)* RBRACE,
    Triangle   ::= TRIANGLE LBRACE Vector SEP Vector
                       SEP Vector [ SEP Parameters ] RBRACE,
    Sphere     ::= SPHERE LBRACE Vector SEP REAL [ SEP Parameters ] RBRACE,
    Plane      ::= PLANE LBRACE Vector SEP Vector
                       SEP Vector [ SEP Parameters ] RBRACE,

    Parameters ::= Vector [ SEP Vector [ SEP REAL [ SEP REAL [
                       SEP REAL ] ] ] ],

    Vector     ::= LBRACKET REAL SEP REAL SEP REAL RBRACKET
} und

S = Tinyray.
Die Grammatik TG beschreibt die Menge aller potentiell möglichen Tinyray-Programme. Ein Programm, welches nicht die Regeln der Grammatik TG verletzt, ist — syntaktisch gesehen — ein korrektes Tinyray-Programm.

An dieser Stelle, können Sie sich mal überlegen, wie viele paarweise unterschiedliche, korrekte Tinyray-Programme existieren.
Download Herunterladen der Quelldateien von Tinyray
Die Sourcen
Die Java-Sourcen von Tinyray sind auch zum Ausprobieren auf Ihrem eigenen Rechner verfügbar:
  1. tinyray.zip (173.148 Bytes)
Ich wünsche Ihnen viel Vergnügen mit Tinyray!

Mit freundlichen Grüßen

Stefan Karl Baur
Applet Tinyray in Action
Tinyray in Action
Damit es aber nicht zu trocken wird, sollten Sie sich zum Warmwerden folgendem Applet widmen. Da Tinyray in Java implementiert ist, kann der Interpreter selbstverständlich auch als Applet ausgeführt werden. Dieses Applet ermöglicht das parallele Rendern unterschiedlicher Szenen.

Wichtig: Ihr Browser benötigt unbedingt eine Java-Runtime-Environment (JRE), welche kompatibel zur Java-Version 1.6 ist, weil ich den Tinyray-Interpreter mit Java 1.6 geschrieben habe. Ohne diese kompatible JRE würde das Applet die Fehlermeldung „invalid bytecode” liefern oder einen Versionskonflikt verursachen. Bei manchen Browsern würde das Applet überhaupt nicht angezeigt werden.
Mehr zu diesem Applet finden Sie unter Tinyray-Applet.