TSkript - TScript
![]() | |
| Entwickler | Ekky-Software |
|---|---|
| Stabile Version | 1.4 / 1. Juli 2012
|
| Geschrieben in | C++ |
| Betriebssystem | Windows und Linux |
| Typ | Skriptsprache |
| Lizenz | Kostenlos (proprietär) |
| Webseite | www |
TScript ist eine objektorientierte einbettbare Skriptsprache für C++ , die hierarchische transiente typisierte Variablen (TVariable) unterstützt. Sein Hauptentwurfskriterium besteht darin, eine Skriptsprache zu erstellen, die mit C++ kommunizieren kann, Daten transformiert und das Ergebnis zurückgibt. Dadurch können C++-Anwendungen ihre Funktionalität nach der Installation ändern.
Hallo Welt Beispiel
Das grundlegende "Hallo Welt!" TScript-Beispiel.
CTScript ts;
ts.SetParameter(CTScript::SOURCE_STRING,0,TEXT("main(){")
TEXT(" System::MessageBox(L\"Hello World!\");")
TEXT("}"));
ts.ExecuteStaticMethod();
TVariables
Die Standardvariable kann als feste Daten wie Boolean, Integer oder Decimal und als Variable variabler Länge wie ASCII-String, Breitzeichen-String oder Binär-String gebildet werden. Der Typ der Daten kann verwendet werden, um eine Variable zu definieren, oder der Typ kann explizit deklariert werden, so dass beispielsweise der Code - variable myInteger = 0;eine Variable namens myInteger erstellt und ihr den Wert Null zuweist. Ein Integer-Typ kann auch als - deklariert werden Integer myInteger;und sein Standardwert wird auf Null gesetzt.
TVariable sind hierarchisch aufgebaut und ähneln XML- , JavaScript- und PHP- Variablen sehr.
Der Typ TVariable ist auch vorübergehend, da ein Integer in einen AString geändert werden kann, indem ihm ein Zeichenfolgenwert zugewiesen oder die Variable in einen AString umgewandelt wird. Nachdem beispielsweise eine Integer-Variable erstellt und verwendet wurde, kann sie neu zugewiesen werden, indem sie einem AString gleichgesetzt wird.
TVariables können auch verwendet werden, um eine Reihe von TVariablen zu speichern. Sobald eine gültige Variable erstellt wurde, kann die Indexnotation des Arrays verwendet werden, um sie in ein Array umzuwandeln, so dass beispielsweise der Code - variable list = {0,2,4,6};ein Array mit vier Elementen erstellt. Der TVariable-Typ für "list.type" ist der einer Struktur und jedes Element von list[0].typewird eine ganze Zahl sein.
Klassen in TScript ähneln Arrays in der Art, wie TVariable sie behandelt, verwenden jedoch Strings als Array-Skripten. Zum Beispiel erstellt der Code - eine strukturierte Variable where list. Montag ist wahr und list.Tuesday ist falsch. Im nativen C++-Code sind strukturierte TVariable-Elemente in C++ durch - oder durch entweder oder im nativen Code zugänglich .
variable list = {"Monday" => true, "Tuesday" => false};list["Monday"];list.Mondaylist["Monday"]
Definierte Variablen (Klassen)
TScript unterstützt hierarchische Variablen und kann sowohl primitive als auch komplexe Variablen innerhalb derselben Variablenstruktur speichern. Dadurch wird jegliche Notwendigkeit für einen eindeutigen Unterschied zwischen Primitiven und strukturierten Daten beseitigt, wodurch die Klassenstruktur zu einer logischen Gruppierung von Funktionalitäten und nicht zu einem Datenspeichertyp wird.
TScript implementiert Konzepte der Vererbung und Codekapselung durch definierte Variablen. Der folgende Codeausschnitt zeigt beispielsweise definierte Variablen Foo und Bar , die einen Konstruktor unterstützen.
variable Bar{
Integer minimum, maximum;
Bar(){
this.minimum = 1;
}
}
variable Foo extends Bar{
WString name;
Foo(WString name){
this.name = name;
this.Bar();
}
}
public main(){
Foo foo(L"Goo");
System::MessageBox(foo.ToString());
}
Funktionsdeklarationen
Ein weiteres auffallendes Merkmal von TScript sind die Funktionsdeklarationen, die Ausgabeparameter anstelle von Rückgabewerten verwenden und diese syntaktisch unterstützen. Die Standardfunktion in vielen Verfahrenssprachen hat nach Algol die Form:
- [ Rückgabetyp ] < Funktionsname >([ Eingabevariable ], ...) .
In TScript wurde dieses Muster in die Form geändert:
- < Funktionsname >([ Eingangsvariable ],... :[ Ausgangsvariable ],...) .
Diese Änderung hat zwei Dinge bewirkt, erstens erlaubt sie mehrere Ausgabevariablen und zweitens hat sie die return-Anweisung in eine Fehlerbehandlungsfunktion geändert.
Dadurch, dass Funktionen eine Liste von Eingabe- und Ausgabevariablen haben, die durch die Semispalte ":" getrennt sind, wurde der normale Ablauf des Aufrufs und der Verwendung der Funktion geändert. Dadurch entfällt ein Teil der in C/C++ üblichen Verwendung von Referenzzeigern zur Rückgabe mehrerer Variablen, und die Verwendung von Referenzen in den meisten anderen Skriptsprachen wird tatsächlich verhindert, was die Verwendung einer Struktur oder eines Arrays zur Rückgabe mehrerer Werte erzwingt.
Die zweite bemerkenswerteste an den Aufrufkonventionen ist , dass nun alle Funktionen verfügen über einen integrierten Fehler Zweck der Handhabung ähnlich wie und von C ++ und Java. Da in TScript alle Funktionen einen Fehler zurückgeben, funktioniert die return-Anweisung ähnlich wie die throw-Anweisung. Zum Beispiel die Anweisung:- return error = "Habe eine Fehlermeldung"; beendet die Funktion und gibt die Fehlermeldung zurück. Alternativ die leere Anweisung;- return; beendet die Funktion, gibt aber keinen Fehler zurück.
try{…}catch(…){…}throw new Exception()
Beispiel für mehrere Rückgabewerte
public TextExtent(WString text : Integer width, Integer height){
text = text.Fragment(L"\n");
for(height = width = 0; height < text.length; height++){
if(width < text[height].length) width = text[height].length;
}
}
Kurzschreibweise
Der Einfachheit halber bietet TScript einen Funktionsaufruf in Kurzform für den Fall, dass es nur eine zurückgegebene Variable gibt. Diese Notation von ersetzt den Fall von . Diese kurze Notation verhindert, dass der aufrufende Code Fehler abfängt, und diese werden automatisch an den übergeordneten Aufrufcode zurückgegeben.
function(: variable); for variable = function();
Fehlerbehandlung
Die Fehlerbehandlung in vielen anderen Sprachen erfolgt durch die Verwendung von Ausnahmen . TScript verwendet einen ähnlichen Prozess der Fehlerbehandlung, wenn auch etwas anders. TScript hat eine globale Fehlervariable ähnlich dem traditionellen errno in C, obwohl die Fehlervariable in TScript sowohl einen Fehlercode als auch eine detaillierte Fehlermeldung enthalten kann.
In vielen Sprachen, die die Syntax verwenden, wird der Fehler über die catch-Anweisung zurückgegeben, und dies kann den Betriebsablauf des Codes in Situationen, in denen einige Fehler behebbar sind, umständlich machen. TScript verwendet die Notation, die es dem Aufrufcode ermöglicht, den Fehler zu filtern, möglicherweise den Fehler zu beheben und zum normalen Betrieb zurückzukehren oder den Fehler an seine eigene aufrufende Funktion zurückzugeben.
try{...}catch(...){...}if(...){...} else{...}
Beispiel für Rückgabe- und Bearbeitungsfehler
function(){return error = -1;}
public main(){
if(!function()){
if(error != -1) return error;
}
System::MessageBox(L"function executed correctly");
}
Laufzeitverknüpfung
C++ unterstützt das Überladen von Funktionen , wodurch Funktionen denselben Namen haben können, während sie sich durch ihre Eingabeparameter unterscheiden. Dies führt bei TScript zu einem Problem bei der Unterstützung von Variablen mit losem Typ , da es keine Möglichkeit gibt, den Typ einer Variablen zu bestimmen, bis die Software ausgeführt wird.
Um diesem Problem zu begegnen, wurde TScript mit Laufzeitverknüpfung geschrieben. Dies ist der Fall, wenn die bestimmte aufgerufene Funktion vom Typ der Variablen abhängt, wenn die Funktion aufgerufen wird.
Dies ist eine ungewöhnliche Taktik, die einige zusätzliche Vorteile hat. Erstens bedeutet dies, dass Funktionen vor ihrer Verwendung nicht deklariert werden müssen, zum Beispiel können sich in C++ zwei Funktionen gegenseitig aufrufen, wie und . In dieser Situation muss der Prototyp erstellt werden, damit der ihn aufrufen kann. Die Laufzeitverknüpfung von TScript bedeutet, dass die Funktionen in beliebiger Reihenfolge deklariert werden können, ohne dass Prototypen erstellt werden müssen. Dies kann das Schreiben von Code für weniger erfahrene Programmierer viel einfacher machen, sodass sie sich auf die Logik der Software und nicht auf die Anforderungen der Sprache konzentrieren können.
void Foo(){ Bar();}void Bar(){Bar();}Bar()Foo()
Durch die Laufzeitverknüpfung kann die Sprache auch die Laufzeitcodierung mit Methoden wie AddMethod und AddDefinedVariable unterstützen . Dadurch können TScript-Programme selbst schreiben. Wenn Sie beispielsweise die SOAP- Schnittstelle verwenden, wird die Remote- WSDL in die Skriptbibliothek codiert, sodass die darin enthaltenen Funktionen so aufgerufen werden können, als ob sie zur Entwurfszeit codiert wären. Darüber hinaus ist es auch möglich, Code zu schreiben, der für sich selbst lernen kann und neue Funktionen schreibt, wenn er sie benötigt.
Bibliotheken dynamisch verknüpfen
TScript gehört zu einer kleinen Gruppe von Skriptsprachen, die die Funktionalität zum dynamischen Laden und Verknüpfen vorhandener gemeinsam genutzter Bibliotheken bieten . Java über sein JNI und VB6 sind zwei weitere Skriptsprachen, die das Schreiben von Code ermöglichen, der eine Drittanbieterbibliothek lädt und über seine native Schnittstelle ausgeführt wird. Dies gibt TScript die Möglichkeit, eine Fülle von bereits existierenden Funktionen und Code in verschiedenen Sprachen zu verwenden, und dies kann erfolgen, ohne dass die Schnittstelle der gemeinsam genutzten Bibliothek geändert oder mit dem Quellcode kompiliert werden muss.
Speicherverwaltung
TScript verwendet die standardmäßige C++-Klassenkapselung, um Speicherressourcen zuzuweisen und freizugeben. Dies bedeutet, dass der gesamte zugewiesene Speicher freigegeben wird, wenn die Variable, die ihn enthält, zerstört und anders als das Garbage Collection-Modell von Java oder das Referenzzählmodell von .NET- Sprachen verwendet wird.
Betriebssystemressourcen wie Dateien, Sockets und Verschlüsselungsschlüssel werden über einen Referenzzählmechanismus ähnlich wie bei .NET verwaltet, sodass sie freigegeben werden, sobald keine Variablen mit ihren Werten vorhanden sind.
Proaktive Sicherheit
Mit der Möglichkeit, vorhandene gemeinsam genutzte Bibliotheken zu laden, kann das Skript auf alle Berechtigungen zugreifen, die dem Benutzer gewährt wurden, der es ausführt. Zum Schutz vor bösartigem Code müssen jedem Skript alle Ressourcen über die grundlegende Speicherzuweisung hinaus gewährt werden. Dazu gehört auch die Möglichkeit, Meldungsfelder zu verwenden, um den Benutzer aufzufordern, Lese- und/oder Schreibzugriff auf beliebige Dateien oder Verzeichnisse zu erhalten oder die Internetverbindung zu verwenden.
Diese Sicherheitsarchitektur wurde entwickelt, um die Ausführung von Skripten auf ähnliche Weise wie bei JavaScript zu ermöglichen und gleichzeitig die Nützlichkeit leistungsfähigerer Skriptsprachen wie PERL zu ermöglichen .
