# Luna (Programmiersprache)

Luna (lateinisch für Mond) ist eine imperative, funktionale und objektbasierte Programmiersprache mit visueller Entwicklungsumgebung für Linux, Mac OS X und Windows. Sie unterstützt imperative, strukturierte, funktionale und objektbasierte Programmierung.

## Implementierungen

Es existiert eine Implementierung für Mikrocontroller der AVR-Architektur. Eine Implementierung für x86-64 ist angekündigt.

## Eigenschaften
### Sprachdesign

Die Sprache Luna besteht aus relativ wenigen Schlüsselwörtern („Sprachkern“); ihre eigentliche Funktionalität erhält sie – ähnlich wie auch die Sprachen C/C++ – durch die Standardbibliotheken sowie, je nach Einsatzgebiet, zusätzliche Bibliotheken und Frameworks. Luna legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken.
Eine der Stärken von Luna ist die Kombinierbarkeit von effizienter, maschinennaher Programmierung mit mächtigen Sprachmitteln, die einfache bis komplexe Implementierungsdetails zusammenfassen und weitgehend hinter abstrakten Befehlsfolgen verbergen. Dabei kommt vor allem die Template-Metaprogrammierung wie in C++ zum Zuge, eine Technik, die eine nahezu kompromisslose Verbindung von Effizienz und Abstraktion erlaubt.

#### Ressourcenverwaltung

Es ist vorgesehen, Speicher manuell zu verwalten und im Hinblick auf die maschinennahe Programmierung direkt auf Speicherbereiche zuzugreifen. Luna besitzt jedoch parallel eine auf hohe Effizienz ausgelegte, integrierte, automatische, generationelle Speicherbereinigung (Garbage Collection). In der Praxis ist die Lebensdauer von Objekten meist sehr unterschiedlich. Auf der einen Seite existieren Objekte, die die gesamte Laufzeit der Applikation überleben. Auf der anderen Seite gibt es eine große Menge von Objekten, die nur temporär für die Durchführung einer einzelnen Aufgabe benötigt werden. Mit jeder Anwendung des Freigabe-Algorithmus werden langlebige Objekte in eine höhere Generation verschoben. Der Vorteil liegt darin, dass die Speicherbereinigung für niedrige Generationen häufiger und schneller durchgeführt werden kann, da nur ein Teil der Objekte verschoben und deren Zeiger verändert werden müssen. Höhere Generationen enthalten mit hoher Wahrscheinlichkeit nur lebende (bzw. sehr wenige tote) Objekte und müssen deshalb seltener bereinigt werden. Die Besonderheit des in Luna implementierten Algorithmus ist, dass er keine Zähler für die Lebensdauer der einzelnen Objekte benötigt und alle Objekte Rückwärtsreferenzen aufweisen. Die Rückwärtsreferenzen erlauben es „tote“ Speicher-Objekte und fehlerhafte Objektvariablen zu erkennen.

## Entwicklungsumgebung

Die gesamte Luna Entwicklungsumgebung „Luna Studio“ besteht aus einer integrierten Entwicklungsumgebung (IDE), einem Präprozessor (Makroprozessor), Compiler und Assembler. Programme können wahlweise in der IDE oder in einem normalen Texteditor geschrieben werden. Die IDE bietet hierbei zusätzlich zu den allgemein wünschenswerten Funktionen wie Syntaxfärbung, automatischer Einrückung, Code-Strukturierung und Autovervollständigen, eine direkte Unterstützung der einzelnen Atmel-AVR-Controller. Zusätzlich sind ein mächtiger Bibliothekseditor, Verzeichnis der Controller-Defines, eine GUI für AvrDude und zahlreiche, weitere nützliche Werkzeuge vorhanden.

## Zielarchitektur

Der Cross-Compiler/Assembler sowie die Entwicklungsumgebung unterstützen die Mikrocontroller der AVR-Architektur der Firma Atmel. Dies umfasst die Controllerfamilien Attiny, Atmega und Atxmega.

## Sprachmerkmale im Detail

Die Syntax lehnt sich im Wesentlichen an die Programmiersprachen Xojo (ehemals RealBasic) und Pascal an, was besonders Anfängern den Einstieg in Luna erleichtert. Weiterhin ist Luna von C++ beeinflusst und implementiert zahlreiche Operatoren und Direktiven.

### Definitionen/Aliase

Mit Definitionen können Befehle, Befehlskombinationen oder Ausdrücke im Sinne eines Alias mit einem Bezeichner verknüpft werden. Der Bezeichner kann dann wiederum im Sourcecode so genutzt werden, als würde es sich um den zugewiesenen Ausdruck handeln. Anstelle des Platzhalter setzt der Compiler die dem Namen zugewiesenen Ausdruck während des Kompiliervorgangs automatisch ein. Dies schließt auch die aus C/C++ bekannten sog. Define-Funktionen (Makro-Funktionen) ein. D. h., es kann ein virtueller Funktionsname anstatt eines Ausdrucks verwendet werden. Die Parameter werden dann durch Textersetzung in Ausdruck rechts eingesetzt.
Zugehörige Befehle:
* #define Name as Ausdruck
* #undef Name

### Strukturen

Strukturen fassen Datentypen und/oder Datenobjekte unter einem Namen statisch zusammenfassen. Strukturen können hierbei verschachtelt genutzt werden.

### Mengen

Mengen sind spezielle Ausdrücke, die eine Sammlung von konstanten Werten zusammenfassen und das Verwalten oder Zuweisen von Datensammlungen erleichtern (z. B. eine Liste von Zahlen und Texten). Eine Menge steht im Quelltext innerhalb geschweifter Klammern {…}. Wenn als Basis eine Strukturdeklaration zugrunde liegt, können innerhalb einer Menge weitere Untermengen eingebettet sein.

### Numerische Datentypen

Byte, Uint8, Integer, Int16, Word, Uint16, Long, Uint32, LongInt, Int32, Single, Float

### Objekt-Datentypen

String, MemoryBlock, Graphics, sPtr, dPtr, ePtr
Zusätzlich ist es möglich eigene Objekte (Klassen) zu programmieren, die sich wie Objekt-Datentypen verhalten.

### Methoden

Methoden können mit den Schlüsselwörtern procedure und function erzeugt werden. Funktionen liefern im Gegensatz zu Prozeduren einen Rückgabewert. Weiterhin werden unterstützt:
* Überladen
* Parameter-Zuweisung
* Parameter-Initialwert
* Inline-Ersetzung

### Klassen

In Luna lassen sich Klassen definieren, mit denen Funktionen im Sinne eines Moduls oder einer in sich geschlossenen Bibliothek nachgerüstet werden können. Sie sind ähnlich den Units in Pascal implementiert.
Der Aufruf im Programmtext sähe folgendermaßen aus:

### Inline-Assembler

In den Programmtext kann Assemblercode eingebettet werden, womit laufzeitkritische Bereiche optimiert werden können.

### Beispielcode

Das klassische Hallo-Welt-Programm sieht wie folgt aus:
Beispiel für eine Rekursion: