Nach langer Abstinenz melde ich mich wieder zurück von den Toten, diesmal mit einem hybriden Projekt aus PureBasic und C.
Mit vcpu möchte ich eine Plattform entwickeln um eigene Skriptsprachen zu entwickeln und in seine eigenen Programme einzubinden, bzw. standalone laufen zu lassen. Das Prinzip des Ganzen basiert auf 3 Stufen:
- Ein Cross-Compiler übersetzt den High-Level Source in eine ASM - Ähnliche Zwischensprache (ByteCode - ASM)
- Der BC-ASM wird von einem weiteren Compiler in ByteCode gewandelt der direkt von der Runtime ausgeführt werden kann.
Dieser Compiler versucht den Code dabei so gut es geht zu optimieren, mit besonderem Augenmerk auf Code-Fragmente die durch die
automatische Cross-Compilierung im vorigen Schritt entstanden sind.
- Der ByteCode wir anschließend mit der Runtime ausgeführt die entweder standalone läuft oder (als DLL) direkt in eurem Programmen
Die Runtime wird dabei aus Performance-Gründen ausschließlich in C programmiert, PB ist da um FAKTOREN (10x-20x!) zu langsam. Zu den technischen Details, die Runtime ist eine Register-Maschine, d.h. wir benötigen für Berechnungen usw. keinen Stack. Die Zahl der Register passt sich der Zahl der benötigten Variablen an, es ist aber auch möglich ein Minimum an Registern zu reservieren (das ist jetzt einfach mal so auf 0xFF gesetzt).
Die Register sind Variant-typen mit den den Möglichkeiten int/uint/float (unsigned - 32 Bit - Typen, noch ein Grund C für die Runtime zu wählen). Es gibt also keinen gesonderten FPU - Arithmetik Befehle, die normalen Arithmetik und Logik - Befehle können genauso auf Float - Inhalte angewandt werden, auch gibt es native type-cast Befehle. Auch gibt es einige Befehle mit verschiedener Parameter Anzahl (besonders die Arithmetik Befehle), z.B. ADD [a] (uint a += uint b) / ADD f[a] [c] (float a = float b + float c). Natürlich sind das dann doch ziemlich verschiedene Befehle im ByteCode - Strom, aber darum kümmert sich der BC - Compiler vollautomatisch.
Die Runtime ist voll Thread - basiert (pthread) und der Ausführungsfluss ist steuerbar (start/stop/pause/resume/reset/...) und es kann eine beliebige Anzahl von Instanzen erstellt werden. Zur Erweiterung des Befehlssatzes wie auch zur Kommunikation der Runtime mit eurem Programm gibt es eine IO - Schnittstelle mit einer beliebig definierbaren Anzahl von Ports.
Desweiteren gibt es Unterstützung für:
- Anonyme Labels
- Calls
- Native Arrays
Native Listen, Memory - Zugriffe, ein Interrupt-Controller und darauf basierte Timer sind in Arbeit.
Die Runtime und der BC-ASM zu ByteCode Compiler sind schon voll lauffähig, die Optimierungsroutinen des Compilers sind noch in Arbeit (Peephole - Optimierungen nach dem Pattern-Matching Prinzip, DeadCode Detection, ...), der Cross-Compiler ist noch in Arbeit.
Daher habe ich zum Testen eine kleine IDE erstell die ich aus meinem µCEmulator Projekt portiert adaptiert habe:
(Nur um das nochmal klarzustellen, händisch auf dieser Ebene Code zu schreiben ist in der Endversion nicht vorgesehen,
natürlich ist es möglich aber dann nur eventuell zum fine-tuning, also bitte keine zu hohen ansprüche an die Syntax ...)
Vermutlich wird es nicht allzu viele hier geben die das benötigen können, und wenn doch hab ich hier immer noch nicht genug gesagt.
Aber eine vollständige Befehls/Syntax/OpCode/Dokumentation usw. wird nachgereicht sobald vollständig vorhande, Ich wollte hier nur mal einen
1. lauffähigen Vorgeschmack präsentieren und wer will kann sich ja mal mit den mitgelieferten Examples spielen.
Download
Der Source wird auf Google Code gehostet.