Weitere Sprachfeatures
Nach einer etwas längeren Auszeit aufgrund von Serverproblemen ist der Blog nun wieder da. In diesem Zuge wurde der Blog auch gleich auf schönere Füße gestellt.
So ist er nicht mehr unter http://coltishware.com/~chest/ erreichbar, sondern nur noch ausschließlich unter der Subdomain http://chest.coltishware.com .
Aus diesem Grund müssen auch diejenigen, die den RSS-Feed abonniert haben, dies noch einmal tun, damit die Adressen übereinstimmen.
Sollte es noch einmal vorkommen, dass der Server ausfällt, so wird dieser Blog, wie dieses Mal, wahrscheinlich für die diese Zeit unter http://coltishware.blogspot.com zu finden sein.
Aber nun zum eigentlichen Thema...
Ich wurde letztens darum gebeten, eine Übersicht über die zeitliche Planung des Projektes abzugeben. Da solche zeitlichen Planungen sich nur selten an die Wirklichkeit halten, habe ich stattdessen einen groben Ablaufplan skizziert, der die einzelnen Phasen der Entwicklung zeigt.
Zur Zeit befinden wir uns beim ersten Hauptpunkt - ohne Übersicht der Sprachfeatures kann man keine optimierte ByteCode-Sprache entwickeln.
Und da es bezüglich der Features noch etwas mager aussieht, gibt es noch ein paar neue, die ich an dieser Stelle vorstellen möchte.
Zum einen wurde noch nicht erwähnt, dass Chest case-insensitive sein wird, sprich: in der Sprache wird nicht zwischen Groß- und Kleinschreibung von Bezeichnern und Befehlen unterschieden werden.
Alles andere führt unweigerlich zu Fehlern, die auch problemlos umgangen werden können.
Desweiteren wurde ich darauf hingewiesen, dass ich mich noch nicht zu dem Thema Generics geäußert habe. Natürlich werden diese in der Sprache integriert sein.
In diesem Zuge wird ein weiteres Sprachfeature Einzug in Chest halten. An dieser Stelle möchte ich mich herzlich bei Christian Rehn (alias R2C2) bedanken, durch den ich die Idee für dieses wirklich wunderbare Sprachfeature überhaupt erst bekommen habe.
Zur Zeit hat es noch den Namen Code Injection, jedoch hoffe ich, dass mir früher oder später noch ein besserer Name dafür einfallen wird.
In bisherigen Szenarien ist es vor allem in Verbindung mit Generics aufgetreten und wird dort sicherlich gute Dienste tun.
Erst einmal ein Quelltextbeispiel, um daran die Funktion zu erklären:
Nun zur Erklärung des Codes:
Die Methode find() (hier von einer imaginären Klasse MyArray) ist hier als providing deklariert. Dieser Punkt ist wichtig, um dem Interpreter zu sagen, dass die Methode es erlaubt, eigenen Code in ihr auszuführen.
Zudem sind neben dem set-Feld zusätzlich noch die Felder provide und retrieve definiert. Diese sind für die Ausführung des injizierten Codes sehr wichtig: sie stellen den Kopf des injizierten Codes dar. provide steht dabei für die Werte die dem injizierten Code übergeben werden und retrieve steht für die Werte, die vom injizierten Code zurückgegeben werden.
Mit provide(Self[Index]) wird der injizierte Code aufgerufen. Da es sich intern um eine normale Methode handelt, kann demzufolge mit provide(Self[Index]).Return auch der Rückgabewert der Methode angesprochen werden. Der eigentlich ausgeführte Text ist dabei Return = (Item.Name = 'SomeText');.
Diese Variante erpart viel Tipparbeit im Vergleich zur Übergabe von Methodenreferenzen und hat zudem die Möglichkeit, dass für verschiedene Implementierungen von Generics verschieder Code eingefügt und ausgeführt werden kann.
So ist es erstmalig möglich, eine Suchfunktion in einem Generic zu implementieren und lediglich die Überprüfung der genauen Felder auszulagern.
Ich hoffe, diese Erklärung war zumindest annähernd verständlich. Das Feature selbst ist einfach zu nutzen, jedoch schwer zu erklären.
Sollte es also Fragen geben: einfach Fragen... ;-)
Bis demnächst...
Wirsing
So ist er nicht mehr unter http://coltishware.com/~chest/ erreichbar, sondern nur noch ausschließlich unter der Subdomain http://chest.coltishware.com .
Aus diesem Grund müssen auch diejenigen, die den RSS-Feed abonniert haben, dies noch einmal tun, damit die Adressen übereinstimmen.
Sollte es noch einmal vorkommen, dass der Server ausfällt, so wird dieser Blog, wie dieses Mal, wahrscheinlich für die diese Zeit unter http://coltishware.blogspot.com zu finden sein.
Aber nun zum eigentlichen Thema...
Ich wurde letztens darum gebeten, eine Übersicht über die zeitliche Planung des Projektes abzugeben. Da solche zeitlichen Planungen sich nur selten an die Wirklichkeit halten, habe ich stattdessen einen groben Ablaufplan skizziert, der die einzelnen Phasen der Entwicklung zeigt.
- Sprachfeatures sammeln und in einen einheitlichen Sprach(-syntax-)kontext einfügen
- anhand der sprachfeatures den benötigten bytecode ausarbeiten (was muss die VM können, was kann durch Programmierung in ByteCode emuliert werden)
- die VM schreiben
- einen Source-zu-ByteCode-Compiler schreiben
- evtl. fehler an der Sprache ausmerzen
Zur Zeit befinden wir uns beim ersten Hauptpunkt - ohne Übersicht der Sprachfeatures kann man keine optimierte ByteCode-Sprache entwickeln.
Und da es bezüglich der Features noch etwas mager aussieht, gibt es noch ein paar neue, die ich an dieser Stelle vorstellen möchte.
Zum einen wurde noch nicht erwähnt, dass Chest case-insensitive sein wird, sprich: in der Sprache wird nicht zwischen Groß- und Kleinschreibung von Bezeichnern und Befehlen unterschieden werden.
Alles andere führt unweigerlich zu Fehlern, die auch problemlos umgangen werden können.
Desweiteren wurde ich darauf hingewiesen, dass ich mich noch nicht zu dem Thema Generics geäußert habe. Natürlich werden diese in der Sprache integriert sein.
In diesem Zuge wird ein weiteres Sprachfeature Einzug in Chest halten. An dieser Stelle möchte ich mich herzlich bei Christian Rehn (alias R2C2) bedanken, durch den ich die Idee für dieses wirklich wunderbare Sprachfeature überhaupt erst bekommen habe.
Zur Zeit hat es noch den Namen Code Injection, jedoch hoffe ich, dass mir früher oder später noch ein besserer Name dafür einfallen wird.
In bisherigen Szenarien ist es vor allem in Verbindung mit Generics aufgetreten und wird dort sicherlich gute Dienste tun.
Erst einmal ein Quelltextbeispiel, um daran die Funktion zu erklären:
//angenommen, MyArray.find ist so definiert:
find set (Result as LongInt)
provide (Item as)
retrieve (Return as Boolean) is providing;
{...}
find set (Result as LongInt)
provide (Item as)
retrieve (Return as Boolean)
variables
Index as LongInt;
variables;
begin
Result = -1;
for Index = Low(Self) to High(Self) do
begin
// if retrieve(provide(Self[Index])).Return do
if provide(Self[Index]).Return do
begin
Result = Index;
break;
end;
end;
end;
{...}
//Aufruf von MyArray.find() mit
//zusätzlich injiziertem Code
//und direktem Auslesen des
//Rückgabewertes "Result"
myResult = MyArray.find()
begin
Return = (Item.Name = 'SomeText');
end.Result;
Nun zur Erklärung des Codes:
Die Methode find() (hier von einer imaginären Klasse MyArray) ist hier als providing deklariert. Dieser Punkt ist wichtig, um dem Interpreter zu sagen, dass die Methode es erlaubt, eigenen Code in ihr auszuführen.
Zudem sind neben dem set-Feld zusätzlich noch die Felder provide und retrieve definiert. Diese sind für die Ausführung des injizierten Codes sehr wichtig: sie stellen den Kopf des injizierten Codes dar. provide steht dabei für die Werte die dem injizierten Code übergeben werden und retrieve steht für die Werte, die vom injizierten Code zurückgegeben werden.
Mit provide(Self[Index]) wird der injizierte Code aufgerufen. Da es sich intern um eine normale Methode handelt, kann demzufolge mit provide(Self[Index]).Return auch der Rückgabewert der Methode angesprochen werden. Der eigentlich ausgeführte Text ist dabei Return = (Item.Name = 'SomeText');.
Diese Variante erpart viel Tipparbeit im Vergleich zur Übergabe von Methodenreferenzen und hat zudem die Möglichkeit, dass für verschiedene Implementierungen von Generics verschieder Code eingefügt und ausgeführt werden kann.
So ist es erstmalig möglich, eine Suchfunktion in einem Generic zu implementieren und lediglich die Überprüfung der genauen Felder auszulagern.
Ich hoffe, diese Erklärung war zumindest annähernd verständlich. Das Feature selbst ist einfach zu nutzen, jedoch schwer zu erklären.
Sollte es also Fragen geben: einfach Fragen... ;-)
Bis demnächst...
Wirsing
