

Eine Programmiersprache auf hoher Ebene, die schnell zu schreiben, zu kompilieren und zu laufen ist.
UCODE ist eine Programmiersprache, die in vorhandene Software wie Game-Engines eingebettet ist und gleichzeitig eine Sprache auf niedriger Ebene mit modernen und hochrangigen Funktionen ist.
hauptsächlich
Völlig konzentriert und spezialisiert auf Spieleentwicklung und Spielmotoren.
Und mehr.
Diese Sprache wurde hergestellt, weil der Mangel an geeigneten Skriptsprachen für die GameEngine eine Low-Level-Kontrolle über das Gedächtnis ermöglichte und die Reflexion leicht analysieren kann.
Zum Beispiel
$Vec2:
float x;
float y;
$Weapon;
$Player:
Vec2 pos;
Weapon[] Weapons;
Nach dem Kompilieren erhalten wir Montagedaten, mit denen alle Klassen, Funktionen und Felder angezeigt werden können. So kann es in Ihrem Inspektor wie die meisten beliebten Spielemotoren verwendet werden.
Der folgende Text geht davon aus, dass Sie für eine 64 -CPU zusammengestellt wurden. Die VM ist CPU -Agnostik mit Ausnahme der CPU -Zeigergrößen. Es muss für 64-Bit oder 32-Bit zusammengestellt werden, was trivial ist.
$Vec2: //class size 8
float x;//field offset 0
float y;//field offset 4
$Weapon;//size 0
$Player: //class size 32
Vec2 pos;//field offset 0
Vector<Weapon> Weapons;//field offset [8-12 depending if the compiler added padding]
$Vector<Weapon>: //class size 24
Weapon[&] _Data; //field offset 0
uintptr _Size; //field offset 8
uintptr _Capacity; //field offset 16
Wir möchten C# -Argbodaten, aber mit C ++ - Low -Level -Steuerung über den Speicher und ohne C# Müllsammler.
Auch da wir eine neue Sprache erstellen, können wir in früheren Sprachen Fehler lernen, indem wir optionale, Ergebnistypen und Enum -Varianten -Typen und mehr Ausnahmen und mehr entfernen.
Obwohl Ucode für Game Engines gemacht wird, kann es keine VM benötigen, die es selbst verwendet werden kann und direkt mit C-, WASM- und nativen Plattformbibliotheken zusammengestellt werden kann.
oder direkt zum nativen Maschinencode, wenn dies erfolgt.
Wenn Ihr Anwendungsfall nur eine kleine Sprache benötigt und die meiste Zeit nicht in der Skriptsprache verbringt, die Sie Shold verwenden, verwenden Sie Lua.
Wenn Sie statische Tippen und C ++ Ness-Ness benötigen, aber in Ordnung sind, um einen Müllsammler zu haben, verwenden Sie Mono C# oder Terra.
Webseite
Spielplatz
Dokumentation
VSCODE -Erweiterung
Beginnen Sie für Benutzer
So fügen Sie Ihrem C ++ - Projekt hinzu
Führen Sie Folgendes in Ihrem Terminal aus, um unter Linux/macOS zu installieren.
curl -L https://github.com/LostbBlizzard/UCodeLang/releases/latest/download/install.sh | sh
Oder laden Sie die ucodelangsetup.exe auf der neuesten Version für Windows herunter und führen Sie sie aus.
use ULang;//include standard Library.
|main[] -> int:
int a = 10;
int b = 20;
var c = a + b;
int[] List;
List.Push(c);
int&? LastItem = List.Back();
match LastItem:
Option(out myvalue):
if myvalue == 30:
Fmt::Print("myvalue does equal 30");
Null: panic("List size was 0");
Dies kann in ucodeide/src/appObject/ecSexample.hpp und ucodeide/src/appObject/test.uc.
use API;//Imgui,Vec2,Time
use ECS;//Component,Entity
$Player[Component]:
float Speed = 1;
|Start[this&]:
entity().position2d() = [2,5];
|Update[this&] -> void:
var& pos = entity().position2d();//get rereference to entity position.
float deltatime = Time::DeltaTime();
if Imgui::KeyDown(ImKey::W):
pos.Y += Speed * deltatime;
if Imgui::KeyDown(ImKey::S):
pos.Y -= Speed * deltatime;
if Imgui::KeyDown(ImKey::A):
pos.X -= Speed * deltatime;
if Imgui::KeyDown(ImKey::D):
pos.X += Speed * deltatime;
# include < UCodeLang/UCodeLang.hpp >
int main ()
{
const char * MyUCode = " |main[] => 1; " ;
UCodeLang::Compiler myCompiler;
auto comilerRet = myCompiler. CompileText (MyUCode);
if (!comilerRet. IsError ())
{
// your ucode was Compiled
UCodeLang::RunTimeLangState State;
UCodeLang::RunTimeLib Lib;
Lib. Init (comilerRet. GetValue (). OutPut . value ()); // initialize RunTimeLib using our Compiled code.
State. AddLib (&Lib); // Add RunTimeLib
State. LinkLibs (); // Link libraries
UCodeLang::Interpreter interpreter;
interpreter. Init (&State);
interpreter. Call (StaticVariablesInitializeFunc); // initialize our Static Variables.
interpreter. Call (ThreadVariablesInitializeFunc); // initialize thread local/Interpreter local Variables.
int Value = interpreter. RCall < int >( " main " ); // Call main
std::cout << " Got Value " << Value;
interpreter. Call (ThreadVariablesUnLoadFunc); // Call Thread local Variables destructors.
interpreter. Call (StaticVariablesUnLoadFunc); // Call Static Variables destructors.
}
else
{
// your code some how failed to compile
}
}Ucodelang ist aus Debugging -Gründen und der X86 -Codegenerierung eine Abhängigkeit von Zycore und Zydis.
Beide sollen entfernt werden.
Um das Projekt zu erstellen, laden Sie einfach Dateien herunter oder führen Sie aus.
git clone https://github.com/LostbBlizzard/UCodeLang.git
cd ./UCodeLang
Nach dem Ausführen der Projektdateien.
InstallTools.bat
./InstallTools.sh
Der letzte Schritt ist unbedingt, wenn Sie UCodeide nicht erstellen müssen.
Nächster Lauf.
./VS_2019.bat
./VS_2022.bat
./GNU_Make.sh
make
./GNU_Make.sh
make
./XCode.sh
Die Dateiprojektstruktur ist Lad so raus
/Abhängigkeiten
/Uc
/Ucapp
/Ucodeapi
/Ucodelang
"Der Kern von Ucode-Lang, wenn Sie diese als Bibliothek verwenden, fügen dies zu Ihrem Include-Verzeichnis hinzu."
/Abhängigkeiten
/UCodeanalyzer
/Ucodelang
/Ucodelangagesever
/Ucodelangageseverlib
/UCodedokumentation
/Ucodeide
/UCodewebsite
Das Projekt ist ebenfalls so wenig Abhängigkeiten wie möglich, da es einfach zu C ++ -Onessungen hinzugefügt werden soll.
Verwenden Sie die Registerkarte "GitHub -Problem" für Fehler. Verwenden Sie die GitHub -Diskussionen, um über die Sprache, die neuen Funktionen und das Sprachdesign zu sprechen. Halten Sie es auch zivil.
Seien Sie auch nicht schüchtern zu kritisieren, wie die Dinge implementiert werden. Ich weiß, dass der Code an Orten besser sein kann.
Konstruktive Kritik ist willkommen (sei nicht zu hart).
Bitte stellen Sie Fragen zu allem Projekt, da ich kaum etwas dokumentiert habe.
Der Hauptzweig für Veröffentlichungen und die Funktion sind, wo ich die tatsächliche Entwicklung mache.
Die endgültige Vision des Projekts hat Backends für
UCODEVM (Dolmetscher, JitInterPreter, nativerPreter)
C11
WebAssembly
Windows (native ausführbare Datei),
Linux (native ausführbare Datei),
MacOS (native ausführbare Datei),
X86
X86_64
Arm
ARM64
Die Sprache wurde von Lostblizzard auf GitHub entworfen und entwickelt.
Wer unterhält derzeit die
Der UcodeGameEngine (daran bearbeitet) Der Hauptgrund, warum die Sprache hergestellt wurde.
F: Ucodelang ist C ++ und Rost sehr ähnlich, warum nicht Rost oder C ++ verwenden?
A: C ++ ist zu zu kompilieren und nach dem Kompilieren nicht analysierbar (ohne den Compiler zu hacken).
F: Warum ist es in C ++ geschrieben.
A: Die meisten Spielmotoren und insbesondere meine Game -Engine ist in C ++ geschrieben. C ++ ist immer noch das beste Werkzeug für die Herstellung von Spielemotoren.
F: Warum nicht LLVM für Ihr Backend verwenden?
A: LLVM ist zu groß von Abhängigkeit und das Schreiben von Backends gibt mir eine gute Ausrede, um über Computer zu lernen (der Grund, warum ich eine Game Engine mache). Außerdem geben Sie nur LLVM -Baugruppentext aus.
F: Warum bedeutender Weißraum?
A: Es schien nur interessant zu sein, auch nur schöner auszusehen.
F: Was ist Ucodelang Killer -Funktion?
A: Ucodelang ist nicht das nächste große Ding, das nur ein Werkzeug für meinen speziellen Anwendungsfall ist. Es nimmt die besten Teile aus Sprachen, die ich mag, und versuchen, Überschüsse zu entfernen. Es ist in gewisser Weise ein verfeinerter und rationalisiertes C ++.
F: Was bedeutet Ucode?
A: Das Wort ucode bedeutet nichts und hat keine Geschichte. Es ist nur ein Name, den ich für eine Programmiersprache für die Programmiersprache wieder gut gemacht habe. Wenn Sie wirklich eine Bedeutung haben möchten, bedeutet A, wenn die Idee für nicht signierte Code basiert, basierend auf C/C ++ -Anwidrigen, vorgewiesenes Schlüsselwort.
F: Magst du C ++?
A: Ich mag es genug, um ein Jahr damit zu verbringen, eine neue Sprache zu machen, aber nicht genug, um meine Benutzer für meine Game Engine zu machen (sorry, unwirklich). Obwohl ich C ++ wirklich mag, aber ich bin mir auch seine Mängel bewusst.
F: Was als nächstes und wann wird Sprache getan?
A: Wenn das Repository beginnt (vorzugsweise am 02.01.2023 zum einjährigen Jubiläum des JIT -Projekts), werden die meisten Funktionen erledigt und planen nicht wirklich, mehr hinzuzufügen, es sei denn, es ist einfach zu gut. Ich werde für ein zusätzliches Jahr in der Nähe sein, um die anderen Architekturen und Backends und die stabliegenden Stabs zu beenden. An diesem Punkt wird das Projekt durchgeführt, und ich kann weiter an dieser Game -Engine arbeiten und an größeren und besseren Dingen arbeiten. Ich glaube, zu viele Funktionen kann eine Sprache verschlimmern können.
F: Was ist Ihre Meinung zu neuen Programmiersprachen?
A: Je mehr der Merrier besonders für Systemsprachen. Jede Sprache experimentiert, je mehr wir experimentieren, desto bessere Sprachen lernen wir von dort Fehler.