Janaha hat geschrieben:Über einen Compiler der speziel auf die belange des Hive angepasst ist grüble ich auch schon seit einiger Zeit nach. Ich finde so ein Compiler sollte auch in der Lage sein, Code für Belatrix und Administra zu generieren. Dazu müsste er natürlich die Architektur genauer kennen. Da die beiden ja z.B. keine direkte Anbindung an den "Hauptspeicher" haben. Ich grüble auch schon die ganze Zeit darüber nach, wie man das Cog-Ram und das Hub-Ram sozusagen wie den Level 1 / Level 2 Chace bei StandardPC's am geschicktesten einbindet. Mein Compiler soll am Ende gar kein Spin-Code mehr erzeugen, sondern direkt Assemblerblöcke. Und mein Ziel wäre es auch, das diese Blöcke wenn sie im Cog-Ram landen möglichst nicht immer nur eine Funktion beinhalten sondern auch ruhig mehere, wenn das Cog-Ram dafür ausreicht. Am meisten Kopfzerbrechen bereitet mir immer noch das Problem, das eine einzelne Routine durchaus so geschrieben werden kann, das sie den Cog- Internen speicher übersteigt. Ich möchte aber ereichen, das das den Programmierer am Ende nicht interessieren muss. Er sollte nach möglichkeit so schreiben können als hätte er allen Speicher der Welt. Die eigentliche Verwaltungs sollte nach möglichkeit dann im Hintergrund laufen. Und was das ganze natürlich noch spannender macht ist, das wir durchaus sowas wie Threads brauchen werden, es sein den wir möchten unsere Programme nicht aus mehr als einen Cog verteilen. Oh je, das wird noch was werden. Einen einfachen Basic zu Assembler Compiler kann ich euch recht schnell zusammenfrikeln, aber was wirklich allgemein brauchbares, das wird wohl etwas dauern. Bin mal gespannt, was ihr hier so für den Hive entwickeln werdet.
p.s. Ich würde der geschwindigkeit halber auch wohl einen Compiler bevorzugen. Ist meines erachtens nach auch einfacher zu schreiben als ein Interpreter. Und schonmal sorry für das Highjacken des Basic-Interpreter-Threads.
Die ganze Sache läuft IMHO tatsächlich auf einen Basic->Forth Compiler hinaus, wie ich schon weiter oben erwähnt habe. Auch deine Cache-Lösung könnte sich damit elegant lösen lassen, indem man dafür geeignete Forth-Funktionen implementiert. Nennen wir z.B. die Assign-Funktion
Eine Basic-Anweisung der Form
würde nach
übersetzt werden (wobei @ den Inhalt der Adresse des obersten Stackelements holt). Der Implementierer bräuchte sich über das Caching keine Gedanken machen, wenn sich die set!-Funktion selbst vollautomatisch um die notwendigen Maßnahmen kümmert. In gleicher Weise könnte auch die Ausführung einer Funktion auf einen beliebig freien COG übertragen werden. Das wäre alles Sache des zugrundeliegenden Forth-Systems. Die Sprachen, die darauf aufsetzen, wären davon entlastet.
Was ich mir wünsche ist, daß alle freien COGs und alle Propeller transparent gesehen werden, d.h. es muß völlig egal sein, welchen COG man für welche Zwecke benutzt, abgesehen von den Root-Propellern Administra etc., die für das Betriebssystem reserviert sind. Das ist aber noch alles Zukunftsmusik. Ich denke da schon an eine zukünftige skalierbare "Lego"-Version des HIVE

Aber trotzdem sollte man diese Möglichkeit schon mal im Auge behalten.
Auch die Auswahl der System-COGs könnte man leicht in Forth realisieren. In Basic könnte das z.B. so aussehen:
Dann würden sich alle Anweisungen in diesem Block auf Bellatrix beziehen. In Forth müsste dazu einfach nur ein Flag geschaltet werden;
Der Befehl AnyCog schaltet den Bellatrix-Modus ab und kehrt zum transparenten Modus zurück.