When beginners hear the word “compiler,” they often think of one job:
source code -> executable programThat is true, but Zig is more than a compiler in the narrow sense.
The zig command is a toolchain.
A toolchain is a collection of tools used to build, test, format, and manage programs. In many languages, these tools are separate. In Zig, many of them are available through one command.
zigThis single command can compile Zig code, run tests, format source files, build full projects, compile C code, cross-compile programs, and inspect targets.
The Main Idea
Zig tries to reduce the number of separate tools you need.
In a typical C or C++ project, you may see tools such as:
| Tool | Purpose |
|---|---|
| C compiler | Compiles source code |
| Linker | Combines object files and libraries |
| Make or CMake | Controls the build |
| Formatter | Formats code |
| Test runner | Runs tests |
| Cross compiler | Builds for other platforms |
| Package manager | Fetches dependencies |
Zig does not remove every tool in the world, but it puts many common tasks under one command.
That gives beginners a simpler starting point.
Common Zig Commands
Here are the commands you will use most often:
| Command | Meaning |
|---|---|
zig run file.zig | Compile and run a Zig file |
zig build-exe file.zig | Build an executable |
zig test file.zig | Run tests in a file |
zig fmt file.zig | Format source code |
zig build | Run the project build script |
zig cc | Use Zig as a C compiler |
zig c++ | Use Zig as a C++ compiler |
zig targets | Show supported compilation targets |
You do not need all of these immediately.
At the beginning, focus on:
zig run
zig build-exe
zig test
zig fmtThese four commands cover most beginner work.
zig run
The command:
zig run hello.zigmeans:
Compile this file, then run the result immediately.This is useful for small examples.
You write code, run it, see the output, edit it, and run again.
Example:
const std = @import("std");
pub fn main() void {
std.debug.print("Learning Zig\n", .{});
}Run:
zig run main.zigOutput:
Learning Zigzig build-exe
The command:
zig build-exe main.zigmeans:
Compile this file and leave an executable on disk.Use this when you want a program file you can run later.
On Linux and macOS:
./mainOn Windows:
.\main.exeThis is a direct build command. It works well for single-file programs.
zig test
Zig has built-in support for tests.
A test is code that checks whether other code behaves correctly.
Create a file:
const std = @import("std");
fn add(a: i32, b: i32) i32 {
return a + b;
}
test "add two numbers" {
try std.testing.expect(add(2, 3) == 5);
}Run:
zig test main.zigZig compiles the file, finds the test blocks, and runs them.
If the test passes, Zig exits successfully.
If the test fails, Zig reports the problem.
Testing is part of normal Zig development. You do not need a separate test framework to begin.
zig fmt
Zig includes an official formatter.
Run:
zig fmt main.zigThis rewrites the file using Zig’s standard formatting style.
This is useful because it removes many style arguments. Zig code is expected to have a consistent shape.
For example, if you write messy spacing:
pub fn main( ) void{
}zig fmt rewrites it into normal Zig style:
pub fn main() void {}Formatting is not only about appearance. Consistent formatting makes code easier to read and review.
zig build
Small examples can use zig run or zig build-exe.
Larger projects usually use:
zig buildThis command looks for a file named:
build.zigThe build.zig file describes how to build the project.
A project may have several outputs:
| Output | Example |
|---|---|
| Executable | Command-line program |
| Library | Code used by other programs |
| Tests | Test binaries |
| Generated files | Code or assets created during build |
The build file is written in Zig itself. That means you use Zig as the build language too.
You will learn build.zig later. For now, remember:
zig build-exe is for simple files.
zig build is for projects.zig cc
Zig can act as a C compiler.
For example:
zig cc hello.c -o helloThis compiles a C program.
This is useful because Zig ships with much of the machinery needed for C compilation and cross compilation.
Many programmers use zig cc even in C projects, because it can simplify building for different platforms.
For this book, we focus on Zig code first. C interop comes later.
Cross Compilation
One of Zig’s major strengths is cross compilation.
Cross compilation means building a program for a different target than your current machine.
For example, you may be using macOS but want to build a Linux executable:
zig build-exe main.zig -target x86_64-linuxOr build a Windows executable:
zig build-exe main.zig -target x86_64-windowsA target describes the machine and operating system the program is built for.
It usually includes:
| Target part | Example |
|---|---|
| CPU architecture | x86_64, aarch64 |
| Operating system | linux, windows, macos |
| ABI or environment | gnu, musl, msvc |
You do not need to memorize targets now. The important point is that Zig treats cross compilation as a normal toolchain feature.
The Compiler Checks Your Code
The Zig compiler does more than translate code.
It also checks your program.
It checks syntax:
pub fn main() void {If braces or punctuation are wrong, Zig reports an error.
It checks types:
const age: u32 = "hello";This is invalid because "hello" is a string, not an unsigned integer.
It checks many compile-time rules:
const x: u8 = 300;A u8 can hold only values from 0 to 255, so this does not fit.
These checks may feel strict, but they protect you from many mistakes.
Debug Information and Safety
When Zig builds in debug mode, it includes more safety checks and debugging information.
This helps you find problems while developing.
Later, you can build optimized release versions.
Example:
zig build-exe main.zig -O ReleaseFastThis asks Zig to optimize for speed.
But while learning, debug mode is better. It gives clearer failures and safer behavior.
Why This Matters
The Zig toolchain is designed to make the basic workflow simple.
You can write:
zig run main.zigfor a quick experiment.
You can write:
zig test main.zigto check behavior.
You can write:
zig fmt main.zigto clean up formatting.
You can write:
zig buildto build a full project.
The same command family handles all of these jobs.
What You Should Remember
Zig is not only a language. It is also a toolchain.
The zig command can compile, run, test, format, build projects, compile C code, and cross-compile to other platforms.
For now, remember these commands:
zig run main.zig
zig build-exe main.zig
zig test main.zig
zig fmt main.zigThey are enough to start writing real Zig programs.