TeaAge Solutions (deutsch)

Hallo und herzlich willkommen bei TeaAge Solutions,
die Lösung für professionelle C++ Software Entwicklung und darüber hinaus.

🔥 NEUESTES UPDATE 🔥(01. September 2024): TeaScript 0.15.0 ist veröffentlicht. ☕ Es kommt mit einem Web Server / Web Client Module Preview, full JSON read/write Support und mehr. Weitere Infos im News-Blog-Post (Englisch).
☛☛☛ Download ist hier erhältlich. ☚☚☚

Um was geht es hier?

By the way: This webpage is available in English as well.

Vorstellung von TeaScript

In aller Kürze

TeaScript ist eine Multi-Paradigma Skriptsprache mit modernen Sprach-Features nah am C++ Syntax aber einfacher zu verwenden.

TeaScript kann verwendet werden um

  • C++ Anwendungen mit der TeaScript C++ Library dynamisch zur Laufzeit zu erweitern.
  • beliebige Aufgaben als eigenständige TeaScript-Datei mit der TeaScript Host Application auszuführen.

Mehr Informationen und die beeindruckendsten Highlights findet man unter Overview and Highlights.

Eingebettet in Anwendungen können C++ Variablen und Funktionen dem Skript zur Verfügung gestellt werden und umgekehrt. TeaScript Dateien können an Erweiterungspunkten ausgeführt werden und auf das Ergebnis des Skriptes, Variablen und Funktionen kann von der Anwendung aus zugegriffen werden.

Architektur Überblick von TeaScript bei Verwendung mit Erweiterungspunkten in C++ Software.
Architektur Überblick von TeaScript bei Verwendung mit Erweiterungspunkten in C++ Software.

Kürzlich habe ich einen Benchmark zum Testen und Vergleichen von TeaScript und dem Wettbewerber ChaiScript im rekursiven Ausrechnen der Fibonacci Zahl 25 erstellt. Das (wirklich erstaunliche) Ergebnis ist in der Abbildung zu sehen. Kürzer ist besser/schneller, länger ist langsamer. Mehr dazu im Blog Post.

Benchmark Ergebnis TeaScript VS ChaiScript.
Benchmark Ergebnis TeaScript VS ChaiScript.

Ein kommendes Highlight von TeaScript wird das Parallel Syntax Feature!

Hinter diesem Feature verbirgt sich eine wirklich beeindruckende Art um parallele / multi-threaded Abläufe zu realisieren direkt eingebaut in die Kern-Syntax von TeaScript. Für den Moment kann noch nicht mehr verraten werden. Mehr dazu hier auf der Seite und im Blog zu gegebener Zeit.

Das folgende Diagramm veranschaulicht grob, was mit der Parallel Syntax möglich sein wird (mehr dazu bald…).

Parallel Syntax Möglichkeiten von TeaScript veranschaulicht.
Parallel Syntax Möglichkeiten von TeaScript veranschaulicht.

Anwendungsbeispiel

Angenommen man ist Hersteller eines Software Produktes entwickelt in C++ und hat größtenteils zufriedene Kunden.

Jetzt jedoch gibt es ein paar, aber äußerst wichtige Kunden, die spezielle Anforderungen haben, die nicht einfach über statische Settings in Konfigurationsdateien abgebildet werden können, da sie zu speziell oder zu dynamisch sind.

Was könnte man dann machen?

Möchte man wirklich 1 bis N Spezialfälle in der C++ Software implementieren, alles neu kompilieren, testen und zum Kunden ausrollen?

Es gibt eine bessere Möglichkeit!

Man könnte Erweiterungspunkte in der C++ Software einmalig implementieren, welche die Möglichkeit bereitstellen auf Wunsch TeaScript Dateien auszuführen.
Damit können spezialisierte TeaScript Dateien für jeden besonderen Kunden bereitgestellt werden, ohne die C++ Software jedes Mal neu zu erzeugen und updaten zu müssen.

Schauen wir uns dazu schnell ein konkretes Beispiel an:
Ein Kunde pflegt eine riesige und proprietäre CSV Datei, welche nur bei diesem Kunden existiert und welche nicht großartig etwas mit den normalen Anwendungsfällen zu tun hat. Aber einige der Daten müssen genutzt werden um damit wichtige Konfigurations-Einstellungen zu erzeugen.

Jetzt kann ein TeaScript für diesen Kunden entwickelt werden, welches bei dieser Kundeninstallation zum Einsatz kommt und in der C++ Software ausgeführt wird.
Das Script öffnet und liest die CSV Datei, extrahiert und berechnet die relevanten Daten und stellt das Ergebnis als konkrete C++ Variable, struct oder Klassen-Instanz dem C++ Programm bereit.

Der C++ Code mit den Erweiterungspunkt könnte folgendermaßen aussehen:

class SomeData 
{
    /* some business related data here */
public:
    SomeData( long long param1, std::string const &param2, bool param3 );
};

void MyClass::SomeBusinessOperation()
{
    std::filesystem::path  script{"/path/to/script/custom.tea"};
    if( std::filesystem::exists( script ) ) {
        // tea script file with custom actions present, execute it.
        teascript::Engine  engine;
        // assuming the script returns true on success and providing the 3 
        // needed parameters for construct an instance of SomeData.
        try {
            if( engine.ExecuteScript( script ).GetValue<bool>() ) {
                SomeData data{ engine.GetVar( "param1" ).GetAsInteger(),
                               engine.GetVar( "param2" ).GetAsString(),
                               engine.GetVar( "param3" ).GetAsBool() };
                // do the thing with custom data.
                Apply( data );
            }
        } catch( ... ) {
            // specialized exceptions could be caught instead also.
        }
    } else {
        // default action...
        SomeData data = LoadDefaults();
        Apply( data ); // do the thing.
    }
}

Die TeaScript Datei „custom.tea“ könnte so aussehen:

def param1 := 0
def param2 := "foo"
def param3 := false

// note: the CSVFile interface is just for illustrating this example.
//       In the final release a different interface could be available instead.
def file := CSVFile( "path/to/data.csv" )
def tmp1 := param1
def tmp2 := param2
def tmp3 := param3

def success := repeat {
    def line := file.readLine()
    if( not line ) { // end of file reached
        stop with true // stops the loop with value true
    }
    // check for some error condition
    if( not isLineValid( line ) ) {
        stop with false // stops the loop with value false
    }
    tmp1 := computeMoreParam1( tmp1, line )
    tmp2 := computeMoreParam2( tmp2, line )
    tmp3 := computeMoreParam3( tmp3, line )
}

// save final values 
if( success ) {
    param1 := tmp1
    param2 := tmp2
    param3 := tmp3
}

// result of the script
success

Für andere Kunden können andere TeaScript Dateien bereitgestellt werden um die speziellen Kundenanforderungen zu erfüllen, oder keine Skriptdatei für den Normalfall.

Weitere Vorteile für den Einsatz von TeaScript an Erweiterungspunkten

  • Man kann sehr einfach die TeaScript Datei verändern oder erweitern ohne die C++ Software neu erstellen und ausrollen zu müssen um auf veränderte Anforderungen, Anwendungsfälle, etc. zu reagieren.
  • Die Skriptdateien könnten nicht nur vom Kern-Entwickler-Team verändert und entwickelt werden, sondern bei Bedarf und Wunsch auch vom 2nd oder 3rd Level Support, Pre-Sales, After-Sales, Solution Architects, Product Manager oder sogar Resellers oder der IT / den Operatoren des Kunden selbst.
  • Die Skripte sind im Regelfall einfacher zu testen und zu pflegen im Vergleich zum Testen und Pflegen von Spezialfällen in großen C++ Anwendungen, da die Scripte eigenständige Entitäten sind, die man losgelöst in z.B. Testumgebungen einsetzen kann.

Wie wäre es stattdessen mit Plugins?

Ja, natürlich wäre es auch möglich ein Plugin Interface in der C++ Software zu implementieren und alle Spezialfälle über in C++ erstellte Binär-Plugins abzubilden. Aber damit sind alle oben genannten Vorteile nicht vorhanden und man muss darüber hinaus auch noch das Plugin Interface und die API entwickeln und pflegen. Es ist viel einfacher und weniger komplex einfach TeaScript zu verwenden.

Warum sollte ich TeaScript und nicht eine andere Skriptsprache einsetzen?

Es gibt nur sehr wenige Skriptsprachen, die man ohne vorherige Installation auf dem Zielsystem nutzen kann. Zum Beispiel benötigt man für Python auf dem Zielsystem ein sauberes Python-Setup bevor man es nutzen kann. Außerdem ist die C++ Integration (falls überhaupt vorhanden), die möglichen Anwendungsfälle und die API meistens sehr beschränkt und zusätzlich schlecht designet.

Im Gegensatz dazu wird TeaScript als einfach zu benutzende C++ Bibliothek entwickelt, welche keine Installationen oder Veränderungen auf dem Zielsystem erfordert um funktionsfähig zu sein und eines der Hauptziele ist es in C++ Programmen genutzt zu werden. Die API ist nicht adaptiert oder nur ein Wrapper um anderes, sondern von Anfang an in C++ entworfen unter Berücksichtigung von modernen C++ Features und Anforderungen von C++ Entwicklern.

Die meisten Scripting Lösungen sind in C erstellt. Dies bringt viele Nachteile mit sich. TeaScript hingegen bietet eine hohe bidirektionale Interoperabilität aufgrund seiner inneren C++ Natur: Mehr Details hier.

Kann man TeaScript bereits in der Produktion verwenden?

Ja, das ist möglich. Ich zeige wieso und was man beachten sollte.

Erstens: Obwohl der 1.0 Release noch nicht erfolgt ist, durchwandert jedes Release eine 3-stufige Qualitätssicherung:

  • UnitTests – auf C++ als auch auf TeaScript Ebene (TeaScript Test-Skripte testen TeaScript Features).
  • Functional Tests durch Skripte.
  • Manuelle Tests.

Dadurch wird ein hohes Maß an Qualität sichergestellt.

Zweitens: Die TeaScript Syntax und die Sprachfeatures, welche bereits verfügbar sind, werden kompatibel gehalten, was durch die oben genannten Maßnahmen sichergestellt wird. Neue Versionen werden neuen Syntax und neue Features bekommen, aber alte Skripte werden weiterhin in 99% aller Fälle funktionieren (nur wenn die Skripte auf fehlerhaften oder unüblichen Verhalten aufbauen oder wenn schwerwiegende Ausnahmefehler vorliegen, könnte die Kompatibilität einmal nicht eingehalten werden.)

Drittens: Durch die ausschließliche Verwendung der High-Level API. Diese API bleibt bereits Abwärtskompatibel oder es wird eine sanfte Migration zur Verfügung gestellt – außer falls schwerwiegende Probleme gefunden werden oder unter sehr seltenen Umständen.
Zur High-Level API zählen die Klassen teascript::Engine / teascript::EngineBase, alle public getter in teascript::ValueObject sowie die Header Exception.hpp / SourceLocation.hpp und version.h (außer wenn anders angegeben).

Wann ist TeaScript verfügbar?

TeaScript ist bereits als C++ Library und Host Application für Windows 10/11 sowie Linux (Ubuntu 22.04.) verfügbar.
Download ist hier erhältlich.

Überblick und Highlights

Einen Überblick und die eindruckvollsten Highlights sind in der Sektion TeaScript Overview and Highlights verfügbar.

Product Variants

Weitere Informationen zu den TeaScript Varianten und der Eigenschaften gibt es in der Product Variants Sektion.

Vergleich von C++ Scripting Libraries

Ein Vergleich von C++ Script-Libraries kann man hier lesen: Comparison of C++ Scripting Libraries.

Motivation und Hintergrundstory

Mehr zur Hintergrundgeschichte gibt es in dem folgendem blog post.

Kontakt

Wer mehr über TeaScript lernen oder erfahren möchte, mögliche Anwendungsfälle erörtern und besprechen möchte, andere Fragen, Vorschläge, Wünsche oder Kritik loswerden möchte, oder prüfen möchte ob oder wie ich mit meinen Dienstleistungen weiterhelfen könnte (TeaScript bezogen oder losgelöst zu C++ Entwicklung), der darf mich sehr gerne kontaktieren:

contact <the-at-symbol> tea-age.solutions
oder das Kontaktformular verwenden:

    SPAM Schutz: Wie lautet das Ergebnis? 1 times 20