Referencia CLI de wavec
Este documento explica en detalle el funcionamiento de CLI bajo la implementación actual del compilador Wave (wavec).
Principio clave:
waveces un compilador.- La instalación/solución de paquetes (lockfile, registro, descarga) no es responsabilidad de
wavec. - Las dependencias externas se pasan como argumentos CLI explícitos al ejecutar
wavec.
1. Formato básico
wavec [opciones-globales] <comando> [opciones-de-comando]
Por ejemplo:
wavec -O2 run main.wave
wavec build app.wave --link ssl -L ./native/lib
wavec run app.wave --dep-root .vex/dep
2. Reglas de análisis de comandos (importante)
wavec primero escanea las opciones globales en todos los argumentos y luego interpreta el <comando> con los argumentos restantes.
Es decir, la posición de la opción global es flexible.
wavec -O3 run main.wave
wavec run main.wave -O3
wavec run -O3 main.wave
Los tres ejemplos anteriores son válidos.
Al usar --, se detiene el escaneo de opciones globales y se entrega todo lo que sigue al comando.
wavec -- run main.wave
3. Comandos
3.1 run <archivo>
Compila y ejecuta el archivo Wave.
wavec run hello.wave
Operación:
- Análisis del origen + expansión de importaciones
- Generación de LLVM IR
- Enlace binario nativo (
target/<file_stem>) - Ejecutar
Características:
wavectransmite el código de salida del programa ejecutado.
3.2 construir <archivo>
Genera un archivo ejecutable (exe).
wavec build app.wave
Binario de salida:
target/<file_stem>
3.3 build opciones (-o, -c)
El comando build permite controlar opcionalmente el nombre y formato del archivo de salida.
wavec build app.wave -o ./bin/app
wavec build app.wave -c
wavec build app.wave -c -o ./build/app.o
-o <archivo>: Especifica el nombre del archivo de salida.- Por defecto (sin
-c): Especifica la ruta de salida del archivo ejecutable - Con
-c: Especifica la ruta de salida del archivo objeto
- Por defecto (sin
-c: Omite el enlace y solo genera el archivo objeto.- Cuando se usa
-c, la ruta del objeto se imprime en stdout.
Comportamiento por defecto:
wavec build app.wave->target/appwavec build app.wave -c->target/app.o(imprime la ruta)
3.4 install std, update std
Comando para instalar/actualizar la biblioteca estándar.
wavec install std
wavec update std
3.5 --help, --version
wavec --help
wavec --version
4. Opciones globales
4.1 Optimización
Valores permitidos:
-O0-O1-O2-O3-Os-Oz-Ofast
Por ejemplo:
wavec -O3 ejecutar main.wave
4.2 Salida de depuración
wavec --debug-wave=tokens,ast,ir ejecutar main.wave
Elementos permitidos:
tokensastirmchexall
4.3 Opciones de enlace
wavec build app.wave --link ssl --link crypto -L ./native/lib
--link=<lib>or--link <lib>-L<path>o-L <path>
Cuando wavec enlaza, se transmite internamente en forma de -l<lib>, -L<path>.
4.4 Opciones de dependencias externas (importante)
Son opciones para interpretar importaciones externas (pkg::...).
--dep-root <dir>
Añade candidatos para el directorio raíz del paquete.
wavec run app.wave --dep-root .vex/dep
Al buscar el paquete math:
- Verifica
.vex/dep/math
Puede ser especificado varias veces:
wavec run app.wave --dep-root .vex/dep --dep-root ./vendor/dep
--dep <name>=<path>
Fija el nombre del paquete a una ruta específica.
wavec run app.wave --dep math=.vex/dep/math
Regla:
- Formato de
nombre:[A-Za-z_][A-Za-z0-9_]* --depdebe ser en formatonombre=ruta- Es un error especificar nombres de paquete duplicados
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. Reglas para la interpretación de importaciones
Las importaciones en Wave se dividen en los siguientes tres tipos.
- Importación local
- Importación estándar
- Importación de paquetes externos
5.1 Local
import("foo");
import("path/to/mod.wave");
Busca <path>.wave en el directorio del archivo de referencia.
5.2 Estándar
import("std::io::format");
Utiliza la ruta ~/.wave/lib/wave/std/....
5.3 Paquetes externos
import("math::add");
import("json::parser::core");
Formato:
- Se requieren al menos dos segmentos
paquete::módulo.
Orden de determinación del raíz del paquete:
- Mapa explícito
--dep nombre=ruta - Buscando
<root>/<package>en cada--dep-root
Si el mismo paquete se encuentra en varios dep-root simultáneamente:
- Error de ambigüedad sin selección automática
- Debe estar fijado mediante
--dep nombre=ruta
Orden de exploración de archivos de módulo:
<package_root>/<module_path>.wave<package_root>/src/<module_path>.wave
Por ejemplo:
import("math::core::vec");
Exploración:
<package_root>/core/vec.wave<package_root>/src/core/vec.wave
6. Ejemplo práctico de importación externa
6.1 Único dep-root
Directorio:
.vex/dep/
math/
src/
add.wave
main.wave
Código:
import("math::add");
Ejecutar:
wavec run main.wave --dep-root .vex/dep
6.2 Resolución de ambigüedades
wavec run main.wave \
--dep-root .vex/dep \
--dep-root ./vendor/dep
Si hay math en ambos lados, se producirá un error. Corrija como se muestra a continuación.
wavec run main.wave \
--dep-root .vex/dep \
--dep-root ./vendor/dep \
--dep math=./vendor/dep/math
7. Separación de roles con Vex
Estructura recomendada:
wavec: Compilar/enlazar/ejecutar + análisis de dependencias especificadasvex: Instalación/gestión de dependencias traswavec ... --dep-root ... Llamar a --dep ...
Por ejemplo:
# Ejecutado internamente por vex
wavec run main.wave --dep-root .vex/dep --dep math=.vex/dep/math
Este modelo mantiene el compilador simple y determinista, mientras el gestor de paquetes se encarga de la automatización.
8. Referencia rápida
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