Как стать автором
Обновить

Комментарии 27

Я сильно глубоко не вдавался, но мне понравилось что в Zig одно ключевое слово comptime заменяет весь зоопарк с шаблонами, макросами, constexpr, consteval и constinit из С++.

использонвание аллокаторов и впрямь странное

fn createAndSumList(allocator: std.mem.Allocator, size: usize) i32 {
    var list = std.ArrayList(i32).initCapacity(allocator, size) catch |err| {
        std.log.err("Failed to initialize ArrayList: {}", .{err});
        return 0;
    };
    defer list.deinit();

    // Заполняем список случайными числами
    for (0..size) |_| {
        const random_num = std.rand.random().int(i32);
        try list.append(random_num);
    }

    // Вычисляем сумму элементов
    var sum: i32 = 0;
    for (list.items) |item| {
        sum += item;
    }

    return sum;
}
const std = @import("std");

fn createDynamicArray(comptime T: type, comptime size: usize, allocator: std.mem.Allocator) ![]T {
    var arr = try allocator.alloc(T, size);
    errdefer allocator.free(arr);
    return arr;
}

fn main() !void {
    const allocator = std.heap.page_allocator;

    // Создаем динамический массив i32 размера 5 во время выполнения
    const int_array = try createDynamicArray(i32, 5, allocator);
    defer allocator.free(int_array);
    std.debug.print("int_array: {any}\n", .{int_array});

    // Создаем динамический массив f64 размера 3 во время выполнения
    const float_array = try createDynamicArray(f64, 3, allocator);
    defer allocator.free(float_array);
    std.debug.print("float_array: {any}\n", .{float_array});
}

а можете пояснить в чем странность? в конструкциях вида `defer allocator.free(int_array);` т.е. явного освобождения выделенной памяти, если это нужно, вместо того, как сделано в раст (память освобождается автоматом при выходе из области видимости)? Если да, то это как раз фишка Zig, - отсутствие скрытого смысла

Почему же смысл скрытый? Язык вам даёт чёткую гарантию - когда переменная не в области видимости, в которой происходит выполнение, значит память точно освобождена и наоборот.

Меня только constexpr/consteval напрягает. Ибо если мы объявляем функцию, она "рекомендуемо" compile-time или "явно" compile-time, а переменная может быть только constexpr, а consteval низя. (хотя можно было бы наверное сделать как псевдоним)

В остальном же вполне понятно зачем другие вещи нужны. Зачем только к comptime ты добавил дженерики в минусы С++, ммм...

И опять сравнивают с С. Хоть бы кто дал недвусмысленный ответ на вопрос, зачем нужен Zig если Rust уже есть?

Я не про то, что не надо языки придумывать, а про то, почему Интернет преисполнился воплей "Zig заменит Rust потому что Zig лучше С"

Zig для многих проще Rust. Go тоже появился как средство борьбы со сложностью в Java и C++.

А в С, C++, Java, и т.д. Сложность специально вносили?

Так и представляю, выходит Строустроп рассказывает о новом языке: вы знаете, C, это очень простой язык и нам не хватает сложности, давайте писать на C++…

Предлагаю пари на что нибудь не-нужное, если zig наберёт сколько нибудь популярности в версии 3+ Появятся маетности или что-то похоже.

Вон в Go держались, держались и добавили дженерики.

сложность вносили не специально

но, в силу того, что экосистема плюсов значительно больше новых языков, в плюсы намного сложнее что-либо добавить. В особенности исправить.

А новые языки ещё и могут учится на опыте старых.

Страурструп, конечно, так не говорил, когда представлял миру плюсы. Ведь он тогда думал что делает все правильно. А вон, как оказалось, много ошибок допустил. Теперь уже мало что сделаешь с этим, потому что это самая основа языка.

Впрочем, это нормально. Новые языки для того и появляются - чтобы исправить ошибки старых.

Hidden text

и наделать своих

а что такое "маетность"?

В С, Яве и Го сложности нет изначально

советую вам глянуть на это, если вы думаете что Си простой.

Плюсы тоже не задумывались сложными.

Сложность появилось по мере развития.

Насчёт java/go не скажу, тк не писал особон на них. Но, уверен, у них достаточно своих скользких мест.

Вон выше комментатор написал

Go тоже появился как средство борьбы со сложностью в Java и C++.

видно и java не так проста

Простота языка и простота совершения ошибок ортогональны.

Плюсы были простыми до появления шаблонов

вы под простотой имеете ввиду простоту понимая концепций языка? Тогда в Си это правда проще, их так в разы меньше, чем в плюсах или любом современном языке.

Но в java, go их значительно больше, чем в си. На уровне плюсов где-то

Если выбирать самые простые языки по такой логике, то можно сразу писать на brainfuck или forth. Освоить можно за 5 минут, что может быть проще?)

Плюсы были простыми до появления шаблонов

не вижу ничего сложного в шаблонах, идея сама по себе проста

реализация не идеальная, но вряд ли у кого-то было лучше тогда

покажите на примере?

На самом деле ничего сложного в этих вопросах нет. В любой книжке по Си будет в первых же главах написано, что размеры int и char зависят от целевой архитектуры. Поэтому если вы пишете кросплатформенный код - пишите так, чтобы не привязываться к размеру. А последний пример - очевидное UB, что тоже во всех книжках описано и прямо говорится , что так писать нельзя.

Го это с языком с огромным количеством неочевидного поведения, вещей, которые нельзя вывести логически, а нужно просто "знать" и возможностей выстрелить себе в ногу. Говорить что в го нет сложности можно только если вы на нем не писали.

а можно несколько примеров?

Что будет выведно на экран?

func main() {

  var i int = 1

  defer fmt.Println("result =>",func() int { return i * 2 }())

  i++ 

}

А тут?

func main() {
  var data *byte
  var in interface{}  
 
  fmt.Println(in, in == nil)
  
  in = data

  fmt.Println(data, data == nil)
  fmt.Println(in, in == nil)
  fmt.Println("eq", data == in)
}

Но ведь Zig и Rust для разного... Zig низкоуровневый язык, с низким уровнем абстракций.
А Rust высокоуровневый язык, с высоким уровнем абстракций (и возможностью в низкоуровневость, но оно того не стоит в большинстве случаев).

Я полагаю, что претензия к тому, что пользователи Zig часто пытаются сравнивать его с Rust, или упоминать Rust в его контексте, хотя по сути у них нет никакой связи, кроме того, что они оба быстрые и безопасные (хотя так можно сказать ещё про сотню языков).

Уровень сравнения как сравнение дорогой немецкой стамески и бензопилы из сша

странное у вас понимание высоко/низко-уровневости.

Назовите высокоуровневую фичу раста, которой нет в зиг?

И зиг кажется небезопасный. Хотя после раста все под "безопасностью" понимаю что хотят, поэтому кто знает)

Достоинства раста это его же недостатки. Провека компилятором корректности освобождения памяти, предотвращение появления dangling pointer, избегание рейс кондишенов - все это приводит к тому, что писать на расте многие задачи в разы сложнее, чем на многих других языках. Zig же позволяет программисту самому решать что можно делать, а что нет, в результате чего проще делать прототипы, воркэраунды, проще реализовывать многие алгоритмы и структуры данных, особено все, что касается графов. Ну и, например, если вы знаете что в вашем приложении в принципе нет многопоточности, то зачем вам форсированный контроль мутабельности компилятором, как в расте? В результате rust это системный язык для задач где очень высока цена ошибки и где надо писать максимально безопастно, zig это системный язык для задач, где важна гибкость в разработке. Ну и для задач, где не нужен системный язык, где можно использовать GC и счет не идет на наносекунды, то любой современный язык с GC типа Go/C#/Kotlin будет для разработки гораздо удобнее раста или зига .

Ну и, например, если вы знаете что в вашем приложении в принципе нет многопоточности

В настоящее время это редкий кейс. Кроме весьма слабых микроконтроллерных ЦПУ, везде многопоточка и грех ее не использовать (если алгоритм позволяет)

Ну и для задач, где не нужен системный язык, где можно использовать GC и счет не идет на наносекунды, то любой современный язык с GC типа Go/C#/Kotlin будет для разработки гораздо удобнее раста или зига

Уточню - при сравнимом уровне безопасности, и Java в список

В настоящее время это редкий кейс

Ну это может быть какая-то консольная утилита, в которой параллелизация достигается тривиальным вызовом fork и по-этому код сам по себе можно рассматривать как однопоточный.

Java в список

Ну просто котлин в том же рантайме и более современный чем джава(тот же tailrec есть), я уж не стал все языки перечислять.

К тому же котлин ещё и эффективнее использует ту же виртуальную машину что и java

если вы знаете что в вашем приложении в принципе нет многопоточности,
то зачем вам форсированный контроль мутабельности компилятором, как в
расте

Чтобы не очищать вектор, пока на него есть итераторы. Чтобы не обращаться к памяти после освобождения. Чтобы гарантировать валидность ссылок.

зачем нужен Zig если Rust уже есть?

Для того, чтобы не переписывать код на C. Сравнение с C происходит потому, что изначально Zig разрабатывался как замена языка C. Об этом с самого начала говорил автор языка, Эндрю Келли. Работать с C на Rust - боль. Именно поэтому появилась знаменитый мем про тех, кто пишет на Rust, что хотят переписать всё на Rust. Не спроста же это. Это отнюдь не с безопасностью связано

Когда целый день программировал на Zig:

И где впечатления энтузиаста? Просто банальное перечисление фич языка из любого зиг-туториала.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий