zig — συγκεντρωτικός οδηγός — DedSec Project
zig — συγκεντρωτικός οδηγός Zig Συνήθης χρήση: Προγραμματισμός συστημάτων. Προτεινόμενη επέκταση αρχείου: .zig . Εκτέλεση / περιβάλλον: zig run hello.zig (η τυπική βιβλιοθήκη αλλάζει ανά…
Zig
Συνήθης χρήση: Προγραμματισμός συστημάτων.
Προτεινόμενη επέκταση αρχείου: .zig.
Εκτέλεση / περιβάλλον: zig run hello.zig (η τυπική βιβλιοθήκη αλλάζει ανά έκδοση).
Αρχικό παράδειγμα
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, Ada!\n", .{});
}
Πώς διαβάζεται
Έλεγξε την έκδοση Zig· η τυπική βιβλιοθήκη αλλάζει συχνά.
Συνηθισμένο λάθος
Έλεγξε την έκδοση Zig· η τυπική βιβλιοθήκη αλλάζει συχνά. Έλεγξε την έκδοση διερμηνευτή/μεταγλωττιστή και μην εκλαμβάνεις το δείγμα ως έτοιμη εφαρμογή παραγωγής.
Zig — Αναλυτικός οδηγός εξάσκησης
Πραγματικό αρχικό δείγμα
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, Ada!\n", .{});
}
Περιβάλλον: zig run hello.zig (API can change by version).. Επιβεβαίωσε ότι έχεις το σωστό compiler, host ή simulator πριν θεωρήσεις την έξοδο αξιόπιστη. Για scripts με πρόσβαση σε προσωπικά αρχεία ή ρυθμίσεις, χρησιμοποίησε προσωρινά και read-only δεδομένα.
Συγκεκριμένος στόχος υλοποίησης
Χρησιμοποίησε std.testing.expect για slice index και allocator-owned buffer με defer. Σύγκρινε optional ?T με error union !T.
Κρίσιμο λάθος που πρέπει να αναγνωρίζεις
Η Zig standard library αλλάζει συχνά· σταθεροποίησε compiler και μην ανακατεύεις allocator APIs διαφορετικών releases.
Zig — Παραδείγματα πραγματικού κώδικα
Εκτέλεση των παραδειγμάτων
Τα παραδείγματα είναι μικρά και αυτοτελή. Χρησιμοποίησε τη σχετική εγκατεστημένη γλώσσα. Ενδεικτικά: zig run {file}. Μη συγχέεις τα ονόματα αρχείων με αυτόματη εγκατάσταση. Δούλεψε σε δοκιμαστικό φάκελο.
Zig — Διαδρομή ουσιαστικής εξάσκησης
Ασφαλές άθροισμα υπολογισμένων στοιχείων
Η Zig απαιτεί ρητή διαχείριση πολλών αποτυχιών μέσω error unions και επιστροφής error. Η παρακάτω συνάρτηση δείχνει check πρώτα του μήκους και μετά ασφαλή πρόσβαση. Η ακριβής έκδοση της Zig έχει σημασία επειδή standard library APIs αλλάζουν συχνά.
const std = @import("std");
fn firstTwo(items: []const u8) error{TooShort}!u16 {
if (items.len < 2) return error.TooShort;
return @as(u16, items[0]) + @as(u16, items[1]);
}
test "bounded input" {
try std.testing.expectEqual(@as(u16, 5), try firstTwo(&.{2, 3}));
try std.testing.expectError(error.TooShort, firstTwo(&.{}));
}
Το firstTwo(&.{2,3}) αναμένεται να παράγει 5. Εδώ μετατρέπεις u8 σε u16 πριν την πρόσθεση ώστε το μεγαλύτερο άθροισμα 255+255 να χωρά στον τύπο. Εξήγησε γιατί ο ίδιος κώδικας με αποτέλεσμα u8 θα χρειαζόταν ξεχωριστή πολιτική overflow.
Ο allocator δεν είναι κρυφή λεπτομέρεια
Όταν μια συνάρτηση δημιουργεί owned dynamic memory στη Zig, είναι συνήθες να παίρνει std.mem.Allocator και να δηλώνει ρητά ποιος καλεί free. Για μικρό εργαστήριο κατασκεύασε array με allocator.alloc και ανέβαλε την αποδέσμευση με defer allocator.free(data). Αν επιστρέψεις slice προς ήδη freed storage, έχεις σχεδιάσει invalid lifetime.
Error propagation και κατανόηση
Το try μεταφέρει το error στον caller που επιτρέπει την ίδια κατηγορία σφάλματος. Το catch σου επιτρέπει να χειριστείς ένα σφάλμα σε συγκεκριμένο σημείο. Μην χρησιμοποιείς catch unreachable για μη έμπιστη είσοδο μόνο επειδή ο κώδικας γίνεται πιο σύντομος.
Έλεγχοι αποδοχής
Πρόσθεσε test για input με ένα στοιχείο, δύο στοιχεία και μέγιστες τιμές byte. Τεκμηρίωσε τη Zig compiler version που χρησιμοποιείς, επειδή syntax και allocator API μπορεί να διαφέρουν ανάμεσα στις εκδόσεις. Κατάγραψε την πραγματική έξοδο zig test και διαχώρισε τα compiler errors από το runtime error union.
Zig — Τεχνικά σημεία και συχνές παγίδες
Τεχνική γνώση
- Οι ρητοί allocators εκθέτουν την πολιτική μνήμης σε API.
- Τα error unions και optionals δηλώνουν αποτυχία και απουσία.
- Η συμβατότητα εκδόσεων είναι σημαντική· σύγκρινε παραδείγματα με τον εγκατεστημένο compiler.