Zig (язык программирования)

Zig — это императивный, статически типизированный, компилируемый язык программирования общего назначения. Язык был спроектирован для «создания надёжного, оптимального и переиспользуемого ПО» (англ. maintaining robust, optimal and reusable software)[2]. Язык поддерживает обобщённое программирование и рефлексию во время компиляции, кросс-компиляцию и ручное управление памятью. Главная цель языка — конкурировать c (и стать лучше) C, и в то же время быть более простым, чем C++, Rust и другие[3]. Разработка Zig поддерживается некоммерческой организацией Zig Software Foundation, основанная в 2020 году автором языка Andrew Kelley[4][5].

Язык имеет много средств для низкоуровневого программирования, особенно: упакованные структуры (структуры с нулевым выравниванием между полями), целочисленные типы произвольной длины (вплоть до 65535 бит), несколько типов указателей[6].

На момент версии 0.10.0 Zig по умолчанию использует новый компилятор, написанный на самом языке Zig, однако временно остаётся возможность использовать старый компилятор на C++[7][8]. В качестве основного бэкэнда компилятора используется LLVM, однако существуют другие бэкенды разной готовности[9]. Компилятор лицензирован под свободной лицензией MIT[10]. Компилятор имеет возможность компилировать C и C++ программы с помощью команд «zig cc» и «zig c++»[11]. Язык программирования Nim поддерживает использование компилятора Zig как C компилятора.

Примеры кода

Hello World

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello, {s}!\n", .{"world"});
}

Обобщённый связный список

fn LinkedList(comptime T: type) type {
    return struct {
        pub const Node = struct {
            prev: ?*Node,
            next: ?*Node,
            data: T,
        };

        first: ?*Node,
        last:  ?*Node,
        len:   usize,
    };
}

pub fn main() void {
    var node = LinkedList(i32).Node {
        .prev = null,
        .next = null,
        .data = 1234,
    };

    var list = LinkedList(i32) {
        .first = &node,
        .last = &node,
        .len = 1,
    };
}

Примечания

Править
Используя этот сайт интернет-энциклопедии «РУВИКИ», я соглашаюсь с Условиями использования и Политикой конфиденциальности и даю согласие на обработку своих пользовательских данных (файлов cookies), необходимых для корректного функционирования сайта.
Аналитические и рекламные файлы cookies обрабатываются с помощью системы веб-аналитики «Яндекс.Метрика» и/или иных систем веб-аналитики на условиях, указанных в Политике конфиденциальности, и могут быть изменены в настройках браузера.