Comments 29
Я сильно глубоко не вдавался, но мне понравилось что в 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 есть), я уж не стал все языки перечислять.
если вы знаете что в вашем приложении в принципе нет многопоточности,
то зачем вам форсированный контроль мутабельности компилятором, как в
расте
Чтобы не очищать вектор, пока на него есть итераторы. Чтобы не обращаться к памяти после освобождения. Чтобы гарантировать валидность ссылок.
зачем нужен Zig если Rust уже есть?
Для того, чтобы не переписывать код на C. Сравнение с C происходит потому, что изначально Zig разрабатывался как замена языка C. Об этом с самого начала говорил автор языка, Эндрю Келли. Работать с C на Rust - боль. Именно поэтому появилась знаменитый мем про тех, кто пишет на Rust, что хотят переписать всё на Rust. Не спроста же это. Это отнюдь не с безопасностью связано
Когда целый день программировал на Zig:
И где впечатления энтузиаста? Просто банальное перечисление фич языка из любого зиг-туториала.
Я смотрю, русский убрали с сайта https://ziglang.org/ru
Потому что изменился механизм локализации на сайте. Перевод находится в работе, судя по PR на github
Когда целый день программировал на Zig: впечатления Rust-энтузиаста