Luna (Programmiersprache)

Programmiersprache für Mikrocontroller

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

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

Bearbeiten

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

Eigenschaften

Bearbeiten

Sprachdesign

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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

Bearbeiten

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 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

Bearbeiten

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

Objekt-Datentypen

Bearbeiten

String, MemoryBlock, Graphics, sPtr, dPtr, ePtr

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

Methoden

Bearbeiten

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:

 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

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

Bearbeiten

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

Bearbeiten

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
 
Luna-AVR-IDE
Bearbeiten

Einzelnachweise

Bearbeiten
  1. Luna x64 Teaser. 2. Oktober 2016, abgerufen am 2. Oktober 2016.