Integration von C und C++
Für reinen C-Code bot sich das JIT-Compile-Interface des TinyC-Compilers (TCC) an. Das Interface besteht aus einer Bibliothek mit Funktionen, über die sich in einen Puffer eingelesene C-Sourcen Just-In-Time zu Maschinencode kompilieren lassen. Wichtig ist, dass dieser Puffer im User-Space des Targets liegen muss. Die Puffer werden deshalb als Shared-Memory-Objects angelegt. Der embedded C-JIT-Compiler kann in der Initialisierungsphase und während der Laufzeit der Steuerungsapplikation wiederholt aufgerufen werden. Interessant ist die JIT-Kompilierung von C++-Code über die API des \’Compiler Infrastructure\‘ Projekts LLVM. Dort wurde auf die direkte Einbettung des Compilers CLANG verzichtet, da mit LLVM mehrere Compiler Frontends für unterschiedliche Sprachen zur Verfügung stehen. Neben C++ Code können diese z.B. Fortran oder Python in die Zwischensprache LLVM-IR (Bitcode) übersetzen. Der kleinere JIT-Compiler für den Bitcode wurde in den Dachsview++ Target aufgenommen. Die schnelle JIT-Kompilierung generiert optimierten Maschinen-Code. Bei C/C++-Applikationen ist es möglich, Submodule mit dem Clang-Compiler zu kompilieren, und deren Objects in Archive abzulegen. Zur Integration reicht es, nur die kleine Main-Routine zu Bitcode zu kompilieren. Der Bitcode-JIT-Compiler erzeugt im Arbeitsspeicher ausführbaren Maschinencode, der beim Aufruf mit den Objects der Submodule dynamisch verlinkt wird.
Programmierwelten verbinden
Mit dem Support von Hochsprachen und der Nutzung von Systemthreads stehen alle Wege offen, um Multitarget- und Multicore-Applikationen, sowie verteilte IoT-Applikationen kostengünstig in einer graphischen SPS-Funktionsblockapplikation zu realisieren. Dachsview++ verbindet unter QNX6 und Linux optimal die Automatisierungswelten der Funktionsblock- und C/C++-Programmierung. Die Targets sind nach IEC61499 Event-orientiert, und wurden für Events von Protokollstacks, sowie des Betriebssystems erweitert und laufen in Echtzeit.