Einführung in die Programmiersprache ISOM/L

Werbung
Excellence in Automotive Computing.
Informationstechnik München
Handbuch
Titel des Dokuments
Einführung in die Programmiersprache
ISOM/L
Kurztitel
Einführung ISOM/L
Vorgang
externe Referenz
BZ-9758
[email protected]
Das folgende Dokument ist geistiges und urheberrechtliches
Eigentum der
Name und Anschrift
IFS Informationstechnik München
Trausnitzstraße 8
81671 München
Die IFS behält sich ausnahmslos alle urheberrechtlichen
Ansprüche vor, welche sie gemäß der geltenden Rechtslage
in der Bundesrepublik Deutschland sowie aus den jeweiligen
Teilen des Werkes, für die die IFS aufgrund von erfinderischer
Tätigkeit natürlicherweise die Urheberschaft besitzt, ableiten
kann.
Unbeeinflusst davon sind Rechte Dritter, für die die IFS, gemäß
den mit diesen Dritten vereinbarten Verträgen und Überlassungen, das vorliegende Werk ggf. auch im Auftrag erstellt hat.
Eine Abtretung der Urheberschaft kann daraus dennoch nicht
abgeleitet werden.
Autorin des Dokuments
Alexander Noé
Erstellungsdatum
Datum der letzten Änderung
03. Dezember 2009
18. Juni 2013
Version des Dokuments
3.1
erfinden verbessern gewinnen • gemeinsam.
IFS Informationstechnik GmbH Trausnitzstraße 8 81671 München
Telefon +49 89 450983 0 Fax +49 89 450983 10 www.ifs-it.de
Kreissparkasse München Konto 10 110 344 BLZ 702 501 50
Amtsgericht München HRB 126547 USt-IdNr: DE203067267
Geschäftsführer: Dr.-Ing. Markus A. Stulle Dipl.-Ing. Thomas Frey
Excellence in Automotive Computing.
Informationstechnik München
Dokumentinformationen
Status
Bezeichnung
freigegeben
Dieses Dokument unterliegt einem systematischen Änderungsdienst.
Personen und Rollen
Personen
Rollen
Dr.-Ing. Markus A. Stulle
Auftraggeber
Dr. Tim-Oliver Paaschen
Vorhabensverantwortlicher
Roland Ott
Qualitätsbeauftragter
Christian Manhart
Gutachter
Dr. Mario Schweigler
Gutachter
Bettina von Staden
Lektorin
Speicherort des Dokuments
Pfad
\\ifshome.muc.smarttrust.de\IFS\Produkte\Taurus\02 Arbeitspakete\BZ-9758
(Aenderungsdienst Sprachbeschreibung ISOM-L)\06 Spezifikation\BZ-9758 Handbuch
Einführung ISOML v3.1.doc
2 von 109
Dokumentinformationen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Inhalt
3 von 109
Inhalt
1
Einführung
7
1.1
Die Laufzeitumgebung für ISOM/L
7
1.2
Über dieses Dokument
7
2
Eine Einführung in ISOM/L
9
2.1
Hello, world
9
2.2
Hello, world – erweiterte Version
14
3
Kontrollstrukturen
18
3.1
Bedingte Codeausführung mit if/else
18
3.2
Bedingte Codeausführung mit switch/case/default
22
3.3
Schleifen
23
3.4
Abschließende Blöcke
25
4
Grundlagen des ISOM/L-Objektmodells
31
4.1
Objekte als grundlegendes Paradigma
31
4.2
Basisobjekte
32
4.3
Sonderbehandlung der Klassen Boolean und Number
33
4.4
Fachfunktionen statt Operatoren
34
4.5
Objektbasiert statt objektorientiert
35
4.6
Fachfunktionen von Objekten
39
4.7
Grundlegendes zum ISOM-Objektmodell
40
4.8
Das Void-Objekt
41
4.9
Containerklassen
46
4.10
Globale Variablen
50
4.11
ISOM/L-Bibliothek für Fachautoren
51
4.12
Erweiterung der Klassen des ISOM-Objektmodells
51
5
Strukturierung von ISOM/L-Programmen
54
5.1
Hierarchische Struktur von Namensräumen
56
5.2
Die Importanweisung
57
5.3
Übersetzbare Texte und Textdefinitionen
58
5.4
Einfügen von Dateien in ISOM/L-Quellen
60
6
Ein- und Ausgabe
61
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4 von 109
Inhalt
6.1
Standard-Datenströme
61
6.2
Dateizugriff
63
7
Bedienoberfläche und Benutzerinteraktion
67
7.1
Darstellung der Bedienoberfläche im Kommandozeilenmodus
68
7.2
Identifikationsnummern und Schlüssel
68
7.3
Bedienelemente
71
7.4
Auswertung von Benutzereingaben
73
7.5
Assistenten
76
8
Werkzeuge
87
8.1
Verwendung des Interpreters
87
8.2
Einzelschrittausführung im Kommandozeilenmodus
89
9
Syntaxgraphen von ISOM/L
91
9.1
Grundelemente der Syntax
92
9.2
Syntax der Konstanten und Bezeichner
93
9.3
Syntaktischer Aufbau einer ISOM/L-Datei
96
9.4
Syntax einer ISOM/L-Funktionsdeklaration
99
9.5
Syntax der ISOM/L-Anweisungen
100
9.6
Syntax der ISOM/L-Ausdrücke
104
Verzeichnisse und Anhänge
105
A
Verzeichnis der Tabellen
105
B
Verzeichnis der Abbildungen
105
C
Verzeichnis der Codeauszüge
105
D
Referenzen
107
E
Anhang: Überblick über die Schlüsselwörter in ISOM/L
107
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Index
finally 25
Funktion 12, 36, 57
Funktionsdefinition 13, 36
#
#include
60
A
G
Aliasing 33
Anweisung 11
Anzeigetexte 71
ASAM-MCD 7
Assistent 67
At 46
Ausdruck 18, 32
Ausnahme 41
Auswahlgruppen 71
GetAllEnvironmentVars 21
GetId 68
GetInstance 40
Globale Variable 50
Grundraumbezeichner 56, 58
-Gui 68
H
HasNext 46
-Help 88
Hexadezimalzahlen
B
base 52
Basisobjekt 32
Bedingte Codeausführung
Bedingung 18
Bezeichner 10
Block 11
Blockkommentar 11
Boolean 33
18
C
case 23
Clone 34, 35
Containerobjekt
continue 23
Create 40
46
D
-Debug 88
default 23
deftext 17
Dialogfenster
DisableBack()
Dispose() 74
67
78
E
Einzelschrittmodus
Element 46
else 18
Equals 34
extension 51
89, 90
F
Fabrikmethode 40
Fachfunktion 31
Failed 43
Fall-Anweisung 22
Fehlerbehandlung 41
5 von 109
Index
33
I
if 18
if/else 18, 55
Import 14
Importanweisung (using) 15, 54, 55, 57,
58
Insert 46
instanzgebundene Fachfunktion 31
instanzlose Fachfunktion 31
ISO-8859-1 56
Isom.Base.Data 63
Isom.Base.Uri 63
Isom.Global.Processes 56
Isom.Request 67
Isom.Request.Wizard 76
Isom.Sys.System 61
ISOM/L 7
IsomInstance.exe 87
-IsomlCheckOnly 88
-IsomSession 88
Ist-Kontext 40
IsVoid() 41
K
Kategorie 16
Klasse 31
Kommandozeilenmodus 54, 87, 89
Kommandozeilenparameter 88
Kommentar 11
L
leave 26
Literal 32
LoadXml 66
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
M
main-Funktion 13, 54, 55, 87
-MaxRecursion 88
-MaxRuntime 88
Medienelement 71
Messwerte 71
Methode 31
N
T
Namensraum 12, 35–41
Namensraum, anonymer 60
namespace 12
Next 46
-NoLog 88
Number 33
NumberList 46
Taschenrechner 78
Textbezeichner 16
TextCategoryData.xml
Textdefinition 58
this 51
Trennzeichen 11
Typ 32
Typbezeichner 36
O
objectbound 51
Objekt 31
Objektinstanz 31
Objektmodell 35, 40
Operator 32, 34
Option 71
59
U
übersetzbare Texte 58
Ungültig-Machen 41
UpdateMeasurement() 77
UpdateMessage() 77
UriDictionary 48
using (Importanweisung)
58
UTF-8 54
P
Parameter-Variable 36
ParseNumber 19
Polymorphie 35
primitiver Datentyp 33
-Program 88
15, 54, 55, 57,
V
Variable 31
Vererbung 35
Void() 41
Void-Objekt 41, 43
vollqualifizierter Typname
58
R
Referenztyp
Reset 46
return 38
Run() 76
Stdin 19
Stdout 13
String 32
StringDictionary 21
switch 22
switch/case/default 22
Syntax 10
Syntaxgraph 91
33
15, 56, 57,
S
W
Schaltfläche 71
Schleife 23
Schlüsselwort 107
Schrittsteuerung 76
Schrittsteuerung, manuelle
SetUpdateFunction() 77
ShowRequest 73
Signatur 36
Singleton 40
Standardausgabe 13
Standardfall 23
Stderr 21
WaitUserRequest() 73
-Warnings 88
Werttyp 33
while 23
while/break/continue 23, 55, 90
Wörterbuch 48
WriteXml 65
6 von 109
Index
85
X
XML-Format
64
Z
Zeilenkommentar
Zuweisung 11
11
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
1
Einführung
ISOM/L ist eine einfache und robuste Programmiersprache. Ihre
Entwicklung wurde von den Serviceaufgaben bei der SoftwareReparatur von Fahrzeugsteuergeräten in der Werkstatt beeinflusst. Zur Software-Reparatur zählen zum Beispiel das Auslesen
von Fehlerspeichereinträgen, die Programmierung und Codierung
von Steuergeräten („Flashen“) und die Ermittlung des Fahrzeugauftrags. Die Durchführung dieser Serviceaufgaben basiert auf
Standards wie ASAM-MCD.
ISOM/L ist eine objektbasierte, interpretierte Programmiersprache, die zur Beschreibung von Serviceabläufen zur Ausführung durch ISOM verwendet wird. Die Sprache erlaubt die
flexible Definition von Serviceabläufen und deren Steuerung
durch das bereitgestellte ISOM-Objektmodell.
1.1
Die Laufzeitumgebung für ISOM/L
Die Laufzeitumgebung von ISOM/L besteht aus dem ISOM-Interpreter zur Ausführung der ISOM/L-Programme. Sie stellt die Basistypen für ISOM/L zur Verfügung und überwacht die Ausführung der
Programme.
1.2
Über dieses Dokument
Das vorliegende Handbuch stellt die Sprache ISOM/L vor und bietet eine Einführung in die Verwendung von ISOM/L anhand nichtfachlicher Beispielen. „Nichtfachlich“ bedeutet in diesem Fall,
dass keine Konzepte aus einem konkreten Anwendungsgebiet von
ISOM und ISOM/L wie zum Beispiel der Programmierung von Steuergeräten in Kraftfahrzeugen behandelt werden. Für eine fachliche
Einführung in dieses Thema wird auf die jeweilige OEMspezifische Dokumentation verwiesen.
Hinweis:
Das nebenstehende Symbol markiert in diesem Dokument nützliche
Hinweise und Empfehlungen.
Achtung:
Das nebenstehende Symbol markiert in diesem Dokument Warnungen
und dringende Empfehlungen.
7 von 109
1 Einführung
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Das Handbuch gliedert sich wie folgt:
8 von 109
1 Einführung

Kapitel 2 führt anhand kommentierter Beispiele in die
Sprache ISOM/L ein.

Kapitel 3 stellt die Kontrollstrukturen für Schleifen
und bedingte Codeausführung vor.

Kapitel 4 beschreibt detailliert die Grundlagen des
ISOM/L-Objektmodells.

Wie ISOM/L-Programme strukturiert werden, beschreibt
Kapitel 5.

Kapitel 6 erklärt die Ein- und Ausgabe von Daten mit
ISOM/L.

Kapitel 7 zeigt die Verwendung von Objekten zur Interaktion mit dem Benutzer und ihre Darstellung an der
Bedienoberfläche.

Kapitel 8 erläutert die Verwendung des ISOM/L-Interpreters
und weiterer Werkzeuge.

Kapitel 9 enthält die Syntaxgraphen der Sprache.
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
2
Eine Einführung in ISOM/L
In diesem Kapitel werden zunächst ausgewählte Eigenschaften
von ISOM/L anhand eines kurzen Beispiels näher erläutert. Die
Erläuterungen sollen dem Programmierer ein Gefühl für die Verwendung von ISOM/L vermitteln und stellen keine formale Definition dar. Die formale Definition der Sprache ISOM/L in Form
von Syntaxgraphen wird in Kapitel 9 vorgestellt.
Zur Verwendung des ISOM-Interpreters siehe Kapitel 8.1.
2.1
Hello, world
Codeauszug 1 zeigt ein minimal vollständiges ISOM/L-Programm,
das, wie es die Tradition von jeder Einführung in eine Programmiersprache verlangt, die Zeichenkette „Hello, world!“ auf der
Standardausgabe ausgibt.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
/*
* ISOM/L-Beispielprogramm: HelloWorld.is
* erste Version
*/
namespace HelloWorld
{
Isom.Base.Boolean main ()
{
Isom.Sys.System.Stdout("Hello, world!");
return true;
}
}
Codeauszug 1: HelloWorld.is
Dieses kurze Beispielprogramm wird nachfolgend erläutert und
erweitert.
2.1.1
Ausführung
Die Beispiele, die in diesem Handbuch gezeigt werden, sind
in ISOM Didact [1] enthalten. Alternativ können sie in einem
beliebigen Texteditor eingegeben werden.
9 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Wurde die Testumgebung wie in Kapitel 8.1.1 beschrieben vorbereitet, kann das Programm „Hello, world“ wie folgt mit dem
ISOM-Interpreter ausgeführt werden:
Abbildung 1: Ausführung des Programms „Hello, world“
2.1.2
Grundlegendes
Die Syntax von ISOM/L basiert auf der Syntax der C-verwandten
Sprachen. Schlüsselwörter und Bezeichner sind groß-/kleinschreibungsabhängig; daher stellen zum Beispiel test und Test
10 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
unterschiedliche Bezeichner dar. Anweisungen sind mit einem Semikolon („;“) abzuschließen. Leere Anweisungen sind zulässig.
Anweisungen können zu Blöcken gruppiert werden, die durch geschweifte Klammern („{“ und „}“) begrenzt werden. Zuweisungen
verwenden das einfache Gleichheitszeichen (=). Zulässige Trennzeichen sind Leerzeichen, Tabulatorzeichen und Zeilenumbruch.
Hinweis:
Von der Verwendung des Tabulatorzeichens für Einrückungen wird
abgeraten, um ein einheitliches Aussehen der Programme auf verschiedenen Systemen zu gewährleisten.
2.1.3
Kommentare
Codeauszug 1 beginnt mit einem Kommentar. Kommentare erläutern
den ISOM/L-Quellcode. Ihr Inhalt wird vom Interpreter nicht
weiterverarbeitet.
Kommentare entsprechen dem C-Stil. Mit „//“ werden Kommentare
begonnen, die bis zum Ende der aktuellen Zeile reichen (Zeilenkommentare). Zusätzlich können sich Kommentare auch über mehrere Zeilen oder Teile von Zeilen erstrecken (Blockkommentare),
wenn sie mit „/*“ begonnen und mit „*/“ abgeschlossen werden.
Blockkommentare können Zeilenkommentare umschließen, nicht jedoch andere Blockkommentare. Das erste Auftreten der Zeichenfolge „*/“ beendet den Blockkommentar unabhängig davon, wie
oft die Zeichenfolge „/*“ in diesem Blockkommentar vorkommt.
11 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Dies ist ein Zeilenkommentar.
/*
Dies ist ein
Blockkommentar, der sich
über mehrere Zeilen erstreckt.
*/
/* Dies ist ein Blockkommentar in einer Zeile. */
/*
* Dies ist ein Blockkommentar mit "*"
* als Dekoration an jedem Zeilenanfang. Diese Dekoration
* ist nicht Bestandteil der Kommentar-Syntax von ISOM/L.
*/
/* Dies ist
ein Blockkommentar, der einen
// Zeilenkommentar
umschließt. Er ist erst hier zu Ende. */
/* Dies ist
ein Blockkommentar, in dem sich der Beginn eines
/* weiteren
Blockkommentars befindet.
Der gesamte Kommentar ist hier zu Ende. */
Diese Zeile ist kein gültiger Kommentar und führt zu einem Fehler. */
Codeauszug 2: Kommentare
2.1.4
Namensräume
Bei der nächsten Anweisung (namespace …) aus Codeauszug 1 handelt es sich um die Definition eines Namensraums mit dem Namen
HelloWorld.
Ein Namensraum ist eine Sammlung von Funktionen. Die Funktionen
eines Namensraums werden vom Programmierer in ISOM/L definiert.
Im vorliegenden Beispiel enthält der Namensraum nur die im folgenden Kapitel 2.1.5 beschriebene main-Funktion.
Ein Namensraum wird definiert durch das Schlüsselwort namespace, gefolgt vom Namensraumbezeichner und einer öffnenden
geschweiften Klammer ({). Dem schließen sich eine beliebige
Anzahl von Funktionsdefinitionen an, gefolgt von einer schließenden geschweiften Klammer (}).
Namensraumbezeichner können hierarchisch aufgebaut sein
und spielen eine wichtige Rolle bei der Strukturierung des
12 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodes und der Datei- und Verzeichnisstruktur der ISOM/LProgramme auf Speichermedien.
Namensräume werden in Kapitel 5 detailliert vorgestellt. An
dieser Stelle sei nur festgehalten, dass eine Funktion stets
innerhalb eines Namensraums definiert werden muss, d.h. die
Angabe eines Namensraums ist auch für diese einfachen Beispielprogramme notwendig.
2.1.5
Die main-Funktion
Im Kommandozeilenmodus wird die main-Funktion des übergebenen
ISOM/L-Programms ausgeführt.
Achtung:
Gibt es im Kommandozeilenmodus keine main-Funktion in dem betreffenden Programm, wird die Ausführung nicht begonnen und
eine Warnung ausgegeben.
Für die Definition der main-Funktion gilt sonst dasselbe wie
für jede andere ISOM/L-Funktion: Eine Funktionsdefinition besteht aus dem Typbezeichner, der den Rückgabetyp darstellt,
gefolgt vom Namen der Funktion. Dem folgt eine Parameterdeklarationsliste (in runden Klammern „()“, durch Komma getrennt)
sowie eine Anweisung oder mehrere zu einem Block zusammengefasste Anweisungen. Eine Parameterdeklaration besteht aus
einem Typbezeichner, gefolgt von einem Parameternamen.
Im Beispiel der main-Funktion aus dem Programm „Hello, world“
ist Isom.Base.Boolean der Typbezeichner des Rückgabetyps und
main der Funktionsname. Die Parameterdeklarationsliste ist
leer. Die Anweisung besteht aus einem mit geschweiften Klammern
gruppierten Block, der wiederum zwei Anweisungen enthält.
Die erste dieser Anweisungen wird im nachfolgenden Kapitel
2.1.6 erläutert. Die zweite Anweisung mit dem Schlüsselwort
return verlässt die Funktion und liefert den Rückgabewert vom
Typ Isom.Base.Boolean – in diesem Fall true - zurück.
2.1.6
Ausgabe von Zeichenketten über die Standardausgabe
Die erste Anweisung innerhalb des Blocks der main-Funktion gibt
die Zeichenkette Hello, world! in den Standardausgabestrom aus.
Der Programmierer ruft dazu die Fachfunktion Stdout des
ISOM-Objekts Isom.Sys.System auf. Ihr wird als Parameter die
13 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
auszugebende Zeichenkette Hello, world! übergeben. In Zeichenketten sind alle Zeichen bis auf Textbegrenzungszeichen („"“)
erlaubt. Die Fachfunktion Stdout fügt nach der Zeichenkette
selbsttätig ein zusätzliches Zeilentrennzeichen in den Standardausgabestrom ein [2].
2.1.7
Zusammenfassung
Damit ist die einführende Beschreibung des einfachen Beispielprogramms „Hello, world“ abgeschlossen. Codeauszug 3 zeichnet
die beschriebenen Sprachelemente nochmals mit erklärenden Kommentarzeilen aus.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
/*
* ISOM/L-Beispielprogramm: Hello, world
* zweite Version, mit Kommentaren
*/
//
//
//
//
Kommentar
Kommentar
Kommentar
Kommentar
namespace HelloWorld // Namensraumdeklaration
{ // Beginn Namensraum
Isom.Base.Boolean main() // Funktionsdefinition
{ // Beginn Anweisungsblock
Isom.Sys.System.Stdout("Hello, world!"); // Standardausgabe
return true; // Verlassen der Funktion
} // Ende Anweisungsblock
} // Ende Namensraum
Codeauszug 3: HelloWorldWithComments.is
2.2
Hello, world – erweiterte Version
Codeauszug 1 ist nur minimal vollständig und nutzt nicht alle
Möglichkeiten der Sprache ISOM/L aus. Zwei dieser Möglichkeiten
sollen nachfolgend noch vorgestellt werden: die Importanweisung
und Textdefinitionen.
2.2.1
Import von Namensräumen mit using
Alle Typen des ISOM-Objektmodells werden aus dem Namensraum
HelloWorld heraus mit ihren vollqualifizierten Typnamen
referenziert (Isom.Base.Boolean, Isom.Sys.System). Im vorliegenden Fall sind Isom.Base bzw. Isom.Sys die Bezeichner des
Namensraums, in dem die jeweilige Klasse Boolean bzw. System
definiert ist.
14 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Die Angabe vollqualifizierter Typnamen erfordert Aufwand bei
der Eingabe und führt bei umfangreicheren Programmen schnell
zu schwer lesbaren Anweisungen. ISOM/L unterstützt deshalb
den Import von Typen, die in anderen Namensräumen definiert
sind, über die Importanweisung.
Vor der Definition eines Namensraums können beliebig viele
Importanweisungen stehen. Eine Importanweisung besteht aus
dem Schlüsselwort using, gefolgt vom vollqualifizierten
Typnamen des zu
importierenden Typs und einem Semikolon („;“).
Quellcodeauszug
01 /*
02 * ISOM/L-Beispielprogramm: HelloWorldWithUsing.is
03 * Hello, world: dritte Version mit Importanweisungen
04 */
05
06 using Isom.Base.Boolean; // importiere Typ "Isom.Base.Boolean"
07 using Isom.Sys.System;
// importiere Typ "Isom.Sys.System"
08
09 namespace HelloWorld
10 {
11
/* Für "Isom.Base.Boolean" und "Isom.Sys.System" kann nun
12
* innerhalb des Namensraums "HelloWorld"
13
* auf die vollqualifizierte Angabe des Typnamens verzichtet werden.
14
*/
15
Boolean main ()
16
{
17
Number i = 1; // Fehler: Typ "Number" ist in "HelloWorld"
18
// unbekannt
19
20
System.Stdout("Hello, world!");
21
return true;
22
}
23 }
Codeauszug 4: HelloWorldWithUsing.is
Anstelle des Typnamens kann auch ein „*“ als Platzhalter stehen. In diesem Fall werden alle Typen innerhalb des Namensraums
importiert. Nicht importiert werden hingegen Typen in weiteren
Namensräumen, die unterhalb des angegebenen angesiedelt sind.
Mit anderen Worten: „*“ ist ein Platzhalter für Typnamen, nicht
für Namensraumbezeichner.
15 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 /*
02 * ISOM/L-Beispielprogramm: HelloWorldWithUsing2.is
03 * Hello, world: vierte Version mit Importanweisungen und Platzhaltern
04 */
05
06 using Isom.Base.*; /* importiere alle Typen in "Isom.Base",
07
08 using Isom.Sys.*;
z.B. auch "Isom.Base.Number" */
// importiere alle Typen in "Isom.Sys"
09
10 namespace HelloWorld
11 {
12
/* für Typen in "Isom.Base" und "Isom.Sys" kann nun
13
* innerhalb des Namensraums "HelloWorld"
14
* auf die vollqualifizierte Angabe des Typnamens verzichtet werden.
15
*/
16
Boolean main ()
17
{
18
Number i = 1; // OK: Typ "Isom.Base.Number" ist bekannt.
19
20
System.Stdout("Hello, world!");
21
return true;
22
}
23 }
Codeauszug 5: HelloWorldWithUsing2.is
Die Importanweisung wird detailliert in Kapitel 5.2 beschrieben.
2.2.2
Textbezeichner
ISOM/L bietet die Möglichkeit, Textbezeichner zu definieren.
Diese Textbezeichner können daraufhin in ISOM/L-Programmen
anstelle von Zeichenkettenliteralen verwendet werden. Wird
ein Textbezeichner definiert, liegt eine Textdefinition vor.
Jedem Textbezeichner wird eine Kategorie zugewiesen. Die
zulässigen Kategorien kann der Programmierer in der Datei
TextCategoryData.xml festgelegen, die sich im anwenderspezifischen Verzeichnis \<OEM>\ISOM\isoml befindet (vgl. auch die
vorbereitenden Tätigkeiten, die in Kapitel 8.1.1 beschrieben
sind). Nachfolgend wird davon ausgegangen, dass mindestens die
Textkategorie „MESSAGE“ in dieser Datei definiert wurde.
Textdefinitionen sind Bestandteil eines Namensraums und werden
am Anfang des Namensraums vor den Funktionsdefinitionen angegeben. Es können beliebig viele (auch keine) Textdefinitionen am
Anfang eines Namensraums stehen. Eine Textdefinition besteht
16 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
aus dem Schlüsselwort deftext gefolgt vom Bezeichner der Kategorie und dem Textbezeichner selbst. Dem schließt sich der
eigentliche Text an. Dieser Text ist ein Zeichenkettenliteral,
wie in Kapitel 4.2 beschrieben. Textdefinitionen sind keine
Anweisungen und werden daher nicht mit „;“ abgeschlossen.
Codeauszug 6 zeigt das mit Textdefinitionen erweiterte Programm
„Hello, world“.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
/*
* ISOM/L-Beispielprogramm: HelloWorldWithDeftext.is
* Hello, world: fünfte Version mit Importanweisungen und
* Textdefinition
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace HelloWorld
{
12
13
14
15
16
17
18
19
20 }
// Definition des Textbezeichners HELLO_WORLD der Kategorie MESSAGE
deftext MESSAGE HELLO_WORLD "Hello, world!"
Boolean main ()
{
System.Stdout(HELLO_WORLD); // Verwendung des Textbezeichners
return true;
}
Codeauszug 6: HelloWorldWithDeftext.is
Textdefinitionen dienen neben der Verwendung als Konstanten
dazu, eine Serviceanwendung, die auf ISOM/L-Abläufen basiert,
übersetzbar zu machen, d.h. die verwendeten Texte in verschiedenen Sprachen, in die sie vorher übersetzt wurden, anzeigen
zu können. Mehr zu Textdefinitionen enthält Kapitel 5.3.
17 von 109
2 Eine Einführung in ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
3
Kontrollstrukturen
ISOM/L verfügt über die aus anderen imperativen Programmiersprachen bekannten Kontrollstrukturen, mit einigen Besonderheiten.
Die Beispiele in diesem Kapitel verwenden die in Kapitel 4
näher erläuterten Datentypen von ISOM/L für Zahlen und
Zeichenketten.
3.1
Bedingte Codeausführung mit if/else
Bedingte Codeausführung erfolgt nach dem Schema von C. Dem
Schlüsselwort if folgt als Bedingung ein boolescher Ausdruck in
runden Klammern, dem wiederum eine Anweisung folgt. Diese wird
ausgeführt, wenn die Bedingung als „wahr“ ausgewertet wird.
Optional können ein else und eine weitere Anweisung folgen.
Diese Anweisung wird ausgeführt, wenn die Bedingung zu „falsch“
ausgewertet wird. Beide Anweisungen können Blöcke oder einzelne
Anweisungen sein.
Codeauszug 7 und Codeauszug 8 zeigen die Verwendung von if/else
zusammen mit weiteren Sprachelementen (Zahlen, Wörterbücher,
Void-Objekte), die in den nachfolgenden Kapiteln detailliert
vorgestellt werden.
18 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
3 Kontrollstrukturen
using Isom.Sys.*;
using Isom.Base.*;
namespace IfElseStdio
{
deftext MESSAGE MSG_ERR "Fehler bei der Eingabe. "\
"Bitte starten Sie das Programm neu und geben Sie "\
"zwei ganze Zahlen ein."
Number ReadNumber()
{
// Meldung auf Standardausgabe schreiben
System.Stdout("Bitte geben Sie eine ganze Zahl ein: ");
22
23
24
// Zeichenkette von Standardeingabe lesen
String str = System.Stdin();
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// als Zahl interpretieren
Number num = str.ParseNumber();
42
43
44
45
46
47
48
19 von 109
/*
* ISOM/L-Beispielprogramm: IfElseStdio.is
* Einlesen und Verarbeiten von Zahlen,
* bedingte Codeausführung mit "if/else"
*/
return num;
}
Boolean main ()
{
Number a = ReadNumber();
Number b = ReadNumber();
if(a.IsVoid().Or(b.IsVoid()))
{
System.Stderr(MSG_ERR);
return false;
}
// Multiplizieren
Number prod = a.Clone(); // Wert von a sichern
prod.Mul(b); // Wert von prod wird verändert
Boolean even = prod.Mod(2).Eq(0);
String msg = "Das Produkt von $(a) und $(b) ist $(evenness)";
msg.Replace("$(a)", a.ToIntString()); // Unveränderte Werte von
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 }
msg.Replace("$(b)", b.ToIntString()); // a und b ausgeben
// Bedingte Codeausführung mit "if/else"
if (even) // Produkt beider Zahlen ist gerade
{
msg.Replace("$(evenness)", "gerade");
}
else // Produkt beider Zahlen ist ungerade
{
msg.Replace("$(evenness)", "ungerade");
}
/*********************************************************/
/* In diesem Fall alternativ auch ohne Gruppierung möglich,
* da die Blöcke jeweils nur eine Anweisung enthalten:
if (even)
msg.Replace("$(evenness)", "gerade");
else
msg.Replace("$(evenness)", "ungerade");
*/
/*********************************************************/
System.Stdout(msg);
return true;
}
Codeauszug 7: IfElseStdio.is
20 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
21 von 109
3 Kontrollstrukturen
/*
* ISOM/L-Beispielprogramm: IfElseEnv.is
* Bedingte Codeausführung mit if/else
*/
using Isom.Base.*;
using Isom.Sys.*;
using Isom.Context.*;
namespace IfElseEnv
{
deftext MESSAGE MSG_ERR "Bitte per Kommandozeilenparameter '-Env' "\
"zwei Variablen namens 'valA' und 'valB' definieren und auf "\
"numerische Werte setzen. "\
"Beispiel: IsomInstance.exe -Env=valA:5,valB=7"
Boolean main ()
{
StringDictionary dict =
Environment.GetInstance().GetAllEnvironmentVars();
String valA = dict.Get("valA");
String valB = dict.Get("valB");
if(valA.IsVoid().Or(valB.IsVoid()))
{
System.Stderr(MSG_ERR);
return false;
}
Number a = valA.ParseNumber();
Number b = valB.ParseNumber();
if(a.IsVoid().Or(b.IsVoid()))
{
System.Stderr(MSG_ERR);
return false;
}
// Multiplizieren
a.Mul(b); // Wert von a wird verändert
Boolean even = a.Mod(2).Eq(0);
String msg = "Das Produkt von $(a) und $(b) ist $(evenness)";
msg.Replace("$(a)", valA); // Zeichenketten valA und valB
msg.Replace("$(b)", valB); // sind unverändert
// Bedingte Codeausführung mit "if/else"
if (even) // Produkt beider Zahlen ist gerade
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
49
50
51
52
53
54
55
56
{
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 }
/*********************************************************/
/* In diesem Fall alternativ auch ohne Gruppierung möglich,
* da die Blöcke jeweils nur eine Anweisung enthalten:
msg.Replace("$(evenness)", "gerade");
}
else // Produkt beider Zahlen ist ungerade
{
msg.Replace("$(evenness)", "ungerade");
}
if (even)
msg.Replace("$(evenness)", "gerade");
else
msg.Replace("$(evenness)", "ungerade");
*/
/*********************************************************/
System.Stdout(msg);
return true;
}
Codeauszug 8: IfElseEnv.is
3.2
Bedingte Codeausführung mit switch/case/default
Bedingte Codeausführung kann zudem über das switch-Konstrukt
erfolgen.
Dem Schlüsselwort switch folgt in runden Klammern eine Variable, deren Zustand geprüft werden soll. Diese Variable kann eine
Zeichenkette (Typ String), eine Zahl (Typ Number) oder eine Bedingung (Typ Boolean) sein.
Dem folgt ein in geschweiften Klammern („{“, „}“) eingeschlossener Block. Innerhalb dieses Blocks steht eine Liste möglicher
Werte, die die Variable annehmen kann, mit dem in diesem Fall
auszuführenden Code.
Eine solche Fall-Anweisung beginnt mit dem Schlüsselwort
case, gefolgt von dem Wert, auf den die Variable geprüft
werden soll. Dieser Wert muss ein Literal (siehe 4.2) sein.
Dem folgt ein Doppelpunkt. Anschließend folgt die Anweisung,
die ausgeführt werden soll, wenn die Variable den geprüften
Wert hat. Diese Anweisung kann eine einzelne Anweisung oder
ein Block sein.
22 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Die Liste der möglichen Fälle wird der Reihe nach durchgegangen, bis eine Übereinstimmung gefunden wird.
Wichtiger Hinweis:
Am Ende des switch-Konstrukts muss die Anweisung default: stehen.
Dieser Standardfall ist zwingend vorgeschrieben. Die auf ein
default folgende Anweisung wird ausgeführt, wenn vorher keine
Übereinstimmung gefunden wurde.
Ein „Durchfallen“ von einem case-Block zum nächsten wie in C
sowie ein break innerhalb des switch-Konstrukts sind in ISOM/L
syntaktisch nicht zulässig.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
// Bedingte Codeausführung mit "switch/case/default"
String s;
String t;
...
switch (s)
{
case "Fall 1":
t = "Das ist Fall 1";
case "Fall 2":
t = "Das ist Fall 2";
default:
t = "Standardfall";
}
Codeauszug 9: Bedingte Codeausführung mit switch/case/default
3.3
Schleifen
In ISOM/L gibt es nur eine Art von Schleifen. Diese entspricht
der while-Schleife von C. Dem Schlüsselwort while folgt in runden Klammern eine Bedingung. Der Bedingung schließt sich
eine Anweisung (entweder ein Block oder eine einzelne Anweisung) an. Diese wird wiederholt, solange die Bedingung wahr
ist. Die Anweisung break innerhalb einer while-Schleife
bewirkt das sofortige Beenden der gesamten Schleife. Die Anweisung continue bewirkt das sofortige Verlassen des aktuellen
Schleifendurchlaufs. Die Abarbeitung springt daraufhin direkt
zur erneuten Auswertung der Bedingung.
23 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
* ISOM/L-Beispielprogramm: Berechnung der Fakultät von 10.
* Factorial.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace Factorial
{
Number Fac (Number x)
{
if(x.Lt(0))
{
return Number.Void();
}
if(x.Eq(0))
{
return 1;
}
Number fac = x;
while(x.Gt(1)) // while-Schleife
{
x.Sub(1);
fac.Mul(x);
}
return fac;
}
Boolean main ()
{
Number a = Fac (10);
String msg = "Die Fakultät von 10 ist $1.";
msg.Replace ("$1", a.ToIntString ());
System.Stdout (msg);
return true;
}
}
Codeauszug 10: Factorial.is
24 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
3.4
Abschließende Blöcke
Der Kontrollfluss in ISOM/L-Funktionen kann an vielen Stellen
mit einer Funktionsrückgabe enden. Codeabschnitte, die immer
vor dem Verlassen einer Funktion ausgeführt werden sollen,
können in einen abschließenden Block ausgelagert werden. Ein
abschließender Block vermeidet auf diese Weise die mehrfache
Implementierung dieser Codeabschnitte. Abschließende Blöcke
werden mit dem Schlüsselwort finally eingeleitet.
25 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
* ISOM/L-Beispielprogramm: Abschließender Block.
* FinallyBlock.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace FinallyBlock
{
Boolean main ()
{
{
if( … ) // Auswertung einer Bedingung
return true; // Verlässt die Funktion mit 'wahr'
if( … )
return false; // Verlässt die Funktion mit 'falsch'
…
return true; // Verlässt die Funktion mit 'wahr'
}
finally // Leitet einen abschließenden Block ein
{
//Wird zwischen return und Verlassen der Funktion ausgeführt:
System.Stdout("main-Funktion beendet.");
}
}
}
Codeauszug 11: FinallyBlock.is
Das Programm in Codeauszug 11 gibt am Ende der Funktion main
auf der Konsole eine Nachricht aus. Die Ausgabe erfolgt in allen drei Ausführungspfaden, auf denen das Programm verlassen
werden kann, gleichermaßen.
Ein abschließender Block darf jedem Block folgen, der selbst
kein abschließender Block ist, der kein Funktionsrumpf ist und
der nicht einem Fall einer switch-Anweisung zugeordnet ist.
Nach Fallunterscheidungen mit if oder switch und nach Schleifen
mit while ist ebenfalls ein abschließender Block erlaubt.
Der Befehl leave verlässt vorzeitig einen Block und führt den
zugehörigen abschließenden Block aus.
Achtung:
Ohne einen abschließenden Block, den ein finally einleitet, darf
leave nicht verwendet werden.
Abschließende Blöcke werden auch ausgeführt, wenn der vorangegangene Block nicht vorzeitig durch einen der Sprungbefehle
26 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
return, leave, break oder continue verlassen wird. Innerhalb
abschließender Blöcke sind Sprungbefehle nicht erlaubt.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
* ISOM/L-Beispielprogramm: Abschließender Block und leave-Anweisung.
* FinallyBlockAndLeave.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace FinallyBlockAndLeave
{
Boolean main ()
{
{
if( … ) // Auswertung einer Bedingung
leave; // Sprung in den abschließenden Block
…
}
finally // Leitet einen abschließenden Block ein
{
System.Stdout("main-Funktion beendet.");
}
return true;
}
}
Codeauszug 12: FinallyBlockAndLeave.is
Die Ausführung der leave-Anweisung in Codeauszug 12 führt zur
Fortsetzung der Programmausführung im abschließenden Block.
27 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
* ISOM/L-Beispielprogramm: Abschließender Block nach if-Anweisung.
* FinallyBlockAfterIfElse.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace FinallyBlockAfterIfElse
{
Boolean main ()
{
if( … ) // Auswertung einer Bedingung
{
… // Behandlung, wenn Bedingung wahr ist
}
else
{
… // Behandlung, wenn Bedingung falsch ist
}
finally // Leitet einen abschließenden Block ein
{
System.Stdout("Fallunterscheidung beendet.");
}
return true;
}
}
Codeauszug 13: FinallyBlockAfterIfElse.is
Der abschließende Block in Codeauszug 13 wird nach beiden
unterschiedenen Fälle der if-Fallunterscheidung ausgeführt.
28 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
* ISOM/L-Beispielprogramm: Abschließender Block nach switch-Anweisung.
* FinallyBlockAfterSwitch.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace FinallyBlockAfterSwitch
{
Boolean main ()
{
String s = …;
switch( s )
{
case "Fall 1": // Variable s ist gleich "Fall 1"
…
case "Fall 2": // Variable s ist gleich "Fall 2"
…
default: // In allen anderen Fällen
…
}
finally // Leitet einen abschließenden Block ein
{
System.Stdout("Fallunterscheidung beendet.");
}
return true;
}
}
Codeauszug 14: FinallyBlockAfterSwitch.is
Der abschließende Block in Codeauszug 14 wird nach jedem der
unterschiedenen Fälle der switch-Fallunterscheidung ausgeführt.
29 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* ISOM/L-Beispielprogramm: Abschließender Block nach while-Schleife.
* FinallyBlockAfterWhile.is
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace FinallyBlockAfterWhile
{
Boolean main ()
{
while( … ) // Auswertung der Schleifenbedingung
{
… // Schleifenrumpf
}
finally // Leitet einen abschließenden Block ein
{
System.Stdout("while-Schleife beendet.");
}
}
}
Codeauszug 15: FinallyBlockAfterWhile.is
Der abschließende Block in Codeauszug 15 wird nach Beenden der
Schleife einmalig ausgeführt. Wie oft der Schleifenrumpf durchlaufen wurde, ist unerheblich. Auch wenn der Schleifenrumpf
keinmal durchlaufen wurde, wird der abschließende Block ausgeführt.
30 von 109
3 Kontrollstrukturen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4
Grundlagen des ISOM/L-Objektmodells
In den Beispielen zu den Kontrollstrukturen von ISOM/L im
vorangegangenen Kapitel wurden bereits Variablen verschiedener
Datentypen definiert und Operationen auf ihnen ausgeführt. Das
vorliegende Kapitel beleuchtet detailliert die Grundlagen des
ISOM-Objektmodells und seiner Datentypen.
4.1
Objekte als grundlegendes Paradigma
Ein Objekt ist ein Container, der Daten und Methoden enthält.
Eine Methode ist eine Funktion, die einem Objekt zugeordnet
ist und über die ggf. die in dem Objekt enthaltenen Daten manipuliert werden können. Eine Klasse ist die abstrakte Definition
eines Objekts, auf deren Grundlage konkrete Instanzen des Objekts erzeugt werden können.
Die Methoden, die die ISOM/L-Bibliothek für Serviceautoren [2]
bereitstellt, werden Fachfunktionen genannt. Bei den Fachfunktionen ist zu unterscheiden zwischen instanzlosen und instanzgebundenen Fachfunktionen. Eine instanzlose Fachfunktion gehört
zu einer bestimmten Klasse, aber nicht zu einer konkreten Objektinstanz dieser Klasse. Sie kann jederzeit aufgerufen werden, ohne dass vorher eine Objektinstanz erzeugt werden muss.
Instanzlose Fachfunktionen greifen daher auch nicht auf die
Daten einer konkreten Objektinstanz zu. Eine instanzgebundene
Fachfunktion hingegen wird immer auf einer konkreten Objektinstanz aufgerufen. Nur instanzgebundene Fachfunktionen können
daher direkt die Daten eines konkreten Objekts manipulieren.
4.1.1
Variablendefinition in ISOM/L
In ISOM/L gibt es keine primitiven Datentypen. Stattdessen
werden alle Daten als Objekte abgebildet. Codeauszug 16 veranschaulicht die Definition von Variablen und die Zuweisung
von Objektinstanzen zu Variablen.
31 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
// Definition ohne Zuweisung
<Typ> <Variablenname>;
// Definition mit gleichzeitiger Zuweisung
<Typ> <Variablenname> = <Ausdruck>;
07 // Zuweisung an eine bereits definierte Variable
08 <Variablenname> = <Ausdruck>;
Codeauszug 16: Variablendefinition und Zuweisung
<Typ> bezeichnet hier grundsätzlich den Namen einer Klasse.
<Ausdruck> ist ein gültiger Ausdruck in ISOM/L. Da es keine
primitiven Datentypen gibt, wird jeder Ausdruck zu einer
Objektinstanz ausgewertet. Diese wird daraufhin im Fall von
Codeauszug 16 dem Bezeichner <Variablenname> zugewiesen.
Gültige Ausdrücke sind Literale (siehe Kapitel 4.2), Variablen
und Funktionsaufrufe. In ISOM/L gibt es keine arithmetischen
oder logischen Ausdrücke. Um die Sprache einfach zu gestalten,
werden alle gängigen Operatoren als Fachfunktionen der entsprechenden Objekte abgebildet. Das ist sinnvoll, da es keine primitiven Datentypen in ISOM/L gibt, sondern nur Objekte.
4.2
Basisobjekte
Eine besondere Rolle spielen die sogenannten Basisobjekte
Boolean, Number und String. Diese ersetzen die entsprechenden
primitiven Datentypen anderer Sprachen. Basisobjekte zeichnen
sich dadurch aus, dass sie durch Zuweisung eines Literals erzeugt werden können. Gültige Literale für Boolean-Objekte sind
die Schlüsselwörter true und false, die die Zustände „wahr“
bzw. „falsch“ repräsentieren. Gültige Literale für Zeichenketten (Typ String) sind beliebige Texte, die in gerade Anführungszeichen eingeschlossen sind (<text>).
In Zeichenketten sind alle Zeichen außer Textbegrenzungszeichen
(„"“) erlaubt. Längere Zeichenketten können auf mehrere Zeilen
verteilt und mit dem umgekehrten Schrägstrich (\) verkettet
werden. Dieses Zeichen stellt keinen Laufzeitoperator dar, da
die Verkettung der Texte bereits beim Einlesen der Programme
erfolgt.
Numerische Literale sind entweder Dezimal- oder Hexadezimalzahlen. Dezimalzahlen bestehen aus den Ziffern 0 bis 9.
Das Dezimaltrennzeichen ist der Punkt („.“). Einer Ziffernfolge
kann ein Minuszeichen („-“) vorangestellt sein. Dezimalzahlen
32 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
können einen Exponenten enthalten. Dieser wird an die Grundzahl
angehängt. Ein Exponent besteht aus einem „e“ (oder „E“), gefolgt von einer Ganzzahl.
Hexadezimalzahlen beginnen mit „0x“, daran schließt sich eine
Folge von Hexadezimalziffern an. Hexadezimalziffern sind 0 bis
9 sowie die Buchstaben a bis f. Die Buchstaben können großoder kleingeschrieben werden.
In Codeauszug 17 sind einige Beispiele für Literale aufgeführt.
Quellcodeauszug
01
02
03
04
05
06
07
Boolean fail = false;
String message = "Bitte Anweisungen beachten";
String veryLongString = "Dies ist ein sehr, sehr, sehr " \
"langes Zeichenkettenliteral.";
Number pi = 3.1415;
Number hexZahl = 0x18af2b;
Number zahlMitExponent = -1.79769313486232E-308;
Codeauszug 17: Beispiele für Literale
4.3
Sonderbehandlung der Klassen Boolean und Number
Generell sind Objekte in ISOM/L Referenztypen. Wenn eine Variable einer anderen zugewiesen wird, stellen nach der Zuweisung
beide Variablen folglich dasselbe Objekt dar. Diese Vorgehensweise hat das sogenannte Aliasing zur Folge: Wird nach einer
Operation auf der einen Variable das Objekt verändert, stellen
anschließend beide Variablen das veränderte Objekt dar.
Dies entspricht nicht dem, was für primitive Datentypen in der
Regel zu erwarten wäre. In den meisten Programmiersprachen sind
primitive Datentypen Werttypen. Bei der Zuweisung von Werttypen
entsteht kein Aliasing, da keine Referenz, sondern der Wert der
ursprünglichen Variablen zugewiesen wird. Das heißt, wenn sich
nach der Zuweisung der Wert einer Variablen verändert,
hat das keine Auswirkung auf die andere Variable.
Um der für primitive Datentypen allgemein üblichen Vorgehensweise (d.h. kein Aliasing) Rechnung zu tragen, werden in ISOM/L
die Typen Boolean und Number in Abweichung von allen anderen
Objekten als Werttypen implementiert. Das bedeutet, dass bei
einer Zuweisung eines Objekts dieser Typen an eine neue Variable zuerst eine Kopie des Objekts erzeugt wird und danach die
Kopie zugewiesen wird.
33 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.4
Fachfunktionen statt Operatoren
In ISOM/L gibt es keine mathematischen oder logischen Operatoren. Diese Funktionalität übernehmen Fachfunktionen der Basisobjekte. Codeauszug 18 zeigt die Verwendung dieser FachfunkFachfunktionen.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Fachfunktionen von Boolean
Boolean b1 = true;
// Werte von: b1
//
true
b2
Boolean b2 = b1.Not ();
//
true
false
Boolean b3 = b1.And (b2);
//
true
false
false
Boolean b4 = b2.Or (b3);
//
true
false
false
// Fachfunktionen von Number
Number n = 1;
// Werte von: n
//
1
m
Number m = n.Add (5);
//
6
Number x = m.Sub (1);
//
Number y = x.Mul (n);
//
Number z = y.Div (m.Add (5));
//
Number n = 1;
//
Number m = n.Clone ().Add (5);
//
Number x = m.Clone ().Sub (1);
//
Number y = x.Clone ().Mul (m);
//
6
5
b3
x
y
b4
false
z
5
30
30
10
3
3
1
6
5
30
Number z = y.Clone ().Div (m.Clone ().Add (4));
//
3
// Fachfunktionen von String
String msg = "Hello ";
String msg2 = msg.Append ("World");
msg2.Append ("!!!");
Boolean test = msg.Equals ("Hello World!!!");
// test == true
Boolean test2 = msg2.Equals ("Hello World!!!");
// test2 == true
String msg = "Hello ";
String msg2 = msg.Clone ().Append ("World");
msg.Append ("1");
msg2.Append (" 2");
Boolean test = msg.Equals ("Hello 1");
// test == true
Boolean test2 = msg2.Equals ("Hello World 2");
// test2 == true
Codeauszug 18: Beispiele für Fachfunktionen der Basisobjekte
Die Fachfunktionen der Klasse Boolean verändern das jeweilige
Objekt nicht. Im Gegensatz dazu haben die Fachfunktionen von
Number und String die Änderung des Objekts selbst zur Folge.
Wenn zum Beispiel eine Zeichenkette mit Append () an eine
Zeichenkette angehängt wird, verändert sich diese Zeichenkette.
Dasselbe gilt für die Fachfunktionen auf den Zahlenobjekten.
34 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Der Rückgabewert der Fachfunktion eines Basisobjekts ist immer
das veränderte Objekt selbst, genauer gesagt, dieselbe Objektinstanz. Im Fall der Zahlenobjekte wird bei der Zuweisung des
Rückgabewerts an eine andere Zahlenvariable automatisch eine
Kopie erzeugt, da Zahlen als Werttypen implementiert sind
(siehe Kapitel 4.3). Bei Zeichenketten referenzieren nach
einer Zuweisung beide Variablen dieselbe Objektinstanz. Im
obigen Beispiel verweisen die Variablen msg und msg2 in
der ersten Gruppe zeichenkettenrelevanter Anweisungen nach
der Zuweisung auf dasselbe Objekt. Die anschließende Änderung
von msg2 verändert daher auch msg.
In der jeweils zweiten Gruppe von Anweisungen im obigen Beispiel wird jeweils vor dem Aufruf einer Fachfunktion auf einem
Zahlen- bzw. Zeichenkettenobjekt eine Kopie des Objekts erzeugt. Dies geschieht mit der Fachfunktion Clone (). Anschließend wird auf der Kopie weitergearbeitet. Dadurch verändert
sich das ursprüngliche Objekt nicht. Der Rückgabewert einer
auf der Kopie aufgerufenen Fachfunktion ist die Kopie, die
durch die Fachfunktion verändert wurde, d.h. eine andere Objektinstanz als das ursprüngliche Objekt.
Die unterschiedlichen Auswirkungen der Aufrufe mit und ohne
Clone () sind in den Kommentaren neben den entsprechenden
Anweisungen in Codeauszug 18 dargestellt.
4.5
Objektbasiert statt objektorientiert
ISOM/L ist eine objektbasierte, aber keine objektorientierte
Sprache. ISOM/L unterstützt, wie bereits beschrieben, die
Kapselung von Variablen, Zuständen und Fachfunktionen innerhalb
der nativ zur Verfügung gestellten Objekte. ISOM/L unterstützt
dagegen keine Vererbung oder Polymorphie.
Ein Programmierer kann in seinen Programmen die von ISOM bereitgestellten Klassen und die Objektinstanzen, die aus diesen
Klassen erzeugt werden, verwenden. Er kann aber selbst keine
neuen Klassen definieren, aus denen neue Objektinstanzen erzeugt werden könnten. Das Objektmodell von ISOM ist daher aus
Sicht des ISOM/L- Programmierers abgeschlossen.
Alle von ISOM zur Verfügung gestellten Klassen sind in [2]
zusammengefasst.
35 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.5.1
Klassen, Namensräume und Funktionen
Der Programmierer kann statt neuer Klassen neue Namensräume
definieren. Ein Namensraum ist eine Sammlung von Funktionen,
die fachlich zusammengehören. Er ist vergleichbar mit einer
Klasse, die nur instanzlose Fachfunktionen enthält – mit dem
Unterschied, dass die Fachfunktionen einer Klasse nativ in ISOM
definiert sind und nicht vom Programmierer beeinflusst werden
können. Im Gegensatz dazu werden die Funktionen eines Namensraums vom Programmierer in ISOM/L definiert.
Die ISOM-Laufzeitumgebung verwaltet Klassen intern ebenfalls
als Namensräume. Dies bedeutet für ISOM/L, dass Bezeichner von
Klassen wie Namensraumbezeichner behandelt werden. Außerdem
werden instanzlose Fachfunktionen von Klassen auf die gleiche
Weise aufgerufen wie Funktionen, die in Namensräumen definiert
sind.
4.5.2
Funktionsdefinitionen
Eine Funktionsdefinition besteht aus dem Typbezeichner, der
den Rückgabetyp darstellt, gefolgt vom Namen der Funktion.
Dem folgt eine Parameterdeklarationsliste (in runden Klammern
„()“, durch Komma getrennt) sowie eine Anweisung, die entweder
einzeln oder als Block zusammengefasst sein kann. Eine Parameterdeklaration besteht aus einem Typbezeichner, gefolgt von
einem Parameternamen. Zusammengefasst bezeichnet man dies als
Signatur der Funktion.
Die Typbezeichner für den Rückgabetyp und die Parametertypen
müssen von ISOM bereitgestellten Klassen entsprechen. Ein Namensraum, der von einem Programmierer definiert wurde, ist als
Rückgabe- oder Parametertyp nicht zulässig. Dies ist sinnvoll,
da einzig von Klassen Objektinstanzen abgeleitet werden können,
die wiederum Variablen zugewiesen werden können. Ein vom Programmierer definierter Namensraum als Rückgabetyp oder als
Parameter wäre daher unsinnig.
Auf den als Parameter übergebenen Objekten können innerhalb
einer Funktion Fachfunktionen aufgerufen werden, die das Objekt
verändern können. Das Objekt bleibt in diesem Fall auch nach
der Rückkehr der Funktion verändert. Zuweisungen an die Parameter-Variablen sind hingegen innerhalb einer Funktion nicht
zulässig. Codeauszug 19 verdeutlicht das Verhalten.
36 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* ISOM/L-Beispielprogramm: ParameterPassing.is
* Parameterübergabe in ISOM/L
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace ParameterPassing
{
Boolean Modify(String str)
{
str.Append(", modifiziert");
String msg = "Inhalt der Zeichenkette innerhalb von 'Modify()': ";
msg.Append(str);
System.Stdout(msg);
return true;
}
Boolean main ()
{
String text = "Text";
String preMsg = "Inhalt der Zeichenkette vor 'Modify()': ";
preMsg.Append(text);
System.Stdout(preMsg);
Modify(text);
String postMsg = "Inhalt der Zeichenkette nach 'Modify()': ";
postMsg.Append(text);
System.Stdout(postMsg);
return true;
}
}
Codeauszug 19: ParameterPassing.is
37 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
* unzulässige Zuweisung an Parametervariablen
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace ParameterPassingError
{
/* NICHT ZULÄSSIG: Zuweisung an Parametervariablen
* Diese Funktion verursacht eine Fehlermeldung des ISOM-Interpreters.
*/
Boolean Assign(String str)
{
str = "zugewiesener Text";
String msg = "Inhalt der Zeichenkette innerhalb von 'Assign()': ";
msg.Append(str);
System.Stdout(msg);
return true;
}
Boolean main ()
{
String text = "Text";
String preMsg = "Inhalt der Zeichenkette vor 'Modify()': ";
preMsg.Append(text);
System.Stdout(preMsg);
Assign(text);
String postMsg = "Inhalt der Zeichenkette nach 'Modify()': ";
postMsg.Append(text);
System.Stdout(postMsg);
return true;
}
}
Codeauszug 20: Unzulässige Zuweisung an Parametervariablen
Mit dem Schlüsselwort return wird die Funktion verlassen und
der Rückgabewert zurückgeliefert. Codeauszug 21 veranschaulicht
an einem Beispiel, wie ein Namensraum mit Funktionen definiert
wird.
38 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 namespace Test
02 {
03
Number double (Number n)
04
{
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23 }
// Erzeuge Kopie durch
// Zuweisung (da Typ Number)
Number ntemp = n;
return ntemp.Mul (2);
}
Number treble (Number n)
{
// Erzeuge Kopie direkt
return n.Clone ().Mul (3);
}
Boolean addFive (Number n)
{
// Verändere Objekt selbst
n.Add (5)
return true;
}
Codeauszug 21: Beispiel für einen Namensraum mit Funktionen
4.6
Fachfunktionen von Objekten
ISOM-Objekte enthalten Daten und Fachfunktionen. Die in den
Objekten enthaltenen Daten sind gekapselt. Der Programmierer
hat über ISOM/L-Programme keinen direkten Zugriff auf die in
den Objekten enthaltenen Daten. Die Bereitstellung der Klassen
und Objekte und deren interne Implementierung sind Aufgabe der
ISOM-Laufzeitumgebung und für den ISOM/L-Programmierer transparent.
Die Fachfunktionen, die in ISOM-Objekten enthalten sind, können
vom Programmierer hingegen in ISOM/L-Programmen verwendet werden. Diese Fachfunktionen sind überwiegend instanzgebunden,
d.h. sie beziehen sich auf eine konkrete Instanz des Objekts.
Es gibt allerdings auch instanzlose Fachfunktionen in Klassen.
39 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.7
Grundlegendes zum ISOM-Objektmodell
In ISOM/L gibt es keine direkt in die Sprache integrierte
Möglichkeit, neue Objektinstanzen zu erzeugen. Es gibt weder
ein Schlüsselwort new noch Konstruktoren, wie sie aus den gängigen objektorientierten Sprachen bekannt sind. Neue Objektinstanzen werden in ISOM grundsätzlich intern erzeugt, d.h. nicht
als Bestandteil der Sprache ISOM/L. Die von ISOM bereitgestellten Klassen bieten instanzlose Fachfunktionen, die dem ISOM/LProgrammierer bei Bedarf die intern erzeugten Objektinstanzen
zurückliefern.
Fachfunktionen mit dem Namen GetInstance beziehen sich auf Objekte, von denen es im ISOM-Objektmodell nur eine Instanz gibt
(sogenannte Singletons), zum Beispiel der Ist-Fahrzeugkontext.
Die Fachfunktion GetInstance () liefert die (einzige) Instanz
des betreffenden Objekts zurück.
Klassen, von denen es mehrere Objektinstanzen geben kann, haben
typischerweise eine Fabrikmethode, deren Name mit Create beginnt. Diese Methode erzeugt ein neues Objekt dieser Klasse und
liefert es zurück. Ein Beispiel für eine Create-Methode ist die
Fachfunktion zum Erzeugen eines neuen Wörterbuchs, die von der
Wörterbuch-Klasse bereitgestellt wird. Codeauszug 22 zeigt die
Beispiele.
Quellcodeauszug
01 using Isom.Context.*;
02 using Isom.Base.*;
03
04
05
06
07
08
09
10
11
// ...
// Fachobjekt für Umgebungseinstellungen wird zurückgeliefert
// (siehe auch "IfElseEnv.is")
Environment env = Environment.GetInstance();
// Neues Wörterbuch von Zeichenketten wird erzeugt
StringDictionary strDict = StringDictionary.CreateStringDictionary();
Codeauszug 22: Fachfunktionen Objekterzeugung/-bereitstellung
Nicht mehr referenzierte Objektinstanzen werden automatisch
aus dem Speicher entfernt. Eine explizite Speicherfreigabe
durch den ISOM/L-Programmierer ist nicht notwendig.
40 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.8
Das Void-Objekt
Für die Fehlerbehandlung steht in ISOM/L das sogenannte VoidObjekt zur Verfügung, d.h. ein „leeres Objekt“. Ein Objekt, ungeachtet welchen Typs, wird beim Auftreten einer unerwarteten
Ausnahme innerhalb einer seiner Fachfunktionen zu einem VoidObjekt. Wird eine Fachfunktion eines Void-Objekts aufgerufen,
wird die Fachfunktion nicht abgearbeitet, sondern wiederum ein
Void-Objekt zurückgeliefert.
Durch dieses Vorgehen erreicht ISOM eine hohe Robustheit zur
Laufzeit. Unerwartete Ausnahmen führen nicht zum Abbruch des
Programms, sondern lediglich zur Weiterreichung von VoidObjekten. Es obliegt dem Programmierer, zu prüfen, ob ein
Void-Objekt erzeugt wurde, und ggf. angemessene Fehlerbehandlungsmaßnahmen zu treffen, wo er dies für nötig erachtet.
Zur Prüfung, ob ein Void-Objekt vorliegt, kann die Fachfunktion
IsVoid() verwendet werden, die in allen ISOM/L-Klassen enthalten ist, aus denen Objektinstanzen erzeugt werden können. Diese
Fachfunktion liefert immer einen booleschen Wert zurück: true,
wenn das Objekt ein Void-Objekt ist, anderenfalls false.
Dem Programmierer steht außerdem eine Void()-Fachfunktion zur
Verfügung. Damit ist es möglich, ein Void-Objekt zu erzeugen.
Dieses kann zum Beispiel für Rückgabewerte von Funktionen verwendet werden.
4.8.1
Ungültig-Machen von Objektinstanzen: Fachfunktion Void ()
In manchen Fällen kann es für den Programmierer sinnvoll sein,
einer Variablen selbsttätig das Void-Objekt zuzuweisen, insbesondere, wenn die Variable als Rückgabewert einer Funktion
verwendet wird.
Alle Typen der ISOM/L-Bibliothek für Serviceautoren (IBS) [2],
die über eine Fachfunktion IsVoid verfügen, enthalten ebenfalls
eine instanzlose Fachfunktion Void (). Sie liefert das Void-Objekt zurück, das wiederum einer Variablen des Typs zugewiesen
werden kann.
41 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 String GetAddressForAction(String actionName)
02 {
03
String retVal = String.Void(); // mit "Void"-Objekt initialisieren
04
switch (actionName)
05
{
06
case "Output":
// wenn übergebener Name "Output" ist,
07
retVal = "42"; // Rückgabewert auf "42" setzen
08
default:
// ansonsten nichts tun,
09
;
// d.h. retVal bleibt "Void"
10
}
11
return retVal;
// retVal zurückgeben
12 }
Codeauszug 23: Ungültig-Machen von Objektinstanzen mit Void()
Die Semantikprüfung des ISOM-Interpreters verbietet die
Zuweisung der Rückgabe eines Aufrufs der instanzlosen Void()Fachfunktion eines Typs „A“ für einen weiteren Typ „B“, wie
Codeauszug 24 zeigt. Deswegen ist Void kein Schlüsselwort
der Sprache.
Quellcodeauszug
01 String retVal = Boolean.Void(); // Semantikfehler!
Codeauszug 24: Fehlerhafte Verwendung von Void()
42 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.8.2
Spezielle Fachfunktion der Klasse Boolean: Failed
Eine Besonderheit stellt die Fachfunktion Failed der Klasse
Isom.Base.Boolean dar. Diese Fachfunktion liefert nur true
zurück, wenn das betreffende Boolean-Objekt false oder das
Void-Objekt ist; anderenfalls liefert Failed false zurück.
Die Fachfunktion Failed ist für den Einsatz bei der Fehlerbehandlung vorgesehen. Viele fachliche Funktionen haben per
Konvention einen Rückgabewert vom Typ Isom.Base.Boolean; dabei
wird im Erfolgsfall true und im Fehlerfall false zurückgeliefert. Durch einen Aufruf von Failed auf dem Rückgabewert können
in einem solchen Fall sowohl Fehler, die die Fachfunktion
selbst erkennt (Rückgabewert false), als auch unerwartete
Ausnahmen (Rückgabe des Void-Objekts) abgefangen werden.
Codeauszug 25 zeigt den Einsatz der Funktion Failed zur Fehlerbehandlung.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
Boolean valFalse = false;
Boolean valVoid = Boolean.Void();
if (valFalse.Failed ())
{
// wird zu "true" ausgewertet,
// da valFalse "false" ist
// Fehlerbehandlung
...
}
if (valVoid.Failed ())
{
// Fehlerbehandlung
...
}
// wird zu "true" ausgewertet,
// da valVoid "Void" ist
Codeauszug 25: Fehlerbehandlung mit Boolean.Failed
4.8.3
Fortpflanzung von Void
Die meisten Fachfunktionen von ISOM/L-Objekten, die Eingabeparameter erwarten, kehren mit dem Void-Objekt als Rückgabewert
zurück, falls der oder die Eingabeparameter ebenfalls das VoidObjekt sind. (Das Verhalten der einzelnen Fachfunktionen ist in
der Dokumentation der ISOM/L-Bibliothek für Fachautoren [2] beschrieben.)
Wird zum Beispiel der Fachfunktion Stdout der Klasse System
(Namensraum Isom.Base, siehe auch Kapitel 2.1.6 und 6), die die
43 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
als Parameter übergebene Zeichenkette nebst einem zusätzlichen
Zeilenumbruch auf dem Standardausgabestrom ausgibt, mit dem
Void-Objekt als Parameter aufgerufen, unterbleibt die Ausgabe
auf dem Standardausgabestrom vollständig. (In diesem Fall wird
auch kein zusätzlicher Zeilenumbruch ausgegeben.)
In ISOM/L-Programmen werden oftmals Fachfunktionsaufrufe verkettet, sodass Variablen, die Rückgabewerte früherer Funktionsaufrufe enthalten, als Eingabeparameter für nachfolgende
dienen. Liefern diese Funktionsaufrufe ein Void-Objekt zurück,
ist dieses Verhalten zu beachten. Codeauszug 26 zeigt ein Beispiel dazu, das drei Aufrufe der zuvor erwähnten Fachfunktion
Stdout der Klasse System enthält.
44 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/*
* ISOM/L-Beispielprogramm: CheckVoid.is
* Verkettung von Void-Rückgabewerten
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace HelloWorld
{
Boolean main()
{
String msg = "Hello, "; // 'msg' definieren
String name = String.Void(); // 'name' invalidieren
16
17
18
19
20
21
22
23
24
// 1. Aufruf von 'System.Stdout'
System.Stdout(msg); // 'msg' ausgeben
25
26
27
28
29
30
31
32
33
34
35
// 3. Aufruf von 'System.Stdout'
System.Stdout(msg); // 'msg' nochmals ausgeben
return true;
// 2. Aufruf von 'System.Stdout'
// 'name' an 'msg' anhängen:
// Anhängen von "Void" liefert "Void" als Rückgabewert;
// Ausgabe von "Void" auf Stdout tut nichts
System.Stdout(msg.Append(name));
}
}
Ausgabe:
Hello,
Hello,
Codeauszug 26: CheckVoid.is und Ausgabe
Das Ergebnis der Ausführung dieses Programms sind zwei (!)
Zeilen auf der Standardausgabe, jeweils mit dem Inhalt
Hello,. Der zweite von drei Aufrufen der Fachfunktion Stdout
erhält als Eingabeparameter das Void-Objekt und kehrt daher
sofort (ebenfalls mit Void als Rückgabewert, hier nicht weiter
betrachtet) zurück, ohne eine Zeile auf der Standardausgabe
auszugeben. Zusätzlich zu beachten ist, dass der Inhalt der
Variablen msg durch das (notwendigerweise fehlgeschlagene) Anhängen des Void-Objekts nicht verändert wird, wie die zweite
Ausgabe (der dritte Aufruf von System.Stdout) der Zeichenkette
zeigt.
45 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.9
Containerklassen
Mehrere ISOM-Objektinstanzen können in einem Containerobjekt
zusammengefasst werden. Containerklassen in ISOM/L sind
Listen und Wörterbücher. Typnamen von Listen enden auf
…List (z.B. NumberList), Typnamen von Wörterbüchern auf
…Dictionary (z.B. StringDictionary). Wenn für eine Klasse
eine Containerklasse existiert, ist diese stets in demselben
Namensraum definiert (z.B. String und StringList im Namensraum
Isom.Base).
Nachfolgend wird der grundlegende Umgang mit beiden Typen von
Containerklassen beschrieben. Konkrete Containerklassen können,
abhängig vom enthaltenen Typ, weitere Komfortfunktionen anbieten, über die eine andere konkrete Containerklasse nicht verfügt.
4.9.1
Listen
Eine ISOM/L-Liste enthält eine geordnete Folge von Objektinstanzen desselben Typs („Elemente“). Ein Element kann
mehrfach in derselben Liste enthalten sein.
Elemente werden mit der Fachfunktion Insert() an das Ende der
Liste angefügt.
Es gibt grundsätzlich zwei Möglichkeiten, auf Elemente einer
Liste zuzugreifen:

Zugriff auf das Element an einer bestimmten Position in
der Folge mit der Fachfunktion At()

Iterieren über alle Elemente einer Liste mithilfe einer
Schleife und der Fachfunktionen HasNext() und Next()
Vor dem ersten Schleifendurchlauf sollte zudem die Fachfunktion Reset() aufgerufen werden.
Reset() setzt die Position des internen Iterators vor
den Listenanfang zurück.
HasNext() bestimmt, ob die Liste noch mindestens ein
weiteres Element hinter der aktuellen Iteratorposition
enthält.
Next() liefert dieses Element.
Codeauszug 27 zeigt die Verwendung einer Liste von Zahlen.
46 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
/*
* ISOM/L-Beispielprogramm: ExNumberList.is
* Liste von Zahlen
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace ExNumberList
{
Boolean main ()
{
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 }
// Liste erzeugen
NumberList list = NumberList.CreateNumberList();
// Liste mit Elementen befüllen
list.Insert(3);
list.Insert(42);
list.Insert(3);
list.Insert(-71);
list.Insert(100.1);
// Länge der Liste ermitteln und ausgeben
String msg = "Die Liste enthält $length Elemente:";
Number length = list.Length();
msg.Replace("$length", length.ToIntString());
System.Stdout(msg);
// Über Liste iterieren und alle Elemente ausgeben
list.Reset(); // internen Iterator zurücksetzen
while(list.HasNext()) /* solange noch nicht alle
Elemente betrachtet wurden... */
{
Number elem = list.Next(); // nächstes Element abrufen
System.Stdout(elem.ToFloatString());// Fließkommadarstellung
}
return true;
}
Codeauszug 27: ExNumberList.is
47 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Hinweis:
die Verwendung des „$“-Symbols am Anfang von Platzhaltern bei der
Ersetzung von Zeichenketten mit Replace() ist frei gewählt und
dient nur zur besseren Lesbarkeit des Quelltexts. Es könnte jede
andere Zeichenkette ersetzt werden.
4.9.2
Wörterbücher
Ein ISOM/L-Wörterbuch besteht aus einer Menge eindeutiger
Schlüssel des Typs String und einer Menge von Werten eines
Typs, wobei einem Schlüssel genau ein Wert zugeordnet ist.
Ein UriDictionary bildet daher Schlüssel vom Typ String
auf Werte vom Typ Uri ab.
Ein Schlüssel-Wert-Paar wird mit der Fachfunktion
Add(String key, <Typname> value) zu einem Wörterbuch hinzugefügt. Existiert der Schlüssel noch nicht im Wörterbuch, wird
ein neuer Eintrag angelegt. Existiert er bereits, wird der
Wert, der ihm zugeordnet ist, mit dem neuen Wert überschrieben.
Ein Wert, der in einem Wörterbuch hinterlegt ist, kann
über seinen eindeutigen Schlüssel mit der Fachfunktion
Get(String key) abgerufen werden. Existiert dieser
Schlüssel nicht, wird das Void-Objekt zurückgegeben.
Um über alle Einträge in einem Wörterbuch zu iterieren, kann
GetKeys () die Liste aller Schlüssel (Typ StringList) ermitteln. Danach kann er, wie in Kapitel 4.9.1 beschrieben, über
alle Schlüssel in der Liste iterieren und für jeden Schlüssel
mit Get(String key) den zugehörigen Wert abrufen.
Codeauszug 28 zeigt ein Beispiel für die Verwendung eines
Wörterbuchs von Zeichenketten.
48 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* ISOM/L-Beispielprogramm: ExStringDictionary.is
* Wörterbuch von Zeichenketten
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace ExStringDictionary
{
Boolean main ()
{
// Wörterbuch erzeugen
StringDictionary dict = StringDictionary.CreateStringDictionary();
// Wörterbuch mit Schlüssel-Wert-Paaren befüllen
dict.Add("Frankreich", "Paris");
dict.Add("Deutschland", "Berlin");
dict.Add("Australien", "Canberra");
// Anzahl der Schlüssel-Wert-Paare ermitteln und ausgeben
String msg = "Das Wörterbuch enthält $count Schlüssel-Wert-Paare:";
Number count = dict.Count();
msg.Replace("$count", count.ToIntString());
System.Stdout(msg);
// Über Liste von Schlüsseln iterieren und alle Paare ausgeben
StringList keyList = dict.GetKeys();
keyList.Reset(); // internen Iterator zurücksetzen
while(keyList.HasNext()) /* solange noch nicht alle
* Elemente betrachtet wurden... */
{
String key = keyList.Next(); // nächsten Schlüssel abrufen
String value = dict.Get(key);
msg = "Die Hauptstadt von $key ist $value";
msg.Replace("$key", key);
msg.Replace("$value", value);
System.Stdout(msg);
}
return true;
}
}
Codeauszug 28: ExStringDictionary.is
49 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.10
Globale Variablen
In ISOM/L können sogenannte globale Variablen definiert werden,
die während einer Interpretersitzung aus allen Funktionen heraus abgerufen und manipuliert werden können.
Eine globale Variable kann entweder vom Typ Number oder
vom Typ String oder StringList sein. Sie wird durch eine Zeichenkette eindeutig bezeichnet. Die vorgenannten Klassen verfügen jeweils über folgende Fachfunktionen für globale Variablen:

AddGlobal(String, <Number oder String>) erzeugt eine neue
globale Variable mit dem übergebenen Bezeichner und Wert.
Existiert bereits eine globale Variable mit diesem Bezeichner, wird der vorherige Wert ersetzt.

GetGlobal(String) ruft den Wert der globalen Variablen mit
dem übergebenen Bezeichner ab. Existiert kein solcher Bezeichner, wird das Void-Objekt zurückgegeben, anderenfalls
eine Kopie des Variablenwerts. Änderungen an diesem Wert
ändern den Wert der globalen Variable nicht (siehe auch
Kapitel 4.2 ff.)! Um Änderungen an der globale
Variable zu übernehmen, muss der geänderte Wert mit
AddGlobal() wieder gesichert werden.

RemoveGlobal(String) löscht die globale Variable mit
dem übergebenen Bezeichner. Die Fachfunktion gibt genau
dann true zurück, wenn eine globale Variable mit diesem
Bezeichner existierte und entfernt werden konnte.

GetExistingGlobals() schließlich liefert eine Liste
von Zeichenketten, die alle bekannten Bezeichner globaler
Variablen des Typs enthält, für den die Fachfunktion aufgerufen wurde.
Die Klasse StringList verfügt zudem über die Fachfunktion
AddStringToGlobalList(), die eine Zeichenkette zu einer
in einer globalen Variablen gesicherten Zeichenkettenliste
hinzufügt [2].
50 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
4.11
ISOM/L-Bibliothek für Fachautoren
Alle Klassen und Namensräume des ISOM-Objektmodells sind in [2]
beschrieben. Das vorliegende Handbuch beschränkt sich auf die
Klassen aus folgenden Namensräumen:
4.12

Isom.Base.*

Isom.Sys.*

Isom.Request.*
Erweiterung der Klassen des ISOM-Objektmodells
Die Klassen des ISOM-Objektmodells lassen sich in ISOM/L durch
neue Fachfunktionen ergänzen. Bereits bestehende Fachfunktionen
können überschrieben werden. Wird eine Fachfunktion überschrieben, muss die Fachfunktion, die sie überschreibt, die gleiche
Funktionssignatur aufweisen, wie die Original-Fachfunktion, die
überschrieben wird.
Die neuen Fachfunktionen werden in einer ISOM/L-Quelldatei
implementiert, in der kein Namensraum, sondern eine Erweiterung
definiert wird. Eine Erweiterung wird durch das Schlüsselwort
extension eingeleitet. Dateien, die eine Erweiterung enthalten,
werden im anwenderspezifischen Verzeichnis
\<OEM>\ISOM\isoml abgelegt. Der Name der Erweiterung setzt sich
aus dem Namen des OEM und dem Namensraumbezeichner der erweiterten Klasse zusammen. Codeauszug 29 zeigt eine beispielhafte
Erweiterung der Klasse Isom.Base.String.
Erweiterungen erlauben die Definition instanzloser und instanzgebundener Fachfunktionen. Sie werden durch das Schlüsselwort
objectbound unterschieden:

Wird objectbound angegeben, benötigt der Aufruf der Fachfunktion eine Objektinstanz. Diese Objektinstanz ist in
der Implementierung der Fachfunktion durch das Schlüsselwort this verfügbar.

Ohne objectbound ist die Fachfunktion instanzlos und kann
ohne Objektinstanz aufgerufen werden. In instanzlosen
Fachfunktionen kann this daher nicht benutzt werden.
Wird eine Fachfunktion überschrieben, kann die originale Fachfunktion auch weiterhin verwendet werden. Dazu ruft man die
51 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Funktion mit dem Schlüsselwort base auf. Dies ist auch innerhalb der überschreibenden Fachfunktion möglich.
Quellcodeauszug
01 using Isom.Base.*;
02 using Isom.Sys.*;
03
04 // Erweiterung der Klasse "Isom.Base.String"
05 extension Didact.Isom.Base.String
06 {
07
08
09
10
11
12
13
14
15
// Erweiterung mit einer neuen instanzgebundenen Fachfunktion
objectbound Boolean StartsWith(String startString)
{
Number length = startString.Length();
16
17
18
19
20
21
22
23
// Erweiterung mit einer neuen instanzlosen Fachfunktion
String GetSpaces(Number count)
{
String result = "";
Number index = count;
// Beenden der Schleife, sobald "index" gleich 0
while(index.Gt(0))
{
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Zugriff auf "this" zum Vergleich mit dem Übergabeparameter
return this.Substring(0, length).Equals(startString);
}
// Anhängen eines Leerzeichens
result = result.Append(" ");
// Erniedrigen des Index um 1
index = index.Sub(1);
}
return result;
}
// Überschreiben einer instanzgebundenen Fachfunktion,
// die in der Basisklasse "Isom.Base.String" bereits definiert ist
objectbound Number ParseNumber()
{
// Ersetzen von Kommas durch Punkte, z.B. wird "1,5" zu "1.5"
// Zugriff auf "this"
String formatted = this.Replace(",", ".");
// Aufruf der Original-Fachfunktion mit "base"
return formatted.base.ParseNumber();
}
// Überschreiben einer instanzlosen Fachfunktion,
// die in der Basisklasse "Isom.Base.String" bereits definiert ist
Boolean AddGlobal(String key, String value)
{
52 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
47
48
49
50
String msg = "Hinzugefügt: Variable ";
msg.Append(key);
// Ausgabe auf der Kommandozeile
System.Stdout(msg);
51
52
53
54 }
// Aufruf der Original-Fachfunktion mit "base"
return base.AddGlobal(key, value);
}
Codeauszug 29: Erweiterung von Isom.Base.String
53 von 109
4 Grundlagen des ISOM/L-Objektmodells
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
5
Strukturierung von ISOM/L-Programmen
ISOM/L-Programme sind Textdateien im Freiformat. Es wird
empfohlen, als Zeichencodierung UTF-8 zu verwenden. Ihre Dateierweiterung lautet .is.
Achtung:
Ein ISOM/L-Programm muss sich in einem Verzeichnis befinden, das
dem Namensraum entspricht, der im Programm definiert ist, relativ
zum korrekten ISOM/L-Klassenverzeichnis (siehe Kapitel 5.1), wenn
der Namensraum von anderen Namensräumen aus referenzierbar sein
soll. Ein Programm, dessen main-Funktion im ISOM-Kommandozeilenmodus (siehe Kapitel 8.1) aufgerufen werden soll, kann sich an
einem beliebigen Ort befinden.
Eine gültige ISOM/L-Programmdatei besteht aus:

einer beliebigen Anzahl (auch null möglich) von usingAnweisungen,

gefolgt von beliebig vielen anonymen Namensräumen,

gefolgt von höchstens einer Namensraumdefinition
Codeauszug 30 zeigt ein Beispiel eines vollständigen ISOM/LProgramms.
54 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* ISOM/L-Beispielprogramm: Fibonacci.is
* Berechnung der Fibonacci-Folge von 0 bis 10
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace Fibonacci
{
deftext MESSAGE MSG_FIBO "Die Fibonacci-Folge von 0 bis 10 lautet: "
// Berechnet die n-te Fibonacci-Zahl
Number Fibo (Number n)
{
if (n.Eq (0))
return 0;
if (n.Eq (1))
return 1;
Number
Number
Number
Number
return
n1 = n.Sub (1);
n2 = n.Sub (1);
a = Fibo (n1);
b = Fibo (n2);
a.Add (b);
}
Boolean main ()
{
String msg = MSG_FIBO;
String sep = ", ";
Number index = 0;
while (index.Lt (10))
{
Number num = index;
msg.Append (Fibo (num).ToIntString ());
msg.Append (sep);
index.Add (1);
}
msg.Append (Fibo (index).ToIntString ());
System.Stdout (msg);
return true;
}
}
Codeauszug 30: Fibonacci.is
55 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Hinweis:
ISOM unterstützt die Zeichencodierungen UTF-8 und ISO-8859-1 ohne
Bytereihenfolgenmarkierung sowie UTF-8 und UTF-16 mit Bytereihenfolgenmarkierung. Der Präprozessor konvertiert Quelldateien mit
anderen Zeichencodierungen als UTF-8 intern vor der weiteren
Verarbeitung in UTF-8, so dass eine Mischung von Quelldateien
verschiedener Zeichenkodierungen unterstützt wird. Wird jedoch
versucht, andere Zeichenkodierungen zu verwenden, zum Beispiel
Windows-1252, erfolgt die Umwandlung unter der inkorrekten Annahme, es würden Quellen in ISO-8859-1 vorliegen. Dies kann zu
beschädigten Zeichen führen.
5.1
Hierarchische Struktur von Namensräumen
Namensraumbezeichner sind hierarchisch strukturiert. Die
einzelnen Teile werden durch Punkte („.“) voneinander getrennt.
Codeauszug 31 zeigt Beispiele für zulässige Namensraumbezeichner.
Quellcodeauszug
01
02
03
04
Isom.Base.Number
Isom.Global.Processes
Oem.G42.D_ACC
Test
Codeauszug 31: Beispiele für gültige Namensraumbezeichner
Der letzte Teil eines Namensraumbezeichners stellt den Typnamen
dar. Der Teil des Namensraumbezeichners vor dem Typnamen (und
ohne den Punkt vor dem Typnamen) wird Grundraumbezeichner genannt. Der gesamte Namensraumbezeichner wird auch als „vollqualifizierter Typname“ bezeichnet.
Die Namensraumbezeichner müssen der Datei- und Verzeichnisstruktur der ISOM/L-Programme entsprechen. Jeder Namensraum
muss in einer eigenen Quelldatei abgelegt sein. Um ein bestimmtes Programm zu finden, verfährt die ISOM-Laufzeitumgebung wie
folgt: Zuerst wird nach einem Verzeichnis gesucht, das dem
vollqualifizierten Typnamen entspricht. In diesem Verzeichnis
wird das eigentliche Programm gesucht. Der Name der Datei entspricht dem Typnamen, ergänzt durch die Erweiterung .is. Sollte
es diese Datei nicht geben, wird im Verzeichnis, das dem Grundraumbezeichner entspricht, nach der Datei gesucht. Auch in diesem Fall muss der Dateiname dem Typnamen mit angehängtem .is
entsprechen. Jedes Programm kann nur einen einzigen nicht-anonymen Namensraum enthalten. Die Verzeichnisstrukturen sind relativ zum Wurzelverzeichnis der ISOM/L-Programme. Abbildung 2
visualisiert den Suchalgorithmus als Flussdiagramm.
56 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 2: Finden von Programmen
5.2
Die Importanweisung
Innerhalb von selbst definierten Funktionen können auch Funktionen und Textdefinitionen anderer Namensräume verwendet werden. Das Gleiche gilt für Objektinstanzen von Klassen, die von
ISOM bereitgestellt werden. Dabei gibt es zwei Möglichkeiten:
Generell können alle Typen immer verwendet werden, indem ihr
vollqualifizierter Typname als Typbezeichner verwendet wird.
Alternativ kann der Programmierer auch mit dem Schlüsselwort
using den Import anderer Typen anweisen.
57 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Vor der Definition eines Namensraums können beliebig viele
Importanweisungen stehen. Diese bestehen aus dem Schlüsselwort
using, gefolgt vom vollqualifizierten Typnamen des zu importierenden Typs und einem Semikolon („;“). Der zu importierende
Typ kann sowohl eine von ISOM/L bereitgestellte Klasse als
auch ein von einem Programmierer definierter Namensraum sein.
Anstelle des Typnamens kann auch ein „*“ stehen. In diesem Fall
werden alle Typen mit dem entsprechenden Grundraumbezeichner
importiert. Codeauszug 32 zeigt einige Beispiele für Importanweisungen.
Quellcodeauszug
01
02
03
04
using
using
using
using
Isom.Base.Boolean;
Isom.Base.String;
Isom.Base.Number;
Isom.Sys.*;
Codeauszug 32: Beispiele für Importanweisungen
Zur Verwendung der importierten Typen ist der einfache Typname
als Typbezeichner ausreichend, wenn Verwechslungen ausgeschlossen sind. Dies ist nicht der Fall, wenn mehrere Typen mit unterschiedlichen Grundraumbezeichnern, aber demselben Typnamen
importiert worden sind. In diesem Fall muss trotz vorangegangener using-Anweisung der vollqualifizierte Typname als
Typbezeichner verwendet werden.
Zur Verwendung von Funktionen und Textbezeichnern, die in anderen Namensräumen deklariert sind, muss immer der betreffende
Typname, gefolgt von einem Punkt („.“), der jeweiligen Funktion
bzw. dem Textbezeichner vorangestellt werden. Das Gleiche gilt
für den Aufruf instanzloser Fachfunktionen einer Klasse. Wie
oben beschrieben, kann der vorangestellte Typname entweder der
vollqualifizierte Typname oder, wenn der betreffende Namensraum
importiert wurde und Verwechslungen ausgeschlossen sind, der
Grundraumbezeichner sein. Die Verwendung fremder Funktionen
oder Textbezeichner ohne vorangestellten Typnamen ist nicht
zulässig, da ISOM in diesem Fall die Funktion bzw. den Textbezeichner im eigenen Namensraum suchen würde.
5.3
Übersetzbare Texte und Textdefinitionen
ISOM/L bietet die Möglichkeit, Bezeichner für übersetzbare
Texte zu definieren. Diese Textbezeichner können anschließend
in ISOM/L-Programmen anstelle von Zeichenkettenliteralen verwendet werden. Der Begriff „übersetzbar“ bedeutet hier, dass
ISOM beim Verarbeiten der Programme eine Liste erstellt, die
58 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
sämtliche definierten Textbezeichner mit den zugehörigen Texten
enthält. Ein geeignetes Werkzeug kann daraufhin alle Texte extrahieren und bisher unbekannte Texte zur Übersetzung in alle
verwendeten Sprachen anweisen.
Jedem Textbezeichner wird eine Kategorie zugewiesen, abhängig
davon, in welchem Kontext der betreffende Text innerhalb des
Programms verwendet werden soll. Die zulässigen Kategorien kann
der Programmierer in der Datei TextCategoryData.xml festlegen,
die sich im OEM-spezifischen Verzeichnis \<OEM>\ISOM\isoml
befindet. Codeauszug 33 zeigt den Aufbau dieser Datei.
Quellcodeauszug
01 <?xml version="1.0" encoding="utf-8" ?>
02 <TextCategoryData
03
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
04
xsi:noNamespaceSchemaLocation="TextCategoryData.xsd">
05
<TextCategory>INTERNAL</TextCategory>
06
<TextCategory>ACTION</TextCategory>
07
<TextCategory>ECU</TextCategory>
08
<TextCategory>PROGRESS</TextCategory>
09
<TextCategory>REPORT</TextCategory>
10
<TextCategory>TITLE</TextCategory>
11
<TextCategory>MESSAGE</TextCategory>
12
<TextCategory>HINT</TextCategory>
13
<TextCategory>OPTION</TextCategory>
14
<TextCategory>BUTTON</TextCategory>
15
<TextCategory>ACK_BUTTON</TextCategory>
16
<TextCategory>CONT_BUTTON</TextCategory>
17
<TextCategory>CONT_ACK_BUTTON</TextCategory>
18
<TextCategory>BACK_BUTTON</TextCategory>
19
<TextCategory>BACK_ACK_BUTTON</TextCategory>
20
<TextCategory>ERRORTEXT</TextCategory>
21 </TextCategoryData>
Codeauszug 33: Beispiel für Datei TextCategoryData.xml
Textdefinitionen sind Bestandteil eines Namensraums und werden
am Anfang des Namensraums vor den Funktionsdefinitionen definiert. Dort können beliebig viele (auch null) Textdefinitionen
stehen. Eine Textdefinition besteht aus dem Schlüsselwort
deftext, gefolgt vom Bezeichner der Kategorie und dem Textbezeichner selbst. Dem schließt sich der eigentliche Text in
der Referenzsprache der Serviceorganisation an. Dieser Text
ist ein Zeichenkettenliteral, wie in Kapitel 4.2 beschrieben.
Codeauszug 34 zeigt Beispiele für Textdefinitionen.
59 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 deftext BUTTON BUTTON_OK "OK"
02 deftext MESSAGE MSG_OUTPUT_FINISHED "Ausgabe " \
03
"ist erfolgt."
Codeauszug 34: Beispiele für Textdefinitionen
5.4
Einfügen von Dateien in ISOM/L-Quellen
Um die Lesbarkeit und Wartbarkeit großer Programme zu verbessern, besteht eine Möglichkeit, die Länge von Programmen zu
reduzieren: Man kann Teile des ISOM/L-Quelltexts auslagern und
durch eine Anweisung an einer bestimmten Stelle eines Programms
einfügen. Die auf diese Weise ausgelagerten Quelltextteile können sich in verschiedenen Dateien befinden. Sie werden vor der
Verarbeitung durch den Interpreter von einem Präprozessor zusammengefügt.
Es besteht die Möglichkeit, Namensräume ohne Bezeichner zu
definieren (sogenannter anonymer Namensraum). Folgt in einem
ISOM/L-Programm auf einen oder mehrere solcher anonymen Namensräume ein Namensraum mit einem Bezeichner, interpretiert ISOM
die in dem/den anonymen Namensräumen definierten Funktionen so,
als ob sie direkt zum „eigentlichen“ Namensraum gehörten.
Die Dateiendung der ausgelagerten Quelltextteile lautet .isi.
Sie können über die Präprozessordirektive #include unter Angabe
des Pfads relativ zum Basisverzeichnis der Programme eingebunden werden. Codeauszug 35 zeigt, wie ein ausgelagerter Teil des
Quelltexts eingebunden wird.
Quellcodeauszug
01 #include "Oem/G42/Retrofit/SteeringWheelRetrofit.isi"
Codeauszug 35: Einbinden ausgelagerter Quelltextteile
Der Vorteil besteht darin, dass die Länge der Programme reduziert werden kann. Auf diese Weise wird die Lesbarkeit und
Wartbarkeit großer Programme verbessert und die Möglichkeit
der Wiederverwendung eröffnet.
60 von 109
5 Strukturierung von ISOM/L-Programmen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
6
Ein- und Ausgabe
Ein- und Ausgabe von Daten gehören zu den Grundaufgaben jeder
Programmiersprache. Das vorliegende Kapitel zeigt, wie mit
ISOM/L Datenströme und Dateien verarbeitet werden können und
erklärt die ISOM/L-Klassen zur Interaktion mit Benutzern an
der Bedienoberfläche.
6.1
Standard-Datenströme
Die Klasse Isom.Sys.System stellt Fachfunktionen zur Manipulation der Standardeingabe, der Standardausgabe und der Standardfehlerausgabe bereit (siehe auch das einführende Kapitel 2).
Codeauszug 36 zeigt die Verwendung der Fachfunktionen. Ihr
Einsatz ist nur im ISOM-Kommandozeilenmodus sinnvoll.
61 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
/*
* ISOM/L-Beispielprogramm: Stdio.is
* Verwendung der Standard-Datenströme
*/
using Isom.Sys.*;
using Isom.Base.*;
namespace Stdio
{
Boolean main ()
{
// Meldung auf Standardausgabe schreiben
System.Stdout("Bitte geben Sie Ihren Namen ein: ");
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 }
// Zeichenkette von Standardeingabe lesen
String name = System.Stdin();
if(name.Length().Gt(0))
{
// Meldung auf Standardausgabe schreiben
String greeting = "Hallo, ";
greeting.Append(name);
System.Stdout(greeting);
}
else
{
// Fehler: kein Name eingegeben
// Fehlermeldung auf Standardfehlerausgabe schreiben
System.Stderr("Kein Name eingegeben");
return false;
}
return true;
}
Codeauszug 36: Stdio.is
62 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
6.2
Dateizugriff
ISOM/L wurde mit dem Ziel entworfen, Serviceprozesse auf einfache Art und Weise definieren zu können. Daher ist ISOM/L
auf diesen Anwendungsbereich zugeschnitten und nicht als
Allzweckprogrammiersprache zu verstehen. Auch aus Gründen der
Prozesssicherheit der Serviceanwendung, deren Abläufe in ISOM/L
definiert werden, erhält der Programmierer keinen vollständigen
Zugriff auf das Dateisystem des ausführenden Rechners. Dennoch
bietet ISOM/L grundlegende Funktionalität zum Manipulieren von
Dateien an.
6.2.1
Die Klasse Isom.Base.Data
Ausgangspunkt für Dateioperationen sind die Fachfunktionen der
Klasse Isom.Base.Data. Die Klasse unterstützt das Lesen und
Schreiben von Daten im XML-Format. Als Sonderfall können formatfreie Textdateien eingelesen werden.
Der Speicherort der zu manipulierenden Dateien muss vom
Programmierer als URI angegeben werden. ISOM/L bietet dazu
die Klasse Isom.Base.Uri an. Sie ist in [2] beschrieben.
Codeauszug 37 zeigt das Einlesen einer Textdatei.
63 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
/*
* ISOM/L-Beispielprogramm: OutputText.is
* Liest eine Textdatei ein und
* gibt sie auf der Standardausgabe aus
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace OutputText
{
Boolean main ()
{
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* Speicherort der Datei - hier Index-Datei der IFS-Webpräsenz;
* kann auch Datei auf lokalem Dateisystem
* (URI beginnt mit "file://...") sein
*/
String fullPath = "http://www.ifs-it.de/index.htm";
Uri uri = Uri.DefineUri(fullPath);
29
30
31
32
33
34
35
36
37
38
39
40
41 }
// Dateiinhalt (= Text) aus Datenobjekt extrahieren
String text = data.GetText();
if(text.IsVoid()) // Extraktion erfolgreich?
{
System.Stderr("Text konnte nicht extrahiert werden");
return false;
}
// HTML-Datei wie eine formatfreie Textdatei laden
Data data = Data.LoadText(uri);
if(data.IsVoid()) // Laden erfolgreich?
{
System.Stderr("Laden der Datei nicht erfolgreich");
return false;
}
// Inhalt ausgeben
System.Stdout(text);
return true;
}
Codeauszug 37: OutputText.is
Wie bereits erwähnt, unterstützt Isom.Base.Data nur das
Schreiben von Daten im XML-Format. Die mit den Fachfunktionen
von Isom.Base.Data erzeugten „XML-Dateien“ können mit
Isom.Base.Data wieder geladen werden. Das Laden beliebiger
XML-Dateien anderen Ursprungs (d.h. die nicht mit
64 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Isom.Base.Data erzeugt wurden) wird dagegen nicht unterstützt.
Codeauszug 38 zeigt das Schreiben von XML-Dateien.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
* ISOM/L-Beispielprogramm: WriteXml.is
* Schreibt eine XML-Datei
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace WriteXml
{
Boolean main ()
{
// XML-Struktur erzeugen
Data dataNodeA = Data.Create("NodeA"); // Datenelement A erzeugen
Data dataNodeB = Data.Create("NodeB"); // Datenelement B erzeugen
dataNodeB.SetText("Text");
dataNodeA.AddElement(dataNodeB); // B als Kindknoten von A setzen
// Speicherort der Datei
String fullPath = "file://C:/temp/test.xml";
Uri uri = Uri.DefineUri(fullPath);
// XML-Struktur in Datei schreiben
Boolean result = dataNodeA.WriteXml(uri);
if(result.Failed()) // Schreiben fehlgeschlagen
{
System.Stderr("Datei konnte nicht gespeichert werden");
return false;
}
return true;
}
}
Codeauszug 38: WriteXml.is
Führt man das Programm in Codeauszug 38 aus, entsteht folgende
XML-Datei am angegebenen Ort:
Quellcodeauszug
01 <?xml version="1.0" encoding="utf-8"?>
02 <NodeA>
03
<NodeB>Text</NodeB>
04 </NodeA>
Codeauszug 39: Ergebnis der Ausführung von Codeauszug 38
65 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Das Vorgehen, um diese XML-Datei wieder einzulesen, zeigt
Codeauszug 40. Alle Fachfunktionen der Klasse Isom.Base.Data
sind in [1] beschrieben.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
/*
* ISOM/L-Beispielprogramm: LoadXml.is
* Liest eine XML-Datei
*/
using Isom.Base.*;
using Isom.Sys.*;
namespace LoadXml
{
Boolean main ()
{
14
15
16
17
// Speicherort der Datei
String fullPath = "file://C:/temp/test.xml";
Uri uri = Uri.DefineUri(fullPath);
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 }
// XML-Struktur laden
Data xml = Data.LoadXml(uri);
if(xml.IsVoid()) // Laden fehlgeschlagen
{
System.Stderr("Datei konnte nicht geladen werden");
return false;
}
// innerhalb der XML-Struktur navigieren
DataList childNodes = xml.FindElements("B");
// ... ggf. weitere Operationen ...
return true;
}
Codeauszug 40: LoadXml.is
66 von 109
6 Ein- und Ausgabe
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
7
Bedienoberfläche und Benutzerinteraktion
ISOM/L stellt im Namensraum Isom.Request Klassen zur Anzeige
von Bedienelementen zur Interaktion mit den Benutzern eines
Programms zur Verfügung. Das vorliegende Kapitel beschreibt
die Konzepte, die den Klassen des Namensraums Isom.Request
zugrunde liegen.
Da die konkrete Gestaltung der Bedienoberfläche der jeweiligen
Anwendung vorbehalten ist, sind die Klassen und ihre Fachfunktionen bewusst allgemein gehalten. Annahmen über die grafische
Darstellung und Anordnung von Bedienelementen an der Oberfläche
werden allgemein nicht gemacht und diese lassen sich auch nicht
über ISOM/L beeinflussen. Der Programmierer steuert lediglich
das Anzeigen und Abräumen von Fenstern.
ISOM/L stellt zwei Konzepte für die Benutzerinteraktion zur
Verfügung:

Dialogfenster (Klasse Isom.Request.UserRequest) zeigen ein
einzelnes Fenster an der Bedienoberfläche an, das mit Hinweistexten, Auswahlgruppen, Schaltflächen usw. befüllt
werden kann. Dialogfenster können blockierend und nichtblockierend angezeigt werden.

Assistenten (Klasse Isom.Request.Wizard) bestehen aus einer Folge von Dialogschritten. Aufgabe der Dialogschritte
ist das Einsammeln von Daten, die in einem abschließenden
Schritt verarbeitet werden. Eine teilweise Verarbeitung
kann aber auch bereits vor dem abschließenden Schritt erfolgen, unter Umständen sogar unumkehrbar. Der Assistent
unterstützt den Bediener bei der Eingabe von Daten und ermöglicht auch das Vor- und Zurückbewegen zwischen Dialogschritten, sofern keine unumkehrbaren Aktionen ausgeführt
wurden.
Das Grundprinzip aller Klassen zur Benutzerinteraktion ist das
der Containerklassen, die in Kapitel 4.9 beschrieben wurden:
Instanzen von Bedienelementen eines Typs werden in einem Containerobjekt zusammengefasst, das selbst wiederum als Element
zu einem Dialogfenster oder Assistenten hinzugefügt werden
kann.
67 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
7.1
Darstellung der Bedienoberfläche im Kommandozeilenmodus
Dialogfenster und Assistenten werden im Kommandozeilenmodus
vom ISOM-Interpreter grafisch dargestellt, d.h. zur Darstellung
werden separate Fenster geöffnet. Voraussetzung dazu ist, dass
der ISOM-Interpreter mit der Kommandozeilenoption -Gui gestartet wird. In der in Kapitel 8.1 beschriebenen Testumgebung ist
diese bereits voreingestellt.
7.2
Identifikationsnummern und Schlüssel
Instanzen von Dialogfenstern und Assistenten sowie der darin
enthaltenen Bedienelemente werden, wie in ISOM/L üblich, über
entsprechende Create...-Fachfunktionen erzeugt.
Das bereits erwähnte Containerprinzip macht es erforderlich,
dass der Programmierer alle Elemente in einem Container (d.h.
Anzeigeelement) eindeutig identifizieren kann.
Das Ablaufsystem vergibt selbstständig eindeutige Identifikationsnummern (ID) für alle neu erstellten Dialogfenster und
Assistenten. Sie können über die Fachfunktion GetId() für
jede Instanz abgerufen werden. Dies ist nützlich, um alle
gleichzeitig geöffneten Fenster aus Sicht des Programmierers
unterscheiden zu können. Darüber hinaus kann es hilfreich sein,
ihre IDs als globale Variablen zu speichern (siehe Kapitel
4.10), um Fenster funktionsübergreifend verwalten zu können.
68 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/*
* ISOM/L-Beispielprogramm: ExUserRequest.is
* Dialogfenster und IDs
*/
using Isom.Base.*;
using Isom.Sys.*;
using Isom.Request.*;
namespace ExUserRequest
{
deftext TITLE TITLE_USER_REQUEST "Dialogfenster"
deftext INTERNAL USER_REQUEST_KEY "USER_REQUEST_ID"
Number CreateNewRequest()
{
18
19
20
21
22
23
24
25
26
/* Dialogfenster mit Textbezeichner TITLE_USER_REQUEST
* als Titel erzeugen; Fenster enthält keine Bedienelemente */
UserRequest request = UserRequest.Create(TITLE_USER_REQUEST);
// ID ermitteln
Number id = request.GetId();
// ID global mit Schlüssel USER_REQUEST_ID ablegen,
// um sie später aus anderen Namensräumen und/oder
// Funktionen heraus abrufen zu können
Number.AddGlobal(USER_REQUEST_KEY, id);
27
28
29
30
31
32
33
34
35
// ID zurückgeben und Funktion verlassen
return id;
}
Boolean main ()
{
// Funktion "CreateNewRequest" aufrufen
CreateNewRequest();
36
37
// ... weitere Programmschritte ...
38
39
40
41
// global gespeicherte ID des Diaglogfensters ermitteln
Number id = Number.GetGlobal(USER_REQUEST_KEY);
if(id.IsVoid().Not())
{
42
43
44
45
46
47
48
69 von 109
7 Bedienoberfläche und Benutzerinteraktion
// Dialogfenster mit dieser ID holen
UserRequest req = UserRequest.GetRequest(id);
if(req.IsVoid().Not())
{
req.ShowRequest(); // Dialogfenster anzeigen
System.Wait(5000); // fünf Sekunden warten
req.Dispose(); // Dialogfenster entfernen
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
49
50
51
52
53
54 }
}
}
return true;
}
Codeauszug 41: ExUserRequest.is
Im Unterschied zu den Dialogfenstern vergibt ISOM für die
Bedienelemente innerhalb der Dialogfenster und Assistenten
selbsttätig keine identitätsstiftenden Bezeichner. Diese
müssen vielmehr beim Aufruf der entsprechenden Create...Fachfunktion als sogenannte Schlüssel vom Programmierer
übergeben werden. Beispiele sind in Kapitel 7.3 zu finden.
Führt man das in Codeauszug 41 enthaltene Programm aus,
erscheint für fünf Sekunden ein leerer Dialog, wie in
Abbildung 3 gezeigt.
Abbildung 3: Leeres Dialogfenster
70 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
7.3
Bedienelemente
ISOM/L bietet folgende Arten von Bedienelementen, die zu
Dialogfenstern oder Assistenten hinzugefügt werden können:
Bedienelement
Typ im Namensraum Isom.Request
Kurzbeschreibung
Schaltfläche
Button
anklickbare Schaltfläche
Anzeigetexte
MessageElement
Anzeigetexte für Hinweise oder
Eingabeaufforderungen
Auswahlgruppen
SelectionGroup
Auswahlgruppen in verschiedenen
Ausprägungen:

Mehrfachauswahl („check boxes“)

Exklusivauswahl („radio buttons“)

Mehrfachauswahlliste („list box“)

Exklusivauswahlliste
(„drop down list“)
Auswahlgruppen fassen OptionsObjekte zusammen.
Option
Option
einzelnes Element einer Auswahlgruppe
Medienelement
MediaElement
Medienobjekt, das z.B. einen Verweis
auf eine Grafik oder ein Video enthalten kann
Messwerte
MeasuredValue
stellt in Echtzeit erfasste Messwerte (z.B. Spannung) dar
Tabelle 1: Arten von Bedienelementen
Die Fachfunktionen dieser Klassen sind in [1] vollständig beschrieben. Außerdem existieren Containerklassen, um mehrere
Objektinstanzen zusammenzufassen (siehe Kapitel 4.9), die in
Tabelle 1 nicht aufgeführt sind.
Codeauszug 42 erweitert die Funktion CreateNewRequest() in
Codeauszug 41 um mehrere Bedienelemente und unterstreicht
das Konzept der Containerklassen. Das vollständige Beispiel
ist wie alle in diesem Handbuch dargestellten Beispiele im
Verzeichnis Taurus\ISOM\doc\samples enthalten.
71 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 Number CreateNewRequest()
02 {
03
// Liste von Auswahlgruppen erzeugen
04
SelectionGroupList selectionGrpList =
05
SelectionGroupList.CreateSelectionGroupList();
06
// Exklusivauswahl mit Schlüssel "Key_Color" erzeugen
07
SelectionGroup radio =
08
SelectionGroup.CreateRadioButtons("Key_Color");
09
10
11
12
13
14
15
16
17
18
19
// drei Optionen erzeugen und zur Auswahlgruppe hinzufügen
radio.AddOption(Option.CreateOption("Key_Red", OPTION_RED));
radio.AddOption(Option.CreateOption("Key_Green", OPTION_GREEN));
radio.AddOption(Option.CreateOption("Key_Blue", OPTION_BLUE));
// Überschrift hinzufügen
radio.SetHeading(COLOR);
// Option mit dem Schlüssel "Key_Blue" vorauswählen
radio.Select("Key_Blue");
// zu Liste von Auswahlgruppen hinzufügen
selectionGrpList.AddSelectionGroup(radio);
20
21
// Liste von Schaltflächen erzeugen
ButtonList buttonList = ButtonList.CreateButtonList();
22
23
24
25
26
// Schaltflächen erzeugen und zu Liste hinzufügen
buttonList.AddButton(Button.CreateButton("Key_OK", BUTTON_OK));
buttonList.AddButton(
Button.CreateButton("Key_Cancel", BUTTON_CANCEL));
27
28
// Liste von Anzeigetexten erzeugen
MessageList msgList = MessageList.CreateMessageList();
29
30
31
32
33
34
35
36
37
38
39
40
41
// Hinweistext erzeugen und zu Liste hinzufügen
msgList.AddMessage(
MessageElement.CreateMessage("Key_Msg", MSG_SELECT_COLOR));
42
43
44
45
46
47
48 }
// ID ermitteln
Number id = request.GetId();
// ID global mit Schlüssel USER_REQUEST_KEY ablegen
Number.AddGlobal(USER_REQUEST_KEY, id);
// ID zurückgeben und Funktion verlassen
return id;
/* Dialogfenster mit Textbezeichner TITLE_USER_REQUEST
* als Titel erzeugen; Fenster enthält keine Bedienelemente */
UserRequest request = UserRequest.Create(TITLE_USER_REQUEST);
// Liste von Auswahlgruppen zu Dialogfenster hinzufügen
request.SetSelectionGroups(selectionGrpList);
request.SetButtons(buttonList);
request.SetMessages(msgList);
Codeauszug 42: ExUserRequest2.is, CreateNewRequest()
72 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Führt man das in Codeauszug 42 enthaltene Programm aus,
erscheint ein Dialogfenster mit Bedienelementen, siehe
Abbildung 4.
Abbildung 4: Dialogfenster mit Bedienelementen
7.4
Auswertung von Benutzereingaben
Bislang wurde das erstellte Dialogfenster während einer festen
Zeitspanne angezeigt und danach entfernt. Die Eingaben des
Bedieners (falls während dieser Zeitspanne Eingaben getätigt
wurden) wurden ignoriert.
Um ein blockierendes Dialogfenster anzuzeigen, das so lange
nicht verschwindet, bis der Bediener eine der enthaltenen
Schaltflächen angeklickt hat, muss statt der Fachfunktion
ShowRequest die Fachfunktion WaitUserRequest() verwendet
werden. Ein Aufruf dieser Fachfunktion kehrt erst nach Anklicken einer Schaltfläche zurück. Rückgabewert ist die angeklickte Schaltfläche selbst. Anhand dieser kann der Programmierer
feststellen, ob der Bediener zum Beispiel „OK“ oder „Abbruch“
gewählt hat, und entsprechend reagieren.
73 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Die Auswertung der Benutzereingaben für weitere Bedienelemente
wie zum Beispiel Auswahlgruppen erfolgt ebenfalls nach dem
Containerklassenprinzip in umgekehrter Reihenfolge des Hinzufügens: der Programmierer wählt zunächst ein Dialogfenster,
ermittelt dessen Bedienelemente (die anhand ihrer Schlüssel
eindeutig identifizierbar sind) und ruft schließlich die Eingaben des Benutzers bzw. die von ihm ausgewählten Optionen ab.
Abschließend wird das Fenster durch Aufruf von Dispose() entfernt. Mit dem Aufruf von Dispose() verlieren auch alle im
Dialogfenster enthaltenen Objekte (wie Auswahlgruppen) ihre
Gültigkeit, d.h. Ergebnisse müssen vor einem Aufruf von
Dispose() ausgewertet werden.
Codeauszug 43 baut auf Codeauszug 41 und Codeauszug 42 auf und
erweitert die main-Funktion um die Auswertung der Eingaben, die
der Bediener tätigt. Das erscheinende Dialogfenster entspricht
dem in Abbildung 4.
74 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 Boolean main ()
02 {
03
// Funktion "CreateNewRequest" aufrufen
04
CreateNewRequest();
05
06
// global gespeicherte ID des Diaglogfensters ermitteln
07
Number id = Number.GetGlobal(USER_REQUEST_ID);
08
if(id.IsVoid().Not())
09
{
10
// Dialogfenster mit dieser ID holen
11
UserRequest req = UserRequest.GetRequest(id);
12
if(req.IsVoid().Not())
13
{
14
15
16
17
18
19
20
21
22
23
24
25
26
// Dialogfenster blockierend anzeigen
Button selected = req.WaitUserRequest();
// Schlüssel der gewählten Schaltfläche ermitteln
String selectedKey = selected.GetKey();
if (selectedKey.Equals("Key_Cancel"))
{
// Benutzer hat "Abbruch" gewählt
req.Dispose(); // Dialogfenster entfernen
return true;
}
else // Benutzer hat OK gewählt
{
27
28
29
30
// Ausgewählte Farbe ermitteln
SelectionGroup selGrp =
req.GetSelectionGroups().FindByKey("Key_Color");
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* in einer exklusiven Auswahl kann nur eine Option
* ausgewählt worden sein */
String key = selGrp.GetSelectedKeys().At(0);
String msg = "Farbe $color wurde ausgewählt";
String color = "";
switch(key)
{
case "Key_Red":
color = OPTION_RED;
case "Key_Green":
color = OPTION_GREEN;
case "Key_Blue":
color = OPTION_BLUE;
default:
{
System.Stderr("Fehler bei der Farbauswahl");
return false;
}
75 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
49
50
51
52
53
54
55
56
57
58 }
}
req.Dispose(); // Dialogfenster entfernen
msg.Replace("$color", color);
System.Stdout(msg);
}
}
}
return true;
Codeauszug 43: ExUserRequest3.is, erw. main()-Funktion
7.5
Assistenten
Die Klasse Isom.Request.Wizard unterstützt die Erstellung von
Assistenten. Sie bietet dazu u.a. Fachfunktionen an, mit denen
sich der Textinhalt und die Funktionalität von Schaltflächen
jedes Schritts in der Dialogfolge angeben lassen.
Gestartet wird die Anzeige des Assistenten mit der Fachfunktion
Run(). Es wird der Name einer Funktion übergeben, die aufgerufen wird, um die Darstellung des Assistenten und die möglichen
nächsten Dialogschritte festzulegen. Der zweite Parameter ist
ein Wahrheitswert und legt fest, wie die Abarbeitung der Dialogschrittschritte gesteuert wird. Ist der Parameter true,
übernimmt der Assistent einige Aufgaben selbst, wie zum Beispiel den Aufruf zur Anzeige des nächsten Dialogschritts
(siehe Kapitel 7.5.1). Ist er false, übernimmt der ISOM/LProgrammierer diese Aufgaben; dies ermöglicht ihm eine größere
Flexibilität, überträgt ihm aber auch mehr Verantwortung (siehe
Kapitel 7.5.2). Durch diese Unterscheidung ergeben sich zwei
Arten, auf die ein Assistent definiert werden kann.
7.5.1
Schrittsteuerung durch den Assistenten
Die in Run() übergebene Funktion beschreibt, wie der erste
Dialogschritt aussieht. Nach Auswertung der Funktion wird
der Schritt automatisch angezeigt. Der durch die Schaltfläche
„Weiter“ erreichbare nächste Dialogschritt wird mit der Funktion SetNext() angegeben. Als Parameter wird wiederum der
Name der Funktion mit den Festlegungen des nächsten Dialogschritts übergeben. Eine Abfolge von Dialogen wird so durch
die Verwendung von SetNext() in der beschreibenden Funktion
jedes Einzelschritts definiert. Codeauszug 44 verdeutlicht
das Konzept.
76 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01 Boolean StartWizard()
02 {
03
// Assistenten erstellen
04
Wizard wizard = wizard.Create();
05
06
// Titel des Reiters für Inhalte mit Benutzerinteraktionen
wizard.SetContentTitle("Hinweise");
07
/* Der Assistent beginnt mit dem Dialogschritt,
08
der durch die Funktion 'Step1' definiert wird. */
09
wizard.Run("Step1", true);
10 }
11
12 Boolean Step1(Wizard wizard)
13 {
14
// ...
15
// Verknüpft die Weiter-Schaltfläche mit 'Step2'
16
SetNext("Step2", false);
17
// ...
18 }
19
20 Boolean Step2(Wizard wizard)
21 {
22
23
24
25
26
27
28
29
30
31
32
// ...
// Verknüpft die Weiter-Schaltfläche mit 'Exit'
SetNext("Exit", true);
// ...
}
Boolean Exit(Wizard wizard)
{
// löscht den Assistenten
wizard.Dispose();
}
Codeauszug 44: Schrittsteuerung durch den Assistenten
Mit SetUpdateFunction() lässt sich für die automatische
Schrittverwaltung bei der Festlegung eines Dialogschritts
auch eine Funktion angeben, die vor der Anzeige des Dialogschritts gestartet wird.
Sie erlaubt es, durch Aufruf der Funktionen UpdateMessage()
und UpdateMeasurement() die Anzeige zu aktualisieren.
Bei der automatischen Schrittverwaltung baut die Definition
eines Schritts auf einem leeren Schritt auf, sodass keine
Elemente des vorhergehenden Dialogschritts übernommen werden.
Eine Ausnahme bilden dabei die Festlegungen, die vor dem Aufruf
von Run() getroffen wurden. Sie gelten für jeden Dialogschritt,
ohne dass sie explizit angegeben werden müssen.
77 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Bei der automatischen Schrittverwaltung wird bei Betätigung
der „Zurück“-Schaltfläche die Funktion des vorhergehenden
Dialogschritts ausgeführt. Diese Funktionalität lässt sich
mit DisableBack() deaktivieren.
Codeauszug 45 zeigt die Verwendung von Assistenten zur Darstellung eines einfachen Taschenrechners.
78 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
* ISOM/L-Beispielprogramm: Wizard.is
* Assistent (Taschenrechner)
*/
using Isom.Sys.*;
using Isom.Base.*;
using Isom.Request.*;
namespace CalculatorWizard
{
/* Startet den Assistenten */
Boolean StartCalculatorWizard()
{
// Assistenten erzeugen und starten
Wizard w = Wizard.Create();
w.SetTitle("Taschenrechner");
w.SetContentTitle("Inhaltstitel");
w.SetQuit("WizardExit");
w.Run("WizardInputNumbers", true);
w.Dispose();
return true;
}
/* Schritt 1: Zeigt zwei Texteingabefelder an */
Boolean WizardInputNumbers(Wizard w)
{
79 von 109
7 Bedienoberfläche und Benutzerinteraktion
w.DisableBack();
w.SetContentTitle("Eingabe");
w.AddMessage("keyInputMsg", "Geben Sie zwei Zahlen ein:");
String initA = "0";
String initB = "0";
if(w.IsVisited())
{
Number a = w.GetNumber("keyNumA");
initA = a.ToFloatString();
Number b = w.GetNumber("keyNumB");
initB = b.ToFloatString();
}
w.AddTextInput("keyValA", "Erste Zahl:", initA);
w.AddTextInput("keyValB", "Zweite Zahl:", initB);
w.SetNext("WizardSelectOp", false);
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
return true;
}
/* Schritt 2: Auswahl einer Verknüpfung */
Boolean WizardSelectOp(Wizard w)
{
w.SetContentTitle("Auswahl");
String valA = w.GetTextInput("keyValA");
String valB = w.GetTextInput("keyValB");
Number a = valA.ParseNumber();
Number b = valB.ParseNumber();
w.AddNumber("keyNumA", a);
w.AddNumber("keyNumB", b);
String msg = "Es wurden die Zahlen '$a' und '$b' eingegeben.
Wählen Sie eine Verknüpfung:";
msg.Replace("$a", a.ToFloatString());
msg.Replace("$b", b.ToFloatString());
w.AddMessage("keyOpMsg", msg);
RadioButton rbAdd = w.AddRadioButton("rbAdd", "+ (Addition)");
rbAdd.SetWizardNext("WizardAdd");
RadioButton rbSub = w.AddRadioButton("rbSub", "- (Subtraktion)");
rbSub.SetWizardNext("WizardSub");
RadioButton rbMul =
w.AddRadioButton("rbMul", "* (Multiplikation)");
rbMul.SetWizardNext("WizardMul");
RadioButton rbDiv = w.AddRadioButton("rbDiv", "/ (Division)");
rbDiv.SetWizardNext("WizardDiv");
rbAdd.Select();
return true;
}
/* Ergebnis: Addition */
Boolean WizardAdd(Wizard w)
{
80 von 109
7 Bedienoberfläche und Benutzerinteraktion
w.SetContentTitle("Ergebnis");
Number a = w.GetNumber("keyNumA");
Number b = w.GetNumber("keyNumB");
Number res = a.Clone();
res.Add(b);
String msg = "$a + $b = $res";
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
msg.Replace("$a", a.ToFloatString());
msg.Replace("$b", b.ToFloatString());
msg.Replace("$res", res.ToFloatString());
w.AddMessage("keyAddResMsg", msg);
w.SetNext("WizardExit", true);
return true;
}
/* Ergebnis: Subtraktion */
Boolean WizardSub(Wizard w)
{
w.SetContentTitle("Ergebnis");
Number a = w.GetNumber("keyNumA");
Number b = w.GetNumber("keyNumB");
Number res = a.Clone();
res.Sub(b);
String msg = "$a - $b = $res";
msg.Replace("$a", a.ToFloatString());
msg.Replace("$b", b.ToFloatString());
msg.Replace("$res", res.ToFloatString());
w.AddMessage("keySubResMsg", msg);
w.SetNext("WizardExit", true);
return true;
}
/* Ergebnis: Multiplikation */
Boolean WizardMul(Wizard w)
{
81 von 109
7 Bedienoberfläche und Benutzerinteraktion
w.SetContentTitle("Ergebnis");
Number a = w.GetNumber("keyNumA");
Number b = w.GetNumber("keyNumB");
Number res = a.Clone();
res.Mul(b);
String msg = "$a * $b = $res";
msg.Replace("$a", a.ToFloatString());
msg.Replace("$b", b.ToFloatString());
msg.Replace("$res", res.ToFloatString());
w.AddMessage("keyMulResMsg", msg);
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 }
w.SetNext("WizardExit", true);
return true;
}
/* Ergebnis: Division */
Boolean WizardDiv(Wizard w)
{
w.SetContentTitle("Ergebnis");
Number a = w.GetNumber("keyNumA");
Number b = w.GetNumber("keyNumB");
if(b.Eq(0))
{
w.AddMessage("keyDivByZeroMsg", "Division durch 0!");
}
else
{
Number res = a.Clone();
res.Div(b);
String msg = "$a / $b = $res";
msg.Replace("$a", a.ToFloatString());
msg.Replace("$b", b.ToFloatString());
msg.Replace("$res", res.ToFloatString());
w.AddMessage("keyDivResMsg", msg);
}
w.SetNext("WizardExit", true);
return true;
}
/* Beendet den Assistenten */
Boolean WizardExit(Wizard w)
{
w.Dispose();
return true;
}
Boolean main()
{
StartCalculatorWizard();
return true;
}
Codeauszug 45: Wizard.is
82 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Die durch Ausführung des Programms in Codeauszug 45 angezeigten
Assistentenfenster sind in den nachfolgenden Abbildungen dargestellt. Der Benutzer kann über die Schaltfläche „Zurück“ zu
vorhergehenden Schritten wechseln und die dort getätigten Eingaben und ausgewählten Optionen korrigieren.
Die auf der rechten Seite sichtbaren Registerkarten „Beschreibung“ und „Media“ können Dokumente (z.B. PDF) und Mediendateien
(z.B. Filme) aufnehmen.
Abbildung 5: Taschenrechner – Eingabe der Operanden
83 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 6: Taschenrechner – Auswahl des Operators
Abbildung 7: Taschenrechner – Ergebnis
84 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
7.5.2
Manuelle Schrittsteuerung durch den Programmierer
Die in Run() übergebene Funktion enthält in diesem Modus den
gesamten Dialogablauf. Der Programmierer steuert in der Funktion selbst, wann ein Schritt angezeigt wird. Dazu stehen ihm
die zwei Funktionen ShowWizard() und WaitWizard() zur Verfügung. Ein Aufruf von ShowWizard() aktualisiert die Anzeige des
Assistenten und kehrt zurück, ohne auf die Betätigung einer
Schaltfläche zu warten. WaitWizard() aktualisiert die Anzeige
und wartet auf die Betätigung einer Schaltfläche. Als Rückgabeergebnis eines Aufrufs von WaitWizard() wird der Schlüssel der
betätigten Schaltfläche geliefert. Mögliche Rückgabewerte sind
Next, Back und Quit.
85 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Boolean StartWizard()
{
Wizard wizard = wizard.Create();
/* Der Assistent ruft die Funktion 'Dispatcher' auf,
die eine autorengesteuerte Dialogabfolge enthält. */
wizard.Run("Dispatcher", false);
}
Boolean Dispatcher(Wizard wizard)
{
wizard.AddMessage("FirstMessage",
"Erster Schritt: Warte auf Betätigung einer Schaltfläche...");
String button = wizard.WaitWizard();
switch (button)
{
case "Next": // Benutzer hat auf 'Weiter' geklickt
{
// ...
}
case "Back": // Benutzer hat auf 'Zurück' geklickt
{
// ...
}
case "Quit": // Benutzer hat den Assistenten beendet
{
27
28
29
30
31
32
33
34 }
// ...
}
default:
{
// ...
}
}
Codeauszug 46: Manuelle Schrittsteuerung durch Programmierer
86 von 109
7 Bedienoberfläche und Benutzerinteraktion
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
8
Werkzeuge
8.1
Verwendung des Interpreters
Die ausführbare Datei des ISOM-Interpreters heißt
IsomInstance.exe und befindet sich im Verzeichnis
Taurus\ISOM\bin. Es ist möglich, mehrere Instanzen von ISOM
zur gleichen Zeit zu starten. In diesem Fall muss jeder Instanz
eine eindeutige Sitzungs-ID übergeben werden.
Im Kommandozeilenmodus wird die main-Funktion des übergebenen
ISOM/L-Programms ausgeführt. Wenn es keine main-Funktion in
dem betreffenden Programm gibt, wird das Programm auf korrekte
Syntax und Semantik geprüft. In diesem Fall wird jedoch nichts
ausgeführt, sondern eine Warnung ausgegeben, dass das Programm
keine main-Funktion enthält.
Bei der Ausführung eines Programms wird die Syntax und Semantik
aller Namensräume geprüft. Über den Kommandozeilenparameter CheckProgramsOnly kann ISOM auch angewiesen werden, nur alle
Programme zu prüfen, ohne eines auszuführen.
Die Semantikprüfung kann mittels des Parameters
–SemanticCheck=False ausgeschaltet werden.
Zur Konfiguration von ISOM können Parameter auf der Kommandozeile angegeben werden. Dabei werden Parameter erkannt, die
mit einem einfachen oder doppelten Bindestrich („-“ oder „--“)
beginnen. Jedem Parameter kann durch Zuweisung mit dem Gleichheitszeichen ein Wert übergeben werden. Dabei dürfen keine
Leerzeichen zwischen dem Parameter, dem Gleichheitszeichen
und dem Wert stehen. Der Wert kann in einfache oder doppelte
Anführungszeichen eingeschlossen werden. Er muss in Anführungszeichen eingeschlossen werden, falls er Leerzeichen, den Bindestrich oder das Gleichheitszeichen selbst enthält. Werden
einzelne Optionen nicht über die Kommandozeile konfiguriert,
werden die Werte aus der Konfigurationsdatei
IsomInstance.exe.config verwendet, die sich im Binärverzeichnis
des Kommandozeileninterpreters in Taurus\ISOM\bin befindet.
Optionen, die über die Kommandozeile angegeben werden, haben
stets Vorrang vor den entsprechenden Standardeinstellungen aus
der Konfigurationsdatei.
87 von 109
8 Werkzeuge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Für den Kommandozeilenmodus sind folgende Kommandozeilenparameter relevant:
Kommandozeilenparameter
Bedeutung
-Program
Ausführung des übergebenen ISOM/L-Programms im
Kommandozeilenmodus.
(Die Angabe dieses Parameters ist notwendig, alle
weiteren Parameter in dieser Tabelle sind optional.)
-Help
Anzeigen der Hilfe
-IsomlCheckOnly
Nur Syntax- und Semantikprüfung der Programme durchführen
-Debug
Ausführung des per -Program übergebenen Programms
im Einzelschrittmodus
-Warnings
Ausgabe von Warnungen aktivieren
-IsomSession
Sitzungs-ID
-MaxRecursion
maximale Rekursionstiefe für ISOM/L-Programme;
Voreinstellung: 100 (einhundert)
-MaxRuntime
maximale Anzahl zulässiger ISOM/L-Instruktionen;
Voreinstellung: 1000000 (eine Million)
-NoLog
Ereignisaufzeichnung ausschalten
-SemanticCheck
gibt an, ob eine Semantikprüfung der ISOM/L-Programme
ausgeführt werden soll: true oder false
Tabelle 2: Kommandozeilenparameter für den Kommandozeilenmodus
8.1.1
Herstellen einer Testumgebung
Das vorliegende Handbuch ist Teil eines Archivs, das eine vollständige ISOM-Laufzeitumgebung enthält. Das Archiv kann in ein
beliebiges Verzeichnis extrahiert werden („copy deployment“).
Die ausführbare Datei des ISOM-Interpreters befindet sich unter
Taurus\ISOM\bin\IsomInstance.exe. Angenommen, das Beispiel
„Hello, world“ wurde im Verzeichnis Taurus\ISOM\doc\samples abgelegt, kann der ISOM-Interpreters wie folgt ausgeführt werden:
Quellcodeauszug
01 IsomInstance.exe –Program="..\doc\Samples\HelloWorld.is"
Codeauszug 47: Aufruf des ISOM-Interpreters
88 von 109
8 Werkzeuge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
8.2
Einzelschrittausführung im Kommandozeilenmodus
Der ISOM-Einzelschrittmodus (idb) ist nach dem Vorbild des
C-Debuggers (cdb) gestaltet. Um ein Programm im Einzelschrittmodus auszuführen, muss der Kommandozeilenparameter -Debug
angegeben werden. Im Einzelschrittmodus selbst erscheint (idb)
als Eingabeaufforderung, an der Einzelschrittmodusbefehle ausgeführt werden können. Codeauszug 48 zeigt den Aufruf des Einzelschrittmodus.
Quellcodeauszug
01
02
03
04
05
06
07
08
09
10
11
12
13
14
D:\ISOM Didact\Taurus\ISOM\bin>IsomInstance.exe
–Program=..\doc\samples\Factorial.is -Debug
Session ID: 12345678-1234-1234-1234-123456789012
Starte Isom mit der Main-Funktion des ISOM/L-Programms:
D:\ISOM Didact\Taurus\ISOM\doc\samples\Factorial.is
Isom Debugger 9.0.0.0
Copyright 2007 IFS Informationstechnik GmbH
Um die Hilfe aufzurufen, geben Sie bitte 'help' ein.
Der Kontext ist IFS (Ausführung 2)
Factorial.is Zeile 34 :
{
(idb) _
Codeauszug 48: Aufruf eines Programms im Einzelschrittmodus
89 von 109
8 Werkzeuge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Folgende Befehle (und teilweise Kurzformen davon) stehen im
Einzelschrittmodus zur Verfügung:
Einzelschrittmodus-Befehl
Bedeutung
help
Anzeigen der Hilfe
Wenn ein Einzelschrittmodus-Befehl als Parameter angegeben
wird, wird eine detaillierte Hilfe zu diesem Befehl angezeigt.
break
Haltepunkt setzen
clear
Haltepunkt löschen
info
Informationen zu gesetzten Haltepunkten
continue, c
Wiederaufnahme der angehaltenen Ausführung
next, n
Weiterführung der angehaltenen Ausführung um einen Schritt
Funktionsaufrufe werden dabei zu einem Schritt zusammengefasst.
step, s
Weiterführung der angehaltenen Ausführung um einen Schritt
Funktionsaufrufe werden dabei nicht zu einem Schritt
zusammengefasst.
finish, f
Weiterführung der angehaltenen Ausführung bis zum Ende des
aktuellen Funktionsaufrufs
print, p
Ausgabe eines Variablenwerts
list
Ausgabe einer Stelle im Quelltext
set
Konfigurationen setzen
backtrace, bt
Ausgabe der Namen aller Funktionen auf dem Aufrufstapel
quit
Einzelschrittmodus beenden
Tabelle 3: Befehle im ISOM-Einzelschrittmodus
90 von 109
8 Werkzeuge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
9
Syntaxgraphen von ISOM/L
In diesem Kapitel wird die zulässige Syntax von ISOM/L-Programmen anhand von Syntaxgraphen dargestellt. Syntaxgraphen
sind benannte, gerichtete Graphen, in denen runde Knoten
Eingabesymbole darstellen und eckige Knoten auf andere Graphen
verweisen. Ein Graph stellt dabei eine Phrase bzw. ein Element
der Sprache dar.
Kommentare werden nicht in die folgende Grammatikdefinition
aufgenommen, da sie überall im Quelltext angegeben werden
können.
Abbildung 8: Grundelemente von Syntaxgraphen
Die Grundelemente der Syntaxgraphen sind in Abbildung 8 in
folgender Notation wiedergegeben:

„Folgen“ beschreiben eine Sequenz von Phrasen, die genau
in dieser Form in einem gültigen Satz der Sprache auftreten müssen.

Eine „Auswahl“ stellt mögliche Phrasen dar, wobei genau
eine dieser Phrasen an dieser Stelle des Satzes auftreten
muss.
91 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
9.1

„Optionen“ sind Phrasen, die an dieser Stelle optional
vorkommen können.

„Repetitionen“ sind Phrasen, die an dieser Stelle beliebig
oft, aber auch keinmal vorkommen können.
Grundelemente der Syntax
Abbildung 9 zeigt den Aufbau der Grundelemente der ISOM/L-Syntax. Grundelemente, die nicht weiter aufgeschlüsselte Wörter
der Sprache darstellen, werden „Terminale“ genannt. Diese
Elemente sind in Abbildungen jeweils durch Kreise oder Ovale
gekennzeichnet. Nicht-Terminale sind durch Rechtecke dargestellt und werden durch die Regel gebildet, deren Name in
dem Rechteck steht.
Abbildung 9: Grundelemente der Syntax von ISOM/L
Digit steht für ein Element der arabischen Zahlensymbole.
Für HexDigit wird diese Menge um die lateinischen Buchstaben
„a“ bis „f“ in kleiner und großer Schreibweise erweitert.
92 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Allgemeine Zeichenketten werden durch den Graphen String
repräsentiert, dürfen aber keine Textbegrenzungszeichen („"“)
oder \u0080-Zeichen enthalten. Das erste Zeichen wird für Zeichenkettenkonstanten verwendet. Das zweite Zeichen wird intern
verwendet, um ein Dateiende anzuzeigen.
Ein Beispiel für eine zulässige Zeichenkette ist Test.
9.2
Syntax der Konstanten und Bezeichner
Mithilfe der Syntax-Grundelemente können Zahlenkonstanten
gebildet werden. Abbildung 10 zeigt diese Sprachelemente.
Der Graph UnsignedInteger bildet natürliche Zahlen (d.h. einschließlich der Null) ab, die aus mindestens einer Ziffer bestehen. SignedInteger erweitert natürliche Zahlen zu ganzen
Zahlen. Er wird in der Definition für Zahlen in dezimaler Form
im Graphen DecNumber verwendet. Diese Zahlen besitzen optional
ein negatives Vorzeichen zur Darstellung negativer Zahlen und
mindestens eine Dezimalzahl.
Durch „.“ eingeleitet lassen sich Nachkommastellen angeben.
Ein Punkt ohne Angabe einer Nachkommastelle ist dabei zulässig.
Optional lässt sich eine Dezimalzahl durch einen Exponenten
erweitern, indem dieser entweder durch „e“ oder „E“ angezeigt
wird, gefolgt von einer ganzen Zahl. Beispiele für gültige
Angaben von Dezimalzahlen sind „3.14“, „0.“ und „2.0E-3“.
Der Graph HexNumber beschreibt Zahlen in hexadezimaler
Schreibweise. Diesen steht immer „0x“ oder „0X“ voran.
Beispiele für gültige Angaben von Hexadezimalzahlen sind
„0xFF“ und „0X2143“.
93 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 10: Darstellung von numerischen Literalen in ISOM/L
Konstanten und Bezeichner werden aus Grundelementen geformt.
Abbildung 11 zeigt die Konstruktion von Bezeichnern.
ShortIdentifier müssen innerhalb von ISOM/L mit einem Buchstaben beginnen und dürfen danach nur Buchstaben, Ziffern oder den
Unterstrich „_“ enthalten. Beispiele für gültige Angaben von
Kurznamen sind „x“ und „Boolean“. Ein SubsequentShortIdentifier
ist eine beliebige Folge von Buchstaben, Ziffern und
Unterstrichen. Kurze Bezeichner ShortIdentifier und
SubsequentShortIdentifier können mit „.“ zu Identifier verkettet werden. Zum Beispiel ist Isom.Base.Boolean ein gültiger
Identifier.
Abbildung 12 zeigt die Konstruktion von Zeichenkettenliteralen
und von Konstanten. StringLiteral zeigt die Definition der
Zeichenketten in ISOM/L, die durch „\“ beliebig oft verkettet
werden können. Dies bietet eine gute Überschaubarkeit der in
ISOM/L verwendeten Zeichenketten, die auf diese Weise übersichtlich in aufeinander folgenden Zeilen definiert werden
können.
Der Graph Constant zeigt die Werte-Konstanten in ISOM/L.
Sie können wie durch die Graphen DecNumber, HexNumber
oder StringLiteral vorgegeben konstruiert werden oder sind
durch die Schlüsselwerte true und false repräsentiert.
94 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 11: Bezeichner in ISOM/L
Abbildung 12: Konstanten und Zeichenkettenliterale
Die Bezeichner und Konstanten bilden zusammen mit den Schlüsselwörtern und Sonderzeichen (z.B. Klammern) den Wortschatz
von ISOM/L. Mithilfe dieses Wortschatzes kann der Aufbau
95 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
von ISOM/L-Programmen anhand der Syntaxgraphen definiert werden.
9.3
Syntaktischer Aufbau einer ISOM/L-Datei
Die Definition einer ISOM/L-Datei ist in Abbildung 13 als Graph
mit dem Namen IsomProgram dargestellt.
ISOM/L-Dateien beginnen mit einer Sequenz von using-Anweisungen, dem UsingImport und Deklarationen anonymer Namensräume
als AnonymousNamespace. Optional folgt danach eine Namensraumdeklaration Namespace, die einen nicht anonymen
Namensraum beschreibt. Die Graphen dieser Sprachelemente
sind in Abbildung 13 dargestellt.
96 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 13: Grammatikaufbau auf der obersten Ebene in ISOM/L
97 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Mithilfe von using und einem Bezeichner lassen sich Textdefinitionen und Funktionen anderer Dateien importieren. Optional
lässt sich durch „.*“ angeben, dass alle Namensräume einbezogen
werden, die eine Ebene unterhalb des angegeben Namensraums
liegen. Zum Beispiel ist using Isom.Base.* ein syntaktisch
gültiger UsingImport.
Ein nicht anonymer Namensraum Namespace besteht aus Annotationen, einem Namen, der ihn identifiziert, sowie aus Funktionsdeklarationen und Textdefinitionen, die innerhalb der
geschweiften Klammern in beliebiger Reihenfolge stehen können.
Ein Beispiel für einen syntaktisch gültigen Namensraum ist
namespace Isom.Empty{ }.
Zur Angabe eines Namensraums bzw. ISOM/L-Typs werden zusammengesetzte Bezeichner Identifier benutzt. Es wird zusätzlich
festgelegt, dass die zwei letzten verketteten ShortIdentifier
oder SubsequentShortIdentifier in diesem Identifier unterschiedlich sind. Ein Namensraum wie zum Beispiel
Isom.Global.Global wird somit ausgeschlossen. Diese Einschränkung hat ihren Grund in der benötigten Zuordenbarkeit des Ablagepfads der Programme im Dateisystem. Das Konzept der
Dateiablage wird in Kapitel 5.1 erläutert.
Anonyme Namensräume zeichnen sich dadurch aus, dass sie keinen
Namensraumbezeichner enthalten. Eine Sequenz anonymer Namensräume kann einem nicht anonymen Namensraum vorangestellt
werden. Annotationen, Funktionen und Textinhalte solcher Namensräume werden beim Einlesen des Programms automatisch als
Teil des nicht anonymen Namensraums übernommen.
Der Graph Extension zeigt die Erweiterung einer Klasse des
ISOM-Objektmodells. Sie wird mithilfe des Schlüsselworts
extension definiert.
Eingeleitet durch deftext wird eine TextDefinition angegeben,
deren Texte einer externen Textverwaltung zur Verfügung gestellt werden können. Eine Textdefinition enthält danach eine
Angabe zur Textkategorie, zum Beispiel ButtonText als Text für
eine Schaltfläche. Darauf folgen der Name, der den Text innerhalb des Namensraums identifiziert, und ein Standard-Ausgabetext. Dies ermöglicht die Übersetzung der Texte, die in den
Programmen enthalten sind, in verschiedene Sprachen. Gleichzeitig können diese Texte durch ihren eindeutigen Namen zugeordnet und als Zeichenketten typisiert werden. Ein Beispiel
für die gültige Syntax einer Textdefinition ist
deftext ButtonText BTN_OK “Ok“.
98 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
9.4
Syntax einer ISOM/L-Funktionsdeklaration
Abbildung 14: Funktionsdeklarationen in ISOM/L
Der notwendige Teil einer Funktionsdeklaration beginnt mit
einem Typnamen in Form eines zusammengesetzten Bezeichners
oder eines Typ-Kurznamens. Es folgt ein Funktionsname, der
ein einfacher Bezeichner ist.
Zwischen runden Klammern werden die Parameter der Funktion
definiert, danach folgt ein SimpleStatement, das den Funktionsrumpf enthält. SimpleStatement wird in Kapitel 9.5 erläutert.
Die Syntax der Parameterangaben wird durch den Graphen
ParameterDeclarations abgebildet. Sie besteht aus einer
Liste von einzelnen Parameterdeklarationen, die durch Kommata
getrennt sind. Die Liste darf leer sein. Eine einzelne Parameterdeklaration enthält die Angabe eines Typnamens und
eines Parameternamens, die nach den Graphen für Identifier
und ShortIdentifier gebildet werden. Zum Beispiel ist
Number Add(Number other); eine zulässige Funktionsdeklaration.
99 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
9.5
Syntax der ISOM/L-Anweisungen
Abbildung 15 und Abbildung 16 zeigen alle Anweisungen, die von
ISOM/L erkannt werden.
SimpleStatement stellt eine Anweisung dar, die, falls sie eine
Blockanweisung ist, keinen abschließenden Block enthalten kann.
Statement stellt eine Anweisung dar, die einen abschließenden
Block enthalten kann, auch wenn sie eine Blockanweisung ist.
Beide unterscheiden sich nur darin, ob als Blockanweisung
SimpleBlockStatement oder BlockStatement zugelassen ist.
SimpleBlockStatement ist eine Blockanweisung, auf die kein abschließender Block folgen darf. Auf BlockStatement darf dagegen
ein abschließender Block folgen.
Dabei sind die komplexeren Anweisungstypen in den Syntaxgraphen
von Abbildung 15 und Abbildung 16 einzeln als Syntaxgraphen
dargestellt.
Abbildung 15: Definition von Anweisungen in ISOM/L (1)
100 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 16: Definition von Anweisungen in ISOM/L (2)
Die einfachen Anweisungen umfassen break-, continue und leave
sowie die Funktionsrückgabe durch return. Ausdrücke gefolgt von
einem Semikolon können als Anweisungen verwendet werden, wie
zum Beispiel der Aufruf einer Funktion, der als Ausdruck durch
den Graphen Expression in Abbildung 19 definiert ist.
Es gibt eine Zuweisungsanweisung und weitere komplexere Anweisungen wie die Blockschachtelung von Anweisungen, die Programmverzweigungen durch die if- und switch-Anweisung und die
Programmschleife, eingeleitet durch das Schlüsselwort while.
101 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 17: Definition von komplexen Anweisungen in ISOM/L (1)
102 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Abbildung 18: Definition von komplexen Anweisungen in ISOM/L (2)
Eine Variablendeklaration besteht syntaktisch aus einem zusammengesetzten Bezeichner, der die Typangabe der Variablen ist,
und einem einfachen Bezeichner, der der Name der Variablen
ist, gefolgt von einem Semikolon „;“. Optional lässt sich ein
Ausdruck, der der Variable zugewiesen ist, mittels „=“ angeben.
Zum Beispiel ist Number n = f(); eine Variablendeklaration.
Durch geschweifte Klammern lässt sich eine Blockanweisung angeben, die beliebig viele Anweisungen enthalten kann.
ISOM/L verwendet für Programmverzweigungen die zwei Formen if
und switch. Die Sprache besitzt ein Schleifenkonstrukt, das
durch while eingeleitet wird, wie in Abbildung 17 veranschaulicht. Bei der while-Schleife ist zu beachten, dass der abschließende Block nicht bei jedem Schleifendurchlauf, sondern
nach dem Verlassen der Schleife genau einmal ausgeführt wird.
Daher wurde in der Darstellung SimpleBlockStatement und
Finalizer nicht zu BlockStatement zusammengefasst.
103 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
9.6
Syntax der ISOM/L-Ausdrücke
Abbildung 19 enthält alle gültigen Ausdrücke, die in Ausdrucksanweisungen als rechte Seite von Zuweisungen, als Bedingungen
oder als Teil der return-Anweisung verwendet werden können.
Dies sind Konstanten, einfache Bezeichner, die für Variablen
oder durch deftext eingeführte Textbezeichner stehen, das
Schlüsselwort this oder Funktionsaufrufe. In Funktionsaufrufen
kann das Schlüsselwort base verwendet werden, um bei überschriebenen Fachfunktionen die Basisimplementierung auszuführen.
Die Syntax erlaubt Funktionsaufrufen die Angabe von übergebenen
Parametern, die ihrerseits als Ausdrücke definiert sind.
Mehrere Übergabeparameter werden durch Kommata getrennt. Zum
Beispiel ist f(x, g(), true) ein Funktionsaufruf. Er enthält
einen zweiten Funktionsaufruf als Parameter.
Abbildung 19: Definition von Ausdrücken in ISOM/L
104 von 109
9 Syntaxgraphen von ISOM/L
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Verzeichnisse und Anhänge
A
Verzeichnis der Tabellen
Tabelle 1: Arten von Bedienelementen ............................. 71
Tabelle 2: Kommandozeilenparameter für den Kommandozeilenmodus ... 88
Tabelle 3: Befehle im ISOM-Einzelschrittmodus .................... 90
B
Verzeichnis der Abbildungen
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
C
1: Ausführung des Programms „Hello, world“ ............. 10
2: Finden von Programmen ............................... 57
3: Leeres Dialogfenster ................................ 70
4: Dialogfenster mit Bedienelementen ................... 73
5: Taschenrechner – Eingabe der Operanden .............. 83
6: Taschenrechner – Auswahl des Operators .............. 84
7: Taschenrechner – Ergebnis ........................... 84
8: Grundelemente von Syntaxgraphen ..................... 91
9: Grundelemente der Syntax von ISOM/L ................. 92
10: Darstellung von numerischen Literalen in ISOM/L .... 94
11: Bezeichner in ISOM/L ............................... 95
12: Konstanten und Zeichenkettenliterale ............... 95
13: Grammatikaufbau auf der obersten Ebene in ISOM/L ... 97
14: Funktionsdeklarationen in ISOM/L ................... 99
15: Definition von Anweisungen in ISOM/L (1) .......... 100
16: Definition von Anweisungen in ISOM/L (2) .......... 101
17: Definition von komplexen Anweisungen in ISOM/L (1) 102
18: Definition von komplexen Anweisungen in ISOM/L (2) 103
19: Definition von Ausdrücken in ISOM/L ............... 104
Verzeichnis der Codeauszüge
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
105 von 109
Verzeichnisse und Anhänge
1:
2:
3:
4:
5:
6:
7:
8:
9:
HelloWorld.is ....................................... 9
Kommentare ......................................... 12
HelloWorldWithComments.is .......................... 14
HelloWorldWithUsing.is ............................. 15
HelloWorldWithUsing2.is ............................ 16
HelloWorldWithDeftext.is ........................... 17
IfElseStdio.is ..................................... 20
IfElseEnv.is ....................................... 22
Bedingte Codeausführung mit switch/case/default .... 23
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
Codeauszug
106 von 109
Verzeichnisse und Anhänge
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
Factorial.is ......................................
FinallyBlock.is ...................................
FinallyBlockAndLeave.is ...........................
FinallyBlockAfterIfElse.is ........................
FinallyBlockAfterSwitch.is ........................
FinallyBlockAfterWhile.is .........................
Variablendefinition und Zuweisung .................
Beispiele für Literale ............................
Beispiele für Fachfunktionen der Basisobjekte .....
ParameterPassing.is ...............................
Unzulässige Zuweisung an Parametervariablen .......
Beispiel für einen Namensraum mit Funktionen ......
Fachfunktionen Objekterzeugung/-bereitstellung ....
Ungültig-Machen von Objektinstanzen mit Void() ....
Fehlerhafte Verwendung von Void() .................
Fehlerbehandlung mit Boolean.Failed ...............
CheckVoid.is und Ausgabe ..........................
ExNumberList.is ...................................
ExStringDictionary.is .............................
Erweiterung von Isom.Base.String ..................
Fibonacci.is ......................................
Beispiele für gültige Namensraumbezeichner ........
Beispiele für Importanweisungen ...................
Beispiel für Datei TextCategoryData.xml ...........
Beispiele für Textdefinitionen ....................
Einbinden ausgelagerter Quelltextteile ............
Stdio.is ..........................................
OutputText.is .....................................
WriteXml.is .......................................
Ergebnis der Ausführung von Codeauszug 38 .........
LoadXml.is ........................................
ExUserRequest.is ..................................
ExUserRequest2.is, CreateNewRequest() .............
ExUserRequest3.is, erw. main()-Funktion ...........
Schrittsteuerung durch den Assistenten ............
Wizard.is .........................................
Manuelle Schrittsteuerung durch Programmierer .....
Aufruf des ISOM-Interpreters ......................
Aufruf eines Programms im Einzelschrittmodus ......
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
24
26
27
28
29
30
32
33
34
37
38
39
40
42
42
43
45
47
49
53
55
56
58
59
60
60
62
64
65
65
66
70
72
76
77
82
86
88
89
Excellence in Automotive Computing.
Informationstechnik München
D
E
Referenzen
Referenz
auf
[1]
IFS Informationstechnik München: ISOM Didact, http://www.ifsit.de/index.php?id=13, abgerufen am 22.02.2012.
[2]
IFS Informationstechnik München: BZ-8361 ISOM/L-Bibliothek für
Serviceautoren, http://www.ifs-it.de/index.php?id=13, abgerufen am:
22.02.2012.
[3]
IFS Informationstechnik München: BZ-12907 Glossar der Serviceplattform Taurus®, http://www.ifs-it.de/index.php?id=taurus,
abgerufen am: 22.02.2012.
Anhang: Überblick über die Schlüsselwörter in ISOM/L
In der nachfolgenden Tabelle sind einundzwanzig Schlüsselwörter, die ISOM/L verwendet, sowie Präprozessoranweisungen
im Überblick aufgelistet. Schlüsselwörter können nicht als
Bezeichner, zum Beispiel als Variablennamen, verwendet werden.
Schlüsselwörter sind wie Bezeichner bezüglich ihrer Groß- und
Kleinschreibung eindeutig festgelegt.
Schlüsselwort
Verwendung
base
Aufruf der Basisimplementierung einer Fachfunktion, die
in einer extension-Deklaration überschrieben wurde
break
Abbruch-Anweisung
case
Angabe eines Falls in einer switch-Konstruktion
continue
Anweisung zur erneuten Auswertung einer Schleifenbedingung
default
Angabe des Standardfalls in einer switch-Konstruktion
deftext
Textdefinition
else
optionaler, zweiter Fall einer if-Anweisung
extension
Erweiterung einer Klasse des ISOM-Objektmodells
false
Konstante des Wahrheitswerts „falsch“
finally
abschließender Block
if
Einleitung einer Fallunterscheidung mit zwei Fällen
107 von 109
Verzeichnisse und Anhänge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Schlüsselwort
Verwendung
#include
.isi-Datei einfügen
leave
Anweisung zum Sprung in einen abschließenden Block
namespace
Namensraumdeklaration
objectbound
Kennzeichnung einer instanzgebundenen Fachfunktion
return
Funktionsrückgabe
switch
Fallunterscheidung mit beliebig vielen Fällen und
einem Standardfall
this
Verwendung der Objektinstanz in einer extensionDeklaration
true
Konstante des Wahrheitswerts „wahr“
using
Namensraumeinbindung
while
Schleifenkonstruktion
108 von 109
Verzeichnisse und Anhänge
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Excellence in Automotive Computing.
Informationstechnik München
Vorgang: BZ-9758
Kurztitel: Einführung ISOM/L
Version: 3.1, 18. Juni 2013
Herunterladen