gokayburuc.dev

Zig projesinin Dosya yapısı ve Dosyaların Özellikleri

Yeni bir zig projesi aşağıdaki komutla çalıştırıldığında 2 adet dosya oluşur:

zig init

Oluşan dosyalar:

.
├── build.zig
├── build.zig.zon
└── src
    ├── main.zig
    └── root.zig

1 directory, 4 files
 

Şimdi bu dosyaların ne işe yaradığını inceleyelim.

build.zig

Projenizin nasıl build edileceğini belirleyen komutları içeren dosyadır.

const std = @import("std");

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});

    const exe = b.addExecutable(.{
        .name = "my_project",
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    b.installArtifact(exe);
}

builg.zig.zon

JSON benzeri bir notasyona sahip olan ve projenin bağımlılıkları dependencies tanımlandığı dosyadır.

ZON (Zig Object Notation) kelimesinin baş harflerinin kısaltılmış formudur.

.{
  .name = "my_project",
  .version = "0.1.0",
}

main.zig

Asıl uygulamanın tüm mantığı bu dosya içerisinde tutulur. Bir nevi geliştirilen uygulamanın giriş ve başlangıç noktasıdır. Eğer executable(çalıştırılabilir) bir uygulama build (inşaa etmek, ayağa kaldırmak) yapılıyorsa, zig main.zigdosyasını ()compile) derler ve (run) çalıştırır.

Eğer kendinize ait bir fonksiyon yazmak ve bunu build edip sonuçları görmek istiyorsanız bu fonksiyonu:

const std = @import("std");

pub fn main() void {
    const stdout = std.io.getStdOut().writer();
    const result = add(5, 7);
    // Hataları propagate etmek için try kullanılır.
    try stdout.print("5 + 7 = {}\n", .{result});
}

fn add(x: i32, y: i32) i32 {
    return x + y;
}

Bu dosyayı iki şekilde çalıştırabiliriz:

zig build run 

veya diğer yöntem olarak

zig run src/main.zig

root.zig

Eğer bir kütüphane geliştiriyorsanız main.zig yerine root.zig dosyasına kullanır. Bu dosyanın var olma amacı yeniden kullanılabilir modüller (reusable modules), kütüphaneler (libraries), test altyapısı (test infrastructure) yazarken bu dosya tercih edilmelidir.

pub fn greet(name: []const u8) []const u8 {
    return "Hello, ";
}

Bu yazdığımız fonksiyonu ise main.zig dosyamıza aşağıdaki komutu ekleyerek import edebiliriz:

const root = @import("root");

Basit Bir Uygulama

Öncelikle main.zig içerisinde basit bir toplama işlemi yapan bir uygulama yazalım:

const std = @import("std");

pub fn main() void {
    // write into the stdour 
    const stdout = std.io.getStdOut().writer();
    const result = add(5,7);

    try stdout.print("5 + 7 = {}\n", .{result});
}

// Returns x + y 
fn add(x: i32 , y: i32) i32 {
    return x + y    
}

şimdi yazdığımız kodu aşağıdaki yöntemlerden biriyle çalıştıralım:

zig build run 

Doğrudan çalıştırmak için :

zig run src/main.zig

#zig