Compilar programas en Zig
Hasta ahora hemos usado el comando zig para ejecutar los ejemplos con zig run fichero.zig. Si tecleamos zig --help veremos esta salida:
|
$ zig --help |
|
Usage: zig [command] [options] Commands: build Build project from build.zig fetch Copy a package into global cache and print its hash init Initialize a Zig package in the current directory build-exe Create executable from source or object files build-lib Create library from source or object files build-obj Create object from source or object files test Perform unit testing test-obj Create object for unit testing run Create executable and run immediately ast-check Look for simple compile errors in any set of files fmt Reformat Zig source into canonical form reduce Minimize a bug report translate-c Convert C code to Zig code ar Use Zig as a drop-in archiver cc Use Zig as a drop-in C compiler c++ Use Zig as a drop-in C++ compiler dlltool Use Zig as a drop-in dlltool.exe lib Use Zig as a drop-in lib.exe ranlib Use Zig as a drop-in ranlib objcopy Use Zig as a drop-in objcopy rc Use Zig as a drop-in rc.exe env Print lib path, std path, cache directory, and version help Print this help and exit std View standard library documentation in a browser libc Display native libc paths file or validate one targets List available compilation targets version Print version number and exit zen Print Zen of Zig and exit General Options: -h, --help Print command-specific usage |
Es bastante información para empezar, pero nos fijamos sobre todo en las líneas que contienen la palabra build.
Compilar un ejecutable sencillo: build-exe
Si queremos compilar un ejecutable sin más, usamos:
zig build-exe fichero.zig
Este comando crea un ejecutable en el directorio de trabajo actual (cwd). El ejecutable tendrá el mismo nombre que el fichero.zig, pero sin la extensión .zig. En Windows supongo que tendrá la extensión .exe.
Si miramos la ayuda del propio zig build-exe | more (more es para poder ir viendo toda la salida poco a poco), veremos esto:
|
$ zig build-exe --help | more |
|
Usage: zig build-exe [options] [files]
... Per-Module Compile Options: -O [mode] Choose what to optimize for Debug (default) Optimizations off, safety on ReleaseFast Optimize for performance, safety off ReleaseSafe Optimize for performance, safety on ReleaseSmall Optimize for small binary, safety off ... etc. |
Esto quiere decir que podemos indicar con la opción -O, seguida de un modo, cómo Zig optimizará el ejecutable final.
Modos de compilación
- Debug: sin optimizar pero seguro
- ReleaseFast: rápido pero inseguro
- ReleaseSafe: rápido y seguro
- ReleaseSmall: tamaño reducido pero inseguro
Inseguro aquí significa que se desactivan las comprobaciones de seguridad en tiempo de ejecución. Por ejemplo: detección de overflow en operaciones aritméticas, check de índices fuera de rango en arrays y slices, detección de uso de punteros nulos, acceso a memoria no válida.
En modo inseguro, si el programa tiene un bug de este tipo, obtendrás un comportamiento indefinido en lugar de un fallo con un mensaje claro cuando se produzca el error en tiempo de ejecución. Por ejemplo, el programa podría crashear o -aún peor- continuar funcionando con datos corruptos. Cuidado: Zig no va a avisar de estos fallos en tiempo de compilación aunque tenga el modo seguro.
Lo más habitual es que cuando desarrolles tu programa, utilices primero el modo Debug: crearás tests, probarás todo lo que tienes que probar, y solo después crearás un ejecutable con la opción ReleaseFast o ReleaseSmall.