wavec CLI-Referenz
Dieses Dokument beschreibt detailliert das CLI-Verhalten auf Grundlage der aktuellen Implementierung des Wave-Compilers (wavec).
Kernprinzipien:
wavecist ein Compiler.- Die Installation/Auflösung von Paketen (Lockfile, Registry, Download) liegt nicht in der Verantwortung von
wavec. - Externe Abhängigkeiten werden beim Ausführen von
wavecdurch explizite CLI-Argumente übergeben.
1. Grundform
wavec [Globale-Optionen] <Befehl> [Befehlsoptionen]
Beispiel:
wavec -O2 run main.wave
wavec build app.wave --link ssl -L ./native/lib
wavec run app.wave --dep-root .vex/dep
2. Befehlsanalyse-Regeln (wichtig)
Zuerst scannt wavec die globalen Optionen in allen Argumenten und interpretiert dann den verbleibenden Teil als <Befehl>.
Das bedeutet, dass die Position der globalen Option flexibel ist.
wavec -O3 run main.wave
wavec run main.wave -O3
wavec run -O3 main.wave
Alle drei oben genannten Beispiele sind gültig.
Mit -- werden die nachfolgenden globalen Optionen nicht mehr gescannt und in den Befehlsbereich übergeben.
wavec -- run main.wave
3. Befehle
3.1 run <file>
Kompiliert und führt die Wave-Datei aus.
wavec run hello.wave
Funktion:
- Quelle parsen + import erweitern
- Erstellung von LLVM IR
- Native Binärlink (
target/<file_stem>) - Ausführung
Merkmale:
- Der Exit-Code des ausgeführten Programms wird von
wavecübergeben.
3.2 build <file>
Erstellt eine ausführbare Datei (exe).
wavec build app.wave
Ausgabebinärdatei:
target/<file_stem>
3.3 build Optionen (-o, -c)
Der build-Befehl kann den Namen und das Format der Ausgabedatei über Optionen steuern.
wavec build app.wave -o ./bin/app
wavec build app.wave -c
wavec build app.wave -c -o ./build/app.o
-o <file>: Gibt den Namen der Ausgabedatei an.- Standard (kein
-c): Gibt den Ausgabepfad für die ausführbare Datei an - Mit
-c: Gibt den Ausgabepfad für die Objektdatei an
- Standard (kein
-c: Überspringt die Verlinkung und erzeugt nur Objektdateien.- Bei Verwendung von
-cwird der Objektpfad auf stdout ausgegeben.
Standardverhalten:
wavec build app.wave->target/appwavec build app.wave -c->target/app.o(Pfadausgabe)
3.4 install std, update std
Befehl zur Installation/Aktualisierung der Standardbibliothek.
wavec install std
wavec update std
3.5 --help, --version
wavec --help
wavec --version
4. Globale Optionen
4.1 Optimierung
Zulässige Werte:
-O0-O1-O2-O3-Os-Oz-Ofast
Beispiel:
wavec -O3 run main.wave
4.2 Debug-Ausgabe
wavec --debug-wave=tokens,ast,ir run main.wave
Zulässige Elemente:
tokensastirmchexall
4.3 Linkoptionen
wavec build app.wave --link ssl --link crypto -L ./native/lib
--link=<lib>oder--link <lib>-L<path>oder-L <path>
wavec übergibt beim Linken intern in der Form von -l<lib>, -L<path>.
4.4 Optionen für externe Abhängigkeiten (wichtig)
Dies sind Optionen für die Interpretation externer Importe (pkg::...).
--dep-root <dir>
Fügt Kandidaten für das Paket-Root-Verzeichnis hinzu.
wavec run app.wave --dep-root .vex/dep
Beim Suchen nach dem Paket math:
- Prüfen Sie
.vex/dep/math
Kann mehrfach angegeben werden:
wavec run app.wave --dep-root .vex/dep --dep-root ./vendor/dep
--dep <name>=<path>
Fixiert den Paketnamen auf einen bestimmten Pfad.
wavec run app.wave --dep math=.vex/dep/math
Regeln:
- Format von
name:[A-Za-z_][A-Za-z0-9_]* --depmuss im Formatname=pathsein.- Fehler bei mehrfacher Angabe desselben Paketnamens.
4.5 백엔드 옵션 (--llvm, --whale)
백엔드 제어 옵션은 --llvm 뒤에서만 해석됩니다.
wavec --llvm --target=x86_64-unknown-linux-gnu build app.wave -c
지원 항목(요약):
--target,--cpu,--features,--abi--sysroot-C linker=<path>-C link-arg=<arg>(반복 가능)-C no-default-libs
--whale은 현재 예약된 더미 플래그이며, 실제 백엔드 파이프라인은 아직 미구현(TODO)입니다.
5. Regeln für die Interpretation von Importen
Wave-Importe werden in folgende 3 Typen unterteilt.
- Lokaler Import
- std-Import
- Externer Paketimport
5.1 Lokal
import("foo");
import("path/to/mod.wave");
Suche nach <path>.wave im Verzeichnis der Basisdatei.
5.2 std
import("std::io::format");
Verwendet den Pfad ~/.wave/lib/wave/std/....
5.3 Externe Pakete
import("math::add");
import("json::parser::core");
Format:
- Mindestens zwei Segmente
package::moduleerforderlich
Reihenfolge zur Bestimmung des Paket-Roots:
- Explizite Zuordnung durch
--dep name=path - Suche in jedem
--dep-rootnach<root>/<package>
Wenn dasselbe Paket in mehreren dep-root gleichzeitig gefunden wird:
- Keine automatische Auswahl und es wird ein Mehrdeutigkeitsfehler generiert.
- Muss mit
--dep name=pathfestgelegt werden.
Moduldatei-Suchreihenfolge:
<package_root>/<module_path>.wave<package_root>/src/<module_path>.wave
Beispiel:
import("math::core::vec");
Durchsuchen:
<package_root>/core/vec.wave<package_root>/src/core/vec.wave
6. Praxisbeispiele für externe Importe
6.1 Einzelner dep-root
Verzeichnis:
.vex/dep/
math/
src/
add.wave
main.wave
Code:
import("math::add");
Ausführung:
wavec run main.wave --dep-root .vex/dep
6.2 Auflösung von Mehrdeutigkeiten
wavec run main.wave \
--dep-root .vex/dep \
--dep-root ./vendor/dep
Wenn auf beiden Seiten math vorhanden ist, tritt ein Fehler auf. Es wird wie unten korrigiert.
wavec run main.wave \
--dep-root .vex/dep \
--dep-root ./vendor/dep \
--dep math=./vendor/dep/math
7. Trennung der Rollen von Vex
Empfohlene Struktur:
wavec: Kompilation/Verknüpfung/Ausführen + Interpretation der angegebenen Abhängigkeitenvex: Installation/Verwaltung der Abhängigkeiten vorwavec ... --dep-root ... --dep ...Aufruf
Beispiel:
# intern wird von vex ausgeführt
wavec run main.wave --dep-root .vex/dep --dep math=.vex/dep/math
Dieses Modell hält den Compiler einfach und entschlossen, während der Paketmanager sich um die Automatisierung kümmert.
8. Schnellreferenz
wavec run main.wave
wavec build app.wave
wavec build app.wave -o ./bin/app
wavec build app.wave -c
wavec build app.wave -c -o ./build/app.o
wavec run main.wave --debug-wave=tokens,ast
wavec build app.wave --link ssl -L ./native/lib
wavec run main.wave --dep-root .vex/dep
wavec run main.wave --dep math=.vex/dep/math
wavec --llvm --target=x86_64-unknown-linux-gnu build app.wave -c
wavec --whale build app.wave -c # TODO: reserved, not implemented