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.
Luna | |
---|---|
Luna-Logo | |
Basisdaten | |
Paradigmen: | Multiparadigmen (imperativ, objektorientiert, prozedural, strukturiert, funktional) |
Erscheinungsjahr: | 2011 |
Entwickler: | Richard Gordon Faika |
Aktuelle Version: | 2018.r1 (13. Februar 2018) |
Aktuelle Vorabversion: | keine () |
Typisierung: | Statische Typisierung (static typing) |
Beeinflusst von: | Xojo, Pascal, C++, GFA-Basic |
avr.myluna.de |
Implementierungen
Es existiert eine Implementierung für Mikrocontroller der AVR-Architektur. Eine Implementierung für x86-64 ist angekündigt[1].
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.
// Struktur deklarieren
struct point
byte x
byte y
endstruct
dim a(3) as point // Array mit 4 Elementen des Typs "point" dimensionieren
a(0).x = 1
a(0).y = 20
a(1).x = 23
a(1).y = 42
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.
struct mystruct
byte myarray(2)
word level
string text[14]
endstruct
data table
mystruct{ { 1, 2 ,3 }, 4, "hallo" } 'Text wird auf die in der Strukturdeklaration
mystruct{ { 5, 6 ,7 }, 8, "ballo" } 'definierten Länge von "text" mit Leerzeichen aufgefüllt.
enddata
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
function probe(zahl1 as integer, zahl2 as integer) as longint
dim zahl3 as longint
zahl3 = zahl1 * zahl2 + 10
if zahl3 > 128000 then
zahl3 /= 64
end if
return zahl3
endfunc
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.
// Deklaration
Class test
const Version = "1.0"
dim a as byte
Procedure Init()
print "Initialisierung"
print "a = "+str(a)
EndProc
Function GetData(x as byte, y as byte) as single
mul y,4
y=y+x
return tabelle.SingleValue(y)
EndFunc
data tabelle
.dw &h1234,&h5678,&h9aab
.dw &h1234,&h5678,&h9aab
.dw &h1234,&h5678,&h9aab
.dw &h1234,&h5678,&h9aab
enddata
EndClass
Der Aufruf im Programmtext sähe folgendermaßen aus:
print test.Version // Ausgabe
test.Init() // Procedure aufrufen
var = test.GetData(0,2) // Funktion aufrufen
test.a=123 // Wert zuweisen
print str(test.a) // Wert lesen und ausgeben
Inline-Assembler
In den Programmtext kann Assemblercode eingebettet werden, womit laufzeitkritische Bereiche optimiert werden können.
asm ldi _HA0,0x2a ldi _HB0,0x09 call _MathMul8u endasm
Beispielcode
Das klassische Hallo-Welt-Programm sieht wie folgt aus:
avr.device = atmega168
avr.clock = 8000000
avr.stack = 32
uart.baud = 19200
uart.rxd.enable
uart.txd.enable
print "Hallo Welt!"
do
loop
Beispiel für eine Rekursion:
function factorial(n as longint) as longint
if n = 0 then
return 1
else
return n * factorial(n - 1)
end if
endfunc
Weblinks
- avr.myluna.de – offizielle Website (englisch, deutsch)
- Liste der unterstützten AVR-Mikrocontroller
- forum.myluna.de – offizielles Nutzer- und Entwickler-Forum (englisch und deutsch)
Einzelnachweise
- Luna x64 Teaser. 2. Oktober 2016, abgerufen am 2. Oktober 2016.