==Object_Jc: Basis aller Daten==
@ident=Object_Jc
In Java ist die Klasse Object automatisch die Basisklasse aller Daten. Damit werden gemeinsame Eigenschaften aller Daten
ausgedrückt. In der CRuntime_Javalike gibt es eine ,,struct Object_Jc,, mit zugeordneten Methoden, die als erstes
Datenelement einer Anwenderstruktur, damit quasi als Basisklasse, angeordnet werden kann. Object_Jc besteht im
Standardfall aus 16 Bytes.
Nachfolgend sind die wesentlichen gemeinsame Eigenschaften dargestellt, die mit Object_Jc bzw. java.lang.Object allen
Instanzen gegeben werden:
===Reflection===
Das Reflection-Prinzip in Java ermöglicht den symbolischen Zugriff auf alle Daten und Methoden und Typ-Tests ohne
Kenntnis des Byteaufbaus (internen Struktur) der Daten. Damit wird ein Zugriffsmöglichkeit auf Daten und Methoden
außerhalb einer Compiler-Linker-Verbindung hergestellt. Die Reflections benötigen in der Struktur Object_c, also pro
instanziierte Daten, einen Zeiger. Pro Datentyp muss eine Zuordnungstabelle mit Typen, Name und Offset vorhanden sein.
Diese kann einen größeren Umfang einnehmen (mehrere Kilobyte), wird aber im Konstanten-Bereich abgelegt. Die
Zuordnungstabelle muss entweder manuell erstellt werden, oder toolunterstützt beispielsweise aus den vorhandenen
Headerfiles der verwendeten Strukturen in einer Applikation. Die Zuordnungstabelle ist vom Typ class_c.
Die Reflections können auf verschiedene Weise genutzt werden:
Zugriff auf Daten und Methoden einer Komponente A aus einer Komponente A heraus, ohne beide Komponenten gemeinsam
compilieren und linken zu müssen.
Typtest einer Klasse, Test auf Basisklassenzugehörigkeit
Zugriff auf Daten und Methoden aus einem universellen Debugtool.
Auf die Nutzung von Reflections kann verzichtet werden. Dabei kann der Zeiger auf die Reflection-Definition gänzlich
eingespart werden, oder der Zeiger in Object_c wird mit null belegt wenn keine Reflection-Zuordnungstabelle vorhanden
ist.
===Mutex===
Jede Datenstruktur kann in Java Träger eines Mutex sein. Mutex heißt "mutual exclusion" - gegenseitiger Ausschluß. Ein
gegenseitiger Ausschluß ist immer auf Datenzugriffe bezogen, niemals auf einen Codeabschnitt ("critical section") wie
vereinfacht-irreführend oft dargestellt werden. Da jeder Datenzugriff in einem Mutithreadsystem potenziell ein
Kandidat für Mutex darstellt, ist in Java die Formulierung eines Mutex direkt mit der Basisklasse Object, ohne
Zusatzkonstrukte, möglich. Das geschieht in Java mittels
synchronized(data)
{ ... Datenzugriff
}
oder einer synchronized-Methode. In der Struktur Object_c ist eine 16-bit-Variable vorgesehen, die eine Identnummer
einer Semaphore tragen kann. Ist sie 0 oder -1, dann ist keine Semaphore angebunden. Damit lässt sich ähnlich einfach
wie in Java mit angepassten Standardprozeduren (an ein vorhandenes Multithread-RTOS) ein Mutex realisieren. Der
Verzicht auf diese Möglichkeit spart 2 Byte pro Instanz, damit sind aber extra Datenstrukturen für Mutex einzurichten.
===Wait-Notity===
Wait-notify ist ein grundlegendes Konstrukt der Prozesssynchronisation. Die Abarbeitung eines Thread wird angehalten
(wait), der Thread wird von einem anderen Thread aus wieder gestartet (notify), gegebenenfalls aber auch nach Ablauf
einer Timeout-Zeit. Das Warten ist meist mit einem Warten auf Daten verbunden, mit dem notify werden also Daten
übergeben. Daher liegt es nahe, anstatt eigenen Konstrukten das wait/notify an Daten zu binden, in Java so geschehen
mit der Basisklasse Object. Der wartende Thread ruft auf
data.wait(timeout);
data.checkNewData() ....
Der datenliefernde Thread ruft auf:
data.setNewData();
data.notify();
Dabei ist zusätzlich ein Umfließen mit synchronized notwendig, um einen Mutex auszuführen. In der Struktur Object_c ist
eine 16-bit-Variable vorgesehen, die eine Identnummer eines wartenden Threads tragen kann. Ist sie 0 oder -1, dann
diese unbenutzt. Damit lässt sich ähnlich einfach wie in Java mit angepassten Standardprozeduren (an ein vorhandenes
Multithread-RTOS) ein wait/notify realisieren. Der Verzicht auf diese Möglichkeit spart 2 Byte pro Instanz, damit sind
aber extra Datenstrukturen für wait/notify einzurichten.
===toString===
Daten sollen immer anzeigbar sein. Java verlangt von allen Daten-Instanzen, dass sie eine toString()-Methode anbieten.
Diese Methode soll den wichtigsten Inhalt der Instanz textuell repräsentieren. Diese Methode ist weniger für die
softwaretechnische Verarbeitung gedacht, sondern zur manuellen Anzeige für Reports, Debugging und dergleichen. Die
Methode toString() ist in der Basisklasse Object enthalten und zeigt dort die Speicheraderesse der Instanz an. Sie
kann (und sollte) in abgeleiteten Klassen überladen werden und damit einem dynamischen Binden zugänglich sein.
Mit der Struktur Object_c wird ebenfalls eine solche Methode angeboten. Mit Hilfe der Abbildung von virtuellen Methoden
in C kann diese Methode auch in C überladen werden, demzufolge mit dynamischen Binden versehen.
Da die Methode toString einen String zurückliefert, ist eine Struktur String_c in diesem Zusammenhang mit definiert.