Немного изучаю зиг. Вот для примера:
const std = @import("std");
pub fn main() void {
var arr: [1000_000]i32 = undefined;
for (arr) |*item, i| {
item.* = @intCast(i32, i);
}
var sort = isSort(&arr);
std.debug.print("{!}\n", .{sort});
}
fn isSort(arr: []i32) bool {
var i: usize = 1;
while (i < arr.len) : (i += 1) {
if (arr[i - 1] > arr[i]) return false;
}
return true;
}
Аналог на D2(кстати в планах разрабов — д3 с аст, чтобы это не значило):
import std.stdio;
void main()
{
auto arr = new int[1000_000];
foreach (i, _; arr)
{
arr[i] = i;
}
writeln(arr[10]);
writeln("Array is ", isSort(arr) ? " sorted." : " not sorted.");
}
bool isSort(T)(T[] arr)
{
for (auto i = 1; i < arr.length; i++)
{
if (arr[i - 1] > arr[i])
return false;
}
return true;
}
Очевидно, код на ди в разы проще для восприятия. И вот интересная штука. C# конечно чуточку сложнее синтаксически.
Это удивительно, ведь авторы ди это сишник(Брайт) и плюсовик(Александреску).
Теперь к сути.
Дотнет философия — это компонентный подход к разработке. Но почему-то в крупном проекте продуктовом столкнулся с монолитным репозитарием где в транке все что нужно для жизни.
А ведь гораздо удобнее было бы использовать стабильные версии компонентов в виде dll.
С другой стороны взять ди — только сборщик мусора и исходники — малый размер бинаря(можно импортнуть из модуля только используемые функции).
Зиг и Раст это уже абсолютная категория.
Но стоит ли отказываться от сборщика мусора большой вопрос.
Экономия ресурсов сейчас даже актуальней чем в нулевых. Кол-во вычислений растет. А ди2 как раз проектировался на многопроцессорные вычисления.
По теме: чем все-таки
DOTNET убивает(или убьет в ближайшем будущем) такие крутые штуки как java|go|zig|rust|c++?