Chrysalisp ist ein 64-Bit-, MIMD-, Multi-CPU-, Multi-Thread-Multi-Core-Parallel-Parallel-Betriebssystem mit Merkmalen wie GUI, Terminal, OO-Assembler, Klassenbibliotheken, C-Script-Compiler, LISP-Interpreter, Debugger, Profiler, Vector FONT Engine und mehr. Es unterstützt MacOS, Windows und Linux für X64, RISCV64 und ARM64 und wird schließlich nach bares Metall bewegen. Es ermöglicht auch die Modellierung verschiedener Netzwerktopologien und die Verwendung von Chrysalib hub_nodes, um heterogenen Hostnetzwerken beizutragen. Es verfügt über einen virtuellen CPU-Befehlssatz und ein leistungsstarkes Objekt- und Klassensystem für die Sprachen des Assemblers und auf hoher Ebene. Es verfügt über eine dynamische Bindung und -belastung auf Funktionsebene und einen Befehlsterminal mit einer vertrauten Schnittstelle für die Befehlszeilenanwendungen im Pipe-Stil. Ein gemeinsamer lispliger Dolmetscher ist ebenfalls bereitgestellt.









Besuchen Sie #Chrysalisp-OS: matrix.org für Banter. Element.io Room empfohlen.
Chrysalisp kann unter MacOS, Windows und Linux verwendet werden. Unterstützt X64, ARM64 und RISCV64 CPUs. Es unterstützt auch einen VP64 -Software -CPU -Emulator, der für den Installationsprozess verwendet wird. Dies kann jedoch mit der Option -e auf Plattformen verwendet werden, auf denen derzeit keine native CPU -Unterstützung als Laufzeitsystem beendet. Es läuft in einer gehosteten Umgebung, während das Experimentieren durchgeführt wird, aber schließlich wird es zum Bleary -Metall übergeführt. In Zukunft habe ich vor, ein VM -Boot -Image für Unikernel -Geräte und ein WebAssembly -Ziel für die Verwendung innerhalb von Webbrowsern zu erstellen.
Chrysalisp ermöglicht die Simulation verschiedener Netzwerk-Topologien unter Verwendung von Punkt-zu-Punkt-Links. Jede CPU im Netzwerk wird als separater Hostprozess dargestellt, und Punkt-zu-Punkt-Links verwenden den gemeinsam genutzten Speicher, um CPU-to-CPU und bidirektionale Verbindungen zu simulieren. Das Design beinhaltet absichtlich nicht globales netzbasiertes Networking.
Das Chrysalib -Projekt, https://github.com/vygr/chrysalib, ermöglicht die Verwendung von IP- und USB3/USB2 -produktiven Chip -Kopierkabeln, um heterogene Hostnetzwerke zu erstellen. Auf diese Weise können Benutzer ihre MacBooks, Linux, Windows Machines und PI4 miteinander verbinden, um ihre eigenen Entwicklungs -LAN- oder WAN -Netzwerke zu erstellen, was ziemlich cool ist.
Chrysalisp verwendet einen virtuellen CPU -Befehlssatz, um die Verwendung von X64-, ARM64-, RISCV64- oder VP64 -Anweisungen zu beseitigen. Derzeit kompiliert es direkt in nativen Code, kann jedoch auch in Byte -Codeformular übersetzt werden und die Laufzeitübersetzung verwenden.
Um die Notwendigkeit eines Registrierungs -Jonglierens für Parameterüberschreitungen zu vermeiden, definieren alle Funktionen ihre Registerschnittstelle, und Parameterquellen und -Ziele werden automatisch mithilfe einer topologischen Sortierung abgebildet. Wenn nicht-dag-Zuordnungen festgestellt werden, kann der Benutzer sie mit einem vorübergehenden Ansprechen ansprechen. Die Software enthält außerdem Bediener, um die Bindung von Parametern an dynamische gebundene Funktionen, relative Adressen, automatische Zeichenfolgenpools, Referenzen und lokale Stapelrahmenwerte einfach zu binden. Ausgangsparameter, die nicht verwendet werden, können mit einem Unterstrich ignoriert werden.
Chrysalisp verfügt über ein leistungsstarkes Objekt- und Klassensystem, das nicht nur auf den Assembler beschränkt ist, sondern wie eine hochstufige Sprache so fähig ist. Es ermöglicht die Definition statischer Klassen oder virtueller Klassen mit Inline-, virtuellen, endgültigen, statischen und überschriebenen Methoden. Die GUI und die Lisp werden mit diesem Klassensystem erstellt.
Es hat dynamische Bindung und Belastung auf Funktionsebene. Funktionen werden auf Bedarf geladen und gebunden, wenn Aufgaben erstellt und verteilt werden. Derzeit werden Funktionen aus dem CPU -Dateisystem geladen, in dem sich die Aufgabe befindet, aber in Zukunft stammen sie aus dem Serverobjekt, mit dem die Aufgabe erstellt wurde und nach Bedarf über das Netzwerk transportiert wird. Funktionen werden unter allen Aufgaben geteilt, die dasselbe Serverobjekt verwenden, sodass nur eine Kopie einer Funktion geladen wird, unabhängig davon, wie viele Aufgaben sie verwenden.
Auf die Systemfunktionen wird über eine Reihe statischer Klassen zugegriffen, wodurch es einfach ist, die Verwendung statischer Funktionspositionen zu erinnern und die Quelle von Änderungen auf Systemebene zu entkoppeln. Die Schnittstellendefinitionen für diese Funktionen finden Sie in den sys/xxx.inc -Dateien.
Ein Befehlsterminal mit einer vertrauten Schnittstelle für Pfeifstil -Befehlszeilenanwendungen ist mit Args Vector, Stdin, Stdout, Stderr usw. Klassen für die einfache Konstruktion von Rohrmeister und Sklaven mit willkürlicher Verschachtung von Befehlszeilenrohren ausgestattet. Dies ist zwar nicht der beste Weg, um parallele Anwendungen zu erstellen, es ist sehr nützlich für die Komposition von Tools und verbirgt die gesamte Botschaft, die hinter einer vertrauten Streams -basierten API passt.
Es wird ein gemeinsames LISP -ähnlicher Dolmetscher bereitgestellt. Dies ist in der Befehlszeile über den lisp erhältlich. So erstellen Sie den gesamten Systemtyp (make) , berechnen Sie die minimale Kompilierung der Arbeitsbelastung oder (make-all) um alles unabhängig von der LiSP-Eingabeaufforderung zu tun. Dieses Lisp verfügt über eine C-Script-Snippets-Fähigkeit, um das Mischen von C-Script-kompilierten Ausdrücken im Zuordnungs- und Funktionsaufrufcode zu ermöglichen. Für diese Ausdrücke gibt es ein elementarer Optimierungspass. Sowohl der virtuelle Assembler als auch der C-Script-Compiler sind in LISP geschrieben, schauen Sie in lib/asm / code . Einige der Lisp -Primitiven werden über ein Bootskript konstruiert, das jede Instanz einer LiSP -Klasse auf Konstruktion läuft. Weitere Informationen finden Sie unter Klasse/Lisp/root.inc . Die Zusammenstellung und die Umgebung für die Herstellung sowie alle Kompilier- und Make -Befehle werden über das LISP -Befehlszeilen -Tool in lib/asm/asm.inc erstellt. Auch dieses Auto wird für jede Instanz des lisp -Befehls ausgeführt, das vom Terminal aus dem Terminal ausgeführt wird. Sie können dies mit einer beliebigen Anzahl von zusätzlichen Dateien erweitern. Platzieren Sie sie einfach nach dem LISP -Befehl und sie werden nach der Lib/ASM/ASM.InC -Datei und vor der Verarbeitung von STDIN ausgeführt.
Lassen Sie sich nicht auf die Idee bringen, dass der Assembler und der Compiler aufgrund der Codierung in interpretierter LISP langsam sein wird. Ein vollständig gereinigtes Systembau aus der Quelle, einschließlich der Erstellung einer umfassenden rekursiven vorgebundenen Boot-Image-Datei, nimmt die Reihenfolge von 2 Sekunden auf einem MacBook Pro von 2014 auf! Entwicklerzyklus (make) und (remake) unter 0,5 Sekunden. Es ist nicht langsam!
Die Routing -Tabellen für Netzwerkverbindungen werden zum Booten eines Links erstellt, und der Vorgang ist in der Natur verteilt. Jeder Link startet eine Flutfüllung, die schließlich alle CPUs erreicht, und auf dem Weg hat alle Routen von einer CPU zu einer anderen markiert. Alle kürzesten Routen werden gefunden, Nachrichten werden einer Link zugewiesen, da der Link kostenlos wird und mehrere Links gleichzeitig über parallele Routen weiterleiten. Große Nachrichten werden am Ziel in kleinere Fragmente unterteilt, um die Verwendung verfügbarer Routen zu maximieren.
Die Befehlszeilenoption -run startet Aufgaben zum Booten dieser CPU, wie der experimentellen GUI (eine laufende Arbeit, -run gui/gui/gui.lisp ). Sie können das Netzwerk -Start -Skript ändern, um mehr als eine GUI -Sitzung auszuführen, wenn Sie möchten, und starten Sie die GUI auf mehr als CPU 0 und schauen Sie sich in der boot_cpu_gui an ! :)
Die Option -l -Befehlszeilenoption erstellt einen Link, der derzeit bis zu 1000 CPUs zulässig ist, das ist jedoch leicht einzustellen. Die freigegebenen Speicherverbindungsdateien werden im TMP-Ordner /TMP erstellt, sodass beispielsweise /TMP /000-001 die Link-Datei für die Verbindung zwischen CPU 000 und 001 ist.
Ein mit PS angezeigter Beispielnetzwerk sieht für ein 4x4 -Netznetzwerk so aus:
./main_gui -l 011-015 -l 003-015 -l 014-015 -l 012-015
./main_gui -l 010-014 -l 002-014 -l 013-014 -l 014-015
./main_gui -l 009-013 -l 001-013 -l 012-013 -l 013-014
./main_gui -l 008-012 -l 000-012 -l 012-015 -l 012-013
./main_gui -l 007-011 -l 011-015 -l 010-011 -l 008-011
./main_gui -l 006-010 -l 010-014 -l 009-010 -l 010-011
./main_gui -l 005-009 -l 009-013 -l 008-009 -l 009-010
./main_gui -l 004-008 -l 008-012 -l 008-011 -l 008-009
./main_gui -l 003-007 -l 007-011 -l 006-007 -l 004-007
./main_gui -l 002-006 -l 006-010 -l 005-006 -l 006-007
./main_gui -l 001-005 -l 005-009 -l 004-005 -l 005-006
./main_gui -l 000-004 -l 004-008 -l 004-007 -l 004-005
./main_gui -l 003-015 -l 003-007 -l 002-003 -l 000-003
./main_gui -l 002-014 -l 002-006 -l 001-002 -l 002-003
./main_gui -l 001-013 -l 001-005 -l 000-001 -l 001-002
./main_gui -l 000-012 -l 000-004 -l 000-003 -l 000-001 -run gui/gui
Schauen Sie sich die docs/intro.md an, um Anweisungen zu erhalten, um auf allen unterstützten Plattformen zu beginnen.
Die experimentelle GUI erfordert, dass die SDL2 -Bibliothek installiert wird.
Holen Sie sie sich über Ihren Paketmanager unter Linux mit:
sudo apt-get install libsdl2-dev
Oder auf Mac über Homebrew.
brew install sdl2
Schauen Sie sich die docs/intro/intro.md für plattformspezifische Anweisungen an. Das Folgende ist für OSX- und Linux -Systeme. Windows verfügt über eine vorgefertigte Main.exe.
Wenn Sie Chrysalisp zum ersten Mal herunterladen, haben Sie nur das VP64 -Emulator -Boot -Bild. Sie müssen die nativen Bootsbilder zum ersten Mal erstellen. Dies ist etwas langsamer als nachfolgende Stiefel und Systeme kompiliert, ermöglicht es uns jedoch, die Snapshot.zip -Datei so klein wie möglich zu halten.
Wenn auf Linux oder Mac über Homebrew:
make install
Oder unter Windows
install.bat
make
./run_tui.sh [-n num_cpus] [-e] [-b base_cpu]
Text User Interface Basierte vollständig verbundenes Netzwerk. Jede CPU hat Links zu jeder anderen CPU. Vorsichtig damit, da Sie eine sehr große Anzahl von Verbindungsdateien und gemeinsam genutzten Speicherregionen haben können. CPU 0 startet ein Terminal an das Hostsystem.
./run.sh [-n num_cpus] [-e] [-b base_cpu]
Vollständiger Netzwerk. Jede CPU hat Links zu jeder anderen CPU. Vorsichtig damit, da Sie eine sehr große Anzahl von Verbindungsdateien und gemeinsam genutzten Speicherregionen haben können. CPU 0 startet eine GUI.
./run_star.sh [-n num_cpus] [-e] [-b base_cpu]
Star Connected Network. Jede CPU hat einen Link zur ersten CPU. CPU 0 startet eine GUI.
./run_ring.sh [-n num_cpus] [-e] [-b base_cpu]
Ring Connected Network. Jede CPU hat Links zu den nächsten und vorherigen CPUs. CPU 0 startet eine GUI.
./run_tree.sh [-n num_cpus] [-e] [-b base_cpu]
Baum verbundenes Netzwerk. Jede CPU hat Links zu ihrer übergeordneten CPU und bis zu zwei Kinder -CPUs. CPU 0 startet eine GUI.
./run_mesh.sh [-n num_cpus on a side] [-e] [-b base_cpu]
Mesh Connected Network. Jede CPU hat Links zu 4 benachbarten CPUs. Dies ist ähnlich wie bei den Transversemen. CPU 0 startet eine GUI.
./run_cube.sh [-n num_cpus on a side] [-e] [-b base_cpu]
Cube Connected Network. Jede CPU hat Links zu 6 benachbarten CPUs. Dies ähnelt TMS320C40 -Maschen. CPU 0 startet eine GUI.
Stoppen Sie mit:
./stop.sh
Schnappschuss mit:
make snapshot
Dadurch wird eine Snapshot.zip- Datei des OBJ/ Verzeichnisses mit nur den Hostverzeichnisstrukturen, den vorgefertigten Windows main_gui.exe und main_tui.exe plus den vp64 boot_image- Dateien erstellt!
Wird verwendet, um den kompakteren Snapshot.zip zu erstellen, der auf GitHub steigt. Dies muss nach der Erstellung von (make-all-platforms) Boot_Image- Set erfolgen!
obj/vp64/VP64/sys/boot_image
obj/x86_64/WIN64/Windows/main_gui.exe
obj/x86_64/WIN64/Windows/main_tui.exe
Sauber mit:
make clean