JIT.au3 - C-Code direkt aus AutoIt kompilieren und ausführen
Manchmal wünscht man sich, dass kritische Teile eines AutoIt-Skripts mit nativer Geschwindigkeit laufen könnten - Schleifen, numerische Algorithmen oder Bit-Operationen, für die AutoIt schlicht nicht gemacht ist. JIT.au3 ermöglicht es, C-Code als String zu schreiben, zur Laufzeit zu kompilieren und direkt aus AutoIt aufzurufen.
Keine Compiler-Installation nötig. Alles was man braucht ist diese UDF und eine Internetverbindung.
Die Kompilierung übernimmt die Compiler Explorer (Godbolt) API - der erzeugte Maschinencode wird in ausführbaren Speicher geladen und ist über DllCallAddress aufrufbar.
GitHub: https://github.com/Sylvan86/autoit-jit-udf
Download: Releases
Schnellstart
#include "JIT.au3"
; C-Code schreiben - exportierte Funktionen mit CALLCONV kennzeichnen
Global $sCode = _
'CALLCONV double doubleIt(double x) {' & @LF & _
' return x * 2.0; ' & @LF & _
'}'
; Über die Godbolt-API kompilieren
Global $mCode = _JIT_Compile($sCode)
; Kompilierte Funktion aufrufen
Global $aResult = DllCallAddress("double", $mCode.FuncPtr["doubleIt"], "DOUBLE", 21.0)
ConsoleWrite("Ergebnis: " & $aResult[0] & @CRLF) ; → 42.0
; Speicher freigeben
_JIT_Free($mCode)
Alles anzeigen
Einmal kompilieren, immer wiederverwenden
ZitatBitte geht respektvoll mit der Godbolt-API um.
Der Compiler Explorer ist ein freies Community-Projekt. Jeder Aufruf von _JIT_Compile sendet eine Anfrage an deren Server.
Nach der ersten erfolgreichen Kompilierung kann der Binary-String gespeichert und wiederverwendet werden - keine weiteren API-Aufrufe nötig und deutlich schnellerer Start:
; Erster Lauf: kompilieren und ReusableString notieren
Global $mCode = _JIT_Compile($sCode)
ConsoleWrite($mCode.ReusableString & @CRLF) ; → diesen String speichern
_JIT_Free($mCode)
; Alle weiteren Läufe: aus gespeichertem ReusableString laden (kein Internet nötig!)
Global $mCode = _JIT_LoadBinary('{"b":"8g9YwMM","f":{"doubleIt":0}}')
Global $aResult = DllCallAddress("double", $mCode.FuncPtr["doubleIt"], "DOUBLE", 21.0)
Siehe examples/example_reuse.au3 im Repository für eine vollständige Anleitung.
API-Übersicht
| Funktion | Beschreibung |
| _JIT_Compile($sCode) | C-Code kompilieren und ausführbaren Speicher zurückgeben |
| _JIT_LoadBinary($sBinary) | Zuvor kompiliertes Binary laden (kein API-Aufruf) |
| _JIT_Free($mCode) | Ausführbaren Speicher freigeben |
| _JIT_SetServer(...) | Server, Compiler, Sprache und Proxy konfigurieren |
| _JIT_GetCompilers() | Verfügbare Compiler auflisten |
| _JIT_GetLanguages() | Verfügbare Sprachen auflisten |
| _JIT_DescribeOpcode($sOp) | Beschreibung eines Assembler-Opcodes abrufen |
Einschränkungen
Diese UDF ist für kleine, eigenständige Code-Snippets gedacht - nicht für vollständige C-Projekte.
- Keine #include-Unterstützung - die C-Standardbibliothek ist nicht verfügbar. Es gibt keinen Linker; der Code muss vollständig eigenständig sein.
- Keine math.h-Funktionen - sin(), cos(), pow() usw. benötigen libm, das nicht gelinkt wird. Einige GCC-__builtin_*-Funktionen funktionieren als Inline-Alternativen (siehe examples/example_builtins.au3).
- Internet für die Kompilierung erforderlich - mit _JIT_LoadBinary kann nach dem ersten Kompilieren offline gearbeitet werden.
- Einzelne Übersetzungseinheit - der gesamte Code muss in einem String stehen, keine Mehrfach-Datei-Kompilierung.
Beispiele
Im Repository sind fünf Beispiele enthalten:
- example_scalar.au3 - Grundprinzip: eine einfache Funktion kompilieren und aufrufen
- example_array.au3 - Array an C übergeben: Kahan-Summation vs. naive Summation
- example_string.au3 - String-Verarbeitung: Groß-/Kleinschreibung im Wechsel
- example_builtins.au3 - GCC-__builtin_*-Funktionen: was funktioniert, was nicht
- example_reuse.au3 - Kompilierte Binaries speichern und offline wiederverwenden
Abhängigkeiten
- JSON.au3 - JSON-UDF für die API-Kommunikation (im Release-Download enthalten)
Danksagung
Dieses Projekt wäre ohne den Compiler Explorer (Godbolt) von Matt Godbolt und Mitwirkenden nicht möglich. Es ist ein großartiges Open-Source-Werkzeug für die Programmier-Community. Bitte nutzt die API verantwortungsvoll.